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
8 changed files with 598 additions and 0 deletions
Showing only changes of commit 8bbe95369e - Show all commits

View file

@ -39,6 +39,7 @@
<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('/jef-file-viewer')}>{$t('footer.jefViewer')}</a>
<a href={resolve('/exp-file-viewer')}>{$t('footer.expViewer')}</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

@ -0,0 +1,90 @@
{
"seo.title": "Free EXP File Viewer Online — Open Embroidery Files Instantly",
"seo.description": "Open EXP files online for free. Preview Melco and Bernina embroidery designs in your browser — no install, no upload to servers. Also supports PES, DST, JEF & PEC.",
"seo.keywords": "EXP viewer, open EXP file online, EXP file viewer, free EXP viewer, Melco embroidery file, embroidery file viewer, how to view embroidery files, convert EXP to DST, convert EXP to PES, Bernina EXP embroidery, online embroidery preview",
"seo.url": "https://embroideryviewer.xyz/exp-file-viewer",
"seo.image": "https://embroideryviewer.xyz/og/exp-viewer.png",
"hero.tagline": "Free · Private · No signup",
"hero.title": "Free EXP File Viewer Online — Open Embroidery Files Instantly",
"hero.subtitle": "Preview stitch paths and dimensions in your browser — free, private, and no signup. EXP is widely used by Melco systems and many machines that accept universal stitch formats.",
"hero.cta": "Try Your Design",
"whatIs.title": "What is an EXP file?",
"whatIs.p1": "An <strong>EXP file</strong> (.exp) is a compact embroidery format associated with <strong>Melco</strong> commercial systems and commonly exported by <strong>Bernina</strong> and other software as a universal stitch file.",
"whatIs.p2": "EXP encodes stitch movements as a simple stream of coordinates with stop, trim, and color-change commands. It does not carry a rich thread palette like PES or JEF — similar to DST, colors are often assigned by your machine or software.",
"whatIs.p3": "You will find EXP in commercial workflows, converted downloads, and older design libraries. Embroidery Viewer lets you open EXP online and check stitch structure and size before loading the file on your machine.",
"howTo.title": "How to view EXP 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 .exp file (or .pes, .dst, .jef, .pec) into the drop zone.",
"howTo.step3": "Click <strong>Render files</strong> to generate a stitch preview on screen.",
"howTo.step4": "Review stitch count and dimensions — then download a PNG if you need a reference image.",
"formats.title": "Embroidery file formats we support",
"formats.intro": "Comparing EXP with PES, DST, JEF, and other formats Embroidery Viewer opens in your browser:",
"formats.table.headers": {
"format": "Format",
"extension": "Extension",
"machines": "Common machines",
"notes": "Notes"
},
"formats.rows.exp.format": "EXP",
"formats.rows.exp.extension": ".exp",
"formats.rows.exp.machines": "Melco, Bernina (export)",
"formats.rows.exp.notes": "Compact stitch stream; widely supported",
"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.jef.format": "JEF",
"formats.rows.jef.extension": ".jef",
"formats.rows.jef.machines": "Janome, Elna, Kenmore",
"formats.rows.jef.notes": "Janome's native format",
"convert.title": "Can I convert EXP to DST or PES online?",
"convert.p1": "Embroidery Viewer is a <strong>preview tool</strong>, not a file converter. It lets you open an EXP file online and see stitch paths, color stops, and overall size before you stitch or send the file to production.",
"convert.p2": "To convert EXP to DST, PES, or JEF use embroidery software such as Wilcom, Hatch, Embrilliance, or Ink/Stitch. After converting, you can preview the new file in Embroidery Viewer for free.",
"screenshots.title": "See your EXP design before you stitch",
"screenshots.intro": "Preview stitch paths and dimensions without installing desktop software.",
"screenshots.viewer.alt": "Embroidery Viewer showing an EXP file preview with stitch paths",
"screenshots.hero.alt": "Upload interface for opening EXP embroidery files online",
"faq.title": "Frequently asked questions about EXP & embroidery files",
"faq.intro": "Answers to common searches — from opening EXP online to converting formats and using the embroidery file viewer.",
"faq.items": {
"openExpOnline": {
"summary": "How can I open an EXP file online?",
"description": "Use Embroidery Viewer: open the free viewer, drag your .exp file into the drop zone, and click Render files. Everything runs in your browser — no Melco software or Windows-only tools required."
},
"whatIsExp": {
"summary": "What is an EXP file used for?",
"description": "EXP is a stitch-data format used by Melco commercial embroidery systems and often exported from Bernina and other software. It stores movement commands for embroidery machines that accept the format."
},
"otherFormats": {
"summary": "Can I open PES, DST, or JEF files too?",
"description": "Yes. The same viewer supports PES, DST, JEF, EXP, and PEC. See our guides at embroideryviewer.xyz/pes-file-viewer, /dst-file-viewer, and /jef-file-viewer."
},
"howToView": {
"summary": "How do I view embroidery files without software?",
"description": "Open embroideryviewer.xyz in any modern browser. Supported formats include EXP, PES, DST, JEF, and PEC. Your files are processed locally and never sent to a server."
},
"convertExp": {
"summary": "How do I convert EXP to DST or PES?",
"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 EXP and the formats most embroiderers use daily on desktop and mobile."
},
"isSafe": {
"summary": "Is it safe to open my EXP 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 EXP files on my phone?",
"description": "Yes, on modern mobile browsers. Tap Choose files, select your .exp from Files or cloud storage, and tap Render files to preview."
}
},
"cta.title": "Ready to preview your EXP design?",
"cta.subtitle": "Open EXP, PES, DST, JEF, or PEC files in seconds — free and private.",
"cta.button": "Try Your Design"
}

