pdf-smith 0.1.0
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/LICENSE +21 -0
- package/dist/index.cjs +146 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +33 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/preview-plugin-QWJEXDW2.js +84 -0
- package/dist/preview-plugin-QWJEXDW2.js.map +1 -0
- package/dist/server.cjs +246 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +33 -0
- package/dist/server.d.ts +33 -0
- package/dist/server.js +104 -0
- package/dist/server.js.map +1 -0
- package/package.json +91 -0
- package/src/constants.ts +11 -0
- package/src/document.tsx +15 -0
- package/src/index.ts +11 -0
- package/src/page.tsx +35 -0
- package/src/preview/app.tsx +52 -0
- package/src/preview/entry.tsx +7 -0
- package/src/preview/navigation.tsx +98 -0
- package/src/preview/preview-plugin.ts +92 -0
- package/src/preview/types.ts +16 -0
- package/src/preview/vite-env.d.ts +3 -0
- package/src/styles.ts +69 -0
- package/src/types.ts +23 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Kareem Elbahrawy
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
DEFAULT_PADDING: () => DEFAULT_PADDING,
|
|
24
|
+
DEFAULT_PAGE_SIZE: () => DEFAULT_PAGE_SIZE,
|
|
25
|
+
Document: () => Document,
|
|
26
|
+
PAGE_SIZES: () => PAGE_SIZES,
|
|
27
|
+
Page: () => Page
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(index_exports);
|
|
30
|
+
|
|
31
|
+
// src/constants.ts
|
|
32
|
+
var PAGE_SIZES = {
|
|
33
|
+
A4: { width: 210, height: 297 },
|
|
34
|
+
Letter: { width: 215.9, height: 279.4 },
|
|
35
|
+
A3: { width: 297, height: 420 }
|
|
36
|
+
};
|
|
37
|
+
var DEFAULT_PADDING = 0;
|
|
38
|
+
var DEFAULT_PAGE_SIZE = "A4";
|
|
39
|
+
|
|
40
|
+
// src/styles.ts
|
|
41
|
+
function resolvePadding(padding) {
|
|
42
|
+
if (typeof padding === "number") {
|
|
43
|
+
return { top: padding, right: padding, bottom: padding, left: padding };
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
top: padding.top ?? 0,
|
|
47
|
+
right: padding.right ?? 0,
|
|
48
|
+
bottom: padding.bottom ?? 0,
|
|
49
|
+
left: padding.left ?? 0
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function getPageStyle(dimensions, padding) {
|
|
53
|
+
return {
|
|
54
|
+
width: `${dimensions.width}mm`,
|
|
55
|
+
height: `${dimensions.height}mm`,
|
|
56
|
+
paddingTop: `${padding.top}mm`,
|
|
57
|
+
paddingRight: `${padding.right}mm`,
|
|
58
|
+
paddingBottom: `${padding.bottom}mm`,
|
|
59
|
+
paddingLeft: `${padding.left}mm`,
|
|
60
|
+
display: "block",
|
|
61
|
+
overflow: "hidden",
|
|
62
|
+
background: "white",
|
|
63
|
+
boxSizing: "border-box"
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function getDocumentStyleSheet(dimensions) {
|
|
67
|
+
return `
|
|
68
|
+
@page {
|
|
69
|
+
size: ${dimensions.width}mm ${dimensions.height}mm;
|
|
70
|
+
margin: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
* {
|
|
74
|
+
print-color-adjust: exact;
|
|
75
|
+
-webkit-print-color-adjust: exact;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@media screen {
|
|
79
|
+
[data-pdf-smith-page] {
|
|
80
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
|
|
81
|
+
margin-left: auto;
|
|
82
|
+
margin-right: auto;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@media print {
|
|
87
|
+
[data-pdf-smith-page] {
|
|
88
|
+
box-shadow: none;
|
|
89
|
+
break-after: page;
|
|
90
|
+
overflow: visible;
|
|
91
|
+
height: auto;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
`.trim();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// src/document.tsx
|
|
98
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
99
|
+
function Document({ children, className }) {
|
|
100
|
+
const styleSheet = getDocumentStyleSheet(PAGE_SIZES.A4);
|
|
101
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { "data-pdf-smith-document": "", className, children: [
|
|
102
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("style", { dangerouslySetInnerHTML: { __html: styleSheet } }),
|
|
103
|
+
children
|
|
104
|
+
] });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// src/page.tsx
|
|
108
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
109
|
+
function resolveSize(size) {
|
|
110
|
+
if (typeof size === "string") {
|
|
111
|
+
return PAGE_SIZES[size];
|
|
112
|
+
}
|
|
113
|
+
return size;
|
|
114
|
+
}
|
|
115
|
+
function Page({
|
|
116
|
+
children,
|
|
117
|
+
className,
|
|
118
|
+
size = DEFAULT_PAGE_SIZE,
|
|
119
|
+
padding = DEFAULT_PADDING,
|
|
120
|
+
id
|
|
121
|
+
}) {
|
|
122
|
+
const dimensions = resolveSize(size);
|
|
123
|
+
const resolvedPadding = resolvePadding(padding);
|
|
124
|
+
const style = getPageStyle(dimensions, resolvedPadding);
|
|
125
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
126
|
+
"div",
|
|
127
|
+
{
|
|
128
|
+
"data-pdf-smith-page": "",
|
|
129
|
+
"data-page-width": dimensions.width,
|
|
130
|
+
"data-page-height": dimensions.height,
|
|
131
|
+
className,
|
|
132
|
+
id,
|
|
133
|
+
style,
|
|
134
|
+
children
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
139
|
+
0 && (module.exports = {
|
|
140
|
+
DEFAULT_PADDING,
|
|
141
|
+
DEFAULT_PAGE_SIZE,
|
|
142
|
+
Document,
|
|
143
|
+
PAGE_SIZES,
|
|
144
|
+
Page
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/styles.ts","../src/document.tsx","../src/page.tsx"],"sourcesContent":["export { DEFAULT_PADDING, DEFAULT_PAGE_SIZE, PAGE_SIZES } from './constants';\nexport { Document } from './document';\nexport { Page } from './page';\nexport type {\n DocumentProps,\n PageDimensions,\n PagePadding,\n PageProps,\n PageSize,\n PageSizePreset,\n} from './types';\n","import type { PageDimensions, PageSizePreset } from './types';\n\nexport const PAGE_SIZES: Record<PageSizePreset, PageDimensions> = {\n A4: { width: 210, height: 297 },\n Letter: { width: 215.9, height: 279.4 },\n A3: { width: 297, height: 420 },\n};\n\nexport const DEFAULT_PADDING = 0;\n\nexport const DEFAULT_PAGE_SIZE: PageSizePreset = 'A4';\n","import type { PageDimensions, PagePadding } from './types';\n\ninterface ResolvedPadding {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport function resolvePadding(padding: PagePadding): ResolvedPadding {\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding };\n }\n return {\n top: padding.top ?? 0,\n right: padding.right ?? 0,\n bottom: padding.bottom ?? 0,\n left: padding.left ?? 0,\n };\n}\n\nexport function getPageStyle(\n dimensions: PageDimensions,\n padding: ResolvedPadding,\n): React.CSSProperties {\n return {\n width: `${dimensions.width}mm`,\n height: `${dimensions.height}mm`,\n paddingTop: `${padding.top}mm`,\n paddingRight: `${padding.right}mm`,\n paddingBottom: `${padding.bottom}mm`,\n paddingLeft: `${padding.left}mm`,\n display: 'block',\n overflow: 'hidden',\n background: 'white',\n boxSizing: 'border-box',\n };\n}\n\nexport function getDocumentStyleSheet(dimensions: PageDimensions): string {\n return `\n@page {\n size: ${dimensions.width}mm ${dimensions.height}mm;\n margin: 0;\n}\n\n* {\n print-color-adjust: exact;\n -webkit-print-color-adjust: exact;\n}\n\n@media screen {\n [data-pdf-smith-page] {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media print {\n [data-pdf-smith-page] {\n box-shadow: none;\n break-after: page;\n overflow: visible;\n height: auto;\n }\n}\n`.trim();\n}\n","import { PAGE_SIZES } from './constants';\nimport { getDocumentStyleSheet } from './styles';\nimport type { DocumentProps } from './types';\n\nexport function Document({ children, className }: DocumentProps): React.ReactElement {\n const styleSheet = getDocumentStyleSheet(PAGE_SIZES.A4);\n\n return (\n <div data-pdf-smith-document=\"\" className={className}>\n {/* biome-ignore lint/security/noDangerouslySetInnerHtml: trusted internal CSS */}\n <style dangerouslySetInnerHTML={{ __html: styleSheet }} />\n {children}\n </div>\n );\n}\n","import { DEFAULT_PADDING, DEFAULT_PAGE_SIZE, PAGE_SIZES } from './constants';\nimport { getPageStyle, resolvePadding } from './styles';\nimport type { PageDimensions, PageProps, PageSize } from './types';\n\nfunction resolveSize(size: PageSize): PageDimensions {\n if (typeof size === 'string') {\n return PAGE_SIZES[size];\n }\n return size;\n}\n\nexport function Page({\n children,\n className,\n size = DEFAULT_PAGE_SIZE,\n padding = DEFAULT_PADDING,\n id,\n}: PageProps): React.ReactElement {\n const dimensions = resolveSize(size);\n const resolvedPadding = resolvePadding(padding);\n const style = getPageStyle(dimensions, resolvedPadding);\n\n return (\n <div\n data-pdf-smith-page=\"\"\n data-page-width={dimensions.width}\n data-page-height={dimensions.height}\n className={className}\n id={id}\n style={style}\n >\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,aAAqD;AAAA,EAChE,IAAI,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,EAC9B,QAAQ,EAAE,OAAO,OAAO,QAAQ,MAAM;AAAA,EACtC,IAAI,EAAE,OAAO,KAAK,QAAQ,IAAI;AAChC;AAEO,IAAM,kBAAkB;AAExB,IAAM,oBAAoC;;;ACD1C,SAAS,eAAe,SAAuC;AACpE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,KAAK,SAAS,OAAO,SAAS,QAAQ,SAAS,MAAM,QAAQ;AAAA,EACxE;AACA,SAAO;AAAA,IACL,KAAK,QAAQ,OAAO;AAAA,IACpB,OAAO,QAAQ,SAAS;AAAA,IACxB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,MAAM,QAAQ,QAAQ;AAAA,EACxB;AACF;AAEO,SAAS,aACd,YACA,SACqB;AACrB,SAAO;AAAA,IACL,OAAO,GAAG,WAAW,KAAK;AAAA,IAC1B,QAAQ,GAAG,WAAW,MAAM;AAAA,IAC5B,YAAY,GAAG,QAAQ,GAAG;AAAA,IAC1B,cAAc,GAAG,QAAQ,KAAK;AAAA,IAC9B,eAAe,GAAG,QAAQ,MAAM;AAAA,IAChC,aAAa,GAAG,QAAQ,IAAI;AAAA,IAC5B,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AACF;AAEO,SAAS,sBAAsB,YAAoC;AACxE,SAAO;AAAA;AAAA,UAEC,WAAW,KAAK,MAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyB/C,KAAK;AACP;;;AC5DI;AAJG,SAAS,SAAS,EAAE,UAAU,UAAU,GAAsC;AACnF,QAAM,aAAa,sBAAsB,WAAW,EAAE;AAEtD,SACE,6CAAC,SAAI,2BAAwB,IAAG,WAE9B;AAAA,gDAAC,WAAM,yBAAyB,EAAE,QAAQ,WAAW,GAAG;AAAA,IACvD;AAAA,KACH;AAEJ;;;ACSI,IAAAA,sBAAA;AAnBJ,SAAS,YAAY,MAAgC;AACnD,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,WAAW,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AACF,GAAkC;AAChC,QAAM,aAAa,YAAY,IAAI;AACnC,QAAM,kBAAkB,eAAe,OAAO;AAC9C,QAAM,QAAQ,aAAa,YAAY,eAAe;AAEtD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,uBAAoB;AAAA,MACpB,mBAAiB,WAAW;AAAA,MAC5B,oBAAkB,WAAW;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":["import_jsx_runtime"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type PageSizePreset = 'A4' | 'Letter' | 'A3';
|
|
2
|
+
interface PageDimensions {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
}
|
|
6
|
+
type PageSize = PageSizePreset | PageDimensions;
|
|
7
|
+
type PagePadding = number | {
|
|
8
|
+
top?: number;
|
|
9
|
+
right?: number;
|
|
10
|
+
bottom?: number;
|
|
11
|
+
left?: number;
|
|
12
|
+
};
|
|
13
|
+
interface PageProps {
|
|
14
|
+
children?: React.ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
size?: PageSize;
|
|
17
|
+
padding?: PagePadding;
|
|
18
|
+
id?: string;
|
|
19
|
+
}
|
|
20
|
+
interface DocumentProps {
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare const PAGE_SIZES: Record<PageSizePreset, PageDimensions>;
|
|
26
|
+
declare const DEFAULT_PADDING = 0;
|
|
27
|
+
declare const DEFAULT_PAGE_SIZE: PageSizePreset;
|
|
28
|
+
|
|
29
|
+
declare function Document({ children, className }: DocumentProps): React.ReactElement;
|
|
30
|
+
|
|
31
|
+
declare function Page({ children, className, size, padding, id, }: PageProps): React.ReactElement;
|
|
32
|
+
|
|
33
|
+
export { DEFAULT_PADDING, DEFAULT_PAGE_SIZE, Document, type DocumentProps, PAGE_SIZES, Page, type PageDimensions, type PagePadding, type PageProps, type PageSize, type PageSizePreset };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type PageSizePreset = 'A4' | 'Letter' | 'A3';
|
|
2
|
+
interface PageDimensions {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
}
|
|
6
|
+
type PageSize = PageSizePreset | PageDimensions;
|
|
7
|
+
type PagePadding = number | {
|
|
8
|
+
top?: number;
|
|
9
|
+
right?: number;
|
|
10
|
+
bottom?: number;
|
|
11
|
+
left?: number;
|
|
12
|
+
};
|
|
13
|
+
interface PageProps {
|
|
14
|
+
children?: React.ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
size?: PageSize;
|
|
17
|
+
padding?: PagePadding;
|
|
18
|
+
id?: string;
|
|
19
|
+
}
|
|
20
|
+
interface DocumentProps {
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
declare const PAGE_SIZES: Record<PageSizePreset, PageDimensions>;
|
|
26
|
+
declare const DEFAULT_PADDING = 0;
|
|
27
|
+
declare const DEFAULT_PAGE_SIZE: PageSizePreset;
|
|
28
|
+
|
|
29
|
+
declare function Document({ children, className }: DocumentProps): React.ReactElement;
|
|
30
|
+
|
|
31
|
+
declare function Page({ children, className, size, padding, id, }: PageProps): React.ReactElement;
|
|
32
|
+
|
|
33
|
+
export { DEFAULT_PADDING, DEFAULT_PAGE_SIZE, Document, type DocumentProps, PAGE_SIZES, Page, type PageDimensions, type PagePadding, type PageProps, type PageSize, type PageSizePreset };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// src/constants.ts
|
|
2
|
+
var PAGE_SIZES = {
|
|
3
|
+
A4: { width: 210, height: 297 },
|
|
4
|
+
Letter: { width: 215.9, height: 279.4 },
|
|
5
|
+
A3: { width: 297, height: 420 }
|
|
6
|
+
};
|
|
7
|
+
var DEFAULT_PADDING = 0;
|
|
8
|
+
var DEFAULT_PAGE_SIZE = "A4";
|
|
9
|
+
|
|
10
|
+
// src/styles.ts
|
|
11
|
+
function resolvePadding(padding) {
|
|
12
|
+
if (typeof padding === "number") {
|
|
13
|
+
return { top: padding, right: padding, bottom: padding, left: padding };
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
top: padding.top ?? 0,
|
|
17
|
+
right: padding.right ?? 0,
|
|
18
|
+
bottom: padding.bottom ?? 0,
|
|
19
|
+
left: padding.left ?? 0
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function getPageStyle(dimensions, padding) {
|
|
23
|
+
return {
|
|
24
|
+
width: `${dimensions.width}mm`,
|
|
25
|
+
height: `${dimensions.height}mm`,
|
|
26
|
+
paddingTop: `${padding.top}mm`,
|
|
27
|
+
paddingRight: `${padding.right}mm`,
|
|
28
|
+
paddingBottom: `${padding.bottom}mm`,
|
|
29
|
+
paddingLeft: `${padding.left}mm`,
|
|
30
|
+
display: "block",
|
|
31
|
+
overflow: "hidden",
|
|
32
|
+
background: "white",
|
|
33
|
+
boxSizing: "border-box"
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getDocumentStyleSheet(dimensions) {
|
|
37
|
+
return `
|
|
38
|
+
@page {
|
|
39
|
+
size: ${dimensions.width}mm ${dimensions.height}mm;
|
|
40
|
+
margin: 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
* {
|
|
44
|
+
print-color-adjust: exact;
|
|
45
|
+
-webkit-print-color-adjust: exact;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@media screen {
|
|
49
|
+
[data-pdf-smith-page] {
|
|
50
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
|
|
51
|
+
margin-left: auto;
|
|
52
|
+
margin-right: auto;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@media print {
|
|
57
|
+
[data-pdf-smith-page] {
|
|
58
|
+
box-shadow: none;
|
|
59
|
+
break-after: page;
|
|
60
|
+
overflow: visible;
|
|
61
|
+
height: auto;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
`.trim();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// src/document.tsx
|
|
68
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
69
|
+
function Document({ children, className }) {
|
|
70
|
+
const styleSheet = getDocumentStyleSheet(PAGE_SIZES.A4);
|
|
71
|
+
return /* @__PURE__ */ jsxs("div", { "data-pdf-smith-document": "", className, children: [
|
|
72
|
+
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: styleSheet } }),
|
|
73
|
+
children
|
|
74
|
+
] });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/page.tsx
|
|
78
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
79
|
+
function resolveSize(size) {
|
|
80
|
+
if (typeof size === "string") {
|
|
81
|
+
return PAGE_SIZES[size];
|
|
82
|
+
}
|
|
83
|
+
return size;
|
|
84
|
+
}
|
|
85
|
+
function Page({
|
|
86
|
+
children,
|
|
87
|
+
className,
|
|
88
|
+
size = DEFAULT_PAGE_SIZE,
|
|
89
|
+
padding = DEFAULT_PADDING,
|
|
90
|
+
id
|
|
91
|
+
}) {
|
|
92
|
+
const dimensions = resolveSize(size);
|
|
93
|
+
const resolvedPadding = resolvePadding(padding);
|
|
94
|
+
const style = getPageStyle(dimensions, resolvedPadding);
|
|
95
|
+
return /* @__PURE__ */ jsx2(
|
|
96
|
+
"div",
|
|
97
|
+
{
|
|
98
|
+
"data-pdf-smith-page": "",
|
|
99
|
+
"data-page-width": dimensions.width,
|
|
100
|
+
"data-page-height": dimensions.height,
|
|
101
|
+
className,
|
|
102
|
+
id,
|
|
103
|
+
style,
|
|
104
|
+
children
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
export {
|
|
109
|
+
DEFAULT_PADDING,
|
|
110
|
+
DEFAULT_PAGE_SIZE,
|
|
111
|
+
Document,
|
|
112
|
+
PAGE_SIZES,
|
|
113
|
+
Page
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/styles.ts","../src/document.tsx","../src/page.tsx"],"sourcesContent":["import type { PageDimensions, PageSizePreset } from './types';\n\nexport const PAGE_SIZES: Record<PageSizePreset, PageDimensions> = {\n A4: { width: 210, height: 297 },\n Letter: { width: 215.9, height: 279.4 },\n A3: { width: 297, height: 420 },\n};\n\nexport const DEFAULT_PADDING = 0;\n\nexport const DEFAULT_PAGE_SIZE: PageSizePreset = 'A4';\n","import type { PageDimensions, PagePadding } from './types';\n\ninterface ResolvedPadding {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport function resolvePadding(padding: PagePadding): ResolvedPadding {\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding };\n }\n return {\n top: padding.top ?? 0,\n right: padding.right ?? 0,\n bottom: padding.bottom ?? 0,\n left: padding.left ?? 0,\n };\n}\n\nexport function getPageStyle(\n dimensions: PageDimensions,\n padding: ResolvedPadding,\n): React.CSSProperties {\n return {\n width: `${dimensions.width}mm`,\n height: `${dimensions.height}mm`,\n paddingTop: `${padding.top}mm`,\n paddingRight: `${padding.right}mm`,\n paddingBottom: `${padding.bottom}mm`,\n paddingLeft: `${padding.left}mm`,\n display: 'block',\n overflow: 'hidden',\n background: 'white',\n boxSizing: 'border-box',\n };\n}\n\nexport function getDocumentStyleSheet(dimensions: PageDimensions): string {\n return `\n@page {\n size: ${dimensions.width}mm ${dimensions.height}mm;\n margin: 0;\n}\n\n* {\n print-color-adjust: exact;\n -webkit-print-color-adjust: exact;\n}\n\n@media screen {\n [data-pdf-smith-page] {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n@media print {\n [data-pdf-smith-page] {\n box-shadow: none;\n break-after: page;\n overflow: visible;\n height: auto;\n }\n}\n`.trim();\n}\n","import { PAGE_SIZES } from './constants';\nimport { getDocumentStyleSheet } from './styles';\nimport type { DocumentProps } from './types';\n\nexport function Document({ children, className }: DocumentProps): React.ReactElement {\n const styleSheet = getDocumentStyleSheet(PAGE_SIZES.A4);\n\n return (\n <div data-pdf-smith-document=\"\" className={className}>\n {/* biome-ignore lint/security/noDangerouslySetInnerHtml: trusted internal CSS */}\n <style dangerouslySetInnerHTML={{ __html: styleSheet }} />\n {children}\n </div>\n );\n}\n","import { DEFAULT_PADDING, DEFAULT_PAGE_SIZE, PAGE_SIZES } from './constants';\nimport { getPageStyle, resolvePadding } from './styles';\nimport type { PageDimensions, PageProps, PageSize } from './types';\n\nfunction resolveSize(size: PageSize): PageDimensions {\n if (typeof size === 'string') {\n return PAGE_SIZES[size];\n }\n return size;\n}\n\nexport function Page({\n children,\n className,\n size = DEFAULT_PAGE_SIZE,\n padding = DEFAULT_PADDING,\n id,\n}: PageProps): React.ReactElement {\n const dimensions = resolveSize(size);\n const resolvedPadding = resolvePadding(padding);\n const style = getPageStyle(dimensions, resolvedPadding);\n\n return (\n <div\n data-pdf-smith-page=\"\"\n data-page-width={dimensions.width}\n data-page-height={dimensions.height}\n className={className}\n id={id}\n style={style}\n >\n {children}\n </div>\n );\n}\n"],"mappings":";AAEO,IAAM,aAAqD;AAAA,EAChE,IAAI,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,EAC9B,QAAQ,EAAE,OAAO,OAAO,QAAQ,MAAM;AAAA,EACtC,IAAI,EAAE,OAAO,KAAK,QAAQ,IAAI;AAChC;AAEO,IAAM,kBAAkB;AAExB,IAAM,oBAAoC;;;ACD1C,SAAS,eAAe,SAAuC;AACpE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,KAAK,SAAS,OAAO,SAAS,QAAQ,SAAS,MAAM,QAAQ;AAAA,EACxE;AACA,SAAO;AAAA,IACL,KAAK,QAAQ,OAAO;AAAA,IACpB,OAAO,QAAQ,SAAS;AAAA,IACxB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,MAAM,QAAQ,QAAQ;AAAA,EACxB;AACF;AAEO,SAAS,aACd,YACA,SACqB;AACrB,SAAO;AAAA,IACL,OAAO,GAAG,WAAW,KAAK;AAAA,IAC1B,QAAQ,GAAG,WAAW,MAAM;AAAA,IAC5B,YAAY,GAAG,QAAQ,GAAG;AAAA,IAC1B,cAAc,GAAG,QAAQ,KAAK;AAAA,IAC9B,eAAe,GAAG,QAAQ,MAAM;AAAA,IAChC,aAAa,GAAG,QAAQ,IAAI;AAAA,IAC5B,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,EACb;AACF;AAEO,SAAS,sBAAsB,YAAoC;AACxE,SAAO;AAAA;AAAA,UAEC,WAAW,KAAK,MAAM,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyB/C,KAAK;AACP;;;AC5DI,SAEE,KAFF;AAJG,SAAS,SAAS,EAAE,UAAU,UAAU,GAAsC;AACnF,QAAM,aAAa,sBAAsB,WAAW,EAAE;AAEtD,SACE,qBAAC,SAAI,2BAAwB,IAAG,WAE9B;AAAA,wBAAC,WAAM,yBAAyB,EAAE,QAAQ,WAAW,GAAG;AAAA,IACvD;AAAA,KACH;AAEJ;;;ACSI,gBAAAA,YAAA;AAnBJ,SAAS,YAAY,MAAgC;AACnD,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,WAAW,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AACF,GAAkC;AAChC,QAAM,aAAa,YAAY,IAAI;AACnC,QAAM,kBAAkB,eAAe,OAAO;AAC9C,QAAM,QAAQ,aAAa,YAAY,eAAe;AAEtD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,uBAAoB;AAAA,MACpB,mBAAiB,WAAW;AAAA,MAC5B,oBAAkB,WAAW;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;","names":["jsx"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// src/preview/preview-plugin.ts
|
|
2
|
+
var VIRTUAL_PAGES_ID = "virtual:pdf-smith-pages";
|
|
3
|
+
var RESOLVED_VIRTUAL_PAGES_ID = `\0${VIRTUAL_PAGES_ID}`;
|
|
4
|
+
function pdfSmithPreviewPlugin({ pkgSrcDir, pagesGlob }) {
|
|
5
|
+
return {
|
|
6
|
+
name: "pdf-smith-preview",
|
|
7
|
+
configureServer(server) {
|
|
8
|
+
return () => {
|
|
9
|
+
server.middlewares.use((req, res, next) => {
|
|
10
|
+
if (req.url !== "/" && req.url !== "/index.html") {
|
|
11
|
+
next();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const html = `<!DOCTYPE html>
|
|
15
|
+
<html lang="en">
|
|
16
|
+
<head>
|
|
17
|
+
<script type="module">
|
|
18
|
+
import RefreshRuntime from "/@react-refresh"
|
|
19
|
+
RefreshRuntime.injectIntoGlobalHook(window)
|
|
20
|
+
window.$RefreshReg$ = () => {}
|
|
21
|
+
window.$RefreshSig$ = () => (type) => type
|
|
22
|
+
window.__vite_plugin_react_preamble_installed__ = true
|
|
23
|
+
</script>
|
|
24
|
+
<script type="module" src="/@vite/client"></script>
|
|
25
|
+
<meta charset="UTF-8" />
|
|
26
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
27
|
+
<title>pdf-smith Preview</title>
|
|
28
|
+
<style>
|
|
29
|
+
@media print {
|
|
30
|
+
[data-pdf-smith-nav] { display: none !important; }
|
|
31
|
+
[data-pdf-smith-container] {
|
|
32
|
+
margin-left: 0 !important;
|
|
33
|
+
padding: 0 !important;
|
|
34
|
+
background: none !important;
|
|
35
|
+
}
|
|
36
|
+
[data-pdf-smith-container] > [data-pdf-smith-document] > div {
|
|
37
|
+
margin-bottom: 0 !important;
|
|
38
|
+
}
|
|
39
|
+
[data-pdf-smith-container] > [data-pdf-smith-document] > div > div:first-child {
|
|
40
|
+
display: none !important;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
</style>
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
<div id="root"></div>
|
|
47
|
+
<script type="module" src="/@fs/${pkgSrcDir}/preview/entry.tsx"></script>
|
|
48
|
+
</body>
|
|
49
|
+
</html>`;
|
|
50
|
+
res.setHeader("Content-Type", "text/html");
|
|
51
|
+
res.statusCode = 200;
|
|
52
|
+
res.end(html);
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
resolveId(id) {
|
|
57
|
+
if (id === VIRTUAL_PAGES_ID) {
|
|
58
|
+
return RESOLVED_VIRTUAL_PAGES_ID;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
load(id) {
|
|
62
|
+
if (id === RESOLVED_VIRTUAL_PAGES_ID) {
|
|
63
|
+
return `
|
|
64
|
+
const modules = import.meta.glob('${pagesGlob}', { eager: true });
|
|
65
|
+
|
|
66
|
+
export function getPages() {
|
|
67
|
+
const pages = {};
|
|
68
|
+
for (const [path, mod] of Object.entries(modules)) {
|
|
69
|
+
const name = path
|
|
70
|
+
.replace(/^\\/pages\\//, '')
|
|
71
|
+
.replace(/\\.[^.]+$/, '');
|
|
72
|
+
pages[name] = mod.default;
|
|
73
|
+
}
|
|
74
|
+
return pages;
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
pdfSmithPreviewPlugin
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=preview-plugin-QWJEXDW2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/preview/preview-plugin.ts"],"sourcesContent":["import type { Plugin } from 'vite';\n\nconst VIRTUAL_PAGES_ID = 'virtual:pdf-smith-pages';\nconst RESOLVED_VIRTUAL_PAGES_ID = `\\0${VIRTUAL_PAGES_ID}`;\n\ninterface PreviewPluginOptions {\n pkgSrcDir: string;\n pagesGlob: string;\n}\n\nexport function pdfSmithPreviewPlugin({ pkgSrcDir, pagesGlob }: PreviewPluginOptions): Plugin {\n return {\n name: 'pdf-smith-preview',\n\n configureServer(server) {\n return () => {\n server.middlewares.use((req, res, next) => {\n if (req.url !== '/' && req.url !== '/index.html') {\n next();\n return;\n }\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <script type=\"module\">\nimport RefreshRuntime from \"/@react-refresh\"\nRefreshRuntime.injectIntoGlobalHook(window)\nwindow.$RefreshReg$ = () => {}\nwindow.$RefreshSig$ = () => (type) => type\nwindow.__vite_plugin_react_preamble_installed__ = true\n</script>\n <script type=\"module\" src=\"/@vite/client\"></script>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>pdf-smith Preview</title>\n <style>\n @media print {\n [data-pdf-smith-nav] { display: none !important; }\n [data-pdf-smith-container] {\n margin-left: 0 !important;\n padding: 0 !important;\n background: none !important;\n }\n [data-pdf-smith-container] > [data-pdf-smith-document] > div {\n margin-bottom: 0 !important;\n }\n [data-pdf-smith-container] > [data-pdf-smith-document] > div > div:first-child {\n display: none !important;\n }\n }\n </style>\n</head>\n<body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/@fs/${pkgSrcDir}/preview/entry.tsx\"></script>\n</body>\n</html>`;\n\n res.setHeader('Content-Type', 'text/html');\n res.statusCode = 200;\n res.end(html);\n });\n };\n },\n\n resolveId(id) {\n if (id === VIRTUAL_PAGES_ID) {\n return RESOLVED_VIRTUAL_PAGES_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_PAGES_ID) {\n return `\nconst modules = import.meta.glob('${pagesGlob}', { eager: true });\n\nexport function getPages() {\n const pages = {};\n for (const [path, mod] of Object.entries(modules)) {\n const name = path\n .replace(/^\\\\/pages\\\\//, '')\n .replace(/\\\\.[^.]+$/, '');\n pages[name] = mod.default;\n }\n return pages;\n}\n`;\n }\n },\n };\n}\n"],"mappings":";AAEA,IAAM,mBAAmB;AACzB,IAAM,4BAA4B,KAAK,gBAAgB;AAOhD,SAAS,sBAAsB,EAAE,WAAW,UAAU,GAAiC;AAC5F,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,gBAAgB,QAAQ;AACtB,aAAO,MAAM;AACX,eAAO,YAAY,IAAI,CAAC,KAAK,KAAK,SAAS;AACzC,cAAI,IAAI,QAAQ,OAAO,IAAI,QAAQ,eAAe;AAChD,iBAAK;AACL;AAAA,UACF;AAEA,gBAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAiCa,SAAS;AAAA;AAAA;AAInC,cAAI,UAAU,gBAAgB,WAAW;AACzC,cAAI,aAAa;AACjB,cAAI,IAAI,IAAI;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,UAAU,IAAI;AACZ,UAAI,OAAO,kBAAkB;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,OAAO,2BAA2B;AACpC,eAAO;AAAA,oCACqB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAavC;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|