@moriajs/ui 0.4.34 → 0.4.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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @moriajs/ui@0.4.34 build C:\Codes\node\2026\github\moriajs\packages\ui
2
+ > @moriajs/ui@0.4.35 build C:\Codes\node\2026\github\moriajs\packages\ui
3
3
  > tsc
4
4
 
package/README.md CHANGED
@@ -6,13 +6,73 @@ A collection of premium UI components for MoriaJS apps.
6
6
 
7
7
  - **Toast**: Beautiful notifications (`toast`, `Toaster`).
8
8
  - **Modal**: Interactive modal dialogs with smooth animations.
9
+ - **Confirmation**: Imperative confirmation dialogs (`confirm`, `ConfirmationRegistry`).
9
10
  - **MoriaUI**: Aggregate export for easy discovery.
10
11
 
11
12
  ## Usage
12
13
 
14
+ ### 1. Root Setup
15
+
16
+ Mount the `Toaster` and `ConfirmationRegistry` once in your application's root layout to enable global notifications and confirmations.
17
+
18
+ ```ts
19
+ import m from 'mithril';
20
+ import { Toaster, ConfirmationRegistry } from '@moriajs/ui';
21
+
22
+ const Layout = {
23
+ view(vnode) {
24
+ return m('div', [
25
+ m(Toaster),
26
+ m(ConfirmationRegistry),
27
+ m('main', vnode.children),
28
+ ]);
29
+ }
30
+ };
31
+ ```
32
+
33
+ ### 2. Notifications
34
+
35
+ ```ts
36
+ import { toast } from '@moriajs/ui';
37
+
38
+ toast.success('Project saved!');
39
+ toast.error('Connection failed');
40
+ ```
41
+
42
+ ### 3. Confirmations (Imperative)
43
+
44
+ The `confirm()` utility returns a Promise that resolves to `true` if the user confirms, and `false` if they cancel or close the modal.
45
+
46
+ ```ts
47
+ import { confirm } from '@moriajs/ui';
48
+
49
+ async function handleDelete() {
50
+ const confirmed = await confirm({
51
+ title: 'Delete everything?',
52
+ message: 'This action is irreversible. Continue?',
53
+ confirmText: 'Yes, delete it',
54
+ cancelText: 'No, wait',
55
+ type: 'danger',
56
+ });
57
+
58
+ if (confirmed) {
59
+ // Perform deletion...
60
+ }
61
+ }
62
+ ```
63
+
64
+ ### 4. Modal (Declarative)
65
+
13
66
  ```ts
14
- import { MoriaUI } from '@moriajs/ui';
67
+ import { Modal } from '@moriajs/ui';
68
+
69
+ let isOpen = false;
15
70
 
16
- // In your Mithril component
17
- m(MoriaUI.Modal, { title: 'Hello' }, 'World');
71
+ m(Modal, {
72
+ isOpen,
73
+ title: 'Information',
74
+ onClose: () => { isOpen = false; },
75
+ }, [
76
+ m('p', 'This is a declarative modal.'),
77
+ ]);
18
78
  ```
