@lupinum/nuxt-pdf 0.4.0-beta.3 → 0.4.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/CONFORMANCE.md +10 -4
  3. package/README.md +28 -0
  4. package/dist/agent/AGENTS.md +48 -0
  5. package/dist/agent/manifest.json +215 -0
  6. package/dist/agent/pages/docs/examples/supported-behavior.md +75 -0
  7. package/dist/agent/pages/docs/examples.md +163 -0
  8. package/dist/agent/pages/docs/getting-started/installation.md +90 -0
  9. package/dist/agent/pages/docs/getting-started/quickstart.md +126 -0
  10. package/dist/agent/pages/docs/getting-started.md +61 -0
  11. package/dist/agent/pages/docs/guides/contents-links-bookmarks.md +123 -0
  12. package/dist/agent/pages/docs/guides/deployment.md +118 -0
  13. package/dist/agent/pages/docs/guides/errors-and-debugging.md +90 -0
  14. package/dist/agent/pages/docs/guides/images-and-fonts.md +102 -0
  15. package/dist/agent/pages/docs/guides/recipes.md +258 -0
  16. package/dist/agent/pages/docs/guides/remote-images.md +72 -0
  17. package/dist/agent/pages/docs/guides/reusable-components.md +81 -0
  18. package/dist/agent/pages/docs/guides/standalone-node.md +107 -0
  19. package/dist/agent/pages/docs/guides/svg-graphics.md +165 -0
  20. package/dist/agent/pages/docs/guides/testing.md +119 -0
  21. package/dist/agent/pages/docs/learn/document-tree.md +91 -0
  22. package/dist/agent/pages/docs/learn/runtime-and-data.md +63 -0
  23. package/dist/agent/pages/docs/learn/styling-and-layout.md +79 -0
  24. package/dist/agent/pages/docs/learn/templates-and-registry.md +96 -0
  25. package/dist/agent/pages/docs/reference/composables.md +55 -0
  26. package/dist/agent/pages/docs/reference/define-pdf.md +96 -0
  27. package/dist/agent/pages/docs/reference/errors-and-limits.md +89 -0
  28. package/dist/agent/pages/docs/reference/module-options.md +104 -0
  29. package/dist/agent/pages/docs/reference/page-sizes.md +54 -0
  30. package/dist/agent/pages/docs/reference/primitives.md +216 -0
  31. package/dist/agent/pages/docs/reference/registry.md +185 -0
  32. package/dist/agent/pages/docs/reference/standalone.md +53 -0
  33. package/dist/agent/pages/docs/reference/styles.md +176 -0
  34. package/dist/agent/pages/docs/reference/test-utilities.md +124 -0
  35. package/dist/build.mjs +2 -2
  36. package/dist/module.json +1 -1
  37. package/dist/module.mjs +14 -11
  38. package/dist/runtime/components/stubs.d.ts +22 -10
  39. package/dist/runtime/components/stubs.js +22 -27
  40. package/dist/runtime/server/assets/resolve-asset.js +2 -40
  41. package/dist/runtime/server/preview.js +1 -1
  42. package/dist/shared/{nuxt-pdf.DMC_Rdsz.mjs → nuxt-pdf.C-E8MM_K.mjs} +1 -0
  43. package/dist/shared/{nuxt-pdf.D3hUPqOJ.mjs → nuxt-pdf.CjVyPF31.mjs} +2 -2
  44. package/dist/test.mjs +1 -1
  45. package/package.json +17 -13
package/CHANGELOG.md CHANGED
@@ -4,6 +4,40 @@ All notable changes to `@lupinum/nuxt-pdf` are recorded here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres
5
5
  to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 0.4.0-beta.5
