@joewinke/jatui 0.2.2 → 0.2.4

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 (33) hide show
  1. package/dist/components/CommandPalette.svelte +1 -1
  2. package/dist/components/ConfirmDialog.svelte +1 -1
  3. package/dist/components/InputDialog.svelte +1 -1
  4. package/dist/components/Tabs.svelte +6 -6
  5. package/dist/components/shell/Sidebar.svelte +1 -1
  6. package/dist/components/shell/Sidebar.svelte.d.ts +1 -1
  7. package/dist/components/shell/shell.js +63 -60
  8. package/dist/components/table/DataTable.svelte +10 -1
  9. package/dist/components/toast/ToastHost.svelte +1 -1
  10. package/dist/components/toast/ToastItem.svelte +1 -1
  11. package/dist/components/toast/ToastItem.svelte.d.ts +1 -1
  12. package/dist/dnd/createDndBoard.js +329 -0
  13. package/dist/dnd/index.d.ts +2 -2
  14. package/dist/dnd/index.js +1 -1
  15. package/dist/dnd/types.d.ts +9 -0
  16. package/dist/index.d.ts +8 -8
  17. package/dist/index.js +4 -4
  18. package/dist/showcase/AnimatedBeam.svelte +13 -10
  19. package/dist/stores/commandPalette.js +116 -0
  20. package/dist/stores/confirmDialog.js +37 -0
  21. package/dist/stores/inputDialog.js +37 -0
  22. package/dist/stores/toast.js +53 -0
  23. package/package.json +2 -2
  24. package/dist/dnd/createDndBoard.svelte.js +0 -217
  25. package/dist/stores/commandPalette.svelte.js +0 -82
  26. package/dist/stores/confirmDialog.svelte.js +0 -31
  27. package/dist/stores/inputDialog.svelte.js +0 -32
  28. package/dist/stores/toast.svelte.js +0 -33
  29. /package/dist/dnd/{createDndBoard.svelte.d.ts → createDndBoard.d.ts} +0 -0
  30. /package/dist/stores/{commandPalette.svelte.d.ts → commandPalette.d.ts} +0 -0
  31. /package/dist/stores/{confirmDialog.svelte.d.ts → confirmDialog.d.ts} +0 -0
  32. /package/dist/stores/{inputDialog.svelte.d.ts → inputDialog.d.ts} +0 -0
  33. /package/dist/stores/{toast.svelte.d.ts → toast.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -14,9 +14,9 @@ export { default as SidebarUserFooter } from './components/SidebarUserFooter.sve
14
14
  export { default as TaskTypeIcon } from './components/TaskTypeIcon.svelte';
15
15
  // Components — from JAT IDE
16
16
  export { default as ConfirmDialog } from './components/ConfirmDialog.svelte';
17
- export { showConfirm, confirmDialog, cancelDialog, getPending } from './stores/confirmDialog.svelte';
17
+ export { showConfirm, confirmDialog, cancelDialog, getPending } from './stores/confirmDialog';
18
18
  export { default as InputDialog } from './components/InputDialog.svelte';
19
- export { showInput, submitInput, cancelInput, getPendingInput } from './stores/inputDialog.svelte';
19
+ export { showInput, submitInput, cancelInput, getPendingInput } from './stores/inputDialog';
20
20
  export { default as SearchDropdown } from './components/SearchDropdown.svelte';
21
21
  export { default as FilterDropdown } from './components/FilterDropdown.svelte';
22
22
  export { default as ContextMenu } from './components/ContextMenu.svelte';
@@ -165,7 +165,7 @@ export { play as playSound, registerSound, isSoundEnabled, setSoundEnabled } fro
165
165
  export { splitText } from './utils/splitText';
166
166
  // Toast system
167
167
  export { default as ToastHost } from './components/toast/ToastHost.svelte';
168
- export { showToast, dismissToast, getToasts } from './stores/toast.svelte';
168
+ export { showToast, dismissToast, getToasts } from './stores/toast';
169
169
  // Loading & progress family
170
170
  export { default as Skeleton } from './components/Skeleton.svelte';
171
171
  export { default as ProgressBar } from './components/progress/ProgressBar.svelte';
@@ -174,7 +174,7 @@ export { default as Steps } from './components/progress/Steps.svelte';
174
174
  // Navigation & overlays
175
175
  export { default as Tabs } from './components/Tabs.svelte';
176
176
  export { default as CommandPalette } from './components/CommandPalette.svelte';
177
- export { commandPalette } from './stores/commandPalette.svelte';
177
+ export { commandPalette } from './stores/commandPalette';
178
178
  // Micro primitives
179
179
  export { default as AnimatedNumber } from './components/AnimatedNumber.svelte';
180
180
  export { default as CopyButton } from './components/CopyButton.svelte';
@@ -112,6 +112,19 @@
112
112
  pathLength > 0 ? `${pathLength * dashLength} ${pathLength * (1 - dashLength)}` : '0 1'
113
113
  );
