Version 3.0.0 Redesign #34

Merged
leomurca merged 20 commits from redesign_all into main 2026-04-24 15:14:30 +00:00
11 changed files with 376 additions and 19 deletions
Showing only changes of commit c53420c48e - Show all commits

View file

@ -0,0 +1,21 @@
<script>
export let size = 20;
export let color = 'currentColor';
</script>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill={color}
aria-hidden="true"
id="Bolt--Streamline-Heroicons"
height={size}
width={size}
>
<path
fill-rule="evenodd"
d="M9.743333333333332 1.0633333333333332a0.5 0.5 0 0 1 0.23933333333333331 0.568L8.654666666666666 6.5h4.845333333333333a0.5 0.5 0 0 1 0.36533333333333334 0.8413333333333333l-7 7.5a0.5 0.5 0 0 1 -0.848 -0.4733333333333333l1.3279999999999998 -4.867999999999999H2.5a0.5 0.5 0 0 1 -0.36533333333333334 -0.8413333333333333l7 -7.5a0.5 0.5 0 0 1 0.6086666666666667 -0.09533333333333333Z"
clip-rule="evenodd"
stroke-width="0.6667"
></path>
</svg>

View file

@ -0,0 +1,17 @@
<script>
export let size = 20;
export let color = 'currentColor';
</script>
<svg
fill={color}
width={size}
height={size}
viewBox="0 0 256 256"
id="Flat"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M213.65723,66.34326l-40-40A8.00076,8.00076,0,0,0,168,24H88A16.01833,16.01833,0,0,0,72,40V56H56A16.01833,16.01833,0,0,0,40,72V216a16.01833,16.01833,0,0,0,16,16H168a16.01833,16.01833,0,0,0,16-16V200h16a16.01833,16.01833,0,0,0,16-16V72A8.00035,8.00035,0,0,0,213.65723,66.34326ZM136,192H88a8,8,0,0,1,0-16h48a8,8,0,0,1,0,16Zm0-32H88a8,8,0,0,1,0-16h48a8,8,0,0,1,0,16Zm64,24H184V104a8.00035,8.00035,0,0,0-2.34277-5.65674l-40-40A8.00076,8.00076,0,0,0,136,56H88V40h76.68652L200,75.314Z"
/>
</svg>

View file

@ -0,0 +1,18 @@
<script>
export let size = 20;
export let color = 'currentColor';
</script>
<svg
width={size}
height={size}
viewBox="0 0 24 24"
fill="none"
stroke={color}
stroke-width="1.5"
>
<rect x="3" y="3" width="7" height="7" rx="1.5" />
<rect x="14" y="3" width="7" height="7" rx="1.5" />
<rect x="3" y="14" width="7" height="7" rx="1.5" />
<rect x="14" y="14" width="7" height="7" rx="1.5" />
</svg>

View file

@ -0,0 +1,17 @@
<script>
export let size = 20;
export let color = 'currentColor';
</script>
<svg
fill={color}
width={size}
height={size}
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
id="lock-check"
class="icon glyph"
><path
d="M18,8H17V7A5,5,0,0,0,7,7V8H6a2,2,0,0,0-2,2V20a2,2,0,0,0,2,2H18a2,2,0,0,0,2-2V10A2,2,0,0,0,18,8ZM9,7a3,3,0,0,1,6,0V8H9Zm6.71,6.71-4,4a1,1,0,0,1-1.42,0l-2-2a1,1,0,0,1,1.42-1.42L11,15.59l3.29-3.3a1,1,0,0,1,1.42,1.42Z"
></path></svg
>

View file

