@useprint/preview 0.1.1 → 0.1.2

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 (228) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +5 -5
  3. package/.next/diagnostics/framework.json +1 -1
  4. package/.next/images-manifest.json +1 -0
  5. package/.next/next-minimal-server.js.nft.json +1 -1
  6. package/.next/next-server.js.nft.json +1 -1
  7. package/.next/prerender-manifest.json +3 -5
  8. package/.next/required-server-files.js +324 -0
  9. package/.next/required-server-files.json +11 -8
  10. package/.next/routes-manifest.json +1 -1
  11. package/.next/server/app/_global-error/page.js +3 -3
  12. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  13. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/_global-error.html +2 -2
  15. package/.next/server/app/_global-error.meta +2 -1
  16. package/.next/server/app/_global-error.rsc +2 -3
  17. package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -3
  18. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  20. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  21. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  22. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -8
  23. package/.next/server/app/_not-found/page.js +2 -2
  24. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  25. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/favicon.ico/route.js +1 -1
  27. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  28. package/.next/server/app/favicon.ico.body +0 -0
  29. package/.next/server/app/page.js +2 -2
  30. package/.next/server/app/page.js.nft.json +1 -1
  31. package/.next/server/app/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/preview/[...slug]/page.js +102 -219
  33. package/.next/server/app/preview/[...slug]/page.js.nft.json +1 -1
  34. package/.next/server/app/preview/[...slug]/page_client-reference-manifest.js +1 -1
  35. package/.next/server/chunks/337.js +3 -0
  36. package/.next/server/chunks/377.js +1 -0
  37. package/.next/server/chunks/445.js +22 -0
  38. package/.next/server/chunks/471.js +13 -0
  39. package/.next/server/chunks/820.js +1 -0
  40. package/.next/server/chunks/95.js +4 -4
  41. package/.next/server/chunks/static/media/pdf.worker.min.3327dba1.mjs +8 -0
  42. package/.next/server/middleware-build-manifest.js +1 -1
  43. package/.next/server/next-font-manifest.js +1 -1
  44. package/.next/server/next-font-manifest.json +1 -1
  45. package/.next/server/pages/500.html +2 -2
  46. package/.next/server/server-reference-manifest.js +1 -1
  47. package/.next/server/server-reference-manifest.json +1 -1
  48. package/.next/server/webpack-runtime.js +1 -1
  49. package/.next/static/chunks/134-e1901aa4c8d7c5e4.js +1 -0
  50. package/.next/static/chunks/399-119d2a8d117d3501.js +1 -0
  51. package/.next/static/chunks/4bd1b696-096d35a2bd1da3af.js +1 -0
  52. package/.next/static/chunks/576-c76dd52ea4e7fe70.js +1 -0
  53. package/.next/static/chunks/794-96cfa93198fb4e82.js +2 -0
  54. package/.next/static/chunks/818-09ed5fa3e6aa2cec.js +9 -0
  55. package/.next/static/chunks/aad4249a-49e9609864e9e734.js +2 -0
  56. package/.next/static/chunks/app/layout-7711ba9e6b7bcccc.js +1 -0
  57. package/.next/static/chunks/app/preview/[...slug]/page-2ce7c5eb36e7cd8b.js +1 -0
  58. package/.next/static/chunks/{c828b8b5-6f56633e9da941cb.js → c828b8b5-fe0be434537dde60.js} +2 -2
  59. package/.next/static/chunks/framework-2d4b35820b5e3e1e.js +1 -0
  60. package/.next/static/chunks/main-d2bae8996dc5307c.js +5 -0
  61. package/.next/static/chunks/{webpack-b8e17eaab329ee72.js → webpack-96cba10d3fe872ec.js} +1 -1
  62. package/.next/static/css/30dcbab3549c2dfe.css +4 -0
  63. package/.next/static/media/inter-cyrillic-400-normal.372704ff.woff2 +0 -0
  64. package/.next/static/media/inter-cyrillic-400-normal.a6b6ef6f.woff +0 -0
  65. package/.next/static/media/inter-cyrillic-500-normal.7c15bba8.woff2 +0 -0
  66. package/.next/static/media/inter-cyrillic-500-normal.b9f8c929.woff +0 -0
  67. package/.next/static/media/inter-cyrillic-600-normal.2f42892a.woff2 +0 -0
  68. package/.next/static/media/inter-cyrillic-600-normal.c3987adc.woff +0 -0
  69. package/.next/static/media/inter-cyrillic-700-normal.93eba3c3.woff +0 -0
  70. package/.next/static/media/inter-cyrillic-700-normal.e9e5b2dc.woff2 +0 -0
  71. package/.next/static/media/inter-cyrillic-ext-400-normal.2a31c04b.woff +0 -0
  72. package/.next/static/media/inter-cyrillic-ext-400-normal.f572b170.woff2 +0 -0
  73. package/.next/static/media/inter-cyrillic-ext-500-normal.5a6bb1da.woff +0 -0
  74. package/.next/static/media/inter-cyrillic-ext-500-normal.fe0d9b14.woff2 +0 -0
  75. package/.next/static/media/inter-cyrillic-ext-600-normal.ecbdecad.woff +0 -0
  76. package/.next/static/media/inter-cyrillic-ext-600-normal.f7b3c15b.woff2 +0 -0
  77. package/.next/static/media/inter-cyrillic-ext-700-normal.4b4022a6.woff +0 -0
  78. package/.next/static/media/inter-cyrillic-ext-700-normal.74b516d2.woff2 +0 -0
  79. package/.next/static/media/inter-greek-400-normal.cc58c11b.woff +0 -0
  80. package/.next/static/media/inter-greek-400-normal.d7020e3c.woff2 +0 -0
  81. package/.next/static/media/inter-greek-500-normal.d9a33207.woff +0 -0
  82. package/.next/static/media/inter-greek-500-normal.f41f43db.woff2 +0 -0
  83. package/.next/static/media/inter-greek-600-normal.4ec0c1c1.woff +0 -0
  84. package/.next/static/media/inter-greek-600-normal.cc532937.woff2 +0 -0
  85. package/.next/static/media/inter-greek-700-normal.5ec6c758.woff +0 -0
  86. package/.next/static/media/inter-greek-700-normal.97f0eeeb.woff2 +0 -0
  87. package/.next/static/media/inter-greek-ext-400-normal.4ce1df5d.woff2 +0 -0
  88. package/.next/static/media/inter-greek-ext-400-normal.88ede1ea.woff +0 -0
  89. package/.next/static/media/inter-greek-ext-500-normal.7a4aa726.woff +0 -0
  90. package/.next/static/media/inter-greek-ext-500-normal.cbd51e2d.woff2 +0 -0
  91. package/.next/static/media/inter-greek-ext-600-normal.089a95ee.woff +0 -0
  92. package/.next/static/media/inter-greek-ext-600-normal.1f33d317.woff2 +0 -0
  93. package/.next/static/media/inter-greek-ext-700-normal.31f1075d.woff +0 -0
  94. package/.next/static/media/inter-greek-ext-700-normal.827cd618.woff2 +0 -0
  95. package/.next/static/media/inter-latin-400-normal.2c7a775c.woff +0 -0
  96. package/.next/static/media/inter-latin-400-normal.ef6d3f52.woff2 +0 -0
  97. package/.next/static/media/inter-latin-500-normal.b7b43ace.woff2 +0 -0
  98. package/.next/static/media/inter-latin-500-normal.cb4c8ceb.woff +0 -0
  99. package/.next/static/media/inter-latin-600-normal.8fb1a964.woff2 +0 -0
  100. package/.next/static/media/inter-latin-600-normal.ce0f5f43.woff +0 -0
  101. package/.next/static/media/inter-latin-700-normal.953b7aa5.woff2 +0 -0
  102. package/.next/static/media/inter-latin-700-normal.9c21d4dc.woff +0 -0
  103. package/.next/static/media/inter-latin-ext-400-normal.32a25442.woff2 +0 -0
  104. package/.next/static/media/inter-latin-ext-400-normal.4edcaace.woff +0 -0
  105. package/.next/static/media/inter-latin-ext-500-normal.a19a84a6.woff +0 -0
  106. package/.next/static/media/inter-latin-ext-500-normal.d9b491de.woff2 +0 -0
  107. package/.next/static/media/inter-latin-ext-600-normal.38b075d8.woff2 +0 -0
  108. package/.next/static/media/inter-latin-ext-600-normal.49faa47a.woff +0 -0
  109. package/.next/static/media/inter-latin-ext-700-normal.93534b50.woff +0 -0
  110. package/.next/static/media/inter-latin-ext-700-normal.b63daa1a.woff2 +0 -0
  111. package/.next/static/media/inter-vietnamese-400-normal.a9dd2faf.woff +0 -0
  112. package/.next/static/media/inter-vietnamese-400-normal.de4fc44f.woff2 +0 -0
  113. package/.next/static/media/inter-vietnamese-500-normal.7c0a695f.woff2 +0 -0
  114. package/.next/static/media/inter-vietnamese-500-normal.a3a73b95.woff +0 -0
  115. package/.next/static/media/inter-vietnamese-600-normal.9d518599.woff2 +0 -0
  116. package/.next/static/media/inter-vietnamese-600-normal.c5ce3fcb.woff +0 -0
  117. package/.next/static/media/inter-vietnamese-700-normal.bc68b199.woff +0 -0
  118. package/.next/static/media/inter-vietnamese-700-normal.faf12809.woff2 +0 -0
  119. package/.next/static/media/pdf.worker.min.67f75a11.mjs +8 -0
  120. package/.next/trace +32 -32
  121. package/.next/trace-build +1 -1
  122. package/CHANGELOG.md +9 -0
  123. package/next.config.js +5 -1
  124. package/package.json +2 -3
  125. package/public/apple-touch-icon.png +0 -0
  126. package/public/favicon-96x96.png +0 -0
  127. package/public/favicon.ico +0 -0
  128. package/public/favicon.svg +3 -0
  129. package/public/site.webmanifest +21 -0
  130. package/public/web-app-manifest-192x192.png +0 -0
  131. package/public/web-app-manifest-512x512.png +0 -0
  132. package/readme.md +9 -27
  133. package/scripts/utils/default-seed/contracts/project-proposal.tsx +68 -0
  134. package/scripts/utils/default-seed/finance/payment-summary.tsx +55 -0
  135. package/scripts/utils/default-seed/reports/incident-report.tsx +49 -0
  136. package/scripts/utils/default-seed/updates/release-notes.tsx +58 -0
  137. package/src/actions/generate-pdf-from-html.ts +0 -8
  138. package/src/actions/render-document-by-path.tsx +0 -3
  139. package/src/app/favicon.ico +0 -0
  140. package/src/app/fonts.ts +0 -7
  141. package/src/app/globals.css +9 -0
  142. package/src/app/layout.tsx +13 -8
  143. package/src/app/page.tsx +14 -12
  144. package/src/app/preview/[...slug]/page.tsx +9 -61
  145. package/src/app/preview/[...slug]/preview.tsx +5 -6
  146. package/src/components/logo.tsx +21 -13
  147. package/src/components/pdf-viewer.tsx +61 -20
  148. package/src/components/print.tsx +37 -5
  149. package/src/components/shell.tsx +1 -2
  150. package/src/utils/__snapshots__/get-document-component.spec.ts.snap +25 -181
  151. package/src/utils/canidocument/ast/get-object-variables.ts +1 -1
  152. package/src/utils/canidocument/ast/get-used-style-properties.ts +1 -1
  153. package/src/utils/canidocument/get-compatibility-stats-for-entry.ts +1 -1
  154. package/src/utils/canidocument/tailwind/get-tailwind-config.ts +1 -1
  155. package/src/utils/canidocument/tailwind/get-tailwind-metadata.spec.ts +2 -2
  156. package/src/utils/canidocument/tailwind/get-tailwind-metadata.ts +1 -1
  157. package/src/utils/canidocument/types.ts +12 -0
  158. package/src/utils/contains-document-template.spec.ts +1 -1
  159. package/src/utils/esbuild/renderring-utilities-exporter.ts +248 -0
  160. package/src/utils/get-document-component.spec.ts +6 -4
  161. package/src/utils/get-document-component.ts +61 -10
  162. package/src/utils/get-documents-directory-metadata.spec.ts +18 -55
  163. package/src/utils/iframe-processing.spec.ts +13 -25
  164. package/src/utils/js-document-detection.spec.ts +11 -5
  165. package/src/utils/linting.ts +29 -33
  166. package/src/utils/margin-calculation.spec.ts +5 -5
  167. package/src/utils/testing/js-document-export-default.js +3 -0
  168. package/src/utils/testing/js-document-test.js +3 -0
  169. package/src/utils/testing/mdx-document-test.js +3 -0
  170. package/src/utils/testing/request-response-document.tsx +15 -0
  171. package/.next/server/chunks/134.js +0 -22
  172. package/.next/server/chunks/286.js +0 -27
  173. package/.next/server/chunks/489.js +0 -13
  174. package/.next/server/chunks/731.js +0 -1
  175. package/.next/server/chunks/static/media/pdf.worker.min.3fa7f4f1.mjs +0 -8
  176. package/.next/static/chunks/134-488429db271f07ce.js +0 -1
  177. package/.next/static/chunks/399-38210d4b480adc3a.js +0 -1
  178. package/.next/static/chunks/4bd1b696-f2999b4e17b2fd5f.js +0 -1
  179. package/.next/static/chunks/576-d2a7761fb68a178e.js +0 -1
  180. package/.next/static/chunks/794-de04f3efd45c53dd.js +0 -20
  181. package/.next/static/chunks/818-708fabc8a2438ba2.js +0 -9
  182. package/.next/static/chunks/aad4249a-8397af6f169152d5.js +0 -2
  183. package/.next/static/chunks/app/layout-38d6d79a819ab362.js +0 -1
  184. package/.next/static/chunks/app/preview/[...slug]/page-1097b557142aa22c.js +0 -1
  185. package/.next/static/chunks/framework-9fb1a057e8adf51d.js +0 -1
  186. package/.next/static/chunks/main-66c819c51fec57bf.js +0 -23
  187. package/.next/static/css/2f4a632dc94d1fb7.css +0 -3
  188. package/.next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  189. package/.next/static/media/21350d82a1f187e9-s.woff2 +0 -0
  190. package/.next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  191. package/.next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  192. package/.next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  193. package/.next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  194. package/.next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  195. package/.next/static/media/pdf.worker.min.539a26ca.mjs +0 -8
  196. package/.next/types/app/layout.ts +0 -86
  197. package/.next/types/cache-life.d.ts +0 -145
  198. package/scripts/utils/default-seed/auth/account-confirmation.tsx +0 -68
  199. package/scripts/utils/default-seed/auth/forgot-password.tsx +0 -71
  200. package/scripts/utils/default-seed/communications/payment-overdue.tsx +0 -82
  201. package/scripts/utils/default-seed/communications/team-invite.tsx +0 -78
  202. package/scripts/utils/default-seed/communications/webhooks-failed.tsx +0 -89
  203. package/scripts/utils/default-seed/feedback-request.tsx +0 -78
  204. package/scripts/utils/default-seed/marketing/changelog.tsx +0 -98
  205. package/src/actions/document-validation/__snapshots__/check-images.spec.tsx.snap +0 -84
  206. package/src/actions/document-validation/canidocument-data.ts +0 -85993
  207. package/src/actions/document-validation/check-compatibility.ts +0 -333
  208. package/src/actions/document-validation/check-images.spec.tsx +0 -21
  209. package/src/actions/document-validation/check-images.ts +0 -160
  210. package/src/actions/document-validation/check-links.spec.tsx +0 -113
  211. package/src/actions/document-validation/check-links.ts +0 -113
  212. package/src/actions/document-validation/get-code-location-from-ast-element.ts +0 -18
  213. package/src/actions/document-validation/quick-fetch.ts +0 -14
  214. package/src/animated-icons-data/help.json +0 -1082
  215. package/src/animated-icons-data/link.json +0 -1309
  216. package/src/animated-icons-data/mail.json +0 -1320
  217. package/src/components/toolbar/checking-results.tsx +0 -150
  218. package/src/components/toolbar/code-preview-line-link.tsx +0 -39
  219. package/src/components/toolbar/compatibility.tsx +0 -113
  220. package/src/components/toolbar/linter.tsx +0 -278
  221. package/src/components/toolbar/results-table.tsx +0 -0
  222. package/src/components/toolbar/results.tsx +0 -52
  223. package/src/components/toolbar/spam-assassin.tsx +0 -153
  224. package/src/components/toolbar/toolbar-button.tsx +0 -52
  225. package/src/components/toolbar/use-cached-state.ts +0 -33
  226. package/src/components/toolbar.tsx +0 -349
  227. /package/.next/static/{ZCqBZ8ZswPjX7K5Zalrpy → dBOUMD9vJ2VLASRDl2YeR}/_buildManifest.js +0 -0
  228. /package/.next/static/{ZCqBZ8ZswPjX7K5Zalrpy → dBOUMD9vJ2VLASRDl2YeR}/_ssgManifest.js +0 -0
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":19171503,"timestamp":505715084,"id":17,"parentId":1,"tags":{},"startTime":1766605254247,"traceId":"f604093a586b6b92"},{"name":"run-typescript","duration":7316300,"timestamp":524896774,"id":3276,"parentId":1,"tags":{},"startTime":1766605273429,"traceId":"f604093a586b6b92"},{"name":"static-check","duration":864211,"timestamp":532283185,"id":3278,"parentId":1,"tags":{},"startTime":1766605280815,"traceId":"f604093a586b6b92"},{"name":"static-generation","duration":3328455,"timestamp":533190884,"id":3295,"parentId":1,"tags":{},"startTime":1766605281723,"traceId":"f604093a586b6b92"},{"name":"collect-build-traces","duration":13564850,"timestamp":533149525,"id":3292,"parentId":1,"tags":{},"startTime":1766605281682,"traceId":"f604093a586b6b92"},{"name":"telemetry-flush","duration":38,"timestamp":546716184,"id":3303,"parentId":1,"tags":{},"startTime":1766605295248,"traceId":"f604093a586b6b92"},{"name":"next-build","duration":41107288,"timestamp":505608944,"id":1,"tags":{"buildMode":"default","version":"16.0.1","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1766605254141,"traceId":"f604093a586b6b92"}]
1
+ [{"name":"run-webpack","duration":19860601,"timestamp":448696729,"id":17,"parentId":1,"tags":{},"startTime":1775855516779,"traceId":"cb1dc5d460f9da07"},{"name":"run-typescript","duration":4439111,"timestamp":468588470,"id":3280,"parentId":1,"tags":{},"startTime":1775855536671,"traceId":"cb1dc5d460f9da07"},{"name":"static-check","duration":653817,"timestamp":473083479,"id":3283,"parentId":1,"tags":{},"startTime":1775855541166,"traceId":"cb1dc5d460f9da07"},{"name":"static-generation","duration":2652758,"timestamp":473762173,"id":3299,"parentId":1,"tags":{},"startTime":1775855541845,"traceId":"cb1dc5d460f9da07"},{"name":"collect-build-traces","duration":7566062,"timestamp":473737771,"id":3296,"parentId":1,"tags":{},"startTime":1775855541820,"traceId":"cb1dc5d460f9da07"},{"name":"telemetry-flush","duration":41,"timestamp":481305588,"id":3307,"parentId":1,"tags":{},"startTime":1775855549388,"traceId":"cb1dc5d460f9da07"},{"name":"next-build","duration":32966699,"timestamp":448338940,"id":1,"tags":{"buildMode":"default","version":"16.1.6","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1775855516421,"traceId":"cb1dc5d460f9da07"}]
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @useprint/preview
2
2
 
3
+ ## 0.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 4ba9bad: Improving css engine, branding and a loader to pdf preview. Adding init-doc command. Rewriting tests. Cleaning up react.email.
8
+ - Updated dependencies [4ba9bad]
9
+ - @useprint/components@0.1.2
10
+ - @useprint/shared@0.1.2
11
+
3
12
  ## 0.1.1
4
13
 
5
14
  ### Patch Changes
package/next.config.js CHANGED
@@ -1,5 +1,9 @@
1
1
  /** @type {import('next').NextConfig} */
2
2
  module.exports = {
3
+ outputFileTracingRoot: process.env.USER_PROJECT_LOCATION ?? __dirname,
4
+ turbopack: {
5
+ root: process.env.USER_PROJECT_LOCATION ?? __dirname,
6
+ },
3
7
  // this is needed so that the code for building documents works properly
4
8
  webpack: (
5
9
  /** @type {import('webpack').Configuration & { externals: string[] }} */
@@ -18,5 +22,5 @@ module.exports = {
18
22
  // What is probably happening is that it's noticing the files for the app are somewhere inside of a `node_modules` and automatically opt-outs of SWC's transpilation.
19
23
  //
20
24
  // TODO: Open an issue on Nextjs about this.
21
- transpilePackages: ['useprint'],
25
+ transpilePackages: ['@useprint/preview'],
22
26
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useprint/preview",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "A live preview of your pdf files right in your browser.",
5
5
  "scripts": {
6
6
  "build": "bun ./scripts/build-preview-server.mts",
@@ -54,12 +54,11 @@
54
54
  "socket.io-client": "4.8.1",
55
55
  "sonner": "2.0.3",
56
56
  "source-map-js": "1.2.1",
57
- "spamc": "0.0.5",
58
57
  "stacktrace-parser": "0.1.11",
59
58
  "tailwind-merge": "3.2.0",
60
59
  "tailwindcss": "3.4.0",
61
60
  "use-debounce": "10.0.4",
62
- "zod": "3.24.3"
61
+ "zod": "^4.3.6"
63
62
  },
64
63
  "devDependencies": {
65
64
  "@types/babel__core": "7.20.5",
Binary file
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="1043" viewBox="0 0 1000 1043"><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description><dc:creator>RealFaviconGenerator</dc:creator><dc:source>https://realfavicongenerator.net</dc:source></rdf:Description></rdf:RDF></metadata><image width="1000" height="1043" xlink:href="data:image/png;base64,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AQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACB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AAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAYfL798BAAAAdvUfSghZVfamqagAAAAASUVORK5CYII="></image><style>@media (prefers-color-scheme: light) { :root { filter: none; } }
2
+ @media (prefers-color-scheme: dark) { :root { filter: invert(100%); } }
3
+ </style></svg>
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "UsePrint",
3
+ "short_name": "UsePrint",
4
+ "icons": [
5
+ {
6
+ "src": "/web-app-manifest-192x192.png",
7
+ "sizes": "192x192",
8
+ "type": "image/png",
9
+ "purpose": "maskable"
10
+ },
11
+ {
12
+ "src": "/web-app-manifest-512x512.png",
13
+ "sizes": "512x512",
14
+ "type": "image/png",
15
+ "purpose": "maskable"
16
+ }
17
+ ],
18
+ "theme_color": "#ffffff",
19
+ "background_color": "#ffffff",
20
+ "display": "standalone"
21
+ }
package/readme.md CHANGED
@@ -1,34 +1,16 @@
1
- <div align="center"><strong>@useprint/preview</strong></div>
2
- <div align="center">A live preview of your documents right in your browser.</div>
3
- <br />
4
- <div align="center">
5
- <a href="https://useprint.dev">Website</a>
6
- <span> · </span>
7
- <a href="https://github.com/maxscn/useprint">GitHub</a>
8
- <span> · </span>
9
- <a href="https://useprint.dev/discord">Discord</a>
10
- </div>
1
+ # @useprint/preview
11
2
 
12
- This package is used to store the preview server, it is also published and versioned so that it can be installed when the [CLI](../useprint) is being used.
3
+ [docs](https://useprint.dev/docs/packages/preview)
13
4
 
14
- ## Development workflow
5
+ The internal preview runtime used by the Useprint CLI.
15
6
 
16
- ### 1. Seed document templates
7
+ This package powers the browser preview experience behind `@useprint/cli`. It is published so the CLI can bundle and install a matching preview server version when needed.
17
8
 
18
- ```sh
19
- pnpm dev:seed
20
- ```
9
+ ## Typical usage
21
10
 
22
- This generates a boilerplate documents directory for you to work with. These files can also be modified as you see fit since they are not included in git.
11
+ Most users should not install this package directly. Instead, install:
23
12
 
24
- ### 2. Run development server
13
+ - `@useprint/components` to author documents
14
+ - `@useprint/cli` to preview and export them
25
15
 
26
- ```sh
27
- pnpm dev
28
- ```
29
-
30
- This is somewhat equivalent to `next dev` and does not support hot reloading for document templates like the CLI does. It lets you work on the UI for the preview server mainly.
31
-
32
- ### 3. Open in your browser
33
-
34
- Go to http://localhost:3000
16
+ Reach for `@useprint/preview` directly only if you are working on the preview runtime itself.
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+ import {
3
+ Body,
4
+ Document,
5
+ Head,
6
+ Page,
7
+ Tailwind,
8
+ } from '@useprint/components';
9
+
10
+ interface ProjectProposalProps {
11
+ clientName: string;
12
+ projectName: string;
13
+ summary: string;
14
+ reviewLink: string;
15
+ }
16
+
17
+ export default function ProjectProposal({
18
+ clientName = 'Northwind Studio',
19
+ projectName = 'Summer product launch',
20
+ summary = 'A concise scope, timeline, and delivery plan for a multi-page printable proposal.',
21
+ reviewLink = 'https://useprint.dev/docs/getting-started/your-first-document',
22
+ }: ProjectProposalProps) {
23
+ return (
24
+ <Document>
25
+ <Tailwind>
26
+ <Head />
27
+ <Body backgroundColor="#09090b">
28
+ <Page className="bg-zinc-950 px-10 py-12 text-zinc-50">
29
+ <p className="m-0 text-xs uppercase tracking-[0.3em] text-zinc-500">
30
+ Proposal ready
31
+ </p>
32
+ <h1 className="mb-8 mt-3 text-center text-[34px] font-semibold">
33
+ Project proposal
34
+ </h1>
35
+ <p>Hello {clientName},</p>
36
+ <p>
37
+ We prepared a printable proposal for <strong>{projectName}</strong>.
38
+ Use this version for review, approval, or export to PDF.
39
+ </p>
40
+ <div className="rounded-xl border border-zinc-800 bg-zinc-900 px-5 py-4">
41
+ {summary}
42
+ </div>
43
+ <div className="my-8 text-center">
44
+ <a
45
+ href={reviewLink}
46
+ className="inline-block rounded-lg bg-white px-5 py-3 text-sm font-medium text-zinc-950 no-underline"
47
+ >
48
+ Open proposal
49
+ </a>
50
+ </div>
51
+ <p className="text-sm text-zinc-400">
52
+ Tip: this document is designed to preview well in the browser and
53
+ render cleanly through Chromium-based PDF generation.
54
+ </p>
55
+ </Page>
56
+ </Body>
57
+ </Tailwind>
58
+ </Document>
59
+ );
60
+ }
61
+
62
+ ProjectProposal.PreviewProps = {
63
+ clientName: 'Northwind Studio',
64
+ projectName: 'Summer product launch',
65
+ summary:
66
+ 'A concise scope, timeline, and delivery plan for a multi-page printable proposal.',
67
+ reviewLink: 'https://useprint.dev/docs/getting-started/your-first-document',
68
+ } as ProjectProposalProps;
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import {
3
+ Body,
4
+ Document,
5
+ Head,
6
+ Page,
7
+ Tailwind,
8
+ } from '@useprint/components';
9
+
10
+ interface PaymentSummaryProps {
11
+ customerName: string;
12
+ amount: string;
13
+ dueDate: string;
14
+ reference: string;
15
+ }
16
+
17
+ export default function PaymentSummary({
18
+ customerName = 'Acme Industries',
19
+ amount = '$12,480.00',
20
+ dueDate = 'April 30, 2026',
21
+ reference = 'INV-2048',
22
+ }: PaymentSummaryProps) {
23
+ return (
24
+ <Document>
25
+ <Tailwind>
26
+ <Head />
27
+ <Body backgroundColor="#f5f5f4">
28
+ <Page className="bg-white px-8 py-10 text-stone-900">
29
+ <h1 className="mb-8 text-[32px] font-semibold">Payment summary</h1>
30
+ <p>Customer: {customerName}</p>
31
+ <p>Reference: {reference}</p>
32
+ <section className="my-8 rounded-2xl border border-stone-200 bg-stone-50 px-6 py-5">
33
+ <p className="m-0 text-sm uppercase tracking-[0.2em] text-stone-500">
34
+ Amount due
35
+ </p>
36
+ <p className="m-0 mt-2 text-[30px] font-semibold">{amount}</p>
37
+ <p className="m-0 mt-2 text-stone-600">Due {dueDate}</p>
38
+ </section>
39
+ <p className="text-sm text-stone-600">
40
+ This is a simple seeded example for previewing financial document
41
+ layouts during development.
42
+ </p>
43
+ </Page>
44
+ </Body>
45
+ </Tailwind>
46
+ </Document>
47
+ );
48
+ }
49
+
50
+ PaymentSummary.PreviewProps = {
51
+ customerName: 'Acme Industries',
52
+ amount: '$12,480.00',
53
+ dueDate: 'April 30, 2026',
54
+ reference: 'INV-2048',
55
+ } as PaymentSummaryProps;
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import {
3
+ Body,
4
+ Document,
5
+ Head,
6
+ Page,
7
+ Tailwind,
8
+ } from '@useprint/components';
9
+
10
+ interface IncidentReportProps {
11
+ title: string;
12
+ happenedAt: string;
13
+ summary: string;
14
+ details: string;
15
+ }
16
+
17
+ export default function IncidentReport({
18
+ title = 'Print pipeline incident report',
19
+ happenedAt = '2026-04-10 09:42 UTC',
20
+ summary = 'A sample operational report showing how longer-form technical content can be laid out as a printable document.',
21
+ details = 'Renderer: chromium\nEnvironment: staging\nImpact: delayed export generation for 12 minutes\nResolution: restarted worker and retried queued jobs',
22
+ }: IncidentReportProps) {
23
+ return (
24
+ <Document>
25
+ <Tailwind>
26
+ <Head />
27
+ <Body backgroundColor="#020617">
28
+ <Page className="bg-slate-950 px-8 py-10 text-slate-50">
29
+ <h1 className="mb-3 text-[32px] font-semibold">{title}</h1>
30
+ <p className="text-slate-400">Recorded {happenedAt}</p>
31
+ <p>{summary}</p>
32
+ <pre className="overflow-hidden rounded-2xl bg-slate-900 p-5 text-sm leading-6 text-slate-200">
33
+ <code>{details}</code>
34
+ </pre>
35
+ </Page>
36
+ </Body>
37
+ </Tailwind>
38
+ </Document>
39
+ );
40
+ }
41
+
42
+ IncidentReport.PreviewProps = {
43
+ title: 'Print pipeline incident report',
44
+ happenedAt: '2026-04-10 09:42 UTC',
45
+ summary:
46
+ 'A sample operational report showing how longer-form technical content can be laid out as a printable document.',
47
+ details:
48
+ 'Renderer: chromium\nEnvironment: staging\nImpact: delayed export generation for 12 minutes\nResolution: restarted worker and retried queued jobs',
49
+ } as IncidentReportProps;
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import {
3
+ Body,
4
+ Document,
5
+ Head,
6
+ Page,
7
+ Tailwind,
8
+ } from '@useprint/components';
9
+
10
+ interface ReleaseNotesProps {
11
+ edition: string;
12
+ highlights: string[];
13
+ }
14
+
15
+ export default function ReleaseNotes({
16
+ edition = '2026.04',
17
+ highlights = [
18
+ 'Improved page-aware layout primitives for longer printable documents.',
19
+ 'Chromium-based PDF generation guidance added to the docs.',
20
+ 'Faster local preview loop for document workspaces.',
21
+ ],
22
+ }: ReleaseNotesProps) {
23
+ return (
24
+ <Document>
25
+ <Tailwind>
26
+ <Head />
27
+ <Body backgroundColor="#ffffff">
28
+ <Page className="bg-white px-8 py-10 text-slate-900">
29
+ <h1 className="mb-8 text-[32px] font-semibold">
30
+ Release notes {edition}
31
+ </h1>
32
+ <section className="rounded-2xl border border-slate-200 px-6 py-5">
33
+ <ul className="m-0 list-disc pl-5">
34
+ {highlights.map((highlight) => (
35
+ <li key={highlight} className="mb-2">
36
+ {highlight}
37
+ </li>
38
+ ))}
39
+ </ul>
40
+ </section>
41
+ <p className="mt-8 text-sm text-slate-600">
42
+ Another seeded example meant for printable update summaries.
43
+ </p>
44
+ </Page>
45
+ </Body>
46
+ </Tailwind>
47
+ </Document>
48
+ );
49
+ }
50
+
51
+ ReleaseNotes.PreviewProps = {
52
+ edition: '2026.04',
53
+ highlights: [
54
+ 'Improved page-aware layout primitives for longer printable documents.',
55
+ 'Chromium-based PDF generation guidance added to the docs.',
56
+ 'Faster local preview loop for document workspaces.',
57
+ ],
58
+ } as ReleaseNotesProps;
@@ -32,18 +32,13 @@ export async function generatePdfFromHtml(
32
32
  isLandscape?: boolean,
33
33
  ): Promise<string> {
34
34
  try {
35
- console.log("Starting PDF generation...");
36
35
  const browser = await getBrowser();
37
- console.log("Browser obtained");
38
36
  const page = await browser.newPage();
39
- console.log("New page created");
40
37
 
41
38
  // Set content
42
- console.log("Setting HTML content...");
43
39
  await page.setContent(html, {
44
40
  waitUntil: "networkidle", // This might be the issue - try "domcontentloaded" instead
45
41
  });
46
- console.log("Content set");
47
42
 
48
43
  // Determine PDF options based on page size
49
44
  const pdfOptions: Parameters<typeof page.pdf>[0] = {
@@ -59,10 +54,7 @@ export async function generatePdfFromHtml(
59
54
  pdfOptions.format = "A4";
60
55
  }
61
56
 
62
- // Generate PDF
63
- console.log("Generating PDF...", pdfOptions);
64
57
  const pdfBuffer = await page.pdf(pdfOptions);
65
- console.log("PDF generated");
66
58
 
67
59
  await page.close();
68
60
 
@@ -90,7 +90,6 @@ export const renderDocumentByPath = async (
90
90
  let pdfData: string;
91
91
  try {
92
92
  pdfData = await generatePdfFromHtml(markup.replaceAll('\0', ''), pageSize, isLandscape);
93
- console.log("PDF data generated, length:", pdfData.length, "first 50 chars:", pdfData.substring(0, 50));
94
93
  } catch (pdfError) {
95
94
  // If PDF generation fails, log but don't fail the entire rendering
96
95
  // We'll return an empty string or handle it gracefully
@@ -121,8 +120,6 @@ export const renderDocumentByPath = async (
121
120
  pdfData,
122
121
  };
123
122
 
124
- console.log("Rendering result pdfData length:", renderingResult.pdfData.length);
125
-
126
123
  cache.set(cacheKey, renderingResult);
127
124
 
128
125
  return renderingResult;
Binary file
package/src/app/fonts.ts CHANGED
@@ -1,12 +1,5 @@
1
- import { Inter } from 'next/font/google';
2
1
  import Local from 'next/font/local';
3
2
 
4
- export const inter = Inter({
5
- subsets: ['latin'],
6
- variable: '--font-inter',
7
- display: 'swap',
8
- });
9
-
10
3
  export const sfMono = Local({
11
4
  src: [
12
5
  {
@@ -1,7 +1,16 @@
1
+ @import "@fontsource/inter/400.css";
2
+ @import "@fontsource/inter/500.css";
3
+ @import "@fontsource/inter/600.css";
4
+ @import "@fontsource/inter/700.css";
5
+
1
6
  @tailwind base;
2
7
  @tailwind components;
3
8
  @tailwind utilities;
4
9
 
10
+ :root {
11
+ --font-inter: "Inter";
12
+ }
13
+
5
14
  html {
6
15
  color-scheme: dark;
7
16
  }
@@ -3,10 +3,19 @@ import './globals.css';
3
3
  import { DocumentsProvider } from '../contexts/documents';
4
4
  import { getDocumentsDirectoryMetadata } from '../utils/get-documents-directory-metadata';
5
5
  import { documentsDirectoryAbsolutePath } from './env';
6
- import { inter, sfMono } from './fonts';
6
+ import { sfMono } from './fonts';
7
7
 
8
8
  export const metadata: Metadata = {
9
9
  title: 'UsePrint',
10
+ manifest: '/site.webmanifest',
11
+ icons: {
12
+ icon: [
13
+ { url: '/favicon.ico' },
14
+ { url: '/favicon.svg', type: 'image/svg+xml' },
15
+ { url: '/favicon-96x96.png', sizes: '96x96', type: 'image/png' },
16
+ ],
17
+ apple: [{ url: '/apple-touch-icon.png', sizes: '180x180' }],
18
+ },
10
19
  };
11
20
 
12
21
  export const dynamic = 'force-dynamic';
@@ -15,7 +24,6 @@ const RootLayout = async ({ children }: { children: React.ReactNode }) => {
15
24
  const documentsDirectoryMetadata = await getDocumentsDirectoryMetadata(
16
25
  documentsDirectoryAbsolutePath,
17
26
  );
18
- console.log('documentsDirectoryMetadata', documentsDirectoryMetadata);
19
27
  if (typeof documentsDirectoryMetadata === 'undefined') {
20
28
  throw new Error(
21
29
  `Could not find the documents directory specified under ${documentsDirectoryAbsolutePath}!`,
@@ -23,12 +31,9 @@ const RootLayout = async ({ children }: { children: React.ReactNode }) => {
23
31
  }
24
32
 
25
33
  return (
26
- <html
27
- className={`${inter.variable} ${sfMono.variable} font-sans`}
28
- lang="en"
29
- >
30
- <body className="print:bg-white relative h-screen bg-black text-slate-11 leading-loose selection:bg-cyan-5 selection:text-cyan-12">
31
- <div className="bg-gradient-to-t from-slate-3 flex flex-col overflow-hidden ">
34
+ <html className={`${sfMono.variable} font-sans`} lang="en">
35
+ <body className="print:bg-white relative h-dvh bg-black text-slate-11 leading-loose selection:bg-cyan-5 selection:text-cyan-12">
36
+ <div className="bg-gradient-to-t from-slate-3 flex min-h-dvh flex-col overflow-hidden">
32
37
  <DocumentsProvider
33
38
  initialDocumentsDirectoryMetadata={documentsDirectoryMetadata}
34
39
  >
package/src/app/page.tsx CHANGED
@@ -1,13 +1,15 @@
1
- import path from 'node:path';
2
- import Image from 'next/image';
3
- import Link from 'next/link';
4
- import { Button, Heading, Text } from '../components';
5
- import CodeSnippet from '../components/code-snippet';
6
- import { Shell } from '../components/shell';
7
- import { documentsDirectoryAbsolutePath } from './env';
1
+ import path from "node:path";
2
+ import Image from "next/image";
3
+ import Link from "next/link";
4
+ import { Button, Heading, Text } from "../components";
5
+ import CodeSnippet from "../components/code-snippet";
6
+ import { Shell } from "../components/shell";
7
+ import { documentsDirectoryAbsolutePath } from "./env";
8
8
 
9
9
  const Home = () => {
10
- const baseDocumentsDirectoryName = path.basename(documentsDirectoryAbsolutePath);
10
+ const baseDocumentsDirectoryName = path.basename(
11
+ documentsDirectoryAbsolutePath,
12
+ );
11
13
 
12
14
  return (
13
15
  <Shell>
@@ -18,12 +20,12 @@ const Home = () => {
18
20
  </Heading>
19
21
  <Text as="p">
20
22
  To start developing your documents, you can create a<br />
21
- <CodeSnippet>.jsx</CodeSnippet> or <CodeSnippet>.tsx</CodeSnippet>{' '}
22
- file under your <CodeSnippet>{baseDocumentsDirectoryName}</CodeSnippet>{' '}
23
- folder.
23
+ <CodeSnippet>.jsx</CodeSnippet> or <CodeSnippet>.tsx</CodeSnippet>{" "}
24
+ file under your{" "}
25
+ <CodeSnippet>{baseDocumentsDirectoryName}</CodeSnippet> folder.
24
26
  </Text>
25
27
  <Button asChild className="mt-3" size="3">
26
- <Link href="https://useprint.dev/docs">Check the docs</Link>
28
+ <Link href="https://useprint.dev">Check the docs</Link>
27
29
  </Button>
28
30
  </div>
29
31
  </div>