@simplysm/solid 13.0.39 → 13.0.40

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 (35) hide show
  1. package/README.md +28 -7
  2. package/dist/components/feedback/print/PrintContext.d.ts +12 -0
  3. package/dist/components/feedback/print/PrintContext.d.ts.map +1 -0
  4. package/dist/components/feedback/print/PrintContext.js +12 -0
  5. package/dist/components/feedback/print/PrintContext.js.map +6 -0
  6. package/dist/components/feedback/print/PrintProvider.d.ts +12 -0
  7. package/dist/components/feedback/print/PrintProvider.d.ts.map +1 -0
  8. package/dist/components/feedback/print/PrintProvider.js +249 -0
  9. package/dist/components/feedback/print/PrintProvider.js.map +6 -0
  10. package/dist/hooks/usePrint.d.ts +2 -10
  11. package/dist/hooks/usePrint.d.ts.map +1 -1
  12. package/dist/hooks/usePrint.js +1 -206
  13. package/dist/hooks/usePrint.js.map +1 -1
  14. package/dist/index.d.ts +4 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +4 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/providers/SystemProvider.d.ts +8 -0
  19. package/dist/providers/SystemProvider.d.ts.map +1 -0
  20. package/dist/providers/{InitializeProvider.js → SystemProvider.js} +4 -9
  21. package/dist/providers/SystemProvider.js.map +6 -0
  22. package/docs/disclosure.md +1 -1
  23. package/docs/feedback.md +10 -1
  24. package/docs/hooks.md +1 -1
  25. package/docs/providers.md +78 -9
  26. package/package.json +3 -3
  27. package/src/components/feedback/print/PrintContext.ts +20 -0
  28. package/src/components/feedback/print/PrintProvider.tsx +280 -0
  29. package/src/hooks/usePrint.ts +2 -282
  30. package/src/index.ts +5 -3
  31. package/src/providers/{InitializeProvider.tsx → SystemProvider.tsx} +2 -30
  32. package/tailwind.config.ts +2 -3
  33. package/dist/providers/InitializeProvider.d.ts +0 -33
  34. package/dist/providers/InitializeProvider.d.ts.map +0 -1
  35. package/dist/providers/InitializeProvider.js.map +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -49,12 +49,15 @@ export * from "./components/disclosure/Dropdown.js";
49
49
  export * from "./components/disclosure/Dialog.js";
50
50
  export * from "./components/disclosure/DialogContext.js";
51
51
  export * from "./components/disclosure/DialogInstanceContext.js";
52
+ export * from "./components/disclosure/DialogProvider.js";
52
53
  export * from "./components/disclosure/Tabs.js";
53
54
  export * from "./components/feedback/notification/NotificationContext.js";
54
55
  export * from "./components/feedback/notification/NotificationBell.js";
55
56
  export * from "./components/feedback/notification/NotificationBanner.js";
56
57
  export * from "./components/feedback/busy/BusyContext.js";
57
58
  export * from "./components/feedback/busy/BusyContainer.js";
59
+ export * from "./components/feedback/print/PrintContext.js";
60
+ export * from "./components/feedback/print/PrintProvider.js";
58
61
  export * from "./components/feedback/print/Print.js";
59
62
  export * from "./components/feedback/print/PrintInstanceContext.js";
60
63
  export * from "./components/feedback/Progress.js";
@@ -71,11 +74,10 @@ import {
71
74
  } from "./providers/ServiceClientContext.js";
72
75
  import { SharedDataContext, useSharedData } from "./providers/shared-data/SharedDataContext.js";
73
76
  export * from "./providers/shared-data/SharedDataChangeEvent.js";
74
- export * from "./providers/InitializeProvider.js";
77
+ export * from "./providers/SystemProvider.js";
75
78
  export * from "./hooks/useLocalStorage.js";
76
79
  export * from "./hooks/useSyncConfig.js";
77
80
  export * from "./hooks/useLogger.js";
78
- export * from "./hooks/usePrint.js";
79
81
  import { createControllableSignal } from "./hooks/createControllableSignal.js";
80
82
  import { createIMEHandler } from "./hooks/createIMEHandler.js";
81
83
  import { createMountTransition } from "./hooks/createMountTransition.js";
