@useprint/preview 0.1.1 → 0.1.3
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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +5 -5
- package/.next/diagnostics/framework.json +1 -1
- package/.next/images-manifest.json +1 -0
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +3 -5
- package/.next/required-server-files.js +324 -0
- package/.next/required-server-files.json +11 -8
- package/.next/routes-manifest.json +1 -1
- package/.next/server/app/_global-error/page.js +3 -3
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.meta +2 -1
- package/.next/server/app/_global-error.rsc +2 -3
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -3
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -8
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js +1 -1
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/preview/[...slug]/page.js +102 -219
- package/.next/server/app/preview/[...slug]/page.js.nft.json +1 -1
- package/.next/server/app/preview/[...slug]/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/337.js +3 -0
- package/.next/server/chunks/377.js +1 -0
- package/.next/server/chunks/394.js +1 -0
- package/.next/server/chunks/445.js +22 -0
- package/.next/server/chunks/471.js +13 -0
- package/.next/server/chunks/95.js +4 -4
- package/.next/server/chunks/static/media/pdf.worker.min.3327dba1.mjs +8 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/webpack-runtime.js +1 -1
- package/.next/static/chunks/134-e1901aa4c8d7c5e4.js +1 -0
- package/.next/static/chunks/399-82b1df7ae5633759.js +1 -0
- package/.next/static/chunks/4bd1b696-096d35a2bd1da3af.js +1 -0
- package/.next/static/chunks/576-c76dd52ea4e7fe70.js +1 -0
- package/.next/static/chunks/794-96cfa93198fb4e82.js +2 -0
- package/.next/static/chunks/818-09ed5fa3e6aa2cec.js +9 -0
- package/.next/static/chunks/aad4249a-49e9609864e9e734.js +2 -0
- package/.next/static/chunks/app/layout-ab1f12a855e9ab71.js +1 -0
- package/.next/static/chunks/app/preview/[...slug]/page-21d4bab9478629da.js +1 -0
- package/.next/static/chunks/{c828b8b5-6f56633e9da941cb.js → c828b8b5-fe0be434537dde60.js} +2 -2
- package/.next/static/chunks/framework-2d4b35820b5e3e1e.js +1 -0
- package/.next/static/chunks/main-d2bae8996dc5307c.js +5 -0
- package/.next/static/chunks/{webpack-b8e17eaab329ee72.js → webpack-96cba10d3fe872ec.js} +1 -1
- package/.next/static/css/30dcbab3549c2dfe.css +4 -0
- package/.next/static/media/inter-cyrillic-400-normal.372704ff.woff2 +0 -0
- package/.next/static/media/inter-cyrillic-400-normal.a6b6ef6f.woff +0 -0
- package/.next/static/media/inter-cyrillic-500-normal.7c15bba8.woff2 +0 -0
- package/.next/static/media/inter-cyrillic-500-normal.b9f8c929.woff +0 -0
- package/.next/static/media/inter-cyrillic-600-normal.2f42892a.woff2 +0 -0
- package/.next/static/media/inter-cyrillic-600-normal.c3987adc.woff +0 -0
- package/.next/static/media/inter-cyrillic-700-normal.93eba3c3.woff +0 -0
- package/.next/static/media/inter-cyrillic-700-normal.e9e5b2dc.woff2 +0 -0
- package/.next/static/media/inter-cyrillic-ext-400-normal.2a31c04b.woff +0 -0
- package/.next/static/media/inter-cyrillic-ext-400-normal.f572b170.woff2 +0 -0
- package/.next/static/media/inter-cyrillic-ext-500-normal.5a6bb1da.woff +0 -0
- package/.next/static/media/inter-cyrillic-ext-500-normal.fe0d9b14.woff2 +0 -0
- package/.next/static/media/inter-cyrillic-ext-600-normal.ecbdecad.woff +0 -0
- package/.next/static/media/inter-cyrillic-ext-600-normal.f7b3c15b.woff2 +0 -0
- package/.next/static/media/inter-cyrillic-ext-700-normal.4b4022a6.woff +0 -0
- package/.next/static/media/inter-cyrillic-ext-700-normal.74b516d2.woff2 +0 -0
- package/.next/static/media/inter-greek-400-normal.cc58c11b.woff +0 -0
- package/.next/static/media/inter-greek-400-normal.d7020e3c.woff2 +0 -0
- package/.next/static/media/inter-greek-500-normal.d9a33207.woff +0 -0
- package/.next/static/media/inter-greek-500-normal.f41f43db.woff2 +0 -0
- package/.next/static/media/inter-greek-600-normal.4ec0c1c1.woff +0 -0
- package/.next/static/media/inter-greek-600-normal.cc532937.woff2 +0 -0
- package/.next/static/media/inter-greek-700-normal.5ec6c758.woff +0 -0
- package/.next/static/media/inter-greek-700-normal.97f0eeeb.woff2 +0 -0
- package/.next/static/media/inter-greek-ext-400-normal.4ce1df5d.woff2 +0 -0
- package/.next/static/media/inter-greek-ext-400-normal.88ede1ea.woff +0 -0
- package/.next/static/media/inter-greek-ext-500-normal.7a4aa726.woff +0 -0
- package/.next/static/media/inter-greek-ext-500-normal.cbd51e2d.woff2 +0 -0
- package/.next/static/media/inter-greek-ext-600-normal.089a95ee.woff +0 -0
- package/.next/static/media/inter-greek-ext-600-normal.1f33d317.woff2 +0 -0
- package/.next/static/media/inter-greek-ext-700-normal.31f1075d.woff +0 -0
- package/.next/static/media/inter-greek-ext-700-normal.827cd618.woff2 +0 -0
- package/.next/static/media/inter-latin-400-normal.2c7a775c.woff +0 -0
- package/.next/static/media/inter-latin-400-normal.ef6d3f52.woff2 +0 -0
- package/.next/static/media/inter-latin-500-normal.b7b43ace.woff2 +0 -0
- package/.next/static/media/inter-latin-500-normal.cb4c8ceb.woff +0 -0
- package/.next/static/media/inter-latin-600-normal.8fb1a964.woff2 +0 -0
- package/.next/static/media/inter-latin-600-normal.ce0f5f43.woff +0 -0
- package/.next/static/media/inter-latin-700-normal.953b7aa5.woff2 +0 -0
- package/.next/static/media/inter-latin-700-normal.9c21d4dc.woff +0 -0
- package/.next/static/media/inter-latin-ext-400-normal.32a25442.woff2 +0 -0
- package/.next/static/media/inter-latin-ext-400-normal.4edcaace.woff +0 -0
- package/.next/static/media/inter-latin-ext-500-normal.a19a84a6.woff +0 -0
- package/.next/static/media/inter-latin-ext-500-normal.d9b491de.woff2 +0 -0
- package/.next/static/media/inter-latin-ext-600-normal.38b075d8.woff2 +0 -0
- package/.next/static/media/inter-latin-ext-600-normal.49faa47a.woff +0 -0
- package/.next/static/media/inter-latin-ext-700-normal.93534b50.woff +0 -0
- package/.next/static/media/inter-latin-ext-700-normal.b63daa1a.woff2 +0 -0
- package/.next/static/media/inter-vietnamese-400-normal.a9dd2faf.woff +0 -0
- package/.next/static/media/inter-vietnamese-400-normal.de4fc44f.woff2 +0 -0
- package/.next/static/media/inter-vietnamese-500-normal.7c0a695f.woff2 +0 -0
- package/.next/static/media/inter-vietnamese-500-normal.a3a73b95.woff +0 -0
- package/.next/static/media/inter-vietnamese-600-normal.9d518599.woff2 +0 -0
- package/.next/static/media/inter-vietnamese-600-normal.c5ce3fcb.woff +0 -0
- package/.next/static/media/inter-vietnamese-700-normal.bc68b199.woff +0 -0
- package/.next/static/media/inter-vietnamese-700-normal.faf12809.woff2 +0 -0
- package/.next/static/media/pdf.worker.min.67f75a11.mjs +8 -0
- package/.next/trace +32 -32
- package/.next/trace-build +1 -1
- package/CHANGELOG.md +19 -0
- package/next.config.js +5 -1
- package/package.json +4 -3
- package/public/apple-touch-icon.png +0 -0
- package/public/favicon-96x96.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +3 -0
- package/public/site.webmanifest +21 -0
- package/public/web-app-manifest-192x192.png +0 -0
- package/public/web-app-manifest-512x512.png +0 -0
- package/readme.md +9 -27
- package/scripts/utils/default-seed/contracts/project-proposal.tsx +68 -0
- package/scripts/utils/default-seed/finance/payment-summary.tsx +55 -0
- package/scripts/utils/default-seed/reports/incident-report.tsx +49 -0
- package/scripts/utils/default-seed/updates/release-notes.tsx +58 -0
- package/src/actions/generate-pdf-from-html.ts +0 -8
- package/src/actions/render-document-by-path.tsx +0 -3
- package/src/app/favicon.ico +0 -0
- package/src/app/fonts.ts +0 -7
- package/src/app/globals.css +9 -0
- package/src/app/layout.tsx +13 -8
- package/src/app/page.tsx +14 -12
- package/src/app/preview/[...slug]/page.tsx +9 -61
- package/src/app/preview/[...slug]/preview.tsx +5 -6
- package/src/components/logo.tsx +21 -13
- package/src/components/pdf-viewer.tsx +61 -20
- package/src/components/print.tsx +37 -5
- package/src/components/shell.tsx +1 -2
- package/src/utils/__snapshots__/get-document-component.spec.ts.snap +25 -181
- package/src/utils/canidocument/ast/get-object-variables.ts +1 -1
- package/src/utils/canidocument/ast/get-used-style-properties.ts +1 -1
- package/src/utils/canidocument/get-compatibility-stats-for-entry.ts +1 -1
- package/src/utils/canidocument/tailwind/get-tailwind-config.ts +1 -1
- package/src/utils/canidocument/tailwind/get-tailwind-metadata.spec.ts +2 -2
- package/src/utils/canidocument/tailwind/get-tailwind-metadata.ts +1 -1
- package/src/utils/canidocument/types.ts +12 -0
- package/src/utils/contains-document-template.spec.ts +1 -1
- package/src/utils/esbuild/renderring-utilities-exporter.ts +248 -0
- package/src/utils/get-document-component.spec.ts +6 -4
- package/src/utils/get-document-component.ts +61 -10
- package/src/utils/get-documents-directory-metadata.spec.ts +18 -55
- package/src/utils/iframe-processing.spec.ts +13 -25
- package/src/utils/js-document-detection.spec.ts +11 -5
- package/src/utils/linting.ts +29 -33
- package/src/utils/margin-calculation.spec.ts +5 -5
- package/src/utils/testing/js-document-export-default.js +3 -0
- package/src/utils/testing/js-document-test.js +3 -0
- package/src/utils/testing/mdx-document-test.js +3 -0
- package/src/utils/testing/request-response-document.tsx +15 -0
- package/.next/server/chunks/134.js +0 -22
- package/.next/server/chunks/286.js +0 -27
- package/.next/server/chunks/489.js +0 -13
- package/.next/server/chunks/731.js +0 -1
- package/.next/server/chunks/static/media/pdf.worker.min.3fa7f4f1.mjs +0 -8
- package/.next/static/chunks/134-488429db271f07ce.js +0 -1
- package/.next/static/chunks/399-38210d4b480adc3a.js +0 -1
- package/.next/static/chunks/4bd1b696-f2999b4e17b2fd5f.js +0 -1
- package/.next/static/chunks/576-d2a7761fb68a178e.js +0 -1
- package/.next/static/chunks/794-de04f3efd45c53dd.js +0 -20
- package/.next/static/chunks/818-708fabc8a2438ba2.js +0 -9
- package/.next/static/chunks/aad4249a-8397af6f169152d5.js +0 -2
- package/.next/static/chunks/app/layout-38d6d79a819ab362.js +0 -1
- package/.next/static/chunks/app/preview/[...slug]/page-1097b557142aa22c.js +0 -1
- package/.next/static/chunks/framework-9fb1a057e8adf51d.js +0 -1
- package/.next/static/chunks/main-66c819c51fec57bf.js +0 -23
- package/.next/static/css/2f4a632dc94d1fb7.css +0 -3
- package/.next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
- package/.next/static/media/21350d82a1f187e9-s.woff2 +0 -0
- package/.next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
- package/.next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
- package/.next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
- package/.next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
- package/.next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
- package/.next/static/media/pdf.worker.min.539a26ca.mjs +0 -8
- package/.next/types/app/layout.ts +0 -86
- package/.next/types/cache-life.d.ts +0 -145
- package/scripts/utils/default-seed/auth/account-confirmation.tsx +0 -68
- package/scripts/utils/default-seed/auth/forgot-password.tsx +0 -71
- package/scripts/utils/default-seed/communications/payment-overdue.tsx +0 -82
- package/scripts/utils/default-seed/communications/team-invite.tsx +0 -78
- package/scripts/utils/default-seed/communications/webhooks-failed.tsx +0 -89
- package/scripts/utils/default-seed/feedback-request.tsx +0 -78
- package/scripts/utils/default-seed/marketing/changelog.tsx +0 -98
- package/src/actions/document-validation/__snapshots__/check-images.spec.tsx.snap +0 -84
- package/src/actions/document-validation/canidocument-data.ts +0 -85993
- package/src/actions/document-validation/check-compatibility.ts +0 -333
- package/src/actions/document-validation/check-images.spec.tsx +0 -21
- package/src/actions/document-validation/check-images.ts +0 -160
- package/src/actions/document-validation/check-links.spec.tsx +0 -113
- package/src/actions/document-validation/check-links.ts +0 -113
- package/src/actions/document-validation/get-code-location-from-ast-element.ts +0 -18
- package/src/actions/document-validation/quick-fetch.ts +0 -14
- package/src/animated-icons-data/help.json +0 -1082
- package/src/animated-icons-data/link.json +0 -1309
- package/src/animated-icons-data/mail.json +0 -1320
- package/src/components/toolbar/checking-results.tsx +0 -150
- package/src/components/toolbar/code-preview-line-link.tsx +0 -39
- package/src/components/toolbar/compatibility.tsx +0 -113
- package/src/components/toolbar/linter.tsx +0 -278
- package/src/components/toolbar/results-table.tsx +0 -0
- package/src/components/toolbar/results.tsx +0 -52
- package/src/components/toolbar/spam-assassin.tsx +0 -153
- package/src/components/toolbar/toolbar-button.tsx +0 -52
- package/src/components/toolbar/use-cached-state.ts +0 -33
- package/src/components/toolbar.tsx +0 -349
- /package/.next/static/{ZCqBZ8ZswPjX7K5Zalrpy → w_xYcS_2x1gNv-LaTlIOy}/_buildManifest.js +0 -0
- /package/.next/static/{ZCqBZ8ZswPjX7K5Zalrpy → w_xYcS_2x1gNv-LaTlIOy}/_ssgManifest.js +0 -0
package/.next/trace-build
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"run-webpack","duration":
|
|
1
|
+
[{"name":"run-webpack","duration":21027054,"timestamp":97462172,"id":17,"parentId":1,"tags":{},"startTime":1775856622192,"traceId":"4d475fe8e57a7a44"},{"name":"run-typescript","duration":4700485,"timestamp":118513330,"id":3280,"parentId":1,"tags":{},"startTime":1775856643243,"traceId":"4d475fe8e57a7a44"},{"name":"static-check","duration":718252,"timestamp":123279672,"id":3283,"parentId":1,"tags":{},"startTime":1775856648010,"traceId":"4d475fe8e57a7a44"},{"name":"static-generation","duration":2832338,"timestamp":124025524,"id":3299,"parentId":1,"tags":{},"startTime":1775856648755,"traceId":"4d475fe8e57a7a44"},{"name":"collect-build-traces","duration":8356810,"timestamp":123998455,"id":3296,"parentId":1,"tags":{},"startTime":1775856648728,"traceId":"4d475fe8e57a7a44"},{"name":"telemetry-flush","duration":59,"timestamp":132356976,"id":3307,"parentId":1,"tags":{},"startTime":1775856657087,"traceId":"4d475fe8e57a7a44"},{"name":"next-build","duration":35174445,"timestamp":97182599,"id":1,"tags":{"buildMode":"default","version":"16.1.6","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1775856621913,"traceId":"4d475fe8e57a7a44"}]
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @useprint/preview
|
|
2
2
|
|
|
3
|
+
## 0.1.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- aa72ad0: Declare missing direct dependencies for `@useprint/preview` so fresh `init-doc` installs can resolve the preview app font imports and bundled test helpers without relying on monorepo-only root packages.
|
|
8
|
+
- aa72ad0: Fixing missing packages.
|
|
9
|
+
- Updated dependencies [aa72ad0]
|
|
10
|
+
- @useprint/components@0.1.3
|
|
11
|
+
- @useprint/shared@0.1.3
|
|
12
|
+
|
|
13
|
+
## 0.1.2
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 4ba9bad: Improving css engine, branding and a loader to pdf preview. Adding init-doc command. Rewriting tests. Cleaning up react.email.
|
|
18
|
+
- Updated dependencies [4ba9bad]
|
|
19
|
+
- @useprint/components@0.1.2
|
|
20
|
+
- @useprint/shared@0.1.2
|
|
21
|
+
|
|
3
22
|
## 0.1.1
|
|
4
23
|
|
|
5
24
|
### 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.
|
|
3
|
+
"version": "0.1.3",
|
|
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",
|
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
},
|
|
14
14
|
"main": "./index.mjs",
|
|
15
15
|
"dependencies": {
|
|
16
|
+
"@happy-dom/global-registrator": "^18.0.1",
|
|
16
17
|
"@babel/core": "7.26.10",
|
|
17
18
|
"@babel/parser": "^7.27.0",
|
|
18
19
|
"@babel/traverse": "^7.27.0",
|
|
20
|
+
"@fontsource/inter": "^5.2.8",
|
|
19
21
|
"@lottiefiles/dotlottie-react": "0.13.3",
|
|
20
22
|
"@radix-ui/colors": "3.0.0",
|
|
21
23
|
"@radix-ui/react-collapsible": "1.1.7",
|
|
@@ -54,12 +56,11 @@
|
|
|
54
56
|
"socket.io-client": "4.8.1",
|
|
55
57
|
"sonner": "2.0.3",
|
|
56
58
|
"source-map-js": "1.2.1",
|
|
57
|
-
"spamc": "0.0.5",
|
|
58
59
|
"stacktrace-parser": "0.1.11",
|
|
59
60
|
"tailwind-merge": "3.2.0",
|
|
60
61
|
"tailwindcss": "3.4.0",
|
|
61
62
|
"use-debounce": "10.0.4",
|
|
62
|
-
"zod": "3.
|
|
63
|
+
"zod": "^4.3.6"
|
|
63
64
|
},
|
|
64
65
|
"devDependencies": {
|
|
65
66
|
"@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
|
+
}
|
|
Binary file
|
|
Binary file
|
package/readme.md
CHANGED
|
@@ -1,34 +1,16 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
3
|
+
[docs](https://useprint.dev/docs/packages/preview)
|
|
13
4
|
|
|
14
|
-
|
|
5
|
+
The internal preview runtime used by the Useprint CLI.
|
|
15
6
|
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
pnpm dev:seed
|
|
20
|
-
```
|
|
9
|
+
## Typical usage
|
|
21
10
|
|
|
22
|
-
|
|
11
|
+
Most users should not install this package directly. Instead, install:
|
|
23
12
|
|
|
24
|
-
|
|
13
|
+
- `@useprint/components` to author documents
|
|
14
|
+
- `@useprint/cli` to preview and export them
|
|
25
15
|
|
|
26
|
-
|
|
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;
|
package/src/app/favicon.ico
CHANGED
|
Binary file
|
package/src/app/fonts.ts
CHANGED
package/src/app/globals.css
CHANGED
|
@@ -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
|
}
|
package/src/app/layout.tsx
CHANGED
|
@@ -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 {
|
|
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=
|
|
28
|
-
|
|
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
|
|
2
|
-
import Image from
|
|
3
|
-
import Link from
|
|
4
|
-
import { Button, Heading, Text } from
|
|
5
|
-
import CodeSnippet from
|
|
6
|
-
import { Shell } from
|
|
7
|
-
import { documentsDirectoryAbsolutePath } from
|
|
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(
|
|
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
|
|
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
|
|
28
|
+
<Link href="https://useprint.dev">Check the docs</Link>
|
|
27
29
|
</Button>
|
|
28
30
|
</div>
|
|
29
31
|
</div>
|