package/dist/index.d.ts CHANGED
@@ -73,12 +73,45 @@ export interface ModalAttrs {
73
73
  * ```
74
74
  */
75
75
  export declare const Modal: m.Component<ModalAttrs>;
76
+ export interface ConfirmationOptions {
77
+ title?: string;
78
+ message: string;
79
+ confirmText?: string;
80
+ cancelText?: string;
81
+ type?: 'info' | 'warning' | 'danger';
82
+ }
83
+ /**
84
+ * Show a confirmation dialog.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * import { confirm } from '@moriajs/ui';
89
+ *
90
+ * const confirmed = await confirm({
91
+ * title: 'Delete User',
92
+ * message: 'Are you sure you want to delete this user? This action cannot be undone.',
93
+ * confirmText: 'Delete',
94
+ * type: 'danger',
95
+ * });
96
+ *
97
+ * if (confirmed) {
98
+ * // Proceed with deletion
99
+ * }
100
+ * ```
101
+ */
102
+ export declare const confirm: (options: string | ConfirmationOptions) => Promise<boolean>;
103
+ /**
104
+ * ConfirmationRegistry component.
105
+ * Mount once in your app layout to handle imperative confirmation calls.
106
+ */
107
+ export declare const ConfirmationRegistry: m.Component;
76
108
  /**
77
109
  * Aggregate of all UI components for easier discovery.
78
110
  */
79
111
  export declare const MoriaUI: {
80
112
  Toaster: m.Component<{}, {}>;
81
113
  Modal: m.Component<ModalAttrs, {}>;
114
+ ConfirmationRegistry: m.Component<{}, {}>;
82
115
  toast: {
83
116
  show(message: string, type?: ToastType, duration?: number): string;
84
117
  success(message: string, duration?: number): string;
@@ -88,5 +121,6 @@ export declare const MoriaUI: {
88
121
  dismiss(id: string): void;
89
122
  clear(): void;
90
123
  };
124
+ confirm: (options: string | ConfirmationOptions) => Promise<boolean>;
91
125
  };
92
126
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,CAAC,MAAM,SAAS,CAAC;AAIxB,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK;kBACA,MAAM,SAAQ,SAAS;qBAiBpB,MAAM,aAAa,MAAM;mBAG3B,MAAM,aAAa,MAAM;qBAGvB,MAAM,aAAa,MAAM;kBAG5B,MAAM,aAAa,MAAM;gBAG3B,MAAM;;CAWrB,CAAC;AASF;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,SAqCvB,CAAC;AAIF,MAAM,WAAW,UAAU;IACvB,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAgEzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO;;;;sBArMF,MAAM,SAAQ,SAAS;yBAiBpB,MAAM,aAAa,MAAM;uBAG3B,MAAM,aAAa,MAAM;yBAGvB,MAAM,aAAa,MAAM;sBAG5B,MAAM,aAAa,MAAM;oBAG3B,MAAM;;;CA4KrB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,CAAC,MAAM,SAAS,CAAC;AAIxB,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK;kBACA,MAAM,SAAQ,SAAS;qBAiBpB,MAAM,aAAa,MAAM;mBAG3B,MAAM,aAAa,MAAM;qBAGvB,MAAM,aAAa,MAAM;kBAG5B,MAAM,aAAa,MAAM;gBAG3B,MAAM;;CAWrB,CAAC;AASF;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,SAqCvB,CAAC;AAIF,MAAM,WAAW,UAAU;IACvB,mCAAmC;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAgEzC,CAAC;AAIF,MAAM,WAAW,mBAAmB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;CACxC;AASD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,GAAG,mBAAmB,KAAG,OAAO,CAAC,OAAO,CAY9E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,SAsEpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;sBAnUF,MAAM,SAAQ,SAAS;yBAiBpB,MAAM,aAAa,MAAM;uBAG3B,MAAM,aAAa,MAAM;yBAGvB,MAAM,aAAa,MAAM;sBAG5B,MAAM,aAAa,MAAM;oBAG3B,MAAM;;;uBAyMW,MAAM,GAAG,mBAAmB,KAAG,OAAO,CAAC,OAAO,CAAC;CAmG/E,CAAC"}
package/dist/index.js CHANGED
@@ -173,12 +173,116 @@ export const Modal = {
173
173
  ]));
174
174
  },
175
175
  };
