[{"data":1,"prerenderedAt":557},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:LZUef46xy-hcwQi4tyOmhLxrt0WGYYg9qAAaSGpmF7Y":133,"content-page-surround:docs:LZUef46xy-hcwQi4tyOmhLxrt0WGYYg9qAAaSGpmF7Y":554},[4,25,73,121,127],{"title":5,"id":6,"canonicalKey":7,"locale":8,"draft":9,"icon":10,"sidebar":11,"path":12,"children":13},"Getting Started","content:docs:1.getting-started:.navigation.yml","1","en",false,"lucide:rocket","group","\u002Fdocs\u002Fgetting-started",[14,20],{"title":15,"id":16,"canonicalKey":17,"locale":8,"draft":9,"icon":18,"path":19},"Installation","content:docs:1.getting-started:2.installation.md","1\u002F2","lucide:download","\u002Fdocs\u002Fgetting-started\u002Finstallation",{"title":21,"id":22,"canonicalKey":23,"locale":8,"draft":9,"icon":10,"path":24},"Quickstart","content:docs:1.getting-started:3.quickstart.md","1\u002F3","\u002Fdocs\u002Fgetting-started\u002Fquickstart",{"title":26,"page":9,"canonicalKey":27,"locale":8,"id":28,"draft":9,"icon":29,"sidebar":11,"children":30},"Guides","2","content:docs:2.guides:.navigation.yml","lucide:compass",[31,37,43,49,55,61,67],{"title":32,"id":33,"canonicalKey":34,"locale":8,"draft":9,"icon":35,"path":36},"Authoring","content:docs:2.guides:1.authoring.md","2\u002F1","lucide:component","\u002Fdocs\u002Fguides\u002Fauthoring",{"title":38,"id":39,"canonicalKey":40,"locale":8,"draft":9,"icon":41,"path":42},"Contents, links & bookmarks","content:docs:2.guides:2.contents-links-bookmarks.md","2\u002F2","lucide:list-tree","\u002Fdocs\u002Fguides\u002Fcontents-links-bookmarks",{"title":44,"id":45,"canonicalKey":46,"locale":8,"draft":9,"icon":47,"path":48},"Images & fonts","content:docs:2.guides:3.images-and-fonts.md","2\u002F3","lucide:image","\u002Fdocs\u002Fguides\u002Fimages-and-fonts",{"title":50,"id":51,"canonicalKey":52,"locale":8,"draft":9,"icon":53,"path":54},"SVG graphics","content:docs:2.guides:4.svg-graphics.md","2\u002F4","lucide:shapes","\u002Fdocs\u002Fguides\u002Fsvg-graphics",{"title":56,"id":57,"canonicalKey":58,"locale":8,"draft":9,"icon":59,"path":60},"Errors & debugging","content:docs:2.guides:5.errors-and-debugging.md","2\u002F5","lucide:bug","\u002Fdocs\u002Fguides\u002Ferrors-and-debugging",{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":9,"icon":65,"path":66},"Testing your PDFs","content:docs:2.guides:6.testing.md","2\u002F6","lucide:flask-conical","\u002Fdocs\u002Fguides\u002Ftesting",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":9,"icon":71,"path":72},"Production recipes","content:docs:2.guides:7.recipes.md","2\u002F7","lucide:notebook-tabs","\u002Fdocs\u002Fguides\u002Frecipes",{"title":74,"page":9,"canonicalKey":75,"locale":8,"id":76,"draft":9,"icon":77,"sidebar":11,"children":78},"Reference","3","content:docs:3.reference:.navigation.yml","lucide:book-marked",[79,85,91,97,103,109,115],{"title":80,"id":81,"canonicalKey":82,"locale":8,"draft":9,"icon":83,"path":84},"definePdf","content:docs:3.reference:1.define-pdf.md","3\u002F1","lucide:settings-2","\u002Fdocs\u002Freference\u002Fdefine-pdf",{"title":86,"id":87,"canonicalKey":88,"locale":8,"draft":9,"icon":89,"path":90},"The #pdf registry","content:docs:3.reference:2.registry.md","3\u002F2","lucide:braces","\u002Fdocs\u002Freference\u002Fregistry",{"title":92,"id":93,"canonicalKey":94,"locale":8,"draft":9,"icon":95,"path":96},"Module options","content:docs:3.reference:3.module-options.md","3\u002F3","lucide:sliders","\u002Fdocs\u002Freference\u002Fmodule-options",{"title":98,"id":99,"canonicalKey":100,"locale":8,"draft":9,"icon":101,"path":102},"Primitives","content:docs:3.reference:4.primitives.md","3\u002F4","lucide:box","\u002Fdocs\u002Freference\u002Fprimitives",{"title":104,"id":105,"canonicalKey":106,"locale":8,"draft":9,"icon":107,"path":108},"Composables","content:docs:3.reference:5.composables.md","3\u002F5","lucide:function-square","\u002Fdocs\u002Freference\u002Fcomposables",{"title":110,"id":111,"canonicalKey":112,"locale":8,"draft":9,"icon":113,"path":114},"Test utilities","content:docs:3.reference:6.test-utilities.md","3\u002F6","lucide:test-tube","\u002Fdocs\u002Freference\u002Ftest-utilities",{"title":116,"id":117,"canonicalKey":118,"locale":8,"draft":9,"icon":119,"path":120},"Styles","content:docs:3.reference:7.styles.md","3\u002F7","lucide:palette","\u002Fdocs\u002Freference\u002Fstyles",{"title":122,"id":123,"canonicalKey":124,"locale":8,"draft":9,"icon":125,"sidebar":11,"path":126},"Conformance & Philosophy","content:docs:4.conformance:.navigation.yml","4","lucide:scale","\u002Fdocs\u002Fconformance",{"title":128,"id":129,"canonicalKey":130,"locale":8,"draft":9,"icon":131,"sidebar":11,"path":132},"Examples","content:docs:5.examples:.navigation.yml","5","lucide:layout-grid","\u002Fdocs\u002Fexamples",{"title":134,"description":135,"icon":125,"body":136,"type":541,"id":542,"canonicalKey":124,"draft":9,"partial":9,"locale":8,"collection":543,"navigationFile":9,"file":544,"route":549,"resolution":551},"Conformance & philosophy","The compatibility approach, what is deliberately not claimed, and why the narrow contract is the product.",{"type":137,"children":138,"toc":531},"root",[139,155,162,174,179,239,244,284,290,295,369,374,380,385,478,484,489,495,500,526],{"type":140,"tag":141,"props":142,"children":143},"element","p",{},[144,147,153],{"type":145,"value":146},"text","Nuxt PDF makes a ",{"type":140,"tag":148,"props":149,"children":150},"strong",{},[151],{"type":145,"value":152},"behavioral compatibility claim for a small, tested corpus",{"type":145,"value":154},",\nnot a claim of full React PDF API or test-suite parity. The honesty of that\nboundary is part of the product. You can trust the documented behavior because\nan executable fixture protects it, and you can trust the exclusions because they\nare stated rather than discovered in production.",{"type":140,"tag":156,"props":157,"children":159},"h2",{"id":158},"the-compatibility-approach",[160],{"type":145,"value":161},"The compatibility approach",{"type":140,"tag":141,"props":163,"children":164},{},[165,167,172],{"type":145,"value":166},"Nuxt PDF drives React PDF's framework-neutral layout, font, and serialization\npackages at ",{"type":140,"tag":148,"props":168,"children":169},{},[170],{"type":145,"value":171},"exact pinned versions",{"type":145,"value":173},". Compatibility is defined against those\npins and must be re-evaluated when any of them changes.",{"type":140,"tag":141,"props":175,"children":176},{},[177],{"type":145,"value":178},"The evidence is a paired-fixture strategy. For each claim, the same\nrenderer-agnostic data is rendered through both React PDF and the Vue renderer,\nand the outputs are compared on the axis that matters:",{"type":140,"tag":180,"props":181,"children":182},"ul",{},[183,194,212,229],{"type":140,"tag":184,"props":185,"children":186},"li",{},[187,192],{"type":140,"tag":148,"props":188,"children":189},{},[190],{"type":145,"value":191},"extracted text",{"type":145,"value":193}," and page counts, for content;",{"type":140,"tag":184,"props":195,"children":196},{},[197,202,204,210],{"type":140,"tag":148,"props":198,"children":199},{},[200],{"type":145,"value":201},"laid-out box geometry",{"type":145,"value":203}," (React's own ",{"type":140,"tag":205,"props":206,"children":207},"code",{},[208],{"type":145,"value":209},"onRender",{"type":145,"value":211}," tree is the oracle), for\nlayout;",{"type":140,"tag":184,"props":213,"children":214},{},[215,220,222,227],{"type":140,"tag":148,"props":216,"children":217},{},[218],{"type":145,"value":219},"annotation and catalog reads",{"type":145,"value":221}," via ",{"type":140,"tag":205,"props":223,"children":224},{},[225],{"type":145,"value":226},"pdfjs",{"type":145,"value":228},", for links, notes, metadata, and\noutlines; and",{"type":140,"tag":184,"props":230,"children":231},{},[232,237],{"type":140,"tag":148,"props":233,"children":234},{},[235],{"type":145,"value":236},"thresholded page-by-page raster comparison",{"type":145,"value":238}," against reviewed baselines, for\ngenuinely visual claims.",{"type":140,"tag":141,"props":240,"children":241},{},[242],{"type":145,"value":243},"If the two renderers diverge, that divergence is at the renderer boundary.\nThe suite detects this divergence. The tested corpus spans pagination,\ntext, images, styles and layout, annotations and metadata, SVG drawing, the\ntable-of-contents multi-pass loop, and the local and opt-in-remote resource\nboundaries.",{"type":140,"tag":141,"props":245,"children":246},{},[247,249,254,256,261,263,268,270,275,277,282],{"type":145,"value":248},"The Nuxt production boundary is executable too. The public template handle is\nclosed to ",{"type":140,"tag":205,"props":250,"children":251},{},[252],{"type":145,"value":253},"key",{"type":145,"value":255},", ",{"type":140,"tag":205,"props":257,"children":258},{},[259],{"type":145,"value":260},"resolveMetadata",{"type":145,"value":262},", and ",{"type":140,"tag":205,"props":264,"children":265},{},[266],{"type":145,"value":267},"render",{"type":145,"value":269},"; the development preview uses\nthat same render result through a separate internal fixture sidecar. A\nproduction fixture places unique canaries in ",{"type":140,"tag":205,"props":271,"children":272},{},[273],{"type":145,"value":274},"sampleData",{"type":145,"value":276}," and ",{"type":140,"tag":205,"props":278,"children":279},{},[280],{"type":145,"value":281},"scenarios",{"type":145,"value":283},", then\nrecursively scans the emitted Nitro server artifact to prove those values and\npreview-only APIs were structurally removed. A separate assertion proves the\nserver-only renderer and template modules did not enter the client bundle.",{"type":140,"tag":156,"props":285,"children":287},{"id":286},"deliberate-divergences",[288],{"type":145,"value":289},"Deliberate divergences",{"type":140,"tag":141,"props":291,"children":292},{},[293],{"type":145,"value":294},"A few behaviours intentionally differ from upstream React PDF, because the\nalternative is worse:",{"type":140,"tag":180,"props":296,"children":297},{},[298,316,359],{"type":140,"tag":184,"props":299,"children":300},{},[301,314],{"type":140,"tag":148,"props":302,"children":303},{},[304,306,312],{"type":145,"value":305},"Table-of-contents destinations resolve to a section's ",{"type":140,"tag":307,"props":308,"children":309},"em",{},[310],{"type":145,"value":311},"first",{"type":145,"value":313}," page",{"type":145,"value":315},", not its\nlast. React PDF's last-writer-wins destination table points a page-spanning\nsection at its last page; Nuxt PDF anchors it at the first, which is what a\nreader expects from a contents entry.",{"type":140,"tag":184,"props":317,"children":318},{},[319,324,326,331,333,338,340,344,346,350,352,357],{"type":140,"tag":148,"props":320,"children":321},{},[322],{"type":145,"value":323},"Dynamic page-number footers render at correct page-bottom geometry",{"type":145,"value":325}," even\nwhen a ",{"type":140,"tag":205,"props":327,"children":328},{},[329],{"type":145,"value":330},"lineHeight",{"type":145,"value":332}," reaches them. Upstream drops such footers; Nuxt PDF keeps\nthem. It does ",{"type":140,"tag":148,"props":334,"children":335},{},[336],{"type":145,"value":337},"not",{"type":145,"value":339}," apply a ",{"type":140,"tag":205,"props":341,"children":342},{},[343],{"type":145,"value":330},{"type":145,"value":345}," multiplier to dynamic text,\nbecause the upstream engine re-resolves dynamic-node styles during pagination\nand cannot carry an absolute line height through. Apply ",{"type":140,"tag":205,"props":347,"children":348},{},[349],{"type":145,"value":330},{"type":145,"value":351}," to static\n",{"type":140,"tag":205,"props":353,"children":354},{},[355],{"type":145,"value":356},"PdfText",{"type":145,"value":358}," instead.",{"type":140,"tag":184,"props":360,"children":361},{},[362,367],{"type":140,"tag":148,"props":363,"children":364},{},[365],{"type":145,"value":366},"Explicit SVG zeroes keep SVG meaning.",{"type":145,"value":368}," The pinned serializer uses truthy\nfallbacks for a few resolved values, so Nuxt PDF repairs those values\nbefore paint: zero fill opacity stays transparent, zero stroke width paints\nno PDF hairline, and the supported zero gradient coordinates stay zero.",{"type":140,"tag":141,"props":370,"children":371},{},[372],{"type":145,"value":373},"These divergences are protected by Vue-only geometry and raster regressions.",{"type":140,"tag":156,"props":375,"children":377},{"id":376},"what-is-deliberately-not-claimed",[378],{"type":145,"value":379},"What is deliberately not claimed",{"type":140,"tag":141,"props":381,"children":382},{},[383],{"type":145,"value":384},"These are scope decisions, not bugs:",{"type":140,"tag":180,"props":386,"children":387},{},[388,393,398,403,408,413,418,423,428,440,466],{"type":140,"tag":184,"props":389,"children":390},{},[391],{"type":145,"value":392},"Full React PDF component, hook, browser-helper, or test-suite parity.",{"type":140,"tag":184,"props":394,"children":395},{},[396],{"type":145,"value":397},"React runtime compatibility, or asynchronous \u002F non-scalar dynamic callbacks.",{"type":140,"tag":184,"props":399,"children":400},{},[401],{"type":145,"value":402},"Browser-side or edge rendering. The engine is for Node servers only.",{"type":140,"tag":184,"props":404,"children":405},{},[406],{"type":145,"value":407},"Nuxt 3, Node 20, or versions outside the supported table.",{"type":140,"tag":184,"props":409,"children":410},{},[411],{"type":145,"value":412},"Browser CSS, HTML printing, a PDF stylesheet compiler, or paged-media CSS.",{"type":140,"tag":184,"props":414,"children":415},{},[416],{"type":145,"value":417},"A first-class table engine, charts, forms, signing, editing, or PDF merging.\nA table of contents is authored from ordinary components; there is no TOC\ncomponent or automatic heading collection.",{"type":140,"tag":184,"props":419,"children":420},{},[421],{"type":145,"value":422},"Tagged PDF, PDF\u002FUA, or archival\u002Faccessibility compliance profiles.",{"type":140,"tag":184,"props":424,"children":425},{},[426],{"type":145,"value":427},"Deterministic PDF bytes across operating systems or viewers.",{"type":140,"tag":184,"props":429,"children":430},{},[431,433,438],{"type":145,"value":432},"Authenticated remote fetches, request headers, credentials, remote fonts, or\nSSRF protection beyond exact-prefix allowlisting. Opt-in allowlisted remote\nimages ",{"type":140,"tag":307,"props":434,"children":435},{},[436],{"type":145,"value":437},"are",{"type":145,"value":439}," claimed.",{"type":140,"tag":184,"props":441,"children":442},{},[443,445,450,452,457,459,464],{"type":145,"value":444},"SVG image files as a source, SVG ",{"type":140,"tag":205,"props":446,"children":447},{},[448],{"type":145,"value":449},"Marker",{"type":145,"value":451},", alternate gradient coordinate\nsystems\u002Ftransforms\u002Finheritance, ",{"type":140,"tag":205,"props":453,"children":454},{},[455],{"type":145,"value":456},"preserveAspectRatio",{"type":145,"value":458}," modes, and radial\ngradient inner radius (",{"type":140,"tag":205,"props":460,"children":461},{},[462],{"type":145,"value":463},"fr",{"type":145,"value":465},"). SVG drawing primitives are otherwise claimed.",{"type":140,"tag":184,"props":467,"children":468},{},[469,471,476],{"type":145,"value":470},"Multi-pass resolution of anything other than destination page numbers.\nDocuments whose geometry depends on the numbers they print fail closed with\n",{"type":140,"tag":205,"props":472,"children":473},{},[474],{"type":145,"value":475},"PDF_LIMIT_EXCEEDED",{"type":145,"value":477}," rather than being forced to converge.",{"type":140,"tag":156,"props":479,"children":481},{"id":480},"why-the-narrow-contract-is-the-product",[482],{"type":145,"value":483},"Why the narrow contract is the product",{"type":140,"tag":141,"props":485,"children":486},{},[487],{"type":145,"value":488},"An alpha that claimed everything and delivered some of it would be untrustworthy\nin a way that document generation cannot support. The failure shows up in a\ncustomer's invoice, not a test run. Nuxt PDF instead ships a boundary you can\nreason about: a short list of things it does, each backed by a paired fixture,\nand an explicit list of things it does not. Growing the first list means adding a\nfixture first.",{"type":140,"tag":156,"props":490,"children":492},{"id":491},"the-canonical-record",[493],{"type":145,"value":494},"The canonical record",{"type":140,"tag":141,"props":496,"children":497},{},[498],{"type":145,"value":499},"This page summarizes the approach. The repository contains the exact tested\nboundary, including every fixture, pinned engine version, and non-claim:",{"type":140,"tag":180,"props":501,"children":502},{},[503,515],{"type":140,"tag":184,"props":504,"children":505},{},[506,513],{"type":140,"tag":507,"props":508,"children":510},"a",{"href":509},"https:\u002F\u002Fgithub.com\u002Flupinum-dev\u002Fnuxt-pdf\u002Fblob\u002Fmain\u002FCONFORMANCE.md",[511],{"type":145,"value":512},"CONFORMANCE.md",{"type":145,"value":514},":\nthe executable-evidence record and version pins.",{"type":140,"tag":184,"props":516,"children":517},{},[518,524],{"type":140,"tag":507,"props":519,"children":521},{"href":520},"https:\u002F\u002Fgithub.com\u002Flupinum-dev\u002Fnuxt-pdf\u002Fblob\u002Fmain\u002Fsrc\u002Fruntime\u002Fserver\u002Fengine\u002FCONTRACTS.md",[522],{"type":145,"value":523},"CONTRACTS.md",{"type":145,"value":525},":\nthe engine contracts the renderer upholds.",{"type":140,"tag":141,"props":527,"children":528},{},[529],{"type":145,"value":530},"When this documentation and the code disagree, the code is authoritative. The\ndocumentation has a defect.",{"title":532,"searchDepth":533,"depth":533,"links":534},"",4,[535,537,538,539,540],{"id":158,"depth":536,"text":161},2,{"id":286,"depth":536,"text":289},{"id":376,"depth":536,"text":379},{"id":480,"depth":536,"text":483},{"id":491,"depth":536,"text":494},"markdown","content:docs:4.conformance:1.index.md","docs",{"source":545,"path":546,"stem":547,"dir":543,"extension":548},"content","docs\u002F4.conformance\u002F1.index.md","docs\u002F4.conformance\u002F1.index","md",{"requestedPath":126,"resolvedPath":126,"alternates":550},[],{"requested":552,"resolved":553,"usedFallback":9},{},{"locale":8},{"previous":555,"next":556},{"title":116,"id":117,"canonicalKey":118,"locale":8,"draft":9,"path":120},{"title":128,"id":129,"canonicalKey":130,"locale":8,"draft":9,"path":132},1786511356111]