@printwithsynergy/artwork-pdf-editor 0.1.1

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 (83) hide show
  1. package/README.md +117 -0
  2. package/dist/components/DielineLibraryModal.d.ts +9 -0
  3. package/dist/components/DielineLibraryModal.d.ts.map +1 -0
  4. package/dist/components/DielineLibraryModal.js +107 -0
  5. package/dist/components/DielineLibraryModal.js.map +1 -0
  6. package/dist/components/EditorApp.d.ts +37 -0
  7. package/dist/components/EditorApp.d.ts.map +1 -0
  8. package/dist/components/EditorApp.js +89 -0
  9. package/dist/components/EditorApp.js.map +1 -0
  10. package/dist/components/EditorCanvas.d.ts +41 -0
  11. package/dist/components/EditorCanvas.d.ts.map +1 -0
  12. package/dist/components/EditorCanvas.js +852 -0
  13. package/dist/components/EditorCanvas.js.map +1 -0
  14. package/dist/components/FileDropZone.d.ts +6 -0
  15. package/dist/components/FileDropZone.d.ts.map +1 -0
  16. package/dist/components/FileDropZone.js +48 -0
  17. package/dist/components/FileDropZone.js.map +1 -0
  18. package/dist/components/LayersPanel.d.ts +12 -0
  19. package/dist/components/LayersPanel.d.ts.map +1 -0
  20. package/dist/components/LayersPanel.js +101 -0
  21. package/dist/components/LayersPanel.js.map +1 -0
  22. package/dist/components/MobileToolDrawer.d.ts +45 -0
  23. package/dist/components/MobileToolDrawer.d.ts.map +1 -0
  24. package/dist/components/MobileToolDrawer.js +164 -0
  25. package/dist/components/MobileToolDrawer.js.map +1 -0
  26. package/dist/components/ModeToggle.d.ts +8 -0
  27. package/dist/components/ModeToggle.d.ts.map +1 -0
  28. package/dist/components/ModeToggle.js +27 -0
  29. package/dist/components/ModeToggle.js.map +1 -0
  30. package/dist/components/PreflightPanel.d.ts +9 -0
  31. package/dist/components/PreflightPanel.d.ts.map +1 -0
  32. package/dist/components/PreflightPanel.js +59 -0
  33. package/dist/components/PreflightPanel.js.map +1 -0
  34. package/dist/components/SeparationsPanel.d.ts +9 -0
  35. package/dist/components/SeparationsPanel.d.ts.map +1 -0
  36. package/dist/components/SeparationsPanel.js +147 -0
  37. package/dist/components/SeparationsPanel.js.map +1 -0
  38. package/dist/components/TopBar.d.ts +57 -0
  39. package/dist/components/TopBar.d.ts.map +1 -0
  40. package/dist/components/TopBar.js +70 -0
  41. package/dist/components/TopBar.js.map +1 -0
  42. package/dist/data/dielines.json +186 -0
  43. package/dist/hooks/useEditorMode.d.ts +15 -0
  44. package/dist/hooks/useEditorMode.d.ts.map +1 -0
  45. package/dist/hooks/useEditorMode.js +51 -0
  46. package/dist/hooks/useEditorMode.js.map +1 -0
  47. package/dist/hooks/useIsMobile.d.ts +19 -0
  48. package/dist/hooks/useIsMobile.d.ts.map +1 -0
  49. package/dist/hooks/useIsMobile.js +34 -0
  50. package/dist/hooks/useIsMobile.js.map +1 -0
  51. package/dist/hooks/usePreflight.d.ts +23 -0
  52. package/dist/hooks/usePreflight.d.ts.map +1 -0
  53. package/dist/hooks/usePreflight.js +48 -0
  54. package/dist/hooks/usePreflight.js.map +1 -0
  55. package/dist/index.d.ts +23 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +23 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lib/bleed.d.ts +27 -0
  60. package/dist/lib/bleed.d.ts.map +1 -0
  61. package/dist/lib/bleed.js +60 -0
  62. package/dist/lib/bleed.js.map +1 -0
  63. package/dist/lib/dieline-template.d.ts +33 -0
  64. package/dist/lib/dieline-template.d.ts.map +1 -0
  65. package/dist/lib/dieline-template.js +43 -0
  66. package/dist/lib/dieline-template.js.map +1 -0
  67. package/dist/lib/editor-config.d.ts +69 -0
  68. package/dist/lib/editor-config.d.ts.map +1 -0
  69. package/dist/lib/editor-config.js +66 -0
  70. package/dist/lib/editor-config.js.map +1 -0
  71. package/dist/lib/preflight/checks.d.ts +8 -0
  72. package/dist/lib/preflight/checks.d.ts.map +1 -0
  73. package/dist/lib/preflight/checks.js +276 -0
  74. package/dist/lib/preflight/checks.js.map +1 -0
  75. package/dist/lib/preflight/index.d.ts +2 -0
  76. package/dist/lib/preflight/index.d.ts.map +1 -0
  77. package/dist/lib/preflight/index.js +3 -0
  78. package/dist/lib/preflight/index.js.map +1 -0
  79. package/dist/lib/preflight/types.d.ts +24 -0
  80. package/dist/lib/preflight/types.d.ts.map +1 -0
  81. package/dist/lib/preflight/types.js +80 -0
  82. package/dist/lib/preflight/types.js.map +1 -0
  83. package/package.json +49 -0
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # @printwithsynergy/artwork-pdf-editor
2
+
3
+ Host-customizable React editor for [artworkPDF](https://artworkpdf.com).
4
+ Drop into any React 19 host (Next.js, Astro `client:only`, Remix, plain
5
+ React) to give users a WYSIWYG packaging-artwork canvas with dieline
6
+ templates, bleed visualization, and PDF export. AGPL-3.0-or-later.
7
+
8
+ ## Install
9
+
10
+ ```sh
11
+ pnpm add @printwithsynergy/artwork-pdf-editor react react-dom react-konva konva
12
+ ```
13
+
14
+ Peers: `react@^19`, `react-dom@^19`, `react-konva@^19`, `konva@^10`.
15
+ `pdf-lib` is a regular dependency — it comes along automatically and
16
+ powers the demo-mode client-side export.
17
+
18
+ ## Quick start
19
+
20
+ ```tsx
21
+ import {
22
+ EditorApp,
23
+ getDefaultTemplate,
24
+ templateToInitialState,
25
+ } from "@printwithsynergy/artwork-pdf-editor";
26
+
27
+ const { objects, pageSize } = templateToInitialState(getDefaultTemplate());
28
+
29
+ export default function Page() {
30
+ return (
31
+ <EditorApp
32
+ demo
33
+ initialPhase="editor"
34
+ initialObjects={objects}
35
+ initialPageSize={pageSize}
36
+ />
37
+ );
38
+ }
39
+ ```
40
+
41
+ In Astro with `output: "static"`, mount under `client:only="react"` and
42
+ seed initial state inside a `useEffect` (server has no `window`).
43
+
44
+ ## Customizing the top bar
45
+
46
+ The editor's top bar is the only host-customizable chrome. Pass any
47
+ `logo` ReactNode (`null` to hide), wordmark text, and extra CTAs:
48
+
49
+ ```tsx
50
+ <EditorApp
51
+ topBar={{
52
+ logo: <img src="/acme-logo.svg" alt="Acme" height={24} />,
53
+ brandText: "Acme Designer",
54
+ extraButtons: [
55
+ { label: "Features", href: "/features" },
56
+ { label: "Sign up", href: "/signup", primary: true },
57
+ ],
58
+ }}
59
+ />
60
+ ```
61
+
62
+ The hamburger button is always rendered at the leftmost position on
63
+ mobile so muscle memory is consistent across hosts.
64
+
65
+ ## Feature flags (`EditorConfig`)
66
+
67
+ Disable any feature globally, per mode (basic/pro), or per instance.
68
+ Defaults to everything enabled.
69
+
70
+ ```tsx
71
+ <EditorApp
72
+ config={{
73
+ enable_separations_panel: false,
74
+ enable_layers_panel: false,
75
+ enable_source_link: false,
76
+ }}
77
+ />
78
+ ```
79
+
80
+ Resolution order: `DEFAULT_EDITOR_CONFIG` → `{BASIC,PRO}_MODE_OVERRIDES`
81
+ → instance overrides. The full flag list is in
82
+ [`src/lib/editor-config.ts`](src/lib/editor-config.ts).
83
+
84
+ ## Bleed
85
+
86
+ Bleed defaults to industry-standard 0.125 in (3.175 mm). Override per
87
+ mount or via URL on a hosted route:
88
+
89
+ ```tsx
90
+ <EditorApp bleedMm={5} />
91
+ ```
92
+
93
+ ```
94
+ /demo?bleed=0.25in
95
+ /demo?bleed=3mm
96
+ /demo?bleed=3.175
97
+ ```
98
+
99
+ `parseBleed()` is exported for hosts that need to map their own URL
100
+ contract.
101
+
102
+ ## Dieline deep-links
103
+
104
+ Templates live in [`src/data/dielines.json`](src/data/dielines.json).
105
+ Each has a stable `id`; one is flagged `isDefault: true`.
106
+
107
+ ```tsx
108
+ import { getTemplateById } from "@printwithsynergy/artwork-pdf-editor";
109
+ const tpl = getTemplateById("standup-pouch-4x6");
110
+ ```
111
+
112
+ Hosted routes can deep-link with `?dieline=<id>`.
113
+
114
+ ## License
115
+
116
+ AGPL-3.0-or-later. Source:
117
+ <https://github.com/printwithsynergy/artwork-pdf>.
@@ -0,0 +1,9 @@
1
+ import { type DielineTemplate } from "../lib/dieline-template";
2
+ type Props = {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ onSelect: (template: DielineTemplate) => void;
6
+ };
7
+ export declare function DielineLibraryModal({ open, onClose, onSelect }: Props): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
9
+ //# sourceMappingURL=DielineLibraryModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DielineLibraryModal.d.ts","sourceRoot":"","sources":["../../src/components/DielineLibraryModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAAa,MAAM,yBAAyB,CAAC;AAE1E,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;CAC/C,CAAC;AAOF,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,kDAwKrE"}
@@ -0,0 +1,107 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState } from "react";
5
+ import { TEMPLATES } from "../lib/dieline-template";
6
+ const PANEL = "#1a0f08";
7
+ const BORDER = "#3d1a00";
8
+ const BRAND = "#fc5102";
9
+ const MUTED = "#888";
10
+ export function DielineLibraryModal({ open, onClose, onSelect }) {
11
+ const [query, setQuery] = useState("");
12
+ if (!open)
13
+ return null;
14
+ const q = query.trim().toLowerCase();
15
+ const filtered = q
16
+ ? TEMPLATES.filter((t) => t.name.toLowerCase().includes(q) ||
17
+ t.category.toLowerCase().includes(q) ||
18
+ t.tags.some((tag) => tag.toLowerCase().includes(q)))
19
+ : TEMPLATES;
20
+ return (_jsx("div", { role: "dialog", "aria-modal": "true", "aria-label": "Dieline library", onClick: onClose, onKeyDown: (e) => {
21
+ if (e.key === "Escape")
22
+ onClose();
23
+ }, style: {
24
+ position: "fixed",
25
+ inset: 0,
26
+ background: "rgba(0,0,0,0.7)",
27
+ zIndex: 1000,
28
+ display: "flex",
29
+ alignItems: "center",
30
+ justifyContent: "center",
31
+ padding: "1rem",
32
+ }, children: _jsxs("div", { onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), role: "document", style: {
33
+ background: PANEL,
34
+ border: `1px solid ${BORDER}`,
35
+ borderRadius: 8,
36
+ maxWidth: 880,
37
+ width: "100%",
38
+ maxHeight: "85vh",
39
+ display: "flex",
40
+ flexDirection: "column",
41
+ overflow: "hidden",
42
+ }, children: [_jsxs("header", { style: {
43
+ display: "flex",
44
+ alignItems: "center",
45
+ gap: "0.75rem",
46
+ padding: "0.85rem 1rem",
47
+ borderBottom: `1px solid ${BORDER}`,
48
+ }, children: [_jsx("h2", { style: { margin: 0, fontSize: "0.95rem", color: "#fff", flex: 1 }, children: "Dieline library" }), _jsx("input", { type: "search", placeholder: "Search pouches, labels, cartons\u2026", value: query, onChange: (e) => setQuery(e.target.value), style: {
49
+ background: "#120a04",
50
+ border: `1px solid ${BORDER}`,
51
+ color: "#fff",
52
+ borderRadius: 4,
53
+ padding: "0.3rem 0.55rem",
54
+ fontSize: "0.8rem",
55
+ width: 240,
56
+ fontFamily: "inherit",
57
+ } }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close", style: {
58
+ background: "transparent",
59
+ border: "none",
60
+ color: MUTED,
61
+ fontSize: "1.1rem",
62
+ cursor: "pointer",
63
+ padding: "0 0.25rem",
64
+ }, children: "\u2715" })] }), _jsxs("div", { style: {
65
+ flex: 1,
66
+ overflowY: "auto",
67
+ padding: "1rem",
68
+ display: "grid",
69
+ gap: "0.85rem",
70
+ gridTemplateColumns: "repeat(auto-fill, minmax(200px, 1fr))",
71
+ }, children: [filtered.length === 0 && (_jsxs("p", { style: { color: MUTED, fontSize: "0.85rem" }, children: ["No dielines match \u201C", query, "\u201D."] })), filtered.map((t) => (_jsxs("button", { type: "button", onClick: () => {
72
+ onSelect(t);
73
+ onClose();
74
+ }, style: {
75
+ background: "#120a04",
76
+ border: `1px solid ${BORDER}`,
77
+ borderRadius: 6,
78
+ padding: "0.6rem",
79
+ textAlign: "left",
80
+ color: "#ddd",
81
+ cursor: "pointer",
82
+ fontFamily: "inherit",
83
+ display: "flex",
84
+ flexDirection: "column",
85
+ gap: "0.4rem",
86
+ }, onMouseOver: (e) => {
87
+ e.currentTarget.style.borderColor = BRAND;
88
+ }, onFocus: (e) => {
89
+ e.currentTarget.style.borderColor = BRAND;
90
+ }, onMouseOut: (e) => {
91
+ e.currentTarget.style.borderColor = BORDER;
92
+ }, onBlur: (e) => {
93
+ e.currentTarget.style.borderColor = BORDER;
94
+ }, children: [_jsx("div", { style: {
95
+ background: "#fff",
96
+ borderRadius: 4,
97
+ aspectRatio: "1 / 1",
98
+ display: "flex",
99
+ alignItems: "center",
100
+ justifyContent: "center",
101
+ padding: "0.5rem",
102
+ overflow: "hidden",
103
+ },
104
+ // biome-ignore lint/security/noDangerouslySetInnerHtml: previewSvg is a static bundled fixture
105
+ dangerouslySetInnerHTML: { __html: t.previewSvg } }), _jsxs("div", { children: [_jsx("div", { style: { color: BRAND, fontSize: "0.82rem", fontWeight: 600 }, children: t.name }), _jsxs("div", { style: { color: MUTED, fontSize: "0.7rem", marginTop: 2 }, children: [t.dimensions.widthMm, " \u00D7 ", t.dimensions.heightMm, " mm \u00B7 ", t.category] })] })] }, t.id)))] })] }) }));
106
+ }
107
+ //# sourceMappingURL=DielineLibraryModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DielineLibraryModal.js","sourceRoot":"","sources":["../../src/components/DielineLibraryModal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type EditorMode } from "../hooks/useEditorMode";
2
+ import { type EditorConfig } from "../lib/editor-config";
3
+ import { type CanvasObj } from "./EditorCanvas";
4
+ import { type TopBarProps } from "./TopBar";
5
+ type Phase = "upload" | "checking" | "preflight" | "editor";
6
+ /**
7
+ * Props accepted by the top-level editor component. Hosts pass these
8
+ * to mount the editor in their page (Next.js route, Astro
9
+ * `client:only`, plain React app, etc.).
10
+ *
11
+ * @public
12
+ */
13
+ export type EditorAppProps = {
14
+ /** Strips destructive actions and routes export through the
15
+ * client-only path. The `/demo` route flips this on. */
16
+ demo?: boolean;
17
+ /** Starting phase. Set `"editor"` to skip the upload step. */
18
+ initialPhase?: Phase;
19
+ /** Seed objects for the canvas — typically from `templateToInitialState`. */
20
+ initialObjects?: CanvasObj[];
21
+ /** Seed page size for the canvas — typically from `templateToInitialState`. */
22
+ initialPageSize?: {
23
+ width: number;
24
+ height: number;
25
+ };
26
+ /** Initial mode preference. `"auto"` resolves by viewport. */
27
+ preferMode?: EditorMode | "auto";
28
+ /** Per-instance flag overrides. Merged into mode + global defaults. */
29
+ config?: Partial<EditorConfig>;
30
+ /** Bleed margin in millimetres. Defaults to {@link DEFAULT_BLEED_MM} (0.125 in). */
31
+ bleedMm?: number;
32
+ /** Host-supplied top bar configuration (logo, extra CTAs, etc.). */
33
+ topBar?: Partial<TopBarProps>;
34
+ };
35
+ export declare function EditorApp({ demo, initialPhase, initialObjects, initialPageSize, preferMode, config: configOverrides, bleedMm, topBar, }: EditorAppProps): import("react/jsx-runtime").JSX.Element;
36
+ export {};
37
+ //# sourceMappingURL=EditorApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorApp.d.ts","sourceRoot":"","sources":["../../src/components/EditorApp.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,wBAAwB,CAAC;AAIxE,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpD,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;6DACyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACjC,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAC/B,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,IAAY,EACZ,YAAuB,EACvB,cAAc,EACd,eAAe,EACf,UAAmB,EACnB,MAAM,EAAE,eAAe,EACvB,OAA0B,EAC1B,MAAM,GACP,EAAE,cAAc,2CAmJhB"}
@@ -0,0 +1,89 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useEffect, useState } from "react";
5
+ import { useEditorMode } from "../hooks/useEditorMode";
6
+ import { useIsMobile } from "../hooks/useIsMobile";
7
+ import { usePreflight } from "../hooks/usePreflight";
8
+ import { DEFAULT_BLEED_MM } from "../lib/bleed";
9
+ import { resolveConfig } from "../lib/editor-config";
10
+ import { EditorCanvas } from "./EditorCanvas";
11
+ import { FileDropZone } from "./FileDropZone";
12
+ import { PreflightPanel } from "./PreflightPanel";
13
+ import { TopBar } from "./TopBar";
14
+ export function EditorApp({ demo = false, initialPhase = "upload", initialObjects, initialPageSize, preferMode = "auto", config: configOverrides, bleedMm = DEFAULT_BLEED_MM, topBar, }) {
15
+ const { mode, setMode } = useEditorMode(preferMode);
16
+ const [phase, setPhase] = useState(initialPhase);
17
+ const [file, setFile] = useState(null);
18
+ const [report, setReport] = useState(null);
19
+ const { state: preflightState, run: runPreflight } = usePreflight();
20
+ const [menuOpen, setMenuOpen] = useState(false);
21
+ const isMobile = useIsMobile();
22
+ const config = resolveConfig(mode, configOverrides);
23
+ async function handleFile(f) {
24
+ setFile(f);
25
+ setPhase("checking");
26
+ const r = await runPreflight(f, { demoMode: demo });
27
+ if (r) {
28
+ setReport(r);
29
+ setPhase("preflight");
30
+ }
31
+ else {
32
+ setPhase("upload");
33
+ }
34
+ }
35
+ function handleSendToLint() {
36
+ alert("Job queued for lint node analysis.");
37
+ }
38
+ return (_jsxs("main", { style: { display: "flex", flexDirection: "column", height: "100vh", background: "#ffffff" }, children: [_jsx(TopBar, { ...topBar, showDemoBadge: (topBar?.showDemoBadge ?? (demo && config.enable_demo_badge)) || false, onMenuToggle: () => setMenuOpen((v) => !v), showMenuButton: isMobile && phase === "editor" }), _jsxs("div", { style: {
39
+ flex: 1,
40
+ display: "flex",
41
+ alignItems: "center",
42
+ justifyContent: "center",
43
+ overflow: "hidden",
44
+ background: "#ffffff",
45
+ }, children: [phase === "upload" && (_jsxs("div", { style: {
46
+ display: "flex",
47
+ flexDirection: "column",
48
+ alignItems: "center",
49
+ gap: "1.25rem",
50
+ }, children: [_jsx(FileDropZone, { onFile: handleFile }), !demo && (_jsx("a", { href: "/demo", target: "_blank", rel: "noopener noreferrer", style: {
51
+ fontSize: "0.85rem",
52
+ color: "#fc5102",
53
+ fontWeight: 600,
54
+ textDecoration: "none",
55
+ opacity: 0.85,
56
+ }, children: "Try the demo editor (no file needed) \u2192" }))] })), phase === "checking" && (_jsx("p", { style: { color: "#995b30" }, children: "Running preflight checks\u2026" })), phase === "preflight" && report && config.enable_preflight_banner && (_jsx(PreflightPanel, { report: report, onProceed: () => setPhase("editor"), onSendToLint: handleSendToLint })), phase === "preflight" && report && !config.enable_preflight_banner && (_jsx(AutoAdvance, { onContinue: () => setPhase("editor") })), phase === "editor" && (_jsx(EditorCanvas, { file: file, report: report, demo: demo, mode: mode, onModeChange: setMode, config: config, bleedMm: bleedMm, isMobile: isMobile, menuOpen: menuOpen, onMenuOpenChange: setMenuOpen, ...(initialObjects ? { initialObjects } : {}), ...(initialPageSize ? { initialPageSize } : {}) }))] }), demo && phase !== "editor" && (_jsx("footer", { style: {
57
+ background: "#1a0f08",
58
+ borderTop: "1px solid #3d1a00",
59
+ padding: "0.5rem 1.25rem",
60
+ display: "flex",
61
+ alignItems: "center",
62
+ gap: "1rem",
63
+ flexShrink: 0,
64
+ }, children: _jsx("span", { style: { fontSize: "0.78rem", color: "#666" }, children: "Demo \u2014 client-side checks & export only. Self-host for full PDF/X-4 + lint." }) })), preflightState.phase === "error" && (_jsx("div", { style: {
65
+ position: "fixed",
66
+ bottom: "1rem",
67
+ left: "50%",
68
+ transform: "translateX(-50%)",
69
+ background: "#f44336",
70
+ color: "#fff",
71
+ padding: "0.5rem 1rem",
72
+ borderRadius: 4,
73
+ fontSize: "0.82rem",
74
+ }, children: preflightState.message }))] }));
75
+ }
76
+ function AutoAdvance({ onContinue }) {
77
+ // Host disabled the preflight banner; skip straight into the editor.
78
+ // Runs once via effect so React's render cycle stays clean.
79
+ useAutoAdvance(onContinue);
80
+ return null;
81
+ }
82
+ function useAutoAdvance(fn) {
83
+ // Inline single-use helper — avoids polluting hooks/ for one effect.
84
+ // biome-ignore lint/correctness/useExhaustiveDependencies: fire-once
85
+ useEffect(() => {
86
+ fn();
87
+ }, []);
88
+ }
89
+ //# sourceMappingURL=EditorApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorApp.js","sourceRoot":"","sources":["../../src/components/EditorApp.tsx"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAmB,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAqB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAkB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAoB,MAAM,UAAU,CAAC;AA+BpD,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,GAAG,KAAK,EACZ,YAAY,GAAG,QAAQ,EACvB,cAAc,EACd,eAAe,EACf,UAAU,GAAG,MAAM,EACnB,MAAM,EAAE,eAAe,EACvB,OAAO,GAAG,gBAAgB,EAC1B,MAAM,GACS;IACf,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAQ,YAAY,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAyB,IAAI,CAAC,CAAC;IACnE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAAC;IACpE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAEpD,KAAK,UAAU,UAAU,CAAC,CAAO;QAC/B,OAAO,CAAC,CAAC,CAAC,CAAC;QACX,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrB,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC;YACN,SAAS,CAAC,CAAC,CAAC,CAAC;YACb,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,SAAS,gBAAgB;QACvB,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CACL,gBACE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAE3F,KAAC,MAAM,OACD,MAAM,EACV,aAAa,EAAE,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,KAAK,EACrF,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAC1C,cAAc,EAAE,QAAQ,IAAI,KAAK,KAAK,QAAQ,GAC9C,EAEF,eACE,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC;oBACP,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,QAAQ;oBACxB,QAAQ,EAAE,QAAQ;oBAClB,UAAU,EAAE,SAAS;iBACtB,aAEA,KAAK,KAAK,QAAQ,IAAI,CACrB,eACE,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM;4BACf,aAAa,EAAE,QAAQ;4BACvB,UAAU,EAAE,QAAQ;4BACpB,GAAG,EAAE,SAAS;yBACf,aAED,KAAC,YAAY,IAAC,MAAM,EAAE,UAAU,GAAI,EACnC,CAAC,IAAI,IAAI,CACR,YACE,IAAI,EAAC,OAAO,EACZ,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,KAAK,EAAE;oCACL,QAAQ,EAAE,SAAS;oCACnB,KAAK,EAAE,SAAS;oCAChB,UAAU,EAAE,GAAG;oCACf,cAAc,EAAE,MAAM;oCACtB,OAAO,EAAE,IAAI;iCACd,4DAGC,CACL,IACG,CACP,EAEA,KAAK,KAAK,UAAU,IAAI,CACvB,YAAG,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,+CAAsC,CACrE,EAEA,KAAK,KAAK,WAAW,IAAI,MAAM,IAAI,MAAM,CAAC,uBAAuB,IAAI,CACpE,KAAC,cAAc,IACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACnC,YAAY,EAAE,gBAAgB,GAC9B,CACH,EACA,KAAK,KAAK,WAAW,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,IAAI,CACrE,KAAC,WAAW,IAAC,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAI,CACtD,EAEA,KAAK,KAAK,QAAQ,IAAI,CACrB,KAAC,YAAY,IACX,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,WAAW,KACzB,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC1C,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAChD,CACH,IACG,EAEL,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,CAC7B,iBACE,KAAK,EAAE;oBACL,UAAU,EAAE,SAAS;oBACrB,SAAS,EAAE,mBAAmB;oBAC9B,OAAO,EAAE,gBAAgB;oBACzB,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,GAAG,EAAE,MAAM;oBACX,UAAU,EAAE,CAAC;iBACd,YAED,eAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,iGAE5C,GACA,CACV,EAEA,cAAc,CAAC,KAAK,KAAK,OAAO,IAAI,CACnC,cACE,KAAK,EAAE;oBACL,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,KAAK;oBACX,SAAS,EAAE,kBAAkB;oBAC7B,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,aAAa;oBACtB,YAAY,EAAE,CAAC;oBACf,QAAQ,EAAE,SAAS;iBACpB,YAEA,cAAc,CAAC,OAAO,GACnB,CACP,IACI,CACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,UAAU,EAA8B;IAC7D,qEAAqE;IACrE,4DAA4D;IAC5D,cAAc,CAAC,UAAU,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,EAAc;IACpC,qEAAqE;IACrE,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,EAAE,CAAC;IACP,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { EditorConfig } from "../lib/editor-config";
2
+ import type { PreflightReport } from "../lib/preflight/types";
3
+ type ObjType = "rect" | "ellipse" | "text" | "image";
4
+ export type CanvasObj = {
5
+ id: string;
6
+ type: ObjType;
7
+ x: number;
8
+ y: number;
9
+ width: number;
10
+ height: number;
11
+ fill: string;
12
+ stroke: string;
13
+ strokeWidth: number;
14
+ opacity: number;
15
+ text?: string;
16
+ fontSize?: number;
17
+ fontFamily?: string;
18
+ src?: string;
19
+ pathData?: string;
20
+ imageEl?: HTMLImageElement;
21
+ };
22
+ type Props = {
23
+ file?: File | null;
24
+ report?: PreflightReport | null;
25
+ demo?: boolean;
26
+ initialObjects?: CanvasObj[];
27
+ initialPageSize?: {
28
+ width: number;
29
+ height: number;
30
+ };
31
+ mode?: "basic" | "pro";
32
+ onModeChange?: (m: "basic" | "pro") => void;
33
+ config: EditorConfig;
34
+ bleedMm?: number;
35
+ isMobile?: boolean;
36
+ menuOpen?: boolean;
37
+ onMenuOpenChange?: (open: boolean) => void;
38
+ };
39
+ export declare function EditorCanvas({ file, report, demo, initialObjects, initialPageSize, mode, onModeChange, config, bleedMm: bleedMmProp, isMobile, menuOpen, onMenuOpenChange, }: Props): import("react/jsx-runtime").JSX.Element;
40
+ export {};
41
+ //# sourceMappingURL=EditorCanvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorCanvas.d.ts","sourceRoot":"","sources":["../../src/components/EditorCanvas.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA8B9D,KAAK,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAErD,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAMF,KAAK,KAAK,GAAG;IACX,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC;IAC5C,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC;AAkIF,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,MAAM,EACN,IAAY,EACZ,cAAc,EACd,eAAe,EACf,IAAc,EACd,YAAY,EACZ,MAAM,EACN,OAAO,EAAE,WAA8B,EACvC,QAAgB,EAChB,QAAgB,EAChB,gBAAgB,GACjB,EAAE,KAAK,2CA6nCP"}