176
+ const confirmations = [];
177
+ /**
178
+ * Show a confirmation dialog.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * import { confirm } from '@moriajs/ui';
183
+ *
184
+ * const confirmed = await confirm({
185
+ * title: 'Delete User',
186
+ * message: 'Are you sure you want to delete this user? This action cannot be undone.',
187
+ * confirmText: 'Delete',
188
+ * type: 'danger',
189
+ * });
190
+ *
191
+ * if (confirmed) {
192
+ * // Proceed with deletion
193
+ * }
194
+ * ```
195
+ */
196
+ export const confirm = (options) => {
197
+ const config = typeof options === 'string' ? { message: options } : options;
198
+ const id = `confirm-${Date.now()}-${Math.random().toString(36).slice(2)}`;
199
+ return new Promise((resolve) => {
200
+ confirmations.push({
201
+ ...config,
202
+ id,
203
+ resolve,
204
+ });
205
+ m.redraw();
206
+ });
207
+ };
208
+ /**
209
+ * ConfirmationRegistry component.
210
+ * Mount once in your app layout to handle imperative confirmation calls.
211
+ */
212
+ export const ConfirmationRegistry = {
213
+ view() {
214
+ return m('.moria-confirmation-registry', confirmations.map((c) => m(Modal, {
215
+ isOpen: true,
216
+ title: c.title || 'Confirm',
217
+ onClose: () => {
218
+ const index = confirmations.findIndex((conf) => conf.id === c.id);
219
+ if (index !== -1) {
220
+ confirmations.splice(index, 1);
221
+ c.resolve(false);
222
+ m.redraw();
223
+ }
224
+ },
225
+ }, [
226
+ m('p', { style: { marginBottom: '1.5rem', color: '#374151' } }, c.message),
227
+ m('.moria-modal-actions', {
228
+ style: {
229
+ display: 'flex',
230
+ justifyContent: 'flex-end',
231
+ gap: '0.75rem',
232
+ }
233
+ }, [
234
+ m('button', {
235
+ style: {
236
+ padding: '0.5rem 1rem',
237
+ borderRadius: '0.375rem',
238
+ border: '1px solid #d1d5db',
239
+ background: '#fff',
240
+ color: '#374151',
241
+ cursor: 'pointer',
242
+ fontSize: '0.875rem',
243
+ fontWeight: '500',
244
+ },
245
+ onclick: () => {
246
+ const index = confirmations.findIndex((conf) => conf.id === c.id);
247
+ if (index !== -1) {
248
+ confirmations.splice(index, 1);
249
+ c.resolve(false);
250
+ m.redraw();
251
+ }
252
+ }
253
+ }, c.cancelText || 'Cancel'),
254
+ m('button', {
255
+ style: {
256
+ padding: '0.5rem 1rem',
257
+ borderRadius: '0.375rem',
258
+ border: 'none',
259
+ background: c.type === 'danger' ? '#dc2626' : (c.type === 'warning' ? '#d97706' : '#2563eb'),
260
+ color: '#fff',
261
+ cursor: 'pointer',
262
+ fontSize: '0.875rem',
263
+ fontWeight: '500',
264
+ },
265
+ onclick: () => {
266
+ const index = confirmations.findIndex((conf) => conf.id === c.id);
267
+ if (index !== -1) {
268
+ confirmations.splice(index, 1);
269
+ c.resolve(true);
270
+ m.redraw();
271
+ }
272
+ }
273
+ }, c.confirmText || 'Confirm'),
274
+ ])
275
+ ])));
276
+ }
277
+ };
176
278
  /**
177
279
  * Aggregate of all UI components for easier discovery.
178
280
  */
179
281
  export const MoriaUI = {
180
282
  Toaster,
181
283
  Modal,
284
+ ConfirmationRegistry,
182
285
  toast,
286
+ confirm,
183
287
  };
184
288
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moriajs/ui",
3
- "version": "0.4.34",
3
+ "version": "0.4.35",
4
4
  "type": "module",
5
5
  "description": "MoriaJS UI — Toaster, modals, and component primitives for Mithril.js",
6
6
  "main": "./dist/index.js",
package/src/index.ts CHANGED
@@ -229,12 +229,140 @@ export const Modal: m.Component<ModalAttrs> = {
229
229
  },
230
230
  };
231
231
 
