@simplysm/solid 13.0.32 → 13.0.34

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 (72) hide show
  1. package/README.md +39 -14
  2. package/dist/hooks/useLogger.js +4 -4
  3. package/dist/hooks/useLogger.js.map +1 -1
  4. package/dist/hooks/useSyncConfig.d.ts +1 -1
  5. package/dist/hooks/useSyncConfig.d.ts.map +1 -1
  6. package/dist/hooks/useSyncConfig.js +6 -4
  7. package/dist/hooks/useSyncConfig.js.map +1 -1
  8. package/dist/index.d.ts +6 -3
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +7 -4
  11. package/dist/index.js.map +1 -1
  12. package/dist/{hooks/useClipboardValueCopy.d.ts → providers/ClipboardProvider.d.ts} +4 -3
  13. package/dist/providers/ClipboardProvider.d.ts.map +1 -0
  14. package/dist/{hooks/useClipboardValueCopy.js → providers/ClipboardProvider.js} +11 -8
  15. package/dist/providers/ClipboardProvider.js.map +6 -0
  16. package/dist/providers/ConfigContext.d.ts +15 -47
  17. package/dist/providers/ConfigContext.d.ts.map +1 -1
  18. package/dist/providers/ConfigContext.js +18 -1
  19. package/dist/providers/ConfigContext.js.map +3 -3
  20. package/dist/providers/ErrorLoggerProvider.d.ts +10 -0
  21. package/dist/providers/ErrorLoggerProvider.d.ts.map +1 -0
  22. package/dist/providers/ErrorLoggerProvider.js +23 -0
  23. package/dist/providers/ErrorLoggerProvider.js.map +6 -0
  24. package/dist/providers/LoggerContext.d.ts +38 -0
  25. package/dist/providers/LoggerContext.d.ts.map +1 -0
  26. package/dist/providers/LoggerContext.js +25 -0
  27. package/dist/providers/LoggerContext.js.map +6 -0
  28. package/dist/providers/PwaUpdateProvider.d.ts +12 -0
  29. package/dist/providers/PwaUpdateProvider.d.ts.map +1 -0
  30. package/dist/providers/PwaUpdateProvider.js +56 -0
  31. package/dist/providers/PwaUpdateProvider.js.map +6 -0
  32. package/dist/providers/ServiceClientContext.d.ts.map +1 -1
  33. package/dist/providers/ServiceClientContext.js +1 -3
  34. package/dist/providers/ServiceClientContext.js.map +1 -1
  35. package/dist/providers/SyncStorageContext.d.ts +42 -0
  36. package/dist/providers/SyncStorageContext.d.ts.map +1 -0
  37. package/dist/providers/SyncStorageContext.js +25 -0
  38. package/dist/providers/SyncStorageContext.js.map +6 -0
  39. package/dist/providers/ThemeContext.d.ts.map +1 -1
  40. package/dist/providers/ThemeContext.js +1 -1
  41. package/dist/providers/ThemeContext.js.map +1 -1
  42. package/docs/disclosure.md +1 -1
  43. package/docs/feedback.md +4 -4
  44. package/docs/form-controls.md +1 -1
  45. package/docs/hooks.md +8 -42
  46. package/docs/providers.md +116 -3
  47. package/docs/styling.md +1 -1
  48. package/package.json +16 -16
  49. package/src/hooks/useLogger.ts +4 -4
  50. package/src/hooks/useSyncConfig.ts +7 -5
  51. package/src/index.ts +6 -3
  52. package/src/{hooks/useClipboardValueCopy.ts → providers/ClipboardProvider.tsx} +6 -4
  53. package/src/providers/ConfigContext.tsx +48 -0
  54. package/src/providers/ErrorLoggerProvider.tsx +31 -0
  55. package/src/providers/LoggerContext.tsx +46 -0
  56. package/src/providers/PwaUpdateProvider.tsx +68 -0
  57. package/src/providers/ServiceClientContext.ts +1 -3
  58. package/src/providers/SyncStorageContext.tsx +52 -0
  59. package/src/providers/ThemeContext.tsx +1 -3
  60. package/dist/hooks/useClipboardValueCopy.d.ts.map +0 -1
  61. package/dist/hooks/useClipboardValueCopy.js.map +0 -6
  62. package/dist/hooks/usePwaUpdate.d.ts +0 -14
  63. package/dist/hooks/usePwaUpdate.d.ts.map +0 -1
  64. package/dist/hooks/usePwaUpdate.js +0 -50
  65. package/dist/hooks/usePwaUpdate.js.map +0 -6
  66. package/dist/providers/InitializeProvider.d.ts +0 -25
  67. package/dist/providers/InitializeProvider.d.ts.map +0 -1
  68. package/dist/providers/InitializeProvider.js +0 -60
  69. package/dist/providers/InitializeProvider.js.map +0 -6
  70. package/src/hooks/usePwaUpdate.ts +0 -73
  71. package/src/providers/ConfigContext.ts +0 -80
  72. package/src/providers/InitializeProvider.tsx +0 -79