package/dist/index.js.map CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "mappings": "AAGA,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,SAAyB,eAAe,iBAAiB;AAGzD;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAGP,eAAyD;AAGzD,SAAS,gBAAgB;AAIzB;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AAQP,SAAS,mBAAmB,qBAAqB;AACjD,cAAc;AAGd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAM9B,cAAc;AACd,cAAc;AAMd,SAAS,cAAc;AAMvB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;",
4
+ "mappings": "AAGA,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,SAAyB,eAAe,iBAAiB;AAGzD;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAGP,eAAyD;AAGzD,SAAS,gBAAgB;AAIzB;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AAQP,SAAS,mBAAmB,qBAAqB;AACjD,cAAc;AAGd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAM9B,cAAc;AACd,cAAc;AAMd,SAAS,cAAc;AAMvB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;",
5
5
  "names": []
6
6
  }
@@ -0,0 +1,8 @@
1
+ import { type ParentComponent } from "solid-js";
2
+ import type { BusyVariant } from "../components/feedback/busy/BusyContext";
3
+ export type { BusyVariant };
4
+ export declare const SystemProvider: ParentComponent<{
5
+ clientName: string;
6
+ busyVariant?: BusyVariant;
7
+ }>;
8
+ //# sourceMappingURL=SystemProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemProvider.d.ts","sourceRoot":"","sources":["..\\..\\src\\providers\\SystemProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAahD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAE3E,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAyBA,CAAC"}
@@ -11,8 +11,7 @@ import { ThemeProvider } from "./ThemeContext.js";
11
11
  import { ServiceClientProvider } from "./ServiceClientProvider.js";
12
12
  import { SharedDataProvider } from "./shared-data/SharedDataProvider.js";
13
13
  import { BusyProvider } from "../components/feedback/busy/BusyProvider.js";
14
- import { DialogProvider } from "../components/disclosure/DialogProvider.js";
15
- const InitializeProvider = (props) => {
14
+ const SystemProvider = (props) => {
16
15
  return _$createComponent(ConfigProvider, {
17
16
  get clientName() {
18
17
  return props.clientName;
@@ -41,11 +40,7 @@ const InitializeProvider = (props) => {
41
40
  return props.busyVariant;
42
41
  },
43
42
  get children() {
44
- return _$createComponent(DialogProvider, {
45
- get children() {
46
- return props.children;
47
- }
48
- });
43
+ return props.children;
49
44
  }
50
45
  });
51
46
  }
@@ -70,6 +65,6 @@ const InitializeProvider = (props) => {
70
65
  });
71
66
  };
72
67
  export {
73
- InitializeProvider
68
+ SystemProvider
74
69
  };