232
+ // ─── Confirmation ──────────────────────────────────────
233
+
234
+ export interface ConfirmationOptions {
235
+ title?: string;
236
+ message: string;
237
+ confirmText?: string;
238
+ cancelText?: string;
239
+ type?: 'info' | 'warning' | 'danger';
240
+ }
241
+
242
+ interface Confirmation extends ConfirmationOptions {
243
+ id: string;
244
+ resolve: (value: boolean) => void;
245
+ }
246
+
247
+ const confirmations: Confirmation[] = [];
248
+
249
+ /**
250
+ * Show a confirmation dialog.
251
+ *
252
+ * @example
253
+ * ```ts
254
+ * import { confirm } from '@moriajs/ui';
255
+ *
256
+ * const confirmed = await confirm({
257
+ * title: 'Delete User',
258
+ * message: 'Are you sure you want to delete this user? This action cannot be undone.',
259
+ * confirmText: 'Delete',
260
+ * type: 'danger',
261
+ * });
262
+ *
263
+ * if (confirmed) {
264
+ * // Proceed with deletion
265
+ * }
266
+ * ```
267
+ */
268
+ export const confirm = (options: string | ConfirmationOptions): Promise<boolean> => {
269
+ const config: ConfirmationOptions = typeof options === 'string' ? { message: options } : options;
270
+ const id = `confirm-${Date.now()}-${Math.random().toString(36).slice(2)}`;
271
+
272
+ return new Promise((resolve) => {
273
+ confirmations.push({
274
+ ...config,
275
+ id,
276
+ resolve,
277
+ });
278
+ m.redraw();
279
+ });
280
+ };
281
+
282
+ /**
283
+ * ConfirmationRegistry component.
284
+ * Mount once in your app layout to handle imperative confirmation calls.
285
+ */
286
+ export const ConfirmationRegistry: m.Component = {
287
+ view() {
288
+ return m(
289
+ '.moria-confirmation-registry',
290
+ confirmations.map((c) =>
291
+ m(Modal, {
292
+ isOpen: true,
293
+ title: c.title || 'Confirm',
294
+ onClose: () => {
295
+ const index = confirmations.findIndex((conf) => conf.id === c.id);
296
+ if (index !== -1) {
297
+ confirmations.splice(index, 1);
298
+ c.resolve(false);
299
+ m.redraw();
300
+ }
301
+ },
302
+ }, [
303
+ m('p', { style: { marginBottom: '1.5rem', color: '#374151' } }, c.message),
304
+ m('.moria-modal-actions', {
305
+ style: {
306
+ display: 'flex',
307
+ justifyContent: 'flex-end',
308
+ gap: '0.75rem',
309
+ }
310
+ }, [
311
+ m('button', {
312
+ style: {
313
+ padding: '0.5rem 1rem',
314
+ borderRadius: '0.375rem',
315
+ border: '1px solid #d1d5db',
316
+ background: '#fff',
317
+ color: '#374151',
318
+ cursor: 'pointer',
319
+ fontSize: '0.875rem',
320
+ fontWeight: '500',
321
+ },
322
+ onclick: () => {
323
+ const index = confirmations.findIndex((conf) => conf.id === c.id);
324
+ if (index !== -1) {
325
+ confirmations.splice(index, 1);
326
+ c.resolve(false);
327
+ m.redraw();
328
+ }
329
+ }
330
+ }, c.cancelText || 'Cancel'),
331
+ m('button', {
332
+ style: {
333
+ padding: '0.5rem 1rem',
334
+ borderRadius: '0.375rem',
335
+ border: 'none',
336
+ background: c.type === 'danger' ? '#dc2626' : (c.type === 'warning' ? '#d97706' : '#2563eb'),
337
+ color: '#fff',
338
+ cursor: 'pointer',
339
+ fontSize: '0.875rem',
340
+ fontWeight: '500',
341
+ },
342
+ onclick: () => {
343
+ const index = confirmations.findIndex((conf) => conf.id === c.id);
344
+ if (index !== -1) {
345
+ confirmations.splice(index, 1);
346
+ c.resolve(true);
347
+ m.redraw();
348
+ }
349
+ }
350
+ }, c.confirmText || 'Confirm'),
351
+ ])
352
+ ])
353
+ )
354
+ );
355
+ }
356
+ };
357
+
232
358
  /**
233
359
  * Aggregate of all UI components for easier discovery.
234
360
  */
235
361
  export const MoriaUI = {
236
362
  Toaster,
237
363
  Modal,
364
+ ConfirmationRegistry,
238
365
  toast,
366
+ confirm,
239
367
  };
240
368