Create pages to increase organic traffic #43

Merged
leomurca merged 6 commits from increase-traffic into main 2026-05-17 18:05:07 +00:00
12 changed files with 602 additions and 4 deletions
Showing only changes of commit 9bd1528e4d - Show all commits

View file

@ -38,6 +38,7 @@
<a href={resolve('/about')}>{$t('footer.about')}</a> <a href={resolve('/about')}>{$t('footer.about')}</a>
<a href={resolve('/pes-file-viewer')}>{$t('footer.pesViewer')}</a> <a href={resolve('/pes-file-viewer')}>{$t('footer.pesViewer')}</a>
<a href={resolve('/dst-file-viewer')}>{$t('footer.dstViewer')}</a> <a href={resolve('/dst-file-viewer')}>{$t('footer.dstViewer')}</a>
<a href={resolve('/jef-file-viewer')}>{$t('footer.jefViewer')}</a>
<a href={resolve('/privacy-policy')}>{$t('footer.privacy.policy')}</a> <a href={resolve('/privacy-policy')}>{$t('footer.privacy.policy')}</a>
<a href={resolve('/terms-of-service')} <a href={resolve('/terms-of-service')}
>{$t('footer.terms.of.service')}</a >{$t('footer.terms.of.service')}</a

View file

@ -69,7 +69,7 @@
}, },
"whatIsJef": { "whatIsJef": {
"summary": "What is a JEF file?", "summary": "What is a JEF file?",
"description": "JEF (.jef) is Janome's native embroidery format. It stores stitches and thread colors for Janome, Elna, and compatible machines. You can preview JEF files in the viewer alongside DST and PES." "description": "JEF (.jef) is Janome's native embroidery format. It stores stitches and thread colors for Janome, Elna, and compatible machines. See our dedicated JEF guide at embroideryviewer.xyz/jef-file-viewer."
}, },
"embroideryViewer": { "embroideryViewer": {
"summary": "What is the best free embroidery file viewer?", "summary": "What is the best free embroidery file viewer?",

View file

@ -10,6 +10,7 @@
"about": "About", "about": "About",
"pesViewer": "PES File Viewer", "pesViewer": "PES File Viewer",
"dstViewer": "DST File Viewer", "dstViewer": "DST File Viewer",
"jefViewer": "JEF File Viewer",
"privacy.policy": "Privacy Policy", "privacy.policy": "Privacy Policy",
"terms.of.service": "Terms of Service", "terms.of.service": "Terms of Service",
"copyright": "Copyright © {{year}} <a href=\"{{website}}\" target=\"_blank\" rel=\"noreferrer\">Leonardo Murça</a>. All rights reserved.", "copyright": "Copyright © {{year}} <a href=\"{{website}}\" target=\"_blank\" rel=\"noreferrer\">Leonardo Murça</a>. All rights reserved.",

View file

@ -0,0 +1,90 @@
{
"seo.title": "Free JEF File Viewer Online — Open Janome Embroidery Files Instantly",
"seo.description": "Open JEF files online for free. Preview Janome and Elna embroidery designs in your browser — no install, no upload to servers. Also supports PES, DST, EXP & PEC.",
"seo.keywords": "what is a JEF file, JEF viewer, open JEF file online, JEF file viewer, free JEF viewer, Janome embroidery file, embroidery file viewer, how to view embroidery files, convert JEF to PES, convert JEF to DST, online embroidery preview",
"seo.url": "https://embroideryviewer.xyz/jef-file-viewer",
"seo.image": "https://embroideryviewer.xyz/og/jef-viewer.png",
"hero.tagline": "Free · Private · No signup",
"hero.title": "Free JEF File Viewer Online — Open Janome Embroidery Files Instantly",
"hero.subtitle": "Preview stitch paths, colors, and dimensions in your browser — free, private, and no signup. JEF is the native format for Janome, Elna, and compatible home machines.",
"hero.cta": "Try Your Design",
"whatIs.title": "What is a JEF file?",
"whatIs.p1": "A <strong>JEF file</strong> (.jef) is the native embroidery format for <strong>Janome</strong> and <strong>Elna</strong> machines. Many Kenmore and other Janome-compatible models also read JEF.",
"whatIs.p2": "JEF files contain stitch coordinates, color-change commands, and a thread palette — similar to PES for Brother machines. If you download designs for a Janome Memory Craft or Elna Express, they often arrive as .jef.",
"whatIs.p3": "Embroidery Viewer lets you open JEF online to check layout, stitch count, and size before you hoop and stitch — without installing Janome Artistic Digitizer or other desktop software.",
"howTo.title": "How to view JEF embroidery files online",
"howTo.step1": "Open the <strong>free embroidery viewer</strong> in your browser.",
"howTo.step2": "Click <strong>Choose files</strong> or drag your .jef file (or .pes, .dst, .exp, .pec) into the drop zone.",
"howTo.step3": "Click <strong>Render files</strong> to generate a stitch preview on screen.",
"howTo.step4": "Review colors, stitch count, and dimensions — then download a PNG if you need a reference image.",
"formats.title": "Embroidery file formats we support",
"formats.intro": "Comparing JEF with PES, DST, and other formats Embroidery Viewer opens in your browser:",
"formats.table.headers": {
"format": "Format",
"extension": "Extension",
"machines": "Common machines",
"notes": "Notes"
},
"formats.rows.jef.format": "JEF",
"formats.rows.jef.extension": ".jef",
"formats.rows.jef.machines": "Janome, Elna, Kenmore",
"formats.rows.jef.notes": "Native Janome format with embedded thread colors",
"formats.rows.pes.format": "PES / PEC",
"formats.rows.pes.extension": ".pes, .pec",
"formats.rows.pes.machines": "Brother, Babylock",
"formats.rows.pes.notes": "Popular for home embroidery downloads",
"formats.rows.dst.format": "DST",
"formats.rows.dst.extension": ".dst",
"formats.rows.dst.machines": "Commercial & many home brands",
"formats.rows.dst.notes": "Industry standard for production shops",
"formats.rows.exp.format": "EXP",
"formats.rows.exp.extension": ".exp",
"formats.rows.exp.machines": "Melco, Bernina (export)",
"formats.rows.exp.notes": "Simple stitch list, widely supported",
"convert.title": "Can I convert JEF to PES or DST online?",
"convert.p1": "Embroidery Viewer is a <strong>preview tool</strong>, not a file converter. It lets you open a JEF file online and see stitch paths, color stops, and overall size before you load the design on your Janome or Elna machine.",
"convert.p2": "To convert JEF to PES, DST, or another format use embroidery software such as Embrilliance, Hatch, or Ink/Stitch. After converting, preview the new file in Embroidery Viewer for free.",
"screenshots.title": "See your JEF design before you stitch",
"screenshots.intro": "Preview stitch paths, colors, and dimensions without installing desktop software.",
"screenshots.viewer.alt": "Embroidery Viewer showing a JEF file preview with stitch paths and colors",
"screenshots.hero.alt": "Upload interface for opening JEF embroidery files online",
"faq.title": "Frequently asked questions about JEF & embroidery files",
"faq.intro": "Answers to common searches — from what is a JEF file to opening designs online and converting formats.",
"faq.items": {
"openJefOnline": {
"summary": "How can I open a JEF file online?",
"description": "Use Embroidery Viewer: open the free viewer, drag your .jef file into the drop zone, and click Render files. Everything runs in your browser — no Janome software or Windows-only tools required."
},
"whatIsJef": {
"summary": "What is a JEF file used for?",
"description": "JEF is Janome's embroidery format. It stores stitches and thread colors for Janome, Elna, and compatible machines. You use it to load designs from USB or transfer designs downloaded from the web."
},
"pesViewer": {
"summary": "Can I open PES or DST files too?",
"description": "Yes. The same viewer supports PES, DST, JEF, EXP, and PEC. For Brother formats see embroideryviewer.xyz/pes-file-viewer; for DST see embroideryviewer.xyz/dst-file-viewer."
},
"howToView": {
"summary": "How do I view embroidery files without software?",
"description": "Open embroideryviewer.xyz in any modern browser. Supported formats include JEF, PES, DST, EXP, and PEC. Your files are processed locally and never sent to a server."
},
"convertJef": {
"summary": "How do I convert JEF to PES or DST?",
"description": "Conversion requires embroidery editing software — Embrilliance, Hatch, Wilcom, or Ink/Stitch (free). Export to the format your machine needs, then preview the result in Embroidery Viewer before stitching."
},
"embroideryViewer": {
"summary": "What is the best free embroidery file viewer?",
"description": "Embroidery Viewer is built for quick, private previews: no account, no install, no upload. It supports JEF and the formats most home embroiderers use daily on desktop and mobile."
},
"isSafe": {
"summary": "Is it safe to open my JEF files here?",
"description": "Yes. Files are read and rendered inside your browser using JavaScript. They are not uploaded, stored, or shared with any server."
},
"mobile": {
"summary": "Can I open JEF files on my phone?",
"description": "Yes, on modern mobile browsers. Tap Choose files, select your .jef from Files or cloud storage, and tap Render files to preview."
}
},
"cta.title": "Ready to preview your JEF design?",
"cta.subtitle": "Open JEF, PES, DST, EXP, or PEC files in seconds — free and private.",
"cta.button": "Try Your Design"
}

View file

@ -69,7 +69,7 @@
}, },
"whatIsJef": { "whatIsJef": {
"summary": "What is a JEF file?", "summary": "What is a JEF file?",
"description": "JEF (.jef) is Janome's native embroidery format. It stores stitches and thread colors for Janome, Elna, and compatible machines. You can open and preview JEF files here alongside PES and DST." "description": "JEF (.jef) is Janome's native embroidery format. It stores stitches and thread colors for Janome, Elna, and compatible machines. See our dedicated JEF guide at embroideryviewer.xyz/jef-file-viewer."
}, },
"embroideryViewer": { "embroideryViewer": {
"summary": "What is the best free embroidery file viewer?", "summary": "What is the best free embroidery file viewer?",

View file

@ -87,6 +87,13 @@ const config = {
loader: async () => loader: async () =>
(await import('./en-US/dst-file-viewer.json')).default, (await import('./en-US/dst-file-viewer.json')).default,
}, },
{
locale: SUPPORTED_LOCALES.EN_US,
key: 'jef-file-viewer',
routes: ['/jef-file-viewer'],
loader: async () =>
(await import('./en-US/jef-file-viewer.json')).default,
},
{ {
locale: SUPPORTED_LOCALES.PT_BR, locale: SUPPORTED_LOCALES.PT_BR,
key: 'header', key: 'header',
@ -155,6 +162,13 @@ const config = {
loader: async () => loader: async () =>
(await import('./pt-BR/dst-file-viewer.json')).default, (await import('./pt-BR/dst-file-viewer.json')).default,
}, },
{
locale: SUPPORTED_LOCALES.PT_BR,
key: 'jef-file-viewer',
routes: ['/jef-file-viewer'],
loader: async () =>
(await import('./pt-BR/jef-file-viewer.json')).default,
},
{ {
locale: SUPPORTED_LOCALES.PT_BR, locale: SUPPORTED_LOCALES.PT_BR,
key: 'hero', key: 'hero',

View file

@ -69,7 +69,7 @@
}, },
"whatIsJef": { "whatIsJef": {
"summary": "O que é um arquivo JEF?", "summary": "O que é um arquivo JEF?",
"description": "JEF (.jef) é o formato nativo da Janome. Armazena pontos e cores para Janome, Elna e compatíveis. Você pode visualizar JEF junto com DST e PES." "description": "JEF (.jef) é o formato nativo da Janome. Armazena pontos e cores para Janome, Elna e compatíveis. Veja o guia JEF em embroideryviewer.xyz/jef-file-viewer."
}, },
"embroideryViewer": { "embroideryViewer": {
"summary": "Qual o melhor visualizador gratuito de bordado?", "summary": "Qual o melhor visualizador gratuito de bordado?",

View file

@ -10,6 +10,7 @@
"about": "Sobre", "about": "Sobre",
"pesViewer": "Visualizador PES", "pesViewer": "Visualizador PES",
"dstViewer": "Visualizador DST", "dstViewer": "Visualizador DST",
"jefViewer": "Visualizador JEF",
"privacy.policy": "Política de Privacidade", "privacy.policy": "Política de Privacidade",
"terms.of.service": "Termos de Serviço", "terms.of.service": "Termos de Serviço",
"copyright": "Copyright © {{year}} <a href=\"{{website}}/pt-br\" target=\"_blank\" rel=\"noreferrer\">Leonardo Murça</a>. Todos os direitos reservados.", "copyright": "Copyright © {{year}} <a href=\"{{website}}/pt-br\" target=\"_blank\" rel=\"noreferrer\">Leonardo Murça</a>. Todos os direitos reservados.",

View file

@ -0,0 +1,90 @@
{
"seo.title": "Visualizador de Arquivos JEF Online Grátis — Abra Bordados Janome na Hora",
"seo.description": "Abra arquivos JEF online gratuitamente. Visualize bordados Janome e Elna no navegador — sem instalar, sem enviar para servidores. Também suporta PES, DST, EXP e PEC.",
"seo.keywords": "o que é arquivo JEF, visualizador JEF, abrir arquivo JEF online, visualizador de bordado, arquivo Janome bordado, como ver arquivo de bordado, converter JEF para PES, converter JEF para DST, preview bordado online",
"seo.url": "https://embroideryviewer.xyz/jef-file-viewer",
"seo.image": "https://embroideryviewer.xyz/og/jef-viewer.png",
"hero.tagline": "Grátis · Privado · Sem cadastro",
"hero.title": "Visualizador de Arquivos JEF Online Grátis — Abra Bordados Janome na Hora",
"hero.subtitle": "Veja caminhos de pontos, cores e dimensões no navegador — grátis, privado e sem cadastro. JEF é o formato nativo para Janome, Elna e máquinas compatíveis.",
"hero.cta": "Experimente seu desenho",
"whatIs.title": "O que é um arquivo JEF?",
"whatIs.p1": "Um <strong>arquivo JEF</strong> (.jef) é o formato de bordado nativo das máquinas <strong>Janome</strong> e <strong>Elna</strong>. Muitos modelos Kenmore e compatíveis com Janome também leem JEF.",
"whatIs.p2": "Arquivos JEF contêm coordenadas de pontos, comandos de troca de cor e uma paleta de linhas — parecido com PES nas máquinas Brother. Downloads para Janome Memory Craft ou Elna Express costumam vir como .jef.",
"whatIs.p3": "O Embroidery Viewer permite abrir JEF online para conferir layout, contagem de pontos e tamanho antes de bordar — sem instalar Janome Artistic Digitizer ou outro software desktop.",
"howTo.title": "Como visualizar arquivos JEF de bordado online",
"howTo.step1": "Abra o <strong>visualizador de bordado gratuito</strong> no navegador.",
"howTo.step2": "Clique em <strong>Escolher arquivos</strong> ou arraste seu .jef (ou .pes, .dst, .exp, .pec) para a área de soltar.",
"howTo.step3": "Clique em <strong>Renderizar arquivos</strong> para gerar a prévia na tela.",
"howTo.step4": "Revise cores, contagem de pontos e dimensões — e baixe um PNG se precisar de referência.",
"formats.title": "Formatos de bordado suportados",
"formats.intro": "Comparação entre JEF, PES, DST e outros formatos que o Embroidery Viewer abre no navegador:",
"formats.table.headers": {
"format": "Formato",
"extension": "Extensão",
"machines": "Máquinas comuns",
"notes": "Observações"
},
"formats.rows.jef.format": "JEF",
"formats.rows.jef.extension": ".jef",
"formats.rows.jef.machines": "Janome, Elna, Kenmore",
"formats.rows.jef.notes": "Formato nativo Janome com cores de linha embutidas",
"formats.rows.pes.format": "PES / PEC",
"formats.rows.pes.extension": ".pes, .pec",
"formats.rows.pes.machines": "Brother, Babylock",
"formats.rows.pes.notes": "Popular em downloads domésticos",
"formats.rows.dst.format": "DST",
"formats.rows.dst.extension": ".dst",
"formats.rows.dst.machines": "Comercial e várias domésticas",
"formats.rows.dst.notes": "Padrão da indústria para oficinas",
"formats.rows.exp.format": "EXP",
"formats.rows.exp.extension": ".exp",
"formats.rows.exp.machines": "Melco, Bernina (exportação)",
"formats.rows.exp.notes": "Lista simples de pontos, amplamente suportado",
"convert.title": "Posso converter JEF para PES ou DST online?",
"convert.p1": "O Embroidery Viewer é uma <strong>ferramenta de prévia</strong>, não um conversor. Ele permite abrir JEF online e ver pontos, paradas de cor e tamanho antes de carregar na Janome ou Elna.",
"convert.p2": "Para converter JEF em PES, DST ou outro formato use software de bordado como Embrilliance, Hatch ou Ink/Stitch. Depois visualize o novo arquivo gratuitamente no visualizador.",
"screenshots.title": "Veja seu JEF antes de costurar",
"screenshots.intro": "Visualize pontos, cores e dimensões sem instalar software no computador.",
"screenshots.viewer.alt": "Embroidery Viewer exibindo prévia de arquivo JEF com pontos e cores",
"screenshots.hero.alt": "Interface de envio para abrir arquivos JEF de bordado online",
"faq.title": "Perguntas frequentes sobre JEF e arquivos de bordado",
"faq.intro": "Respostas às buscas mais comuns — do que é um JEF a abrir desenhos online e converter formatos.",
"faq.items": {
"openJefOnline": {
"summary": "Como abrir um arquivo JEF online?",
"description": "Use o Embroidery Viewer: abra o visualizador gratuito, arraste o .jef para a área e clique em Renderizar arquivos. Tudo roda no navegador — sem software Janome ou ferramentas só para Windows."
},
"whatIsJef": {
"summary": "Para que serve um arquivo JEF?",
"description": "JEF é o formato de bordado da Janome. Armazena pontos e cores de linha para Janome, Elna e compatíveis. Você o usa para carregar desenhos via USB ou transferir downloads da web."
},
"pesViewer": {
"summary": "Posso abrir arquivos PES ou DST também?",
"description": "Sim. O mesmo visualizador suporta PES, DST, JEF, EXP e PEC. Para Brother veja embroideryviewer.xyz/pes-file-viewer; para DST veja embroideryviewer.xyz/dst-file-viewer."
},
"howToView": {
"summary": "Como ver arquivos de bordado sem software?",
"description": "Abra embroideryviewer.xyz em qualquer navegador moderno. Formatos: JEF, PES, DST, EXP e PEC. Os arquivos são processados localmente e nunca enviados a um servidor."
},
"convertJef": {
"summary": "Como converter JEF para PES ou DST?",
"description": "A conversão exige software de edição — Embrilliance, Hatch, Wilcom ou Ink/Stitch (grátis). Exporte para o formato da sua máquina e visualize o resultado no Embroidery Viewer antes de bordar."
},
"embroideryViewer": {
"summary": "Qual o melhor visualizador gratuito de bordado?",
"description": "O Embroidery Viewer foi feito para prévias rápidas e privadas: sem conta, sem instalação, sem upload. Suporta JEF e os formatos mais usados no desktop e celular."
},
"isSafe": {
"summary": "É seguro abrir meus arquivos JEF aqui?",
"description": "Sim. Os arquivos são lidos e renderizados no navegador com JavaScript. Não são enviados, armazenados nem compartilhados com servidores."
},
"mobile": {
"summary": "Posso abrir JEF no celular?",
"description": "Sim, em navegadores móveis modernos. Toque em Escolher arquivos, selecione o .jef e toque em Renderizar arquivos."
}
},
"cta.title": "Pronto para ver seu JEF?",
"cta.subtitle": "Abra JEF, PES, DST, EXP ou PEC em segundos — grátis e privado.",
"cta.button": "Experimente seu desenho"
}

View file

@ -69,7 +69,7 @@
}, },
"whatIsJef": { "whatIsJef": {
"summary": "O que é um arquivo JEF?", "summary": "O que é um arquivo JEF?",
"description": "JEF (.jef) é o formato nativo da Janome. Armazena pontos e cores para Janome, Elna e compatíveis. Você pode abrir e visualizar JEF aqui junto com PES e DST." "description": "JEF (.jef) é o formato nativo da Janome. Armazena pontos e cores para Janome, Elna e compatíveis. Veja o guia JEF em embroideryviewer.xyz/jef-file-viewer."
}, },
"embroideryViewer": { "embroideryViewer": {
"summary": "Qual o melhor visualizador gratuito de bordado?", "summary": "Qual o melhor visualizador gratuito de bordado?",

View file

@ -0,0 +1,400 @@
<script>
import { resolve } from '$app/paths';
import { PUBLIC_IMAGE_BASE_URL } from '$env/static/public';
import { t, locale } from '$lib/translations';
import Head from '$lib/components/Head.svelte';
import StructuredData from '$lib/components/StructuredData.svelte';
const NS = 'jef-file-viewer';
const baseUrl = 'https://embroideryviewer.xyz/jef-file-viewer';
const jefFilePreview = `${PUBLIC_IMAGE_BASE_URL}/t/f_webp,w_800/embroidery-viewer/${$locale}/jef-file-preview.webp`;
const viewerInterface = `${PUBLIC_IMAGE_BASE_URL}/t/f_webp,w_800/embroidery-viewer/${$locale}/viewer-interface.webp`;
const faqKeys = [
'openJefOnline',
'whatIsJef',
'pesViewer',
'howToView',
'convertJef',
'embroideryViewer',
'isSafe',
'mobile',
];
$: faqStructuredData = {
'@context': 'https://schema.org',
'@type': 'FAQPage',
mainEntity: faqKeys.map((key) => ({
'@type': 'Question',
name: $t(`${NS}.faq.items.${key}.summary`),
acceptedAnswer: {
'@type': 'Answer',
text: $t(`${NS}.faq.items.${key}.description`),
},
})),
};
$: webAppStructuredData = {
'@context': 'https://schema.org',
'@type': 'WebApplication',
name: 'Embroidery Viewer — JEF File Viewer',
url: baseUrl,
applicationCategory: 'DesignApplication',
operatingSystem: 'Any',
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'USD',
},
description: $t(`${NS}.seo.description`),
featureList: 'JEF, PES, DST, EXP, PEC embroidery file preview',
};
$: howToStructuredData = {
'@context': 'https://schema.org',
'@type': 'HowTo',
name: $t(`${NS}.howTo.title`),
step: ['step1', 'step2', 'step3', 'step4'].map((step, i) => ({
'@type': 'HowToStep',
position: i + 1,
text: $t(`${NS}.howTo.${step}`),
})),
};
</script>
<Head
title={`${NS}.seo.title`}
description={`${NS}.seo.description`}
keywords={`${NS}.seo.keywords`}
url={`${NS}.seo.url`}
ogImage={`${NS}.seo.image`}
/>
<StructuredData
data={[faqStructuredData, webAppStructuredData, howToStructuredData]}
/>
<section class="hero" aria-labelledby="jef-hero-heading">
<p class="tagline">{$t(`${NS}.hero.tagline`)}</p>
<h1 id="jef-hero-heading">{$t(`${NS}.hero.title`)}</h1>
<p class="hero-subtitle">{$t(`${NS}.hero.subtitle`)}</p>
<a class="organic-btn" href={resolve('/viewer')}>{$t(`${NS}.hero.cta`)}</a>
</section>
<article id="what-is-jef" class="content-section">
<h2>{$t(`${NS}.whatIs.title`)}</h2>
<!-- eslint-disable svelte/no-at-html-tags -->
<p>{@html $t(`${NS}.whatIs.p1`)}</p>
<p>{@html $t(`${NS}.whatIs.p2`)}</p>
<p>{@html $t(`${NS}.whatIs.p3`)}</p>
</article>
<article id="how-to-view" class="content-section alt">
<h2>{$t(`${NS}.howTo.title`)}</h2>
<ol class="steps">
{#each ['step1', 'step2', 'step3', 'step4'] as step (step)}
<li>{@html $t(`${NS}.howTo.${step}`)}</li>
{/each}
</ol>
</article>
<article id="formats" class="content-section">
<h2>{$t(`${NS}.formats.title`)}</h2>
<p>{$t(`${NS}.formats.intro`)}</p>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>{$t(`${NS}.formats.table.headers.format`)}</th>
<th>{$t(`${NS}.formats.table.headers.extension`)}</th>
<th>{$t(`${NS}.formats.table.headers.machines`)}</th>
<th>{$t(`${NS}.formats.table.headers.notes`)}</th>
</tr>
</thead>
<tbody>
{#each ['jef', 'pes', 'dst', 'exp'] as row (row)}
<tr>
<td>{$t(`${NS}.formats.rows.${row}.format`)}</td>
<td>{$t(`${NS}.formats.rows.${row}.extension`)}</td>
<td>{$t(`${NS}.formats.rows.${row}.machines`)}</td>
<td>{$t(`${NS}.formats.rows.${row}.notes`)}</td>
</tr>
{/each}
</tbody>
</table>
</div>
</article>
<article id="convert-jef" class="content-section alt">
<h2>{$t(`${NS}.convert.title`)}</h2>
<p>{@html $t(`${NS}.convert.p1`)}</p>
<p>{@html $t(`${NS}.convert.p2`)}</p>
</article>
<section
id="screenshots"
class="screenshots-section"
aria-labelledby="screenshots-heading"
>
<h2 id="screenshots-heading">{$t(`${NS}.screenshots.title`)}</h2>
<p class="screenshots-intro">{$t(`${NS}.screenshots.intro`)}</p>
<div class="screenshot-grid">
<figure>
<img
src={jefFilePreview}
width="800"
height="600"
loading="lazy"
alt={$t(`${NS}.screenshots.viewer.alt`)}
/>
<figcaption>{$t(`${NS}.screenshots.viewer.alt`)}</figcaption>
</figure>
<figure>
<img
src={viewerInterface}
width="800"
height="533"
loading="lazy"
alt={$t(`${NS}.screenshots.hero.alt`)}
/>
<figcaption>{$t(`${NS}.screenshots.hero.alt`)}</figcaption>
</figure>
</div>
</section>
<section id="faq" class="faq-section" aria-labelledby="faq-heading">
<h2 id="faq-heading">{$t(`${NS}.faq.title`)}</h2>
<p class="faq-intro">{$t(`${NS}.faq.intro`)}</p>
<div class="faq-list">
{#each faqKeys as key (key)}
<details>
<summary>{$t(`${NS}.faq.items.${key}.summary`)}</summary>
<p>{$t(`${NS}.faq.items.${key}.description`)}</p>
</details>
{/each}
</div>
</section>
<section class="cta-section" aria-labelledby="cta-heading">
<h2 id="cta-heading">{$t(`${NS}.cta.title`)}</h2>
<p>{$t(`${NS}.cta.subtitle`)}</p>
<a class="organic-btn-secondary" href={resolve('/viewer')}>
{$t(`${NS}.cta.button`)}
</a>
</section>
<style>
.hero {
padding: 140px 24px 80px;
text-align: center;
max-width: 900px;
margin: 0 auto;
}
.tagline {
text-transform: uppercase;
letter-spacing: 0.12em;
font-size: 0.85rem;
color: var(--color-primary);
margin-bottom: 12px;
}
.hero h1 {
font-size: clamp(1.75rem, 4vw, 2.5rem);
line-height: 1.25;
margin: 0 0 1rem;
}
.hero-subtitle {
font-size: 1.1rem;
line-height: 1.6;
max-width: 720px;
margin: 0 auto 1.5rem;
color: #333;
}
.hero .organic-btn {
display: block;
margin: 0 auto;
margin-top: 40px;
}
.content-section {
max-width: 800px;
margin: 0 auto;
padding: 48px 24px;
line-height: 1.7;
}
.content-section.alt {
background: rgba(6, 52, 95, 0.04);
max-width: none;
padding-left: max(24px, calc((100% - 800px) / 2));
padding-right: max(24px, calc((100% - 800px) / 2));
}
.content-section h2 {
margin-top: 0;
font-size: 1.75rem;
}
.steps {
padding-left: 1.25rem;
}
.steps li {
margin-bottom: 12px;
}
.table-wrap {
overflow-x: auto;
margin-top: 24px;
}
table {
width: 100%;
border-collapse: collapse;
font-size: 0.95rem;
}
th,
td {
border: 1px solid #d3dce6;
padding: 12px 14px;
text-align: left;
}
th {
background: var(--color-primary);
color: white;
}
tr:nth-child(even) {
background: #f8fafb;
}
.screenshots-section {
padding: 64px 24px;
max-width: 960px;
margin: 0 auto;
text-align: center;
}
.screenshots-intro {
margin-bottom: 32px;
line-height: 1.6;
}
.screenshot-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 32px;
}
.screenshot-grid img {
width: 100%;
height: auto;
border-radius: 12px;
border: 3px solid var(--color-primary);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
}
figcaption {
margin-top: 10px;
font-size: 0.9rem;
color: #444;
line-height: 1.4;
}
.faq-section {
padding: 64px 24px;
max-width: 800px;
margin: 0 auto;
}
.faq-section h2 {
text-align: center;
font-size: 1.75rem;
}
.faq-intro {
text-align: center;
margin-bottom: 32px;
line-height: 1.6;
}
.faq-list details {
border-bottom: 1px solid #eee;
padding: 20px 0;
}
.faq-list summary {
cursor: pointer;
font-weight: 600;
font-size: 1.1rem;
list-style: none;
position: relative;
color: var(--color-primary);
padding-right: 28px;
}
.faq-list summary::after {
content: '+';
position: absolute;
right: 0;
font-size: 1.5rem;
transition: transform 0.3s ease;
}
.faq-list details[open] summary::after {
transform: rotate(45deg);
}
.faq-list p {
margin-top: 10px;
line-height: 1.6;
}
.cta-section {
text-align: center;
padding: 64px 24px 100px;
background: var(--color-primary);
color: white;
}
.cta-section h2 {
color: white;
margin-top: 0;
}
.cta-section p {
margin-bottom: 24px;
opacity: 0.95;
}
.cta-section .organic-btn-secondary {
display: inline-block;
margin: 0 auto;
}
@media (max-width: 768px) {
.hero {
padding-top: 120px;
}
.screenshot-grid {
grid-template-columns: 1fr;
}
table {
font-size: 0.85rem;
}
th,
td {
padding: 8px;
}
}
</style>

View file

@ -5,6 +5,7 @@ export async function GET() {
{ path: '', priority: '0.8' }, { path: '', priority: '0.8' },
{ path: 'pes-file-viewer', priority: '0.9' }, { path: 'pes-file-viewer', priority: '0.9' },
{ path: 'dst-file-viewer', priority: '0.9' }, { path: 'dst-file-viewer', priority: '0.9' },
{ path: 'jef-file-viewer', priority: '0.9' },
{ path: 'viewer', priority: '0.85' }, { path: 'viewer', priority: '0.85' },
{ path: 'about', priority: '0.8' }, { path: 'about', priority: '0.8' },
{ path: 'donate', priority: '0.8' }, { path: 'donate', priority: '0.8' },