From e6ba785fdd41309ef4aecfcb4628b56448df897d Mon Sep 17 00:00:00 2001 From: tsoolgee <291792265+tsoolgee@users.noreply.github.com> Date: Tue, 6 Oct 2026 23:46:00 +0300 Subject: [PATCH 1/3] fix(design): mobile header, real before/after slider, Hebrew labels, layout and JS bugs Layout and design - Mobile header: every .btn became width:100% under 600px, pushing the menu toggle off-screen and the page 474px wide on a 390px phone. Header buttons keep their size; the GitHub button moves to the drawer under 980px; header height comes from one token. - Before/after slider: the "after" layer was resized, so its text reflowed into a strip (unreadable on phones, and on <768px both layers were stacked). Both versions now share one grid cell at full width and the "after" layer is revealed with clip-path; height follows the content (no empty half). Labels no longer overlap the heading or each other. - Hebrew in "mono" labels fell back to Courier New (JetBrains Mono has no Hebrew): Heebo is now the Hebrew fallback; RTL section labels drop the wide tracking. - Features grid: the sixth card sat alone on its row; tags stretched across the card. - Tables on phones scroll sideways with the row label pinned instead of one word per line. - Floating download widget was unstyled (its classes did not exist in the CSS) and showed before the user reached the download card; it now appears only after scrolling past it. - Footer modal links were 42px tall (global button min-height) and misaligned. - Quotes: no fake italic on Hebrew; mixed-direction quotes and the footer line keep their own direction. Low-contrast PASSED / "Word" badges fixed for light mode. - Removed the dead "pipeline" section CSS/JS (no such markup on the page). Behaviour - Scroll-reveal content is hidden only after main.js runs (was invisible without JS). - Theme: applied before first paint (theme-init.js, no light flash for dark users); localStorage access guarded. - Release links: one cached API call; Windows assets from the latest release, Linux/macOS CLI from the newest release that ships them; version also updated on the floating button. - Modals return focus to the opener and keep Tab inside; drawer label resets on close. - New square logo/icon sizes (logo-96.webp 1.7 KB instead of the 44 KB JPEG in the header). --- assets/css/a11y-motion.css | 7 +- assets/css/components.css | 262 ++++++++++++++++------------- assets/css/main.css | 31 +++- assets/css/reset.css | 5 +- assets/css/tokens.css | 3 +- assets/images/apple-touch-icon.png | Bin 0 -> 27727 bytes assets/images/icon-192.png | Bin 0 -> 30560 bytes assets/images/icon-512.png | Bin 0 -> 139185 bytes assets/images/logo-96.webp | Bin 0 -> 2988 bytes assets/js/a11y.js | 18 +- assets/js/before-after.js | 29 ++-- assets/js/main.js | 236 +++++++++++++------------- assets/js/theme-init.js | 11 ++ 13 files changed, 331 insertions(+), 271 deletions(-) create mode 100644 assets/images/apple-touch-icon.png create mode 100644 assets/images/icon-192.png create mode 100644 assets/images/icon-512.png create mode 100644 assets/images/logo-96.webp create mode 100644 assets/js/theme-init.js diff --git a/assets/css/a11y-motion.css b/assets/css/a11y-motion.css index 5748f30..33ef2a0 100644 --- a/assets/css/a11y-motion.css +++ b/assets/css/a11y-motion.css @@ -5,14 +5,15 @@ /* -------------------------------------------------------------------------- 1. Shared Motion Primitives (CSS Only) -------------------------------------------------------------------------- */ -.reveal-on-scroll { +/* Hidden only once main.js has run (it adds .js-reveal), so content is never + lost when scripts are blocked or fail. */ +.js-reveal .reveal-on-scroll { opacity: 0; transform: translateY(16px); transition: opacity 0.45s cubic-bezier(0.16, 1, 0.3, 1), transform 0.45s cubic-bezier(0.16, 1, 0.3, 1); - will-change: opacity, transform; } -.reveal-on-scroll.revealed { +.js-reveal .reveal-on-scroll.revealed { opacity: 1; transform: translateY(0); } diff --git a/assets/css/components.css b/assets/css/components.css index 8f01d3a..c1a9be4 100644 --- a/assets/css/components.css +++ b/assets/css/components.css @@ -73,11 +73,12 @@ } .hero-metric-value { - font-family: var(--font-mono); + font-family: var(--font-sans); font-size: var(--font-size-lg); font-weight: 800; + font-variant-numeric: tabular-nums; color: var(--color-ink-primary); - line-height: 1.1; + line-height: 1.2; } .hero-metric-label { @@ -324,9 +325,8 @@ display: flex; align-items: center; gap: 12px; - font-size: 11px; + font-size: 12px; color: var(--color-ink-muted); - font-family: var(--font-mono); flex-wrap: wrap; } @@ -371,10 +371,17 @@ border-color: var(--color-brand-blue); } -.floating-dl-btn { +.floating-widget-content { + display: flex; + align-items: center; + gap: 12px; +} + +.floating-download-btn { display: inline-flex; align-items: center; gap: 8px; + min-height: 40px; background: var(--color-brand-blue); color: #FFFFFF !important; padding: 8px 16px; @@ -382,29 +389,53 @@ font-size: 13px; font-weight: 700; text-decoration: none; + white-space: nowrap; transition: background var(--motion-fast); } -.floating-dl-btn:hover { +.floating-download-btn:hover { background: var(--color-brand-blue-hover); } -.floating-dl-info { +.floating-widget-info { display: flex; flex-direction: column; + gap: 2px; } -.floating-dl-title { +.floating-widget-title { font-size: 13px; font-weight: 700; color: var(--color-ink-primary); line-height: 1.1; + white-space: nowrap; } -.floating-dl-version { - font-family: var(--font-mono); - font-size: 10px; +.floating-widget-sub { + font-size: 11px; color: var(--color-ink-muted); + white-space: nowrap; +} + +/* On phones the pill shrinks to its button so it does not cover the text column. */ +@media (max-width: 600px) { + .floating-download-widget, + [dir="ltr"] .floating-download-widget { + padding: 4px; + bottom: 16px; + } + + .floating-download-widget { + left: 16px; + } + + [dir="ltr"] .floating-download-widget { + right: 16px; + } + + .floating-widget-info { + display: none; + } } /* -------------------------------------------------------------------------- @@ -597,14 +628,15 @@ color: var(--color-brand-blue-hover); } +/* Both versions are laid out at full width in the same grid cell; the "after" + layer is revealed with clip-path (before-after.js), so neither text reflows. */ .comparison-wrapper { position: relative; + display: grid; width: 100%; max-width: 920px; margin-left: auto; margin-right: auto; - min-height: 400px; - height: clamp(380px, 50vh, 460px); border-radius: var(--radius-md); border: 1px solid var(--color-border-medium); box-shadow: var(--shadow-paper); @@ -617,12 +649,10 @@ .comparison-before, .comparison-after { - position: absolute; - inset: 0; - width: 100%; - height: 100%; + grid-area: 1 / 1; + position: relative; + min-width: 0; box-sizing: border-box; - overflow: hidden; } .comparison-before { @@ -633,36 +663,45 @@ .comparison-after { background: var(--color-bg-paper); color: var(--color-ink-primary); - width: 50%; - box-shadow: -2px 0 14px rgba(0, 0, 0, 0.4); - overflow: hidden; + clip-path: inset(0 0 0 50%); +} + +[dir="ltr"] .comparison-after { + clip-path: inset(0 50% 0 0); } .comparison-inner { width: 100%; - max-width: 840px; - padding: var(--space-8) var(--space-6); + padding: 64px var(--space-8) var(--space-8); box-sizing: border-box; } .comp-badge { position: absolute; - top: 12px; + top: 16px; padding: 3px 10px; - font-family: var(--font-mono); - font-size: 11px; + font-size: 12px; font-weight: 700; border-radius: var(--radius-xs); z-index: 5; + /* Each label owns one half, so the two never overlap at the 50% position. */ + max-width: calc(50% - 28px); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .comp-badge-before { left: 14px; - background: rgba(239, 68, 68, 0.15); - color: #F87171; + background: rgba(239, 68, 68, 0.1); + color: #B91C1C; border: 1px solid rgba(239, 68, 68, 0.3); } +[data-theme="dark"] .comp-badge-before { + color: #F87171; +} + .comp-badge-after { right: 14px; background: var(--color-brand-blue-light); @@ -694,6 +733,11 @@ touch-action: none; } +[dir="ltr"] .comparison-handle { + margin-right: 0; + margin-left: -22px; +} + .handle-line { position: absolute; top: 0; @@ -887,9 +931,13 @@ font-size: 15px; line-height: 1.6; color: var(--color-ink-primary); - font-style: italic; + /* Frank Ruhl Libre has no italic; a synthesized slant on Hebrew looks broken. */ + font-style: normal; padding-right: 12px; border-right: 3px solid var(--color-accent-gold); + /* A quote in another script (e.g. English) takes its own direction and punctuation. */ + unicode-bidi: plaintext; + text-align: start; } [dir="ltr"] .quote-body { @@ -955,6 +1003,18 @@ grid-column: span 2; } +/* Six cards in a 3-column grid (first one double width) leave the last card + alone on its row; let it take the full row instead of leaving a hole. */ +.bento-grid > .bento-card:last-child { + grid-column: 1 / -1; +} + +/* Tags sit at their natural width instead of stretching across the card. */ +.bento-card > .badge { + align-self: flex-start; + margin-top: var(--space-4); +} + .bento-icon { width: 40px; height: 40px; @@ -980,69 +1040,6 @@ line-height: var(--line-height-base); } -/* -------------------------------------------------------------------------- - 7. HOW IT WORKS (PIPELINE) - -------------------------------------------------------------------------- */ -.pipeline-track { - display: grid; - grid-template-columns: repeat(5, 1fr); - gap: var(--space-3); - margin-top: var(--space-6); -} - -.pipeline-step-card { - background-color: var(--color-bg-paper); - border: 1px solid var(--color-border-subtle); - border-radius: var(--radius-md); - padding: var(--space-4); - box-shadow: var(--shadow-subtle); - cursor: pointer; - transition: all var(--motion-fast); - display: flex; - flex-direction: column; -} - -.pipeline-step-card:hover, -.pipeline-step-card.active { - border-color: var(--color-brand-blue); - box-shadow: var(--shadow-paper); -} - -.pipeline-step-card.active { - background: var(--color-brand-blue-light); -} - -.pipe-num { - font-family: var(--font-mono); - font-size: 10px; - font-weight: 800; - color: var(--color-brand-blue); - margin-bottom: var(--space-1); -} - -.pipe-title { - font-family: var(--font-serif); - font-size: var(--font-size-base); - font-weight: 700; - color: var(--color-ink-primary); - margin-bottom: var(--space-1); -} - -.pipe-desc { - font-size: 12px; - color: var(--color-ink-secondary); - line-height: var(--line-height-snug); -} - -.pipeline-detail-panel { - margin-top: var(--space-5); - background: var(--color-bg-paper); - border: 1px solid var(--color-border-medium); - border-radius: var(--radius-md); - padding: var(--space-5); - box-shadow: var(--shadow-paper); -} - /* -------------------------------------------------------------------------- 8. BENCHMARKS TABLE & DEVELOPER CARD -------------------------------------------------------------------------- */ @@ -1069,8 +1066,7 @@ .benchmarks-table th { background-color: var(--color-bg-subtle); padding: var(--space-3) var(--space-5); - font-family: var(--font-mono); - font-size: 11px; + font-size: 12px; color: var(--color-ink-primary); border-bottom: 2px solid var(--color-border-medium); font-weight: 700; @@ -1088,13 +1084,17 @@ gap: 4px; padding: 2px 8px; border-radius: var(--radius-pill); - background: rgba(34, 197, 94, 0.15); - color: #4ADE80; + background: rgba(34, 197, 94, 0.14); + color: #15803D; font-family: var(--font-mono); font-size: 11px; font-weight: 700; } +[data-theme="dark"] .status-badge-pass { + color: #4ADE80; +} + /* Developer Spotlight Card */ .developer-card { background: linear-gradient(135deg, var(--color-bg-paper) 0%, var(--color-bg-subtle) 100%); @@ -1176,6 +1176,27 @@ border-top: 1px solid var(--color-border-subtle); padding-top: var(--space-6); font-size: 11px; + gap: var(--space-4); + flex-wrap: wrap; +} + +/* English legal line inside an RTL page: keep its own direction and punctuation. */ +.footer-bottom > * { + unicode-bidi: plaintext; +} + +/* Modal triggers in the link lists must line up with the plain links. */ +.site-footer li > button { + min-height: 0; + font: inherit; + line-height: inherit; + text-align: start; + cursor: pointer; +} + +.site-footer li > button:hover, +.site-footer li > a:hover { + text-decoration: underline; } /* -------------------------------------------------------------------------- @@ -1262,9 +1283,6 @@ grid-template-columns: 1fr; } - .pipeline-track { - grid-template-columns: repeat(2, 1fr); - } .developer-card { grid-template-columns: 1fr; @@ -1291,33 +1309,47 @@ grid-column: span 1; } - .pipeline-track { - grid-template-columns: 1fr; - } .footer-grid { grid-template-columns: 1fr; } - .comparison-wrapper { - min-height: 440px; - height: auto; + .comparison-inner { + padding: 56px var(--space-4) var(--space-6); } - .comparison-inner { - padding: var(--space-6) var(--space-4); + /* Wide tables scroll sideways with the row label pinned, instead of + squeezing every column to one word per line. */ + .matrix-table { + min-width: 720px; + } + + .matrix-table th:first-child, + .matrix-table td:first-child, + .benchmarks-table th:first-child, + .benchmarks-table td:first-child { + position: sticky; + inset-inline-start: 0; + z-index: 1; + background-color: var(--color-bg-paper); + box-shadow: inset 1px 0 0 var(--color-border-medium); + } + + [dir="ltr"] .matrix-table td:first-child, + [dir="ltr"] .matrix-table th:first-child, + [dir="ltr"] .benchmarks-table td:first-child, + [dir="ltr"] .benchmarks-table th:first-child { + box-shadow: inset -1px 0 0 var(--color-border-medium); } - .comparison-before, - .comparison-after { - position: relative; - height: auto; + .matrix-table th:first-child, + .benchmarks-table th:first-child { + background-color: var(--color-bg-subtle); } - .comp-badge { - position: static; - display: inline-block; - margin-bottom: var(--space-2); + .matrix-table th, + .matrix-table td { + padding: 12px 14px; } .talmud-layout-specimen { diff --git a/assets/css/main.css b/assets/css/main.css index 681393b..b82c23f 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -433,6 +433,13 @@ body::before { margin-bottom: var(--space-2); } +/* Tracked monospace caps suit Latin labels; Hebrew has no case and reads badly letter-spaced. */ +[dir="rtl"] .section-pretitle { + font-family: var(--font-sans); + font-size: 13px; + letter-spacing: 0.01em; +} + .section-title { font-size: var(--font-size-3xl); font-weight: 800; @@ -512,6 +519,11 @@ body::before { display: inline-flex; } + /* The drawer carries the GitHub link; the header keeps only the controls that fit. */ + .header-actions > .btn-outline { + display: none; + } + .editorial-section { padding-top: var(--space-12); padding-bottom: var(--space-12); @@ -530,8 +542,20 @@ body::before { padding-right: var(--space-4); } - .site-header { - height: 60px; + :root { + --header-height: 60px; + } + + .header-inner { + gap: var(--space-2); + } + + .header-actions { + gap: 6px; + } + + .lang-btn { + padding: 3px 6px; } .brand-logo-img { @@ -552,7 +576,8 @@ body::before { padding-bottom: var(--space-10); } - .btn { + main .btn, + .mobile-nav-drawer .btn { width: 100%; justify-content: center; } diff --git a/assets/css/reset.css b/assets/css/reset.css index 7ecca7f..942d8aa 100644 --- a/assets/css/reset.css +++ b/assets/css/reset.css @@ -14,8 +14,9 @@ html { line-height: var(--line-height-base); color: var(--color-ink-primary); background-color: var(--color-bg-base); - direction: rtl; - text-align: right; + /* Direction comes from (switched by i18n.js); a CSS `direction` + here would override the attribute and keep LTR languages laid out RTL. */ + text-align: start; scroll-behavior: smooth; -webkit-text-size-adjust: 100%; text-rendering: optimizeLegibility; diff --git a/assets/css/tokens.css b/assets/css/tokens.css index f5437a9..37d1fe2 100644 --- a/assets/css/tokens.css +++ b/assets/css/tokens.css @@ -49,7 +49,8 @@ /* Typography Families */ --font-serif: 'Frank Ruhl Libre', 'David Libre', 'David', 'Times New Roman', serif; --font-sans: 'Heebo', 'Assistant', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - --font-mono: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace; + /* JetBrains Mono has no Hebrew: Hebrew in "mono" labels falls through to Heebo, not Courier New. */ + --font-mono: 'JetBrains Mono', 'Heebo', 'Fira Code', ui-monospace, monospace; /* Fluid Typographic Scale — Responsive clamp */ --font-size-2xs: clamp(0.7rem, 0.65rem + 0.25vw, 0.75rem); diff --git a/assets/images/apple-touch-icon.png b/assets/images/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e656992df57db934c910f433862c94b63b91a142 GIT binary patch literal 27727 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

X%B#5NI2OpG#z6e;6qoa6mz_D0g+j;HrvUzHG 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�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 literal 0 HcmV?d00001 diff --git a/assets/images/icon-512.png b/assets/images/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..69c116fba5f94d5f37a57a22cb3791bf137d0da2 GIT binary patch literal 139185 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�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≻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 { root.setAttribute('data-theme', effectiveTheme); root.setAttribute('data-theme-setting', mode); - localStorage.setItem('tok_theme', mode); + try { localStorage.setItem('tok_theme', mode); } catch (e) { /* storage unavailable */ } if (themeToggle) { themeToggle.innerHTML = ICONS[mode] || ICONS.light; const labelMap = { - light: 'ערכת נושא: מצב יום (בהיר)', - dark: 'ערכת נושא: מצב לילה (כהה)', - system: 'ערכת נושא: לפי המערכת (אוטומטי)' + light: window.tokT ? window.tokT('theme_label_light') : 'ערכת נושא: מצב יום (בהיר)', + dark: window.tokT ? window.tokT('theme_label_dark') : 'ערכת נושא: מצב לילה (כהה)', + system: window.tokT ? window.tokT('theme_label_system') : 'ערכת נושא: לפי המערכת (אוטומטי)' }; themeToggle.setAttribute('aria-label', labelMap[mode] || 'ערכת נושא'); themeToggle.setAttribute('title', labelMap[mode] || 'ערכת נושא'); @@ -263,8 +263,12 @@ document.addEventListener('DOMContentLoaded', () => { } // Handle system color scheme change in real time + function savedTheme() { + try { return localStorage.getItem('tok_theme') || 'system'; } catch (e) { return 'system'; } + } + systemMedia.addEventListener('change', () => { - const saved = localStorage.getItem('tok_theme') || 'system'; + const saved = savedTheme(); if (saved === 'system') { applyThemeMode('system'); } @@ -306,7 +310,7 @@ document.addEventListener('DOMContentLoaded', () => { // Accessibility panel theme button (cycles: light -> dark -> system) if (a11yThemeToggle) { a11yThemeToggle.addEventListener('click', () => { - const current = localStorage.getItem('tok_theme') || 'system'; + const current = savedTheme(); const order = ['light', 'dark', 'system']; const next = order[(order.indexOf(current) + 1) % order.length]; applyThemeMode(next); @@ -314,7 +318,7 @@ document.addEventListener('DOMContentLoaded', () => { } // Initial theme initialization: default to 'system' (or 'light' for typesetters) - const initialTheme = localStorage.getItem('tok_theme') || 'system'; + const initialTheme = savedTheme(); applyThemeMode(initialTheme); // Initial application of accessibility state diff --git a/assets/js/before-after.js b/assets/js/before-after.js index 7da184e..78f92b5 100644 --- a/assets/js/before-after.js +++ b/assets/js/before-after.js @@ -19,28 +19,19 @@ document.addEventListener('DOMContentLoaded', () => { const isRtl = document.documentElement.dir !== 'ltr'; - if (smooth) { - afterLayer.style.transition = 'width 0.3s cubic-bezier(0.16, 1, 0.3, 1)'; - handle.style.transition = 'left 0.3s, right 0.3s'; - } else { - afterLayer.style.transition = 'none'; - handle.style.transition = 'none'; - } + const ease = '0.3s cubic-bezier(0.16, 1, 0.3, 1)'; + afterLayer.style.transition = smooth ? `clip-path ${ease}` : 'none'; + handle.style.transition = smooth ? `left ${ease}, right ${ease}` : 'none'; + // The "after" layer keeps its full-width layout; only the visible part changes, + // revealed from the reading-start edge (right in RTL, left in LTR). + const hidden = 100 - percentage; if (isRtl) { - afterLayer.style.width = `${percentage}%`; - afterLayer.style.right = '0'; - afterLayer.style.left = 'auto'; - afterLayer.style.borderLeft = '2px solid var(--color-brand-blue)'; - afterLayer.style.borderRight = 'none'; + afterLayer.style.clipPath = `inset(0 0 0 ${hidden}%)`; handle.style.right = `${percentage}%`; handle.style.left = 'auto'; } else { - afterLayer.style.width = `${percentage}%`; - afterLayer.style.left = '0'; - afterLayer.style.right = 'auto'; - afterLayer.style.borderRight = '2px solid var(--color-brand-blue)'; - afterLayer.style.borderLeft = 'none'; + afterLayer.style.clipPath = `inset(0 ${hidden}% 0 0)`; handle.style.left = `${percentage}%`; handle.style.right = 'auto'; } @@ -145,4 +136,8 @@ document.addEventListener('DOMContentLoaded', () => { // Initial position setSliderPosition(50); + + // Switching language flips the page direction: re-anchor the reveal to the new start edge. + new MutationObserver(() => setSliderPosition(currentPercentage)) + .observe(document.documentElement, { attributes: true, attributeFilter: ['dir'] }); }); diff --git a/assets/js/main.js b/assets/js/main.js index 4c06021..2d84a50 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -47,23 +47,23 @@ document.addEventListener('DOMContentLoaded', () => { const mobileLinks = document.querySelectorAll('.mobile-nav-link'); if (mobileToggle && mobileDrawer) { - mobileToggle.addEventListener('click', () => { - const isOpen = mobileDrawer.classList.toggle('open'); + const setDrawerOpen = (isOpen) => { + mobileDrawer.classList.toggle('open', isOpen); mobileToggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); - mobileToggle.setAttribute('aria-label', isOpen ? 'Close Menu' : 'Open Menu'); + mobileToggle.setAttribute('aria-label', window.tokT ? window.tokT(isOpen ? 'menu_close' : 'menu_open') : (isOpen ? 'Close Menu' : 'Open Menu')); + }; + + mobileToggle.addEventListener('click', () => { + setDrawerOpen(!mobileDrawer.classList.contains('open')); }); mobileLinks.forEach(link => { - link.addEventListener('click', () => { - mobileDrawer.classList.remove('open'); - mobileToggle.setAttribute('aria-expanded', 'false'); - }); + link.addEventListener('click', () => setDrawerOpen(false)); }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && mobileDrawer.classList.contains('open')) { - mobileDrawer.classList.remove('open'); - mobileToggle.setAttribute('aria-expanded', 'false'); + setDrawerOpen(false); mobileToggle.focus(); } }); @@ -73,81 +73,98 @@ document.addEventListener('DOMContentLoaded', () => { const floatingDownload = document.getElementById('floatingDownloadWidget'); const heroDownloadCard = document.getElementById('heroDownloadCard'); + // Shown only once the hero download card has scrolled away above the viewport: on + // phones the card starts below the fold, and anchor jumps skip past it entirely, so a + // position check on scroll is used rather than an IntersectionObserver. if (floatingDownload) { - if (heroDownloadCard && 'IntersectionObserver' in window) { - const dlObserver = new IntersectionObserver((entries) => { - entries.forEach(entry => { - // If hero download card is NOT intersecting (user scrolled past it), show floating button - floatingDownload.classList.toggle('active', !entry.isIntersecting); - }); - }, { threshold: 0.1 }); - dlObserver.observe(heroDownloadCard); - } else { - window.addEventListener('scroll', () => { - const scrolled = window.scrollY > 350; - floatingDownload.classList.toggle('active', scrolled); - }, { passive: true }); - } + let pending = false; + const update = () => { + pending = false; + const scrolledPast = heroDownloadCard + ? heroDownloadCard.getBoundingClientRect().bottom < 0 + : window.scrollY > 350; + floatingDownload.classList.toggle('active', scrolledPast); + }; + window.addEventListener('scroll', () => { + if (!pending) { + pending = true; + window.requestAnimationFrame(update); + } + }, { passive: true }); + update(); } - // 5. Dynamic GitHub Latest Release Assets Fetcher - async function fetchLatestReleaseAssets() { - try { - const res = await fetch('https://api.github.com/repos/TypesetOK/typesetok/releases/latest', { - headers: { 'Accept': 'application/vnd.github.v3+json' } - }); - if (!res.ok) return; - const data = await res.json(); - if (!data || !data.assets) return; + // 5. Release links: the static hrefs point at the releases page; when the + // GitHub API answers they are upgraded to direct asset downloads. + const RELEASES_API = 'https://api.github.com/repos/TypesetOK/typesetok/releases?per_page=15'; + const RELEASES_CACHE_KEY = 'tok_releases_v1'; + const RELEASES_CACHE_MS = 30 * 60 * 1000; + const GITHUB_DOWNLOAD_PREFIX = 'https://github.com/TypesetOK/typesetok/releases/download/'; - const tagName = data.tag_name || 'v0.6.0'; - document.querySelectorAll('.release-version-tag').forEach(el => { - el.textContent = tagName; - }); + async function loadReleases() { + try { + const cached = JSON.parse(sessionStorage.getItem(RELEASES_CACHE_KEY) || 'null'); + if (cached && Date.now() - cached.at < RELEASES_CACHE_MS) return cached.releases; + } catch (e) { /* storage unavailable */ } + const res = await fetch(RELEASES_API, { headers: { 'Accept': 'application/vnd.github+json' } }); + if (!res.ok) return null; + const data = await res.json(); + if (!Array.isArray(data)) return null; + const releases = data + .filter(r => r && !r.draft && !r.prerelease && Array.isArray(r.assets)) + .map(r => ({ + tag: String(r.tag_name || ''), + assets: r.assets.map(a => ({ name: String(a.name || '').toLowerCase(), url: String(a.browser_download_url || '') })) + })); + try { + sessionStorage.setItem(RELEASES_CACHE_KEY, JSON.stringify({ at: Date.now(), releases })); + } catch (e) { /* storage unavailable */ } + return releases; + } - // Find Windows desktop portable zip - const portableAsset = data.assets.find(a => - a.name.toLowerCase().includes('windows') && - a.name.toLowerCase().includes('desktop') && - a.name.endsWith('.zip') - ); - if (portableAsset && portableAsset.browser_download_url) { - document.querySelectorAll('.download-link-portable').forEach(a => { - a.href = portableAsset.browser_download_url; - }); - } + // Only trust URLs that point at this project's own release downloads. + function findAsset(releases, test) { + for (const r of releases) { + const asset = r.assets.find(a => test(a.name) && a.url.startsWith(GITHUB_DOWNLOAD_PREFIX)); + if (asset) return asset.url; + } + return null; + } - // Find Windows CLI zip - const cliAsset = data.assets.find(a => - a.name.toLowerCase().includes('cli') && - a.name.toLowerCase().includes('windows') && - a.name.endsWith('.zip') - ); - if (cliAsset && cliAsset.browser_download_url) { - document.querySelectorAll('.download-link-cli').forEach(a => { - a.href = cliAsset.browser_download_url; - }); - } + function setHref(selector, url) { + if (!url) return; + document.querySelectorAll(selector).forEach(a => { a.href = url; }); + } - // Find Installer if available - const installerAsset = data.assets.find(a => - a.name.toLowerCase().endsWith('.exe') || - a.name.toLowerCase().endsWith('.msi') - ); - if (installerAsset && installerAsset.browser_download_url) { - document.querySelectorAll('.download-link-installer').forEach(a => { - a.href = installerAsset.browser_download_url; - }); - } + async function applyLatestRelease() { + let releases; + try { + releases = await loadReleases(); } catch (e) { - // Offline or rate-limited; fallback static links already in HTML + return; // offline or rate-limited: the static links already work } + if (!releases || !releases.length) return; + + const latest = releases[0]; + if (/^v?\d+(\.\d+)*$/.test(latest.tag)) { + document.querySelectorAll('.release-version-tag').forEach(el => { el.textContent = latest.tag; }); + document.querySelectorAll('.floating-widget-title').forEach(el => { el.textContent = `TypesetOK ${latest.tag}`; }); + } + + const inLatest = [latest]; + setHref('.download-link-portable', findAsset(inLatest, n => n.includes('windows') && n.includes('desktop') && n.endsWith('.zip'))); + setHref('.download-link-installer', findAsset(inLatest, n => n.endsWith('setup.exe') || n.endsWith('.msi'))); + setHref('.download-link-cli', findAsset(inLatest, n => n.includes('cli') && n.includes('windows') && n.endsWith('.zip'))); + // Linux/macOS CLIs are not built for every release: use the newest one that has them. + setHref('.download-link-cli-linux', findAsset(releases, n => n.includes('cli') && n.includes('linux'))); + setHref('.download-link-cli-macos', findAsset(releases, n => n.includes('cli') && n.includes('macos'))); } - fetchLatestReleaseAssets(); + applyLatestRelease(); - // 5. Scroll Reveal Observer + // 5b. Scroll Reveal Observer (CSS hides .reveal-on-scroll only under .js-reveal) const reveals = document.querySelectorAll('.reveal-on-scroll'); + document.documentElement.classList.add('js-reveal'); if (reveals.length && 'IntersectionObserver' in window) { const revealObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { @@ -163,64 +180,17 @@ document.addEventListener('DOMContentLoaded', () => { reveals.forEach(el => el.classList.add('revealed')); } - // 6. Pipeline Progressive Disclosure Steps - const pipelineCards = document.querySelectorAll('.pipeline-step-card'); - const pipeTitle = document.getElementById('pipeDetailTitle'); - const pipeDesc = document.getElementById('pipeDetailDesc'); - const pipeSpecs = document.getElementById('pipeDetailSpecs'); - - const pipelineData = { - 1: { - title: 'שלב 1: ייבוא וקליטת מסמך גולמי (Document Ingestion)', - desc: 'קליטה סמנטית של קובצי טקסט נקי, Markdown, DOCX או ODF. המערכת מחלצת את התוכן בלבד ומנתקת אותו מעיצובי מורשת לקויים.', - specs: 'פורמטים נתמכים: UTF-8 Plain, Markdown AST, ODF/DOCX Importer | אכיפת יוניקוד מלאה' - }, - 2: { - title: 'שלב 2: יצירת מודל מסמך סמנטי (TDM AST & SI 6100)', - desc: 'בניית עץ בלתי-מוטבילי ב-Rust. כל פסקה, מקטע ועוגן מקבלים מזהה ייחודי ULID בן 128 סיביות ואינדוקס שברירי ב-$O(1)$. נרמול יוניקוד קפדני לפי תקן ישראלי ת"י 6100 לסדר דטרמיניסטי של אותיות, ניקוד וטעמים.', - specs: 'Crate: tok-core | ULID 128-bit | FractionalIndex O(1) | SI 6100 Hebrew Unicode Normalizer' - }, - 3: { - title: 'שלב 3: מנוע עימוד, שבירת שורות ופותר רב-תזרימי (Layout & Knuth-Plass)', - desc: 'מנוע Knuth-Plass ממזער את הפגמים (Demerits) לאורך הפסקה כולה למניעת שורות רפויות. שילוב יישור עברי תלת-שלבי (רווחי מילים, אותיות התפשטות אהלתר"ם, ומיקרו-טרקינג). פותר אילוצים למקראות גדולות וש"ס מסנכרן בין טקסט מרכזי למפרשים.', - specs: 'Crate: tok-typeset | Knuth-Plass Global Optimum | 3-Tier Justification | Multi-Flow Solver' - }, - 4: { - title: 'שלב 4: רינדור וירטואלי וקדם-דפוס נייטיב (Pre-Press & Virtualized Render)', - desc: 'צינור דואלי: מעטפת Electron מציגה 3 עמודים פעילים בלבד ב-120 FPS בעזרת שכבת Canvas שקופה וסמן וירטואלי (<16ms). במקביל, ליבת Rust מייצרת קובץ PDF/X-1a מוכן לדפוס.', - specs: 'Crates: tok-pdf, tok-viewer | ISO 15930-1 | 100% K DeviceCMYK | Fogra 39 BleedBox 3mm' - }, - 5: { - title: 'שלב 5: פלט מושלם לדפוס ודיגיטל (Final Print & Archival Package)', - desc: 'הפקת קובץ PDF/X עם צלבי רישום וסימני חיתוך וקטוריים, טבלאות /ToUnicode לטקסט מנוקד שניתן להעתקה וחיפוש, ושמירה בארכיב .tok אטומי עמיד בפני נפילות מתח.', - specs: 'Package: .tok (Atomic ZIP Safe-Save) | ACID WAL (redb) | 100% Deterministic Output' - } - }; - - if (pipelineCards.length && pipeTitle && pipeDesc && pipeSpecs) { - pipelineCards.forEach(card => { - card.addEventListener('click', () => { - pipelineCards.forEach(c => c.classList.remove('active')); - card.classList.add('active'); - - const step = card.dataset.step; - const data = pipelineData[step]; - if (data) { - pipeTitle.textContent = data.title; - pipeDesc.textContent = data.desc; - pipeSpecs.textContent = data.specs; - } - }); - }); - } - - // 7. Modals Management (Architecture & Source Guide) + // 6. Modals Management (Architecture & Source Guide) const modalBackdrop = document.getElementById('modalBackdrop'); const sourceModal = document.getElementById('sourceModal'); const archModal = document.getElementById('archModal'); + let modalOpener = null; + let activeModal = null; function openModal(modal) { if (!modalBackdrop || !modal) return; + modalOpener = document.activeElement; + activeModal = modal; modalBackdrop.classList.add('open'); modal.classList.add('open'); modal.setAttribute('aria-hidden', 'false'); @@ -242,8 +212,28 @@ document.addEventListener('DOMContentLoaded', () => { archModal.setAttribute('aria-hidden', 'true'); } document.body.style.overflow = ''; + activeModal = null; + if (modalOpener && typeof modalOpener.focus === 'function') modalOpener.focus(); + modalOpener = null; } + // Keep Tab inside the open dialog (aria-modal="true"). + document.addEventListener('keydown', (e) => { + if (e.key !== 'Tab' || !activeModal) return; + const focusable = [...activeModal.querySelectorAll('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])')] + .filter(el => el.offsetParent !== null); + if (!focusable.length) return; + const first = focusable[0]; + const last = focusable[focusable.length - 1]; + if (e.shiftKey && document.activeElement === first) { + e.preventDefault(); + last.focus(); + } else if (!e.shiftKey && document.activeElement === last) { + e.preventDefault(); + first.focus(); + } + }); + document.querySelectorAll('[data-open-modal="source"]').forEach(btn => { btn.addEventListener('click', (e) => { e.preventDefault(); diff --git a/assets/js/theme-init.js b/assets/js/theme-init.js new file mode 100644 index 0000000..0e89aec --- /dev/null +++ b/assets/js/theme-init.js @@ -0,0 +1,11 @@ +// Loaded blocking in so the saved/system theme applies before first paint +// (no light flash for dark-mode users). a11y.js takes over after DOMContentLoaded. +(function () { + var mode = 'system'; + try { + mode = localStorage.getItem('tok_theme') || 'system'; + } catch (e) { /* storage unavailable */ } + var dark = mode === 'dark' || + (mode === 'system' && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); + document.documentElement.setAttribute('data-theme', dark ? 'dark' : 'light'); +})(); From 4da2947740278040d96d54ebb76101e3bfdb8a4a Mon Sep 17 00:00:00 2001 From: tsoolgee <291792265+tsoolgee@users.noreply.github.com> Date: Tue, 6 Oct 2026 23:46:18 +0300 Subject: [PATCH 2/3] feat(i18n,content): complete EN/ES/FR translations, ?lang URLs, accurate facts Languages - English/Spanish/French showed a half-Hebrew page (161 of 257 visible text nodes were untranslated) and stayed laid out right-to-left because reset.css forced `direction: rtl` on , overriding the dir attribute. Every UI string is now translated (257 keys per language; Hebrew demo content stays Hebrew on purpose), attributes via data-i18n-attr, and /description follow the language. - ?lang=en|es|fr is honoured (the hreflang links already promised these URLs); switching updates the URL, canonical and og:locale; storage access is guarded. Content - Download links no longer point at v0.6.0 assets: the static fallback is releases/latest (always valid) and JS upgrades it to the current assets. - Test figures were stale (58/58): now 174/174 Rust tests (main @ 1837e84, clippy clean) and the 1,000-page stress test reports 1,001 pages / 49,001 lines in 3.1 s. - "Seven pillars" heading over six cards; literal "$O(1)$"; stale "113 MB" size; an English quote wrapped in Hebrew gershayim so it rendered RTL. - Navigation order now matches the page order. SEO / head - Absolute og:image (relative URLs are not fetched by crawlers) with real dimensions; twitter:* as name= meta; shorter Hebrew <title>. - Removed FAQPage structured data that is not visible on the page (against Google's guidelines), a one-item breadcrumb, a stale softwareVersion and a meta google-site-verification that held the HTML-file token (file verification remains). - Hebrew hreflang points at the canonical root; CSP and referrer policy as meta tags (GitHub Pages cannot set response headers). - 404.html: <base href="/website/"> so nested missing URLs still load styles, noindex, square logo, trimmed font request. --- 404.html | 10 +- README.md | 6 +- assets/js/i18n.js | 1321 +++++++++++++++++++++++++++++++++++---------- index.html | 564 +++++++++---------- 4 files changed, 1316 insertions(+), 585 deletions(-) diff --git a/404.html b/404.html index 8c8ecc1..1b91529 100644 --- a/404.html +++ b/404.html @@ -3,11 +3,15 @@ <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data:; connect-src 'self' https://api.github.com; manifest-src 'self'; base-uri 'self'; form-action 'self'; object-src 'none'; upgrade-insecure-requests"> + <meta name="referrer" content="strict-origin-when-cross-origin"> + <base href="/website/"> + <meta name="robots" content="noindex"> <title>404 — עמוד לא נמצא | TypesetOK (TOK) - + @@ -17,7 +21,7 @@

- TypesetOK Logo + TypesetOK diff --git a/README.md b/README.md index 80fda40..dd9911b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ ### 🌟 רכיבים מרכזיים באתר 1. **מרכז הורדות ראשי וכפתור צף (Download Hub):** - * הורדה ישירה של הגרסה העדכנית ביותר (v0.6.0) מ-GitHub Releases: גרסה ניידת ללא התקנה (Portable ZIP), מתקין שולחני וכלי שורת פקודה (CLI). + * הורדה ישירה של הגרסה העדכנית ביותר מ-GitHub Releases: גרסה ניידת ללא התקנה (Portable ZIP), מתקין שולחני וכלי שורת פקודה (CLI). * כפתור הורדה חכם ההופך לרכיב צף (Sticky Widget) בצד המסך בעת גלילה מעבר לחלק העליון. 2. **השוואה מעשית מול וורד ואינדיזיין (Head-to-Head Matrix):** @@ -45,11 +45,11 @@ 4. **סליידר השוואה לפני/אחרי (Before / After Comparison):** * השוואה ויזואלית חיה בין פלט מעבד תמלילים פשוט לבין בלוק העימוד המהודק והמאוזן של TypesetOK. -5. **שבעת עמודי התווך (Bento Grid):** +5. **ששת עמודי התווך (Bento Grid):** * ליבת Rust עצמאית ווירטואליזציה (3 עמודים פעילים), ת״י 6100, יישור תלת-שלבי (Knuth-Plass), פותר אילוצים רב-תזרימי, קדם-דפוס ISO 15930, ומסד נתונים פנימי עמיד קריסות (ACID WAL). 6. **שקיפות הנדסית ואימות נתונים:** - * תוצאות בדיקות אמת במאגר הקוד של הליבה (58/58 בדיקות עוברות, 0 אזהרות Clippy, דטרמיניזם ביט-אחר-ביט, עמידה במבחן עומס של 1,000 עמודים). + * תוצאות בדיקות אמת במאגר הקוד של הליבה (174/174 בדיקות Rust עוברות, 0 אזהרות Clippy, דטרמיניזם ביט-אחר-ביט, עמידה במבחן עומס של 1,000 עמודים). --- diff --git a/assets/js/i18n.js b/assets/js/i18n.js index 9877f35..eb48942 100644 --- a/assets/js/i18n.js +++ b/assets/js/i18n.js @@ -1,96 +1,75 @@ /** * TypesetOK (TOK) — Multilingual Translation Engine * Supports: Hebrew (he), US English (en), Spanish (es), French (fr). - * Natural, professional, typesetter-oriented terminology without emojis. + * + * Hebrew is authored directly in index.html and is the no-JS default; the + * engine snapshots it and uses it for 'he' and as the fallback for missing keys. + * The 'he' table below therefore only holds strings that do not exist as + * Hebrew in the markup (runtime labels and English-only aria-labels). + * + * Markup usage: + * data-i18n="key" -> textContent + * data-i18n-html="key" -> innerHTML (constant strings with minimal markup only) + * data-i18n-attr="aria-label:key1;title:key2" + * + * Hebrew sample text being demonstrated (comparison sample, Talmud specimen, + * Unicode code-point demo, gematria examples) intentionally stays Hebrew. */ const TOK_TRANSLATIONS = { he: { - // Navigation - nav_home: "ראשי", - nav_comparison: "השוואה למעמדים", - nav_matrix: "השוואת וורד ואינדיזיין", - nav_quotes: "קולות מהשטח", - nav_features: "יכולות", - nav_story: "ארכיטקטורה", - nav_engineering: "בנצ'מרק", - btn_download: "הורדה", - btn_github: "מאגר GitHub", - btn_architecture: "מפרט טכני", - btn_source_guide: "מדריך פיתוח", - - // Hero - hero_badge: "תוכנת עימוד שולחנית מקצועית בקוד פתוח • ללא עלות וללא נעילה", - hero_title_1: "עימוד ספרים אמיתי.", - hero_title_2: "חופשי, פתוח ומדויק לדפוס.", - hero_desc: "TypesetOK נבנתה במיוחד עבור מעמדים, מעצבי ספרים ומוציאים לאור. טיפול טבעי באות העברית, ניקוד וטעמים מדויקים ללא שיבושים, עמודי ש״ס ומקראות גדולות עם ריבוי מפרשים, ועמידה מלאה בתקני דפוס.", - hero_cta_download: "הורד את התוכנה", - hero_cta_github: "מאגר הקוד ב-GitHub", - hero_cta_arch: "מפרט ארכיטקטוני מלא", - metric_tests: "58 / 58", - metric_tests_label: "בדיקות ליבה ב-Rust עוברות", - metric_clippy: "0 אזהרות", - metric_clippy_label: "קוד נקי בתקן Clippy", - metric_standards: "ת״י 6100 & ISO 15930", - metric_standards_label: "עמידה מלאה בתקני דפוס ויוניקוד", - - // Download Center - dl_card_badge: "מהדורה רשמית ל-Windows", - dl_card_os: "Windows 10 / 11 (x64)", - dl_btn_portable_title: "הורדה ישירה (ללא התקנה)", - dl_btn_portable_sub: "קובץ ZIP נייד — לחלץ ולהפעיל מיד", - dl_btn_installer_title: "הורדה עם מתקין (Windows Setup)", - dl_btn_installer_sub: "התקנה מסודרת לשולחן העבודה", - dl_cli_label: "אפשרויות נוספות:", - dl_cli_windows: "CLI ל-Windows", - dl_cli_linux: "Linux CLI", - dl_cli_macos: "macOS CLI", - dl_floating_btn: "הורדת TypesetOK", + menu_open: "פתיחת תפריט הניווט", + menu_close: "סגירת תפריט הניווט", + theme_menu: "בחירת ערכת נושא", + theme_label_light: "ערכת נושא: מצב יום (בהיר)", + theme_label_dark: "ערכת נושא: מצב לילה (כהה)", + theme_label_system: "ערכת נושא: לפי המערכת (אוטומטי)", + aria_reading_progress: "התקדמות הקריאה", + aria_home: "TypesetOK – דף הבית", + aria_main_nav: "ניווט ראשי", + aria_lang_selector: "בחירת שפה", + aria_github_repo: "מאגר הקוד ב-GitHub", + aria_mobile_nav: "ניווט לנייד", + aria_open_github: "פתיחת TypesetOK ב-GitHub", + aria_cmyk_bars: "פסי צבע CMYK", + aria_comp_slider: "סליידר השוואה", + modal_close: "סגירה" + }, - // Storytelling - story_pretitle: "פרק א׳: עמודי התווך של הארכיטקטורה", - story_title: "שלושה עקרונות הנדסיים מנחים", - story_subtitle: "כיצד תוכנן מנוע העימוד של TypesetOK לפתור את האתגרים ההיסטוריים של עולם הדפוס העברי.", - scene1_num: "עקרון 01", - scene1_title: "נרמול קפדני לפי תקן ישראלי ת\"י 6100", - scene1_desc: "מעבדי תמלילים ומערכות עימוד מערביות משבשות לעיתים קרובות את סדר האותיות והניקוד ביוניקוד. TypesetOK אוכפת סדר יוניקוד דטרמיניסטי מלא ומפעילה מנוע גימטריה דטרמיניסטי למניעת צירופי טאבו ושמות קודש (15 ← ט״ו, 16 ← ט״ז, 270 ← ע״ר).", - scene2_num: "עקרון 02", - scene2_title: "פותר אילוצים רב-תזרימי (Talmud Solver)", - scene2_desc: "עמודי ש\"ס ומקראות גדולות הם פסגת הקושי הטיפוגרפי העולמי: גמרא במרכז, רש\"י בצד אחד ותוספות בצד השני, כאשר כל שינוי בפסקה אחת משפיע על גלישת הטקסט של שני הפירושים האחרים. מפרט המערכת מגדיר פותר אילוצים מתמטי ייעודי לסנכרון רציף.", - scene3_num: "עקרון 03", - scene3_title: "קדם-דפוס נייטיב: ISO 15930 (PDF/X-1a)", - scene3_desc: "ללא הסתמכות על מנועי הדפסת דפדפן המוגבלים ל-sRGB. מנוע ה-Rust מתוכנן לייצר ישירות קובצי דפוס מובהקים: שחור 100% K (DeviceCMYK), צלבי רישום וסימני חיתוך וקטוריים, תיבות BleedBox ו-TrimBox של 3 מ\"מ, ופרופילי Fogra 39.", + en: { + // Document + meta_title: "TypesetOK — Professional Open-Source Book Typesetting Software for Hebrew", + meta_description: "A modern open-source desktop publishing (DTP) system for advanced Hebrew typography, sacred texts (Talmud, Mikraot Gedolot, responsa) and very large documents. Rust core, Knuth-Plass line breaking, native PDF/X-1a output.", + skip_link: "Skip to main content", - // Comparison - comp_pretitle: "פרק ב׳: השוואה מעשית למעמדים", - comp_title: "שבירת שורות בוורד מול דיוק של TypesetOK", - comp_subtitle: "הזיזו את הסליידר או לחצו על הלחצנים כדי להשוות בין אופן פעולת מעבד תמלילים רגיל לבין בלוק העימוד המאוזן של TypesetOK.", - comp_preset_before: "וורד (לפני)", - comp_preset_half: "חצי-חצי (50%)", - comp_preset_after: "TypesetOK (אחרי)", - comp_before_label: "מעבד תמלילים מסורתי (וורד)", - comp_before_note: "בוורד: שורות מתוחות, חללים לבנים בולטים, היעדר אותיות התפשטות ואי-אחידות בצפיפות העמוד.", - comp_after_label: "מפרט TypesetOK (Knuth-Plass + אהלתר״ם)", - comp_after_note: "ב-TypesetOK: בלוק טיפוגרפי מאוזן, חלוקת שורות מותאמת לפסקה כולה, אותיות מתרחבות אהלתר״ם וסנכרון מלא לקווי בסיס.", + // Accessible names + aria_reading_progress: "Reading progress", + aria_home: "TypesetOK home", + aria_main_nav: "Main navigation", + aria_lang_selector: "Language", + aria_github_repo: "GitHub repository", + aria_mobile_nav: "Mobile navigation", + aria_open_github: "Open TypesetOK on GitHub", + aria_download_hub: "TypesetOK download center", + aria_dl_portable: "Download TypesetOK directly, no installation required", + aria_dl_installer: "Download the Windows Setup installer", + aria_cmyk_bars: "CMYK color bars", + aria_comparison: "Typesetting comparison", + aria_comp_slider: "Comparison slider", + modal_close: "Close", + menu_open: "Open navigation menu", + menu_close: "Close navigation menu", - // A11y Panel - a11y_panel_title: "תפריט נגישות מורחב", - a11y_font_inc: "הגדל גופן (+)", - a11y_font_dec: "הקטן גופן (-)", - a11y_contrast: "ניגודיות גבוהה", - a11y_theme: "ערכת נושא (יום / לילה / מערכת)", - a11y_readable_font: "גופן קריא ופשוט", - a11y_links: "הדגשת קישורים", - a11y_headings: "הדגשת כותרות", - a11y_big_cursor: "סמן עכבר מוגדל", - a11y_motion: "עצירת תנועה", - a11y_spacing: "ריווח שורות רחב", - a11y_letters: "ריווח אותיות", - a11y_monochrome: "גווני אפור", - a11y_reset: "איפוס כל הגדרות הנגישות" - }, + // Theme + theme_label: "Theme: light / dark / system", + theme_menu: "Choose theme", + theme_light: "Light mode", + theme_dark: "Dark mode", + theme_system: "Match system (auto)", + theme_label_light: "Theme: light mode", + theme_label_dark: "Theme: dark mode", + theme_label_system: "Theme: match system (auto)", - en: { // Navigation nav_home: "Home", nav_comparison: "Comparison", @@ -100,300 +79,1092 @@ const TOK_TRANSLATIONS = { nav_story: "Architecture", nav_engineering: "Benchmarks", btn_download: "Download", - btn_github: "GitHub Repo", + btn_github: "GitHub", btn_architecture: "Tech Spec", btn_source_guide: "Dev Guide", + mnav_download: "Download for Windows", // Hero - hero_badge: "Open-Source Professional Desktop Typesetting • Free & Unlocked", - hero_title_1: "Real Book Typesetting.", - hero_title_2: "Free, Open, and Press-Ready.", - hero_desc: "TypesetOK is purpose-built for typesetters, book designers, and publishers. Native Hebrew typography, flawless vocalization and cantillation, multi-commentary Talmud layouts, and complete print-standard compliance.", + hero_badge: "Professional open-source desktop typesetting • Free, no lock-in", + hero_title_1: "Real book typesetting.", + hero_title_2: "Free, open and press-ready.", + hero_desc: "TypesetOK is built specifically for typesetters, book designers and publishers: native handling of Hebrew script, accurate niqqud (vowel points) and te'amim (cantillation marks) without corruption, Talmud and Mikraot Gedolot pages with multiple commentaries, and full compliance with print standards.", + hero_point_1: "Smooth work on huge documents of hundreds or thousands of pages, with no display freezes", + hero_point_2: "Balanced justification with extending letters to prevent “rivers” of white space", + hero_point_3: "Press-ready output: PDF/X-1a with pure 100% K black, crop marks and 3 mm bleed", hero_cta_download: "Download Software", - hero_cta_github: "View on GitHub", - hero_cta_arch: "Architecture Spec", - metric_tests: "58 / 58", - metric_tests_label: "Core Rust unit tests passing", - metric_clippy: "0 Warnings", - metric_clippy_label: "Strict Clippy compliance", + hero_cta_github: "Source code on GitHub", + hero_cta_arch: "Full architecture spec", + metric_tests: "174 / 174", + metric_tests_label: "Rust core tests passing", + metric_clippy: "0 warnings", + metric_clippy_label: "Clean code under Clippy", metric_standards: "SI 6100 & ISO 15930", - metric_standards_label: "Full Unicode & Pre-press standards", + metric_standards_label: "Full print and Unicode standards compliance", // Download Center - dl_card_badge: "Official Windows Release", - dl_card_os: "Windows 10 / 11 (x64)", - dl_btn_portable_title: "Direct Download (Portable)", - dl_btn_portable_sub: "Standalone ZIP — Extract and run immediately", - dl_btn_installer_title: "Download Installer (Windows Setup)", + dl_card_badge: "Official release", + dl_card_os: "Windows 10 / 11 (64-bit)", + dl_btn_portable_title: "Direct download (no installation)", + dl_btn_portable_sub: "Portable ZIP — extract and run", + dl_btn_installer_title: "Download with installer (Windows Setup)", dl_btn_installer_sub: "Standard desktop installation", - dl_cli_label: "Additional options:", + dl_cli_label: "More options:", dl_cli_windows: "Windows CLI", dl_cli_linux: "Linux CLI", dl_cli_macos: "macOS CLI", + dl_source_link: "Source code on GitHub ↗", + dl_note_oss: "✓ 100% open source", + dl_note_free: "✓ Free, no sign-up", + dl_note_official: "✓ Official file from GitHub Releases", dl_floating_btn: "Download TypesetOK", // Storytelling - story_pretitle: "Chapter I: Architectural Pillars", - story_title: "Three Guiding Engineering Principles", - story_subtitle: "How the TypesetOK engine solves historic bottlenecks in Hebrew publishing.", - scene1_num: "Pillar 01", - scene1_title: "Strict Normalization via Israeli Standard SI 6100", - scene1_desc: "General word processors and legacy Western DTP software often mangle Unicode Hebrew vocalization and cantillation. TypesetOK enforces deterministic canonical Unicode ordering and taboo gematria substitution (15 → ט״ו, 16 → ט״ז).", - scene2_num: "Pillar 02", - scene2_title: "Multi-Flow Constraint Solver (Talmud Layout)", - scene2_desc: "Talmud and rabbinic editions are the absolute pinnacle of typesetting complexity: central text flanked by commentators whose heights dynamically dictate layout. TypesetOK specifies a dedicated mathematical constraint solver for seamless cross-page sync.", - scene3_num: "Pillar 03", - scene3_title: "Native Pre-Press Engine: ISO 15930 (PDF/X-1a)", - scene3_desc: "No relying on browser print engines crippled by sRGB. The Rust engine directly targets pure DeviceCMYK 100% K black, vector crop marks, 3mm BleedBox, Fogra 39 profiles, and PostScript /ToUnicode mapping for pristine text search.", + story_pretitle: "Chapter 1: Architectural pillars", + story_title: "Three guiding engineering principles", + story_subtitle: "How the TypesetOK layout engine was designed to solve the long-standing challenges of Hebrew printing.", + scene1_num: "Principle 01", + scene1_title: "Strict normalization per Israeli Standard SI 6100", + scene1_desc: "Word processors and Western layout systems frequently scramble the Unicode order of Hebrew letters and vowel points. TypesetOK enforces a fully deterministic Unicode order and runs a deterministic gematria engine that avoids taboo combinations and divine names (15 → ט״ו, 16 → ט״ז, 270 → ע״ר).", + story1_point_1: "Canonical Unicode order: letter → shin/sin dot → dagesh → niqqud → meteg → te'amim", + story1_point_2: "O(1) fractional indexing with no need to renumber the document", + scene2_num: "Principle 02", + scene2_title: "Multi-flow constraint solver (Talmud Solver)", + scene2_desc: "Talmud and Mikraot Gedolot pages are the summit of typographic difficulty: the Gemara in the center, Rashi on one side and Tosafot on the other, where every change in one paragraph affects how the other two commentaries flow. The system specification defines a dedicated mathematical constraint solver that keeps them continuously in sync.", + story2_point_1: "Synchronization of parallel text flows on the same page and across spreads", + story2_point_2: "Total-fit Knuth-Plass line breaking to prevent widows, orphans and loose lines", + scene3_num: "Principle 03", + scene3_title: "Native pre-press: ISO 15930 (PDF/X-1a)", + scene3_desc: "No reliance on browser print engines limited to sRGB. The Rust engine is designed to produce true print files directly: 100% K black (DeviceCMYK), vector registration and crop marks, 3 mm BleedBox and TrimBox, and Fogra 39 profiles.", + story3_point_1: "Strict /ToUnicode tables: vocalized text that can be copied and searched in the PDF", + story3_point_2: "Full spot color (Spot/Pantone) support straight from the settings file", + story3_proof_text: "Print-safe document — pure CMYK plate separation", // Comparison - comp_pretitle: "Chapter II: Practical Typesetting Comparison", - comp_title: "Word Processing vs TypesetOK Precision", - comp_subtitle: "Drag the slider or click presets to see the difference between primitive word stretching and TypesetOK's balanced paragraph line breaking with authentic Hebrew expanding letters.", - comp_preset_before: "Word (Before)", + comp_pretitle: "Chapter 2: A hands-on comparison for typesetters", + comp_title: "Word's line breaking vs. TypesetOK precision", + comp_subtitle: "Drag the slider or use the buttons to compare how an ordinary word processor sets text with TypesetOK's balanced text block.", + comp_preset_before: "Word (before)", comp_preset_half: "Split (50%)", - comp_preset_after: "TypesetOK (After)", - comp_before_label: "Standard Word Processor (MS Word)", - comp_before_note: "In Word: loose stretched lines, gaping white rivers, missing extending letters, and uneven page density.", - comp_after_label: "TypesetOK Specification (Knuth-Plass + Expanding Glyphs)", - comp_after_note: "In TypesetOK: harmonious typographic block, global paragraph optimization, authentic expanding letters, and strict baseline synchronization.", + comp_preset_after: "TypesetOK (after)", + comp_before_label: "Traditional word processor (Word)", + comp_before_note: "In Word: stretched lines, conspicuous white gaps, no extending letters and uneven page color.", + comp_after_label: "TypesetOK spec (Knuth-Plass + extending letters)", + comp_after_note: "In TypesetOK: a balanced typographic block, line breaks optimized across the whole paragraph, extending letters and full baseline-grid alignment.", + + // Matrix + matrix_pretitle: "Chapter 3: A realistic, practical comparison", + matrix_title: "Word, InDesign and TypesetOK — head to head", + matrix_subtitle: "A factual, precise comparison between the tools on the market and the dedicated answer TypesetOK was designed to provide for the typesetting world.", + matrix_aria: "Practical comparison of typesetting tools", + matrix_th_challenge: "Key typesetting challenge", + matrix_th_word: "Microsoft Word", + matrix_th_indesign: "Adobe InDesign", + m1_title: "Huge documents and books (500+ pages)", + m1_sub: "Stability, responsiveness and no cascading reflow", + m1_word_badge: "Critical difficulty", + m1_word: "Changing one sentence on page 10 reflows the entire book; heavy documents become too slow for day-to-day work.", + m1_id_badge: "Partial solution (Book)", + m1_id: "Supports splitting into files (Book), but files of hundreds of pages become heavy and slow, and the interface stutters during long sessions.", + m1_tok_badge: "Excellent, built in", + m1_tok: "Virtualized Rust core with a minimal memory footprint. Only 3 active pages are rendered — smooth work on 1,000+ page documents.", + m2_title: "Niqqud, te'amim and Hebrew accuracy", + m2_sub: "Unicode order, mark positioning and standard geresh/gershayim", + m2_word_badge: "Frequent corruption", + m2_word: "Vowel points jump outside the letters, geresh and gershayim flip into Latin quotation marks, and Unicode handling is inconsistent.", + m2_id_badge: "Requires the world-ready engine", + m2_id: "You must enable the World-Ready Composer; with many Hebrew fonts the vowel points can still be misplaced without tedious manual adjustments.", + m2_tok_badge: "Full SI 6100 compliance", + m2_tok: "Built-in canonical normalization per the Israeli standard. Deterministic Unicode order: letter, dagesh, niqqud and te'amim exactly in place.", + m3_title: "Sacred texts and parallel texts", + m3_sub: "Talmud pages, Mikraot Gedolot and parallel commentaries", + m3_word_badge: "Impossible", + m3_word: "No support for multiple synchronized parallel columns on one page. You cannot set the classic Talmud page layout (tzurat hadaf) or a Chumash with commentaries.", + m3_id_badge: "Requires expensive plug-ins", + m3_id: "No built-in support; requires complex third-party plug-ins costing thousands, which tend to break with Adobe version updates.", + m3_tok_badge: "Built-in multi-flow engine", + m3_tok: "A dedicated mathematical constraint solver (Talmud Solver) that keeps the Gemara and the surrounding commentaries continuously in sync, with no accidental page breaks.", + m4_title: "Justification and spacing", + m4_sub: "Balancing the text block and preventing “rivers” of white space", + m4_word_badge: "Word-space stretching only", + m4_word: "Crude stretching of word spaces creates gaping white “rivers” that hurt both readability and the look of the book.", + m4_id_badge: "Local/weighted line breaking", + m4_id: "A high-quality engine, but limited with Hebrew extending letters; horizontal font scaling can distort the letterforms.", + m4_tok_badge: "Knuth-Plass + extending letters", + m4_tok: "Global optimization across the whole paragraph combined with authentic extending letters, keeping word spacing natural.", + m5_title: "Professional pre-press export", + m5_sub: "PDF/X, 100% K black, bleed and crop marks", + m5_word_badge: "Office output (RGB)", + m5_word: "Plain PDF export with no color separation, no true print black, and no crop marks or bleed.", + m5_id_badge: "Full print support", + m5_id: "Highly advanced print export, but it requires complex manual export settings and deep technical knowledge of color management.", + m5_tok_badge: "One-click native PDF/X-1a", + m5_tok: "Direct ISO 15930 output from the Rust core: 100% K black (DeviceCMYK), crop marks, 3 mm bleed and /ToUnicode tables.", + + // Quotes + quotes_pretitle: "Chapter 4: Voices from the field", + quotes_title: "What are typesetters saying in professional forums?", + quotes_subtitle: "Real challenges and everyday frustrations that typesetters and designers face with Word and InDesign — and how TypesetOK was built to solve them.", + quote_solution_label: "The TypesetOK solution:", + q1_source: "Typesetters' forum (Prog)", + q1_tag: "Pain point: layout collapse in Word", + q1_text: "“The client only asked to add one sentence on page 40... and the entire layout of a 350-page book in Word simply fell apart. The footnotes ran off, the headings jumped to the next page, and I had to go through it page by page as if I were starting from scratch.”", + q1_solution: "An independent page model with section locking (Page Pinning). A local change in a paragraph is resolved locally and does not bring down the rest of the book.", + q2_source: "Torah forum (typesetting sacred texts)", + q2_tag: "Pain point: multiple commentaries in InDesign", + q2_text: "“Setting a Talmud page or a Chumash with Rashi and Tosafot in InDesign is an ordeal. There is no built-in tool for multiple parallel texts that flow together. You have to buy plug-ins costing thousands of shekels, and every Adobe version update breaks them and holds up a publication for months.”", + q2_solution: "A multi-flow solver (Talmud Solver) built into the core — continuous synchronization between the main text and the commentaries on the same page and across spreads, with no third-party plug-in required.", + q3_tag: "Pain point: niqqud and “rivers” in Hebrew", + q3_text: "“Most general publishing suites treat RTL and Hebrew as a secondary patch over Latin engines. Complex vowel points (nikud) misalign, and justified alignment produces hideous white rivers because systems don't support traditional letter expansion.”", + q3_solution: "Designed from the ground up for Hebrew: SI 6100 enforced for full normalization, combined with the Knuth-Plass algorithm and traditional letter extension, exactly as in the classic editions.", + q4_source: "Association of printers and pre-press houses", + q4_tag: "Pain point: files rejected by the print shop", + q4_text: "“Typesetters send PDFs exported from word processors and are surprised when the printer rejects them: the black text is built from four inks instead of clean black (100% K), there is no 3 mm bleed for trimming, and vocalized text turns into gibberish when copied or searched.”", + q4_solution: "Direct export to ISO 15930 (PDF/X-1a): pure K black in DeviceCMYK separation, vector crop marks, BleedBox and /ToUnicode tables for flawless search.", + + // Features + features_pretitle: "Chapter 5: Core capabilities", + features_title: "The six pillars of the architecture", + features_subtitle: "Built for engineers, publishers and professional typesetters who will not compromise on performance or on the fine rules of typography.", + f1_title: "Independent Rust core & virtualization for huge documents", + f1_desc: "Older monolithic systems freeze completely on documents over 100 pages. TypesetOK strictly separates the Rust layout and memory core from the UI and keeps only three active pages in the DOM at any moment — ensuring stable performance on 1,000+ page documents.", + f2_title: "SI 6100 and deterministic gematria", + f2_desc: "Strict Unicode normalization per the Israeli standard, with automatic handling of standard geresh and gershayim and the traditional taboo substitutions (15 → ט״ו, 16 → ט״ז, 270 → ע״ר).", + f3_title: "Three-tier Hebrew justification (Knuth-Plass)", + f3_desc: "A principled justification hierarchy: controlled word-space stretching (Tier 1), traditional extending letters (Tier 2), and subtle micro-tracking of ±2% em (Tier 3).", + f4_title: "Multi-flow constraint solver for sacred texts", + f4_desc: "A dedicated mathematical algorithm for laying out Talmud and Mikraot Gedolot pages. Perfect synchronization between the Gemara and the commentaries across pages, with no faulty overflow.", + f5_title: "Native ISO 15930 pre-press", + f5_desc: "Direct PDF/X-1a and PDF/X-4 export with 100% K DeviceCMYK, Fogra 39 profile, spot colors and crop marks. /ToUnicode tables keep vocalized text copyable.", + f6_title: "Crash resilience: ACID WAL & .tok", + f6_desc: "An internal database with write-ahead logging for continuous background autosave without data loss, alongside an official package format (.tok) based on a protected atomic ZIP archive.", + + // Engineering + eng_pretitle: "Chapter 6: Engineering transparency and verified data", + eng_title: "Real test results from the repository", + eng_subtitle: "No empty marketing talk — every figure below was verified in the TypesetOK Rust repository.", + eng_th_metric: "Engineering metric / test", + eng_th_target: "Architectural target", + eng_th_result: "Actual result (verified)", + eng_th_status: "Status", + eng_r1_name: "Workspace unit tests", + eng_r1_target: "100% pass across all 7 crates", + eng_r1_result: "174 / 174 tests passing", + eng_r2_name: "Code quality checks (Clippy)", + eng_r2_target: "0 warnings with the -D warnings flag", + eng_r2_result: "0 warnings (clean build)", + eng_r3_name: "Consistent formatting (rustfmt)", + eng_r3_target: "Fully passes cargo fmt --check", + eng_r3_result: "100% compliant with the style rules", + eng_r4_name: "Bit-for-bit determinism", + eng_r4_target: "Identical SHA-256 across consecutive runs", + eng_r5_name: "Document stress test", + eng_r5_target: "1,000 consecutive vocalized pages", + eng_r5_result: "1,001 pages / 49,001 lines in 3.1 s", + dev_pretitle: "Chapter 7: Development, community and open source", + dev_title: "A free, open project for the typesetting community", + dev_desc: "TypesetOK was born from a real need in Hebrew printing and Torah publishing for a modern, reliable, fast typesetting tool free of outdated commercial lock-in. All research, specifications and core code are published openly on GitHub.", + dev_btn_github: "Repository on GitHub", + dev_btn_issues: "Suggestions & bug reports", + + // CTA + cta_title: "Ready to take your typesetting to another level? Download TypesetOK", + cta_desc: "The software is open and free to use. Download the portable version directly, with no installation, or explore the source code and technical specification.", + cta_btn_download: "Direct download (portable ZIP)", + cta_btn_github: "View on GitHub", + cta_btn_spec: "Read the tech spec", + + // Footer + footer_desc: "An open-source desktop publishing system. Modern research and development for advanced Hebrew typography, sacred texts and very large documents.", + footer_nav_title: "Navigation", + footer_nav_download: "Download", + footer_nav_arch: "Architecture & principles", + footer_nav_features: "Core features", + footer_std_title: "Standards", + footer_std_si: "Israeli Standard SI 6100", + footer_std_iso: "ISO 15930 (PDF/X-1a)", + footer_std_kp: "Knuth-Plass algorithm", + footer_arch_report: "Architecture report", + footer_comm_title: "Community & code", + footer_github: "GitHub Repository", + footer_releases: "Releases", + footer_issues: "Issues & Research", + footer_source: "Build from source", // A11y Panel - a11y_panel_title: "Accessibility Preferences", - a11y_font_inc: "Increase Text (+)", - a11y_font_dec: "Decrease Text (-)", - a11y_contrast: "High Contrast", - a11y_theme: "Theme (Light / Dark / System)", - a11y_readable_font: "Simple Dyslexia Font", - a11y_links: "Highlight Links", - a11y_headings: "Highlight Headings", - a11y_big_cursor: "Large Cursor", - a11y_motion: "Reduce Motion", - a11y_spacing: "Wide Line Spacing", - a11y_letters: "Wide Letter Spacing", - a11y_monochrome: "Grayscale Mode", - a11y_reset: "Reset All Preferences" + a11y_open: "Open accessibility menu", + a11y_menu_title: "Accessibility menu", + a11y_close: "Close accessibility menu", + a11y_panel_title: "Accessibility menu", + a11y_font_inc: "Larger text", + a11y_font_dec: "Smaller text", + a11y_contrast: "High contrast", + a11y_theme: "Display mode", + a11y_readable_font: "Simple readable font", + a11y_links: "Highlight links", + a11y_headings: "Highlight headings", + a11y_big_cursor: "Large cursor", + a11y_motion: "Stop motion", + a11y_spacing: "Wide line spacing", + a11y_letters: "Letter spacing", + a11y_monochrome: "Grayscale", + a11y_reset: "Reset accessibility settings", + + // Floating widget + float_sub: "Portable version, no installation", + float_title: "Download now", + float_btn: "Free download", + + // Modals + source_modal_title: "Running the tests from source (Rust engine)", + source_modal_intro: "TypesetOK is in the core engine development stage. Developers and researchers are welcome to clone the repository and run the official test suite:", + source_modal_req: "Requirements: Rust 1.85+ with the official Cargo toolchain.", + arch_modal_title: "Engineering architecture report: TypesetOK (TOK)", + arch_principles: "Core architectural principles", + arch_p1: "1. Full independence of the document model (TDM): the document model is completely decoupled from the browser's DOM, HTML tags and CSS rules. All semantic structures are written in pure Rust.", + arch_p2: "2. The pre-pagination principle: the UI engine is not allowed to guess page breaks or column splits. The Rust core performs all Knuth-Plass computations and hands over pages that are already paginated.", + arch_p3: "3. Dual PDF pipeline: a controlled, fast on-screen display layer alongside a fully independent native pre-press pipeline in Rust that produces standards-compliant PDF/X-1a with 100% K black and a 3 mm BleedBox.", + arch_p4: "4. Virtual caret layer: works around the built-in contenteditable failures of browsers using a transparent Canvas layer and a virtual caret.", + arch_p5: "5. Built-in support for huge documents: an incremental, convergence-based pagination algorithm (Convergence Pagination) with full virtualization of only 3 active pages.", + arch_compare: "Compared with existing systems:
InDesign (a heavy, slow RTL patch) | Affinity Publisher (0% Hebrew support) | Tag (an old monolithic program from the 1990s) | Typst (code/markup only, no visual desktop editing)." }, es: { + // Document + meta_title: "TypesetOK — Software profesional de composición de libros en hebreo, de código abierto", + meta_description: "Sistema moderno de autoedición (DTP) de código abierto para tipografía hebrea avanzada, textos sagrados (Talmud, Mikraot Gedolot, responsa) y documentos de gran tamaño. Núcleo en Rust, algoritmo Knuth-Plass y salida PDF/X-1a nativa.", + skip_link: "Saltar al contenido principal", + + // Accessible names + aria_reading_progress: "Progreso de lectura", + aria_home: "Inicio de TypesetOK", + aria_main_nav: "Navegación principal", + aria_lang_selector: "Idioma", + aria_github_repo: "Repositorio en GitHub", + aria_mobile_nav: "Navegación móvil", + aria_open_github: "Abrir TypesetOK en GitHub", + aria_download_hub: "Centro de descargas de TypesetOK", + aria_dl_portable: "Descarga directa de TypesetOK, sin instalación", + aria_dl_installer: "Descargar el instalador para Windows (Setup)", + aria_cmyk_bars: "Barras de color CMYK", + aria_comparison: "Comparativa de composición", + aria_comp_slider: "Control deslizante de comparación", + modal_close: "Cerrar", + menu_open: "Abrir menú de navegación", + menu_close: "Cerrar menú de navegación", + + // Theme + theme_label: "Tema: claro / oscuro / sistema", + theme_menu: "Elegir tema", + theme_light: "Modo claro", + theme_dark: "Modo oscuro", + theme_system: "Según el sistema (automático)", + theme_label_light: "Tema: modo claro", + theme_label_dark: "Tema: modo oscuro", + theme_label_system: "Tema: según el sistema (automático)", + // Navigation nav_home: "Inicio", nav_comparison: "Comparativa", nav_matrix: "Word vs InDesign", - nav_quotes: "Voces del Sector", + nav_quotes: "Voces del oficio", nav_features: "Capacidades", nav_story: "Arquitectura", - nav_engineering: "Métricas", + nav_engineering: "Pruebas", btn_download: "Descargar", - btn_github: "Repositorio GitHub", + btn_github: "GitHub", btn_architecture: "Especificación", - btn_source_guide: "Guía Dev", + btn_source_guide: "Guía de desarrollo", + mnav_download: "Descargar para Windows", // Hero hero_badge: "Autoedición profesional de código abierto • Gratuita y sin ataduras", - hero_title_1: "Composición tipográfica real.", + hero_title_1: "Composición de libros de verdad.", hero_title_2: "Libre, abierta y lista para imprenta.", - hero_desc: "TypesetOK está diseñada específicamente para maquetadores, diseñadores de libros y editores. Soporte nativo para hebreo, vocalización precisa sin desajustes, diseño de páginas rabínicas complejas y pleno cumplimiento de estándares de impresión.", - hero_cta_download: "Descargar Programa", - hero_cta_github: "Ver en GitHub", - hero_cta_arch: "Especificación Técnica", - metric_tests: "58 / 58", - metric_tests_label: "Pruebas unitarias superadas en Rust", - metric_clippy: "0 Advertencias", - metric_clippy_label: "Estándar estricto Clippy", + hero_desc: "TypesetOK está diseñada específicamente para maquetadores, diseñadores de libros y editoriales: tratamiento nativo de la escritura hebrea, niqqud (puntos vocálicos) y te'amim (signos de cantilación) exactos y sin alteraciones, páginas de Talmud y Mikraot Gedolot con múltiples comentarios, y pleno cumplimiento de los estándares de impresión.", + hero_point_1: "Trabajo fluido en documentos de cientos o miles de páginas, sin bloqueos de la pantalla", + hero_point_2: "Justificación equilibrada con letras extensibles para evitar «ríos» de espacio en blanco", + hero_point_3: "Salida lista para imprenta: PDF/X-1a con negro puro 100% K, marcas de corte y sangrado de 3 mm", + hero_cta_download: "Descargar el programa", + hero_cta_github: "Código fuente en GitHub", + hero_cta_arch: "Especificación de arquitectura completa", + metric_tests: "174 / 174", + metric_tests_label: "Pruebas del núcleo en Rust superadas", + metric_clippy: "0 advertencias", + metric_clippy_label: "Código limpio según Clippy", metric_standards: "SI 6100 & ISO 15930", - metric_standards_label: "Cumplimiento normativo total", + metric_standards_label: "Cumplimiento total de los estándares de impresión y Unicode", // Download Center - dl_card_badge: "Versión Oficial para Windows", - dl_card_os: "Windows 10 / 11 (x64)", - dl_btn_portable_title: "Descarga Directa (Portable)", - dl_btn_portable_sub: "Archivo ZIP — Descomprimir y ejecutar", - dl_btn_installer_title: "Descargar Instalador (Windows Setup)", - dl_btn_installer_sub: "Instalación estándar de escritorio", - dl_cli_label: "Otras opciones:", - dl_cli_windows: "Windows CLI", - dl_cli_linux: "Linux CLI", - dl_cli_macos: "macOS CLI", + dl_card_badge: "Versión oficial", + dl_card_os: "Windows 10 / 11 (64 bits)", + dl_btn_portable_title: "Descarga directa (sin instalación)", + dl_btn_portable_sub: "ZIP portátil — descomprimir y ejecutar", + dl_btn_installer_title: "Descargar con instalador (Windows Setup)", + dl_btn_installer_sub: "Instalación de escritorio estándar", + dl_cli_label: "Más opciones:", + dl_cli_windows: "CLI para Windows", + dl_cli_linux: "CLI para Linux", + dl_cli_macos: "CLI para macOS", + dl_source_link: "Código fuente en GitHub ↗", + dl_note_oss: "✓ 100% código abierto", + dl_note_free: "✓ Gratis y sin registro", + dl_note_official: "✓ Archivo oficial de GitHub Releases", dl_floating_btn: "Descargar TypesetOK", // Storytelling - story_pretitle: "Capítulo I: Pilares de Arquitectura", - story_title: "Tres Principios de Ingeniería", - story_subtitle: "Cómo el motor TypesetOK resuelve los cuellos de botella históricos del libro hebreo.", - scene1_num: "Pilar 01", + story_pretitle: "Capítulo 1: Pilares de la arquitectura", + story_title: "Tres principios de ingeniería", + story_subtitle: "Cómo se diseñó el motor de composición de TypesetOK para resolver los retos históricos de la imprenta hebrea.", + scene1_num: "Principio 01", scene1_title: "Normalización estricta según la norma israelí SI 6100", - scene1_desc: "Los procesadores de texto comunes suelen alterar el orden de las vocales y los signos diacríticos en hebreo. TypesetOK impone un orden canónico determinista y sustitución de gematría tabú.", - scene2_num: "Pilar 02", - scene2_title: "Solucionador multiflujo para páginas complejas (Talmud)", - scene2_desc: "El diseño del Talmud es la cumbre de la complejidad: texto central y comentarios laterales que interactúan dinámicamente sin romper la simetría de la página.", - scene3_num: "Pilar 03", - scene3_title: "Preprensa nativa: ISO 15930 (PDF/X-1a)", - scene3_desc: "Sin depender de motores de navegador. Salida directa con 100% K negro puro (DeviceCMYK), sangrado de 3 mm y perfiles Fogra 39.", + scene1_desc: "Los procesadores de texto y los sistemas de maquetación occidentales alteran con frecuencia el orden Unicode de las letras y los puntos vocálicos hebreos. TypesetOK impone un orden Unicode totalmente determinista y aplica un motor de guematría determinista que evita combinaciones tabú y nombres divinos (15 → ט״ו, 16 → ט״ז, 270 → ע״ר).", + story1_point_1: "Orden Unicode canónico: letra → punto de shin/sin → daguesh → niqqud → méteg → te'amim", + story1_point_2: "Indexación fraccionaria O(1) sin necesidad de renumerar el documento", + scene2_num: "Principio 02", + scene2_title: "Solucionador de restricciones multiflujo (Talmud Solver)", + scene2_desc: "Las páginas del Talmud y de Mikraot Gedolot son la cumbre de la dificultad tipográfica: la Guemará en el centro, Rashi a un lado y Tosafot al otro, de modo que cada cambio en un párrafo afecta al flujo de los otros dos comentarios. La especificación del sistema define un solucionador matemático de restricciones dedicado que los mantiene sincronizados de forma continua.", + story2_point_1: "Sincronización de flujos de texto paralelos en la misma página y en páginas enfrentadas", + story2_point_2: "Algoritmo Knuth-Plass de párrafo completo para evitar viudas, huérfanas y líneas flojas", + scene3_num: "Principio 03", + scene3_title: "Preimpresión nativa: ISO 15930 (PDF/X-1a)", + scene3_desc: "Sin depender de los motores de impresión del navegador, limitados a sRGB. El motor en Rust está diseñado para generar directamente auténticos archivos de imprenta: negro 100% K (DeviceCMYK), marcas de registro y de corte vectoriales, BleedBox y TrimBox de 3 mm, y perfiles Fogra 39.", + story3_point_1: "Tablas /ToUnicode rigurosas: texto vocalizado que se puede copiar y buscar en el PDF", + story3_point_2: "Soporte completo de tintas planas (Spot/Pantone) directamente desde el archivo de configuración", + story3_proof_text: "Documento seguro para imprenta — separación de planchas CMYK pura", // Comparison - comp_pretitle: "Capítulo II: Comparativa Práctica", - comp_title: "Procesador Común vs Precisión TypesetOK", - comp_subtitle: "Mueva el control deslizante para comparar el espaciado deficiente con la justificación óptima Knuth-Plass.", - comp_preset_before: "Word (Antes)", - comp_preset_half: "Mitad (50%)", - comp_preset_after: "TypesetOK (Después)", - comp_before_label: "Procesador de Texto Común (Word)", - comp_before_note: "En Word: espaciado irregular, 'ríos' blancos y falta de regularidad en la mancha tipográfica.", - comp_after_label: "Especificación TypesetOK (Knuth-Plass + Letras Expansibles)", - comp_after_note: "En TypesetOK: mancha tipográfica armónica, minimización global de demerits y rejilla base alineada.", + comp_pretitle: "Capítulo 2: Comparativa práctica para maquetadores", + comp_title: "Cortes de línea en Word frente a la precisión de TypesetOK", + comp_subtitle: "Mueva el control deslizante o use los botones para comparar cómo compone un procesador de textos habitual frente al bloque de texto equilibrado de TypesetOK.", + comp_preset_before: "Word (antes)", + comp_preset_half: "Mitad y mitad (50%)", + comp_preset_after: "TypesetOK (después)", + comp_before_label: "Procesador de textos tradicional (Word)", + comp_before_note: "En Word: líneas estiradas, huecos blancos llamativos, sin letras extensibles y un gris tipográfico irregular.", + comp_after_label: "Especificación TypesetOK (Knuth-Plass + letras extensibles)", + comp_after_note: "En TypesetOK: bloque tipográfico equilibrado, cortes de línea optimizados para todo el párrafo, letras extensibles y alineación completa a la retícula de líneas base.", + + // Matrix + matrix_pretitle: "Capítulo 3: Una comparativa práctica y realista", + matrix_title: "Word, InDesign y TypesetOK, cara a cara", + matrix_subtitle: "Una comparación objetiva y precisa entre las herramientas del mercado y la respuesta específica que TypesetOK se ha diseñado para ofrecer al mundo de la composición.", + matrix_aria: "Comparativa práctica de herramientas de maquetación", + matrix_th_challenge: "Reto clave de composición", + matrix_th_word: "Microsoft Word", + matrix_th_indesign: "Adobe InDesign", + m1_title: "Documentos enormes y libros (500+ páginas)", + m1_sub: "Estabilidad, capacidad de respuesta y sin reflujo en cascada", + m1_word_badge: "Dificultad crítica", + m1_word: "Cambiar una frase en la página 10 desplaza todo el libro; los documentos pesados se vuelven demasiado lentos para el trabajo diario.", + m1_id_badge: "Solución parcial (Libro)", + m1_id: "Permite dividir en archivos (Libro), pero los archivos de cientos de páginas se vuelven pesados y lentos, y la interfaz se entrecorta en sesiones largas.", + m1_tok_badge: "Excelente e integrado", + m1_tok: "Núcleo virtualizado en Rust con un consumo de memoria mínimo. Solo se renderizan 3 páginas activas: trabajo fluido en documentos de más de 1.000 páginas.", + m2_title: "Niqqud, te'amim y precisión del hebreo", + m2_sub: "Orden Unicode, posición de los signos y geresh/guershayim normalizados", + m2_word_badge: "Alteraciones frecuentes", + m2_word: "Los puntos vocálicos se salen de las letras, el geresh y el guershayim se convierten en comillas latinas y el tratamiento de Unicode es incoherente.", + m2_id_badge: "Requiere el compositor internacional", + m2_id: "Hay que activar el World-Ready Composer; con muchas fuentes hebreas los puntos vocálicos pueden descolocarse sin tediosos ajustes manuales.", + m2_tok_badge: "Cumplimiento total de SI 6100", + m2_tok: "Normalización canónica integrada según la norma israelí. Orden Unicode determinista: letra, daguesh, niqqud y te'amim exactamente en su lugar.", + m3_title: "Textos sagrados y textos paralelos", + m3_sub: "Páginas del Talmud, Mikraot Gedolot y comentarios paralelos", + m3_word_badge: "Imposible", + m3_word: "No admite varias columnas paralelas sincronizadas en una misma página. No es posible componer la página clásica del Talmud (tzurat hadaf) ni un Jumash con comentarios.", + m3_id_badge: "Requiere plug-ins costosos", + m3_id: "Sin soporte integrado; exige complejos complementos de terceros que cuestan miles y que suelen romperse con las actualizaciones de Adobe.", + m3_tok_badge: "Motor multiflujo integrado", + m3_tok: "Un solucionador matemático de restricciones dedicado (Talmud Solver) que mantiene la Guemará y los comentarios que la rodean sincronizados de forma continua, sin saltos de página accidentales.", + m4_title: "Justificación y espaciado", + m4_sub: "Equilibrio del bloque de texto y prevención de «ríos» blancos", + m4_word_badge: "Solo estira los espacios", + m4_word: "El estiramiento burdo de los espacios entre palabras crea enormes «ríos» blancos que perjudican la legibilidad y la estética del libro.", + m4_id_badge: "Corte local/ponderado", + m4_id: "Un motor de calidad, pero limitado con las letras extensibles hebreas; el escalado horizontal de la fuente puede deformar las letras.", + m4_tok_badge: "Knuth-Plass + letras extensibles", + m4_tok: "Optimización global de todo el párrafo combinada con auténticas letras extensibles para mantener un espaciado natural entre palabras.", + m5_title: "Exportación profesional de preimpresión", + m5_sub: "PDF/X, negro 100% K, sangrado y marcas de corte", + m5_word_badge: "Salida ofimática (RGB)", + m5_word: "Exportación PDF simple sin separación de colores, sin auténtico negro de imprenta y sin marcas de corte ni sangrado.", + m5_id_badge: "Soporte completo de imprenta", + m5_id: "Capacidades de exportación muy avanzadas, pero requieren ajustes manuales complejos y amplios conocimientos técnicos de gestión del color.", + m5_tok_badge: "PDF/X-1a nativo con un clic", + m5_tok: "Salida ISO 15930 directa desde el núcleo en Rust: negro 100% K (DeviceCMYK), marcas de corte, sangrado de 3 mm y tablas /ToUnicode.", + + // Quotes + quotes_pretitle: "Capítulo 4: Voces del oficio", + quotes_title: "¿Qué dicen los maquetadores en los foros profesionales?", + quotes_subtitle: "Retos reales y frustraciones cotidianas de maquetadores y diseñadores con Word e InDesign, y cómo TypesetOK se creó para resolverlos.", + quote_solution_label: "La solución de TypesetOK:", + q1_source: "Foro de maquetadores (Prog)", + q1_tag: "Problema: la maquetación se desmorona en Word", + q1_text: "«El cliente solo pidió añadir una frase en la página 40... y toda la maquetación de un libro de 350 páginas en Word se desmoronó por completo. Las notas al pie se escaparon, los títulos saltaron a la página siguiente y tuve que revisarlo página por página como si empezara de cero.»", + q1_solution: "Un modelo de páginas independiente con bloqueo de secciones (Page Pinning). Un cambio local en un párrafo se resuelve localmente y no desmorona el resto del libro.", + q2_source: "Foro de Torá (composición de textos sagrados)", + q2_tag: "Problema: múltiples comentarios en InDesign", + q2_text: "«Componer una página del Talmud o un Jumash con Rashi y Tosafot en InDesign es un calvario. No hay ninguna herramienta integrada para varios textos paralelos que fluyan juntos. Hay que comprar plug-ins que cuestan miles de séqueles, y cada actualización de Adobe los inutiliza y retrasa una publicación durante meses.»", + q2_solution: "Un solucionador multiflujo (Talmud Solver) integrado en el núcleo: sincronización continua entre el texto principal y los comentarios en la misma página y en páginas enfrentadas, sin necesidad de ningún complemento externo.", + q3_tag: "Problema: niqqud y «ríos» en hebreo", + q3_text: "«La mayoría de las suites de edición generalistas tratan el RTL y el hebreo como un parche secundario sobre motores latinos. Los puntos vocálicos complejos (niqqud) se desalinean y la justificación produce horribles ríos blancos porque los sistemas no admiten la extensión tradicional de letras.»", + q3_solution: "Diseñada desde cero para el hebreo: aplicación de la norma SI 6100 para una normalización completa, combinada con el algoritmo Knuth-Plass y la extensión tradicional de letras, tal como en las ediciones clásicas.", + q4_source: "Asociación de imprentas y empresas de preimpresión", + q4_tag: "Problema: archivos rechazados por la imprenta", + q4_text: "«Los maquetadores envían PDF exportados desde procesadores de texto y se sorprenden cuando la imprenta los rechaza: el texto negro está formado por cuatro tintas en lugar de un negro limpio (100% K), no hay sangrado de 3 mm para el corte y el texto vocalizado se convierte en un galimatías al copiarlo o buscarlo.»", + q4_solution: "Exportación directa a ISO 15930 (PDF/X-1a): negro K puro en separación DeviceCMYK, marcas de corte vectoriales, BleedBox y tablas /ToUnicode para búsquedas impecables.", + + // Features + features_pretitle: "Capítulo 5: Capacidades principales", + features_title: "Los seis pilares de la arquitectura", + features_subtitle: "Creado para ingenieros, editoriales y maquetadores profesionales que no están dispuestos a renunciar al rendimiento ni al rigor de las normas tipográficas.", + f1_title: "Núcleo independiente en Rust y virtualización para documentos enormes", + f1_desc: "Los sistemas monolíticos antiguos se bloquean por completo con documentos de más de 100 páginas. TypesetOK separa estrictamente el núcleo de composición y memoria en Rust de la interfaz y mantiene solo tres páginas activas en el DOM en cada momento, lo que garantiza un funcionamiento estable en documentos de más de 1.000 páginas.", + f2_title: "SI 6100 y guematría determinista", + f2_desc: "Normalización Unicode estricta según la norma israelí, con tratamiento automático del geresh y el guershayim normalizados y de las sustituciones tabú tradicionales (15 → ט״ו, 16 → ט״ז, 270 → ע״ר).", + f3_title: "Justificación hebrea en tres niveles (Knuth-Plass)", + f3_desc: "Una jerarquía de justificación rigurosa: estiramiento controlado de los espacios entre palabras (nivel 1), letras extensibles tradicionales (nivel 2) y un sutil microtracking de ±2% em (nivel 3).", + f4_title: "Solucionador de restricciones multiflujo para textos sagrados", + f4_desc: "Un algoritmo matemático dedicado a la composición de páginas del Talmud y de Mikraot Gedolot. Sincronización perfecta entre la Guemará y los comentarios a lo largo de las páginas, sin desbordamientos erróneos.", + f5_title: "Preimpresión nativa ISO 15930", + f5_desc: "Exportación directa a PDF/X-1a y PDF/X-4 con 100% K DeviceCMYK, perfil Fogra 39, tintas planas y marcas de corte. Tablas /ToUnicode para que el texto vocalizado se pueda copiar.", + f6_title: "Resistencia a fallos: ACID WAL y .tok", + f6_desc: "Una base de datos interna con registro de escritura anticipada (write-ahead logging) para un guardado automático continuo en segundo plano sin pérdida de datos, junto con un formato de paquete oficial (.tok) basado en un archivo ZIP atómico protegido.", + + // Engineering + eng_pretitle: "Capítulo 6: Transparencia técnica y datos verificados", + eng_title: "Resultados reales de las pruebas del repositorio", + eng_subtitle: "Sin palabrería de marketing: todos los datos siguientes se han verificado en el repositorio de TypesetOK en Rust.", + eng_th_metric: "Métrica técnica / prueba", + eng_th_target: "Objetivo de arquitectura", + eng_th_result: "Resultado real (verificado)", + eng_th_status: "Estado", + eng_r1_name: "Pruebas unitarias del workspace", + eng_r1_target: "100% superadas en los 7 crates", + eng_r1_result: "174 / 174 pruebas superadas", + eng_r2_name: "Control de calidad del código (Clippy)", + eng_r2_target: "0 advertencias con la opción -D warnings", + eng_r2_result: "0 advertencias (compilación limpia)", + eng_r3_name: "Formato uniforme (rustfmt)", + eng_r3_target: "Supera por completo cargo fmt --check", + eng_r3_result: "100% conforme con las reglas de estilo", + eng_r4_name: "Determinismo bit a bit", + eng_r4_target: "SHA-256 idéntico en ejecuciones consecutivas", + eng_r5_name: "Prueba de carga de documento (stress test)", + eng_r5_target: "1.000 páginas vocalizadas seguidas", + eng_r5_result: "1.001 páginas / 49.001 líneas en 3,1 s", + dev_pretitle: "Capítulo 7: Desarrollo, comunidad y código abierto", + dev_title: "Un proyecto libre y abierto para la comunidad de la composición", + dev_desc: "TypesetOK nació de una necesidad real de la imprenta hebrea y de la edición de literatura rabínica: una herramienta de composición moderna, fiable, rápida y libre de ataduras comerciales obsoletas. Toda la investigación, las especificaciones y el código del núcleo se publican con total transparencia en GitHub.", + dev_btn_github: "Repositorio en GitHub", + dev_btn_issues: "Sugerencias e informes de errores", + + // CTA + cta_title: "¿Listo para llevar su composición a otro nivel? Descargue TypesetOK", + cta_desc: "El programa es abierto y de uso gratuito. Descargue directamente la versión portátil, sin instalación, o explore el código fuente y la especificación técnica.", + cta_btn_download: "Descarga directa (ZIP portátil)", + cta_btn_github: "Ver en GitHub", + cta_btn_spec: "Leer la especificación técnica", + + // Footer + footer_desc: "Sistema de autoedición de código abierto. Investigación y desarrollo modernos para tipografía hebrea avanzada, textos sagrados y documentos de gran tamaño.", + footer_nav_title: "Navegación", + footer_nav_download: "Descargar", + footer_nav_arch: "Arquitectura y principios", + footer_nav_features: "Funciones principales", + footer_std_title: "Estándares", + footer_std_si: "Norma israelí SI 6100", + footer_std_iso: "ISO 15930 (PDF/X-1a)", + footer_std_kp: "Algoritmo Knuth-Plass", + footer_arch_report: "Informe de arquitectura", + footer_comm_title: "Comunidad y código", + footer_github: "Repositorio en GitHub", + footer_releases: "Versiones (Releases)", + footer_issues: "Incidencias e investigación", + footer_source: "Compilar desde el código fuente", // A11y Panel - a11y_panel_title: "Opciones de Accesibilidad", - a11y_font_inc: "Aumentar Letra (+)", - a11y_font_dec: "Reducir Letra (-)", - a11y_contrast: "Alto Contraste", - a11y_theme: "Tema (Día / Noche / Sistema)", - a11y_readable_font: "Fuente Dislexia", - a11y_links: "Resaltar Enlaces", - a11y_headings: "Resaltar Títulos", - a11y_big_cursor: "Cursor Grande", - a11y_motion: "Detener Movimiento", - a11y_spacing: "Interlineado Amplio", - a11y_letters: "Espaciado de Letras", - a11y_monochrome: "Escala de Grises", - a11y_reset: "Restablecer Opciones" + a11y_open: "Abrir menú de accesibilidad", + a11y_menu_title: "Menú de accesibilidad", + a11y_close: "Cerrar menú de accesibilidad", + a11y_panel_title: "Menú de accesibilidad", + a11y_font_inc: "Aumentar texto", + a11y_font_dec: "Reducir texto", + a11y_contrast: "Alto contraste", + a11y_theme: "Modo de visualización", + a11y_readable_font: "Fuente legible simple", + a11y_links: "Resaltar enlaces", + a11y_headings: "Resaltar títulos", + a11y_big_cursor: "Cursor grande", + a11y_motion: "Detener animaciones", + a11y_spacing: "Interlineado amplio", + a11y_letters: "Espaciado entre letras", + a11y_monochrome: "Escala de grises", + a11y_reset: "Restablecer la accesibilidad", + + // Floating widget + float_sub: "Versión portátil, sin instalación", + float_title: "Descargar ahora", + float_btn: "Descarga gratuita", + + // Modals + source_modal_title: "Ejecutar las pruebas desde el código fuente (motor en Rust)", + source_modal_intro: "TypesetOK se encuentra en la fase de desarrollo del núcleo (Core Engine). Desarrolladores e investigadores están invitados a clonar el repositorio y ejecutar el conjunto oficial de pruebas:", + source_modal_req: "Requisitos: Rust 1.85+ con la herramienta oficial Cargo.", + arch_modal_title: "Informe técnico de arquitectura: TypesetOK (TOK)", + arch_principles: "Principios fundamentales de la arquitectura", + arch_p1: "1. Independencia total del modelo de documento (TDM): el modelo de documento está completamente desacoplado del DOM, de las etiquetas HTML y de las reglas CSS del navegador. Todas las estructuras semánticas están escritas en Rust puro.", + arch_p2: "2. Principio de prepaginación: el motor de la interfaz no puede adivinar saltos de página ni repartos de columnas. El núcleo en Rust realiza todos los cálculos de Knuth-Plass y entrega páginas ya paginadas.", + arch_p3: "3. Doble canal PDF: una capa de visualización en pantalla rápida y controlada, junto a un canal de preimpresión nativo en Rust totalmente independiente que genera PDF/X-1a conforme con negro 100% K y BleedBox de 3 mm.", + arch_p4: "4. Capa de cursor virtual: evita los fallos inherentes de contenteditable en los navegadores mediante una capa Canvas transparente y un cursor virtual.", + arch_p5: "5. Soporte integrado para documentos enormes: algoritmo de paginación incremental basado en convergencia (Convergence Pagination) y virtualización completa con solo 3 páginas activas.", + arch_compare: "Comparación con los sistemas existentes:
InDesign (parche RTL pesado y lento) | Affinity Publisher (0% de soporte para hebreo) | Tag (programa monolítico antiguo de los años 90) | Typst (solo código/markup, sin edición visual de escritorio)." }, fr: { + // Document + meta_title: "TypesetOK — Logiciel professionnel open source de composition de livres en hébreu", + meta_description: "Système moderne de PAO open source pour la typographie hébraïque avancée, les textes sacrés (Talmud, Mikraot Gedolot, responsa) et les très gros documents. Cœur en Rust, algorithme Knuth-Plass, sortie PDF/X-1a native.", + skip_link: "Aller au contenu principal", + + // Accessible names + aria_reading_progress: "Progression de la lecture", + aria_home: "Accueil TypesetOK", + aria_main_nav: "Navigation principale", + aria_lang_selector: "Langue", + aria_github_repo: "Dépôt GitHub", + aria_mobile_nav: "Navigation mobile", + aria_open_github: "Ouvrir TypesetOK sur GitHub", + aria_download_hub: "Centre de téléchargement TypesetOK", + aria_dl_portable: "Télécharger TypesetOK directement, sans installation", + aria_dl_installer: "Télécharger l'installateur Windows (Setup)", + aria_cmyk_bars: "Barres de couleur CMJN", + aria_comparison: "Comparaison de composition", + aria_comp_slider: "Curseur de comparaison", + modal_close: "Fermer", + menu_open: "Ouvrir le menu de navigation", + menu_close: "Fermer le menu de navigation", + + // Theme + theme_label: "Thème : clair / sombre / système", + theme_menu: "Choisir le thème", + theme_light: "Mode clair", + theme_dark: "Mode sombre", + theme_system: "Selon le système (auto)", + theme_label_light: "Thème : mode clair", + theme_label_dark: "Thème : mode sombre", + theme_label_system: "Thème : selon le système (auto)", + // Navigation nav_home: "Accueil", nav_comparison: "Comparaison", nav_matrix: "Word vs InDesign", - nav_quotes: "Retours d'Expérience", + nav_quotes: "Paroles de terrain", nav_features: "Fonctions", nav_story: "Architecture", - nav_engineering: "Performances", + nav_engineering: "Tests", btn_download: "Télécharger", - btn_github: "Dépôt GitHub", + btn_github: "GitHub", btn_architecture: "Spécification", - btn_source_guide: "Guide Dev", + btn_source_guide: "Guide développeur", + mnav_download: "Télécharger pour Windows", // Hero hero_badge: "PAO professionnelle open source • Gratuite et sans verrouillage", hero_title_1: "La vraie composition de livres.", hero_title_2: "Libre, ouverte et prête pour l'impression.", - hero_desc: "TypesetOK est spécialement conçue pour les typographes, maquettistes et éditeurs. Typographie hébraïque native, vocalisation sans bavure, mise en page du Talmud à commentaires multiples et conformité prépresse totale.", - hero_cta_download: "Télécharger le Logiciel", - hero_cta_github: "Voir sur GitHub", - hero_cta_arch: "Spécification Technique", - metric_tests: "58 / 58", - metric_tests_label: "Tests unitaires validés en Rust", - metric_clippy: "0 Avertissement", - metric_clippy_label: "Conformité stricte Clippy", + hero_desc: "TypesetOK est conçue spécialement pour les compositeurs, les maquettistes de livres et les éditeurs : prise en charge native de l'écriture hébraïque, niqqud (points-voyelles) et te'amim (signes de cantillation) exacts et sans altération, pages de Talmud et de Mikraot Gedolot à commentaires multiples, et conformité totale aux normes d'impression.", + hero_point_1: "Travail fluide sur des documents de centaines ou de milliers de pages, sans gel de l'affichage", + hero_point_2: "Justification équilibrée avec lettres extensibles pour éviter les « lézardes » d'espaces blancs", + hero_point_3: "Sortie prête pour l'impression : PDF/X-1a avec noir pur 100 % K, traits de coupe et fond perdu de 3 mm", + hero_cta_download: "Télécharger le logiciel", + hero_cta_github: "Code source sur GitHub", + hero_cta_arch: "Spécification d'architecture complète", + metric_tests: "174 / 174", + metric_tests_label: "Tests du cœur Rust réussis", + metric_clippy: "0 avertissement", + metric_clippy_label: "Code propre selon Clippy", metric_standards: "SI 6100 & ISO 15930", - metric_standards_label: "Normes d'impression et Unicode", + metric_standards_label: "Conformité totale aux normes d'impression et Unicode", // Download Center - dl_card_badge: "Version Officielle pour Windows", - dl_card_os: "Windows 10 / 11 (x64)", - dl_btn_portable_title: "Téléchargement Direct (Portable)", - dl_btn_portable_sub: "Fichier ZIP — Extraire et lancer", - dl_btn_installer_title: "Télécharger l'Installateur (Setup)", + dl_card_badge: "Version officielle", + dl_card_os: "Windows 10 / 11 (64 bits)", + dl_btn_portable_title: "Téléchargement direct (sans installation)", + dl_btn_portable_sub: "ZIP portable — extraire et lancer", + dl_btn_installer_title: "Télécharger avec installateur (Windows Setup)", dl_btn_installer_sub: "Installation bureau classique", - dl_cli_label: "Options complémentaires :", + dl_cli_label: "Autres options :", dl_cli_windows: "CLI Windows", dl_cli_linux: "CLI Linux", dl_cli_macos: "CLI macOS", + dl_source_link: "Code source sur GitHub ↗", + dl_note_oss: "✓ 100 % open source", + dl_note_free: "✓ Gratuit, sans inscription", + dl_note_official: "✓ Fichier officiel issu de GitHub Releases", dl_floating_btn: "Télécharger TypesetOK", // Storytelling - story_pretitle: "Chapitre I: Piliers d'Architecture", - story_title: "Trois Principes d'Ingénierie", - story_subtitle: "Comment le moteur TypesetOK résout les défis historiques de l'édition hébraïque.", - scene1_num: "Pilier 01", - scene1_title: "Normalisation stricte selon la norme SI 6100", - scene1_desc: "Les logiciels de traitement de texte altèrent souvent l'ordre des voyelles et signes diacritiques. TypesetOK impose un ordre canonique déterministe.", - scene2_num: "Pilier 02", - scene2_title: "Résolveur de contraintes multiflux (Talmud)", - scene2_desc: "Le sommet de la mise en page : texte central et commentaires périphériques synchronisés de façon fluide sur chaque page.", - scene3_num: "Pilier 03", + story_pretitle: "Chapitre 1 : Les piliers de l'architecture", + story_title: "Trois principes d'ingénierie directeurs", + story_subtitle: "Comment le moteur de composition de TypesetOK a été conçu pour résoudre les défis historiques de l'imprimerie hébraïque.", + scene1_num: "Principe 01", + scene1_title: "Normalisation stricte selon la norme israélienne SI 6100", + scene1_desc: "Les traitements de texte et les logiciels de mise en page occidentaux bouleversent souvent l'ordre Unicode des lettres et des points-voyelles hébreux. TypesetOK impose un ordre Unicode entièrement déterministe et applique un moteur de guématrie déterministe qui évite les combinaisons taboues et les noms divins (15 → ט״ו, 16 → ט״ז, 270 → ע״ר).", + story1_point_1: "Ordre Unicode canonique : lettre → point de shin/sin → daguesh → niqqud → méteg → te'amim", + story1_point_2: "Indexation fractionnaire en O(1), sans renumérotation du document", + scene2_num: "Principe 02", + scene2_title: "Solveur de contraintes multiflux (Talmud Solver)", + scene2_desc: "Les pages du Talmud et des Mikraot Gedolot sont le sommet de la difficulté typographique : la Guemara au centre, Rachi d'un côté et les Tossafot de l'autre, chaque modification d'un paragraphe influant sur l'écoulement des deux autres commentaires. La spécification du système définit un solveur de contraintes mathématique dédié qui les maintient synchronisés en continu.", + story2_point_1: "Synchronisation de flux de texte parallèles sur une même page et sur des doubles pages", + story2_point_2: "Algorithme Knuth-Plass sur le paragraphe entier contre les veuves, les orphelines et les lignes lâches", + scene3_num: "Principe 03", scene3_title: "Prépresse natif : ISO 15930 (PDF/X-1a)", - scene3_desc: "Sortie directe sans intermédiaire web : 100% noir K (DeviceCMYK), repères de coupe vectoriels et profils Fogra 39.", + scene3_desc: "Aucune dépendance aux moteurs d'impression des navigateurs, limités au sRGB. Le moteur Rust est conçu pour produire directement de véritables fichiers d'impression : noir 100 % K (DeviceCMYK), croix de repérage et traits de coupe vectoriels, BleedBox et TrimBox de 3 mm, et profils Fogra 39.", + story3_point_1: "Tables /ToUnicode rigoureuses : texte vocalisé copiable et recherchable dans le PDF", + story3_point_2: "Prise en charge complète des tons directs (Spot/Pantone) depuis le fichier de configuration", + story3_proof_text: "Document sécurisé pour l'impression — séparation CMJN pure", // Comparison - comp_pretitle: "Chapitre II: Comparaison Pratique", - comp_title: "Traitement de Texte vs Rigueur TypesetOK", - comp_subtitle: "Glissez le curseur pour comparer les césures approximatives de Word avec l'optimisation Knuth-Plass de TypesetOK.", - comp_preset_before: "Word (Avant)", - comp_preset_half: "Partage (50%)", - comp_preset_after: "TypesetOK (Après)", - comp_before_label: "Traitement de Texte Standard (Word)", - comp_before_note: "Sous Word: espacements anarchiques, 'lézardes' blanches et manque de régularité.", - comp_after_label: "Spécification TypesetOK (Knuth-Plass + Lettres Étirables)", - comp_after_note: "Sous TypesetOK: bloc typographique homogène, minimisation des défauts et alignement sur la grille.", + comp_pretitle: "Chapitre 2 : Comparaison pratique pour les compositeurs", + comp_title: "Les coupures de Word face à la précision de TypesetOK", + comp_subtitle: "Faites glisser le curseur ou utilisez les boutons pour comparer la composition d'un traitement de texte ordinaire avec le bloc de texte équilibré de TypesetOK.", + comp_preset_before: "Word (avant)", + comp_preset_half: "Moitié-moitié (50 %)", + comp_preset_after: "TypesetOK (après)", + comp_before_label: "Traitement de texte classique (Word)", + comp_before_note: "Sous Word : lignes étirées, blancs voyants, absence de lettres extensibles et gris typographique irrégulier.", + comp_after_label: "Spécification TypesetOK (Knuth-Plass + lettres extensibles)", + comp_after_note: "Sous TypesetOK : bloc typographique équilibré, coupures optimisées sur l'ensemble du paragraphe, lettres extensibles et alignement complet sur la grille de lignes de base.", + + // Matrix + matrix_pretitle: "Chapitre 3 : Une comparaison pratique et réaliste", + matrix_title: "Word, InDesign et TypesetOK — face à face", + matrix_subtitle: "Une comparaison factuelle et précise entre les outils du marché et la réponse dédiée que TypesetOK a été conçue pour apporter au monde de la composition.", + matrix_aria: "Comparaison pratique des outils de mise en page", + matrix_th_challenge: "Défi de composition clé", + matrix_th_word: "Microsoft Word", + matrix_th_indesign: "Adobe InDesign", + m1_title: "Très gros documents et livres (500+ pages)", + m1_sub: "Stabilité, réactivité et pas de recomposition en cascade", + m1_word_badge: "Difficulté critique", + m1_word: "Modifier une phrase en page 10 décale tout le livre ; les documents lourds deviennent trop lents pour le travail quotidien.", + m1_id_badge: "Solution partielle (Livre)", + m1_id: "Permet de découper en fichiers (Livre), mais les fichiers de centaines de pages deviennent lourds et lents, et l'interface saccade lors de longues sessions.", + m1_tok_badge: "Excellent, intégré", + m1_tok: "Cœur Rust virtualisé à l'empreinte mémoire minimale. Seules 3 pages actives sont rendues — travail fluide sur des documents de plus de 1 000 pages.", + m2_title: "Niqqud, te'amim et exactitude de l'hébreu", + m2_sub: "Ordre Unicode, position des signes et guéresh/guerchayim normalisés", + m2_word_badge: "Altérations fréquentes", + m2_word: "Les points-voyelles sortent des lettres, le guéresh et le guerchayim se transforment en guillemets latins, et le traitement Unicode est incohérent.", + m2_id_badge: "Exige le compositeur international", + m2_id: "Il faut activer le World-Ready Composer ; avec de nombreuses polices hébraïques, les points-voyelles peuvent encore se décaler sans de fastidieuses corrections manuelles.", + m2_tok_badge: "Conformité SI 6100 complète", + m2_tok: "Normalisation canonique intégrée selon la norme israélienne. Ordre Unicode déterministe : lettre, daguesh, niqqud et te'amim exactement à leur place.", + m3_title: "Textes sacrés et textes parallèles", + m3_sub: "Pages du Talmud, Mikraot Gedolot et commentaires parallèles", + m3_word_badge: "Impossible", + m3_word: "Aucune prise en charge de plusieurs colonnes parallèles synchronisées sur une même page. Impossible de composer la page classique du Talmud (tzourat hadaf) ou un Houmach avec ses commentaires.", + m3_id_badge: "Exige des plug-ins coûteux", + m3_id: "Aucune prise en charge native ; nécessite des extensions tierces complexes coûtant des milliers, qui ont tendance à casser lors des mises à jour d'Adobe.", + m3_tok_badge: "Moteur multiflux intégré", + m3_tok: "Un solveur de contraintes mathématique dédié (Talmud Solver) qui synchronise en continu la Guemara et les commentaires qui l'entourent, sans sauts de page intempestifs.", + m4_title: "Justification et espacement", + m4_sub: "Équilibre du bloc de texte et prévention des « lézardes » blanches", + m4_word_badge: "Étirement des espaces uniquement", + m4_word: "L'étirement grossier des espaces entre les mots crée de larges « lézardes » blanches qui nuisent à la lisibilité et à l'esthétique du livre.", + m4_id_badge: "Coupure locale/pondérée", + m4_id: "Un moteur de qualité, mais limité avec les lettres extensibles hébraïques ; la mise à l'échelle horizontale des polices peut déformer les lettres.", + m4_tok_badge: "Knuth-Plass + lettres extensibles", + m4_tok: "Optimisation globale sur l'ensemble du paragraphe, combinée à d'authentiques lettres extensibles pour préserver un espacement naturel entre les mots.", + m5_title: "Export prépresse professionnel", + m5_sub: "PDF/X, noir 100 % K, fond perdu et traits de coupe", + m5_word_badge: "Sortie bureautique (RVB)", + m5_word: "Export PDF simple sans séparation des couleurs, sans vrai noir d'impression, sans traits de coupe ni fond perdu.", + m5_id_badge: "Prise en charge complète de l'impression", + m5_id: "Des capacités d'export très avancées, mais qui exigent des réglages manuels complexes et de solides connaissances en gestion de la couleur.", + m5_tok_badge: "PDF/X-1a natif en un clic", + m5_tok: "Sortie ISO 15930 directe depuis le cœur Rust : noir 100 % K (DeviceCMYK), traits de coupe, fond perdu de 3 mm et tables /ToUnicode.", + + // Quotes + quotes_pretitle: "Chapitre 4 : Paroles de terrain", + quotes_title: "Que disent les compositeurs sur les forums professionnels ?", + quotes_subtitle: "Les vrais défis et les frustrations quotidiennes des compositeurs et graphistes face à Word et InDesign — et comment TypesetOK a été conçue pour y répondre.", + quote_solution_label: "La solution TypesetOK :", + q1_source: "Forum des compositeurs (Prog)", + q1_tag: "Problème : mise en page qui s'effondre sous Word", + q1_text: "« Le client demandait simplement d'ajouter une phrase en page 40... et toute la mise en page d'un livre de 350 pages sous Word s'est complètement effondrée. Les notes de bas de page se sont envolées, les titres ont sauté à la page suivante, et j'ai dû tout reprendre page par page comme si je repartais de zéro. »", + q1_solution: "Un modèle de pages indépendant avec verrouillage de sections (Page Pinning). Une modification locale dans un paragraphe est résolue localement et ne fait pas s'effondrer le reste du livre.", + q2_source: "Forum de Torah (composition de textes sacrés)", + q2_tag: "Problème : commentaires multiples sous InDesign", + q2_text: "« Composer une page de Talmud ou un Houmach avec Rachi et les Tossafot sous InDesign est un calvaire. Il n'existe aucun outil intégré pour plusieurs textes parallèles qui s'écoulent ensemble. On doit acheter des plug-ins à des milliers de shekels, et chaque mise à jour d'Adobe les met hors service et retarde une publication de plusieurs mois. »", + q2_solution: "Un solveur multiflux (Talmud Solver) intégré au cœur du logiciel — synchronisation continue entre le texte principal et les commentaires sur une même page et sur des doubles pages, sans aucune extension externe.", + q3_tag: "Problème : niqqud et « lézardes » en hébreu", + q3_text: "« La plupart des suites de publication généralistes traitent le RTL et l'hébreu comme un correctif secondaire plaqué sur des moteurs latins. Les points-voyelles complexes (niqqud) se désalignent, et la justification produit d'affreuses lézardes blanches parce que les systèmes ne gèrent pas l'extension traditionnelle des lettres. »", + q3_solution: "Conçue dès l'origine pour l'hébreu : application de la norme SI 6100 pour une normalisation complète, combinée à l'algorithme Knuth-Plass et à l'extension traditionnelle des lettres, exactement comme dans les éditions classiques.", + q4_source: "Association des imprimeurs et prestataires prépresse", + q4_tag: "Problème : fichiers refusés par l'imprimeur", + q4_text: "« Les compositeurs envoient des PDF issus de traitements de texte et s'étonnent que l'imprimeur les refuse : le texte noir est composé de quatre encres au lieu d'un noir pur (100 % K), il n'y a pas de fond perdu de 3 mm pour la coupe, et le texte vocalisé devient du charabia lorsqu'on le copie ou le recherche. »", + q4_solution: "Export direct vers ISO 15930 (PDF/X-1a) : noir K pur en séparation DeviceCMYK, traits de coupe vectoriels, BleedBox et tables /ToUnicode pour une recherche irréprochable.", + + // Features + features_pretitle: "Chapitre 5 : Fonctions clés", + features_title: "Les six piliers de l'architecture", + features_subtitle: "Conçu pour les ingénieurs, les éditeurs et les compositeurs professionnels qui refusent tout compromis sur les performances comme sur la rigueur typographique.", + f1_title: "Cœur Rust indépendant et virtualisation des très gros documents", + f1_desc: "Les anciens systèmes monolithiques se figent complètement au-delà de 100 pages. TypesetOK sépare strictement le cœur de composition et de mémoire en Rust de l'interface, et ne conserve que trois pages actives dans le DOM à tout instant — garantissant un fonctionnement stable sur des documents de plus de 1 000 pages.", + f2_title: "SI 6100 et guématrie déterministe", + f2_desc: "Normalisation Unicode stricte selon la norme israélienne, avec gestion automatique du guéresh et du guerchayim normalisés et des substitutions taboues traditionnelles (15 → ט״ו, 16 → ט״ז, 270 → ע״ר).", + f3_title: "Justification hébraïque à trois niveaux (Knuth-Plass)", + f3_desc: "Une hiérarchie de justification rigoureuse : étirement contrôlé des espaces entre les mots (niveau 1), lettres extensibles traditionnelles (niveau 2) et un léger micro-approche de ±2 % em (niveau 3).", + f4_title: "Solveur de contraintes multiflux pour les textes sacrés", + f4_desc: "Un algorithme mathématique dédié à la mise en page du Talmud et des Mikraot Gedolot. Synchronisation parfaite entre la Guemara et les commentaires d'une page à l'autre, sans débordement erroné.", + f5_title: "Prépresse natif ISO 15930", + f5_desc: "Export direct en PDF/X-1a et PDF/X-4 avec 100 % K DeviceCMYK, profil Fogra 39, tons directs et traits de coupe. Tables /ToUnicode pour un texte vocalisé copiable.", + f6_title: "Résistance aux pannes : ACID WAL et .tok", + f6_desc: "Une base de données interne avec journalisation anticipée (write-ahead logging) pour un enregistrement automatique continu en arrière-plan sans perte de données, ainsi qu'un format de paquet officiel (.tok) basé sur une archive ZIP atomique protégée.", + + // Engineering + eng_pretitle: "Chapitre 6 : Transparence technique et données vérifiées", + eng_title: "Résultats de tests réels dans le dépôt", + eng_subtitle: "Pas de discours marketing creux — toutes les données ci-dessous ont été vérifiées dans le dépôt Rust de TypesetOK.", + eng_th_metric: "Indicateur technique / test", + eng_th_target: "Objectif d'architecture", + eng_th_result: "Résultat réel (vérifié)", + eng_th_status: "Statut", + eng_r1_name: "Tests unitaires du workspace", + eng_r1_target: "100 % de réussite sur les 7 crates", + eng_r1_result: "174 / 174 tests réussis", + eng_r2_name: "Contrôle qualité du code (Clippy)", + eng_r2_target: "0 avertissement avec l'option -D warnings", + eng_r2_result: "0 avertissement (build propre)", + eng_r3_name: "Formatage uniforme (rustfmt)", + eng_r3_target: "Passe intégralement cargo fmt --check", + eng_r3_result: "100 % conforme aux règles de style", + eng_r4_name: "Déterminisme bit à bit", + eng_r4_target: "SHA-256 identique d'une exécution à l'autre", + eng_r5_name: "Test de charge (stress test)", + eng_r5_target: "1 000 pages vocalisées consécutives", + eng_r5_result: "1 001 pages / 49 001 lignes en 3,1 s", + dev_pretitle: "Chapitre 7 : Développement, communauté et open source", + dev_title: "Un projet libre et ouvert pour la communauté de la composition", + dev_desc: "TypesetOK est né d'un besoin réel de l'imprimerie hébraïque et de l'édition rabbinique : un outil de composition moderne, fiable, rapide et libéré des verrous commerciaux d'un autre âge. Toute la recherche, les spécifications et le code du cœur sont publiés en toute transparence sur GitHub.", + dev_btn_github: "Dépôt sur GitHub", + dev_btn_issues: "Suggestions et signalement de bugs", + + // CTA + cta_title: "Prêt à faire passer votre composition à un autre niveau ? Téléchargez TypesetOK", + cta_desc: "Le logiciel est ouvert et gratuit. Téléchargez directement la version portable, sans installation, ou explorez le code source et la spécification technique.", + cta_btn_download: "Téléchargement direct (ZIP portable)", + cta_btn_github: "Voir sur GitHub", + cta_btn_spec: "Lire la spécification technique", + + // Footer + footer_desc: "Système de PAO open source. Recherche et développement modernes pour la typographie hébraïque avancée, les textes sacrés et les très gros documents.", + footer_nav_title: "Navigation", + footer_nav_download: "Télécharger", + footer_nav_arch: "Architecture et principes", + footer_nav_features: "Fonctions clés", + footer_std_title: "Normes", + footer_std_si: "Norme israélienne SI 6100", + footer_std_iso: "ISO 15930 (PDF/X-1a)", + footer_std_kp: "Algorithme Knuth-Plass", + footer_arch_report: "Rapport d'architecture", + footer_comm_title: "Communauté et code", + footer_github: "Dépôt GitHub", + footer_releases: "Versions (Releases)", + footer_issues: "Tickets et recherche", + footer_source: "Compiler depuis les sources", // A11y Panel - a11y_panel_title: "Options d'Accessibilité", - a11y_font_inc: "Agrandir le Texte (+)", - a11y_font_dec: "Réduire le Texte (-)", - a11y_contrast: "Contraste Élevé", - a11y_theme: "Thème (Jour / Nuit / Système)", - a11y_readable_font: "Police Lisible", - a11y_links: "Surligner les Liens", - a11y_headings: "Surligner les Titres", - a11y_big_cursor: "Grand Curseur", - a11y_motion: "Arrêter les Mouvements", - a11y_spacing: "Interligne Large", - a11y_letters: "Espacement des Lettres", - a11y_monochrome: "Nuances de Gris", - a11y_reset: "Réinitialiser les Options" + a11y_open: "Ouvrir le menu d'accessibilité", + a11y_menu_title: "Menu d'accessibilité", + a11y_close: "Fermer le menu d'accessibilité", + a11y_panel_title: "Menu d'accessibilité", + a11y_font_inc: "Agrandir le texte", + a11y_font_dec: "Réduire le texte", + a11y_contrast: "Contraste élevé", + a11y_theme: "Mode d'affichage", + a11y_readable_font: "Police simple et lisible", + a11y_links: "Surligner les liens", + a11y_headings: "Surligner les titres", + a11y_big_cursor: "Grand curseur", + a11y_motion: "Arrêter les animations", + a11y_spacing: "Interligne large", + a11y_letters: "Espacement des lettres", + a11y_monochrome: "Niveaux de gris", + a11y_reset: "Réinitialiser l'accessibilité", + + // Floating widget + float_sub: "Version portable, sans installation", + float_title: "Télécharger maintenant", + float_btn: "Téléchargement gratuit", + + // Modals + source_modal_title: "Lancer les tests depuis le code source (moteur Rust)", + source_modal_intro: "TypesetOK est en phase de développement du cœur (Core Engine). Développeurs et chercheurs sont invités à cloner le dépôt et à exécuter la suite de tests officielle :", + source_modal_req: "Prérequis : Rust 1.85+ avec l'outil officiel Cargo.", + arch_modal_title: "Rapport d'architecture technique : TypesetOK (TOK)", + arch_principles: "Principes fondamentaux de l'architecture", + arch_p1: "1. Indépendance totale du modèle de document (TDM) : le modèle de document est entièrement découplé du DOM, des balises HTML et des règles CSS du navigateur. Toutes les structures sémantiques sont écrites en Rust pur.", + arch_p2: "2. Principe de prépagination : le moteur d'interface n'a pas le droit de deviner les sauts de page ni la répartition des colonnes. Le cœur Rust effectue tous les calculs Knuth-Plass et transmet des pages déjà paginées.", + arch_p3: "3. Double chaîne PDF : une couche d'affichage à l'écran rapide et maîtrisée, à côté d'une chaîne prépresse native en Rust totalement indépendante qui produit des PDF/X-1a conformes avec noir 100 % K et BleedBox de 3 mm.", + arch_p4: "4. Couche de curseur virtuel : contourne les défaillances intrinsèques de contenteditable dans les navigateurs grâce à une couche Canvas transparente et un curseur virtuel.", + arch_p5: "5. Prise en charge native des très gros documents : algorithme de pagination incrémentale par convergence (Convergence Pagination) et virtualisation complète limitée à 3 pages actives.", + arch_compare: "Comparaison avec les systèmes existants :
InDesign (correctif RTL lourd et lent) | Affinity Publisher (0 % de prise en charge de l'hébreu) | Tag (ancien logiciel monolithique des années 90) | Typst (code/markup uniquement, sans édition visuelle de bureau)." } }; +const TOK_DEFAULT_LANG = 'he'; +const TOK_STORAGE_KEY = 'tok_lang'; +const TOK_LOCALES = { he: 'he_IL', en: 'en_US', es: 'es_ES', fr: 'fr_FR' }; +// Only these attributes may be translated through data-i18n-attr. +const TOK_ATTR_WHITELIST = ['aria-label', 'aria-description', 'title', 'alt', 'placeholder']; + +function tokIsLang(lang) { + return typeof lang === 'string' && Object.prototype.hasOwnProperty.call(TOK_TRANSLATIONS, lang); +} + +// localStorage throws in some privacy modes / sandboxed frames. +function tokStorageGet(key) { + try { + return window.localStorage.getItem(key); + } catch (e) { + return null; + } +} + +function tokStorageSet(key, value) { + try { + window.localStorage.setItem(key, value); + } catch (e) { + // ignore + } +} + +function tokLangFromUrl() { + try { + const raw = new URLSearchParams(window.location.search).get('lang'); + if (raw) { + const lang = raw.trim().toLowerCase(); + if (tokIsLang(lang)) return lang; + } + } catch (e) { + // ignore + } + return null; +} + +// Priority: ?lang=xx (hreflang alternates) > saved preference > Hebrew. +function tokInitialLang() { + const fromUrl = tokLangFromUrl(); + if (fromUrl) return fromUrl; + const saved = tokStorageGet(TOK_STORAGE_KEY); + if (tokIsLang(saved)) return saved; + return TOK_DEFAULT_LANG; +} + +let tokCurrentLang = tokInitialLang(); + +function tokLookup(lang, key) { + const table = TOK_TRANSLATIONS[lang]; + if (table && Object.prototype.hasOwnProperty.call(table, key)) return table[key]; + return undefined; +} + /** - * Initializes and switches the application language. + * Translate a key for the current language (used by scripts that write text at runtime). + * Falls back to Hebrew, then to the given fallback, then to the key itself. */ -function setAppLanguage(lang) { - if (!TOK_TRANSLATIONS[lang]) lang = 'he'; - - localStorage.setItem('tok_lang', lang); - document.documentElement.lang = lang; - - // RTL for Hebrew, LTR for English, Spanish, French - const isRtl = lang === 'he'; - document.documentElement.dir = isRtl ? 'rtl' : 'ltr'; +function tokT(key, fallback) { + let value = tokLookup(tokCurrentLang, key); + if (value === undefined) value = tokLookup(TOK_DEFAULT_LANG, key); + if (value === undefined) value = fallback !== undefined ? fallback : key; + return value; +} - const strings = TOK_TRANSLATIONS[lang]; +// The Hebrew authored in index.html is the source of truth for 'he' and the +// fallback for any key missing in another language, so it is captured once. +const tokOriginalText = new WeakMap(); +const tokOriginalHtml = new WeakMap(); +const tokOriginalAttrs = new WeakMap(); +let tokOriginalHead = null; - // Update text nodes - document.querySelectorAll('[data-i18n]').forEach(el => { - const key = el.getAttribute('data-i18n'); - if (strings[key]) { - el.textContent = strings[key]; +function tokPick(lang, key, original) { + const value = tokLookup(lang, key); + return value !== undefined ? value : original; +} + +function tokParseAttrSpec(spec) { + const pairs = []; + (spec || '').split(';').forEach(part => { + const idx = part.indexOf(':'); + if (idx < 1) return; + const attr = part.slice(0, idx).trim().toLowerCase(); + const key = part.slice(idx + 1).trim(); + if (key && TOK_ATTR_WHITELIST.indexOf(attr) !== -1) pairs.push([attr, key]); + }); + return pairs; +} + +function tokApplyHead(lang) { + const desc = document.querySelector('meta[name="description"]'); + const canonical = document.querySelector('link[rel="canonical"]'); + if (!tokOriginalHead) { + tokOriginalHead = { + title: document.title, + description: desc ? desc.getAttribute('content') : null, + canonical: canonical ? canonical.getAttribute('href') : null + }; + } + + document.title = tokPick(lang, 'meta_title', tokOriginalHead.title); + + if (desc && tokOriginalHead.description !== null) { + desc.setAttribute('content', tokPick(lang, 'meta_description', tokOriginalHead.description)); + } + + if (canonical && tokOriginalHead.canonical) { + try { + const url = new URL(tokOriginalHead.canonical, window.location.href); + url.searchParams.delete('lang'); + if (lang !== TOK_DEFAULT_LANG) url.searchParams.set('lang', lang); + canonical.setAttribute('href', url.toString()); + } catch (e) { + // ignore malformed canonical + } + } + + const ogLocale = document.querySelector('meta[property="og:locale"]'); + if (ogLocale && TOK_LOCALES[lang]) ogLocale.setAttribute('content', TOK_LOCALES[lang]); + + const alternates = document.querySelectorAll('meta[property="og:locale:alternate"]'); + const others = Object.keys(TOK_LOCALES).filter(l => l !== lang).map(l => TOK_LOCALES[l]); + if (alternates.length === others.length) { + alternates.forEach((meta, i) => meta.setAttribute('content', others[i])); + } +} + +// Labels that other scripts set according to UI state. +function tokRefreshDynamicLabels() { + const themeBtn = document.getElementById('toggleThemeBtn'); + const mode = document.documentElement.getAttribute('data-theme-setting'); + if (themeBtn && ['light', 'dark', 'system'].indexOf(mode) !== -1) { + const label = tokT('theme_label_' + mode); + themeBtn.setAttribute('aria-label', label); + themeBtn.setAttribute('title', label); + } + + const menuBtn = document.getElementById('mobileNavToggle'); + if (menuBtn) { + const open = menuBtn.getAttribute('aria-expanded') === 'true'; + menuBtn.setAttribute('aria-label', tokT(open ? 'menu_close' : 'menu_open')); + } +} + +function tokSyncUrl(lang) { + try { + const url = new URL(window.location.href); + if (lang === TOK_DEFAULT_LANG) { + url.searchParams.delete('lang'); + } else { + url.searchParams.set('lang', lang); } + const next = url.pathname + url.search + url.hash; + const current = window.location.pathname + window.location.search + window.location.hash; + if (next !== current) window.history.replaceState(window.history.state, '', next); + } catch (e) { + // file:// or sandboxed frames may refuse replaceState + } +} + +/** + * Switches the page language. Options: { updateUrl: boolean } (default true). + */ +function setAppLanguage(lang, options) { + if (!tokIsLang(lang)) lang = TOK_DEFAULT_LANG; + const updateUrl = !options || options.updateUrl !== false; + + tokCurrentLang = lang; + tokStorageSet(TOK_STORAGE_KEY, lang); + + const root = document.documentElement; + root.lang = lang; + // RTL for Hebrew, LTR for English, Spanish, French + root.dir = lang === 'he' ? 'rtl' : 'ltr'; + + document.querySelectorAll('[data-i18n]').forEach(el => { + if (!tokOriginalText.has(el)) tokOriginalText.set(el, el.textContent); + const value = tokPick(lang, el.getAttribute('data-i18n'), tokOriginalText.get(el)); + if (el.textContent !== value) el.textContent = value; }); - // Update HTML nodes + // Values are constant strings from TOK_TRANSLATIONS only (never user/URL input). document.querySelectorAll('[data-i18n-html]').forEach(el => { - const key = el.getAttribute('data-i18n-html'); - if (strings[key]) { - el.innerHTML = strings[key]; + if (!tokOriginalHtml.has(el)) tokOriginalHtml.set(el, el.innerHTML); + const value = tokPick(lang, el.getAttribute('data-i18n-html'), tokOriginalHtml.get(el)); + if (el.innerHTML !== value) el.innerHTML = value; + }); + + document.querySelectorAll('[data-i18n-attr]').forEach(el => { + const pairs = tokParseAttrSpec(el.getAttribute('data-i18n-attr')); + let originals = tokOriginalAttrs.get(el); + if (!originals) { + originals = {}; + pairs.forEach(([attr]) => { originals[attr] = el.getAttribute(attr); }); + tokOriginalAttrs.set(el, originals); } + pairs.forEach(([attr, key]) => { + const value = tokPick(lang, key, originals[attr]); + if (value === null || value === undefined) { + el.removeAttribute(attr); + } else { + el.setAttribute(attr, value); + } + }); }); - // Update language switcher active state + tokApplyHead(lang); + tokRefreshDynamicLabels(); + document.querySelectorAll('.lang-btn').forEach(btn => { const active = btn.getAttribute('data-lang') === lang; btn.classList.toggle('active', active); btn.setAttribute('aria-pressed', active ? 'true' : 'false'); }); + + if (updateUrl) tokSyncUrl(lang); + + try { + document.dispatchEvent(new CustomEvent('tok:languagechange', { detail: { lang: lang } })); + } catch (e) { + // ignore + } } -document.addEventListener('DOMContentLoaded', () => { - const savedLang = localStorage.getItem('tok_lang') || 'he'; - setAppLanguage(savedLang); +window.tokT = tokT; +window.TOK_I18N = { + t: tokT, + setLanguage: setAppLanguage, + getLanguage: () => tokCurrentLang, + languages: Object.keys(TOK_TRANSLATIONS) +}; + +function tokInitI18n() { + setAppLanguage(tokCurrentLang, { updateUrl: false }); document.querySelectorAll('.lang-btn').forEach(btn => { btn.addEventListener('click', (e) => { e.preventDefault(); - const lang = btn.getAttribute('data-lang'); - setAppLanguage(lang); + setAppLanguage(btn.getAttribute('data-lang')); }); }); -}); +} + +// Deferred script: the DOM is already parsed, so apply before first paint where possible. +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', tokInitI18n); +} else { + tokInitI18n(); +} diff --git a/index.html b/index.html index c224732..021c224 100644 --- a/index.html +++ b/index.html @@ -3,21 +3,20 @@ + + - TypesetOK (TOK) — תוכנת עימוד שולחנית מקצועית בקוד פתוח | DTP System for Hebrew Typography, Talmud & Pre-Press - + TypesetOK — תוכנת עימוד ספרים מקצועית לעברית, בקוד פתוח - - - + @@ -29,7 +28,9 @@ - + + + @@ -37,15 +38,15 @@ - - - - - + + + + + - + @@ -53,7 +54,7 @@ - + @@ -61,6 +62,7 @@ +