View file

@ -11,6 +11,7 @@
"pesViewer": "PES File Viewer", "pesViewer": "PES File Viewer",
"dstViewer": "DST File Viewer", "dstViewer": "DST File Viewer",
"jefViewer": "JEF File Viewer", "jefViewer": "JEF File Viewer",
"expViewer": "EXP 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

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

View file

@ -0,0 +1,90 @@
{
"seo.title": "Visualizador de Arquivos EXP Online Grátis — Abra Bordados na Hora",
"seo.description": "Abra arquivos EXP online gratuitamente. Visualize bordados Melco e Bernina no navegador — sem instalar, sem enviar para servidores. Também suporta PES, DST, JEF e PEC.",
"seo.keywords": "visualizador EXP, abrir arquivo EXP online, visualizador de bordado, arquivo Melco bordado, como ver arquivo de bordado, converter EXP para DST, converter EXP para PES, bordado Bernina EXP, preview bordado online",
"seo.url": "https://embroideryviewer.xyz/exp-file-viewer",
"seo.image": "https://embroideryviewer.xyz/og/exp-viewer.png",
"hero.tagline": "Grátis · Privado · Sem cadastro",
"hero.title": "Visualizador de Arquivos EXP Online Grátis — Abra Bordados na Hora",
"hero.subtitle": "Veja caminhos de pontos e dimensões no navegador — grátis, privado e sem cadastro. EXP é muito usado em sistemas Melco e em máquinas que aceitam formatos universais de pontos.",
"hero.cta": "Experimente seu desenho",
"whatIs.title": "O que é um arquivo EXP?",
"whatIs.p1": "Um <strong>arquivo EXP</strong> (.exp) é um formato compacto associado a sistemas comerciais <strong>Melco</strong> e frequentemente exportado por <strong>Bernina</strong> e outros softwares como arquivo universal de pontos.",
"whatIs.p2": "EXP codifica movimentos de ponto com comandos de parada, aparo e troca de cor. Não traz paleta rica como PES ou JEF — cores costumam ser definidas pela máquina ou software, parecido com DST.",
"whatIs.p3": "Você encontra EXP em fluxos comerciais, downloads convertidos e bibliotecas antigas. O Embroidery Viewer permite abrir EXP online e conferir estrutura e tamanho antes de bordar.",
"howTo.title": "Como visualizar arquivos EXP 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 .exp (ou .pes, .dst, .jef, .pec) para a área de soltar.",
"howTo.step3": "Clique em <strong>Renderizar arquivos</strong> para gerar a prévia na tela.",
"howTo.step4": "Revise 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 EXP, PES, DST, JEF 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.exp.format": "EXP",
"formats.rows.exp.extension": ".exp",
"formats.rows.exp.machines": "Melco, Bernina (exportação)",
"formats.rows.exp.notes": "Fluxo compacto de pontos; amplamente suportado",
"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.jef.format": "JEF",
"formats.rows.jef.extension": ".jef",
"formats.rows.jef.machines": "Janome, Elna, Kenmore",
"formats.rows.jef.notes": "Formato nativo Janome",
"convert.title": "Posso converter EXP para DST ou PES online?",
"convert.p1": "O Embroidery Viewer é uma <strong>ferramenta de prévia</strong>, não um conversor. Ele permite abrir EXP online e ver pontos, paradas de cor e tamanho antes de bordar ou enviar para produção.",
"convert.p2": "Para converter EXP em DST, PES ou JEF use software de bordado como Wilcom, Hatch, Embrilliance ou Ink/Stitch. Depois visualize o novo arquivo gratuitamente no visualizador.",
"screenshots.title": "Veja seu EXP antes de costurar",
"screenshots.intro": "Visualize pontos e dimensões sem instalar software no computador.",
"screenshots.viewer.alt": "Embroidery Viewer exibindo prévia de arquivo EXP com caminhos de pontos",
"screenshots.hero.alt": "Interface de envio para abrir arquivos EXP de bordado online",
"faq.title": "Perguntas frequentes sobre EXP e arquivos de bordado",
"faq.intro": "Respostas às buscas mais comuns — de abrir EXP online a converter formatos e usar o visualizador.",
"faq.items": {
"openExpOnline": {
"summary": "Como abrir um arquivo EXP online?",
"description": "Use o Embroidery Viewer: abra o visualizador gratuito, arraste o .exp para a área e clique em Renderizar arquivos. Tudo roda no navegador — sem software Melco ou ferramentas só para Windows."
},
"whatIsExp": {
"summary": "Para que serve um arquivo EXP?",
"description": "EXP é um formato de dados de pontos usado em sistemas Melco e frequentemente exportado pela Bernina e outros softwares. Armazena comandos de movimento para máquinas compatíveis."
},
"otherFormats": {
"summary": "Posso abrir arquivos PES, DST ou JEF também?",
"description": "Sim. O mesmo visualizador suporta PES, DST, JEF, EXP e PEC. Veja embroideryviewer.xyz/pes-file-viewer, /dst-file-viewer e /jef-file-viewer."
},
"howToView": {
"summary": "Como ver arquivos de bordado sem software?",
"description": "Abra embroideryviewer.xyz em qualquer navegador moderno. Formatos: EXP, PES, DST, JEF e PEC. Os arquivos são processados localmente e nunca enviados a um servidor."
},
"convertExp": {
"summary": "Como converter EXP para DST ou PES?",
"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 EXP e os formatos mais usados no desktop e celular."
},
"isSafe": {
"summary": "É seguro abrir meus arquivos EXP 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 EXP no celular?",
"description": "Sim, em navegadores móveis modernos. Toque em Escolher arquivos, selecione o .exp e toque em Renderizar arquivos."
}
},
"cta.title": "Pronto para ver seu EXP?",
"cta.subtitle": "Abra EXP, PES, DST, JEF ou PEC em segundos — grátis e privado.",
"cta.button": "Experimente seu desenho"
}

