@simplysm/solid 13.0.38 → 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.
- package/README.md +28 -7
- package/dist/components/data/Pagination.d.ts.map +1 -1
- package/dist/components/data/Table.d.ts.map +1 -1
- package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
- package/dist/components/data/kanban/Kanban.d.ts.map +1 -1
- package/dist/components/data/kanban/KanbanContext.d.ts.map +1 -1
- package/dist/components/data/list/List.d.ts.map +1 -1
- package/dist/components/data/list/ListContext.d.ts.map +1 -1
- package/dist/components/data/list/ListItem.d.ts.map +1 -1
- package/dist/components/data/list/ListItem.styles.d.ts.map +1 -1
- package/dist/components/data/permission-table/PermissionTable.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheetColumn.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheetConfigDialog.d.ts.map +1 -1
- package/dist/components/data/sheet/sheetUtils.d.ts.map +1 -1
- package/dist/components/data/sheet/types.d.ts.map +1 -1
- package/dist/components/disclosure/Collapse.d.ts.map +1 -1
- package/dist/components/disclosure/Dialog.d.ts.map +1 -1
- package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogInstanceContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogProvider.d.ts.map +1 -1
- package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
- package/dist/components/disclosure/Tabs.d.ts.map +1 -1
- package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
- package/dist/components/display/Alert.d.ts.map +1 -1
- package/dist/components/display/Barcode.d.ts.map +1 -1
- package/dist/components/display/Card.d.ts.map +1 -1
- package/dist/components/display/Echarts.d.ts.map +1 -1
- package/dist/components/display/Icon.d.ts.map +1 -1
- package/dist/components/display/Link.d.ts.map +1 -1
- package/dist/components/display/Tag.d.ts.map +1 -1
- package/dist/components/feedback/Progress.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.d.ts.map +1 -1
- package/dist/components/feedback/notification/index.d.ts.map +1 -1
- package/dist/components/feedback/print/Print.d.ts.map +1 -1
- package/dist/components/feedback/print/PrintContext.d.ts +12 -0
- package/dist/components/feedback/print/PrintContext.d.ts.map +1 -0
- package/dist/components/feedback/print/PrintContext.js +12 -0
- package/dist/components/feedback/print/PrintContext.js.map +6 -0
- package/dist/components/feedback/print/PrintInstanceContext.d.ts.map +1 -1
- package/dist/components/feedback/print/PrintProvider.d.ts +12 -0
- package/dist/components/feedback/print/PrintProvider.d.ts.map +1 -0
- package/dist/components/feedback/print/PrintProvider.js +249 -0
- package/dist/components/feedback/print/PrintProvider.js.map +6 -0
- package/dist/components/form-control/Button.d.ts.map +1 -1
- package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
- package/dist/components/form-control/Invalid.d.ts.map +1 -1
- package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Checkbox.styles.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Radio.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/RadioGroup.d.ts.map +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
- package/dist/components/form-control/combobox/ComboboxItem.d.ts.map +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
- package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
- package/dist/components/form-control/editor/editor.css +1 -0
- package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/Field.styles.d.ts.map +1 -1
- package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
- package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
- package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
- package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
- package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.d.ts.map +1 -1
- package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
- package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
- package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
- package/dist/components/layout/FormGroup.d.ts.map +1 -1
- package/dist/components/layout/FormTable.d.ts.map +1 -1
- package/dist/components/layout/sidebar/Sidebar.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarContext.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarMenu.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarUser.d.ts.map +1 -1
- package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarContainer.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarUser.d.ts.map +1 -1
- package/dist/directives/ripple.d.ts.map +1 -1
- package/dist/helpers/createAppStructure.d.ts.map +1 -1
- package/dist/helpers/mergeStyles.d.ts.map +1 -1
- package/dist/helpers/splitSlots.d.ts.map +1 -1
- package/dist/hooks/createControllableSignal.d.ts.map +1 -1
- package/dist/hooks/createIMEHandler.d.ts.map +1 -1
- package/dist/hooks/createItemTemplate.d.ts.map +1 -1
- package/dist/hooks/createMountTransition.d.ts.map +1 -1
- package/dist/hooks/createPointerDrag.d.ts.map +1 -1
- package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
- package/dist/hooks/useLocalStorage.d.ts.map +1 -1
- package/dist/hooks/useLogger.d.ts.map +1 -1
- package/dist/hooks/usePrint.d.ts +2 -10
- package/dist/hooks/usePrint.d.ts.map +1 -1
- package/dist/hooks/usePrint.js +1 -206
- package/dist/hooks/usePrint.js.map +1 -1
- package/dist/hooks/useRouterLink.d.ts.map +1 -1
- package/dist/hooks/useSyncConfig.d.ts.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/providers/ClipboardProvider.d.ts.map +1 -1
- package/dist/providers/ConfigContext.d.ts.map +1 -1
- package/dist/providers/ErrorLoggerProvider.d.ts.map +1 -1
- package/dist/providers/LoggerContext.d.ts.map +1 -1
- package/dist/providers/PwaUpdateProvider.d.ts.map +1 -1
- package/dist/providers/ServiceClientContext.d.ts.map +1 -1
- package/dist/providers/ServiceClientProvider.d.ts.map +1 -1
- package/dist/providers/SyncStorageContext.d.ts.map +1 -1
- package/dist/providers/SystemProvider.d.ts +8 -0
- package/dist/providers/SystemProvider.d.ts.map +1 -0
- package/dist/providers/{InitializeProvider.js → SystemProvider.js} +4 -9
- package/dist/providers/SystemProvider.js.map +6 -0
- package/dist/providers/ThemeContext.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataChangeEvent.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataProvider.d.ts.map +1 -1
- package/dist/styles/patterns.styles.d.ts.map +1 -1
- package/dist/styles/tokens.styles.d.ts.map +1 -1
- package/docs/disclosure.md +1 -1
- package/docs/feedback.md +10 -1
- package/docs/hooks.md +1 -1
- package/docs/providers.md +78 -9
- package/package.json +5 -5
- package/src/components/feedback/print/PrintContext.ts +20 -0
- package/src/components/feedback/print/PrintProvider.tsx +280 -0
- package/src/components/form-control/editor/editor.css +1 -0
- package/src/hooks/usePrint.ts +2 -282
- package/src/index.ts +5 -3
- package/src/providers/{InitializeProvider.tsx → SystemProvider.tsx} +2 -30
- package/tailwind.config.ts +2 -3
- package/dist/providers/InitializeProvider.d.ts +0 -33
- package/dist/providers/InitializeProvider.d.ts.map +0 -1
- package/dist/providers/InitializeProvider.js.map +0 -6
package/src/hooks/usePrint.ts
CHANGED
|
@@ -1,282 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { jsPDF } from "jspdf";
|
|
4
|
-
import * as htmlToImage from "html-to-image";
|
|
5
|
-
import { useBusy } from "../components/feedback/busy/BusyContext";
|
|
6
|
-
import {
|
|
7
|
-
PrintInstanceContext,
|
|
8
|
-
type PrintInstance,
|
|
9
|
-
} from "../components/feedback/print/PrintInstanceContext";
|
|
10
|
-
|
|
11
|
-
// --- Types ---
|
|
12
|
-
|
|
13
|
-
export interface PrintOptions {
|
|
14
|
-
size?: string;
|
|
15
|
-
margin?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface UsePrintReturn {
|
|
19
|
-
toPrinter: (factory: () => JSX.Element, options?: PrintOptions) => Promise<void>;
|
|
20
|
-
toPdf: (factory: () => JSX.Element, options?: PrintOptions) => Promise<Uint8Array>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// --- Paper size constants (pt) ---
|
|
24
|
-
|
|
25
|
-
const PAPER_SIZES: Partial<Record<string, [number, number]>> = {
|
|
26
|
-
a3: [841.89, 1190.55],
|
|
27
|
-
a4: [595.28, 841.89],
|
|
28
|
-
a5: [419.53, 595.28],
|
|
29
|
-
letter: [612, 792],
|
|
30
|
-
legal: [612, 1008],
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// --- Internal helpers ---
|
|
34
|
-
|
|
35
|
-
function parseDimension(dim: string): number {
|
|
36
|
-
const num = parseFloat(dim);
|
|
37
|
-
if (dim.endsWith("mm")) return num * 2.83465;
|
|
38
|
-
if (dim.endsWith("cm")) return num * 28.3465;
|
|
39
|
-
if (dim.endsWith("in")) return num * 72;
|
|
40
|
-
return num; // pt
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function parseSize(size?: string): { width: number; height: number; orientation: "p" | "l" } {
|
|
44
|
-
const s = (size ?? "A4").toLowerCase().trim();
|
|
45
|
-
const landscape = s.includes("landscape");
|
|
46
|
-
const cleanSize = s.replace(/\s*(landscape|portrait)\s*/g, "").trim();
|
|
47
|
-
|
|
48
|
-
const paperSize = PAPER_SIZES[cleanSize];
|
|
49
|
-
if (paperSize) {
|
|
50
|
-
const [w, h] = paperSize;
|
|
51
|
-
if (landscape) return { width: h, height: w, orientation: "l" };
|
|
52
|
-
return { width: w, height: h, orientation: "p" };
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// 커스텀 크기: "210mm 297mm"
|
|
56
|
-
const parts = cleanSize.split(/\s+/);
|
|
57
|
-
if (parts.length === 2) {
|
|
58
|
-
const w = parseDimension(parts[0]);
|
|
59
|
-
const h = parseDimension(parts[1]);
|
|
60
|
-
return { width: w, height: h, orientation: w > h ? "l" : "p" };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return { width: 595.28, height: 841.89, orientation: "p" };
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function waitForImages(container: HTMLElement): Promise<void> {
|
|
67
|
-
const imgs = Array.from(container.querySelectorAll("img"));
|
|
68
|
-
return Promise.all(
|
|
69
|
-
imgs.map((img) =>
|
|
70
|
-
img.complete
|
|
71
|
-
? Promise.resolve()
|
|
72
|
-
: new Promise<void>((resolve) => {
|
|
73
|
-
img.addEventListener("load", () => resolve(), { once: true });
|
|
74
|
-
img.addEventListener("error", () => resolve(), { once: true });
|
|
75
|
-
}),
|
|
76
|
-
),
|
|
77
|
-
).then(() => undefined);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async function renderAndWait(
|
|
81
|
-
factory: () => JSX.Element,
|
|
82
|
-
): Promise<{ container: HTMLElement; dispose: () => void }> {
|
|
83
|
-
const container = document.createElement("div");
|
|
84
|
-
container.style.position = "fixed";
|
|
85
|
-
container.style.left = "-9999px";
|
|
86
|
-
container.style.top = "0";
|
|
87
|
-
document.body.appendChild(container);
|
|
88
|
-
|
|
89
|
-
let resolveReady: (() => void) | undefined;
|
|
90
|
-
const state = { readyCalled: false };
|
|
91
|
-
|
|
92
|
-
const readyPromise = new Promise<void>((resolve) => {
|
|
93
|
-
resolveReady = resolve;
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const instance: PrintInstance = {
|
|
97
|
-
ready: () => {
|
|
98
|
-
state.readyCalled = true;
|
|
99
|
-
resolveReady?.();
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
const dispose = render(
|
|
104
|
-
() =>
|
|
105
|
-
PrintInstanceContext.Provider({
|
|
106
|
-
value: instance,
|
|
107
|
-
get children() {
|
|
108
|
-
return factory();
|
|
109
|
-
},
|
|
110
|
-
}),
|
|
111
|
-
container,
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
// SolidJS 컴포넌트는 동기적으로 마운트됨.
|
|
115
|
-
// 동기적으로 ready()가 호출되었으면 이미 state.readyCalled=true.
|
|
116
|
-
// 비동기 ready (onMount 내 async 등)를 위해 rAF 대기 후 확인.
|
|
117
|
-
await Promise.resolve();
|
|
118
|
-
|
|
119
|
-
if (!state.readyCalled) {
|
|
120
|
-
await new Promise<void>((resolve) => {
|
|
121
|
-
requestAnimationFrame(() => resolve());
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (state.readyCalled) {
|
|
126
|
-
await readyPromise;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
await waitForImages(container);
|
|
130
|
-
|
|
131
|
-
return { container, dispose };
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// --- Hook ---
|
|
135
|
-
|
|
136
|
-
export function usePrint(): UsePrintReturn {
|
|
137
|
-
const busy = useBusy();
|
|
138
|
-
|
|
139
|
-
const toPrinter = async (factory: () => JSX.Element, options?: PrintOptions): Promise<void> => {
|
|
140
|
-
busy.show();
|
|
141
|
-
let container: HTMLElement | undefined;
|
|
142
|
-
let dispose: (() => void) | undefined;
|
|
143
|
-
let styleEl: HTMLStyleElement | undefined;
|
|
144
|
-
|
|
145
|
-
try {
|
|
146
|
-
const result = await renderAndWait(factory);
|
|
147
|
-
container = result.container;
|
|
148
|
-
dispose = result.dispose;
|
|
149
|
-
|
|
150
|
-
// 인쇄 대상을 visible로 전환
|
|
151
|
-
container.style.position = "static";
|
|
152
|
-
container.style.left = "auto";
|
|
153
|
-
container.classList.add("_sd-print-target");
|
|
154
|
-
|
|
155
|
-
// @media print 스타일 주입
|
|
156
|
-
styleEl = document.createElement("style");
|
|
157
|
-
styleEl.textContent = `
|
|
158
|
-
@page {
|
|
159
|
-
size: ${options?.size ?? "A4"};
|
|
160
|
-
margin: ${options?.margin ?? "0"};
|
|
161
|
-
}
|
|
162
|
-
body > ._sd-print-target { display: none; }
|
|
163
|
-
@media print {
|
|
164
|
-
html, body { -webkit-print-color-adjust: exact; background: white; }
|
|
165
|
-
body > * { display: none !important; }
|
|
166
|
-
body > ._sd-print-target { display: block !important; }
|
|
167
|
-
}
|
|
168
|
-
`;
|
|
169
|
-
document.head.appendChild(styleEl);
|
|
170
|
-
|
|
171
|
-
await new Promise<void>((resolve) => {
|
|
172
|
-
requestAnimationFrame(() => {
|
|
173
|
-
window.print();
|
|
174
|
-
resolve();
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
} finally {
|
|
178
|
-
styleEl?.remove();
|
|
179
|
-
dispose?.();
|
|
180
|
-
container?.remove();
|
|
181
|
-
busy.hide();
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
const toPdf = async (factory: () => JSX.Element, options?: PrintOptions): Promise<Uint8Array> => {
|
|
186
|
-
busy.show();
|
|
187
|
-
let container: HTMLElement | undefined;
|
|
188
|
-
let dispose: (() => void) | undefined;
|
|
189
|
-
|
|
190
|
-
try {
|
|
191
|
-
const result = await renderAndWait(factory);
|
|
192
|
-
container = result.container;
|
|
193
|
-
dispose = result.dispose;
|
|
194
|
-
|
|
195
|
-
const { width: pageWidth, height: pageHeight, orientation } = parseSize(options?.size);
|
|
196
|
-
|
|
197
|
-
const doc = new jsPDF(orientation, "pt", [pageWidth, pageHeight]);
|
|
198
|
-
doc.deletePage(1);
|
|
199
|
-
|
|
200
|
-
const pages = Array.from(container.querySelectorAll<HTMLElement>("[data-print-page]"));
|
|
201
|
-
|
|
202
|
-
if (pages.length > 0) {
|
|
203
|
-
// 명시적 페이지 분할
|
|
204
|
-
for (const pageEl of pages) {
|
|
205
|
-
pageEl.style.width = pageWidth + "pt";
|
|
206
|
-
|
|
207
|
-
const canvas = await htmlToImage.toCanvas(pageEl, {
|
|
208
|
-
backgroundColor: "white",
|
|
209
|
-
pixelRatio: 4,
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
const imgWidth = pageWidth;
|
|
213
|
-
const imgHeight = canvas.height * (pageWidth / canvas.width);
|
|
214
|
-
|
|
215
|
-
doc.addPage([pageWidth, pageHeight], orientation);
|
|
216
|
-
doc.addImage({
|
|
217
|
-
imageData: canvas,
|
|
218
|
-
x: 0,
|
|
219
|
-
y: 0,
|
|
220
|
-
width: imgWidth,
|
|
221
|
-
height: imgHeight,
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
} else {
|
|
225
|
-
// 자동 분할: 전체 콘텐츠를 페이지 높이 기준으로 슬라이스
|
|
226
|
-
// container 자체는 off-screen 스타일(position/left)을 가지므로
|
|
227
|
-
// html-to-image가 클론 시 동일 스타일을 복제하여 빈 캔버스가 생길 수 있음.
|
|
228
|
-
// 따라서 실제 콘텐츠 요소를 target으로 사용.
|
|
229
|
-
const target = (container.firstElementChild as HTMLElement | null) ?? container;
|
|
230
|
-
target.style.width = pageWidth + "pt";
|
|
231
|
-
|
|
232
|
-
const canvas = await htmlToImage.toCanvas(target, {
|
|
233
|
-
backgroundColor: "white",
|
|
234
|
-
pixelRatio: 4,
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
const scaleFactor = pageWidth / canvas.width;
|
|
238
|
-
const pageHeightPx = pageHeight / scaleFactor;
|
|
239
|
-
const totalPages = Math.ceil(canvas.height / pageHeightPx);
|
|
240
|
-
|
|
241
|
-
for (let i = 0; i < totalPages; i++) {
|
|
242
|
-
const sliceCanvas = document.createElement("canvas");
|
|
243
|
-
sliceCanvas.width = canvas.width;
|
|
244
|
-
sliceCanvas.height = Math.min(pageHeightPx, canvas.height - i * pageHeightPx);
|
|
245
|
-
|
|
246
|
-
const ctx = sliceCanvas.getContext("2d")!;
|
|
247
|
-
ctx.drawImage(
|
|
248
|
-
canvas,
|
|
249
|
-
0,
|
|
250
|
-
i * pageHeightPx,
|
|
251
|
-
canvas.width,
|
|
252
|
-
sliceCanvas.height,
|
|
253
|
-
0,
|
|
254
|
-
0,
|
|
255
|
-
canvas.width,
|
|
256
|
-
sliceCanvas.height,
|
|
257
|
-
);
|
|
258
|
-
|
|
259
|
-
const imgHeight = sliceCanvas.height * scaleFactor;
|
|
260
|
-
|
|
261
|
-
doc.addPage([pageWidth, pageHeight], orientation);
|
|
262
|
-
doc.addImage({
|
|
263
|
-
imageData: sliceCanvas,
|
|
264
|
-
x: 0,
|
|
265
|
-
y: 0,
|
|
266
|
-
width: pageWidth,
|
|
267
|
-
height: imgHeight,
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
const arrayBuffer = doc.output("arraybuffer");
|
|
273
|
-
return new Uint8Array(arrayBuffer);
|
|
274
|
-
} finally {
|
|
275
|
-
dispose?.();
|
|
276
|
-
container?.remove();
|
|
277
|
-
busy.hide();
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
return { toPrinter, toPdf };
|
|
282
|
-
}
|
|
1
|
+
export { usePrint } from "../components/feedback/print/PrintContext";
|
|
2
|
+
export type { PrintOptions, PrintContextValue } from "../components/feedback/print/PrintContext";
|
package/src/index.ts
CHANGED
|
@@ -82,6 +82,7 @@ export * from "./components/disclosure/Dropdown";
|
|
|
82
82
|
export * from "./components/disclosure/Dialog";
|
|
83
83
|
export * from "./components/disclosure/DialogContext";
|
|
84
84
|
export * from "./components/disclosure/DialogInstanceContext";
|
|
85
|
+
export * from "./components/disclosure/DialogProvider";
|
|
85
86
|
export * from "./components/disclosure/Tabs";
|
|
86
87
|
|
|
87
88
|
//#endregion
|
|
@@ -98,6 +99,8 @@ export * from "./components/feedback/busy/BusyContext";
|
|
|
98
99
|
export * from "./components/feedback/busy/BusyContainer";
|
|
99
100
|
|
|
100
101
|
// Print
|
|
102
|
+
export * from "./components/feedback/print/PrintContext";
|
|
103
|
+
export * from "./components/feedback/print/PrintProvider";
|
|
101
104
|
export * from "./components/feedback/print/Print";
|
|
102
105
|
export * from "./components/feedback/print/PrintInstanceContext";
|
|
103
106
|
export * from "./components/feedback/Progress";
|
|
@@ -140,8 +143,8 @@ export type {
|
|
|
140
143
|
export { SharedDataContext, useSharedData } from "./providers/shared-data/SharedDataContext";
|
|
141
144
|
export * from "./providers/shared-data/SharedDataChangeEvent";
|
|
142
145
|
|
|
143
|
-
//
|
|
144
|
-
export * from "./providers/
|
|
146
|
+
// SystemProvider
|
|
147
|
+
export * from "./providers/SystemProvider";
|
|
145
148
|
|
|
146
149
|
//#endregion
|
|
147
150
|
|
|
@@ -150,7 +153,6 @@ export * from "./providers/InitializeProvider";
|
|
|
150
153
|
export * from "./hooks/useLocalStorage";
|
|
151
154
|
export * from "./hooks/useSyncConfig";
|
|
152
155
|
export * from "./hooks/useLogger";
|
|
153
|
-
export * from "./hooks/usePrint";
|
|
154
156
|
export { createControllableSignal } from "./hooks/createControllableSignal";
|
|
155
157
|
export { createIMEHandler } from "./hooks/createIMEHandler";
|
|
156
158
|
export { createMountTransition } from "./hooks/createMountTransition";
|
|
@@ -11,37 +11,11 @@ import { ThemeProvider } from "./ThemeContext";
|
|
|
11
11
|
import { ServiceClientProvider } from "./ServiceClientProvider";
|
|
12
12
|
import { SharedDataProvider } from "./shared-data/SharedDataProvider";
|
|
13
13
|
import { BusyProvider } from "../components/feedback/busy/BusyProvider";
|
|
14
|
-
import { DialogProvider } from "../components/disclosure/DialogProvider";
|
|
15
14
|
import type { BusyVariant } from "../components/feedback/busy/BusyContext";
|
|
16
15
|
|
|
17
16
|
export type { BusyVariant };
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
* @simplysm/solid 메인 Provider
|
|
21
|
-
*
|
|
22
|
-
* @remarks
|
|
23
|
-
* - 모든 개별 Provider를 올바른 의존성 순서로 네스팅
|
|
24
|
-
* - `clientName`만 prop으로 전달하고, 나머지 설정은 각 hook의 `configure()`로 주입
|
|
25
|
-
* - 개별 Provider를 직접 조합할 필요 없이 이 Provider 하나로 앱을 감싸면 됨
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```tsx
|
|
29
|
-
* <InitializeProvider clientName="my-app">
|
|
30
|
-
* <AppRoot />
|
|
31
|
-
* </InitializeProvider>
|
|
32
|
-
*
|
|
33
|
-
* function AppRoot() {
|
|
34
|
-
* const serviceClient = useServiceClient();
|
|
35
|
-
* onMount(async () => {
|
|
36
|
-
* await serviceClient.connect("main", { port: 3000 });
|
|
37
|
-
* useSyncStorage()!.configure((origin) => myStorageAdapter);
|
|
38
|
-
* useLogger().configure((origin) => myLogAdapter);
|
|
39
|
-
* useSharedData().configure((origin) => definitions);
|
|
40
|
-
* });
|
|
41
|
-
* }
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export const InitializeProvider: ParentComponent<{
|
|
18
|
+
export const SystemProvider: ParentComponent<{
|
|
45
19
|
clientName: string;
|
|
46
20
|
busyVariant?: BusyVariant;
|
|
47
21
|
}> = (props) => {
|
|
@@ -57,9 +31,7 @@ export const InitializeProvider: ParentComponent<{
|
|
|
57
31
|
<ThemeProvider>
|
|
58
32
|
<ServiceClientProvider>
|
|
59
33
|
<SharedDataProvider>
|
|
60
|
-
<BusyProvider variant={props.busyVariant}>
|
|
61
|
-
<DialogProvider>{props.children}</DialogProvider>
|
|
62
|
-
</BusyProvider>
|
|
34
|
+
<BusyProvider variant={props.busyVariant}>{props.children}</BusyProvider>
|
|
63
35
|
</SharedDataProvider>
|
|
64
36
|
</ServiceClientProvider>
|
|
65
37
|
</ThemeProvider>
|
package/tailwind.config.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
+
import { fileURLToPath } from "url";
|
|
1
2
|
import colors from "tailwindcss/colors";
|
|
2
3
|
import defaultTheme from "tailwindcss/defaultTheme";
|
|
3
4
|
|
|
4
5
|
const lh = defaultTheme.lineHeight.normal; // "1.5"
|
|
5
6
|
const sp = defaultTheme.spacing;
|
|
6
7
|
|
|
7
|
-
const __dirname = new URL(".", import.meta.url)
|
|
8
|
-
.replace(/^\/[^/]+\/@fs/, "") // Vite 가상 경로 제거
|
|
9
|
-
.replace(/index\.ts$/, ""); // re-export 시 index.ts 경로 제거
|
|
8
|
+
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|
10
9
|
|
|
11
10
|
// export const tailwindContent = [`${__dirname}**/*.tsx`];
|
|
12
11
|
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { type ParentComponent } from "solid-js";
|
|
2
|
-
import type { BusyVariant } from "../components/feedback/busy/BusyContext";
|
|
3
|
-
export type { BusyVariant };
|
|
4
|
-
/**
|
|
5
|
-
* @simplysm/solid 메인 Provider
|
|
6
|
-
*
|
|
7
|
-
* @remarks
|
|
8
|
-
* - 모든 개별 Provider를 올바른 의존성 순서로 네스팅
|
|
9
|
-
* - `clientName`만 prop으로 전달하고, 나머지 설정은 각 hook의 `configure()`로 주입
|
|
10
|
-
* - 개별 Provider를 직접 조합할 필요 없이 이 Provider 하나로 앱을 감싸면 됨
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```tsx
|
|
14
|
-
* <InitializeProvider clientName="my-app">
|
|
15
|
-
* <AppRoot />
|
|
16
|
-
* </InitializeProvider>
|
|
17
|
-
*
|
|
18
|
-
* function AppRoot() {
|
|
19
|
-
* const serviceClient = useServiceClient();
|
|
20
|
-
* onMount(async () => {
|
|
21
|
-
* await serviceClient.connect("main", { port: 3000 });
|
|
22
|
-
* useSyncStorage()!.configure((origin) => myStorageAdapter);
|
|
23
|
-
* useLogger().configure((origin) => myLogAdapter);
|
|
24
|
-
* useSharedData().configure((origin) => definitions);
|
|
25
|
-
* });
|
|
26
|
-
* }
|
|
27
|
-
* ```
|
|
28
|
-
*/
|
|
29
|
-
export declare const InitializeProvider: ParentComponent<{
|
|
30
|
-
clientName: string;
|
|
31
|
-
busyVariant?: BusyVariant;
|
|
32
|
-
}>;
|
|
33
|
-
//# sourceMappingURL=InitializeProvider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InitializeProvider.d.ts","sourceRoot":"","sources":["../../src/providers/InitializeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAchD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAE3E,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CA2BA,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/providers/InitializeProvider.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;AAC7B,SAASC,sBAAsB;AA8BxB,MAAMC,qBAGPC,WAAU;AACd,SAAAC,kBACGf,gBAAc;IAAA,IAACgB,aAAU;AAAA,aAAEF,MAAME;IAAU;IAAA,IAAAC,WAAA;AAAA,aAAAF,kBACzCd,qBAAmB;QAAA,IAAAgB,WAAA;AAAA,iBAAAF,kBACjBb,gBAAc;YAAA,IAAAe,WAAA;AAAA,qBAAAF,kBACZZ,sBAAoB;gBAAA,IAAAc,WAAA;AAAA,yBAAA,CAAAF,kBAClBX,oBAAkB,CAAA,CAAA,GAAAW,kBAClBV,qBAAmB;oBAAA,IAAAY,WAAA;AAAA,6BAAAF,kBACjBT,mBAAiB;wBAAA,IAAAW,WAAA;AAAA,iCAAAF,kBACfR,mBAAiB;4BAAA,IAAAU,WAAA;AAAA,qCAAAF,kBACfP,eAAa;gCAAA,IAAAS,WAAA;AAAA,yCAAAF,kBACXN,uBAAqB;oCAAA,IAAAQ,WAAA;AAAA,6CAAAF,kBACnBL,oBAAkB;wCAAA,IAAAO,WAAA;AAAA,iDAAAF,kBAChBJ,cAAY;4CAAA,IAACO,UAAO;AAAA,qDAAEJ,MAAMK;4CAAW;4CAAA,IAAAF,WAAA;AAAA,qDAAAF,kBACrCH,gBAAc;gDAAA,IAAAK,WAAA;AAAA,yDAAEH,MAAMG;gDAAQ;8CAAA,CAAA;4CAAA;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;AAazD;",
|
|
5
|
-
"names": ["ConfigProvider", "SyncStorageProvider", "LoggerProvider", "NotificationProvider", "NotificationBanner", "ErrorLoggerProvider", "PwaUpdateProvider", "ClipboardProvider", "ThemeProvider", "ServiceClientProvider", "SharedDataProvider", "BusyProvider", "DialogProvider", "InitializeProvider", "props", "_$createComponent", "clientName", "children", "variant", "busyVariant"]
|
|
6
|
-
}
|