@simplysm/solid 13.0.33 → 13.0.35
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 +22 -42
- package/dist/components/disclosure/DialogContext.d.ts +29 -0
- package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogContext.js.map +1 -1
- package/dist/components/disclosure/DialogInstanceContext.d.ts +14 -0
- package/dist/components/disclosure/DialogInstanceContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogInstanceContext.js.map +1 -1
- package/dist/components/feedback/busy/BusyContext.d.ts +18 -0
- package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContext.js.map +1 -1
- package/dist/components/feedback/busy/BusyProvider.d.ts +10 -0
- package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyProvider.js.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.d.ts +29 -0
- package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.d.ts +9 -0
- package/dist/components/feedback/notification/NotificationProvider.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
- package/dist/hooks/useLogger.d.ts +4 -2
- package/dist/hooks/useLogger.d.ts.map +1 -1
- package/dist/hooks/useLogger.js +11 -4
- package/dist/hooks/useLogger.js.map +1 -1
- package/dist/hooks/useSyncConfig.d.ts +2 -0
- package/dist/hooks/useSyncConfig.d.ts.map +1 -1
- package/dist/hooks/useSyncConfig.js +30 -26
- package/dist/hooks/useSyncConfig.js.map +1 -1
- package/dist/index.d.ts +8 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -15
- package/dist/index.js.map +1 -1
- package/dist/providers/InitializeProvider.d.ts +33 -0
- package/dist/providers/InitializeProvider.d.ts.map +1 -0
- package/dist/providers/InitializeProvider.js +75 -0
- package/dist/providers/InitializeProvider.js.map +6 -0
- package/dist/providers/LoggerContext.d.ts +24 -8
- package/dist/providers/LoggerContext.d.ts.map +1 -1
- package/dist/providers/LoggerContext.js +13 -13
- package/dist/providers/LoggerContext.js.map +2 -2
- package/dist/providers/ServiceClientContext.d.ts +13 -0
- package/dist/providers/ServiceClientContext.d.ts.map +1 -1
- package/dist/providers/ServiceClientContext.js.map +1 -1
- package/dist/providers/ServiceClientProvider.d.ts +21 -0
- package/dist/providers/ServiceClientProvider.d.ts.map +1 -1
- package/dist/providers/ServiceClientProvider.js.map +1 -1
- package/dist/providers/SyncStorageContext.d.ts +25 -11
- package/dist/providers/SyncStorageContext.d.ts.map +1 -1
- package/dist/providers/SyncStorageContext.js +13 -13
- package/dist/providers/SyncStorageContext.js.map +2 -2
- package/dist/providers/shared-data/SharedDataChangeEvent.d.ts +8 -0
- package/dist/providers/shared-data/SharedDataChangeEvent.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataChangeEvent.js.map +1 -1
- package/dist/providers/shared-data/SharedDataContext.d.ts +39 -0
- package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataContext.js +1 -3
- package/dist/providers/shared-data/SharedDataContext.js.map +1 -1
- package/dist/providers/shared-data/SharedDataProvider.d.ts +30 -5
- package/dist/providers/shared-data/SharedDataProvider.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataProvider.js +59 -38
- package/dist/providers/shared-data/SharedDataProvider.js.map +2 -2
- package/docs/providers.md +70 -195
- package/package.json +3 -3
- package/src/components/disclosure/DialogContext.ts +29 -0
- package/src/components/disclosure/DialogInstanceContext.ts +14 -0
- package/src/components/feedback/busy/BusyContext.ts +18 -0
- package/src/components/feedback/busy/BusyProvider.tsx +10 -0
- package/src/components/feedback/notification/NotificationContext.ts +29 -0
- package/src/components/feedback/notification/NotificationProvider.tsx +9 -0
- package/src/hooks/useLogger.ts +14 -4
- package/src/hooks/useSyncConfig.ts +42 -35
- package/src/index.ts +34 -14
- package/src/providers/InitializeProvider.tsx +74 -0
- package/src/providers/LoggerContext.tsx +39 -10
- package/src/providers/ServiceClientContext.ts +13 -0
- package/src/providers/ServiceClientProvider.tsx +21 -0
- package/src/providers/SyncStorageContext.tsx +40 -15
- package/src/providers/shared-data/SharedDataChangeEvent.ts +8 -0
- package/src/providers/shared-data/SharedDataContext.ts +40 -3
- package/src/providers/shared-data/SharedDataProvider.tsx +102 -54
package/README.md
CHANGED
|
@@ -37,48 +37,36 @@ export default {
|
|
|
37
37
|
|
|
38
38
|
### Provider Setup
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
Use `InitializeProvider` to wrap your app. It nests all providers in the correct dependency order. Configuration is done via hooks inside child components.
|
|
41
41
|
|
|
42
42
|
```tsx
|
|
43
|
-
import {
|
|
44
|
-
|
|
45
|
-
ClipboardProvider,
|
|
46
|
-
ConfigProvider,
|
|
47
|
-
ErrorLoggerProvider,
|
|
48
|
-
NotificationBanner,
|
|
49
|
-
NotificationProvider,
|
|
50
|
-
PwaUpdateProvider,
|
|
51
|
-
ThemeProvider,
|
|
52
|
-
} from "@simplysm/solid";
|
|
43
|
+
import { InitializeProvider, useServiceClient, useSyncStorage, useLogger, useSharedData } from "@simplysm/solid";
|
|
44
|
+
import { onMount } from "solid-js";
|
|
53
45
|
|
|
54
46
|
function App() {
|
|
55
47
|
return (
|
|
56
|
-
<
|
|
57
|
-
<
|
|
58
|
-
|
|
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>
|
|
48
|
+
<InitializeProvider clientName="my-app">
|
|
49
|
+
<AppRoot />
|
|
50
|
+
</InitializeProvider>
|
|
70
51
|
);
|
|
71
52
|
}
|
|
72
|
-
```
|
|
73
53
|
|
|
74
|
-
|
|
54
|
+
function AppRoot() {
|
|
55
|
+
const serviceClient = useServiceClient();
|
|
56
|
+
|
|
57
|
+
onMount(async () => {
|
|
58
|
+
await serviceClient.connect("main", { port: 3000 });
|
|
59
|
+
useSyncStorage()!.configure(myStorageAdapter);
|
|
60
|
+
useLogger().configure(myLogAdapter);
|
|
61
|
+
useSharedData().configure(definitions);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
```
|
|
75
65
|
|
|
76
|
-
|
|
|
77
|
-
|
|
78
|
-
| `
|
|
79
|
-
| `
|
|
80
|
-
| `ServiceClientProvider` | WebSocket RPC client |
|
|
81
|
-
| `SharedDataProvider` | Server-side data subscriptions |
|
|
66
|
+
| Prop | Type | Default | Description |
|
|
67
|
+
|------|------|---------|-------------|
|
|
68
|
+
| `clientName` | `string` | (required) | Client identifier (used as storage key prefix) |
|
|
69
|
+
| `busyVariant` | `BusyVariant` | `"spinner"` | Busy overlay display variant (`"spinner"` or `"bar"`) |
|
|
82
70
|
|
|
83
71
|
**StorageAdapter interface:**
|
|
84
72
|
|
|
@@ -192,15 +180,7 @@ import "@simplysm/solid/tailwind.css";
|
|
|
192
180
|
|
|
193
181
|
## Providers
|
|
194
182
|
|
|
195
|
-
- [`
|
|
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
|
|
202
|
-
- [`ServiceClientProvider`](docs/providers.md#serviceclientprovider) - WebSocket RPC client provider (`useServiceClient`)
|
|
203
|
-
- [`SharedDataProvider`](docs/providers.md#shareddataprovider) - Server-side data subscription provider (`useSharedData`)
|
|
183
|
+
- [`InitializeProvider`](docs/providers.md#initializeprovider) - Main provider wrapping all providers (the only exported provider component)
|
|
204
184
|
|
|
205
185
|
## Styling
|
|
206
186
|
|
|
@@ -1,30 +1,59 @@
|
|
|
1
1
|
import { type Accessor, type JSX } from "solid-js";
|
|
2
|
+
/** 다이얼로그 기본 설정 */
|
|
2
3
|
export interface DialogDefaults {
|
|
4
|
+
/** ESC 키로 닫기 허용 */
|
|
3
5
|
closeOnEscape?: boolean;
|
|
6
|
+
/** 백드롭 클릭으로 닫기 허용 */
|
|
4
7
|
closeOnBackdrop?: boolean;
|
|
5
8
|
}
|
|
9
|
+
/** 다이얼로그 기본 설정 Context */
|
|
6
10
|
export declare const DialogDefaultsContext: import("solid-js").Context<Accessor<DialogDefaults> | undefined>;
|
|
11
|
+
/** 프로그래매틱 다이얼로그 옵션 */
|
|
7
12
|
export interface DialogShowOptions {
|
|
13
|
+
/** 다이얼로그 제목 */
|
|
8
14
|
title: string;
|
|
15
|
+
/** 헤더 숨김 */
|
|
9
16
|
hideHeader?: boolean;
|
|
17
|
+
/** 닫기 버튼 표시 */
|
|
10
18
|
closable?: boolean;
|
|
19
|
+
/** 백드롭 클릭으로 닫기 */
|
|
11
20
|
closeOnBackdrop?: boolean;
|
|
21
|
+
/** ESC 키로 닫기 */
|
|
12
22
|
closeOnEscape?: boolean;
|
|
23
|
+
/** 크기 조절 가능 */
|
|
13
24
|
resizable?: boolean;
|
|
25
|
+
/** 드래그 이동 가능 */
|
|
14
26
|
movable?: boolean;
|
|
27
|
+
/** 플로팅 모드 (우하단 고정) */
|
|
15
28
|
float?: boolean;
|
|
29
|
+
/** 전체 화면 채우기 */
|
|
16
30
|
fill?: boolean;
|
|
31
|
+
/** 초기 너비 (px) */
|
|
17
32
|
width?: number;
|
|
33
|
+
/** 초기 높이 (px) */
|
|
18
34
|
height?: number;
|
|
35
|
+
/** 최소 너비 (px) */
|
|
19
36
|
minWidth?: number;
|
|
37
|
+
/** 최소 높이 (px) */
|
|
20
38
|
minHeight?: number;
|
|
39
|
+
/** 플로팅 위치 */
|
|
21
40
|
position?: "bottom-right" | "top-right";
|
|
41
|
+
/** 헤더 커스텀 스타일 */
|
|
22
42
|
headerStyle?: JSX.CSSProperties | string;
|
|
43
|
+
/** 닫기 전 확인 함수 (false 반환 시 닫기 취소) */
|
|
23
44
|
canDeactivate?: () => boolean;
|
|
24
45
|
}
|
|
46
|
+
/** 프로그래매틱 다이얼로그 Context 값 */
|
|
25
47
|
export interface DialogContextValue {
|
|
48
|
+
/** 다이얼로그를 열고, 닫힐 때까지 대기하여 결과를 반환 */
|
|
26
49
|
show<T = undefined>(factory: () => JSX.Element, options: DialogShowOptions): Promise<T | undefined>;
|
|
27
50
|
}
|
|
51
|
+
/** 프로그래매틱 다이얼로그 Context */
|
|
28
52
|
export declare const DialogContext: import("solid-js").Context<DialogContextValue | undefined>;
|
|
53
|
+
/**
|
|
54
|
+
* 프로그래매틱 다이얼로그에 접근하는 훅
|
|
55
|
+
*
|
|
56
|
+
* @throws DialogProvider가 없으면 에러 발생
|
|
57
|
+
*/
|
|
29
58
|
export declare function useDialog(): DialogContextValue;
|
|
30
59
|
//# sourceMappingURL=DialogContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogContext.d.ts","sourceRoot":"","sources":["../../../src/components/disclosure/DialogContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,qBAAqB,kEAA4C,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,cAAc,GAAG,WAAW,CAAC;IACxC,WAAW,CAAC,EAAE,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,CAAC,GAAG,SAAS,EAChB,OAAO,EAAE,MAAM,GAAG,CAAC,OAAO,EAC1B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,4DAAsC,CAAC;AAEjE,wBAAgB,SAAS,IAAI,kBAAkB,CAI9C"}
|
|
1
|
+
{"version":3,"file":"DialogContext.d.ts","sourceRoot":"","sources":["../../../src/components/disclosure/DialogContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAE9E,kBAAkB;AAClB,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qBAAqB;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,0BAA0B;AAC1B,eAAO,MAAM,qBAAqB,kEAA4C,CAAC;AAE/E,sBAAsB;AACtB,MAAM,WAAW,iBAAiB;IAChC,eAAe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kBAAkB;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,QAAQ,CAAC,EAAE,cAAc,GAAG,WAAW,CAAC;IACxC,iBAAiB;IACjB,WAAW,CAAC,EAAE,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC;IACzC,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;CAC/B;AAED,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,IAAI,CAAC,CAAC,GAAG,SAAS,EAChB,OAAO,EAAE,MAAM,GAAG,CAAC,OAAO,EAC1B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;CAC3B;AAED,2BAA2B;AAC3B,eAAO,MAAM,aAAa,4DAAsC,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,CAI9C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/disclosure/DialogContext.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,eAAe,kBAA2C;
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe,kBAA2C;AAW5D,MAAM,wBAAwB,cAAwC;AAgDtE,MAAM,gBAAgB,cAAkC;AAOxD,SAAS,YAAgC;AAC9C,QAAM,MAAM,WAAW,aAAa;AACpC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,kHAA4C;AACtE,SAAO;AACT;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 다이얼로그 인스턴스 (프로그래매틱 다이얼로그 내부에서 사용)
|
|
3
|
+
*/
|
|
1
4
|
export interface DialogInstance<TResult> {
|
|
5
|
+
/** 다이얼로그 닫기 (result는 show()의 Promise로 전달) */
|
|
2
6
|
close: (result?: TResult) => void;
|
|
3
7
|
}
|
|
8
|
+
/** 다이얼로그 인스턴스 Context */
|
|
4
9
|
export declare const DialogInstanceContext: import("solid-js").Context<DialogInstance<unknown> | undefined>;
|
|
10
|
+
/**
|
|
11
|
+
* 다이얼로그 인스턴스에 접근하는 훅
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* DialogProvider.show()로 열린 다이얼로그 내부에서만 값이 존재한다.
|
|
15
|
+
* Provider 외부에서 호출하면 undefined를 반환한다.
|
|
16
|
+
*
|
|
17
|
+
* @returns DialogInstance 또는 undefined (Provider 외부)
|
|
18
|
+
*/
|
|
5
19
|
export declare function useDialogInstance<TResult = undefined>(): DialogInstance<TResult> | undefined;
|
|
6
20
|
//# sourceMappingURL=DialogInstanceContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogInstanceContext.d.ts","sourceRoot":"","sources":["../../../src/components/disclosure/DialogInstanceContext.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc,CAAC,OAAO;IACrC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,qBAAqB,iEAA2C,CAAC;AAE9E,wBAAgB,iBAAiB,CAAC,OAAO,GAAG,SAAS,KAAK,cAAc,CAAC,OAAO,CAAC,GAAG,SAAS,CAE5F"}
|
|
1
|
+
{"version":3,"file":"DialogInstanceContext.d.ts","sourceRoot":"","sources":["../../../src/components/disclosure/DialogInstanceContext.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO;IACrC,6CAA6C;IAC7C,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAED,yBAAyB;AACzB,eAAO,MAAM,qBAAqB,iEAA2C,CAAC;AAE9E;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAG,SAAS,KAAK,cAAc,CAAC,OAAO,CAAC,GAAG,SAAS,CAE5F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/disclosure/DialogInstanceContext.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,eAAe,kBAAkB;
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe,kBAAkB;AAWnC,MAAM,wBAAwB,cAAuC;AAWrE,SAAS,oBAA8E;AAC5F,SAAO,WAAW,qBAAqB;AACzC;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
import { type Accessor } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* Busy 오버레이 표시 방식
|
|
4
|
+
* - `spinner`: 전체 화면 스피너
|
|
5
|
+
* - `bar`: 상단 프로그레스 바
|
|
6
|
+
*/
|
|
2
7
|
export type BusyVariant = "spinner" | "bar";
|
|
8
|
+
/**
|
|
9
|
+
* Busy 오버레이 Context 값
|
|
10
|
+
*/
|
|
3
11
|
export interface BusyContextValue {
|
|
12
|
+
/** 현재 표시 방식 */
|
|
4
13
|
variant: Accessor<BusyVariant>;
|
|
14
|
+
/** 오버레이 표시 (중첩 호출 가능, 호출 횟수만큼 hide 필요) */
|
|
5
15
|
show: (message?: string) => void;
|
|
16
|
+
/** 오버레이 숨김 (모든 show에 대응하는 hide 호출 후 실제 숨김) */
|
|
6
17
|
hide: () => void;
|
|
18
|
+
/** 프로그레스 바 진행률 설정 (0~100, undefined면 indeterminate) */
|
|
7
19
|
setProgress: (percent: number | undefined) => void;
|
|
8
20
|
}
|
|
21
|
+
/** Busy 오버레이 Context */
|
|
9
22
|
export declare const BusyContext: import("solid-js").Context<BusyContextValue | undefined>;
|
|
23
|
+
/**
|
|
24
|
+
* Busy 오버레이에 접근하는 훅
|
|
25
|
+
*
|
|
26
|
+
* @throws BusyProvider가 없으면 에러 발생
|
|
27
|
+
*/
|
|
10
28
|
export declare function useBusy(): BusyContextValue;
|
|
11
29
|
//# sourceMappingURL=BusyContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BusyContext.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/busy/BusyContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACpD;AAED,eAAO,MAAM,WAAW,0DAAoC,CAAC;AAE7D,wBAAgB,OAAO,IAAI,gBAAgB,CAM1C"}
|
|
1
|
+
{"version":3,"file":"BusyContext.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/busy/BusyContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpE;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,eAAe;IACf,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,0CAA0C;IAC1C,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,8CAA8C;IAC9C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,uDAAuD;IACvD,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACpD;AAED,wBAAwB;AACxB,eAAO,MAAM,WAAW,0DAAoC,CAAC;AAE7D;;;;GAIG;AACH,wBAAgB,OAAO,IAAI,gBAAgB,CAM1C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/feedback/busy/BusyContext.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,eAAe,kBAAiC;
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe,kBAAiC;AAwBlD,MAAM,cAAc,cAAgC;AAOpD,SAAS,UAA4B;AAC1C,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8GAAwC;AAAA,EAC1D;AACA,SAAO;AACT;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { type ParentComponent } from "solid-js";
|
|
2
2
|
import { type BusyVariant } from "./BusyContext";
|
|
3
|
+
/** BusyProvider 설정 */
|
|
3
4
|
export interface BusyProviderProps {
|
|
5
|
+
/** 표시 방식 (기본값: `"spinner"`) */
|
|
4
6
|
variant?: BusyVariant;
|
|
5
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Busy 오버레이 Provider
|
|
10
|
+
*
|
|
11
|
+
* @remarks
|
|
12
|
+
* - show/hide는 중첩 호출 가능 (내부 카운터로 관리)
|
|
13
|
+
* - Portal로 렌더링하여 항상 최상위에 표시
|
|
14
|
+
* - 독립적으로 동작 (다른 Provider 의존성 없음)
|
|
15
|
+
*/
|
|
6
16
|
export declare const BusyProvider: ParentComponent<BusyProviderProps>;
|
|
7
17
|
//# sourceMappingURL=BusyProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BusyProvider.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/busy/BusyProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,UAAU,CAAC;AAG9D,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAKrF,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,iBAAiB,CA6C3D,CAAC"}
|
|
1
|
+
{"version":3,"file":"BusyProvider.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/busy/BusyProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,UAAU,CAAC;AAG9D,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAKrF,sBAAsB;AACtB,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,iBAAiB,CA6C3D,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/feedback/busy/BusyProvider.tsx"],
|
|
4
|
-
"mappings": ";;AAAA,SAA+BA,oBAAoB;AACnD,SAASC,cAAc;AACvB,OAAOC,UAAU;AACjB,SAASC,mBAA4D;AACrE,SAASC,qBAAqB;AAE9B,MAAMC,eAAeH,KAAK,sBAAsB,qBAAqB,iBAAiB;
|
|
4
|
+
"mappings": ";;AAAA,SAA+BA,oBAAoB;AACnD,SAASC,cAAc;AACvB,OAAOC,UAAU;AACjB,SAASC,mBAA4D;AACrE,SAASC,qBAAqB;AAE9B,MAAMC,eAAeH,KAAK,sBAAsB,qBAAqB,iBAAiB;AAgB/E,MAAMI,eAAoDC,WAAU;AACzE,QAAM,CAACC,WAAWC,YAAY,IAAIT,aAAa,CAAC;AAChD,QAAM,CAACU,SAASC,UAAU,IAAIX,aAAiC;AAC/D,QAAM,CAACY,UAAUC,WAAW,IAAIb,aAAiC;AAEjE,QAAMc,UAAUA,MAAmBP,MAAMO,WAAW;AAEpD,QAAMC,OAAQC,SAAuB;AACnCP,iBAAcQ,OAAMA,IAAI,CAAC;AACzB,QAAID,QAAQE,QAAW;AACrBP,iBAAWK,GAAG;IAChB;EACF;AAEA,QAAMG,OAAOA,MAAY;AACvB,UAAMC,WAAWC,KAAKC,IAAI,GAAGd,UAAU,IAAI,CAAC;AAC5CC,iBAAaW,QAAQ;AACrB,QAAIA,YAAY,GAAG;AACjBT,iBAAWO,MAAS;AACpBL,kBAAYK,MAAS;IACvB;EACF;AAEA,QAAMK,eAAiC;IACrCT;IACAC;IACAI;IACAN,aAAcW,aAAgCX,YAAYW,OAAO;EACnE;AAEA,SAAAC,kBACGtB,YAAYuB,UAAQ;IAACC,OAAOJ;IAAY,IAAAK,WAAA;AAAA,aAAA,CAAAC,OAAA,MACtCtB,MAAMqB,QAAQ,GAAAH,kBACdxB,QAAM;QAAA,IAAA2B,WAAA;AAAA,iBAAAH,kBACJrB,eAAa;YAAA,IACZ0B,OAAI;AAAA,qBAAEtB,UAAU,IAAI;YAAC;YAAA,IACrBM,UAAO;AAAA,qBAAEA,QAAQ;YAAC;YAAA,IAClBJ,UAAO;AAAA,qBAAEA,QAAQ;YAAC;YAAA,IAClBqB,kBAAe;AAAA,qBAAEnB,SAAS;YAAC;YAAA,SACpBP;YAAY,IACnB2B,QAAK;AAAA,qBAAE;gBAAE,kBAAkBxB,UAAU,IAAI,IAAI,SAAS;cAAO;YAAC;UAAA,CAAA;QAAA;MAAA,CAAA,CAAA;IAAA;EAAA,CAAA;AAKxE;",
|
|
5
5
|
"names": ["createSignal", "Portal", "clsx", "BusyContext", "BusyContainer", "overlayClass", "BusyProvider", "props", "busyCount", "setBusyCount", "message", "setMessage", "progress", "setProgress", "variant", "show", "msg", "c", "undefined", "hide", "newCount", "Math", "max", "contextValue", "percent", "_$createComponent", "Provider", "value", "children", "_$memo", "busy", "progressPercent", "style"]
|
|
6
6
|
}
|
|
@@ -1,24 +1,47 @@
|
|
|
1
1
|
import { type Accessor } from "solid-js";
|
|
2
|
+
/** 알림 테마 */
|
|
2
3
|
export type NotificationTheme = "info" | "success" | "warning" | "danger";
|
|
4
|
+
/** 알림 액션 버튼 */
|
|
3
5
|
export interface NotificationAction {
|
|
6
|
+
/** 버튼 텍스트 */
|
|
4
7
|
label: string;
|
|
8
|
+
/** 클릭 핸들러 */
|
|
5
9
|
onClick: () => void;
|
|
6
10
|
}
|
|
11
|
+
/** 알림 항목 */
|
|
7
12
|
export interface NotificationItem {
|
|
13
|
+
/** 고유 식별자 */
|
|
8
14
|
id: string;
|
|
15
|
+
/** 테마 (info, success, warning, danger) */
|
|
9
16
|
theme: NotificationTheme;
|
|
17
|
+
/** 알림 제목 */
|
|
10
18
|
title: string;
|
|
19
|
+
/** 알림 메시지 (선택) */
|
|
11
20
|
message?: string;
|
|
21
|
+
/** 액션 버튼 (선택) */
|
|
12
22
|
action?: NotificationAction;
|
|
23
|
+
/** 생성 시각 */
|
|
13
24
|
createdAt: Date;
|
|
25
|
+
/** 읽음 여부 */
|
|
14
26
|
read: boolean;
|
|
15
27
|
}
|
|
28
|
+
/** 알림 생성 옵션 */
|
|
16
29
|
export interface NotificationOptions {
|
|
30
|
+
/** 알림에 표시할 액션 버튼 */
|
|
17
31
|
action?: NotificationAction;
|
|
18
32
|
}
|
|
33
|
+
/** 알림 수정 옵션 */
|
|
19
34
|
export interface NotificationUpdateOptions {
|
|
35
|
+
/** true면 읽은 알림을 다시 읽지 않음 상태로 변경 (배너 재표시) */
|
|
20
36
|
renotify?: boolean;
|
|
21
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* 알림 시스템 Context 값
|
|
40
|
+
*
|
|
41
|
+
* @remarks
|
|
42
|
+
* 알림 생성, 수정, 삭제 및 읽음 관리를 위한 메서드 제공.
|
|
43
|
+
* 최대 50개까지 유지되며 초과 시 오래된 항목부터 제거.
|
|
44
|
+
*/
|
|
22
45
|
export interface NotificationContextValue {
|
|
23
46
|
items: Accessor<NotificationItem[]>;
|
|
24
47
|
unreadCount: Accessor<number>;
|
|
@@ -35,6 +58,12 @@ export interface NotificationContextValue {
|
|
|
35
58
|
dismissBanner: () => void;
|
|
36
59
|
clear: () => void;
|
|
37
60
|
}
|
|
61
|
+
/** 알림 시스템 Context */
|
|
38
62
|
export declare const NotificationContext: import("solid-js").Context<NotificationContextValue | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* 알림 시스템에 접근하는 훅
|
|
65
|
+
*
|
|
66
|
+
* @throws NotificationProvider가 없으면 에러 발생
|
|
67
|
+
*/
|
|
39
68
|
export declare function useNotification(): NotificationContextValue;
|
|
40
69
|
//# sourceMappingURL=NotificationContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationContext.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/notification/NotificationContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IAEvC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACpC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,YAAY,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAGrD,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IACjF,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IACpF,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IACpF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IAGnF,GAAG,EAAE,CAAC,OAAO,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,EACpC,MAAM,CAAC,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAGlC,MAAM,EAAE,CACN,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,EAClF,OAAO,CAAC,EAAE,yBAAyB,KAChC,IAAI,CAAC;IAGV,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAG7B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,kEAA4C,CAAC;AAE7E,wBAAgB,eAAe,IAAI,wBAAwB,CAM1D"}
|
|
1
|
+
{"version":3,"file":"NotificationContext.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/notification/NotificationContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpE,YAAY;AACZ,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1E,eAAe;AACf,MAAM,WAAW,kBAAkB;IACjC,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,YAAY;AACZ,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,KAAK,EAAE,iBAAiB,CAAC;IACzB,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,YAAY;IACZ,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY;IACZ,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAe;AACf,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,eAAe;AACf,MAAM,WAAW,yBAAyB;IACxC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IAEvC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACpC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,YAAY,EAAE,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAGrD,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IACjF,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IACpF,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IACpF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,CAAC;IAGnF,GAAG,EAAE,CAAC,OAAO,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,EACpC,MAAM,CAAC,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAGlC,MAAM,EAAE,CACN,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,EAClF,OAAO,CAAC,EAAE,yBAAyB,KAChC,IAAI,CAAC;IAGV,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAG7B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,qBAAqB;AACrB,eAAO,MAAM,mBAAmB,kEAA4C,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,wBAAwB,CAM1D"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/feedback/notification/NotificationContext.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,eAAe,kBAAiC;
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe,kBAAiC;AAsFlD,MAAM,sBAAsB,cAAwC;AAOpE,SAAS,kBAA4C;AAC1D,QAAM,UAAU,WAAW,mBAAmB;AAC9C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8HAAwD;AAAA,EAC1E;AACA,SAAO;AACT;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import { type ParentComponent } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* 알림 시스템 Provider
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* - 최대 50개 알림 유지 (초과 시 오래된 항목 자동 제거)
|
|
7
|
+
* - 읽지 않은 최신 알림을 배너로 표시
|
|
8
|
+
* - 스크린 리더용 aria-live region 포함
|
|
9
|
+
* - LoggerProvider가 있으면 에러 알림을 로거에도 기록
|
|
10
|
+
*/
|
|
2
11
|
export declare const NotificationProvider: ParentComponent;
|
|
3
12
|
//# sourceMappingURL=NotificationProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationProvider.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/notification/NotificationProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAkC,MAAM,UAAU,CAAC;AAahF,eAAO,MAAM,oBAAoB,EAAE,eAuJlC,CAAC"}
|
|
1
|
+
{"version":3,"file":"NotificationProvider.d.ts","sourceRoot":"","sources":["../../../../src/components/feedback/notification/NotificationProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAkC,MAAM,UAAU,CAAC;AAahF;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,eAuJlC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/feedback/notification/NotificationProvider.tsx"],
|
|
4
|
-
"mappings": ";;;;;AAAA,SAA+BA,cAAcC,YAAYC,YAAY;AACrE,SACEC,2BAMK;AACP,SAASC,iBAAiB;AAE1B,MAAMC,YAAY;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["createSignal", "createMemo", "Show", "NotificationContext", "useLogger", "MAX_ITEMS", "NotificationProvider", "props", "logger", "items", "setItems", "dismissedBannerId", "setDismissedBannerId", "unreadItems", "filter", "i", "read", "unreadCount", "length", "latestUnread", "latest", "at", "undefined", "id", "addNotification", "theme", "title", "message", "options", "crypto", "randomUUID", "newItem", "action", "createdAt", "Date", "prev", "updated", "slice", "info", "success", "warning", "danger", "tryFn", "fn", "header", "err", "Error", "error", "stack", "update", "updates", "map", "item", "renotify", "remove", "markAsRead", "markAllAsRead", "dismissBanner", "clear", "contextValue", "try", "_$createComponent", "Provider", "value", "children", "_el$", "_tmpl$", "_$insert", "when", "_$memo"]
|
|
6
6
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { type LogAdapter } from "../providers/LoggerContext";
|
|
2
|
+
export interface Logger {
|
|
2
3
|
log: (...args: unknown[]) => void;
|
|
3
4
|
info: (...args: unknown[]) => void;
|
|
4
5
|
warn: (...args: unknown[]) => void;
|
|
5
6
|
error: (...args: unknown[]) => void;
|
|
7
|
+
/** LogAdapter를 나중에 주입. LoggerProvider 내부에서만 사용 가능 */
|
|
8
|
+
configure: (adapter: LogAdapter) => void;
|
|
6
9
|
}
|
|
7
10
|
export declare function useLogger(): Logger;
|
|
8
|
-
export {};
|
|
9
11
|
//# sourceMappingURL=useLogger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLogger.d.ts","sourceRoot":"","sources":["../../src/hooks/useLogger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useLogger.d.ts","sourceRoot":"","sources":["../../src/hooks/useLogger.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAI5E,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,qDAAqD;IACrD,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,SAAS,IAAI,MAAM,CA2BlC"}
|
package/dist/hooks/useLogger.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { consola } from "consola";
|
|
2
2
|
import { useLogAdapter } from "../providers/LoggerContext.js";
|
|
3
3
|
function useLogger() {
|
|
4
|
-
const
|
|
4
|
+
const loggerCtx = useLogAdapter();
|
|
5
5
|
const createLogFunction = (level) => {
|
|
6
6
|
return (...args) => {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const adapter = loggerCtx == null ? void 0 : loggerCtx.adapter();
|
|
8
|
+
if (adapter) {
|
|
9
|
+
void adapter.write(level, ...args);
|
|
9
10
|
} else {
|
|
10
11
|
consola[level](...args);
|
|
11
12
|
}
|
|
@@ -15,7 +16,13 @@ function useLogger() {
|
|
|
15
16
|
log: createLogFunction("log"),
|
|
16
17
|
info: createLogFunction("info"),
|
|
17
18
|
warn: createLogFunction("warn"),
|
|
18
|
-
error: createLogFunction("error")
|
|
19
|
+
error: createLogFunction("error"),
|
|
20
|
+
configure: (adapter) => {
|
|
21
|
+
if (!loggerCtx) {
|
|
22
|
+
throw new Error("configure()\uB294 LoggerProvider \uB0B4\uBD80\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");
|
|
23
|
+
}
|
|
24
|
+
loggerCtx.configure(adapter);
|
|
25
|
+
}
|
|
19
26
|
};
|
|
20
27
|
}
|
|
21
28
|
export {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/useLogger.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,qBAAsC;
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,qBAAsC;AAaxC,SAAS,YAAoB;AAClC,QAAM,YAAY,cAAc;AAEhC,QAAM,oBAAoB,CAAC,UAAoB;AAC7C,WAAO,IAAI,SAAoB;AAE7B,YAAM,UAAU,uCAAW;AAC3B,UAAI,SAAS;AACX,aAAK,QAAQ,MAAM,OAAO,GAAG,IAAI;AAAA,MACnC,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,IAChC,WAAW,CAAC,YAAwB;AAClC,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,oHAA8C;AAAA,MAChE;AACA,gBAAU,UAAU,OAAO;AAAA,IAC7B;AAAA,EACF;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -5,6 +5,8 @@ import { type Accessor, type Setter } from "solid-js";
|
|
|
5
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
|
+
* When the adapter changes via `useSyncStorage().configure()`, re-reads from the new adapter.
|
|
9
|
+
*
|
|
8
10
|
* @param key - Storage key for the config value
|
|
9
11
|
* @param defaultValue - Default value if no stored value exists
|
|
10
12
|
* @returns Tuple of [value accessor, value setter, ready state accessor]
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"useSyncConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useSyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAuC,MAAM,UAAU,CAAC;AAI3F;;;;;;;;;;;;;;;;;;;;;;GAsBG;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,CA4EvD"}
|
|
@@ -1,53 +1,57 @@
|
|
|
1
|
-
import { createEffect, createSignal } from "solid-js";
|
|
1
|
+
import { createEffect, createSignal, untrack } from "solid-js";
|
|
2
2
|
import { useConfig } from "../providers/ConfigContext.js";
|
|
3
3
|
import { useSyncStorage } from "../providers/SyncStorageContext.js";
|
|
4
4
|
function useSyncConfig(key, defaultValue) {
|
|
5
5
|
const config = useConfig();
|
|
6
|
-
const
|
|
6
|
+
const syncStorageCtx = useSyncStorage();
|
|
7
7
|
const prefixedKey = `${config.clientName}.${key}`;
|
|
8
8
|
const [value, setValue] = createSignal(defaultValue);
|
|
9
9
|
const [ready, setReady] = createSignal(false);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
createEffect(() => {
|
|
11
|
+
const currentAdapter = syncStorageCtx == null ? void 0 : syncStorageCtx.adapter();
|
|
12
|
+
setReady(false);
|
|
13
|
+
void (async () => {
|
|
14
|
+
if (!currentAdapter) {
|
|
15
|
+
try {
|
|
16
|
+
const stored = localStorage.getItem(prefixedKey);
|
|
17
|
+
if (stored !== null) {
|
|
18
|
+
setValue(() => JSON.parse(stored));
|
|
19
|
+
}
|
|
20
|
+
} catch {
|
|
16
21
|
}
|
|
17
|
-
|
|
22
|
+
setReady(true);
|
|
23
|
+
return;
|
|
18
24
|
}
|
|
19
|
-
setReady(true);
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
const stored = await syncStorage.getItem(prefixedKey);
|
|
24
|
-
if (stored !== null) {
|
|
25
|
-
setValue(() => JSON.parse(stored));
|
|
26
|
-
}
|
|
27
|
-
} catch {
|
|
28
25
|
try {
|
|
29
|
-
const stored =
|
|
26
|
+
const stored = await currentAdapter.getItem(prefixedKey);
|
|
30
27
|
if (stored !== null) {
|
|
31
28
|
setValue(() => JSON.parse(stored));
|
|
32
29
|
}
|
|
33
30
|
} catch {
|
|
31
|
+
try {
|
|
32
|
+
const stored = localStorage.getItem(prefixedKey);
|
|
33
|
+
if (stored !== null) {
|
|
34
|
+
setValue(() => JSON.parse(stored));
|
|
35
|
+
}
|
|
36
|
+
} catch {
|
|
37
|
+
}
|
|
38
|
+
} finally {
|
|
39
|
+
setReady(true);
|
|
34
40
|
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
void initializeFromStorage();
|
|
41
|
+
})();
|
|
42
|
+
});
|
|
40
43
|
createEffect(() => {
|
|
41
44
|
if (!ready()) return;
|
|
42
45
|
const currentValue = value();
|
|
43
46
|
const serialized = JSON.stringify(currentValue);
|
|
44
|
-
|
|
47
|
+
const currentAdapter = untrack(() => syncStorageCtx == null ? void 0 : syncStorageCtx.adapter());
|
|
48
|
+
if (!currentAdapter) {
|
|
45
49
|
localStorage.setItem(prefixedKey, serialized);
|
|
46
50
|
return;
|
|
47
51
|
}
|
|
48
52
|
void (async () => {
|
|
49
53
|
try {
|
|
50
|
-
await
|
|
54
|
+
await currentAdapter.setItem(prefixedKey, serialized);
|
|
51
55
|
} catch {
|
|
52
56
|
localStorage.setItem(prefixedKey, serialized);
|
|
53
57
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/useSyncConfig.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAqC,cAAc,
|
|
4
|
+
"mappings": "AAAA,SAAqC,cAAc,cAAc,eAAe;AAChF,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAyBxB,SAAS,cACd,KACA,cACuD;AACvD,QAAM,SAAS,UAAU;AACzB,QAAM,iBAAiB,eAAe;AACtC,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,eAAa,MAAM;AACjB,UAAM,iBAAiB,iDAAgB;AACvC,aAAS,KAAK;AAEd,UAAM,YAAY;AAChB,UAAI,CAAC,gBAAgB;AAEnB,YAAI;AACF,gBAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,cAAI,WAAW,MAAM;AACnB,qBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,UAC7C;AAAA,QACF,QAAQ;AAAA,QAER;AACA,iBAAS,IAAI;AACb;AAAA,MACF;AAGA,UAAI;AACF,cAAM,SAAS,MAAM,eAAe,QAAQ,WAAW;AACvD,YAAI,WAAW,MAAM;AACnB,mBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAEN,YAAI;AACF,gBAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,cAAI,WAAW,MAAM;AACnB,qBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,UAC7C;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF,UAAE;AACA,iBAAS,IAAI;AAAA,MACf;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AAGD,eAAa,MAAM;AACjB,QAAI,CAAC,MAAM,EAAG;AACd,UAAM,eAAe,MAAM;AAC3B,UAAM,aAAa,KAAK,UAAU,YAAY;AAG9C,UAAM,iBAAiB,QAAQ,MAAM,iDAAgB,SAAS;AAE9D,QAAI,CAAC,gBAAgB;AAEnB,mBAAa,QAAQ,aAAa,UAAU;AAC5C;AAAA,IACF;AAGA,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,eAAe,QAAQ,aAAa,UAAU;AAAA,MACtD,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
|
}
|