package/README.md CHANGED
@@ -37,28 +37,48 @@ export default {
37
37
 
38
38
  ### Provider Setup
39
39
 
40
- Wrap your app root with `InitializeProvider`. It automatically sets up all required providers internally: configuration context, theme (dark/light/system), notification system with banner, global error capturing (window.onerror, unhandledrejection), busy overlay, and programmatic dialog support.
40
+ Compose individual providers at the app root. Each provider is independent and optional (except `ConfigProvider` which is required).
41
41
 
42
42
  ```tsx
43
- import { InitializeProvider } from "@simplysm/solid";
43
+ import {
44
+ BusyProvider,
45
+ ClipboardProvider,
46
+ ConfigProvider,
47
+ ErrorLoggerProvider,
48
+ NotificationBanner,
49
+ NotificationProvider,
50
+ PwaUpdateProvider,
51
+ ThemeProvider,
52
+ } from "@simplysm/solid";
44
53
 
45
54
  function App() {
46
55
  return (
47
- <InitializeProvider config={{ clientName: "my-app" }}>
48
- {/* app content */}
49
- </InitializeProvider>
56
+ <ConfigProvider clientName="my-app">
57
+ <NotificationProvider>
58
+ <NotificationBanner />
59
+ <ErrorLoggerProvider>
60
+ <PwaUpdateProvider>
61
+ <ClipboardProvider>
62
+ <ThemeProvider>
63
+ <BusyProvider>{/* app content */}</BusyProvider>
64
+ </ThemeProvider>
65
+ </ClipboardProvider>
66
+ </PwaUpdateProvider>
67
+ </ErrorLoggerProvider>
68
+ </NotificationProvider>
69
+ </ConfigProvider>
50
70
  );
51
71
  }
52
72
  ```
53
73
 
54
- **AppConfig options:**
74
+ **Optional providers** (add when needed):
55
75
 
56
- | Option | Type | Default | Description |
57
- |--------|------|---------|-------------|
58
- | `clientName` | `string` | **(required)** | Client identifier (used as storage key prefix) |
59
- | `syncStorage` | `StorageAdapter` | `localStorage` | Custom sync storage adapter (used by `useSyncConfig`) |
60
- | `logger` | `LogAdapter` | - | Log adapter for remote logging (used by `useLogger`) |
61
- | `busyVariant` | `"spinner" \| "bar"` | `"spinner"` | Root busy overlay variant |
76
+ | Provider | Purpose |
77
+ |----------|---------|
78
+ | `SyncStorageProvider` | Custom sync storage adapter for `useSyncConfig` (wraps above `ConfigProvider`) |
79
+ | `LoggerProvider` | Remote log adapter for `useLogger` (wraps above `ErrorLoggerProvider`) |
80
+ | `ServiceClientProvider` | WebSocket RPC client |
81
+ | `SharedDataProvider` | Server-side data subscriptions |
62
82
 
63
83
  **StorageAdapter interface:**
64
84
 
@@ -169,11 +189,16 @@ import "@simplysm/solid/tailwind.css";
169
189
  - [`createMountTransition`](docs/hooks.md#createmounttransition) - Mount/unmount CSS animation hook
170
190
  - [`createIMEHandler`](docs/hooks.md#createimehandler) - IME composition delay handler
171
191
  - [`useRouterLink`](docs/hooks.md#userouterlink) - Navigation with Ctrl/Shift+click support
172
- - [`usePwaUpdate`](docs/hooks.md#usepwaupdate) - PWA Service Worker update detection
173
192
 
174
193
  ## Providers
175
194
 
176
- - [`InitializeProvider`](docs/providers.md#initializeprovider) - Root provider (theme, notification, busy, dialog, clipboard, error capturing)
195
+ - [`ConfigProvider`](docs/providers.md#configprovider) - App configuration (required, topmost)
196
+ - [`SyncStorageProvider`](docs/providers.md#syncstorageprovider) - Custom sync storage adapter (optional)
197
+ - [`LoggerProvider`](docs/providers.md#loggerprovider) - Remote log adapter (optional)
198
+ - [`ErrorLoggerProvider`](docs/providers.md#errorloggerprovider) - Global error capturing (window.onerror, unhandledrejection)
199
+ - [`PwaUpdateProvider`](docs/providers.md#pwaupdateprovider) - PWA Service Worker update detection
200
+ - [`ClipboardProvider`](docs/providers.md#clipboardprovider) - Form control clipboard value copy
201
+ - [`ThemeProvider`](docs/providers.md#themeprovider) - Dark/light/system theme
177
202
  - [`ServiceClientProvider`](docs/providers.md#serviceclientprovider) - WebSocket RPC client provider (`useServiceClient`)
178
203
  - [`SharedDataProvider`](docs/providers.md#shareddataprovider) - Server-side data subscription provider (`useSharedData`)
179
204
 
@@ -1,11 +1,11 @@
1
1
  import { consola } from "consola";
2
- import { useConfig } from "../providers/ConfigContext.js";
2
+ import { useLogAdapter } from "../providers/LoggerContext.js";
3
3
  function useLogger() {
4
- const config = useConfig();
4
+ const logAdapter = useLogAdapter();
5
5
  const createLogFunction = (level) => {
6
6
  return (...args) => {
7
- if (config.logger) {
8
- void config.logger.write(level, ...args);
7
+ if (logAdapter) {
8
+ void logAdapter.write(level, ...args);
9
9
  } else {
10
10
  consola[level](...args);
11
11
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/useLogger.ts"],
4
- "mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,iBAAkC;AAWpC,SAAS,YAAoB;AAClC,QAAM,SAAS,UAAU;AAEzB,QAAM,oBAAoB,CAAC,UAAoB;AAC7C,WAAO,IAAI,SAAoB;AAC7B,UAAI,OAAO,QAAQ;AACjB,aAAK,OAAO,OAAO,MAAM,OAAO,GAAG,IAAI;AAAA,MACzC,OAAO;AACL,QAAC,QAAgB,KAAK,EAAE,GAAG,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,KAAK,kBAAkB,KAAK;AAAA,IAC5B,MAAM,kBAAkB,MAAM;AAAA,IAC9B,MAAM,kBAAkB,MAAM;AAAA,IAC9B,OAAO,kBAAkB,OAAO;AAAA,EAClC;AACF;",
4
+ "mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,qBAAsC;AAWxC,SAAS,YAAoB;AAClC,QAAM,aAAa,cAAc;AAEjC,QAAM,oBAAoB,CAAC,UAAoB;AAC7C,WAAO,IAAI,SAAoB;AAC7B,UAAI,YAAY;AACd,aAAK,WAAW,MAAM,OAAO,GAAG,IAAI;AAAA,MACtC,OAAO;AACL,QAAC,QAAgB,KAAK,EAAE,GAAG,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,KAAK,kBAAkB,KAAK;AAAA,IAC5B,MAAM,kBAAkB,MAAM;AAAA,IAC9B,MAAM,kBAAkB,MAAM;AAAA,IAC9B,OAAO,kBAAkB,OAAO;AAAA,EAClC;AACF;",
5
5
  "names": []
6
6
  }
@@ -2,7 +2,7 @@ import { type Accessor, type Setter } from "solid-js";
2
2
  /**
3
3
  * Creates a reactive signal that syncs configuration data to storage.
4
4
  *
5
- * Uses `syncStorage` from ConfigProvider if available, otherwise falls back to `localStorage`.
5
+ * Uses `SyncStorageProvider` storage if available, otherwise falls back to `localStorage`.
6
6
  * Designed for data that should persist and sync across devices (e.g., theme, user preferences, DataSheet configs).
7
7
  *
8
8
  * @param key - Storage key for the config value
@@ -1 +1 @@
1
- {"version":3,"file":"useSyncConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useSyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAA8B,MAAM,UAAU,CAAC;AAGlF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAClC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GACnB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAsEvD"}
1
+ {"version":3,"file":"useSyncConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useSyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAA8B,MAAM,UAAU,CAAC;AAIlF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAClC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GACnB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAuEvD"}
@@ -1,12 +1,14 @@
1
1
  import { createEffect, createSignal } from "solid-js";
2
2
  import { useConfig } from "../providers/ConfigContext.js";
3
+ import { useSyncStorage } from "../providers/SyncStorageContext.js";
3
4
  function useSyncConfig(key, defaultValue) {
4
5
  const config = useConfig();
6
+ const syncStorage = useSyncStorage();
5
7
  const prefixedKey = `${config.clientName}.${key}`;
6
8
  const [value, setValue] = createSignal(defaultValue);
7
9
  const [ready, setReady] = createSignal(false);
8
10
  const initializeFromStorage = async () => {
9
- if (!config.syncStorage) {
11
+ if (!syncStorage) {
10
12
  try {
11
13
  const stored = localStorage.getItem(prefixedKey);
12
14
  if (stored !== null) {
@@ -18,7 +20,7 @@ function useSyncConfig(key, defaultValue) {
18
20
  return;
19
21
  }
20
22
  try {
21
- const stored = await config.syncStorage.getItem(prefixedKey);
23
+ const stored = await syncStorage.getItem(prefixedKey);
22
24
  if (stored !== null) {
23
25
  setValue(() => JSON.parse(stored));
24
26
  }
@@ -39,13 +41,13 @@ function useSyncConfig(key, defaultValue) {
39
41
  if (!ready()) return;
40
42
  const currentValue = value();
41
43
  const serialized = JSON.stringify(currentValue);
42
- if (!config.syncStorage) {
44
+ if (!syncStorage) {
43
45
  localStorage.setItem(prefixedKey, serialized);
44
46
  return;
45
47
  }
46
48
  void (async () => {
47
49
  try {
48
- await config.syncStorage.setItem(prefixedKey, serialized);
50
+ await syncStorage.setItem(prefixedKey, serialized);
49
51
  } catch {
50
52
  localStorage.setItem(prefixedKey, serialized);
51
53
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/useSyncConfig.ts"],
4
- "mappings": "AAAA,SAAqC,cAAc,oBAAoB;AACvE,SAAS,iBAAiB;AAuBnB,SAAS,cACd,KACA,cACuD;AACvD,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,GAAG,OAAO,UAAU,IAAI,GAAG;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAqB,YAAY;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAa,KAAK;AAG5C,QAAM,wBAAwB,YAAY;AACxC,QAAI,CAAC,OAAO,aAAa;AAEvB,UAAI;AACF,cAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,YAAI,WAAW,MAAM;AACnB,mBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAAA,MAER;AACA,eAAS,IAAI;AACb;AAAA,IACF;AAGA,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,YAAY,QAAQ,WAAW;AAC3D,UAAI,WAAW,MAAM;AACnB,iBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,MAC7C;AAAA,IACF,QAAQ;AAEN,UAAI;AACF,cAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,YAAI,WAAW,MAAM;AACnB,mBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,UAAE;AACA,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAGA,OAAK,sBAAsB;AAG3B,eAAa,MAAM;AACjB,QAAI,CAAC,MAAM,EAAG;AACd,UAAM,eAAe,MAAM;AAC3B,UAAM,aAAa,KAAK,UAAU,YAAY;AAE9C,QAAI,CAAC,OAAO,aAAa;AAEvB,mBAAa,QAAQ,aAAa,UAAU;AAC5C;AAAA,IACF;AAGA,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,OAAO,YAAa,QAAQ,aAAa,UAAU;AAAA,MAC3D,QAAQ;AAEN,qBAAa,QAAQ,aAAa,UAAU;AAAA,MAC9C;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AAED,SAAO,CAAC,OAAO,UAAU,KAAK;AAChC;",
4
+ "mappings": "AAAA,SAAqC,cAAc,oBAAoB;AACvE,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAuBxB,SAAS,cACd,KACA,cACuD;AACvD,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,GAAG,OAAO,UAAU,IAAI,GAAG;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAqB,YAAY;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAa,KAAK;AAG5C,QAAM,wBAAwB,YAAY;AACxC,QAAI,CAAC,aAAa;AAEhB,UAAI;AACF,cAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,YAAI,WAAW,MAAM;AACnB,mBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAAA,MAER;AACA,eAAS,IAAI;AACb;AAAA,IACF;AAGA,QAAI;AACF,YAAM,SAAS,MAAM,YAAY,QAAQ,WAAW;AACpD,UAAI,WAAW,MAAM;AACnB,iBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,MAC7C;AAAA,IACF,QAAQ;AAEN,UAAI;AACF,cAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,YAAI,WAAW,MAAM;AACnB,mBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,UAAE;AACA,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAGA,OAAK,sBAAsB;AAG3B,eAAa,MAAM;AACjB,QAAI,CAAC,MAAM,EAAG;AACd,UAAM,eAAe,MAAM;AAC3B,UAAM,aAAa,KAAK,UAAU,YAAY;AAE9C,QAAI,CAAC,aAAa;AAEhB,mBAAa,QAAQ,aAAa,UAAU;AAC5C;AAAA,IACF;AAGA,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,YAAY,QAAQ,aAAa,UAAU;AAAA,MACnD,QAAQ;AAEN,qBAAa,QAAQ,aAAa,UAAU;AAAA,MAC9C;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AAED,SAAO,CAAC,OAAO,UAAU,KAAK;AAChC;",
5
5
  "names": []
6
6
  }
package/dist/index.d.ts CHANGED
@@ -62,8 +62,12 @@ export * from "./components/feedback/print/Print";
62
62
  export * from "./components/feedback/print/PrintInstanceContext";
63
63
  export * from "./components/feedback/Progress";
64
64
  export * from "./providers/ConfigContext";
65
- export * from "./providers/InitializeProvider";
66
- export { useTheme } from "./providers/ThemeContext";
65
+ export * from "./providers/SyncStorageContext";
66
+ export * from "./providers/LoggerContext";
67
+ export * from "./providers/ErrorLoggerProvider";
68
+ export * from "./providers/PwaUpdateProvider";
69
+ export * from "./providers/ClipboardProvider";
70
+ export { useTheme, ThemeProvider } from "./providers/ThemeContext";
67
71
  export type { ThemeMode, ResolvedTheme } from "./providers/ThemeContext";
68
72
  export * from "./providers/ServiceClientContext";
69
73
  export * from "./providers/ServiceClientProvider";
@@ -77,7 +81,6 @@ export * from "./hooks/usePrint";
77
81
  export { createControllableSignal } from "./hooks/createControllableSignal";
78
82
  export { createIMEHandler } from "./hooks/createIMEHandler";
79
83
  export { createMountTransition } from "./hooks/createMountTransition";
80
- export { usePwaUpdate } from "./hooks/usePwaUpdate";
81
84
  export { useRouterLink } from "./hooks/useRouterLink";
82
85
  export * from "./styles/tokens.styles";
83
86
  export * from "./styles/patterns.styles";
@@ -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
@@ -62,8 +62,12 @@ export * from "./components/feedback/print/Print.js";
62
62
  export * from "./components/feedback/print/PrintInstanceContext.js";
63
63
  export * from "./components/feedback/Progress.js";
64
64
  export * from "./providers/ConfigContext.js";
65
- export * from "./providers/InitializeProvider.js";
66
- import { useTheme } from "./providers/ThemeContext.js";
65
+ export * from "./providers/SyncStorageContext.js";
66
+ export * from "./providers/LoggerContext.js";
67
+ export * from "./providers/ErrorLoggerProvider.js";
68
+ export * from "./providers/PwaUpdateProvider.js";
69
+ export * from "./providers/ClipboardProvider.js";
70
+ import { useTheme, ThemeProvider } from "./providers/ThemeContext.js";
67
71
  export * from "./providers/ServiceClientContext.js";
68
72
  export * from "./providers/ServiceClientProvider.js";
69
73
  export * from "./providers/shared-data/SharedDataContext.js";
@@ -76,7 +80,6 @@ export * from "./hooks/usePrint.js";
76
80
  import { createControllableSignal } from "./hooks/createControllableSignal.js";
77
81
  import { createIMEHandler } from "./hooks/createIMEHandler.js";
78
82
  import { createMountTransition } from "./hooks/createMountTransition.js";
79
- import { usePwaUpdate } from "./hooks/usePwaUpdate.js";
80
83
  import { useRouterLink } from "./hooks/useRouterLink.js";
81
84
  export * from "./styles/tokens.styles.js";
82
85
  export * from "./styles/patterns.styles.js";
@@ -85,6 +88,7 @@ import { mergeStyles } from "./helpers/mergeStyles.js";
85
88
  import { splitSlots } from "./helpers/splitSlots.js";
86
89
  import { createAppStructure } from "./helpers/createAppStructure.js";
87
90
  export {
91
+ ThemeProvider,
88
92
  createAppStructure,
89
93
  createControllableSignal,
90
94
  createIMEHandler,
@@ -92,7 +96,6 @@ export {
92
96
  mergeStyles,
93
97
  ripple,
94
98
  splitSlots,
95
- usePwaUpdate,
96
99
  useRouterLink,
97
100
  useTheme
98
101
  };
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;AACd,cAAc;AAOd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,SAAS,gBAAgB;AAEzB,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,oBAAoB;AAC7B,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;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,UAAU,qBAAqB;AAExC,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,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;",
5
5
  "names": []
6
6
  }
@@ -1,5 +1,6 @@
1
+ import { type ParentComponent } from "solid-js";
1
2
  /**
2
- * 폼 컨트롤의 value를 클립보드 복사에 포함시키는 초기화 훅
3
+ * 폼 컨트롤의 value를 클립보드 복사에 포함시키는 Provider
3
4
  *
4
5
  * @remarks
5
6
  * 브라우저 기본 동작에서는 드래그 선택 후 복사 시 `<input>`, `<textarea>`, `<select>`의
@@ -11,5 +12,5 @@
11
12
  * - `<input type="checkbox|radio">` → `.checked` ? "Y" : ""
12
13
  * - 테이블 내에서는 셀 간 탭(`\t`), 행 간 개행(`\n`) 구분 (Excel 호환)
13
14
  */
14
- export declare function useClipboardValueCopy(): void;
15
- //# sourceMappingURL=useClipboardValueCopy.d.ts.map
15
+ export declare const ClipboardProvider: ParentComponent;
16
+ //# sourceMappingURL=ClipboardProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClipboardProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ClipboardProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAEpE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAmB/B,CAAC"}
@@ -1,5 +1,6 @@
1
+ import { memo as _$memo } from "solid-js/web";
1
2
  import { onCleanup, onMount } from "solid-js";
2
- function useClipboardValueCopy() {
3
+ const ClipboardProvider = (props) => {
3
4
  onMount(() => {
4
5
  const handler = (e) => {
5
6
  const sel = window.getSelection();
@@ -13,14 +14,13 @@ function useClipboardValueCopy() {
13
14
  document.addEventListener("copy", handler);
14
15
  onCleanup(() => document.removeEventListener("copy", handler));
15
16
  });
16
- }
17
+ return _$memo(() => props.children);
18
+ };
17
19
  function extractTextFromRange(range) {
18
20
  const root = range.commonAncestorContainer instanceof Element ? range.commonAncestorContainer : range.commonAncestorContainer.parentElement;
19
21
  if (!root) return null;
20
22
  const formSelector = 'input:not([type=hidden]), textarea, select, [role="checkbox"], [role="radio"]';
21
- const hasFormElements = [...root.querySelectorAll(formSelector)].some(
22
- (el) => range.intersectsNode(el)
23
- );
23
+ const hasFormElements = [...root.querySelectorAll(formSelector)].some((el) => range.intersectsNode(el));
24
24
  if (!hasFormElements) return null;
25
25
  const parts = [];
26
26
  const walk = (node) => {
@@ -100,7 +100,10 @@ function extractTextFromRange(range) {
100
100
  return parts.join("").replace(/\n+$/, "");
101
101
  }
102
102
  function formatInputValue(input) {
103
- const { type, value } = input;
103
+ const {
104
+ type,
105
+ value
106
+ } = input;
104
107
  if (!value) return "";
105
108
  if (type === "date" || type === "datetime-local") {
106
109
  const date = new Date(value);
@@ -117,6 +120,6 @@ function formatInputValue(input) {
117
120
  return value;
118
121
  }
119
122
  export {
120
- useClipboardValueCopy
123
+ ClipboardProvider
121
124
  };
122
- //# sourceMappingURL=useClipboardValueCopy.js.map
125
+ //# sourceMappingURL=ClipboardProvider.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/providers/ClipboardProvider.tsx"],
4
+ "mappings": ";AAAA,SAASA,WAAWC,eAAqC;AAelD,MAAMC,oBAAsCC,WAAU;AAC3DF,UAAQ,MAAM;AACZ,UAAMG,UAAWC,OAAsB;AACrC,YAAMC,MAAMC,OAAOC,aAAa;AAChC,UAAI,CAACF,OAAOA,IAAIG,eAAeH,IAAII,eAAe,EAAG;AAErD,YAAMC,QAAQL,IAAIM,WAAW,CAAC;AAC9B,YAAMC,OAAOC,qBAAqBH,KAAK;AACvC,UAAIE,QAAQ,KAAM;AAElBR,QAAEU,cAAeC,QAAQ,cAAcH,IAAI;AAC3CR,QAAEY,eAAe;IACnB;AAEAC,aAASC,iBAAiB,QAAQf,OAAO;AACzCJ,cAAU,MAAMkB,SAASE,oBAAoB,QAAQhB,OAAO,CAAC;EAC/D,CAAC;AAED,SAAAiB,OAAA,MAAUlB,MAAMmB,QAAQ;AAC1B;AAQA,SAASR,qBAAqBH,OAA6B;AACzD,QAAMY,OACJZ,MAAMa,mCAAmCC,UACrCd,MAAMa,0BACNb,MAAMa,wBAAwBE;AACpC,MAAI,CAACH,KAAM,QAAO;AAGlB,QAAMI,eACJ;AACF,QAAMC,kBAAkB,CAAC,GAAGL,KAAKM,iBAAiBF,YAAY,CAAC,EAAEG,KAAMC,QACrEpB,MAAMqB,eAAeD,EAAE,CACzB;AACA,MAAI,CAACH,gBAAiB,QAAO;AAE7B,QAAMK,QAAkB,CAAA;AAExB,QAAMC,OAAQC,UAAe;AAC3B,QAAI,CAACxB,MAAMqB,eAAeG,IAAI,EAAG;AAGjC,QAAIA,gBAAgBV,SAAS;AAC3B,YAAMW,OAAOD,KAAKE,aAAa,MAAM;AACrC,UAAID,SAAS,cAAcA,SAAS,SAAS;AAC3CH,cAAMK,KAAKH,KAAKE,aAAa,cAAc,MAAM,SAAS,MAAM,EAAE;AAClE;MACF;IACF;AAGA,QAAIF,gBAAgBI,kBAAkB;AACpC,UAAIJ,KAAKK,SAAS,SAAU;AAC5B,UAAIL,KAAKK,SAAS,cAAcL,KAAKK,SAAS,SAAS;AACrDP,cAAMK,KAAKH,KAAKM,UAAU,MAAM,EAAE;MACpC,OAAO;AACLR,cAAMK,KAAKI,iBAAiBP,IAAI,CAAC;MACnC;AACA;IACF;AACA,QAAIA,gBAAgBQ,qBAAqB;AACvC,YAAMC,IAAIT,KAAKU;AAEfZ,YAAMK,KAAKM,EAAEE,SAAS,IAAI,IAAI,IAAIF,EAAEG,QAAQ,MAAM,IAAI,CAAC,MAAMH,CAAC;AAC9D;IACF;AACA,QAAIT,gBAAgBa,mBAAmB;AACrC,UAAIb,KAAKc,gBAAgBC,SAAS,GAAG;AACnCjB,cAAMK,KAAKH,KAAKc,gBAAgB,CAAC,EAAEE,YAAYC,KAAK,CAAC;MACvD;AACA;IACF;AAGA,QAAIjB,KAAKkB,aAAaC,KAAKC,WAAW;AAEpC,YAAMC,SAASrB,KAAKT;AACpB,UAAI8B,QAAQ;AACV,cAAMC,QAAQC,iBAAiBF,MAAM;AACrC,YAAIC,MAAME,eAAe,YAAYF,MAAMG,YAAY,QAAQ;AAC7D;QACF;MACF;AAEA,UAAI/C,OAAOsB,KAAKgB,eAAe;AAC/B,UAAIhB,SAASxB,MAAMkD,kBAAkB1B,SAASxB,MAAMmD,cAAc;AAChEjD,eAAOA,KAAKkD,MAAMpD,MAAMqD,aAAarD,MAAMsD,SAAS;MACtD,WAAW9B,SAASxB,MAAMkD,gBAAgB;AACxChD,eAAOA,KAAKkD,MAAMpD,MAAMqD,WAAW;MACrC,WAAW7B,SAASxB,MAAMmD,cAAc;AACtCjD,eAAOA,KAAKkD,MAAM,GAAGpD,MAAMsD,SAAS;MACtC;AACAhC,YAAMK,KAAKzB,IAAI;AACf;IACF;AAGA,QAAI,EAAEsB,gBAAgBV,UAAU;AAC9B,iBAAWyC,SAAS/B,KAAKgC,WAAYjC,MAAKgC,KAAK;AAC/C;IACF;AAGA,QAAI/B,KAAKiC,YAAY,MAAM;AACzBnC,YAAMK,KAAK,IAAI;AACf;IACF;AAGA,QAAIH,KAAKiC,YAAY,MAAM;AACzB,UAAIC,YAAY;AAChB,iBAAWH,SAAS/B,KAAKgC,YAAY;AACnC,YAAI,CAACxD,MAAMqB,eAAekC,KAAK,EAAG;AAClC,YAAIA,iBAAiBI,sBAAsB;AACzC,cAAI,CAACD,UAAWpC,OAAMK,KAAK,GAAI;AAC/B+B,sBAAY;QACd;AACAnC,aAAKgC,KAAK;MACZ;AACAjC,YAAMK,KAAK,IAAI;AACf;IACF;AAGA,eAAW4B,SAAS/B,KAAKgC,YAAY;AACnCjC,WAAKgC,KAAK;IACZ;EACF;AAEAhC,OAAKvB,MAAMa,uBAAuB;AAElC,SAAOS,MAAMsC,KAAK,EAAE,EAAExB,QAAQ,QAAQ,EAAE;AAC1C;AASA,SAASL,iBAAiB8B,OAAiC;AACzD,QAAM;IAAEhC;IAAMK;EAAM,IAAI2B;AACxB,MAAI,CAAC3B,MAAO,QAAO;AAEnB,MAAIL,SAAS,UAAUA,SAAS,kBAAkB;AAChD,UAAMiC,OAAO,IAAIC,KAAK7B,KAAK;AAC3B,QAAI,CAAC8B,MAAMF,KAAKG,QAAQ,CAAC,GAAG;AAC1B,aAAOpC,SAAS,SAASiC,KAAKI,mBAAmB,IAAIJ,KAAKK,eAAe;IAC3E;EACF;AAEA,MAAItC,SAAS,QAAQ;AACnB,UAAMiC,OAAO,oBAAIC,KAAK,cAAc7B,KAAK,EAAE;AAC3C,QAAI,CAAC8B,MAAMF,KAAKG,QAAQ,CAAC,GAAG;AAC1B,aAAOH,KAAKM,mBAAmB;IACjC;EACF;AAEA,SAAOlC;AACT;",
5
+ "names": ["onCleanup", "onMount", "ClipboardProvider", "props", "handler", "e", "sel", "window", "getSelection", "isCollapsed", "rangeCount", "range", "getRangeAt", "text", "extractTextFromRange", "clipboardData", "setData", "preventDefault", "document", "addEventListener", "removeEventListener", "_$memo", "children", "root", "commonAncestorContainer", "Element", "parentElement", "formSelector", "hasFormElements", "querySelectorAll", "some", "el", "intersectsNode", "parts", "walk", "node", "role", "getAttribute", "push", "HTMLInputElement", "type", "checked", "formatInputValue", "HTMLTextAreaElement", "v", "value", "includes", "replace", "HTMLSelectElement", "selectedOptions", "length", "textContent", "trim", "nodeType", "Node", "TEXT_NODE", "parent", "style", "getComputedStyle", "visibility", "display", "startContainer", "endContainer", "slice", "startOffset", "endOffset", "child", "childNodes", "tagName", "firstCell", "HTMLTableCellElement", "join", "input", "date", "Date", "isNaN", "getTime", "toLocaleDateString", "toLocaleString", "toLocaleTimeString"]
6
+ }
@@ -1,25 +1,4 @@
1
- /**
2
- * 커스텀 저장소 어댑터 인터페이스
3
- *
4
- * @remarks
5
- * - 동기 저장소: `localStorage`, `sessionStorage` 등 그대로 전달 가능
6
- * - 비동기 저장소: `getItem`이 `Promise`를 반환하는 구현체 전달
7
- */
8
- export interface StorageAdapter {
9
- getItem(key: string): string | null | Promise<string | null>;
10
- setItem(key: string, value: string): void | Promise<unknown>;
11
- removeItem(key: string): void | Promise<void>;
12
- }
13
- /**
14
- * 로그 어댑터 인터페이스
15
- *
16
- * @remarks
17
- * - `useLogger`에서 사용하는 로그 전송 어댑터 (DB, 서버 등)
18
- * - adapter가 설정되면 consola 대신 adapter만 사용됨
19
- */
20
- export interface LogAdapter {
21
- write(severity: "error" | "warn" | "info" | "log", ...data: any[]): Promise<void> | void;
22
- }
1
+ import { type ParentComponent } from "solid-js";
23
2
  /**
24
3
  * 앱 전역 설정
25
4
  */
@@ -28,39 +7,28 @@ export interface AppConfig {
28
7
  * 클라이언트 식별자 (저장소 key prefix로 사용)
29
8
  */
30
9
  clientName: string;
31
- /**
32
- * 동기화 가능 저장소 (useSyncConfig에서 사용, 없으면 localStorage로 fallback)
33
- */
34
- syncStorage?: StorageAdapter;
35
- /**
36
- * 로그 어댑터 (useLogger에서 consola 외 추가 전송에 사용)
37
- */
38
- logger?: LogAdapter;
39
- /**
40
- * 루트 busy 오버레이 변형 (기본값: "spinner")
41
- */
42
- busyVariant?: "spinner" | "bar";
43
10
  }
44
11
  /**
45
12
  * 앱 전역 설정 Context
46
- *
47
- * @example
48
- * ```tsx
49
- * // 앱 루트에서 Provider 설정
50
- * <ConfigContext.Provider value={{ clientName: "myApp" }}>
51
- * <App />
52
- * </ConfigContext.Provider>
53
- *
54
- * // 컴포넌트에서 사용
55
- * const config = useConfig();
56
- * console.log(config.clientName); // "myApp"
57
- * ```
58
13
  */
59
14
  export declare const ConfigContext: import("solid-js").Context<AppConfig | undefined>;
60
15
  /**
61
16
  * 앱 전역 설정에 접근하는 훅
62
17
  *
63
- * @throws ConfigContext.Provider가 없으면 에러 발생
18
+ * @throws ConfigProvider가 없으면 에러 발생
64
19
  */
65
20
  export declare function useConfig(): AppConfig;
21
+ /**
22
+ * 앱 전역 설정 Provider
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * <ConfigProvider clientName="myApp">
27
+ * <App />
28
+ * </ConfigProvider>
29
+ * ```
30
+ */
31
+ export declare const ConfigProvider: ParentComponent<{
32
+ clientName: string;
33
+ }>;
66
34
  //# sourceMappingURL=ConfigContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/providers/ConfigContext.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1F;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC;IAE7B;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;CACjC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,mDAA6B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAMrC"}
1
+ {"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/providers/ConfigContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,mDAA6B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAMrC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAOlE,CAAC"}
@@ -1,14 +1,31 @@
1
+ import { createComponent as _$createComponent } from "solid-js/web";
1
2
  import { createContext, useContext } from "solid-js";
2
3
  const ConfigContext = createContext();
3
4
  function useConfig() {
4
5
  const context = useContext(ConfigContext);
5
6
  if (!context) {
6
- throw new Error("useConfig\uB294 ConfigContext.Provider \uB0B4\uBD80\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");
7
+ throw new Error("useConfig\uB294 ConfigProvider \uB0B4\uBD80\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");
7
8
  }
8
9
  return context;
9
10
  }
11
+ const ConfigProvider = (props) => {
12
+ return (
13
+ // eslint-disable-next-line solid/reactivity -- clientName은 초기 설정값으로 변경되지 않음
14
+ _$createComponent(ConfigContext.Provider, {
15
+ get value() {
16
+ return {
17
+ clientName: props.clientName
18
+ };
19
+ },
20
+ get children() {
21
+ return props.children;
22
+ }
23
+ })
24
+ );
25
+ };
10
26
  export {
11
27
  ConfigContext,
28
+ ConfigProvider,
12
29
  useConfig
13
30
  };
14
31
  //# sourceMappingURL=ConfigContext.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/providers/ConfigContext.ts"],
4
- "mappings": "AAAA,SAAS,eAAe,kBAAkB;AAkEnC,MAAM,gBAAgB,cAAyB;AAO/C,SAAS,YAAuB;AACrC,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0HAAoD;AAAA,EACtE;AACA,SAAO;AACT;",
5
- "names": []
3
+ "sources": ["../../src/providers/ConfigContext.tsx"],
4
+ "mappings": ";AAAA,SAASA,eAAeC,kBAAwC;AAezD,MAAMC,gBAAgBF,cAAyB;AAO/C,SAASG,YAAuB;AACrC,QAAMC,UAAUH,WAAWC,aAAa;AACxC,MAAI,CAACE,SAAS;AACZ,UAAM,IAAIC,MAAM,kHAA4C;EAC9D;AACA,SAAOD;AACT;AAYO,MAAME,iBAA2DC,WAAU;AAChF;;IACEC,kBACCN,cAAcO,UAAQ;MAAA,IAACC,QAAK;AAAA,eAAE;UAAEC,YAAYJ,MAAMI;QAAW;MAAC;MAAA,IAAAC,WAAA;AAAA,eAC5DL,MAAMK;MAAQ;IAAA,CAAA;;AAGrB;",
5
+ "names": ["createContext", "useContext", "ConfigContext", "useConfig", "context", "Error", "ConfigProvider", "props", "_$createComponent", "Provider", "value", "clientName", "children"]
6
6
  }
@@ -0,0 +1,10 @@
1
+ import { type ParentComponent } from "solid-js";
2
+ /**
3
+ * 전역 에러 캡처 Provider
4
+ *
5
+ * @remarks
6
+ * window.onerror, unhandledrejection 이벤트를 캡처하여 useLogger를 통해 로깅한다.
7
+ * LoggerProvider가 없으면 consola로 fallback.
8
+ */
9
+ export declare const ErrorLoggerProvider: ParentComponent;
10
+ //# sourceMappingURL=ErrorLoggerProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorLoggerProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ErrorLoggerProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAoBjC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { memo as _$memo } from "solid-js/web";
2
+ import { onCleanup } from "solid-js";
3
+ import { useLogger } from "../hooks/useLogger.js";
4
+ const ErrorLoggerProvider = (props) => {
5
+ const logger = useLogger();
6
+ const onError = (event) => {
7
+ logger.error("Uncaught error:", event.error ?? event.message);
8
+ };
9
+ const onUnhandledRejection = (event) => {
10
+ logger.error("Unhandled rejection:", event.reason);
11
+ };
12
+ window.addEventListener("error", onError);
13
+ window.addEventListener("unhandledrejection", onUnhandledRejection);
14
+ onCleanup(() => {
15
+ window.removeEventListener("error", onError);
16
+ window.removeEventListener("unhandledrejection", onUnhandledRejection);
17
+ });
18
+ return _$memo(() => props.children);
19
+ };
20
+ export {
21
+ ErrorLoggerProvider
22
+ };
23
+ //# sourceMappingURL=ErrorLoggerProvider.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/providers/ErrorLoggerProvider.tsx"],
4
+ "mappings": ";AAAA,SAASA,iBAAuC;AAChD,SAASC,iBAAiB;AASnB,MAAMC,sBAAwCC,WAAU;AAC7D,QAAMC,SAASH,UAAU;AAEzB,QAAMI,UAAWC,WAAsB;AACrCF,WAAOG,MAAM,mBAAmBD,MAAMC,SAASD,MAAME,OAAO;EAC9D;AAEA,QAAMC,uBAAwBH,WAAiC;AAC7DF,WAAOG,MAAM,wBAAwBD,MAAMI,MAAM;EACnD;AAEAC,SAAOC,iBAAiB,SAASP,OAAO;AACxCM,SAAOC,iBAAiB,sBAAsBH,oBAAoB;AAElET,YAAU,MAAM;AACdW,WAAOE,oBAAoB,SAASR,OAAO;AAC3CM,WAAOE,oBAAoB,sBAAsBJ,oBAAoB;EACvE,CAAC;AAED,SAAAK,OAAA,MAAUX,MAAMY,QAAQ;AAC1B;",
5
+ "names": ["onCleanup", "useLogger", "ErrorLoggerProvider", "props", "logger", "onError", "event", "error", "message", "onUnhandledRejection", "reason", "window", "addEventListener", "removeEventListener", "_$memo", "children"]
6
+ }
@@ -0,0 +1,38 @@
1
+ import { type ParentComponent } from "solid-js";
2
+ /**
3
+ * 로그 어댑터 인터페이스
4
+ *
5
+ * @remarks
6
+ * - `useLogger`에서 사용하는 로그 전송 어댑터 (DB, 서버 등)
7
+ * - adapter가 설정되면 consola 대신 adapter만 사용됨
8
+ */
9
+ export interface LogAdapter {
10
+ write(severity: "error" | "warn" | "info" | "log", ...data: any[]): Promise<void> | void;
11
+ }
12
+ /**
13
+ * 로그 어댑터 Context
14
+ *
15
+ * @remarks
16
+ * Provider가 없으면 `undefined` (useLogger에서 consola로 fallback)
17
+ */
18
+ export declare const LoggerContext: import("solid-js").Context<LogAdapter | undefined>;
19
+ /**
20
+ * 로그 어댑터 Context에 접근하는 훅
21
+ *
22
+ * @returns LogAdapter 또는 undefined (Provider가 없으면)
23
+ */
24
+ export declare function useLogAdapter(): LogAdapter | undefined;
25
+ /**
26
+ * 로그 어댑터 Provider
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * <LoggerProvider adapter={myLogAdapter}>
31
+ * <App />
32
+ * </LoggerProvider>
33
+ * ```
34
+ */
35
+ export declare const LoggerProvider: ParentComponent<{
36
+ adapter: LogAdapter;
37
+ }>;
38
+ //# sourceMappingURL=LoggerContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoggerContext.d.ts","sourceRoot":"","sources":["../../src/providers/LoggerContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1F;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,oDAAmD,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAEtD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE,CAKnE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { createComponent as _$createComponent } from "solid-js/web";
2
+ import { createContext, useContext } from "solid-js";
3
+ const LoggerContext = createContext(void 0);
4
+ function useLogAdapter() {
5
+ return useContext(LoggerContext);
6
+ }
7
+ const LoggerProvider = (props) => {
8
+ return (
9
+ // eslint-disable-next-line solid/reactivity -- adapter는 초기 설정값으로 변경되지 않음
10
+ _$createComponent(LoggerContext.Provider, {
11
+ get value() {
12
+ return props.adapter;
13
+ },
14
+ get children() {
15
+ return props.children;
16
+ }
17
+ })
18
+ );
19
+ };
20
+ export {
21
+ LoggerContext,
22
+ LoggerProvider,
23
+ useLogAdapter
24
+ };
25
+ //# sourceMappingURL=LoggerContext.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/providers/LoggerContext.tsx"],
4
+ "mappings": ";AAAA,SAASA,eAAeC,kBAAwC;AAmBzD,MAAMC,gBAAgBF,cAAsCG,MAAS;AAOrE,SAASC,gBAAwC;AACtD,SAAOH,WAAWC,aAAa;AACjC;AAYO,MAAMG,iBAA4DC,WAAU;AACjF;;IACEC,kBACCL,cAAcM,UAAQ;MAAA,IAACC,QAAK;AAAA,eAAEH,MAAMI;MAAO;MAAA,IAAAC,WAAA;AAAA,eAAGL,MAAMK;MAAQ;IAAA,CAAA;;AAEjE;",
5
+ "names": ["createContext", "useContext", "LoggerContext", "undefined", "useLogAdapter", "LoggerProvider", "props", "_$createComponent", "Provider", "value", "adapter", "children"]
6
+ }
@@ -0,0 +1,12 @@
1
+ import { type ParentComponent } from "solid-js";
2
+ /**
3
+ * PWA Service Worker 업데이트 감지 Provider
4
+ *
5
+ * @remarks
6
+ * 5분마다 SW 업데이트를 폴링하며, 새 버전 감지 시 알림을 표시한다.
7
+ * NotificationProvider 내부에서 사용해야 한다.
8
+ *
9
+ * navigator.serviceWorker가 없거나 등록된 SW가 없으면 graceful no-op.
10
+ */
11
+ export declare const PwaUpdateProvider: ParentComponent;
12
+ //# sourceMappingURL=PwaUpdateProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PwaUpdateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/PwaUpdateProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAK3D;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAqD/B,CAAC"}