8
+
9
+ [compare changes](https://github.com/lupinum-dev/nuxt-pdf/compare/v0.4.0-beta.4...0.4.0-beta.5)
10
+
11
+ ### Added
12
+
13
+ - **docs:** Ship versioned package guidance ([ca81a32](https://github.com/lupinum-dev/nuxt-pdf/commit/ca81a32))
14
+
15
+ ### Fixed
16
+
17
+ - **deps:** Clear workspace advisories and update Vitest ([#59](https://github.com/lupinum-dev/nuxt-pdf/pull/59))
18
+
19
+ ## 0.4.0-beta.4
20
+
21
+ [compare changes](https://github.com/lupinum-dev/nuxt-pdf/compare/v0.4.0-beta.3...0.4.0-beta.4)
22
+
23
+ ### Fixed
24
+
25
+ - **deps:** Enforce quarantine in package consumers ([#48](https://github.com/lupinum-dev/nuxt-pdf/pull/48))
26
+ - **assets:** Revalidate disk images across renders ([#49](https://github.com/lupinum-dev/nuxt-pdf/pull/49))
27
+ - **dev:** Export registered PDF component guards ([#50](https://github.com/lupinum-dev/nuxt-pdf/pull/50))
28
+ - **preview:** Rebuild watched templates before refreshing ([#51](https://github.com/lupinum-dev/nuxt-pdf/pull/51))
29
+ - **release:** Bind package evidence to its source graph ([#52](https://github.com/lupinum-dev/nuxt-pdf/pull/52))
30
+
31
+ ### Maintenance
32
+
33
+ - **maintenance:** Verify PDF commands without repeated work ([#53](https://github.com/lupinum-dev/nuxt-pdf/pull/53))
34
+
35
+ ### Tests
36
+
37
+ - **compatibility:** Verify declared PDF consumer versions ([#54](https://github.com/lupinum-dev/nuxt-pdf/pull/54))
38
+ - **assets:** Describe per-render disk validation ([#55](https://github.com/lupinum-dev/nuxt-pdf/pull/55))
39
+ - **production:** Tolerate fixture text whitespace ([#56](https://github.com/lupinum-dev/nuxt-pdf/pull/56))
40
+
7
41
  ## 0.4.0-beta.3 - 2026-09-03
8
42
 
9
43
  ### Added
package/CONFORMANCE.md CHANGED
@@ -1,11 +1,11 @@
1
- # Nuxt PDF 0.4.0-beta.3 conformance
1
+ # Nuxt PDF 0.4.0-beta.5 conformance
2
2
 
3
3
  Nuxt PDF claims behavioral compatibility for a deliberately small, tested
4
4
  corpus. It does not claim full React PDF API or test-suite compatibility.
5
5
 
6
6
  ## Version boundary
7
7
 
8
- | Layer | 0.4.0-beta.3 boundary |
8
+ | Layer | 0.4.0-beta.5 boundary |
9
9
  |---|---|
10
10
  | Node.js | `^22.14.0`, `^24.0.0`, or `^26.0.0` |
11
11
  | Nuxt | `^4.4.8` |
@@ -217,7 +217,7 @@ checking.
217
217
 
218
218
  ### Vue and Nuxt authoring
219
219
 
220
- The 0.4.0-beta.2 tests verify:
220
+ The 0.4.0-beta.5 tests verify:
221
221
 
222
222
  - `PdfDocument`, `PdfPage`, `PdfView`, `PdfText`, `PdfImage`, `PdfLink`, and
223
223
  `PdfNote`;
@@ -261,6 +261,10 @@ The 0.4.0-beta.2 tests verify:
261
261
  content type;
262
262
  - development preview index, viewer, raw PDF, and named scenarios, backed by a
263
263
  separate internal development sidecar;
264
+ - development guards for every global PDF component, including Nuxt
265
+ auto-import misuse outside a PDF template;
266
+ - watched template rebuilds and whole-viewer refreshes that keep the selected
267
+ scenario and replace document bytes with their matching diagnostics;
264
268
  - a production Nitro route rendering through the generated registry;
265
269
  - structural removal of `sampleData` and `scenarios` during production SFC
266
270
  compilation, with unique fixture canaries and preview-only API tokens rejected
@@ -342,6 +346,8 @@ shows up without a restart. The tested boundary includes:
342
346
  - TTF, OTF, and WOFF2 signature/extension/structure validation,
343
347
  registration validation, source byte limits, and source-removal rendering;
344
348
  - explicit local `pdfs/assets` and `pdfs/fonts` roots;
349
+ - independent image validation across roots and after same-size,
350
+ same-timestamp development edits;
345
351
  - rejection of absolute paths, traversal, missing assets, ambiguous sources,
346
352
  unsupported URLs, and symlink escapes; and
347
353
  - font rendering after its source file is removed, and image resolution from
@@ -450,7 +456,7 @@ parser, not two. Claimed:
450
456
  Verified end-to-end against a real rendered template, including assertion
451
457
  failure messages, in `test/test-utils-public.test.ts`.
452
458
 
453
- ## Explicitly not claimed in 0.4.0-beta.2
459
+ ## Explicitly not claimed in 0.4.0-beta.5
454
460
 
455
461
  - Full React PDF component, hook, browser-helper, or test-suite parity.
456
462
  - React runtime compatibility or React-shaped dynamic callback results.
package/README.md CHANGED
@@ -73,6 +73,34 @@ export default defineNuxtConfig({
73
73
  })
74
74
  ```
75
75
 
76
+ <!-- BEGIN:consumer-onboarding -->
77
+
78
+ ### Use a coding agent
79
+
80
+ A coding agent is a development tool that can inspect and change your project.
81
+ After installation, copy this prompt into your coding agent:
82
+
83
+ ```text
84
+ Add Nuxt PDF to this Nuxt application and render one PDF from a Vue template.
85
+ Read the project's existing instructions first. Resolve
86
+ @lupinum/nuxt-pdf/agent-docs from this application's directory and read its
87
+ starting pages. Use the installed version's examples and public types. Preserve
88
+ existing routes, security limits, conventions, and AGENTS.md instructions. Add
89
+ or update one short Nuxt PDF pointer in AGENTS.md if the project allows it; do
90
+ not duplicate the documentation. If the file is absent, create only that
91
+ pointer. Report missing guidance. Verify the server route, PDF output, and one
92
+ invalid request.
93
+ ```
94
+
95
+ If the installed package has no `agent-docs` export, read its packaged README,
96
+ types, and `CONFORMANCE.md`. Use documentation from the matching source tag when
97
+ more detail is needed. Installing or updating the package does not edit project
98
+ instructions. The pointer resolves the installed package, so upgrades and
99
+ rollbacks select the matching documentation without copying it into your
100
+ application.
101
+
102
+ <!-- END:consumer-onboarding -->
103
+
76
104
  ## Quick start
77
105
 
78
106
  Create `pdfs/invoice.vue`:
@@ -0,0 +1,48 @@
1
+ # @lupinum/nuxt-pdf
2
+
3
+ Documentation for installed version 0.4.0-beta.5.
4
+
5
+ Read the relevant local pages before changing this package’s integration.
6
+ Project instructions govern architecture, style and permissions.
7
+
8
+ ## Start here
9
+
10
+ - [Install Nuxt PDF](./pages/docs/getting-started/installation.md) — /docs/getting-started/installation
11
+ - [Module options](./pages/docs/reference/module-options.md) — /docs/reference/module-options
12
+
13
+ ## Find a page
14
+
15
+ The index below maps public documentation routes to this installed snapshot.
16
+ For links to this documentation site, use the matching local page in manifest.json
17
+ instead of fetching a possibly different website version. Preserve URL fragments.
18
+ External dependencies have their own versioned contracts. Report missing guidance.
19
+
20
+ - [Example gallery](./pages/docs/examples.md) — /docs/examples
21
+ - [Supported behavior and limitations](./pages/docs/examples/supported-behavior.md) — /docs/examples/supported-behavior
22
+ - [Overview](./pages/docs/getting-started.md) — /docs/getting-started
23
+ - [Install Nuxt PDF](./pages/docs/getting-started/installation.md) — /docs/getting-started/installation
24
+ - [Render your first PDF](./pages/docs/getting-started/quickstart.md) — /docs/getting-started/quickstart
25
+ - [Add links, bookmarks, and a table of contents](./pages/docs/guides/contents-links-bookmarks.md) — /docs/guides/contents-links-bookmarks
26
+ - [Deploy and operate](./pages/docs/guides/deployment.md) — /docs/guides/deployment
27
+ - [Diagnose render failures](./pages/docs/guides/errors-and-debugging.md) — /docs/guides/errors-and-debugging
28
+ - [Add images and fonts](./pages/docs/guides/images-and-fonts.md) — /docs/guides/images-and-fonts
29
+ - [Production recipes](./pages/docs/guides/recipes.md) — /docs/guides/recipes
30
+ - [Configure remote images](./pages/docs/guides/remote-images.md) — /docs/guides/remote-images
31
+ - [Build reusable document components](./pages/docs/guides/reusable-components.md) — /docs/guides/reusable-components
32
+ - [Render outside Nitro](./pages/docs/guides/standalone-node.md) — /docs/guides/standalone-node
33
+ - [Draw SVG graphics](./pages/docs/guides/svg-graphics.md) — /docs/guides/svg-graphics
34
+ - [Test a PDF](./pages/docs/guides/testing.md) — /docs/guides/testing
35
+ - [The document tree](./pages/docs/learn/document-tree.md) — /docs/learn/document-tree
36
+ - [Runtime and data loading](./pages/docs/learn/runtime-and-data.md) — /docs/learn/runtime-and-data
37
+ - [Styling and layout](./pages/docs/learn/styling-and-layout.md) — /docs/learn/styling-and-layout
38
+ - [Templates and the registry](./pages/docs/learn/templates-and-registry.md) — /docs/learn/templates-and-registry
39
+ - [Composables](./pages/docs/reference/composables.md) — /docs/reference/composables
40
+ - [definePdf](./pages/docs/reference/define-pdf.md) — /docs/reference/define-pdf
41
+ - [Errors and limits](./pages/docs/reference/errors-and-limits.md) — /docs/reference/errors-and-limits
42
+ - [Module options](./pages/docs/reference/module-options.md) — /docs/reference/module-options
43
+ - [Page sizes](./pages/docs/reference/page-sizes.md) — /docs/reference/page-sizes
44
+ - [Primitives](./pages/docs/reference/primitives.md) — /docs/reference/primitives
45
+ - [Registry and render result](./pages/docs/reference/registry.md) — /docs/reference/registry
46
+ - [Standalone build and runtime](./pages/docs/reference/standalone.md) — /docs/reference/standalone
47
+ - [Styles](./pages/docs/reference/styles.md) — /docs/reference/styles
48
+ - [Test utilities](./pages/docs/reference/test-utilities.md) — /docs/reference/test-utilities
@@ -0,0 +1,215 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "name": "@lupinum/nuxt-pdf",
4
+ "version": "0.4.0-beta.5",
5
+ "entrySha256": "51269576487bbfde32f8e920ae5e3cb6915af6d39f4da33149bbe87695507ee9",
6
+ "startRoutes": [
7
+ "/docs/getting-started/installation",
8
+ "/docs/reference/module-options"
9
+ ],
10
+ "pages": [
11
+ {
12
+ "title": "Example gallery",
13
+ "route": "/docs/examples",
14
+ "url": "https://nuxt-pdf.lupinum.com/docs/examples",
15
+ "file": "pages/docs/examples.md",
16
+ "sha256": "ef7a42c0ce6140e02375fd4435455424d7c6cfea47a68529c6f6d2520d797c8f"
17
+ },
18
+ {
19
+ "title": "Supported behavior and limitations",
20
+ "route": "/docs/examples/supported-behavior",
21
+ "url": "https://nuxt-pdf.lupinum.com/docs/examples/supported-behavior",
22
+ "file": "pages/docs/examples/supported-behavior.md",
23
+ "sha256": "a6911a6f48321d1f40367de827d268aa5da563b205066f4558e23f37db96622e"
24
+ },
25
+ {
26
+ "title": "Overview",
27
+ "route": "/docs/getting-started",
28
+ "url": "https://nuxt-pdf.lupinum.com/docs/getting-started",
29
+ "file": "pages/docs/getting-started.md",
30
+ "sha256": "2b4b8cf86ebd7f07f4e66050e025e81e0e987ae0f102ac99a9b62e2ec70fc00d"
31
+ },
32
+ {
33
+ "title": "Install Nuxt PDF",
34
+ "route": "/docs/getting-started/installation",
35
+ "url": "https://nuxt-pdf.lupinum.com/docs/getting-started/installation",
36
+ "file": "pages/docs/getting-started/installation.md",
37
+ "sha256": "4f5e64077d1de654b6cf073f1dbb8bb28eb81df7955dc74ec99dcf015599f9de"
38
+ },
39
+ {
40
+ "title": "Render your first PDF",
41
+ "route": "/docs/getting-started/quickstart",
42
+ "url": "https://nuxt-pdf.lupinum.com/docs/getting-started/quickstart",
43
+ "file": "pages/docs/getting-started/quickstart.md",
44
+ "sha256": "a48711287b894ed1b63d4b8bf3c68afec6d855b42dc317b6d0bc25eac7b861ce"
45
+ },
46
+ {
47
+ "title": "Add links, bookmarks, and a table of contents",
48
+ "route": "/docs/guides/contents-links-bookmarks",
49
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/contents-links-bookmarks",
50
+ "file": "pages/docs/guides/contents-links-bookmarks.md",
51
+ "sha256": "1a1041552abf36aeebbda896890f8f0eedda9802aeeb8b35c525f0306f52827f"
52
+ },
53
+ {
54
+ "title": "Deploy and operate",
55
+ "route": "/docs/guides/deployment",
56
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/deployment",
57
+ "file": "pages/docs/guides/deployment.md",
58
+ "sha256": "86a74925ec588c75ba1ccc08e833203c76a279ddc2ea31936eecd6fd905f274f"
59
+ },
60
+ {
61
+ "title": "Diagnose render failures",
62
+ "route": "/docs/guides/errors-and-debugging",
63
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/errors-and-debugging",
64
+ "file": "pages/docs/guides/errors-and-debugging.md",
65
+ "sha256": "3353c927d400557e6e7b7e861a49abc1a6a01240fa5e9c4a8fd621cc8baa6424"
66
+ },
67
+ {
68
+ "title": "Add images and fonts",
69
+ "route": "/docs/guides/images-and-fonts",
70
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/images-and-fonts",
71
+ "file": "pages/docs/guides/images-and-fonts.md",
72
+ "sha256": "cc31e2b4143060aaa4eaa78092864da7a6e3321a97474815be576497e203ef9c"
73
+ },
74
+ {
75
+ "title": "Production recipes",
76
+ "route": "/docs/guides/recipes",
77
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/recipes",
78
+ "file": "pages/docs/guides/recipes.md",
79
+ "sha256": "5146c107305561922599290216f2eba21dc0ca887a2863376a4ca46ef176e3d9"
80
+ },
81
+ {
82
+ "title": "Configure remote images",
83
+ "route": "/docs/guides/remote-images",
84
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/remote-images",
85
+ "file": "pages/docs/guides/remote-images.md",
86
+ "sha256": "1b7a05b48cfac8049c89d60310c2be078b86689a07968a54f31a0530bea16ee2"
87
+ },
88
+ {
89
+ "title": "Build reusable document components",
90
+ "route": "/docs/guides/reusable-components",
91
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/reusable-components",
92
+ "file": "pages/docs/guides/reusable-components.md",
93
+ "sha256": "9a269143397420d8a879a4657c0ab960d303203af561648d63ba58052eb3519c"
94
+ },
95
+ {
96
+ "title": "Render outside Nitro",
97
+ "route": "/docs/guides/standalone-node",
98
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/standalone-node",
99
+ "file": "pages/docs/guides/standalone-node.md",
100
+ "sha256": "e88d80f0bd0d67a46e6cafad12eb167f7a1377b56015686ffd131dc0f49dc55e"
101
+ },
102
+ {
103
+ "title": "Draw SVG graphics",
104
+ "route": "/docs/guides/svg-graphics",
105
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/svg-graphics",
106
+ "file": "pages/docs/guides/svg-graphics.md",
107
+ "sha256": "bbec519d3597b93b61b3c9e51f1b225ddf4cdecb96a311e6320ca68db309a313"
108
+ },
109
+ {
110
+ "title": "Test a PDF",
111
+ "route": "/docs/guides/testing",
112
+ "url": "https://nuxt-pdf.lupinum.com/docs/guides/testing",
113
+ "file": "pages/docs/guides/testing.md",
114
+ "sha256": "6682ecc97f05cb034ca9ca3c066312b340847daf4ce96c239977d9b222310a9b"
115
+ },
116
+ {
117
+ "title": "The document tree",
118
+ "route": "/docs/learn/document-tree",
119
+ "url": "https://nuxt-pdf.lupinum.com/docs/learn/document-tree",
120
+ "file": "pages/docs/learn/document-tree.md",
121
+ "sha256": "68ed0fa2e2e12b4d29314be363d10cb43cb928cfff3480b0210544bfc3d0d436"
122
+ },
123
+ {
124
+ "title": "Runtime and data loading",
125
+ "route": "/docs/learn/runtime-and-data",
126
+ "url": "https://nuxt-pdf.lupinum.com/docs/learn/runtime-and-data",
127
+ "file": "pages/docs/learn/runtime-and-data.md",
128
+ "sha256": "9165121817b58159a1d49a2d92c98d40a30b2a78e05f95b28bb7b089ff5dbbcb"
129
+ },
130
+ {
131
+ "title": "Styling and layout",
132
+ "route": "/docs/learn/styling-and-layout",
133
+ "url": "https://nuxt-pdf.lupinum.com/docs/learn/styling-and-layout",
134
+ "file": "pages/docs/learn/styling-and-layout.md",
135
+ "sha256": "9d622634064c18e76e1be2e6dfe33cdff45ff42c249c655fdb5702d846deb851"
136
+ },
137
+ {
138
+ "title": "Templates and the registry",
139
+ "route": "/docs/learn/templates-and-registry",
140
+ "url": "https://nuxt-pdf.lupinum.com/docs/learn/templates-and-registry",
141
+ "file": "pages/docs/learn/templates-and-registry.md",
142
+ "sha256": "89cb41b292e81984bdfd087fe12a6838590b0e38a967d72823c5493a8833c564"
143
+ },
144
+ {
145
+ "title": "Composables",
146
+ "route": "/docs/reference/composables",
147
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/composables",
148
+ "file": "pages/docs/reference/composables.md",
149
+ "sha256": "cbd079540924ceee433d783ac43d5b4d1d35b15675f0f08f474042650fbc8b9a"
150
+ },
151
+ {
152
+ "title": "definePdf",
153
+ "route": "/docs/reference/define-pdf",
154
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/define-pdf",
155
+ "file": "pages/docs/reference/define-pdf.md",
156
+ "sha256": "056dc09669d8cc4ea7a9e7e6dc0021e047e39ea546c610893cdcefeca4c0dce2"
157
+ },
158
+ {
159
+ "title": "Errors and limits",
160
+ "route": "/docs/reference/errors-and-limits",
161
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/errors-and-limits",
162
+ "file": "pages/docs/reference/errors-and-limits.md",
163
+ "sha256": "1b762cb9222cd5f71ab28fdfdb047000bf2359c7aa6702e8fa79b220d4015ea0"
164
+ },
165
+ {
166
+ "title": "Module options",
167
+ "route": "/docs/reference/module-options",
168
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/module-options",
169
+ "file": "pages/docs/reference/module-options.md",
170
+ "sha256": "7bd4db4121d02c8ec95a8e36788eb769baff4c6260357e1700ce16f35f3cbaad"
171
+ },
172
+ {
173
+ "title": "Page sizes",
174
+ "route": "/docs/reference/page-sizes",
175
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/page-sizes",
176
+ "file": "pages/docs/reference/page-sizes.md",
177
+ "sha256": "11421ac6d9ead36da06c839022a4be259fcf75f0d6db0d6860cdc5a4acaf2fbf"
178
+ },
179
+ {
180
+ "title": "Primitives",
181
+ "route": "/docs/reference/primitives",
182
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/primitives",
183
+ "file": "pages/docs/reference/primitives.md",
184
+ "sha256": "10d1ab379ffd44aae6a1f28123824ab1b8708809bc503a223c27ac31c0e97236"
185
+ },
186
+ {
187
+ "title": "Registry and render result",
188
+ "route": "/docs/reference/registry",
189
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/registry",
190
+ "file": "pages/docs/reference/registry.md",
191
+ "sha256": "a37db3268164ecb17745c18f6ef008fd24e8e568d24eed8747bdfcd169e311fb"
192
+ },
193
+ {
194
+ "title": "Standalone build and runtime",
195
+ "route": "/docs/reference/standalone",
196
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/standalone",
197
+ "file": "pages/docs/reference/standalone.md",
198
+ "sha256": "cd7b4e5e68c372fb1ca4f02642abad01040d115504f6eb18ff307d94f495cf4d"
199
+ },
200
+ {
201
+ "title": "Styles",
202
+ "route": "/docs/reference/styles",
203
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/styles",
204
+ "file": "pages/docs/reference/styles.md",
205
+ "sha256": "b59ef442049b49504b3f0938c89baeff4ebbbe0522d36e18be2ab2a6a32d6eb8"
206
+ },
207
+ {
208
+ "title": "Test utilities",
209
+ "route": "/docs/reference/test-utilities",
210
+ "url": "https://nuxt-pdf.lupinum.com/docs/reference/test-utilities",
211
+ "file": "pages/docs/reference/test-utilities.md",
212
+ "sha256": "81dc793263f88b0238fcba3717afa4a2b829e8f7bbdb713ec312e2b43b44ca1a"
213
+ }
214
+ ]
215
+ }
@@ -0,0 +1,75 @@
1
+ ---
2
+ title: "Supported behavior and limitations"
3
+ description: "The public compatibility boundary and where to find its executable evidence."
4
+ url: "https://nuxt-pdf.lupinum.com/docs/examples/supported-behavior"
5
+ route: "/docs/examples/supported-behavior"
6
+ locale: "en"
7
+ section: "Documentation"
8
+ collection: "docs"
9
+ source: "ginko-content"
10
+ ---
11
+
12
+ # Supported behavior and limitations
13
+
14
+ > The public compatibility boundary and where to find its executable evidence.
15
+
16
+ Nuxt PDF supports the behavior listed in its public guides and reference pages
17
+ against exact pinned layout, font, and serialization packages. It does not claim
18
+ the complete React PDF API or test suite.
19
+
20
+ ## Supported areas
21
+
22
+ The repository tests these user-facing areas:
23
+
24
+ - document trees, pagination, flex layout, styles, text, and raster images;
25
+ - local fonts and admitted local or allowlisted remote image sources;
26
+ - metadata, links, notes, bookmarks, and destination page numbers;
27
+ - SVG shapes, gradients, clip paths, transforms, and SVG text;
28
+ - semantic PDF inspection and raster snapshot helpers;
29
+ - production removal of preview routes and preview data;
30
+ - bounded render time, tree size, image admission, page count, and output size.
31
+
32
+ The detailed support status for scripts and fonts is in
33
+ [Add images and fonts](/raw/docs/guides/images-and-fonts.md). Exact primitive and style
34
+ support belongs to the [reference section](/raw/docs/reference/primitives.md).
35
+
36
+ ## Differences from React PDF
37
+
38
+ Three behaviors differ where matching the pinned lower engine would produce a
39
+ wrong or unstable public result:
40
+
41
+ - A table-of-contents destination resolves to the section's first page.
42
+ - Dynamic page text does not inherit a `lineHeight` multiplier. Apply line
43
+ height to static `PdfText` instead.
44
+ - Explicit zero values keep SVG meaning for fill opacity, stroke width, and
45
+ supported gradient coordinates.
46
+
47
+ These differences have geometry or raster regression coverage.
48
+
49
+ ## Outside the current boundary
50
+
51
+ Nuxt PDF does not claim:
52
+
53
+ - full React PDF API, hook, browser-helper, or runtime compatibility;
54
+ - Nuxt 3, Node 20, browser rendering, or edge rendering;
55
+ - HTML printing, browser CSS, tables, charts, forms, signing, editing, or PDF
56
+ merging as built-in features;
57
+ - tagged PDF, PDF/UA, or archival compliance profiles;
58
+ - byte-identical output across operating systems and viewers;
59
+ - authenticated remote requests, custom headers, remote fonts, or SSRF
60
+ protection beyond the exact-prefix allowlist;
61
+ - SVG image files, SVG markers, or the complete browser SVG model;
62
+ - multi-pass resolution of values other than destination page numbers.
63
+
64
+ ## Evidence record
65
+
66
+ This page is the public summary. Maintainers and reviewers can inspect:
67
+
68
+ - [CONFORMANCE.md](https://github.com/lupinum-dev/nuxt-pdf/blob/main/CONFORMANCE.md)
69
+ for version pins, paired comparisons, tested fixtures, and explicit
70
+ non-claims;
71
+ - [CONTRACTS.md](https://github.com/lupinum-dev/nuxt-pdf/blob/main/src/runtime/server/engine/CONTRACTS.md)
72
+ for the renderer's durable engine contracts.
73
+
74
+ When the documentation and public source disagree, the source is authoritative
75
+ and the documentation needs a correction.
@@ -0,0 +1,163 @@
1
+ ---
2
+ title: "Example gallery"
3
+ description: "Six playground templates and the technique that each template demonstrates."
4
+ url: "https://nuxt-pdf.lupinum.com/docs/examples"
5
+ route: "/docs/examples"
6
+ locale: "en"
7
+ section: "Documentation"
8
+ collection: "docs"
9
+ source: "ginko-content"
10
+ ---
11
+
12
+ # Example gallery
13
+
14
+ > Six playground templates and the technique that each template demonstrates.
15
+
16
+ The playground under `playground/pdfs/` ships six complete templates. Each is an
17
+ ordinary `.vue` single-file component discovered by the module, rendered through
18
+ the same registry in development and production, and covered by an end-to-end
19
+ rendering test. Selected visually load-bearing showcases additionally compare
20
+ reviewed raster baselines. Run `pnpm dev` and open `/_pdf` to browse them, or
21
+ read each source alongside the excerpts below.
22
+
23
+ <info icon="lucide:info">
24
+ `renderPdfSfc` compiles the same nested child-SFC graph as the production Nuxt
25
+ module. The packed-package gate exercises typed child props, a local image, and
26
+ multiple local font faces.
27
+ </info>
28
+
29
+ ## At a glance
30
+
31
+ | Template | Source | Demonstrates |
32
+ | --- | --- | --- |
33
+ | Invoice | `pdfs/invoice.vue` | Typed props, computed totals, a fixed footer, dynamic page count |
34
+ | Report | `pdfs/report.vue` | `usePdfPageNumbers` table of contents, internal links, bookmarks |
35
+ | Annual report | `pdfs/annual-report.vue` | SVG bar / line / donut charts and tables drawn from Views |
36
+ | Certificate | `pdfs/certificate.vue` | SVG ornament craft with an engraver's border and a seal |
37
+ | E-book | `pdfs/ebook.vue` | `usePdfPageNumbers` with chapter-aware running matter |
38
+ | Menu | `pdfs/menu.vue` | Pure typography, diacritics, dotted leaders, tabular prices |
39
+
40
+ ## E-book with chapter-aware running matter
41
+
42
+ _The Reed Line_ is a 21-page digest novella. It reads the resolved page map from
43
+ [`usePdfPageNumbers`](/raw/docs/reference/composables.md) twice: once to print a
44
+ Contents page with real page numbers, and once for a running foot that names the
45
+ **current** chapter on every page it repeats onto. The chapter is derived from
46
+ measured pagination, never hard-coded.
47
+
48
+ ```vue [pdfs/ebook.vue]
49
+ const pageNumbers = usePdfPageNumbers()
50
+
51
+ // Derive the current chapter for any page from the resolved start-page map.
52
+ const chapterAt = (pageNumber: number): Ebook['chapters'][number] => {
53
+ let current = ebook.chapters[0]!
54
+ for (const chapter of ebook.chapters) {
55
+ const start = pageNumbers[chapter.id]
56
+ if (typeof start === 'number' && start <= pageNumber) current = chapter
57
+ }
58
+ return current
59
+ }
60
+ ```
61
+
62
+ The foot is a single `fixed` node whose `:render` closes over `chapterAt`, so one
63
+ callback prints the right chapter and folio on every page:
64
+
65
+ ```vue [pdfs/ebook.vue]
66
+ <PdfText
67
+ fixed
68
+ :render="({ pageNumber }) => `${chapterAt(pageNumber).title} · ${pageNumber}`"
69
+ :style="footStyle"
70
+ />
71
+ ```
72
+
73
+ ## Annual report with SVG charts and View tables
74
+
75
+ The Fieldnote Studio annual report draws a grouped bar chart, a line chart with a
76
+ gradient area tint, and a donut. It uses the [SVG primitives](/raw/docs/guides/svg-graphics.md),
77
+ with every figure computed from one canonical `YearFigures` source. The donut
78
+ segments come from a pure geometry model and render as a `v-for` of paths:
79
+
80
+ ```vue [pdfs/annual-report.vue]
81
+ <PdfSvg :viewBox="`0 0 ${donut.size} ${donut.size}`" :style="{ width: donut.size, height: donut.size }">
82
+ <PdfPath
83
+ v-for="segment in donut.segments"
84
+ :key="segment.id"
85
+ :d="segment.d"
86
+ :fill="segment.fill"
87
+ :transform="segment.transform"
88
+ />
89
+ </PdfSvg>
90
+ ```
91
+
92
+ The financial statement has no first-class table primitive. It uses
93
+ `View` rows with right-aligned tabular numerals, hairline rules above totals, and
94
+ parenthesised outflows. The quarter and sector breakdowns provably sum to the
95
+ yearly totals (asserted in the template's test).
96
+
97
+ ## Certificate with SVG ornaments
98
+
99
+ The certificate is a single A4 landscape page whose decoration is drawn entirely
100
+ from primitives: a double-rule engraver's border with corner diamonds, and a
101
+ concentric seal with two rules, a 32-dot beaded coin edge, a five-point star, and a
102
+ single bronze `RadialGradient` used once.
103
+
104
+ ```vue [pdfs/components/certificate/CertificateSeal.vue]
105
+ <script setup lang="ts">
106
+ // Evenly spaced dots in the band between the two rules.
107
+ const beads = Array.from({ length: 32 }, (_, index) => {
108
+ const angle = (index / 32) * Math.PI * 2 - Math.PI / 2
109
+ return { cx: 50 + 45.2 * Math.cos(angle), cy: 50 + 45.2 * Math.sin(angle) }
110
+ })
111
+ </script>
112
+
113
+ <template>
114
+ <PdfSvg view-box="0 0 100 100">
115
+ <PdfDefs>
116
+ <PdfRadialGradient id="seal-bronze" cx="0.5" cy="0.38" r="0.62">
117
+ <PdfStop offset="0" stop-color="#E7CC86" />
118
+ <PdfStop offset="0.55" stop-color="#C9A24B" />
119
+ <PdfStop offset="1" stop-color="#8A6A2F" />
120
+ </PdfRadialGradient>
121
+ </PdfDefs>
122
+ <PdfCircle
123
+ v-for="(bead, index) in beads"
124
+ :key="`bead-${index}`"
125
+ :cx="bead.cx"
126
+ :cy="bead.cy"
127
+ :r="0.75"
128
+ />
129
+ </PdfSvg>
130
+ </template>
131
+ ```
132
+
133
+ The decorative layers are absolutely positioned, so a long recipient name wraps
134
+ at spaces to two centered lines and the page can never spill to a second sheet.
135
+
136
+ ## Menu with typography and diacritics
137
+
138
+ The Gasthaus Alpenrose card is two A5 pages of typography without borders or
139
+ boxes. German dish names carry their umlauts through rendering and extraction,
140
+ and a flex-`1` dotted leader ties each name to a right-aligned tabular price:
141
+
142
+ ```vue [pdfs/menu.vue]
143
+ <PdfView :style="{ alignItems: 'flex-end', flexDirection: 'row' }">
144
+ <PdfText :style="{ fontFamily: 'Inter', fontSize: 10, fontWeight: 600 }">
145
+ {{ dish.name }}
146
+ </PdfText>
147
+ <PdfView :style="{ flex: 1, marginHorizontal: 7, marginBottom: 2,
148
+ borderBottomWidth: 0.75, borderBottomStyle: 'dotted', borderBottomColor: leader }" />
149
+ <PdfText :style="{ fontFamily: 'Inter', fontSize: 10, textAlign: 'right', width: 32 }">
150
+ {{ formatMenuPrice(dish.price) }}
151
+ </PdfText>
152
+ </PdfView>
153
+ ```
154
+
155
+ Prices use the locale format. For example, `9.5` becomes `9,50`. The whole card
156
+ is data-driven, so the `winter` scenario swaps every dish and pour without
157
+ touching the template.
158
+
159
+ <idea icon="lucide:lightbulb">
160
+ Every template ships `sampleData` and at least one named `scenario`, so the dev
161
+ preview at `/_pdf` can render each one without a live route. See
162
+ [define-pdf](/raw/docs/reference/define-pdf.md) for the definition shape.
163
+ </idea>