From cac98c781487d56d43e2d9e971e2e508a41caf87 Mon Sep 17 00:00:00 2001
From: OKAN TIKTAS <346542017+OKAN-SOFTWARE@users.noreply.github.com>
Date: Sun, 8 Nov 2026 06:44:03 -0500
Subject: [PATCH 1/6] feat: adopt approved Doc2FAQ retro design across homepage
and demo
---
.github/workflows/ci.yml | 10 +++-
.gitignore | 1 +
CHANGELOG.md | 3 ++
README.md | 2 +-
docs/DESIGN-SYSTEM.md | 52 ++++++++++++++++++
docs/RELEASING.md | 4 +-
docs/WEB-DEMO.md | 12 +++--
scripts/build-web-demo.mjs | 15 +++---
scripts/build-website.mjs | 31 +++++++++++
scripts/verify-website-build.mjs | 26 +++++++++
src/main/resources/static/index.html | 15 ++++--
src/main/resources/static/retro.css | 22 ++++++++
website/index.html | 81 ++++++++++++++++++++++++++++
website/styles.css | 13 +++++
14 files changed, 265 insertions(+), 22 deletions(-)
create mode 100644 docs/DESIGN-SYSTEM.md
create mode 100644 scripts/build-website.mjs
create mode 100644 scripts/verify-website-build.mjs
create mode 100644 src/main/resources/static/retro.css
create mode 100644 website/index.html
create mode 100644 website/styles.css
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b95506f..09890de 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -36,6 +36,12 @@ jobs:
if: matrix.java == '21'
run: node --test src/test/js/*.test.cjs
- - name: Build static browser demo
+ - name: Build approved homepage and static browser demo
if: matrix.java == '21'
- run: node scripts/build-web-demo.mjs
+ run: |
+ node scripts/build-website.mjs
+ test -f website-dist/index.html
+ test -f website-dist/styles.css
+ test -f website-dist/demo/index.html
+ test -f website-dist/demo/retro.css
+ node scripts/verify-website-build.mjs
diff --git a/.gitignore b/.gitignore
index 845489f..03558a5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,4 @@ Thumbs.db
# Generated browser demo (built from tracked sources)
/demo-dist/
+/website-dist/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f0dc685..0e05583 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ All notable Doc2FAQ changes are recorded here. Version numbers follow semantic v
### Added
- Browser PDF/Word (.docx) import and paginated export with local processing, PDF page/file/text limits, bounded DOCX XML decompression, optional references, and clear unsupported-file/font errors.
- Browser-only website demo built from the shared frontend, with simplified text drafting, explicit PDF/Word limitations, homepage navigation, and text exports.
+- Approved Doc2FAQ landing page and matching browser/Java workbench theme, with original document mascot, responsive cards, reduced-motion support, and a reproducible `website-dist/` build.
- Source & Review user guide and current documentation for development builds, schema compatibility, and v0.5.0 release preparation.
- Read-only source viewer highlighting the selected FAQ's exact original passages, with a stacked layout on narrow screens.
- Per-FAQ Needs review / Approved status, persisted in saved projects and optional browser autosave.
@@ -16,6 +17,8 @@ All notable Doc2FAQ changes are recorded here. Version numbers follow semantic v
- Editing questions or answers and merging FAQs reset approval; incomplete FAQs cannot be approved.
- Project schema 2 stores review status and upgrades schema-1 projects with Needs review defaults. Older application versions reject schema-2 files instead of silently discarding approval state.
- Filters affect only the review list; saving, export preview, and all export formats retain every FAQ in draft order.
+- Export formats now open with PDF first and Word (.docx) second; the default download name uses `.pdf`.
+- GitHub Actions now uses Node 24-based checkout/setup-java actions and pins Ubuntu 24.04 to avoid runner-label migration notices.
- Release-candidate source version is 0.5.0; v0.4.0 remains the published release until the new artifacts are validated and released.
## 0.4.0 — 2026-10-29
diff --git a/README.md b/README.md
index b3c9f1d..26b58f9 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ The document placeholder now uses neutral Q&A prompts, and Generate Mode's sampl
## Try it in your browser
-[Open the interactive browser demo](https://okantiktas.com/projects/doc2faq/) · [Source & Review user guide](docs/USER-GUIDE.md) · [Demo capabilities and deployment](docs/WEB-DEMO.md)
+[Doc2FAQ homepage](https://okantiktas.com/projects/doc2faq/) · [Try the interactive browser demo](https://okantiktas.com/projects/doc2faq/demo/) · [Source & Review user guide](docs/USER-GUIDE.md) · [Demo capabilities and deployment](docs/WEB-DEMO.md) · [Approved design system](docs/DESIGN-SYSTEM.md)
The demo processes pasted text and TXT/Markdown in your browser, using simplified rules. Try both drafting modes, source highlighting, editing, approval status, duplicate review, search/filters, saved projects, and Markdown/JSON/HTML exports. PDF/Word (.docx) import and export also run locally in the browser; PDF uploads are limited to 5 MB and 50 pages, and DOCX to 5 MB. Scanned PDFs need external OCR. The demo does not run a Java backend and its drafting rules remain simplified. Document libraries load from a version-pinned CDN when needed; document content is not uploaded. Browser PDF export uses standard Latin fonts and suggests Word when a character cannot be represented. The development demo may include features newer than the latest release download.
diff --git a/docs/DESIGN-SYSTEM.md b/docs/DESIGN-SYSTEM.md
new file mode 100644
index 0000000..9b9bfdf
--- /dev/null
+++ b/docs/DESIGN-SYSTEM.md
@@ -0,0 +1,52 @@
+# Doc2FAQ design system — approved November 2026
+
+Doc2FAQ uses the light, playful **paper-and-answers** visual identity for its
+product homepage, hosted browser demo, and local Java workspace. This direction
+was approved by project owner Okan Tiktas for future versions of Doc2FAQ.
+
+## Principles
+
+1. A friendly original document mascot (not another project's copyrighted logo).
+2. Warm cream and cool off-white backgrounds, ink-dark outlines, offset shadows.
+3. Coral for primary actions, yellow for highlights, mint for positive states.
+4. Oversized, confident headings; concise, accessible helper text.
+5. Direct workflow: import → generate/extract → review → export.
+6. Real functionality first: responsive controls, visible keyboard focus,
+ sufficient text contrast, and reduced-motion support.
+
+## Palette
+
+| Token | Hex | Usage |
+| --- | --- | --- |
+| Ink | `#202b34` | Text, outlines and offset shadows |
+| Cool paper | `#f0f3f1` | Page background |
+| Warm paper | `#fffefa` | Panels and inputs |
+| Coral | `#f7a088` | Main actions and emphasis |
+| Yellow | `#f8d77b` | Badges and hero art |
+| Mint | `#a8d6c8` | Review and success accents |
+
+The homepage source is `website/`; the Java app's theme override is
+`src/main/resources/static/retro.css`. The generated browser demo reuses the
+same stylesheet. Keep the HTML fields/IDs and JavaScript adapters aligned so
+styling changes cannot break document import, FAQ review or PDF/DOCX export.
+
+Do not copy Shepherd.js logos, illustration assets, text, or code; Doc2FAQ's
+visuals and mascot are original work inspired only by the broad illustrated,
+outlined presentation style.
+
+## Local build
+
+```sh
+node scripts/build-website.mjs
+node scripts/verify-website-build.mjs
+```
+
+This produces ignored `website-dist/` with:
+
+- `index.html` — marketing/product homepage
+- `styles.css` — homepage design tokens and components
+- `demo/` — fully interactive browser demo generated from shared app sources
+
+Upload **the contents** of `website-dist/` to `/projects/doc2faq/` on the
+portfolio host. Leave the rest of the portfolio intact. The root homepage and
+demo use relative URLs to work under the `/projects/doc2faq/` subdirectory.
diff --git a/docs/RELEASING.md b/docs/RELEASING.md
index 03623c9..bcc0ed8 100644
--- a/docs/RELEASING.md
+++ b/docs/RELEASING.md
@@ -9,7 +9,7 @@ Use JDK 21+, Maven 3.6.3+, and Node.js. CI compiles the application for Java 21
```cmd
mvn -B -ntp clean verify
node --test src/test/js/*.test.cjs
-node scripts/build-web-demo.mjs
+node scripts/build-website.mjs
java -jar target/doc2faq-0.5.0.jar
```
@@ -48,7 +48,7 @@ GitHub Actions runs this smoke check on every push/PR. On Windows without Bash,
git rev-parse HEAD
mvn -B -ntp clean verify
node --test src/test/js/*.test.cjs
- node scripts/build-web-demo.mjs
+ node scripts/build-website.mjs
java -jar target/doc2faq-0.5.0.jar
```
diff --git a/docs/WEB-DEMO.md b/docs/WEB-DEMO.md
index 57d8522..3080895 100644
--- a/docs/WEB-DEMO.md
+++ b/docs/WEB-DEMO.md
@@ -1,6 +1,6 @@
# Browser demo and website deployment
-The public-facing route is `https://okantiktas.com/projects/doc2faq/`. The portfolio's existing singular convention, `/project/doc2faq/`, redirects to it. The homepage's Doc2FAQ card links to the interactive demo.
+The public-facing homepage route is `https://okantiktas.com/projects/doc2faq/`. Its **interactive demo** lives at `https://okantiktas.com/projects/doc2faq/demo/`. The portfolio's existing singular convention, `/project/doc2faq/`, redirects to the product homepage. The approved light, outlined, illustrated design is documented in [DESIGN-SYSTEM.md](DESIGN-SYSTEM.md).
## What visitors can try
@@ -26,18 +26,20 @@ Run from the repository root with Node.js:
```sh
node --test src/test/js/*.test.cjs
-node scripts/build-web-demo.mjs
+node scripts/build-website.mjs
```
-The builder creates ignored `demo-dist/` from the actual app frontend, shared project validator, stylesheet, and background. It replaces backend requests with the browser-only adapter in `web-demo/engine.js`, routes document import and binary export through `web-demo/documents.js`, keeps PDF/Word options available, uses relative asset paths with content-hash cache versions, fills the source-build version, and adds demo disclosure and homepage/source/download links. It does not modify the Java application's served UI.
+The builder creates ignored `demo-dist/` from the actual app frontend, shared project validator, stylesheet, and background. It replaces backend requests with the browser-only adapter in `web-demo/engine.js`, routes document import and binary export through `web-demo/documents.js`, keeps PDF/Word options available, uses relative asset paths with content-hash cache versions, fills the source-build version, and adds demo disclosure and homepage/source/download links. The approved retro theme also styles the Java application's UI without changing its JavaScript behavior.
-Copy the complete contents of `demo-dist/` into `projects/doc2faq/` in the private `OKAN-SOFTWARE/okantiktas.com` repository. Preserve relative filenames. Update the Doc2FAQ homepage card to the demo route. Keep `/project/doc2faq/index.html` as a redirect with a visible fallback link. Do not replace the rest of the portfolio or its activity scripts.
+The `build-website.mjs` step then creates ignored `website-dist/` containing the approved **Doc2FAQ marketing homepage** and the working, equally styled `demo/` subdirectory. It rewrites navigation to relative URLs that are valid under `/projects/doc2faq/`.
+
+Copy the complete contents of **`website-dist/`** into `projects/doc2faq/` in the private `OKAN-SOFTWARE/okantiktas.com` repository. Preserve the `demo/` subdirectory and relative filenames. The Doc2FAQ homepage card may link to the new product homepage. Keep `/project/doc2faq/index.html` as a redirect with a visible fallback link. Do not replace the rest of the portfolio or its activity scripts.
The portfolio is hosted through its existing GitHub-main → Hostinger deployment. Pushing source and observing a live deployment are separate steps: verify the actual custom-domain route after deployment before reporting it live. Do not deploy the full Java app to static hosting or change DNS to add this subdirectory.
## Verify before publishing
-- Both demo routes resolve; homepage, source, and download links work.
+- Both homepage routes and the `/projects/doc2faq/demo/` application resolve; source, download and return links work.
- Examples and pasted TXT/Markdown work in both modes; text source references match exactly.
- Source highlights remain stable while typing, including on mobile.
- Approvals persist after save/open and optional autosave/reload; edits/merges reset approval.
diff --git a/scripts/build-web-demo.mjs b/scripts/build-web-demo.mjs
index 43f5756..18c5280 100644
--- a/scripts/build-web-demo.mjs
+++ b/scripts/build-web-demo.mjs
@@ -12,21 +12,22 @@ let html = await readFile(path.join(source, 'index.html'), 'utf8');
html = html.replaceAll('@project.version@', version)
.replace('content="Doc2FAQ extracts existing Q&A or builds source-grounded FAQ suggestions from TXT, Markdown, PDF, and DOCX. Review, edit, and export."', 'content="Try Doc2FAQ in your browser: draft FAQs from text, inspect sources, edit, approve, and export."')
.replaceAll('href="/styles.css"', 'href="./styles.css"')
+ .replaceAll('href="/retro.css"', 'href="./retro.css"')
.replaceAll('src="/project.js"', 'src="./project.js"')
.replace('src="/app.js"', 'src="./app.js"')
.replace('src="/background.js"', 'src="./background.js"')
.replace('\n \n
@@ -19,14 +23,15 @@
D✳Doc2FAQ
- PREVIEW · LOCAL WORKSPACE
+
+ LOCAL JAVA WORKSPACE
-
DOCUMENT INTELLIGENCE / PREVIEW @project.version@
-
Turn long documents into clear answers.
+
✳ WELCOME TO DOC2FAQ / @project.version@
+
LET’S TURN PAGES INTO ANSWERS.
Extract questions already in your document or turn ordinary sections into source-grounded FAQ suggestions. Review, edit, and export your draft.
+
+
+
+
diff --git a/website/styles.css b/website/styles.css
new file mode 100644
index 0000000..6fc6c7d
--- /dev/null
+++ b/website/styles.css
@@ -0,0 +1,13 @@
+:root{--ink:#202b34;--paper:#f0f3f1;--cream:#fffcf5;--coral:#f7a088;--yellow:#f8d77b;--mint:#a8d6c8;--white:#fffefa;--border:3px solid var(--ink);font-family:'DM Sans',system-ui,sans-serif;color:var(--ink);background:var(--paper)}
+*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;overflow-x:hidden}a{color:inherit;text-decoration:none}button,input{font:inherit}a:focus-visible{outline:4px solid #b65c37;outline-offset:5px}.shell{max-width:1290px;width:calc(100% - 80px);margin-inline:auto}
+.announcement{display:flex;align-items:center;justify-content:center;gap:12px;padding:10px 16px;background:var(--ink);color:#f8faf7;font-size:12px;font-weight:700;letter-spacing:.025em;text-align:center}.live-dot{width:9px;height:9px;background:#a4e7ae;border-radius:50%;box-shadow:0 0 0 4px #a4e7ae23}.announcement-sticker{color:var(--yellow);font-weight:900;letter-spacing:.1em}
+.site-nav{height:102px;display:flex;align-items:center;justify-content:space-between;gap:26px;border-bottom:2px solid #273039}.logo{display:inline-flex;align-items:center;gap:3px;flex-shrink:0;font-family:'Space Grotesk',sans-serif;font-weight:700;font-size:29px;letter-spacing:-.07em}.logo>span:not(.logo-page){color:#e8836f}.logo .logo-period{color:var(--ink)!important}.logo-page{position:relative;display:grid;place-items:center;width:36px;height:43px;border:3px solid var(--ink);border-radius:5px 11px 5px 5px;transform:rotate(-9deg);margin-right:10px;background:var(--yellow);box-shadow:3px 3px 0 var(--ink)}.logo-page span{font-size:23px;line-height:1;transform:rotate(9deg)}.nav-links{display:flex;gap:36px;align-items:center;font-size:14px;font-weight:800}.nav-links a:hover{text-decoration:underline;text-underline-offset:5px}.nav-cta{border:var(--border);background:var(--yellow);box-shadow:4px 5px 0 var(--ink);border-radius:9px;padding:13px 19px;font-size:12px;font-weight:900;white-space:nowrap;letter-spacing:.02em;transition:transform .18s,box-shadow .18s}.nav-cta:hover{transform:translate(2px,2px);box-shadow:2px 3px 0 var(--ink)}
+.hero{position:relative;text-align:center;min-height:755px;padding-top:38px;padding-bottom:90px}.hero-inner{position:relative;z-index:1}.mascot-zone{height:224px;position:relative;width:min(100%,380px);margin:0 auto}.mascot{display:block;width:250px;height:214px;margin:0 auto;filter:drop-shadow(10px 12px 0 #b7d5cd);animation:bounce 4.6s ease-in-out infinite}.mascot-speech{position:absolute;font-size:10px;letter-spacing:.1em;font-weight:900;top:42px;right:-31px;transform:rotate(13deg);border:2px solid var(--ink);border-radius:99px;padding:8px 13px;background:var(--cream);box-shadow:3px 3px 0 var(--ink)}.sketch-star{position:absolute;color:var(--ink);font-size:40px}.star-one{top:35px;left:5px;transform:rotate(-22deg)}.star-two{right:8px;bottom:30px;color:#ec9b79;font-size:34px}.hero-eyebrow,.section-kicker{display:flex;gap:16px;justify-content:center;align-items:center;font-size:12px;font-weight:900;letter-spacing:.19em}.eyebrow-rule{display:block;width:24px;height:3px;background:var(--ink)}.hero-title{font-size:clamp(78px,13.8vw,200px);letter-spacing:-.094em;line-height:1;margin:-7px 0 0;padding-right:.08em;font-family:'Space Grotesk',sans-serif;font-weight:700;color:#f6f8f7;-webkit-text-stroke:5px var(--ink);paint-order:stroke fill;text-shadow:5px 5px 0 var(--ink),9px 9px 0 var(--ink),13px 13px 0 var(--ink)}.hero-title span{color:var(--coral)}.hero-title .period{color:var(--yellow)}.hero-lede{font-size:clamp(23px,3vw,41px);font-weight:900;letter-spacing:-.06em;margin:37px 0 9px;line-height:1.14}.hero-lede em{font-style:normal;color:#e87e66}.hero-copy{font-size:17px;line-height:1.65;max-width:710px;margin:0 auto 29px;color:#49555e}.hero-buttons{display:flex;align-items:center;justify-content:center;gap:17px;flex-wrap:wrap}.comic-button{display:inline-flex;align-items:center;justify-content:center;gap:30px;padding:17px 24px;min-height:60px;border:var(--border);border-radius:9px;font-size:13px;font-weight:900;letter-spacing:.02em;box-shadow:5px 6px 0 var(--ink);transition:transform .18s,box-shadow .18s}.comic-button:hover{transform:translate(2px,3px);box-shadow:3px 3px 0 var(--ink)}.comic-button span:last-child{font-size:23px;line-height:0}.comic-button.primary{background:var(--coral)}.comic-button.light,.comic-button.cream{background:var(--cream)}.hero-footnote{margin:27px auto 0;display:flex;align-items:center;justify-content:center;gap:12px;font-size:12px;font-weight:700;color:#59646b}.mini-check{font-size:14px;background:#9dd6c2;border:2px solid var(--ink);width:22px;height:22px;border-radius:50%;display:inline-grid;place-items:center;color:var(--ink)}.interpunct{font-weight:900}.hero-bottom-doodle{position:absolute;right:12px;bottom:19px;color:#e28f7d;letter-spacing:10px;font-size:20px;transform:rotate(18deg)}
+.how-it-works{padding:90px 0 120px;border-top:var(--border);border-bottom:var(--border);background:#fffdf6}.section-head{display:flex;align-items:end;justify-content:space-between;gap:55px;margin-bottom:43px}.section-head .section-kicker,.peek-copy .section-kicker{display:block;letter-spacing:.14em;font-size:11px;margin:0 0 18px;color:#bd5d4d}.section-head h2,.peek-copy h2{font-weight:900;letter-spacing:-.075em;line-height:1.08;font-size:clamp(42px,5.5vw,73px);margin:0}.section-head h2 span{color:#e58c72}.section-head>p{font-size:17px;line-height:1.7;color:#56626b;max-width:345px;margin:0 0 6px}.feature-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:30px}.feature-card{border:var(--border);border-radius:12px;box-shadow:8px 9px 0 var(--ink);overflow:hidden;transition:transform .23s,box-shadow .23s}.feature-card:hover{transform:translateY(-5px);box-shadow:8px 14px 0 var(--ink)}.feature-illustration{position:relative;height:226px;display:grid;place-items:center;border-bottom:var(--border)}.feature-card.pink .feature-illustration{background:#f9c4b6}.feature-card.yellow .feature-illustration{background:#f8dd8c}.feature-card.mint .feature-illustration{background:#addccf}.feature-illustration svg{width:235px;max-width:90%;height:auto;filter:drop-shadow(2px 4px 0 #202b3428)}.feature-number{position:absolute;top:16px;left:18px;border:2px solid var(--ink);padding:5px 8px;border-radius:5px;background:#fffcf5;font-size:11px;font-weight:900;box-shadow:2px 2px 0 var(--ink)}.feature-content{min-height:217px;position:relative;padding:28px 27px;background:var(--white)}.feature-content h3{font-size:22px;line-height:1.1;font-weight:900;letter-spacing:-.05em;margin:0 0 14px}.feature-content p{font-size:14px;line-height:1.65;margin:0;max-width:280px;color:#535e66}.feature-arrow{position:absolute;bottom:20px;right:21px;font-size:24px}
+.peek-section{padding-top:135px;padding-bottom:145px}.peek-top{display:flex;justify-content:space-between;align-items:center;margin:0 15px 26px}.scribble{font-size:14px;letter-spacing:.13em;font-weight:900;transform:rotate(-5deg)}.sticker{position:relative;transform:rotate(7deg);border:var(--border);border-radius:50%;width:104px;height:104px;display:grid;place-items:center;text-align:center;font-weight:900;font-size:13px;line-height:1.15;letter-spacing:.04em;background:var(--yellow);box-shadow:5px 5px 0 var(--ink)}.sticker span{position:absolute;bottom:16px;font-size:18px}.peek-grid{display:grid;grid-template-columns:.87fr 1.13fr;gap:65px;align-items:center}.peek-copy h2{font-size:clamp(42px,4.4vw,64px)}.peek-copy h2 span{color:#dc8a71}.peek-copy>p:not(.section-kicker){font-size:16px;line-height:1.75;max-width:510px;color:#56616a;margin:25px 0}.peek-copy ul{list-style:none;padding:0;margin:0 0 32px;display:grid;gap:15px;font-size:15px;font-weight:800}.peek-copy li{display:flex;align-items:center;gap:12px}.peek-copy li span{width:28px;height:28px;border:2px solid var(--ink);border-radius:50%;background:var(--mint);display:grid;place-items:center;font-weight:900}.window-wrap{position:relative;transform:rotate(2deg);padding:10px}.window-wrap:before{content:'';position:absolute;inset:40px -8px -7px 40px;background:var(--coral);border:var(--border);border-radius:16px;transform:rotate(3deg)}.window{position:relative;border:var(--border);border-radius:15px;background:var(--cream);box-shadow:12px 15px 0 var(--ink);overflow:hidden}.window-bar{height:58px;padding:0 18px;display:flex;align-items:center;justify-content:space-between;border-bottom:var(--border);background:var(--yellow);font-size:13px;font-weight:900;letter-spacing:.04em}.dots{display:flex;gap:6px}.dots span{width:12px;height:12px;border:2px solid var(--ink);background:var(--coral);border-radius:50%}.dots span:nth-child(2){background:#fff9e3}.dots span:nth-child(3){background:var(--mint)}.window-body{padding:24px;display:grid;grid-template-columns:1fr 1fr;gap:14px}.fake-panel{min-height:320px;border:2px solid var(--ink);background:#fff;padding:17px 13px;border-radius:7px;min-width:0}.fake-label{font-size:10px;font-weight:900;letter-spacing:.07em}.fake-doc{margin:25px 2px 28px}.fake-doc-line{width:82%;height:10px;background:#dfe6e4;margin-bottom:14px;border-radius:5px}.fake-doc-line.long{width:100%}.fake-doc-line.mid{width:70%}.fake-doc-line.short{width:44%}.fake-action{padding:11px 6px;text-align:center;background:var(--coral);border:2px solid var(--ink);border-radius:6px;font-size:10px;font-weight:900;box-shadow:3px 3px 0 var(--ink)}.fake-faq{display:flex;align-items:center;gap:8px;padding:15px 7px;margin-top:17px;background:#e4f5ee;border:2px solid var(--ink);border-radius:6px;font-size:10px;font-weight:800}.fake-faq.second{margin-top:8px;background:#fff4cb}.fake-faq b{font-size:20px}.fake-export{margin-top:22px;font-size:11px;font-weight:900}.fake-export span{margin-left:5px;padding:6px;background:#ecefeb;border:1px solid #cad0cc;border-radius:3px}
+.bottom-cta{background:var(--coral);border-top:var(--border);border-bottom:var(--border)}.bottom-cta-inner{min-height:475px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;position:relative;padding:75px 0}.bottom-cta h2{font-size:clamp(46px,6vw,88px);letter-spacing:-.08em;line-height:1.04;margin:0;font-weight:900}.bottom-cta h2 em{font-style:normal;color:#fffcf4;text-shadow:3px 3px 0 var(--ink),-2px -2px 0 var(--ink);-webkit-text-stroke:2px var(--ink);paint-order:stroke fill}.bottom-cta p{font-size:16px;margin:25px auto 32px;max-width:460px;line-height:1.6}.cta-star{position:absolute;top:65px;left:45px;font-size:57px}.cta-star.end{top:auto;left:auto;right:43px;bottom:62px;font-size:35px}.footer{display:grid;grid-template-columns:1fr 1fr;gap:30px;padding-top:62px;padding-bottom:30px}.footer>div:first-child>p{font-size:14px;color:#606d75}.footer-links{display:flex;justify-content:flex-end;gap:24px;flex-wrap:wrap;align-items:start;font-size:13px;font-weight:800;padding-top:15px}.footer-links a:hover{text-decoration:underline}.copyright{grid-column:1/-1;display:flex;justify-content:space-between;border-top:2px solid #cbd2cd;margin:38px 0 0;padding-top:20px;font-size:11px;font-weight:900;letter-spacing:.08em;color:#6b747a}.copyright span{margin-left:auto;margin-right:auto}
+@keyframes bounce{0%,100%{transform:translateY(0) rotate(-3deg)}50%{transform:translateY(-10px) rotate(1deg)}}
+@media(max-width:1050px){.shell{width:calc(100% - 48px)}.nav-links{gap:18px}.hero-title{-webkit-text-stroke:4px var(--ink)}.peek-grid{gap:30px}.feature-grid{gap:18px}.feature-content{padding:24px 19px}.feature-content h3{font-size:20px}.window-body{padding:12px;gap:9px}.fake-panel{padding:13px 9px}.fake-export span{font-size:9px}}
+@media(max-width:760px){.announcement{font-size:10px}.announcement-sticker{display:none}.site-nav{height:88px}.nav-links{display:none}.logo{font-size:24px}.nav-cta{padding:11px;font-size:10px}.hero{min-height:0;padding:36px 0 82px}.mascot-zone{height:200px}.mascot{width:216px;height:194px}.mascot-speech{right:0;top:18px;font-size:8px}.hero-title{font-size:clamp(64px,15vw,118px);-webkit-text-stroke:3px var(--ink);text-shadow:3px 3px 0 var(--ink),6px 6px 0 var(--ink),9px 9px 0 var(--ink)}.hero-lede{margin-top:32px}.hero-copy{font-size:15px}.hero-footnote{font-size:10px;gap:8px}.section-head{display:block}.section-head>p{max-width:unset;margin-top:20px}.feature-grid{grid-template-columns:1fr;max-width:480px;margin:auto;gap:30px}.feature-illustration{height:195px}.feature-content{min-height:175px}.feature-content p{max-width:90%}.how-it-works{padding:75px 0 90px}.peek-section{padding-top:75px;padding-bottom:95px}.peek-grid{grid-template-columns:1fr;gap:65px}.window-wrap{max-width:620px}.bottom-cta-inner{min-height:390px}.cta-star{top:23px;left:0}.cta-star.end{right:4px;bottom:32px}.footer{grid-template-columns:1fr}.footer-links{justify-content:flex-start;padding:0}}
+@media(max-width:480px){.shell{width:calc(100% - 34px)}.logo{font-size:21px}.logo-page{width:30px;height:35px;margin-right:6px}.nav-cta{font-size:9px;padding:9px}.hero-title{font-size:15vw}.hero-lede{font-size:23px}.hero-copy{font-size:14px}.comic-button{width:100%;min-height:55px}.hero-buttons{gap:15px}.hero-footnote{flex-wrap:wrap}.section-head h2,.peek-copy h2{font-size:43px}.feature-content h3{font-size:21px}.sticker{width:90px;height:90px;font-size:11px}.window-body{grid-template-columns:1fr}.fake-panel{min-height:200px}.fake-doc{margin:15px 0}.fake-doc-line{margin-bottom:10px}.bottom-cta h2{font-size:45px}.copyright{font-size:9px}}
+@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;scroll-behavior:auto!important;transition:none!important}}
From 9ae06b16e0113acfb1a24dea83de88a1a0340b59 Mon Sep 17 00:00:00 2001
From: OKAN TIKTAS <346542017+OKAN-SOFTWARE@users.noreply.github.com>
Date: Sun, 8 Nov 2026 07:00:34 -0500
Subject: [PATCH 2/6] =?UTF-8?q?docs(ci):=20verify=20Java=2021=E2=80=9326?=
=?UTF-8?q?=20and=20add=20v0.5.0=20design=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/ci.yml | 2 +-
CHANGELOG.md | 3 ++-
README.md | 4 +++-
docs/DESIGN-SYSTEM.md | 5 +++++
docs/RELEASING.md | 3 ++-
scripts/verify-website-build.mjs | 5 +++++
website/index.html | 16 ++++++++++++++++
website/styles.css | 5 +++--
8 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 09890de..8120586 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -18,7 +18,7 @@ jobs:
fail-fast: false
max-parallel: 2
matrix:
- java: ['21', '22', '23', '24', '25', '26', '27']
+ java: ['21', '22', '23', '24', '25', '26']
steps:
- uses: actions/checkout@v7
- uses: actions/setup-java@v6
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0e05583..53535ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,7 @@ All notable Doc2FAQ changes are recorded here. Version numbers follow semantic v
### Added
- Browser PDF/Word (.docx) import and paginated export with local processing, PDF page/file/text limits, bounded DOCX XML decompression, optional references, and clear unsupported-file/font errors.
- Browser-only website demo built from the shared frontend, with simplified text drafting, explicit PDF/Word limitations, homepage navigation, and text exports.
-- Approved Doc2FAQ landing page and matching browser/Java workbench theme, with original document mascot, responsive cards, reduced-motion support, and a reproducible `website-dist/` build.
+- Approved Doc2FAQ landing page and matching browser/Java workbench theme, with original document mascot, responsive illustrated cards, accessible focus styles, reduced-motion support, and a reproducible `website-dist/` build. The homepage includes a "What's new" release-notes preview, clearly labeled as unreleased.
- Source & Review user guide and current documentation for development builds, schema compatibility, and v0.5.0 release preparation.
- Read-only source viewer highlighting the selected FAQ's exact original passages, with a stacked layout on narrow screens.
- Per-FAQ Needs review / Approved status, persisted in saved projects and optional browser autosave.
@@ -19,6 +19,7 @@ All notable Doc2FAQ changes are recorded here. Version numbers follow semantic v
- Filters affect only the review list; saving, export preview, and all export formats retain every FAQ in draft order.
- Export formats now open with PDF first and Word (.docx) second; the default download name uses `.pdf`.
- GitHub Actions now uses Node 24-based checkout/setup-java actions and pins Ubuntu 24.04 to avoid runner-label migration notices.
+- The v0.5.0 release gate validates **Java 21–26** with Java 21-compatible bytecode. Java 27 is deferred, not declared incompatible: an earlier CI run failed with HTTP 504 during JDK download, before Doc2FAQ tests ran.
- Release-candidate source version is 0.5.0; v0.4.0 remains the published release until the new artifacts are validated and released.
## 0.4.0 — 2026-10-29
diff --git a/README.md b/README.md
index 26b58f9..eae7f2c 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,8 @@ Created by **Okan Tiktas** · [OKAN-SOFTWARE](https://github.com/OKAN-SOFTWARE).
## Current source: v0.5.0 release candidate — Source & Review
+The **approved Doc2FAQ design** introduces a playful, illustrated homepage and a matching responsive FAQ workbench. Visit the [product homepage](https://okantiktas.com/projects/doc2faq/) for the overview or open the [interactive browser demo](https://okantiktas.com/projects/doc2faq/demo/) to try local document import, review, and export. The new design and demo are staged for deployment; the URLs may still show the earlier version until the website changes are reviewed and published. See [the v0.5.0 release notes](CHANGELOG.md#050--unreleased-release-candidate) for the complete changes and [the design system](docs/DESIGN-SYSTEM.md) for colors, components, and accessibility choices.
+
- **Source beside answer:** select **View source beside answer** on an FAQ to highlight all of its original passages in a read-only document viewer beside the review editor on desktop (stacked on smaller screens). References still use extracted-text lines, not PDF page numbers. Manual FAQs have no automatic reference.
- **Review status:** FAQs start as **Needs review**. Mark a complete answer **Approved** after checking it. Editing its question or answer, or merging FAQs, returns it to **Needs review**. Moving an item preserves approval; Undo restores the status from before a removal or merge.
- **Search and review filters:** combine a case-insensitive question/answer search with **All statuses**, **Needs review**, or **Approved**. The summary shows visible, approved, and pending counts. **Clear filters** restores the full list. Filters never change what is saved, previewed, or exported: all FAQs remain included, and incomplete entries still block export.
@@ -60,7 +62,7 @@ For detailed changes, see [CHANGELOG.md](CHANGELOG.md). For the release checklis
## Requirements
-- To run a release download: **Java 21 or newer**. The JAR targets Java 21 bytecode; GitHub Actions checks the released JDK versions 21–27 before v0.5.0 publication. Newer future Java versions are not automatically guaranteed compatible. The JAR works on Windows, macOS, and Linux; the Windows ZIP includes `Start-Doc2FAQ.cmd` and a quick-start guide. Extract the ZIP into a new folder, stop any older Doc2FAQ process, run the launcher, and open **http://localhost:8080**. Maven and Node.js are only needed to build and test from source.
+- To run a release download: **Java 21 or newer**. The JAR targets Java 21 bytecode; v0.5.0's **required automated compatibility matrix is Java 21–26**. Java 27 is **not yet part of the verified support matrix**; this does not mean the application is known to be incompatible, only that its validation is deferred to a later release. Newer Java versions are not automatically guaranteed compatible. The JAR works on Windows, macOS, and Linux; the Windows ZIP includes `Start-Doc2FAQ.cmd` and a quick-start guide. Extract the ZIP into a new folder, stop any older Doc2FAQ process, run the launcher, and open **http://localhost:8080**. Maven and Node.js are only needed to build and test from source.
To build from source:
diff --git a/docs/DESIGN-SYSTEM.md b/docs/DESIGN-SYSTEM.md
index 9b9bfdf..100aaad 100644
--- a/docs/DESIGN-SYSTEM.md
+++ b/docs/DESIGN-SYSTEM.md
@@ -13,6 +13,11 @@ was approved by project owner Okan Tiktas for future versions of Doc2FAQ.
5. Direct workflow: import → generate/extract → review → export.
6. Real functionality first: responsive controls, visible keyboard focus,
sufficient text contrast, and reduced-motion support.
+7. A visible **What's new** area may preview unreleased changes, but must
+ distinguish the release candidate from the latest published download.
+8. Preserve the native right-click menu, text selection, keyboard shortcuts,
+ and browser developer tools. Hiding them does not protect application code
+ or document data; security checks belong on the server, where applicable.
## Palette
diff --git a/docs/RELEASING.md b/docs/RELEASING.md
index bcc0ed8..2e200e0 100644
--- a/docs/RELEASING.md
+++ b/docs/RELEASING.md
@@ -4,7 +4,7 @@
## Validate the release candidate
-Use JDK 21+, Maven 3.6.3+, and Node.js. CI compiles the application for Java 21 and runs Java tests plus a packaged-JAR smoke check on JDKs 21 through 27. All matrix jobs must succeed before publication:
+Use JDK 21+, Maven 3.6.3+, and Node.js. CI compiles the application for Java 21 and runs Java tests plus a packaged-JAR smoke check on **JDKs 21 through 26**. All six required matrix jobs must succeed before publication. Java 27 is currently outside the verified release matrix; a previous Java 27 CI job failed while retrieving the Temurin JDK with **HTTP 504 before Maven or application tests started**. That failure does not establish an application incompatibility. Revisit Java 27 validation in a future release:
```cmd
mvn -B -ntp clean verify
@@ -34,6 +34,7 @@ GitHub Actions runs this smoke check on every push/PR. On Windows without Bash,
9. Import `TEst Data.pdf`, check the suggested `testdata-Doc2FAQ.pdf`, rename it, and verify the download. Check centered titles, PDF Lato fonts, page numbers, long answers/tokens, Unicode, and page breaks. Unsupported PDF glyphs must suggest Word. HTML must escape document markup.
10. Change source/mode, clear the document, or open another project during pending imports/drafting/exports. Old results must not replace or download current work. Check keyboard focus, mobile widths, and reduced motion.
11. Follow [WEB-DEMO.md](WEB-DEMO.md) for the separate static browser demo; verify its feature disclosure and website links. The demo cannot substitute for packaged-JAR testing.
+12. Review the [approved homepage design](DESIGN-SYSTEM.md), including responsive layouts, readable focus states, reduced-motion behavior, and the **What's new / v0.5.0 preview** release-notes area. Confirm that an unreleased candidate is not presented as a published download. Keep browser context menus and developer tools available; browser UI restrictions are not an application security control.
## Prepare v0.5.0
diff --git a/scripts/verify-website-build.mjs b/scripts/verify-website-build.mjs
index 9a45f78..fa31beb 100644
--- a/scripts/verify-website-build.mjs
+++ b/scripts/verify-website-build.mjs
@@ -11,6 +11,11 @@ const demo = await readFile(path.join(output, 'demo/index.html'), 'utf8');
assert.match(home, /href="\.\/demo\/"/, 'Homepage opens its sibling demo');
assert.match(home, /href="\.\/styles\.css"/, 'Homepage loads styles relative to subdirectory');
assert.doesNotMatch(home, /href="\/(?:demo\/|styles\.css|)"/, 'No domain-root homepage links');
+assert.match(home, /id="whats-new"/, 'Homepage includes the release notes preview');
+assert.match(home, /v0\.5\.0 PREVIEW/, 'Unreleased version is visibly labeled');
+assert.match(home, /Release candidate — not published yet/, 'Unreleased status is explicit');
+assert.match(home, /Java 21–26/, 'Homepage reflects the required compatibility matrix');
+assert.match(home, /v0\.4\.0 is still the latest published download/, 'Latest published release is identified accurately');
assert.match(demo, /href="\.\.\/"/, 'Demo navigates back to its own homepage');
assert.match(demo, /THE INTERACTIVE PLAYGROUND/, 'Demo is branded consistently');
assert.match(demo, /id="file-input"/, 'File import remains available');
diff --git a/website/index.html b/website/index.html
index b54f486..b80434e 100644
--- a/website/index.html
+++ b/website/index.html
@@ -18,6 +18,7 @@
TRY THE DEMO ↗
@@ -74,6 +75,21 @@
DOC2FAQ
+
+
+
+
✳ FRESH FROM THE WORKBENCH
WHAT'S NEW?
+
v0.5.0 PREVIEWRelease candidate — not published yet
+
+
+ ✦
HELLO, NEW LOOK.
A cheerful illustrated homepage and a matching, mobile-friendly workbench that keeps your document front and center.
+ ✓
REVIEW WITH CONFIDENCE.
See source highlights, approve answers, search your draft, and reopen saved projects for another pass.
+ ↓
TAKE IT WITH YOU.
Import PDF and Word files in the browser demo, then export as PDF, DOCX, Markdown, JSON, or HTML.
+
+
Java 21–26 is the planned v0.5.0 test matrix. Java 27 verification will come later. v0.4.0 is still the latest published download.
diff --git a/website/styles.css b/website/styles.css
index 6fc6c7d..98c38b4 100644
--- a/website/styles.css
+++ b/website/styles.css
@@ -6,8 +6,9 @@
.how-it-works{padding:90px 0 120px;border-top:var(--border);border-bottom:var(--border);background:#fffdf6}.section-head{display:flex;align-items:end;justify-content:space-between;gap:55px;margin-bottom:43px}.section-head .section-kicker,.peek-copy .section-kicker{display:block;letter-spacing:.14em;font-size:11px;margin:0 0 18px;color:#bd5d4d}.section-head h2,.peek-copy h2{font-weight:900;letter-spacing:-.075em;line-height:1.08;font-size:clamp(42px,5.5vw,73px);margin:0}.section-head h2 span{color:#e58c72}.section-head>p{font-size:17px;line-height:1.7;color:#56626b;max-width:345px;margin:0 0 6px}.feature-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:30px}.feature-card{border:var(--border);border-radius:12px;box-shadow:8px 9px 0 var(--ink);overflow:hidden;transition:transform .23s,box-shadow .23s}.feature-card:hover{transform:translateY(-5px);box-shadow:8px 14px 0 var(--ink)}.feature-illustration{position:relative;height:226px;display:grid;place-items:center;border-bottom:var(--border)}.feature-card.pink .feature-illustration{background:#f9c4b6}.feature-card.yellow .feature-illustration{background:#f8dd8c}.feature-card.mint .feature-illustration{background:#addccf}.feature-illustration svg{width:235px;max-width:90%;height:auto;filter:drop-shadow(2px 4px 0 #202b3428)}.feature-number{position:absolute;top:16px;left:18px;border:2px solid var(--ink);padding:5px 8px;border-radius:5px;background:#fffcf5;font-size:11px;font-weight:900;box-shadow:2px 2px 0 var(--ink)}.feature-content{min-height:217px;position:relative;padding:28px 27px;background:var(--white)}.feature-content h3{font-size:22px;line-height:1.1;font-weight:900;letter-spacing:-.05em;margin:0 0 14px}.feature-content p{font-size:14px;line-height:1.65;margin:0;max-width:280px;color:#535e66}.feature-arrow{position:absolute;bottom:20px;right:21px;font-size:24px}
.peek-section{padding-top:135px;padding-bottom:145px}.peek-top{display:flex;justify-content:space-between;align-items:center;margin:0 15px 26px}.scribble{font-size:14px;letter-spacing:.13em;font-weight:900;transform:rotate(-5deg)}.sticker{position:relative;transform:rotate(7deg);border:var(--border);border-radius:50%;width:104px;height:104px;display:grid;place-items:center;text-align:center;font-weight:900;font-size:13px;line-height:1.15;letter-spacing:.04em;background:var(--yellow);box-shadow:5px 5px 0 var(--ink)}.sticker span{position:absolute;bottom:16px;font-size:18px}.peek-grid{display:grid;grid-template-columns:.87fr 1.13fr;gap:65px;align-items:center}.peek-copy h2{font-size:clamp(42px,4.4vw,64px)}.peek-copy h2 span{color:#dc8a71}.peek-copy>p:not(.section-kicker){font-size:16px;line-height:1.75;max-width:510px;color:#56616a;margin:25px 0}.peek-copy ul{list-style:none;padding:0;margin:0 0 32px;display:grid;gap:15px;font-size:15px;font-weight:800}.peek-copy li{display:flex;align-items:center;gap:12px}.peek-copy li span{width:28px;height:28px;border:2px solid var(--ink);border-radius:50%;background:var(--mint);display:grid;place-items:center;font-weight:900}.window-wrap{position:relative;transform:rotate(2deg);padding:10px}.window-wrap:before{content:'';position:absolute;inset:40px -8px -7px 40px;background:var(--coral);border:var(--border);border-radius:16px;transform:rotate(3deg)}.window{position:relative;border:var(--border);border-radius:15px;background:var(--cream);box-shadow:12px 15px 0 var(--ink);overflow:hidden}.window-bar{height:58px;padding:0 18px;display:flex;align-items:center;justify-content:space-between;border-bottom:var(--border);background:var(--yellow);font-size:13px;font-weight:900;letter-spacing:.04em}.dots{display:flex;gap:6px}.dots span{width:12px;height:12px;border:2px solid var(--ink);background:var(--coral);border-radius:50%}.dots span:nth-child(2){background:#fff9e3}.dots span:nth-child(3){background:var(--mint)}.window-body{padding:24px;display:grid;grid-template-columns:1fr 1fr;gap:14px}.fake-panel{min-height:320px;border:2px solid var(--ink);background:#fff;padding:17px 13px;border-radius:7px;min-width:0}.fake-label{font-size:10px;font-weight:900;letter-spacing:.07em}.fake-doc{margin:25px 2px 28px}.fake-doc-line{width:82%;height:10px;background:#dfe6e4;margin-bottom:14px;border-radius:5px}.fake-doc-line.long{width:100%}.fake-doc-line.mid{width:70%}.fake-doc-line.short{width:44%}.fake-action{padding:11px 6px;text-align:center;background:var(--coral);border:2px solid var(--ink);border-radius:6px;font-size:10px;font-weight:900;box-shadow:3px 3px 0 var(--ink)}.fake-faq{display:flex;align-items:center;gap:8px;padding:15px 7px;margin-top:17px;background:#e4f5ee;border:2px solid var(--ink);border-radius:6px;font-size:10px;font-weight:800}.fake-faq.second{margin-top:8px;background:#fff4cb}.fake-faq b{font-size:20px}.fake-export{margin-top:22px;font-size:11px;font-weight:900}.fake-export span{margin-left:5px;padding:6px;background:#ecefeb;border:1px solid #cad0cc;border-radius:3px}
.bottom-cta{background:var(--coral);border-top:var(--border);border-bottom:var(--border)}.bottom-cta-inner{min-height:475px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;position:relative;padding:75px 0}.bottom-cta h2{font-size:clamp(46px,6vw,88px);letter-spacing:-.08em;line-height:1.04;margin:0;font-weight:900}.bottom-cta h2 em{font-style:normal;color:#fffcf4;text-shadow:3px 3px 0 var(--ink),-2px -2px 0 var(--ink);-webkit-text-stroke:2px var(--ink);paint-order:stroke fill}.bottom-cta p{font-size:16px;margin:25px auto 32px;max-width:460px;line-height:1.6}.cta-star{position:absolute;top:65px;left:45px;font-size:57px}.cta-star.end{top:auto;left:auto;right:43px;bottom:62px;font-size:35px}.footer{display:grid;grid-template-columns:1fr 1fr;gap:30px;padding-top:62px;padding-bottom:30px}.footer>div:first-child>p{font-size:14px;color:#606d75}.footer-links{display:flex;justify-content:flex-end;gap:24px;flex-wrap:wrap;align-items:start;font-size:13px;font-weight:800;padding-top:15px}.footer-links a:hover{text-decoration:underline}.copyright{grid-column:1/-1;display:flex;justify-content:space-between;border-top:2px solid #cbd2cd;margin:38px 0 0;padding-top:20px;font-size:11px;font-weight:900;letter-spacing:.08em;color:#6b747a}.copyright span{margin-left:auto;margin-right:auto}
+.release-section{padding:100px 0 105px;background:#fffdf6;border-top:var(--border)}.release-heading{display:flex;justify-content:space-between;align-items:end;gap:28px;margin-bottom:36px}.release-heading .section-kicker{display:block;text-align:left;color:#bd5d4d;letter-spacing:.13em;font-size:11px}.release-heading h2{font-size:clamp(48px,6vw,78px);line-height:1.02;letter-spacing:-.075em;margin:14px 0 0;font-weight:900}.release-heading h2 span{color:#e58c72}.release-status{display:flex;flex-direction:column;gap:6px;align-items:flex-start;background:var(--yellow);border:var(--border);border-radius:9px;box-shadow:4px 5px 0 var(--ink);padding:14px 18px;font-size:12px}.release-status strong{font-weight:900;letter-spacing:.07em}.release-status small{font-size:11px;font-weight:700}.release-dot{background:#fffdf6;border:2px solid var(--ink);height:9px;width:9px;border-radius:50%}.release-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}.release-card{border:var(--border);border-radius:10px;box-shadow:6px 7px 0 var(--ink);padding:30px 26px;background:var(--white)}.release-card:nth-child(2){background:#f9dfd5}.release-card:nth-child(3){background:#e1f3eb}.release-icon{display:grid;place-items:center;width:51px;height:51px;border:2px solid var(--ink);border-radius:50%;background:var(--yellow);font-size:28px;font-weight:900;margin-bottom:28px}.release-card h3{font-size:23px;line-height:1.1;letter-spacing:-.05em;font-weight:900;margin:0 0 14px}.release-card p{font-size:14px;line-height:1.65;margin:0;color:#4c5860}.release-bottom{display:flex;align-items:center;justify-content:space-between;gap:30px;margin-top:38px;font-size:13px;line-height:1.65}.release-bottom p{max-width:730px;color:#56626b}.release-bottom strong{color:var(--ink)}.release-bottom a{flex-shrink:0;border:var(--border);border-radius:8px;padding:16px 20px;background:var(--cream);font-size:12px;font-weight:900;box-shadow:4px 4px 0 var(--ink);transition:transform .18s,box-shadow .18s}.release-bottom a:hover{transform:translate(2px,2px);box-shadow:2px 2px 0 var(--ink)}
@keyframes bounce{0%,100%{transform:translateY(0) rotate(-3deg)}50%{transform:translateY(-10px) rotate(1deg)}}
-@media(max-width:1050px){.shell{width:calc(100% - 48px)}.nav-links{gap:18px}.hero-title{-webkit-text-stroke:4px var(--ink)}.peek-grid{gap:30px}.feature-grid{gap:18px}.feature-content{padding:24px 19px}.feature-content h3{font-size:20px}.window-body{padding:12px;gap:9px}.fake-panel{padding:13px 9px}.fake-export span{font-size:9px}}
-@media(max-width:760px){.announcement{font-size:10px}.announcement-sticker{display:none}.site-nav{height:88px}.nav-links{display:none}.logo{font-size:24px}.nav-cta{padding:11px;font-size:10px}.hero{min-height:0;padding:36px 0 82px}.mascot-zone{height:200px}.mascot{width:216px;height:194px}.mascot-speech{right:0;top:18px;font-size:8px}.hero-title{font-size:clamp(64px,15vw,118px);-webkit-text-stroke:3px var(--ink);text-shadow:3px 3px 0 var(--ink),6px 6px 0 var(--ink),9px 9px 0 var(--ink)}.hero-lede{margin-top:32px}.hero-copy{font-size:15px}.hero-footnote{font-size:10px;gap:8px}.section-head{display:block}.section-head>p{max-width:unset;margin-top:20px}.feature-grid{grid-template-columns:1fr;max-width:480px;margin:auto;gap:30px}.feature-illustration{height:195px}.feature-content{min-height:175px}.feature-content p{max-width:90%}.how-it-works{padding:75px 0 90px}.peek-section{padding-top:75px;padding-bottom:95px}.peek-grid{grid-template-columns:1fr;gap:65px}.window-wrap{max-width:620px}.bottom-cta-inner{min-height:390px}.cta-star{top:23px;left:0}.cta-star.end{right:4px;bottom:32px}.footer{grid-template-columns:1fr}.footer-links{justify-content:flex-start;padding:0}}
+@media(max-width:1050px){.shell{width:calc(100% - 48px)}.nav-links{gap:18px}.hero-title{-webkit-text-stroke:4px var(--ink)}.peek-grid{gap:30px}.feature-grid{gap:18px}.feature-content{padding:24px 19px}.feature-content h3{font-size:20px}.window-body{padding:12px;gap:9px}.fake-panel{padding:13px 9px}.fake-export span{font-size:9px}.release-grid{gap:16px}.release-card{padding:24px 19px}}
+@media(max-width:760px){.announcement{font-size:10px}.announcement-sticker{display:none}.site-nav{height:88px}.nav-links{display:none}.logo{font-size:24px}.nav-cta{padding:11px;font-size:10px}.hero{min-height:0;padding:36px 0 82px}.mascot-zone{height:200px}.mascot{width:216px;height:194px}.mascot-speech{right:0;top:18px;font-size:8px}.hero-title{font-size:clamp(64px,15vw,118px);-webkit-text-stroke:3px var(--ink);text-shadow:3px 3px 0 var(--ink),6px 6px 0 var(--ink),9px 9px 0 var(--ink)}.hero-lede{margin-top:32px}.hero-copy{font-size:15px}.hero-footnote{font-size:10px;gap:8px}.section-head{display:block}.section-head>p{max-width:unset;margin-top:20px}.feature-grid{grid-template-columns:1fr;max-width:480px;margin:auto;gap:30px}.feature-illustration{height:195px}.feature-content{min-height:175px}.feature-content p{max-width:90%}.how-it-works{padding:75px 0 90px}.peek-section{padding-top:75px;padding-bottom:95px}.peek-grid{grid-template-columns:1fr;gap:65px}.window-wrap{max-width:620px}.release-section{padding:72px 0 80px}.release-heading{align-items:start;flex-direction:column}.release-grid{grid-template-columns:1fr;max-width:520px;gap:22px}.release-bottom{flex-direction:column;align-items:start}.bottom-cta-inner{min-height:390px}.cta-star{top:23px;left:0}.cta-star.end{right:4px;bottom:32px}.footer{grid-template-columns:1fr}.footer-links{justify-content:flex-start;padding:0}}
@media(max-width:480px){.shell{width:calc(100% - 34px)}.logo{font-size:21px}.logo-page{width:30px;height:35px;margin-right:6px}.nav-cta{font-size:9px;padding:9px}.hero-title{font-size:15vw}.hero-lede{font-size:23px}.hero-copy{font-size:14px}.comic-button{width:100%;min-height:55px}.hero-buttons{gap:15px}.hero-footnote{flex-wrap:wrap}.section-head h2,.peek-copy h2{font-size:43px}.feature-content h3{font-size:21px}.sticker{width:90px;height:90px;font-size:11px}.window-body{grid-template-columns:1fr}.fake-panel{min-height:200px}.fake-doc{margin:15px 0}.fake-doc-line{margin-bottom:10px}.bottom-cta h2{font-size:45px}.copyright{font-size:9px}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;scroll-behavior:auto!important;transition:none!important}}
From d1d9494bcee8eadac88430491167a172cbbeeece Mon Sep 17 00:00:00 2001
From: OKAN TIKTAS <346542017+OKAN-SOFTWARE@users.noreply.github.com>
Date: Sun, 8 Nov 2026 07:03:17 -0500
Subject: [PATCH 3/6] docs: record successful Java 27 exploratory rerun without
expanding v0.5.0 gate
---
CHANGELOG.md | 2 +-
README.md | 2 +-
docs/RELEASING.md | 2 +-
website/index.html | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53535ca..0786573 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,7 +19,7 @@ All notable Doc2FAQ changes are recorded here. Version numbers follow semantic v
- Filters affect only the review list; saving, export preview, and all export formats retain every FAQ in draft order.
- Export formats now open with PDF first and Word (.docx) second; the default download name uses `.pdf`.
- GitHub Actions now uses Node 24-based checkout/setup-java actions and pins Ubuntu 24.04 to avoid runner-label migration notices.
-- The v0.5.0 release gate validates **Java 21–26** with Java 21-compatible bytecode. Java 27 is deferred, not declared incompatible: an earlier CI run failed with HTTP 504 during JDK download, before Doc2FAQ tests ran.
+- The v0.5.0 release gate validates **Java 21–26** with Java 21-compatible bytecode. Java 27 formal support is deferred, not declared incompatible: a transient JDK-download HTTP 504 caused an initial CI failure, and a later rerun **passed Java 27 build/tests and packaged-JAR smoke checks**.
- Release-candidate source version is 0.5.0; v0.4.0 remains the published release until the new artifacts are validated and released.
## 0.4.0 — 2026-10-29
diff --git a/README.md b/README.md
index eae7f2c..1c486f0 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ For detailed changes, see [CHANGELOG.md](CHANGELOG.md). For the release checklis
## Requirements
-- To run a release download: **Java 21 or newer**. The JAR targets Java 21 bytecode; v0.5.0's **required automated compatibility matrix is Java 21–26**. Java 27 is **not yet part of the verified support matrix**; this does not mean the application is known to be incompatible, only that its validation is deferred to a later release. Newer Java versions are not automatically guaranteed compatible. The JAR works on Windows, macOS, and Linux; the Windows ZIP includes `Start-Doc2FAQ.cmd` and a quick-start guide. Extract the ZIP into a new folder, stop any older Doc2FAQ process, run the launcher, and open **http://localhost:8080**. Maven and Node.js are only needed to build and test from source.
+- To run a release download: **Java 21 or newer**. The JAR targets Java 21 bytecode; v0.5.0's **required automated compatibility matrix is Java 21–26**. Java 27 **passed an exploratory CI build and packaged-JAR smoke test** on November 8, 2026, but is not a committed v0.5.0 support target; formal support can follow in a later release. Newer Java versions are not automatically guaranteed compatible. The JAR works on Windows, macOS, and Linux; the Windows ZIP includes `Start-Doc2FAQ.cmd` and a quick-start guide. Extract the ZIP into a new folder, stop any older Doc2FAQ process, run the launcher, and open **http://localhost:8080**. Maven and Node.js are only needed to build and test from source.
To build from source:
diff --git a/docs/RELEASING.md b/docs/RELEASING.md
index 2e200e0..8214350 100644
--- a/docs/RELEASING.md
+++ b/docs/RELEASING.md
@@ -4,7 +4,7 @@
## Validate the release candidate
-Use JDK 21+, Maven 3.6.3+, and Node.js. CI compiles the application for Java 21 and runs Java tests plus a packaged-JAR smoke check on **JDKs 21 through 26**. All six required matrix jobs must succeed before publication. Java 27 is currently outside the verified release matrix; a previous Java 27 CI job failed while retrieving the Temurin JDK with **HTTP 504 before Maven or application tests started**. That failure does not establish an application incompatibility. Revisit Java 27 validation in a future release:
+Use JDK 21+, Maven 3.6.3+, and Node.js. CI compiles the application for Java 21 and runs Java tests plus a packaged-JAR smoke check on **JDKs 21 through 26**. All six required matrix jobs must succeed before publication. Java 27 is outside this **required** release matrix, but an exploratory [Java 27 CI rerun on November 8, 2026](https://github.com/OKAN-SOFTWARE/Doc2FAQ/actions/runs/42477058195) **passed the Maven build, tests, and packaged-JAR smoke check**. The earlier attempt failed only while downloading the JDK (HTTP 504). Consider formal Java 27 support separately in a later release:
```cmd
mvn -B -ntp clean verify
diff --git a/website/index.html b/website/index.html
index b80434e..344b8c2 100644
--- a/website/index.html
+++ b/website/index.html
@@ -86,7 +86,7 @@
DOC2FAQ
✓
REVIEW WITH CONFIDENCE.
See source highlights, approve answers, search your draft, and reopen saved projects for another pass.
↓
TAKE IT WITH YOU.
Import PDF and Word files in the browser demo, then export as PDF, DOCX, Markdown, JSON, or HTML.
-
Java 21–26 is the planned v0.5.0 test matrix. Java 27 verification will come later. v0.4.0 is still the latest published download.
Java 21–26 is the required v0.5.0 test matrix. Java 27 passed a separate CI run; formal support can follow later. v0.4.0 is still the latest published download.
From b6ff7f71dc3eefe84ade896df0657524f532ddb7 Mon Sep 17 00:00:00 2001
From: OKAN TIKTAS <346542017+OKAN-SOFTWARE@users.noreply.github.com>
Date: Sun, 8 Nov 2026 07:34:08 -0500
Subject: [PATCH 4/6] fix: embed Unicode fonts for browser PDF export
---
CHANGELOG.md | 2 +
README.md | 4 +-
docs/USER-GUIDE.md | 2 +-
docs/WEB-DEMO.md | 4 +-
scripts/build-web-demo.mjs | 5 ++-
scripts/verify-website-build.mjs | 7 ++++
src/main/resources/static/app.js | 1 +
src/main/resources/static/index.html | 2 +-
src/main/resources/static/retro.css | 4 ++
src/test/js/app-state.test.cjs | 16 ++++++-
src/test/js/browser-documents.test.cjs | 32 ++++++++++++++
web-demo/THIRD-PARTY.md | 4 +-
web-demo/documents.js | 55 ++++++++++++++++++++++---
web-demo/fonts/DejaVuSans-Bold.ttf | Bin 0 -> 708920 bytes
web-demo/fonts/DejaVuSans.ttf | Bin 0 -> 759720 bytes
web-demo/fonts/LICENSE-DejaVu.txt | 45 ++++++++++++++++++++
16 files changed, 166 insertions(+), 17 deletions(-)
create mode 100644 web-demo/fonts/DejaVuSans-Bold.ttf
create mode 100644 web-demo/fonts/DejaVuSans.ttf
create mode 100644 web-demo/fonts/LICENSE-DejaVu.txt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0786573..9819086 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,7 @@ All notable Doc2FAQ changes are recorded here. Version numbers follow semantic v
### Added
- Browser PDF/Word (.docx) import and paginated export with local processing, PDF page/file/text limits, bounded DOCX XML decompression, optional references, and clear unsupported-file/font errors.
+- Browser PDF exports now embed bundled DejaVu Sans regular/bold font subsets instead of standard Helvetica, fixing Turkish and extended-Unicode text copied from web pages; unchanged Word exports continue to preserve the source characters.
- Browser-only website demo built from the shared frontend, with simplified text drafting, explicit PDF/Word limitations, homepage navigation, and text exports.
- Approved Doc2FAQ landing page and matching browser/Java workbench theme, with original document mascot, responsive illustrated cards, accessible focus styles, reduced-motion support, and a reproducible `website-dist/` build. The homepage includes a "What's new" release-notes preview, clearly labeled as unreleased.
- Source & Review user guide and current documentation for development builds, schema compatibility, and v0.5.0 release preparation.
@@ -18,6 +19,7 @@ All notable Doc2FAQ changes are recorded here. Version numbers follow semantic v
- Project schema 2 stores review status and upgrades schema-1 projects with Needs review defaults. Older application versions reject schema-2 files instead of silently discarding approval state.
- Filters affect only the review list; saving, export preview, and all export formats retain every FAQ in draft order.
- Export formats now open with PDF first and Word (.docx) second; the default download name uses `.pdf`.
+- **Clear saved data** is now a prominent, high-contrast action with a confirmation prompt. Cancel leaves the browser's saved draft intact; confirming removes only browser storage and keeps the current workspace open.
- GitHub Actions now uses Node 24-based checkout/setup-java actions and pins Ubuntu 24.04 to avoid runner-label migration notices.
- The v0.5.0 release gate validates **Java 21–26** with Java 21-compatible bytecode. Java 27 formal support is deferred, not declared incompatible: a transient JDK-download HTTP 504 caused an initial CI failure, and a later rerun **passed Java 27 build/tests and packaged-JAR smoke checks**.
- Release-candidate source version is 0.5.0; v0.4.0 remains the published release until the new artifacts are validated and released.
diff --git a/README.md b/README.md
index 1c486f0..9a4357d 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ The release-candidate branch uses `0.5.0` in `pom.xml` (`target/doc2faq-0.5.0.ja
## New in v0.4.0
- **Save work / Open saved work:** a versioned JSON file preserves source text, title, mode, draft order, edits, original excerpts, and duplicate-review choices. Incomplete FAQs can be saved too. Project files are limited to 4 MB and validated before replacing the workspace.
-- **Optional browser autosave:** off by default. Enabling it stores the complete source and draft on this browser's origin and restores them on reload. Disabling autosave or using **Clear saved data** removes Doc2FAQ's saved data without clearing your open workspace. Storage failures leave the draft open; use **Save work** as a backup.
+- **Optional browser autosave:** off by default. Enabling it stores the complete source and draft on this browser's origin and restores them on reload. The highlighted **Clear saved data** button asks for confirmation before removing the browser copy; canceling preserves it, and confirming leaves your current workspace open. Disabling autosave also removes the stored copy. Storage failures leave the draft open; use **Save work** as a backup.
- **Source references:** expand **Show source** to see the original section, extracted-text line range, and exact passage. Edited questions and answers are marked for rechecking. References use text lines, not PDF page numbers; manually added FAQs have no automatic reference.
- **Duplicate review:** distinct passages are retained even if their questions cover the same topic. Similar questions are flagged using a word-overlap heuristic. Choose **Keep both** or **Merge into this FAQ**. Merging keeps both answers and all source references; **Undo removal / merge** restores the previous items until another FAQ edit, addition, reorder, or review choice. Exact duplicate question/answer pairs are still filtered. The maximum remains 30 FAQs.
- **PDF and Word export:** edited content, a centered document title, readable page layout, metadata, and page numbers. Optionally include section/line references and edited-answer notices. PDF embeds Lato Regular and Bold (see `src/main/resources/fonts/LICENSE-Lato.txt`); if text contains a glyph that font cannot represent, export returns an error and suggests DOCX.
@@ -56,7 +56,7 @@ The document placeholder now uses neutral Q&A prompts, and Generate Mode's sampl
[Doc2FAQ homepage](https://okantiktas.com/projects/doc2faq/) · [Try the interactive browser demo](https://okantiktas.com/projects/doc2faq/demo/) · [Source & Review user guide](docs/USER-GUIDE.md) · [Demo capabilities and deployment](docs/WEB-DEMO.md) · [Approved design system](docs/DESIGN-SYSTEM.md)
-The demo processes pasted text and TXT/Markdown in your browser, using simplified rules. Try both drafting modes, source highlighting, editing, approval status, duplicate review, search/filters, saved projects, and Markdown/JSON/HTML exports. PDF/Word (.docx) import and export also run locally in the browser; PDF uploads are limited to 5 MB and 50 pages, and DOCX to 5 MB. Scanned PDFs need external OCR. The demo does not run a Java backend and its drafting rules remain simplified. Document libraries load from a version-pinned CDN when needed; document content is not uploaded. Browser PDF export uses standard Latin fonts and suggests Word when a character cannot be represented. The development demo may include features newer than the latest release download.
+The demo processes pasted text and TXT/Markdown in your browser, using simplified rules. Try both drafting modes, source highlighting, editing, approval status, duplicate review, search/filters, saved projects, and Markdown/JSON/HTML exports. PDF/Word (.docx) import and export also run locally in the browser; PDF uploads are limited to 5 MB and 50 pages, and DOCX to 5 MB. Scanned PDFs need external OCR. The demo does not run a Java backend and its drafting rules remain simplified. Document libraries load from a version-pinned CDN when needed; document content is not uploaded. Browser PDF export now embeds bundled DejaVu Sans fonts for Turkish and a wider range of Unicode characters; Word remains the fallback for unsupported scripts. The development demo may include features newer than the latest release download.
For detailed changes, see [CHANGELOG.md](CHANGELOG.md). For the release checklist, see [docs/RELEASING.md](docs/RELEASING.md).
diff --git a/docs/USER-GUIDE.md b/docs/USER-GUIDE.md
index f87bc42..9436c31 100644
--- a/docs/USER-GUIDE.md
+++ b/docs/USER-GUIDE.md
@@ -44,7 +44,7 @@ Similar-question warnings use word overlap. Keep both retains distinct passages;
The source build reads schemas 1 and 2, and saves schema 2. Older v0.4 apps reject schema-2 files. Keep an original project copy if you also use an older release. The limit remains 4 MB.
-Optional browser autosave is off by default. Enabling it stores source and drafts on that browser origin. Clear saved data removes the stored copy while leaving the open workspace intact. Clear document removes source, drafts, pending results, and the saved copy. Download a project when browser storage is unavailable.
+Optional browser autosave is off by default. Enabling it stores source and drafts on that browser origin. The prominently highlighted **Clear saved data** button asks for confirmation; cancel keeps the browser copy, while confirmation removes it and leaves the open workspace intact. Clear document removes source, drafts, pending results, and the saved copy. Download a project when browser storage is unavailable.
## Export
diff --git a/docs/WEB-DEMO.md b/docs/WEB-DEMO.md
index 3080895..f7878fc 100644
--- a/docs/WEB-DEMO.md
+++ b/docs/WEB-DEMO.md
@@ -16,9 +16,9 @@ The public-facing homepage route is `https://okantiktas.com/projects/doc2faq/`.
| PDF/DOCX import and export | Yes; browser PDF.js / Word XML extraction and PDF-LIB / docx exports | Yes; PDFBox / Apache POI |
| OCR, external AI, accounts/billing | No | Not implemented |
-PDF and Word files are processed on the visitor's device. PDF import is limited to 5 MB, 50 pages and 50,000 extracted characters; DOCX import is limited to 5 MB, 50,000 extracted characters, 1,000 archive entries and an 8 MB expanded main XML part. Legacy `.doc`, password-protected PDFs and image-only/scanned PDFs are not supported. Word extraction reads main-document paragraphs and tables, mapping standard Heading 1–6 styles to Markdown section headings (levels 2–6) so the generator treats Heading 1 as a section rather than a document title. Headers/footers, images and complex layouts may not be retained. Browser PDF export uses Helvetica with Latin character coverage; unsupported characters produce an error recommending Word, never silently dropped text. Word exports preserve Unicode. Both exports include every FAQ regardless of filters and optionally include source references.
+PDF and Word files are processed on the visitor's device. PDF import is limited to 5 MB, 50 pages and 50,000 extracted characters; DOCX import is limited to 5 MB, 50,000 extracted characters, 1,000 archive entries and an 8 MB expanded main XML part. Legacy `.doc`, password-protected PDFs and image-only/scanned PDFs are not supported. Word extraction reads main-document paragraphs and tables, mapping standard Heading 1–6 styles to Markdown section headings (levels 2–6) so the generator treats Heading 1 as a section rather than a document title. Headers/footers, images and complex layouts may not be retained. Browser PDF export **embeds bundled DejaVu Sans regular/bold font subsets** for Turkish, extended Latin, IPA and many mathematical symbols. If a font still cannot display a character, the app recommends Word rather than silently dropping it. Word exports preserve Unicode. Both exports include every FAQ regardless of filters and optionally include source references.
-The demo demonstrates the review workflow; it is not a hosted Java backend and does not claim identical generation results. Its development features may be newer than the latest published JAR. No pasted text is sent to an FAQ server. Optional autosave and downloaded project files contain source text; clear saved data on shared devices. Normal website hosting still serves the page and assets. The document adapter lazily loads version-pinned PDF.js, PDF-LIB, JSZip and docx code from jsDelivr. An internet connection is needed on first use; load failures leave the workspace available for retry. See [third-party libraries](../web-demo/THIRD-PARTY.md).
+The demo demonstrates the review workflow; it is not a hosted Java backend and does not claim identical generation results. Its development features may be newer than the latest published JAR. No pasted text is sent to an FAQ server. Optional autosave and downloaded project files contain source text; clear saved data on shared devices. Normal website hosting still serves the page and assets. The document adapter lazily loads version-pinned PDF.js, PDF-LIB, fontkit, JSZip and docx code from jsDelivr. DejaVu fonts are **served by the same website**, not downloaded from a third-party font service. An internet connection is needed on first use; load failures leave the workspace available for retry. See [third-party libraries](../web-demo/THIRD-PARTY.md).
## Build and keep it synchronized
diff --git a/scripts/build-web-demo.mjs b/scripts/build-web-demo.mjs
index 18c5280..79bab07 100644
--- a/scripts/build-web-demo.mjs
+++ b/scripts/build-web-demo.mjs
@@ -1,4 +1,4 @@
-import {readFile, writeFile, mkdir, copyFile} from 'node:fs/promises';
+import {readFile, writeFile, mkdir, copyFile, cp} from 'node:fs/promises';
import {fileURLToPath} from 'node:url';
import path from 'node:path';
import {createHash} from 'node:crypto';
@@ -26,7 +26,7 @@ html = html.replaceAll('@project.version@', version)
.replace('Content preview. PDF and Word downloads apply their own page layout.', 'All FAQs are included, even when filtered. PDF and Word downloads apply their own pagination.');
const noteStart = html.indexOf('
Browser demo. Text processing and text exports happen on your device. Nothing you paste is sent to an FAQ server. No AI is used. This simplified demo may produce different drafts from the full Java app. Source references use text lines, not PDF pages. Optional autosave stores source and drafts in this browser; use Clear saved data on shared devices. Saved projects contain the source. PDF and Word (.docx) import/export run in your browser. Scanned PDFs need OCR, which is not included. PDF export uses standard Latin fonts; choose Word for unsupported characters. Document libraries load from a CDN when needed; your document content is not uploaded.
Browser demo. Text processing and text exports happen on your device. Nothing you paste is sent to an FAQ server. No AI is used. This simplified demo may produce different drafts from the full Java app. Source references use text lines, not PDF pages. Optional autosave stores source and drafts in this browser; use Clear saved data on shared devices. Saved projects contain the source. PDF and Word (.docx) import/export run in your browser. Scanned PDFs need OCR, which is not included. PDF export embeds bundled DejaVu Sans fonts for extended Unicode coverage; unsupported scripts may still require Word. Document libraries load from a CDN when needed; your document content is not uploaded.