From b0b8cd5aa85fcc6bd217a0778922d4b64cf9b1f8 Mon Sep 17 00:00:00 2001 From: krflol Date: Tue, 6 Oct 2026 23:11:23 -0500 Subject: [PATCH] fix: update JavaScript demos and downloads to portable font previews --- docs/assets/browser-starter/project.zip | Bin 23705 -> 23698 bytes docs/assets/browser-starter/source.json | 22 +++--- docs/assets/nextjs/project.zip | Bin 104788 -> 104790 bytes docs/assets/nextjs/source.json | 18 ++--- docs/assets/nextjs/verification.json | 74 ++++++++++-------- .../react-starter/baseline/verification.json | 6 +- docs/assets/react-starter/project.zip | Bin 29617 -> 29613 bytes docs/assets/react-starter/source.json | 22 +++--- .../vue-starter/baseline/verification.json | 6 +- docs/assets/vue-starter/project.zip | Bin 30301 -> 30293 bytes docs/assets/vue-starter/source.json | 21 ++--- docs/guides/browser-pdf.md | 8 +- docs/guides/nextjs-pdf.md | 4 +- docs/guides/react-pdf.md | 6 +- docs/guides/vue-pdf.md | 6 +- tools/build_browser_starter.py | 4 +- tools/build_react_starter.py | 4 +- tools/build_vue_starter.py | 4 +- tools/check_browser_starter.py | 4 +- tools/check_react_starter.py | 6 +- tools/check_vue_starter.py | 6 +- tools/starter_standard_fonts.py | 37 +++++++++ 22 files changed, 157 insertions(+), 101 deletions(-) create mode 100644 tools/starter_standard_fonts.py diff --git a/docs/assets/browser-starter/project.zip b/docs/assets/browser-starter/project.zip index 20d099c85ad742a01d0b27ed15a9c7239d6dbe82..45d32cf3bf6758189f5267227d748ea46474921d 100644 GIT binary patch delta 7291 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 delta 7355 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 IKE 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 delta 7948 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 diff --git a/docs/assets/nextjs/source.json b/docs/assets/nextjs/source.json index ff6a8c4..7e6b055 100644 --- a/docs/assets/nextjs/source.json +++ b/docs/assets/nextjs/source.json @@ -1,12 +1,12 @@ { "sourceRepository": "https://github.com/fullbleed-engine/fullbleed-node", - "sourceCommit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", + "sourceCommit": "ae6e301ebc129a15aab89378f44beb81d63d4475", "files": 18, "assets": [ { "file": "project.zip", - "sha256": "06d1383ed8a40ab2853e7f9a51a9a7baddb7981b7c02fc0d3772587c8823553f", - "bytes": 104788 + "sha256": "6a4a589bc0153c0ca006a571e576ba8681dac5ae8fa683fc33e2f336322df6d6", + "bytes": 104790 }, { "file": "invoice.pdf", @@ -22,15 +22,15 @@ "fileHashes": { "fullbleed-nextjs/.gitignore": "b4abc38d76926640e3f2cbe3bf25c8f5aec6cc43dd978c48d3ad5cc20d964f66", "fullbleed-nextjs/LICENSE": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9", - "fullbleed-nextjs/README.md": "0b47cb42317df65f497447bb1084c888194886f82e5223960ed2ecaa55b22273", + "fullbleed-nextjs/README.md": "96de8ae1580d61c0c34274c3fafe70a81338aa2bd927d22900874c367ae9158c", "fullbleed-nextjs/app/api/invoices/[id]/route.js": "d6348ce64b44feac7010e21fb0f55723e0858c7867222ae831c45d3440a3b052", "fullbleed-nextjs/app/globals.css": "02e0b545a14eaf15e6d3d8fc8c0e8c0f1c5ce5c1b8dc461b4343d330f291233e", "fullbleed-nextjs/app/layout.js": "2df89bff0d2f002b432b3fdb73fd64edf59c57641d9ea6df3f0051cf2329cf27", "fullbleed-nextjs/app/page.js": "24c7996f8172992f925cdb1e47455d0095397d0832f747c90ecb409f2a1d460c", "fullbleed-nextjs/lib/invoice.mjs": "fd87dd082fa19659ec572d97255c1902e1e728e43ebbc3e0ade9891fa7736cf2", "fullbleed-nextjs/next.config.mjs": "e93613419f5aaa6264f0405e5afbb6f5eea4c956e42e7ebf30a6c85a4d9d89b3", - "fullbleed-nextjs/package-lock.json": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", - "fullbleed-nextjs/package.json": "7e52578d679fa9422b15cf5a69fa065d7b6c68d076362ddfc4e885134dfd5766", + "fullbleed-nextjs/package-lock.json": "f5d9b10c7546f8df1c08b0cdb489647289f91b1c89d065c3f1a133478d5fcfbf", + "fullbleed-nextjs/package.json": "e31ff035bd4d340ca73a5ee95319ee85ec4ae1d3651a6193bf2a6f0174a39e9c", "fullbleed-nextjs/public/invoice.png": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7", "fullbleed-nextjs/templates/invoice.css": "cda22b39ab1f7a1eeac7cd76d162b05cd3568c2430c099123ba30a2fbd58a296", "fullbleed-nextjs/templates/invoice.html": "d9a5b1950ddab61f08628b0fcc773cb36f05d9401bb3d87273bca02452b1835e", @@ -39,7 +39,7 @@ "fullbleed-nextjs/tools/start.mjs": "4c185a0801ca4f89a30a0c1e75710f1c22c84463d29477900162b05a8bc52eab", "fullbleed-nextjs/tools/verify.mjs": "54623914ff28a47ea63a553d063ac50a206df0424270dacb3f3a99054982a888" }, - "packageVersion": "0.3.1", - "engineVersion": "2.5.10", - "sourceVerificationRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37465413382" + "packageVersion": "0.3.2", + "engineVersion": "2.5.11", + "sourceVerificationRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37569111697" } diff --git a/docs/assets/nextjs/verification.json b/docs/assets/nextjs/verification.json index 0b43859..55146cb 100644 --- a/docs/assets/nextjs/verification.json +++ b/docs/assets/nextjs/verification.json @@ -1,8 +1,8 @@ { "ok": true, - "checkedAt": "2026-10-06T12:49:16.905884+00:00", - "sourceCommit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", - "sourceRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37465413382", + "checkedAt": "2026-10-07T04:06:45.541502+00:00", + "sourceCommit": "ae6e301ebc129a15aab89378f44beb81d63d4475", + "sourceRun": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37569111697", "checks": [ { "name": "standalone artifact is isolated from the source application", @@ -75,14 +75,14 @@ ], "ciResults": [ { - "checkedAt": "2026-10-06T12:44:31.828Z", + "checkedAt": "2026-10-07T03:57:17.033Z", "node": "v22.23.3", "platform": "linux", "next": "16.3.8", - "nodePackage": "0.3.1", - "engineVersion": "2.5.10", + "nodePackage": "0.3.2", + "engineVersion": "2.5.11", "isolation": "process", - "packageLockSha256": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", + "packageLockSha256": "f5d9b10c7546f8df1c08b0cdb489647289f91b1c89d065c3f1a133478d5fcfbf", "pages": 1, "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "burst": [ @@ -105,14 +105,14 @@ "previewSha256": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" }, { - "checkedAt": "2026-10-06T12:44:44.228Z", + "checkedAt": "2026-10-07T03:57:25.042Z", "node": "v24.21.0", "platform": "linux", "next": "16.3.8", - "nodePackage": "0.3.1", - "engineVersion": "2.5.10", + "nodePackage": "0.3.2", + "engineVersion": "2.5.11", "isolation": "process", - "packageLockSha256": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", + "packageLockSha256": "f5d9b10c7546f8df1c08b0cdb489647289f91b1c89d065c3f1a133478d5fcfbf", "pages": 1, "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "burst": [ @@ -135,14 +135,14 @@ "previewSha256": "72420749ccc3deaa8025daf7baffcdf79be716b6e8e93ed605effebed01e86c7" }, { - "checkedAt": "2026-10-06T12:44:58.768Z", + "checkedAt": "2026-10-07T03:57:52.511Z", "node": "v24.21.0", "platform": "win32", "next": "16.3.8", - "nodePackage": "0.3.1", - "engineVersion": "2.5.10", + "nodePackage": "0.3.2", + "engineVersion": "2.5.11", "isolation": "process", - "packageLockSha256": "57dfea0b9c49f604477b28c88847764bda16c006383df852269bdd2b712daf43", + "packageLockSha256": "f5d9b10c7546f8df1c08b0cdb489647289f91b1c89d065c3f1a133478d5fcfbf", "pages": 1, "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "burst": [ @@ -167,15 +167,15 @@ ], "downloadedStarter": { "ok": true, - "checkedAt": "2026-10-06T12:46:56.297591+00:00", - "sourceCommit": "7da8faa0dd7e5653c796b2b113ca580bcc25ca3b", + "checkedAt": "2026-10-07T04:02:35.480164+00:00", + "sourceCommit": "ae6e301ebc129a15aab89378f44beb81d63d4475", "downloadFiles": 18, - "projectZipSha256": "06d1383ed8a40ab2853e7f9a51a9a7baddb7981b7c02fc0d3772587c8823553f", - "node": "v26.10.0", + "projectZipSha256": "6a4a589bc0153c0ca006a571e576ba8681dac5ae8fa683fc33e2f336322df6d6", + "node": "v22.23.3", "platform": "win32", "next": "16.3.8", - "nodePackage": "0.3.1", - "engineVersion": "2.5.10", + "nodePackage": "0.3.2", + "engineVersion": "2.5.11", "isolation": "process", "commands": [ { @@ -271,29 +271,37 @@ }, "browser": { "ok": true, - "checked_at": "2026-10-06T12:42:59.420658+00:00", + "checkedAt": "2026-10-07T04:04:43.258437+00:00", "browser": "154.0.8037.98", - "checks": [ + "packageVersion": "0.3.2", + "engineVersion": "2.5.11", + "records": [ { "width": 1440, + "download": "invoice-NS-1042.pdf", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", "keyboard": false, - "pdf_sha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", - "page_errors": [] + "horizontalOverflow": false, + "previewLoaded": true }, { "width": 390, - "keyboard": true, - "pdf_sha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", - "page_errors": [] + "download": "invoice-NS-1042.pdf", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", + "keyboard": false, + "horizontalOverflow": false, + "previewLoaded": true }, { "width": 320, - "keyboard": false, - "pdf_sha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", - "page_errors": [] + "download": "invoice-NS-1042.pdf", + "pdfSha256": "3078d155f30536f5ad721f7be3c241cd78661ae41249131fc0fd65f37f23e408", + "keyboard": true, + "horizontalOverflow": false, + "previewLoaded": true } ], - "scope": "Owned anonymous Chrome; production Next.js standalone server; real downloads and responsive layouts." + "pageErrors": [] }, - "scope": "Published npm 0.3.1 / core 2.5.10. Three CI environments and the exact downloadable ZIP pass 17 standalone HTTP checks; their PDFs and previews match. Owned Chrome checks real downloads and narrow layouts. No application authorization, hosting-provider, or standards conformance claim." + "scope": "Public npm 0.3.2; exact starter ZIP; retained isolated-server and real browser download checks. No application-authorization, hosted-capacity, or PDF standards claim." } diff --git a/docs/assets/react-starter/baseline/verification.json b/docs/assets/react-starter/baseline/verification.json index 9d012ea..76bbfde 100644 --- a/docs/assets/react-starter/baseline/verification.json +++ b/docs/assets/react-starter/baseline/verification.json @@ -1,7 +1,7 @@ { - "package": "0.3.1", - "engine": "2.5.10", - "node": "v26.10.0", + "package": "0.3.2", + "engine": "2.5.11", + "node": "v22.23.3", "records": [ { "design": "invoice", diff --git a/docs/assets/react-starter/project.zip b/docs/assets/react-starter/project.zip index a8bf3911814118a65d135dd5c185e6d1b7805112..2c30e39f071a28915e1fd00f1a40b357531f95ad 100644 GIT binary patch delta 9468 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 K9>e}`<^KR7bLDXW delta 9445 zcmZX4bxlv``}gk;3z8ckWg4)U|?|XA*C0K;sPP1SM{R-0!B*j-W4mnMhvnA z5}dQ<6=oRX79LSz`;sM~VN5_XyV#t?DjPE2w_z(Lp5#GB+oU~gH|CWQy1&7n z^oG6wq%{Zfo} zy&X!a%0IqKxV zI*vHR53~RnQMXn8a1XR=GVs+x;Q8l{(Qv&DMPkE!dAa8WJ9#Kv$OAjO3^~QyF=@xk zm35i)UB%m<;R+?}AgQm*bBcDy<{oPCp889V6>qMsUoG|nGkXV)H*^kgngs}{_vS7o zyj~Z=GRF2@KR-6<5h=xcm}QRT1ID=J>=JBtdh)sm9Z%jb7eQmCaJ1Bc>zcsLMa+@j5d8@Jc)B?613T;A8k+acx$(*v-8r8$-{9!t;XS~G6~wFNHvjoBLnkz1Q=btH~zff zZ}sv|z6{vIIU!P5@IMUT-yT*2QlT1w!2^%V6f#$M(2;_RxUPT3+w>pa7zIW6d7hG) zvUN^Qq)@|H;vC#8SSuK(x7ND?f^<7*ulKl>aW0 z_k0(Lps_QedVV7xa4b)H0v~g&dpL90Ft>$UEn8hZn$Sx72@cD|&@l-KH?ZILMLAPz%cldw^o(hO@Y0|Gwu5iWvn7JPiXZTzf zEf4c6T3u6*f;ze7FHH9}f5LD7_Lx5?8N-D@@f3XRXtH>0zr!Hu1+MY&Kjb%l`;h6< zfW(V#gO4q(UeX2Wd5FRTF0%Q&CTaw09mr~7mwLDLnq6qE8-H>`%wX#miaeBta3}2p z9)G{TByiKf(cvVPz0UltWZ}x>o-VCaP;frrI8onhB}Enr#}WfqR^QLU^T7XB5MF{| zaUg3mb7%FS>L*S6Hz0R^GV&MU9|l)`msJU%c}?MbNTB=eXF;k!_Br7cxfrpOA>%et zkfwBT>R?i(7DN}sGIMH`mCTL$$WkxuR{z&r#2$D3$;KK zcNv2ts?Z^fxi<06>$-gc-^zAC^V_=gNP6C`SdHhy%Tt~^HL$Nl!(!HU_{UcoCEd^g z@%3u`?R8kA{DR5(wvwe+3bh3(f@BUK8)`s77v4bGI)Tl?sC`^fovX}WCc)WKHl$p{ zA%8M{n8{S}7^ZOvrz|VKjcay)SygqauJiItH@f%LYG)>gsvBavJvb~N;SWM%<&8Ih zx6%QHvtK=?0yz3MbI__p-m(V~+-!YlpQvk67;=aXJtR&zXc<-dMyq0vM

Edited template

{{customer}} / {{reference}}

') - page.locator('#css-source').fill('@page { size: A5; margin: 15mm } h1 { color: {{ink}}; font-size: 24pt }') + page.locator('#css-source').fill('@page { size: A5; margin: 15mm } body { font-family: Helvetica } h1 { color: {{ink}}; font-size: 24pt }') page.locator('#render-source').click();ready() path=download('edited',1,['Edited template','Birch & ','TEST-2042']) check('edited print CSS changes the PDF page size',abs(float(PdfReader(path).pages[0].mediabox.width)-419.52756)<1) check('document script does not run on the page',page.evaluate('window.documentScriptExecuted !== true')) + verify_edited_preview(page, path, out, check) page.screenshot(path=str(out/'edited-template.png'),full_page=True) page.locator('#kind').select_option('report');page.locator('#generate').click();ready() download('report',3,['COMMON','1,240','420,000.00']) diff --git a/tools/check_react_starter.py b/tools/check_react_starter.py index 7f84434..349b1d6 100644 --- a/tools/check_react_starter.py +++ b/tools/check_react_starter.py @@ -1,6 +1,6 @@ """Check the production React ZIP's PDF downloads and component cleanup. -Adapted from fullbleed-node dc36691c59faa27eedb3c49465e9818c5953abf1. +Adapted from fullbleed-node ae6e301ebc129a15aab89378f44beb81d63d4475. The source repository separately qualifies development StrictMode. """ import argparse @@ -16,6 +16,7 @@ from playwright.sync_api import sync_playwright, expect from pypdf import PdfReader +from starter_standard_fonts import verify_edited_preview parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--dist', type=Path, required=True) @@ -173,11 +174,12 @@ def download(name, count, text): page.locator('#template-editor summary').click() page.locator('#html-source').fill('

React template

{{customer}} / {{reference}}

') - page.locator('#css-source').fill('@page { size: A5; margin: 15mm } h1 { color: {{ink}}; font-size: 24pt }') + page.locator('#css-source').fill('@page { size: A5; margin: 15mm } body { font-family: Helvetica } h1 { color: {{ink}}; font-size: 24pt }') ready() edited = download('edited-template', 1, ['React template', 'Birch & ', 'REACT-2042']) check('edited print CSS changes the page size', abs(float(PdfReader(edited).pages[0].mediabox.width) - 419.52756) < 1) check('document scripts are not executed in the app', page.evaluate('window.documentScriptExecuted !== true')) + verify_edited_preview(page, edited, out, check) page.screenshot(path=str(out / 'edited-template.png'), full_page=True) page.locator('#kind').select_option('report') ready() diff --git a/tools/check_vue_starter.py b/tools/check_vue_starter.py index 2c4bea6..9ce29b0 100644 --- a/tools/check_vue_starter.py +++ b/tools/check_vue_starter.py @@ -1,4 +1,4 @@ -"""Check the exact Vue ZIP; adapted from fullbleed-node 3e60340b2cb1a4275828ef717a886a93b93c9cc7.""" +"""Check the exact Vue ZIP; adapted from fullbleed-node ae6e301ebc129a15aab89378f44beb81d63d4475.""" import argparse from datetime import datetime, timezone import hashlib @@ -12,6 +12,7 @@ from playwright.sync_api import sync_playwright, expect from pypdf import PdfReader +from starter_standard_fonts import verify_edited_preview parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--dist', type=Path, required=True) @@ -184,11 +185,12 @@ def previews_match(name, count): page.locator('#template-editor summary').click() page.locator('#html-source').fill('

Vue template

{{customer}} / {{reference}}

') - page.locator('#css-source').fill('@page { size: A5; margin: 15mm } h1 { color: {{ink}}; font-size: 24pt }') + page.locator('#css-source').fill('@page { size: A5; margin: 15mm } body { font-family: Helvetica } h1 { color: {{ink}}; font-size: 24pt }') ready() edited = download('edited-template', 1, ['Vue template', 'Birch & ', 'VUE-2042']) check('edited print CSS changes the page size', abs(float(PdfReader(edited).pages[0].mediabox.width) - 419.52756) < 1) check('document scripts are not executed in the app', page.evaluate('window.documentScriptExecuted !== true')) + verify_edited_preview(page, edited, out, check) page.screenshot(path=str(out / 'edited-template.png'), full_page=True) page.locator('#kind').select_option('report') ready() diff --git a/tools/starter_standard_fonts.py b/tools/starter_standard_fonts.py new file mode 100644 index 0000000..b56e0dc --- /dev/null +++ b/tools/starter_standard_fonts.py @@ -0,0 +1,37 @@ +"""Check that a pasted Helvetica template has visible browser preview text.""" +import base64 +import hashlib +import json + +from playwright.sync_api import expect +from pypdf import PdfReader + + +def verify_edited_preview(page, pdf_path, out, check): + pdf = PdfReader(pdf_path) + fonts = [item.get_object() for item in pdf.pages[0]['/Resources']['/Font'].values()] + names = sorted(str(font.get('/BaseFont')) for font in fonts) + check('edited template uses unembedded standard Helvetica faces', + bool(fonts) and all(name in ['/Helvetica', '/Helvetica-Bold'] for name in names) + and all('/FontDescriptor' not in font for font in fonts)) + image = page.locator('#preview img') + expect(image).to_have_count(1) + result = image.evaluate('''async image => { + await image.decode(); + const canvas = document.createElement('canvas'); + canvas.width = image.naturalWidth; canvas.height = image.naturalHeight; + const context = canvas.getContext('2d'); context.drawImage(image, 0, 0); + const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data; + let ink = 0; + for (let i = 0; i < pixels.length; i += 4) + if (pixels[i + 3] > 0 && Math.min(pixels[i], pixels[i + 1], pixels[i + 2]) < 245) ink++; + return {width: canvas.width, height: canvas.height, inkPixels: ink, + png: canvas.toDataURL('image/png').split(',')[1]}; + }''') + png = base64.b64decode(result.pop('png')) + (out / 'edited-preview-decoded.png').write_bytes(png) + result.update(fonts=names, pdfSha256=hashlib.sha256(pdf_path.read_bytes()).hexdigest(), + decodedPreviewSha256=hashlib.sha256(png).hexdigest()) + (out / 'edited-preview-verification.json').write_text( + json.dumps(result, indent=2) + '\n', encoding='utf-8', newline='\n') + check('edited standard-font preview contains visible text', result['inkPixels'] > 500)

;oTp+a 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 diff --git a/docs/assets/vue-starter/source.json b/docs/assets/vue-starter/source.json index 6bc1062..d5e8261 100644 --- a/docs/assets/vue-starter/source.json +++ b/docs/assets/vue-starter/source.json @@ -1,20 +1,20 @@ { "source_repository": "https://github.com/fullbleed-engine/fullbleed-node", - "source_commit": "3e60340b2cb1a4275828ef717a886a93b93c9cc7", + "source_commit": "ae6e301ebc129a15aab89378f44beb81d63d4475", "source_directory": "examples/vue", - "package_version": "0.3.1", - "engine_version": "2.5.10", + "package_version": "0.3.2", + "engine_version": "2.5.11", "vue_version": "3.5.43", - "package_integrity": "sha512-95CVTnYKduXD5KcEj9MLfzPsqofahZB2BsJ62Dfg0tOTlPFEHT8vx/T3f8xp4VQYkihOPQdMDiWQzYNHJkLpWA==", - "zip_bytes": 30301, - "zip_sha256": "0de1074aaed21af1843069e6f811335fe67e638f44b16f8aa27185b50c93bb2b", + "package_integrity": "sha512-bzbTUn6Hcxu0YZoP38wkrJ/nZ33+rQfZq5itdpQUl7lIO9mR1m9LC5n/2KLxjj+7dAb8IhpYoVTSmbuhQyA5Vg==", + "zip_bytes": 30293, + "zip_sha256": "8fd2f6beacc82e1b4baacad6713c8c69b3bc8a035c8e3fc42477a4e41b61d1b6", "files": { "fullbleed-vue-starter/.gitignore": "c023fec2bf12476cb47709e859f1fbb785aeb1e03281e52141e0bee1ee7dad72", "fullbleed-vue-starter/LICENSE": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9", - "fullbleed-vue-starter/README.md": "92379177e243f455359ef3f3ddc385701474d859bf23ceabd5d472f4444964c7", + "fullbleed-vue-starter/README.md": "b157b91e6a93417c279b565f2b5ecb96c8299c3e0524b7531704348ba0bbe4e8", "fullbleed-vue-starter/index.html": "30d46eb1b5147bd3d9c580e7adaed5b5202f9b97ab598e189efda7c3d2d405be", - "fullbleed-vue-starter/package-lock.json": "75ce815032cacd7596af9435d1003680967e570fcbc32a398cb041a360febbbc", - "fullbleed-vue-starter/package.json": "470894ba1eb0e0676bc3a38b5fa69aa5cdac752f3c22110d70d54d20e9c97027", + "fullbleed-vue-starter/package-lock.json": "72269d20bb6fabb34779eac61bea9d2b9eaadf5afff09e5e968053c2418fe3c4", + "fullbleed-vue-starter/package.json": "262a2d42ec0067ff76d4c80398b01de7c2fc84c455f66fd7bb62517b30669c90", "fullbleed-vue-starter/public/favicon.svg": "3eed6dcf1013e48bc64886fed4cf815c609ed06b404742bdacdc44c1df8d3118", "fullbleed-vue-starter/src/App.vue": "0afa15196ccedd0b0f91293cc5e362799149a2752c59deaa377f4533825ea2af", "fullbleed-vue-starter/src/DocumentEditor.vue": "a3f3f8096d194e1eed6cd0cf2fb0a0606a04d40823ff7b794b9b1a0dbfd8c28a", @@ -29,5 +29,6 @@ "fullbleed-vue-starter/vite.config.js": "dfcc6c065fb26ada03802def672108735f4c2c35e0f30d11965ddfa796b8a0c0" }, "verification_workflow": "https://github.com/fullbleed-engine/fullbleed-node/actions/workflows/vue-starter.yml", - "local_ui_evidence": "https://github.com/fullbleed-engine/fullbleed-node/blob/3e60340b2cb1a4275828ef717a886a93b93c9cc7/verification/vue-starter.json" + "local_ui_evidence": "https://github.com/fullbleed-engine/fullbleed-node/blob/ae6e301ebc129a15aab89378f44beb81d63d4475/verification/starters-032.json", + "source_verification_run": "https://github.com/fullbleed-engine/fullbleed-node/actions/runs/37569111733" } diff --git a/docs/guides/browser-pdf.md b/docs/guides/browser-pdf.md index 471ee5d..47aedcb 100644 --- a/docs/guides/browser-pdf.md +++ b/docs/guides/browser-pdf.md @@ -18,11 +18,11 @@ Change the customer, reference, and ink color, or open **Edit the HTML & CSS** t paste your own template. Generate a preview, then download the actual PDF. All sample names, organizations, and amounts are fictional. -The downloadable starter uses **npm package 0.3.1**, wrapping **Fullbleed engine 2.5.10**. +The downloadable starter uses **npm package 0.3.2**, wrapping **Fullbleed engine 2.5.11**. The browser and Node entries share the pinned engine and bundled fonts. -For an existing application, **npm package 0.3.2** adds engine **2.5.11** and -fixes blank PNG previews for unembedded Helvetica, Times, and Courier faces. +This version fixes blank PNG previews for unembedded Helvetica, Times, and +Courier faces, including templates pasted into the starter. The [font-preview guide](https://github.com/fullbleed-engine/fullbleed-node/blob/v0.3.2/docs/standard-font-previews.md) explains the substitute designs and upgrade checks. Run the asset-copy command again after upgrading so the browser receives the matching runtime and notices. @@ -131,7 +131,7 @@ completion or cancellation requests worker termination before the promise settle Browsers do not expose a native thread-exit promise. Keep concurrent jobs bounded for the devices you support, especially when generating page previews. -The [0.3.1 release evidence](https://github.com/fullbleed-engine/fullbleed-node/releases/tag/v0.3.1) +The [0.3.2 release evidence](https://github.com/fullbleed-engine/fullbleed-node/releases/tag/v0.3.2) retains checks in Chrome, Firefox, and Playwright WebKit, including PDF/PNG comparison with the installed Node package, independent PDF text checks, cancellation, damaged assets, and recovery. Playwright WebKit is not branded diff --git a/docs/guides/nextjs-pdf.md b/docs/guides/nextjs-pdf.md index 4cedfd9..d7a2a83 100644 --- a/docs/guides/nextjs-pdf.md +++ b/docs/guides/nextjs-pdf.md @@ -34,8 +34,8 @@ Open `http://127.0.0.1:3000` and select **Download sample PDF**. The route `/api/invoices/NS-1042` returns the invoice as an attachment. The browser stays on the starter page. Use `npm run dev` while editing the app. -The lockfile pins Next.js 16.3.8, React 19.3.0 and Fullbleed Node 0.3.1, powered -by engine 2.5.10. Fullbleed is installed from npm. The registry tarball is +The lockfile pins Next.js 16.3.8, React 19.3.0 and Fullbleed Node 0.3.2, powered +by engine 2.5.11. Fullbleed is installed from npm. The registry tarball is byte-identical to the verified GitHub release. For an existing Node application, start with the [Node.js quickstart](../getting-started/node.md). diff --git a/docs/guides/react-pdf.md b/docs/guides/react-pdf.md index 7fe97ce..2f5575a 100644 --- a/docs/guides/react-pdf.md +++ b/docs/guides/react-pdf.md @@ -48,7 +48,7 @@ color and wait for **Ready**. **Download PDF** saves the generated document. Turn off **Update automatically** to generate only when you choose **Generate PDF**. **Cancel** stops a pending preview or active render. -The lockfile pins Fullbleed npm **0.3.1** / engine **2.5.10**, React **19.3.0**, +The lockfile pins Fullbleed npm **0.3.2** / engine **2.5.11**, React **19.3.0**, TypeScript **7.0.2**, and Vite **8.3.2**. The ZIP includes its source and lockfile; the build downloads the published dependencies and copies their verified runtime. @@ -79,7 +79,7 @@ through the SDK's `fonts` and `assets` options. Install the package and copy its runtime into your app's static directory: ```sh -npm install --save-exact fullbleed@0.3.1 +npm install --save-exact fullbleed@0.3.2 npx fullbleed-browser-assets public/fullbleed ``` @@ -146,6 +146,8 @@ independently checks their text and page sizes, and compares the default invoice and report bytes with the installed Node package. It also checks automatic and on-demand modes, fast edits, cancellation, recovery, unmount/remount, URL cleanup, and 1440/390/320px layouts. The docs build installs and checks the exact ZIP. +An edited-template check verifies unembedded Helvetica faces in the PDF and +visible text in its browser preview. These fixtures do not establish compatibility with every browser, device, or hosting policy. WebKit testing is not branded Safari certification. Worker diff --git a/docs/guides/vue-pdf.md b/docs/guides/vue-pdf.md index ec0cccb..38aa05d 100644 --- a/docs/guides/vue-pdf.md +++ b/docs/guides/vue-pdf.md @@ -47,7 +47,7 @@ color and wait for **Ready**, then choose **Download PDF**. Turn off **Update automatically** to generate on demand. **Cancel** stops a pending preview or active render. **Close editor** releases its resources; reopening starts fresh. -The lockfile pins Fullbleed npm **0.3.1** / engine **2.5.10**, Vue **3.5.43**, +The lockfile pins Fullbleed npm **0.3.2** / engine **2.5.11**, Vue **3.5.43**, TypeScript **6.0.3**, and Vite **8.3.2**. The build downloads the published dependencies and copies their verified runtime. TypeScript 6 is pinned for compatibility with the project's `vue-tsc` type checker. @@ -82,7 +82,7 @@ through the SDK's `fonts` and `assets` options. Install the package and copy its runtime into your static directory: ```sh -npm install --save-exact fullbleed@0.3.1 +npm install --save-exact fullbleed@0.3.2 npx fullbleed-browser-assets public/fullbleed ``` @@ -158,6 +158,8 @@ compares default PDF and preview bytes with the installed Node package. It exercises fast edits, both preview modes, cancellation, runtime-outage recovery, template editing, unmount/remount, URL cleanup, and 1440/390/320px layouts. The docs build installs and checks the exact downloadable ZIP. +An edited-template check verifies unembedded Helvetica faces in the PDF and +visible text in its browser preview. These fixtures do not establish compatibility with every device or hosting policy. WebKit testing is not branded Safari certification. Worker counts diff --git a/tools/build_browser_starter.py b/tools/build_browser_starter.py index 9567757..20172ac 100644 --- a/tools/build_browser_starter.py +++ b/tools/build_browser_starter.py @@ -49,7 +49,7 @@ project = workspace / 'fullbleed-browser-starter' package = json.loads((project / 'package.json').read_text()) lock = json.loads((project / 'package-lock.json').read_text()) -assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.1' +assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.2' assert package['devDependencies']['vite'] == '8.3.2' assert lock['packages']['node_modules/fullbleed']['integrity'] == manifest['package_integrity'] assert lock['packages']['node_modules/fullbleed']['resolved'].startswith('https://registry.npmjs.org/') @@ -64,7 +64,7 @@ installed = project / 'node_modules/fullbleed' assert json.loads((installed / 'package.json').read_text())['version'] == manifest['package_version'] runtime = json.loads((project / 'dist/fullbleed/build.json').read_text()) -assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.10' +assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.11' for name, expected in runtime['files'].items(): value = (project / 'dist/fullbleed' / name).read_bytes() assert len(value) == expected['bytes'] and digest(value) == expected['sha256'] diff --git a/tools/build_react_starter.py b/tools/build_react_starter.py index 4c8d90a..0a3f669 100644 --- a/tools/build_react_starter.py +++ b/tools/build_react_starter.py @@ -49,7 +49,7 @@ project = workspace / 'fullbleed-react-starter' package = json.loads((project / 'package.json').read_text()) lock = json.loads((project / 'package-lock.json').read_text()) -assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.1' +assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.2' assert package['devDependencies']['vite'] == '8.3.2' assert package['dependencies']['react'] == package['dependencies']['react-dom'] == manifest['react_version'] assert lock['packages']['node_modules/fullbleed']['integrity'] == manifest['package_integrity'] @@ -65,7 +65,7 @@ installed = project / 'node_modules/fullbleed' assert json.loads((installed / 'package.json').read_text())['version'] == manifest['package_version'] runtime = json.loads((project / 'dist/fullbleed/build.json').read_text()) -assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.10' +assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.11' for name, expected in runtime['files'].items(): value = (project / 'dist/fullbleed' / name).read_bytes() assert len(value) == expected['bytes'] and digest(value) == expected['sha256'] diff --git a/tools/build_vue_starter.py b/tools/build_vue_starter.py index 0b269bf..f2b74bd 100644 --- a/tools/build_vue_starter.py +++ b/tools/build_vue_starter.py @@ -49,7 +49,7 @@ project = workspace / 'fullbleed-vue-starter' package = json.loads((project / 'package.json').read_text()) lock = json.loads((project / 'package-lock.json').read_text()) -assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.1' +assert package['dependencies']['fullbleed'] == manifest['package_version'] == '0.3.2' assert package['devDependencies']['vite'] == '8.3.2' assert package['devDependencies']['typescript'] == '6.0.3' assert package['devDependencies']['vue-tsc'] == '3.3.12' @@ -67,7 +67,7 @@ installed = project / 'node_modules/fullbleed' assert json.loads((installed / 'package.json').read_text())['version'] == manifest['package_version'] runtime = json.loads((project / 'dist/fullbleed/build.json').read_text()) -assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.10' +assert runtime['packageVersion'] == manifest['package_version'] and runtime['engineVersion'] == '2.5.11' for name, expected in runtime['files'].items(): value = (project / 'dist/fullbleed' / name).read_bytes() assert len(value) == expected['bytes'] and digest(value) == expected['sha256'] diff --git a/tools/check_browser_starter.py b/tools/check_browser_starter.py index 105f784..89f06dd 100644 --- a/tools/check_browser_starter.py +++ b/tools/check_browser_starter.py @@ -11,6 +11,7 @@ from playwright.sync_api import sync_playwright, expect from pypdf import PdfReader +from starter_standard_fonts import verify_edited_preview parser=argparse.ArgumentParser(description=__doc__) parser.add_argument('--dist',type=Path,required=True) @@ -88,11 +89,12 @@ def download(name,pages,text): check('customized bytes differ from the default invoice',documents[-1]['sha256']!=documents[0]['sha256']) page.locator('#template-editor summary').click() page.locator('#html-source').fill('