@ -0,0 +1,202 @@
<script>
import { resolve } from '$app/paths';
import { t } from '$lib/translations';
import BoltIcon from '$lib/components/icons/BoltIcon.svelte';
import PadlockIcon from '$lib/components/icons/PadlockIcon.svelte';
import FourSquaresIcon from '$lib/components/icons/FourSquaresIcon.svelte';
import FilesIcon from '$lib/components/icons/FilesIcon.svelte';
</script>
<section id="features">
<h1>{$t('features.title')}</h1>
<div class="cards-container">
<div class="blob">
<p class="adjective">{$t('features.cards.fast.adjective')}</p>
<h2>{$t('features.cards.fast.title')}</h2>
<BoltIcon color="#06345f" size={100} />
<p class="description">{$t('features.cards.fast.description')}</p>
</div>
<div class="blob">
<p class="adjective">{$t('features.cards.private.adjective')}</p>
<h2>{$t('features.cards.private.title')}</h2>
<PadlockIcon color="#06345f" size={100} />
<p class="description">{$t('features.cards.private.description')}</p>
</div>
<div class="blob">
<p class="adjective">{$t('features.cards.optimized.adjective')}</p>
<h2>{$t('features.cards.optimized.title')}</h2>
<FourSquaresIcon color="#06345f" size={100} />
<p class="description">{$t('features.cards.optimized.description')}</p>
</div>
<div class="blob">
<p class="adjective">{$t('features.cards.compatibility.adjective')}</p>
<h2>{$t('features.cards.compatibility.title')}</h2>
<FilesIcon color="#06345f" size={100} />
<p class="description">
{$t('features.cards.compatibility.description')}
</p>
</div>
</div>
<a class="organic-btn-secondary" href={resolve('/viewer')}
>{$t('features.cta')}</a
>
</section>
<style>
#features {
display: flex;
align-items: center;
flex-direction: column;
padding: 100px 0;
background-color: var(--color-primary);
position: relative;
overflow: hidden;
}
#features::before {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg width='600' height='600' viewBox='0 0 200 200' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 150 C 60 20, 140 180, 190 50' stroke='white' stroke-width='1.5' stroke-dasharray='4 6' opacity='0.2'/%3E%3Ccircle cx='10' cy='150' r='3' fill='white' opacity='0.25'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-size: 600px;
background-position: right -100px top -80px;
pointer-events: none;
}
#features::after {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg width='600' height='600' viewBox='0 0 200 200' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 40 C 80 180, 120 0, 180 140' stroke='white' stroke-width='1.2' stroke-dasharray='3 8' opacity='0.15'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-size: 500px;
background-position: left -120px bottom -80px;
pointer-events: none;
}
h1 {
color: white;
font-size: 2.7rem;
text-align: center;
line-height: 1.5;
}
.cards-container {
display: grid;
gap: 20px;
grid-template-columns: repeat(4, 1fr);
margin: 0 auto;
width: 100%;
padding: 100px 40px;
}
.blob {
width: 100%;
max-width: 380px;
height: 400px;
aspect-ratio: 1;
border-radius: 25% 50% 75% 100%;
text-align: center;
padding: 30px 60px;
background: linear-gradient(
30deg in oklch shorter hue,
oklch(0.98 0.01 260) 10%,
oklch(0.92 0.02 260)
);
box-shadow: 1rem 1rem 50px #0001;
}
.blob h2 {
font-size: 1.5rem;
margin-top: 10px;
}
.description {
font-size: 1rem;
margin-top: 20px;
}
.adjective {
color: var(--color-primary);
font-size: 0.8rem !important;
}
.organic-btn-secondary {
font-size: 1.3rem;
padding: 30px 90px;
}
@media (max-width: 1639px) {
.blob {
width: 100%;
max-width: 340px;
height: 380px;
}
}
@media (max-width: 1480px) {
.cards-container {
grid-template-columns: repeat(3, 1fr);
}
.blob {
width: 100%;
max-width: 400px;
height: 400px;
}
}
@media (max-width: 1297px) {
.cards-container {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 1210px) {
h1 {
font-size: 2.3rem;
}
}
@media (max-width: 1033px) {
h1 {
font-size: 2rem;
}
}
@media (max-width: 880px) {
#features {
padding: 20px;
}
h1 {
font-size: 2rem;
}
.cards-container {
padding: 0;
grid-template-columns: 1fr;
}
.blob {
width: 100%;
max-width: 100%;
padding-bottom: 50px;
height: fit-content;
aspect-ratio: 0;
}
}
@media (max-width: 540px) {
.organic-btn-secondary {
width: 100%;
text-align: center;
font-size: 1rem;
padding: 20px 50px;
margin-top: 30px;
}
}
</style>

View file