View file

@ -11,6 +11,7 @@
"pesViewer": "Visualizador PES", "pesViewer": "Visualizador PES",
"dstViewer": "Visualizador DST", "dstViewer": "Visualizador DST",
"jefViewer": "Visualizador JEF", "jefViewer": "Visualizador JEF",
"expViewer": "Visualizador EXP",
"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,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 = 'exp-file-viewer';
const baseUrl = 'https://embroideryviewer.xyz/exp-file-viewer';
const expFilePreview = `${PUBLIC_IMAGE_BASE_URL}/t/f_webp,w_800/embroidery-viewer/${$locale}/exp-file-preview.webp`;
const viewerInterface = `${PUBLIC_IMAGE_BASE_URL}/t/f_webp,w_800/embroidery-viewer/${$locale}/viewer-interface.webp`;
const faqKeys = [
'openExpOnline',
'whatIsExp',
'otherFormats',
'howToView',
'convertExp',
'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 — EXP File Viewer',
url: baseUrl,
applicationCategory: 'DesignApplication',
operatingSystem: 'Any',
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'USD',
},
description: $t(`${NS}.seo.description`),
featureList: 'EXP, PES, DST, JEF, 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="exp-hero-heading">
<p class="tagline">{$t(`${NS}.hero.tagline`)}</p>
<h1 id="exp-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-exp" 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 ['exp', 'pes', 'dst', 'jef'] 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-exp" 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={expFilePreview}
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

@ -6,6 +6,7 @@ export async function GET() {
{ 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: 'jef-file-viewer', priority: '0.9' },
{ path: 'exp-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' },