114
114
  const dashOffset = $derived(pathLength > 0 ? (reverse ? -pathLength : pathLength) : 0);
115
+
116
+ // Per-instance keyframes go through a DOM style element created in JS.
117
+ // Do NOT inject them as an html-embedded style-tag string in the markup
118
+ // (and avoid even writing that tag literally in comments): tag-scanning
119
+ // preprocessors extract it as CSS, the uid placeholder fails PostCSS
120
+ // ("Unknown word uid"), and the consumer's whole build dies.
121
+ $effect(() => {
122
+ if (pathLength <= 0 || reducedMotion) return;
123
+ const styleEl = document.createElement('style');
124
+ styleEl.textContent = `@keyframes beam-sweep-${uid} { 0% { stroke-dashoffset: ${dashOffset}; } 100% { stroke-dashoffset: ${-dashOffset}; } }`;
125
+ document.head.appendChild(styleEl);
126
+ return () => styleEl.remove();
127
+ });
115
128
  </script>
116
129
 
117
130
  <!-- svelte-ignore a11y_aria_hidden_on_focusable -->
@@ -171,13 +184,3 @@
171
184
  pointer-events: none;
172
185
  }
173
186
  </style>
174
-
175
- <!-- Keyframes injected per-instance via a style tag to use the dynamic dashOffset -->
176
- {#if pathLength > 0 && !reducedMotion}
177
- {@html `<style>
178
- @keyframes beam-sweep-${uid} {
179
- 0% { stroke-dashoffset: ${dashOffset}; }
180
- 100% { stroke-dashoffset: ${-dashOffset}; }
181
- }
182
- </style>`}
183
- {/if}
@@ -0,0 +1,116 @@
1
+ /* commandPalette.svelte.js generated by Svelte v5.53.11 */
2
+ import * as $ from 'svelte/internal/client';
3
+
4
+ var __spreadArray = this && this.__spreadArray || function (to, from, pack) {
5
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
6
+ if (ar || !(i in from)) {
7
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
8
+
9
+ ar[i] = from[i];
10
+ }
11
+ }
12
+
13
+ return to.concat(ar || Array.prototype.slice.call(from));
14
+ };
15
+
16
+ var RECENT_KEY = 'jatui:cmd-palette:recent';
17
+ var MAX_RECENT = 8;
18
+
19
+ function createCommandPaletteStore() {
20
+ var open = $.state(false);
21
+ var groups = $.state($.proxy([]));
22
+ var recentIds = $.state($.proxy([]));
23
+
24
+ // Load recent from localStorage on first access
25
+ function loadRecent() {
26
+ if (typeof localStorage === 'undefined') return;
27
+
28
+ try {
29
+ var raw = localStorage.getItem(RECENT_KEY);
30
+
31
+ $.set(recentIds, raw ? JSON.parse(raw) : [], true);
32
+ } catch(_a) {
33
+ $.set(recentIds, [], true);
34
+ }
35
+ }
36
+
37
+ function saveRecent(ids) {
38
+ if (typeof localStorage === 'undefined') return;
39
+
40
+ try {
41
+ localStorage.setItem(RECENT_KEY, JSON.stringify(ids));
42
+ } catch(_a) {
43
+ // ignore storage errors
44
+ }
45
+ }
46
+
47
+ function recordRecent(id) {
48
+ var updated = __spreadArray(
49
+ [id],
50
+ $.safe_get(recentIds).filter(function (r) {
51
+ return r !== id;
52
+ }),
53
+ true
54
+ ).slice(0, MAX_RECENT);
55
+
56
+ $.set(recentIds, updated, true);
57
+ saveRecent(updated);
58
+ }
59
+
60
+ return {
61
+ get open() {
62
+ return $.safe_get(open);
63
+ },
64
+
65
+ get groups() {
66
+ return $.safe_get(groups);
67
+ },
68
+
69
+ get recentIds() {
70
+ return $.safe_get(recentIds);
71
+ },
72
+
73
+ registerCommands(groupLabel, items) {
74
+ var existing = $.safe_get(groups).find(function (g) {
75
+ return g.label === groupLabel;
76
+ });
77
+
78
+ if (existing) {
79
+ existing.items = items;
80
+ } else {
81
+ $.set(groups, __spreadArray(__spreadArray([], $.safe_get(groups), true), [{ label: groupLabel, items }], false), true);
82
+ }
83
+ },
84
+
85
+ openPalette() {
86
+ loadRecent();
87
+ $.set(open, true);
88
+ },
89
+
90
+ closePalette() {
91
+ $.set(open, false);
92
+ },
93
+
94
+ runCommand(item) {
95
+ recordRecent(item.id);
96
+ $.set(open, false);
97
+ item.action();
98
+ },
99
+
100
+ getRecentItems() {
101
+ var allItems = $.safe_get(groups).flatMap(function (g) {
102
+ return g.items;
103
+ });
104
+
105
+ return $.safe_get(recentIds).map(function (id) {
106
+ return allItems.find(function (i) {
107
+ return i.id === id;
108
+ });
109
+ }).filter(function (i) {
110
+ return !!i;
111
+ });
112
+ }
113
+ };
114
+ }
115
+
116
+ export var commandPalette = createCommandPaletteStore();
@@ -0,0 +1,37 @@
1
+ /* confirmDialog.svelte.js generated by Svelte v5.53.11 */
2
+ import * as $ from 'svelte/internal/client';
3
+
4
+ var pending = $.state(null);
5
+
6
+ export function getPending() {
7
+ return $.safe_get(pending);
8
+ }
9
+
10
+ export function showConfirm(options) {
11
+ // If a dialog is already open, cancel it first.
12
+ if ($.safe_get(pending)) {
13
+ $.safe_get(pending).resolve(false);
14
+ }
15
+
16
+ return new Promise(function (resolve) {
17
+ $.set(pending, { options, resolve }, true);
18
+ });
19
+ }
20
+
21
+ export function confirmDialog() {
22
+ if (!$.safe_get(pending)) return;
23
+
24
+ var p = $.safe_get(pending);
25
+
26
+ $.set(pending, null);
27
+ p.resolve(true);
28
+ }
29
+
30
+ export function cancelDialog() {
31
+ if (!$.safe_get(pending)) return;
32
+
33
+ var p = $.safe_get(pending);
34
+
35
+ $.set(pending, null);
36
+ p.resolve(false);
37
+ }
@@ -0,0 +1,37 @@
1
+ /* inputDialog.svelte.js generated by Svelte v5.53.11 */
2
+ import * as $ from 'svelte/internal/client';
3
+
4
+ var pending = $.state(null);
5
+
6
+ export function getPendingInput() {
7
+ return $.safe_get(pending);
8
+ }
9
+
10
+ export function showInput(options) {
11
+ // If a dialog is already open, cancel it first.
12
+ if ($.safe_get(pending)) {
13
+ $.safe_get(pending).resolve(null);
14
+ }
15
+
16
+ return new Promise(function (resolve) {
17
+ $.set(pending, { options, resolve }, true);
18
+ });
19
+ }
20
+
21
+ export function submitInput(value) {
22
+ if (!$.safe_get(pending)) return;
23
+
24
+ var p = $.safe_get(pending);
25
+
26
+ $.set(pending, null);
27
+ p.resolve(value);
28
+ }
29
+
30
+ export function cancelInput() {
31
+ if (!$.safe_get(pending)) return;
32
+
33
+ var p = $.safe_get(pending);
34
+
35
+ $.set(pending, null);
36
+ p.resolve(null);
37
+ }
@@ -0,0 +1,53 @@
1
+ /* toast.svelte.js generated by Svelte v5.53.11 */
2
+ import * as $ from 'svelte/internal/client';
3
+
4
+ var __spreadArray = this && this.__spreadArray || function (to, from, pack) {
5
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
6
+ if (ar || !(i in from)) {
7
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
8
+
9
+ ar[i] = from[i];
10
+ }
11
+ }
12
+
13
+ return to.concat(ar || Array.prototype.slice.call(from));
14
+ };
15
+
16
+ var nextId = 0;
17
+ var toasts = $.state($.proxy([]));
18
+
19
+ export function getToasts() {
20
+ return $.safe_get(toasts);
21
+ }
22
+
23
+ export function showToast(options) {
24
+ var _a, _b;
25
+ var id = ++nextId;
26
+
27
+ var toast = {
28
+ id,
29
+ type: (_a = options.type) !== null && _a !== void 0 ? _a : 'info',
30
+ message: options.message,
31
+ action: options.action,
32
+ durationMs: (_b = options.durationMs) !== null && _b !== void 0 ? _b : 5000,
33
+ onUndo: options.onUndo
34
+ };
35
+
36
+ $.set(toasts, __spreadArray(__spreadArray([], $.safe_get(toasts), true), [toast], false), true);
37
+
38
+ return {
39
+ dismiss() {
40
+ return dismissToast(id);
41
+ }
42
+ };
43
+ }
44
+
45
+ export function dismissToast(id) {
46
+ $.set(
47
+ toasts,
48
+ $.safe_get(toasts).filter(function (t) {
49
+ return t.id !== id;
50
+ }),
51
+ true
52
+ );
53
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joewinke/jatui",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "private": false,
5
5
  "description": "Shared Svelte 5 component library for JAT projects",
6
6
  "type": "module",
@@ -67,7 +67,7 @@
67
67
  "build": "vite build",
68
68
  "build:site": "npm run package && vite build",
69
69
  "preview": "vite preview",
70
- "package": "svelte-package --input src/lib --output dist",
70
+ "package": "svelte-package --input src/lib --output dist && node scripts/compile-rune-modules.mjs",
71
71
  "check:demos": "node scripts/check-demo-coverage.mjs",
72
72
  "guard": "node scripts/check-demo-coverage.mjs",
73
73
  "prepublishOnly": "npm run package"
@@ -1,217 +0,0 @@
1
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
- if (ar || !(i in from)) {
4
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
- ar[i] = from[i];
6
- }
7
- }
8
- return to.concat(ar || Array.prototype.slice.call(from));
9
- };
10
- import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
11
- import { extractClosestEdge, attachClosestEdge, } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge';
12
- import { SvelteMap } from 'svelte/reactivity';
13
- import { announce } from './announce';
14
- import { makeItemData, isItemData, } from './types';
15
- var SHADOW_KEY = '__dnd-shadow__';
16
- export function createDndBoard(opts) {
17
- var _a, _b;
18
- var edges = (_a = opts.edges) !== null && _a !== void 0 ? _a : ['top', 'bottom'];
19
- var hover = (_b = opts.hover) !== null && _b !== void 0 ? _b : 'indicator';
20
- var mirror = new SvelteMap();
21
- var dragging = $state(null);
22
- var proposal = $state(null);
23
- var seq = new Map();
24
- var inFlight = 0;
25
- var seedQueued = false;
26
- function seed() {
27
- mirror.clear();
28
- var src = opts.items();
29
- var entries = src instanceof Map
30
- ? src
31
- : new Map(Object.entries(src));
32
- for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
33
- var _a = entries_1[_i], id = _a[0], list = _a[1];
34
- mirror.set(id, __spreadArray([], list, true));
35
- }
36
- }
37
- $effect(function () {
38
- opts.items();
39
- if (dragging || inFlight > 0) {
40
- seedQueued = true;
41
- return;
42
- }
43
- seed();
44
- });
45
- function placementFrom(dropTargets) {
46
- var _a;
47
- var inner = dropTargets[0];
48
- if (!inner)
49
- return null;
50
- var d = inner.data;
51
- if (typeof d.container !== 'string')
52
- return null;
53
- var list = (_a = mirror.get(d.container)) !== null && _a !== void 0 ? _a : [];
54
- if (typeof d.index !== 'number')
55
- return { container: d.container, index: list.length };
56
- var edge = extractClosestEdge(d);
57
- var after = edge === 'bottom' || edge === 'right';
58
- return { container: d.container, index: d.index + (after ? 1 : 0) };
59
- }
60
- function syncShadow(next) {
61
- var _a;
62
- var _b;
63
- for (var _i = 0, mirror_1 = mirror; _i < mirror_1.length; _i++) {
64
- var _c = mirror_1[_i], cid = _c[0], list_1 = _c[1];
65
- var idx = list_1.findIndex(function (item) { return item[SHADOW_KEY]; });
66
- if (idx !== -1) {
67
- list_1.splice(idx, 1);
68
- mirror.set(cid, list_1);
69
- break;
70
- }
71
- }
72
- if (!next || !dragging)
73
- return;
74
- var list = __spreadArray([], ((_b = mirror.get(next.container)) !== null && _b !== void 0 ? _b : []), true);
75
- var shadowItem = (_a = {}, _a[SHADOW_KEY] = true, _a.key = "".concat(SHADOW_KEY, "-").concat(dragging.key), _a);
76
- list.splice(Math.min(next.index, list.length), 0, shadowItem);
77
- mirror.set(next.container, list);
78
- }
79
- function consider(next) {
80
- if ((next === null || next === void 0 ? void 0 : next.container) === (proposal === null || proposal === void 0 ? void 0 : proposal.container) && (next === null || next === void 0 ? void 0 : next.index) === (proposal === null || proposal === void 0 ? void 0 : proposal.index))
81
- return;
82
- proposal = next;
83
- if (hover === 'shadow')
84
- syncShadow(next);
85
- }
86
- function applyToMirror(move) {
87
- var _a, _b;
88
- var fromList = __spreadArray([], ((_a = mirror.get(move.from.container)) !== null && _a !== void 0 ? _a : []), true);
89
- var toList = move.from.container === move.to.container
90
- ? fromList
91
- : __spreadArray([], ((_b = mirror.get(move.to.container)) !== null && _b !== void 0 ? _b : []), true);
92
- var srcIdx = fromList.findIndex(function (it) { return opts.key(it) === opts.key(move.item); });
93
- if (srcIdx === -1)
94
- return;
95
- fromList.splice(srcIdx, 1);
96
- var destIdx = move.to.index;
97
- if (move.from.container === move.to.container && move.to.index > move.from.index) {
98
- destIdx = Math.max(0, destIdx - 1);
99
- }
100
- toList.splice(Math.min(destIdx, toList.length), 0, move.item);
101
- mirror.set(move.from.container, fromList);
102
- if (move.from.container !== move.to.container) {
103
- mirror.set(move.to.container, toList);
104
- }
105
- }
106
- function rollback(move) {
107
- var _a;
108
- for (var _i = 0, mirror_2 = mirror; _i < mirror_2.length; _i++) {
109
- var _b = mirror_2[_i], cid = _b[0], list = _b[1];
110
- var idx = list.findIndex(function (it) { return opts.key(it) === opts.key(move.item); });
111
- if (idx !== -1) {
112
- list.splice(idx, 1);
113
- mirror.set(cid, list);
114
- break;
115
- }
116
- }
117
- var fromList = __spreadArray([], ((_a = mirror.get(move.from.container)) !== null && _a !== void 0 ? _a : []), true);
118
- fromList.splice(Math.min(move.from.index, fromList.length), 0, move.item);
119
- mirror.set(move.from.container, fromList);
120
- }
121
- function finalize(dropped) {
122
- var _a;
123
- var drag = dragging;
124
- var to = dropped ? proposal : null;
125
- dragging = null;
126
- consider(null);
127
- if (!drag)
128
- return;
129
- if (!to ||
130
- (to.container === drag.from.container && to.index === drag.from.index)) {
131
- if (seedQueued && inFlight === 0) {
132
- seedQueued = false;
133
- seed();
134
- }
135
- return;
136
- }
137
- var move = { item: drag.item, from: drag.from, to: to };
138
- applyToMirror(move);
139
- if (opts.announce)
140
- announce(opts.announce(move));
141
- var token = ((_a = seq.get(drag.key)) !== null && _a !== void 0 ? _a : 0) + 1;
142
- seq.set(drag.key, token);
143
- inFlight++;
144
- opts
145
- .commit(move)
146
- .catch(function (error) {
147
- var _a;
148
- if (seq.get(drag.key) === token)
149
- rollback(move);
150
- (_a = opts.onError) === null || _a === void 0 ? void 0 : _a.call(opts, error, move);
151
- })
152
- .finally(function () {
153
- inFlight--;
154
- if (inFlight === 0 && seedQueued && !dragging) {
155
- seedQueued = false;
156
- seed();
157
- }
158
- });
159
- }
160
- $effect(function () {
161
- return monitorForElements({
162
- canMonitor: function (_a) {
163
- var source = _a.source;
164
- return isItemData(source.data, opts.type);
165
- },
166
- onDragStart: function (_a) {
167
- var source = _a.source;
168
- var d = source.data;
169
- dragging = {
170
- key: d.key,
171
- item: d.item,
172
- from: { container: d.container, index: d.index },
173
- };
174
- },
175
- onDropTargetChange: function (_a) {
176
- var location = _a.location;
177
- consider(placementFrom(location.current.dropTargets));
178
- },
179
- onDrag: function (_a) {
180
- var location = _a.location;
181
- consider(placementFrom(location.current.dropTargets));
182
- },
183
- onDrop: function (_a) {
184
- var location = _a.location;
185
- finalize(location.current.dropTargets.length > 0);
186
- },
187
- });
188
- });
189
- return {
190
- get: function (container) { var _a; return (_a = mirror.get(container)) !== null && _a !== void 0 ? _a : []; },
191
- containers: function () { return __spreadArray([], mirror.keys(), true); },
192
- get dragging() {
193
- return dragging;
194
- },
195
- get proposal() {
196
- return proposal;
197
- },
198
- isSource: function (item) { return (dragging === null || dragging === void 0 ? void 0 : dragging.key) === opts.key(item); },
199
- isShadow: function (item) {
200
- return !!item[SHADOW_KEY];
201
- },
202
- item: function (item, container, index) { return ({
203
- data: function () { return makeItemData({ type: opts.type, key: opts.key(item), item: item, container: container, index: index }); },
204
- }); },
205
- itemTarget: function (container, index) { return ({
206
- data: function (feedback) {
207
- return attachClosestEdge({ type: "".concat(opts.type, "-target"), container: container, index: index }, { input: feedback.input, element: feedback.element, allowedEdges: edges });
208
- },
209
- accepts: function (d) { return isItemData(d, opts.type); },
210
- sticky: true,
211
- }); },
212
- containerTarget: function (container) { return ({
213
- data: function () { return ({ type: "".concat(opts.type, "-target"), container: container }); },
214
- accepts: function (d) { return isItemData(d, opts.type); },
215
- }); },
216
- };
217
- }
@@ -1,82 +0,0 @@
1
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
- if (ar || !(i in from)) {
4
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
- ar[i] = from[i];
6
- }
7
- }
8
- return to.concat(ar || Array.prototype.slice.call(from));
9
- };
10
- var RECENT_KEY = 'jatui:cmd-palette:recent';
11
- var MAX_RECENT = 8;
12
- function createCommandPaletteStore() {
13
- var open = $state(false);
14
- var groups = $state([]);
15
- var recentIds = $state([]);
16
- // Load recent from localStorage on first access
17
- function loadRecent() {
18
- if (typeof localStorage === 'undefined')
19
- return;
20
- try {
21
- var raw = localStorage.getItem(RECENT_KEY);
22
- recentIds = raw ? JSON.parse(raw) : [];
23
- }
24
- catch (_a) {
25
- recentIds = [];
26
- }
27
- }
28
- function saveRecent(ids) {
29
- if (typeof localStorage === 'undefined')
30
- return;
31
- try {
32
- localStorage.setItem(RECENT_KEY, JSON.stringify(ids));
33
- }
34
- catch (_a) {
35
- // ignore storage errors
36
- }
37
- }
38
- function recordRecent(id) {
39
- var updated = __spreadArray([id], recentIds.filter(function (r) { return r !== id; }), true).slice(0, MAX_RECENT);
40
- recentIds = updated;
41
- saveRecent(updated);
42
- }
43
- return {
44
- get open() {
45
- return open;
46
- },
47
- get groups() {
48
- return groups;
49
- },
50
- get recentIds() {
51
- return recentIds;
52
- },
53
- registerCommands: function (groupLabel, items) {
54
- var existing = groups.find(function (g) { return g.label === groupLabel; });
55
- if (existing) {
56
- existing.items = items;
57
- }
58
- else {
59
- groups = __spreadArray(__spreadArray([], groups, true), [{ label: groupLabel, items: items }], false);
60
- }
61
- },
62
- openPalette: function () {
63
- loadRecent();
64
- open = true;
65
- },
66
- closePalette: function () {
67
- open = false;
68
- },
69
- runCommand: function (item) {
70
- recordRecent(item.id);
71
- open = false;
72
- item.action();
73
- },
74
- getRecentItems: function () {
75
- var allItems = groups.flatMap(function (g) { return g.items; });
76
- return recentIds
77
- .map(function (id) { return allItems.find(function (i) { return i.id === id; }); })
78
- .filter(function (i) { return !!i; });
79
- }
80
- };
81
- }
82
- export var commandPalette = createCommandPaletteStore();
@@ -1,31 +0,0 @@
1
- /**
2
- * Global promise-based confirm dialog.
3
- * Usage: const ok = await showConfirm({ title: '...', body: '...' })
4
- */
5
- var pending = $state(null);
6
- export function getPending() {
7
- return pending;
8
- }
9
- export function showConfirm(options) {
10
- // If a dialog is already open, cancel it first.
11
- if (pending) {
12
- pending.resolve(false);
13
- }
14
- return new Promise(function (resolve) {
15
- pending = { options: options, resolve: resolve };
16
- });
17
- }
18
- export function confirmDialog() {
19
- if (!pending)
20
- return;
21
- var p = pending;
22
- pending = null;
23
- p.resolve(true);
24
- }
25
- export function cancelDialog() {
26
- if (!pending)
27
- return;
28
- var p = pending;
29
- pending = null;
30
- p.resolve(false);
31
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Global promise-based input dialog.
3
- * Usage: const value = await showInput({ title: '...', placeholder: '...' })
4
- * Returns the typed string if confirmed, null if cancelled.
5
- */
6
- var pending = $state(null);
7
- export function getPendingInput() {
8
- return pending;
9
- }
10
- export function showInput(options) {
11
- // If a dialog is already open, cancel it first.
12
- if (pending) {
13
- pending.resolve(null);
14
- }
15
- return new Promise(function (resolve) {
16
- pending = { options: options, resolve: resolve };
17
- });
18
- }
19
- export function submitInput(value) {
20
- if (!pending)
21
- return;
22
- var p = pending;
23
- pending = null;
24
- p.resolve(value);
25
- }
26
- export function cancelInput() {
27
- if (!pending)
28
- return;
29
- var p = pending;
30
- pending = null;
31
- p.resolve(null);
32
- }