@ -50,25 +50,6 @@
margin-bottom: 2rem; margin-bottom: 2rem;
} }
.organic-btn {
background: var(--color-primary);
width: fit-content;
color: white;
border: none;
padding: 20px 60px;
font-size: 16px;
cursor: pointer;
border-radius: 58% 42% 65% 27% / 40% 60% 60% 70%;
border: 1px solid var(--color-primary);
transition: all 0.3s ease;
}
.organic-btn:hover {
color: var(--color-primary);
background-color: #ffffff;
border: 1px solid var(--color-primary);
}
@media (max-width: 1350px) { @media (max-width: 1350px) {
h1 { h1 {
font-size: clamp(3.3rem, 4vw, 3.3rem); font-size: clamp(3.3rem, 4vw, 3.3rem);

View file

@ -78,3 +78,40 @@ strong {
ul li::marker { ul li::marker {
color: #06345f; color: #06345f;
} }
.organic-btn {
background: var(--color-primary);
width: fit-content;
color: white;
border: none;
padding: 20px 60px;
font-size: 16px;
cursor: pointer;
border-radius: 58% 42% 65% 27% / 40% 60% 60% 70%;
border: 1px solid var(--color-primary);
transition: all 0.3s ease;
}
.organic-btn-secondary {
color: white;
width: fit-content;
padding: 20px 60px;
font-size: 16px;
cursor: pointer;
border-radius: 58% 42% 65% 27% / 40% 60% 60% 70%;
border: 1px solid white;
transition: all 0.3s ease;
background-color: var(--color-primary);
}
.organic-btn:hover {
color: var(--color-primary);
background-color: #ffffff;
border: 1px solid var(--color-primary);
}
.organic-btn-secondary:hover {
color: var(--color-primary);
background-color: #ffffff;
border: 1px solid white;
}

View file

@ -0,0 +1,26 @@
{
"title": "The Easiest Way to Preview Embroidery Files",
"cards": {
"fast": {
"adjective": "FAST",
"title": "Instant Preview",
"description": "Drop your file and see your design instantly—no installs, no waiting."
},
"private": {
"adjective": "PRIVATE",
"title": "Private by Design",
"description": "Your files stay on your device. Nothing is uploaded, ever."
},
"optimized": {
"adjective": "OPTIMIZED",
"title": "Multiple Files, One View",
"description": "Open and compare several designs at the same time in a clean layout."
},
"compatibility": {
"adjective": "COMPATIBILITY",
"title": "Supports Popular Formats",
"description": "Works with PES, DST, EXP and other common embroidery formats."
}
},
"cta": "Try it now"
}

View file

@ -137,6 +137,16 @@ const config = {
key: 'hero', key: 'hero',
loader: async () => (await import('./en-US/hero.json')).default, loader: async () => (await import('./en-US/hero.json')).default,
}, },
{
locale: SUPPORTED_LOCALES.PT_BR,
key: 'features',
loader: async () => (await import('./pt-BR/features.json')).default,
},
{
locale: SUPPORTED_LOCALES.EN_US,
key: 'features',
loader: async () => (await import('./en-US/features.json')).default,
},
], ],
}; };

View file

@ -0,0 +1,26 @@
{
"title": "A maneira mais fácil de visualizar arquivos de bordado",
"cards": {
"fast": {
"adjective": "RÁPIDO",
"title": "Visualização instantânea",
"description": "Arraste seu arquivo e veja o design na hora — sem instalar nada, sem esperar."
},
"private": {
"adjective": "PRIVADO",
"title": "Privacidade em primeiro lugar",
"description": "Seus arquivos ficam no seu dispositivo. Nada é enviado para a internet."
},
"optimized": {
"adjective": "OTIMIZADO",
"title": "Vários arquivos, uma visão",
"description": "Abra e compare vários designs ao mesmo tempo em um layout limpo."
},
"compatibility": {
"adjective": "COMPATÍVEL",
"title": "Suporta formatos populares",
"description": "Funciona com PES, DST, EXP e outros formatos comuns de bordado."
}
},
"cta": "Experimente agora"
}

View file

@ -6,6 +6,7 @@
import Seo from '$lib/components/Seo.svelte'; import Seo from '$lib/components/Seo.svelte';
import Hero from '$lib/sections/Hero.svelte'; import Hero from '$lib/sections/Hero.svelte';
import Features from '$lib/sections/Features.svelte';
let { data } = $props(); let { data } = $props();
@ -17,6 +18,7 @@
<!-- eslint-disable svelte/no-at-html-tags --> <!-- eslint-disable svelte/no-at-html-tags -->
<Hero /> <Hero />
<Features />
<div class="home-container"> <div class="home-container">
<section aria-labelledby="main-title"> <section aria-labelledby="main-title">