75
- //# sourceMappingURL=InitializeProvider.js.map
70
+ //# sourceMappingURL=SystemProvider.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/providers/SystemProvider.tsx"],
4
+ "mappings": ";AACA,SAASA,sBAAsB;AAC/B,SAASC,2BAA2B;AACpC,SAASC,sBAAsB;AAC/B,SAASC,4BAA4B;AACrC,SAASC,0BAA0B;AACnC,SAASC,2BAA2B;AACpC,SAASC,yBAAyB;AAClC,SAASC,yBAAyB;AAClC,SAASC,qBAAqB;AAC9B,SAASC,6BAA6B;AACtC,SAASC,0BAA0B;AACnC,SAASC,oBAAoB;AAKtB,MAAMC,iBAGPC,WAAU;AACd,SAAAC,kBACGd,gBAAc;IAAA,IAACe,aAAU;AAAA,aAAEF,MAAME;IAAU;IAAA,IAAAC,WAAA;AAAA,aAAAF,kBACzCb,qBAAmB;QAAA,IAAAe,WAAA;AAAA,iBAAAF,kBACjBZ,gBAAc;YAAA,IAAAc,WAAA;AAAA,qBAAAF,kBACZX,sBAAoB;gBAAA,IAAAa,WAAA;AAAA,yBAAA,CAAAF,kBAClBV,oBAAkB,CAAA,CAAA,GAAAU,kBAClBT,qBAAmB;oBAAA,IAAAW,WAAA;AAAA,6BAAAF,kBACjBR,mBAAiB;wBAAA,IAAAU,WAAA;AAAA,iCAAAF,kBACfP,mBAAiB;4BAAA,IAAAS,WAAA;AAAA,qCAAAF,kBACfN,eAAa;gCAAA,IAAAQ,WAAA;AAAA,yCAAAF,kBACXL,uBAAqB;oCAAA,IAAAO,WAAA;AAAA,6CAAAF,kBACnBJ,oBAAkB;wCAAA,IAAAM,WAAA;AAAA,iDAAAF,kBAChBH,cAAY;4CAAA,IAACM,UAAO;AAAA,qDAAEJ,MAAMK;4CAAW;4CAAA,IAAAF,WAAA;AAAA,qDAAGH,MAAMG;4CAAQ;0CAAA,CAAA;wCAAA;sCAAA,CAAA;oCAAA;kCAAA,CAAA;gCAAA;8BAAA,CAAA;4BAAA;0BAAA,CAAA;wBAAA;sBAAA,CAAA;oBAAA;kBAAA,CAAA,CAAA;gBAAA;cAAA,CAAA;YAAA;UAAA,CAAA;QAAA;MAAA,CAAA;IAAA;EAAA,CAAA;AAYjF;",
5
+ "names": ["ConfigProvider", "SyncStorageProvider", "LoggerProvider", "NotificationProvider", "NotificationBanner", "ErrorLoggerProvider", "PwaUpdateProvider", "ClipboardProvider", "ThemeProvider", "ServiceClientProvider", "SharedDataProvider", "BusyProvider", "SystemProvider", "props", "_$createComponent", "clientName", "children", "variant", "busyVariant"]
6
+ }
@@ -212,7 +212,7 @@ function MyPage() {
212
212
 
213
213
  **Dialog Defaults:**
214
214
 
215
- `DialogDefaultsContext` and `DialogDefaults` are exported for advanced use cases such as providing default dialog options to a subtree. `InitializeProvider` already sets up the dialog system internally most apps do not need these directly.
215
+ `DialogDefaultsContext` and `DialogDefaults` are exported for advanced use cases such as providing default dialog options to a subtree. Add `<DialogProvider>` to your provider tree to enable `useDialog()`. See [Provider Placement Guide](providers.md#provider-placement-guide).
216
216
 
217
217
  ```typescript
218
218
  import { DialogDefaultsContext, type DialogDefaults } from "@simplysm/solid";
package/docs/feedback.md CHANGED
@@ -119,7 +119,16 @@ import { BusyContainer } from "@simplysm/solid";
119
119
 
120
120
  ## Print / usePrint
121
121
 
122
- Browser printing and PDF generation.
122
+ Browser printing and PDF generation. Requires `<PrintProvider>` in the component tree.
123
+
124
+ ```tsx
125
+ // Provider setup:
126
+ <SystemProvider clientName="my-app">
127
+ <PrintProvider>
128
+ <App />
129
+ </PrintProvider>
130
+ </SystemProvider>
131
+ ```
123
132
 
124
133
  ```tsx
125
134
  import { Print, usePrint } from "@simplysm/solid";
package/docs/hooks.md CHANGED
@@ -115,7 +115,7 @@ Hook to access busy overlay. Must be used inside `BusyProvider`. See [Busy](feed
115
115
 
116
116
  ## usePrint
117
117
 
118
- Hook for printing and PDF generation. See [Print / usePrint](feedback.md#print--useprint) for detailed API.
118
+ Hook for printing and PDF generation. Must be used inside `<PrintProvider>`. See [Print / usePrint](feedback.md#print--useprint) for detailed API.
119
119
 
120
120
  ---
121
121
 
package/docs/providers.md CHANGED
@@ -1,15 +1,15 @@
1
1
  # Providers
2
2
 
3
- ## InitializeProvider
3
+ ## SystemProvider
4
4
 
5
- The only exported provider component. Wraps all internal providers in the correct dependency order. Use this to set up your app.
5
+ Infrastructure provider. Wraps all internal providers (config, theme, logger, notification, busy, service client, shared data) in the correct dependency order. Use this to set up your app.
6
6
 
7
7
  ```tsx
8
- import { InitializeProvider } from "@simplysm/solid";
8
+ import { SystemProvider } from "@simplysm/solid";
9
9
 
10
- <InitializeProvider clientName="my-app">
10
+ <SystemProvider clientName="my-app">
11
11
  <AppRoot />
12
- </InitializeProvider>
12
+ </SystemProvider>
13
13
  ```
14
14
 
15
15
  Configuration is done via hooks inside child components:
@@ -40,16 +40,16 @@ ConfigProvider → SyncStorageProvider → LoggerProvider →
40
40
  ErrorLoggerProvider → PwaUpdateProvider →
41
41
  ClipboardProvider → ThemeProvider →
42
42
  ServiceClientProvider → SharedDataProvider →
43
- BusyProvider → DialogProvider → {children}
43
+ BusyProvider → {children}
44
44
  ```
45
45
 
46
- Individual providers are not exported. All provider setup goes through `InitializeProvider`.
46
+ Internal providers are not exported individually. `DialogProvider` and `PrintProvider` are exported separately for flexible placement in your provider tree.
47
47
 
48
48
  ---
49
49
 
50
50
  ## Exported Types & Hooks
51
51
 
52
- The following types, context objects, and hooks are exported for use with `InitializeProvider`:
52
+ The following types, context objects, and hooks are exported for use with `SystemProvider`:
53
53
 
54
54
  | Export | Kind | Description |
55
55
  |--------|------|-------------|
@@ -60,7 +60,6 @@ The following types, context objects, and hooks are exported for use with `Initi
60
60
  | `useSharedData` | hook | Shared data subscription access |
61
61
  | `useNotification` | hook | Notification system access |
62
62
  | `useBusy` | hook | Busy overlay control |
63
- | `useDialog` | hook | Programmatic dialog opening |
64
63
  | `ConfigContext` | context | For mock injection in tests |
65
64
  | `SyncStorageContext` | context | For mock injection in tests |
66
65
  | `ServiceClientContext` | context | For mock injection in tests |
@@ -133,3 +132,73 @@ interface SharedDataDefinition<TData> {
133
132
  ```typescript
134
133
  import { SharedDataChangeEvent } from "@simplysm/solid";
135
134
  ```
135
+
136
+ ---
137
+
138
+ ## DialogProvider
139
+
140
+ Programmatic dialog management. Must be placed inside `SystemProvider`. See [Dialog](disclosure.md#dialog) for full Dialog component and `useDialog` API.
141
+
142
+ ```tsx
143
+ import { DialogProvider, useDialog } from "@simplysm/solid";
144
+
145
+ // In your provider tree:
146
+ <SystemProvider clientName="my-app">
147
+ <DialogProvider>
148
+ <App />
149
+ </DialogProvider>
150
+ </SystemProvider>
151
+ ```
152
+
153
+ | Prop | Type | Default | Description |
154
+ |------|------|---------|-------------|
155
+ | `closeOnEscape` | `boolean` | `true` | Default: close dialogs on Escape key |
156
+ | `closeOnBackdrop` | `boolean` | - | Default: close dialogs on backdrop click |
157
+
158
+ ---
159
+
160
+ ## PrintProvider
161
+
162
+ Printing and PDF generation. Must be placed inside `SystemProvider` (depends on `useBusy()`). See [Print / usePrint](feedback.md#print--useprint) for full API.
163
+
164
+ ```tsx
165
+ import { PrintProvider, usePrint } from "@simplysm/solid";
166
+
167
+ // In your provider tree:
168
+ <SystemProvider clientName="my-app">
169
+ <PrintProvider>
170
+ <App />
171
+ </PrintProvider>
172
+ </SystemProvider>
173
+ ```
174
+
175
+ No additional props.
176
+
177
+ ---
178
+
179
+ ## Provider Placement Guide
180
+
181
+ `SystemProvider` provides all infrastructure. `DialogProvider` and `PrintProvider` are standalone and should be placed where their factory content needs context access.
182
+
183
+ **Recommended structure:**
184
+
185
+ ```
186
+ <SystemProvider> ← Infrastructure (config, theme, logger, etc.)
187
+ <YourAuthProvider> ← Your providers
188
+ <YourDataProvider>
189
+ <DialogProvider> ← Dialog factories can access Auth + Data
190
+ <PrintProvider> ← Print factories can access Auth + Data
191
+ <App />
192
+ </PrintProvider>
193
+ </DialogProvider>
194
+ </YourDataProvider>
195
+ </YourAuthProvider>
196
+ </SystemProvider>
197
+ ```
198
+
199
+ **Why this order?**
200
+
201
+ - `DialogProvider` and `PrintProvider` accept user components as factory functions (`dialog.show(() => <Form />)`, `print.toPrinter(() => <Report />)`)
202
+ - These factories are rendered inside the Provider's tree, not at the call site
203
+ - To access your app's contexts (auth, data, etc.), place `DialogProvider`/`PrintProvider` **below** those contexts
204
+ - `SystemProvider` must be outermost because `DialogProvider`/`PrintProvider` depend on `useBusy()` and other system hooks
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/solid",
3
- "version": "13.0.39",
3
+ "version": "13.0.40",
4
4
  "description": "심플리즘 패키지 - SolidJS 라이브러리",
5
5
  "author": "김석래",
6
6
  "license": "Apache-2.0",
@@ -49,8 +49,8 @@
49
49
  "solid-tiptap": "^0.8.0",
50
50
  "tailwind-merge": "^3.5.0",
51
51
  "tailwindcss": "^3.4.19",
52
- "@simplysm/core-browser": "13.0.39",
53
- "@simplysm/core-common": "13.0.39"
52
+ "@simplysm/core-browser": "13.0.40",
53
+ "@simplysm/core-common": "13.0.40"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@solidjs/testing-library": "^0.8.10"
@@ -0,0 +1,20 @@
1
+ import { createContext, useContext } from "solid-js";
2
+ import type { JSX } from "solid-js";
3
+
4
+ export interface PrintOptions {
5
+ size?: string;
6
+ margin?: string;
7
+ }
8
+
9
+ export interface PrintContextValue {
10
+ toPrinter: (factory: () => JSX.Element, options?: PrintOptions) => Promise<void>;
11
+ toPdf: (factory: () => JSX.Element, options?: PrintOptions) => Promise<Uint8Array>;
12
+ }
13
+
14
+ export const PrintContext = createContext<PrintContextValue>();
15
+
16
+ export function usePrint(): PrintContextValue {
17
+ const ctx = useContext(PrintContext);
18
+ if (!ctx) throw new Error("usePrint must be used inside <PrintProvider>");
19
+ return ctx;
20
+ }
@@ -0,0 +1,280 @@
1
+ import { type ParentComponent, createSignal, Show, type JSX } from "solid-js";
2
+ import { Portal } from "solid-js/web";
3
+ import { jsPDF } from "jspdf";
4
+ import * as htmlToImage from "html-to-image";
5
+ import { useBusy } from "../busy/BusyContext";
6
+ import { PrintContext, type PrintContextValue, type PrintOptions } from "./PrintContext";
7
+ import { PrintInstanceContext, type PrintInstance } from "./PrintInstanceContext";
8
+
9
+ // --- Paper size constants (pt) ---
10
+
11
+ const PAPER_SIZES: Partial<Record<string, [number, number]>> = {
12
+ a3: [841.89, 1190.55],
13
+ a4: [595.28, 841.89],
14
+ a5: [419.53, 595.28],
15
+ letter: [612, 792],
16
+ legal: [612, 1008],
17
+ };
18
+
19
+ // --- Internal helpers ---
20
+
21
+ function parseDimension(dim: string): number {
22
+ const num = parseFloat(dim);
23
+ if (dim.endsWith("mm")) return num * 2.83465;
24
+ if (dim.endsWith("cm")) return num * 28.3465;
25
+ if (dim.endsWith("in")) return num * 72;
26
+ return num; // pt
27
+ }
28
+
29
+ function parseSize(size?: string): { width: number; height: number; orientation: "p" | "l" } {
30
+ const s = (size ?? "A4").toLowerCase().trim();
31
+ const landscape = s.includes("landscape");
32
+ const cleanSize = s.replace(/\s*(landscape|portrait)\s*/g, "").trim();
33
+
34
+ const paperSize = PAPER_SIZES[cleanSize];
35
+ if (paperSize) {
36
+ const [w, h] = paperSize;
37
+ if (landscape) return { width: h, height: w, orientation: "l" };
38
+ return { width: w, height: h, orientation: "p" };
39
+ }
40
+
41
+ const parts = cleanSize.split(/\s+/);
42
+ if (parts.length === 2) {
43
+ const w = parseDimension(parts[0]);
44
+ const h = parseDimension(parts[1]);
45
+ return { width: w, height: h, orientation: w > h ? "l" : "p" };
46
+ }
47
+
48
+ return { width: 595.28, height: 841.89, orientation: "p" };
49
+ }
50
+
51
+ function waitForImages(container: HTMLElement): Promise<void> {
52
+ const imgs = Array.from(container.querySelectorAll("img"));
53
+ return Promise.all(
54
+ imgs.map((img) =>
55
+ img.complete
56
+ ? Promise.resolve()
57
+ : new Promise<void>((resolve) => {
58
+ img.addEventListener("load", () => resolve(), { once: true });
59
+ img.addEventListener("error", () => resolve(), { once: true });
60
+ }),
61
+ ),
62
+ ).then(() => undefined);
63
+ }
64
+
65
+ // --- Job type for reactive rendering ---
66
+
67
+ interface PrintJob {
68
+ factory: () => JSX.Element;
69
+ instance: PrintInstance;
70
+ onRendered: (container: HTMLDivElement) => void;
71
+ }
72
+
73
+ /**
74
+ * Print Provider
75
+ *
76
+ * @remarks
77
+ * - Factory content is rendered within the Provider's own reactive tree,
78
+ * so it can access all contexts above PrintProvider
79
+ * - Uses Portal + hidden div for off-screen rendering
80
+ * - BusyProvider must be an ancestor (useBusy dependency)
81
+ */
82
+ export const PrintProvider: ParentComponent = (props) => {
83
+ const busy = useBusy();
84
+ const [currentJob, setCurrentJob] = createSignal<PrintJob | null>(null);
85
+
86
+ function renderAndWait(factory: () => JSX.Element): Promise<HTMLDivElement> {
87
+ return new Promise<HTMLDivElement>((resolve) => {
88
+ let resolveReady: (() => void) | undefined;
89
+ const state = { readyCalled: false };
90
+
91
+ const readyPromise = new Promise<void>((readyResolve) => {
92
+ resolveReady = readyResolve;
93
+ });
94
+
95
+ const instance: PrintInstance = {
96
+ ready: () => {
97
+ state.readyCalled = true;
98
+ resolveReady?.();
99
+ },
100
+ };
101
+
102
+ const onRendered = (container: HTMLDivElement): void => {
103
+ // Wait for mount + optional ready() call
104
+ const finalize = async (): Promise<void> => {
105
+ await Promise.resolve();
106
+
107
+ if (!state.readyCalled) {
108
+ await new Promise<void>((rAFResolve) => {
109
+ requestAnimationFrame(() => rAFResolve());
110
+ });
111
+ }
112
+
113
+ if (state.readyCalled) {
114
+ await readyPromise;
115
+ }
116
+
117
+ await waitForImages(container);
118
+ resolve(container);
119
+ };
120
+
121
+ void finalize();
122
+ };
123
+
124
+ setCurrentJob({ factory, instance, onRendered });
125
+ });
126
+ }
127
+
128
+ const toPrinter = async (factory: () => JSX.Element, options?: PrintOptions): Promise<void> => {
129
+ busy.show();
130
+ let styleEl: HTMLStyleElement | undefined;
131
+
132
+ try {
133
+ const container = await renderAndWait(factory);
134
+
135
+ container.style.position = "static";
136
+ container.style.left = "auto";
137
+ container.classList.add("_sd-print-target");
138
+
139
+ styleEl = document.createElement("style");
140
+ styleEl.textContent = `
141
+ @page {
142
+ size: ${options?.size ?? "A4"};
143
+ margin: ${options?.margin ?? "0"};
144
+ }
145
+ body > ._sd-print-target { display: none; }
146
+ @media print {
147
+ html, body { -webkit-print-color-adjust: exact; background: white; }
148
+ body > * { display: none !important; }
149
+ body > ._sd-print-target { display: block !important; }
150
+ }
151
+ `;
152
+ document.head.appendChild(styleEl);
153
+
154
+ await new Promise<void>((resolve) => {
155
+ requestAnimationFrame(() => {
156
+ window.print();
157
+ resolve();
158
+ });
159
+ });
160
+ } finally {
161
+ styleEl?.remove();
162
+ setCurrentJob(null);
163
+ busy.hide();
164
+ }
165
+ };
166
+
167
+ const toPdf = async (factory: () => JSX.Element, options?: PrintOptions): Promise<Uint8Array> => {
168
+ busy.show();
169
+
170
+ try {
171
+ const container = await renderAndWait(factory);
172
+
173
+ const { width: pageWidth, height: pageHeight, orientation } = parseSize(options?.size);
174
+
175
+ const doc = new jsPDF(orientation, "pt", [pageWidth, pageHeight]);
176
+ doc.deletePage(1);
177
+
178
+ const pages = Array.from(container.querySelectorAll<HTMLElement>("[data-print-page]"));
179
+
180
+ if (pages.length > 0) {
181
+ for (const pageEl of pages) {
182
+ pageEl.style.width = pageWidth + "pt";
183
+
184
+ const canvas = await htmlToImage.toCanvas(pageEl, {
185
+ backgroundColor: "white",
186
+ pixelRatio: 4,
187
+ });
188
+
189
+ const imgWidth = pageWidth;
190
+ const imgHeight = canvas.height * (pageWidth / canvas.width);
191
+
192
+ doc.addPage([pageWidth, pageHeight], orientation);
193
+ doc.addImage({
194
+ imageData: canvas,
195
+ x: 0,
196
+ y: 0,
197
+ width: imgWidth,
198
+ height: imgHeight,
199
+ });
200
+ }
201
+ } else {
202
+ const target = (container.firstElementChild as HTMLElement | null) ?? container;
203
+ target.style.width = pageWidth + "pt";
204
+
205
+ const canvas = await htmlToImage.toCanvas(target, {
206
+ backgroundColor: "white",
207
+ pixelRatio: 4,
208
+ });
209
+
210
+ const scaleFactor = pageWidth / canvas.width;
211
+ const pageHeightPx = pageHeight / scaleFactor;
212
+ const totalPages = Math.ceil(canvas.height / pageHeightPx);
213
+
214
+ for (let i = 0; i < totalPages; i++) {
215
+ const sliceCanvas = document.createElement("canvas");
216
+ sliceCanvas.width = canvas.width;
217
+ sliceCanvas.height = Math.min(pageHeightPx, canvas.height - i * pageHeightPx);
218
+
219
+ const ctx = sliceCanvas.getContext("2d")!;
220
+ ctx.drawImage(
221
+ canvas,
222
+ 0,
223
+ i * pageHeightPx,
224
+ canvas.width,
225
+ sliceCanvas.height,
226
+ 0,
227
+ 0,
228
+ canvas.width,
229
+ sliceCanvas.height,
230
+ );
231
+
232
+ const imgHeight = sliceCanvas.height * scaleFactor;
233
+
234
+ doc.addPage([pageWidth, pageHeight], orientation);
235
+ doc.addImage({
236
+ imageData: sliceCanvas,
237
+ x: 0,
238
+ y: 0,
239
+ width: pageWidth,
240
+ height: imgHeight,
241
+ });
242
+ }
243
+ }
244
+
245
+ const arrayBuffer = doc.output("arraybuffer");
246
+ return new Uint8Array(arrayBuffer);
247
+ } finally {
248
+ setCurrentJob(null);
249
+ busy.hide();
250
+ }
251
+ };
252
+
253
+ const contextValue: PrintContextValue = { toPrinter, toPdf };
254
+
255
+ return (
256
+ <PrintContext.Provider value={contextValue}>
257
+ {props.children}
258
+ <Portal>
259
+ <Show when={currentJob()}>
260
+ {(job) => (
261
+ <div
262
+ ref={(el) => {
263
+ job().onRendered(el);
264
+ }}
265
+ style={{
266
+ position: "fixed",
267
+ left: "-9999px",
268
+ top: "0",
269
+ }}
270
+ >
271
+ <PrintInstanceContext.Provider value={job().instance}>
272
+ {job().factory()}
273
+ </PrintInstanceContext.Provider>
274
+ </div>
275
+ )}
276
+ </Show>
277
+ </Portal>
278
+ </PrintContext.Provider>
279
+ );
280
+ };