@adea-ai/ui 0.83.1 → 0.85.0

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 (54) hide show
  1. package/README.md +79 -0
  2. package/dist/NOTICE +26 -0
  3. package/dist/components/composites/catalog-browser/catalog-browser-group.d.ts +20 -0
  4. package/dist/components/composites/catalog-browser/catalog-browser-group.d.ts.map +1 -0
  5. package/dist/components/composites/catalog-browser/catalog-browser-group.js +195 -0
  6. package/dist/components/composites/catalog-browser/catalog-browser-group.js.map +1 -0
  7. package/dist/components/composites/catalog-browser/catalog-browser.d.ts +3 -0
  8. package/dist/components/composites/catalog-browser/catalog-browser.d.ts.map +1 -0
  9. package/dist/components/composites/catalog-browser/catalog-browser.js +378 -0
  10. package/dist/components/composites/catalog-browser/catalog-browser.js.map +1 -0
  11. package/dist/components/composites/catalog-browser/catalog-detail.d.ts +21 -0
  12. package/dist/components/composites/catalog-browser/catalog-detail.d.ts.map +1 -0
  13. package/dist/components/composites/catalog-browser/catalog-detail.js +92 -0
  14. package/dist/components/composites/catalog-browser/catalog-detail.js.map +1 -0
  15. package/dist/components/composites/catalog-browser/catalog-types.d.ts +78 -0
  16. package/dist/components/composites/catalog-browser/catalog-types.d.ts.map +1 -0
  17. package/dist/components/composites/catalog-browser/index.d.ts +4 -0
  18. package/dist/components/composites/catalog-browser/index.d.ts.map +1 -0
  19. package/dist/components/composites/catalog-browser/index.js +3 -0
  20. package/dist/components/layout/sidebar-nav/index.d.ts +1 -0
  21. package/dist/components/layout/sidebar-nav/index.d.ts.map +1 -1
  22. package/dist/components/layout/sidebar-nav/index.js +2 -1
  23. package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.d.ts +21 -0
  24. package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.d.ts.map +1 -0
  25. package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.js +84 -0
  26. package/dist/components/layout/sidebar-nav/sidebar-nav-resize-handle.js.map +1 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +5 -2
  30. package/dist/lint/index.d.ts +1 -0
  31. package/dist/lint/index.d.ts.map +1 -1
  32. package/dist/lint.js +171 -59
  33. package/dist/lint.js.map +1 -1
  34. package/dist/r/catalog-browser.json +47 -0
  35. package/dist/r/registry.json +53 -0
  36. package/dist/r/sidebar-nav.json +6 -0
  37. package/dist/r/src/components/composites/catalog-browser/catalog-browser-group.tsx +148 -0
  38. package/dist/r/src/components/composites/catalog-browser/catalog-browser.tsx +258 -0
  39. package/dist/r/src/components/composites/catalog-browser/catalog-detail.tsx +64 -0
  40. package/dist/r/src/components/composites/catalog-browser/catalog-types.ts +83 -0
  41. package/dist/r/src/components/composites/catalog-browser/index.ts +10 -0
  42. package/dist/r/src/components/layout/sidebar-nav/index.ts +4 -0
  43. package/dist/r/src/components/layout/sidebar-nav/sidebar-nav-resize-handle.tsx +59 -0
  44. package/package.json +1 -1
  45. package/registry.json +53 -0
  46. package/src/components/composites/catalog-browser/catalog-browser-group.tsx +148 -0
  47. package/src/components/composites/catalog-browser/catalog-browser.tsx +258 -0
  48. package/src/components/composites/catalog-browser/catalog-detail.tsx +64 -0
  49. package/src/components/composites/catalog-browser/catalog-types.ts +83 -0
  50. package/src/components/composites/catalog-browser/index.ts +10 -0
  51. package/src/components/layout/sidebar-nav/index.ts +4 -0
  52. package/src/components/layout/sidebar-nav/sidebar-nav-resize-handle.tsx +59 -0
  53. package/src/index.ts +1 -0
  54. package/src/lint/index.ts +168 -19
@@ -0,0 +1,378 @@
1
+ import { cn } from "../../../lib/utils.js";
2
+ import { Button } from "../../ui/button/button.js";
3
+ import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "../../ui/empty/empty.js";
4
+ import { InputGroup, InputGroupAddon, InputGroupInput } from "../../ui/input-group/input-group.js";
5
+ import { ScrollArea } from "../../ui/scroll-area/scroll-area.js";
6
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../ui/tabs/tabs.js";
7
+ import { keyedRows } from "../../../lib/keyed-rows.js";
8
+ import { CatalogBrowserGroup, CatalogLoadingState } from "./catalog-browser-group.js";
9
+ import { className, createComponent, effect, insert, memo, setAttribute, template } from "solid-js/web";
10
+ import { ArrowLeft, Blocks, Search } from "lucide-solid";
11
+ import { For, Show, createEffect, createMemo, createSignal, onCleanup } from "solid-js";
12
+ //#region src/components/composites/catalog-browser/catalog-browser.tsx
13
+ var _tmpl$ = /*#__PURE__*/ template(`<div>`);
14
+ var _tmpl$2 = /*#__PURE__*/ template(`<div class="flex min-w-0 shrink-0 flex-wrap items-center gap-2 px-4 pt-2"><span class="text-muted-foreground ms-auto text-sm"role=status>`);
15
+ var _tmpl$3 = /*#__PURE__*/ template(`<div class="grid min-w-0 gap-5">`);
16
+ var _tmpl$4 = /*#__PURE__*/ template(`<p class="text-destructive px-4 pt-2 text-sm"role=alert>`);
17
+ var _tmpl$5 = /*#__PURE__*/ template(`<p class="text-muted-foreground text-sm">`);
18
+ var _tmpl$6 = /*#__PURE__*/ template(`<div class="flex min-h-0 min-w-0 flex-1 flex-col gap-3"data-catalog-browser-detail>`);
19
+ function CatalogBrowser(props) {
20
+ const [expandedGroups, setExpandedGroups] = createSignal(/* @__PURE__ */ new Set());
21
+ const [returnKey, setReturnKey] = createSignal();
22
+ const [lastSelectedId, setLastSelectedId] = createSignal();
23
+ const rowRefs = /* @__PURE__ */ new Map();
24
+ let searchInput;
25
+ let backButton;
26
+ const selectedTab = createMemo(() => props.tabs.find((tab) => tab.id === props.tab));
27
+ const supplemental = () => selectedTab()?.kind === "supplemental";
28
+ const selected = createMemo(() => {
29
+ const id = props.selectedId;
30
+ return id && !supplemental() ? props.entries.find((entry) => entry.id === id) : void 0;
31
+ });
32
+ const groupRows = keyedRows(() => props.groups, (group) => group.id);
33
+ const [wide, setWide] = createSignal(typeof window === "undefined" || window.matchMedia("(min-width: 48rem)").matches);
34
+ const updateWide = (event) => setWide(event.matches);
35
+ createEffect(() => {
36
+ if (typeof window === "undefined") return;
37
+ const query = window.matchMedia("(min-width: 48rem)");
38
+ query.addEventListener("change", updateWide);
39
+ onCleanup(() => query.removeEventListener("change", updateWide));
40
+ });
41
+ createEffect(() => {
42
+ const open = props.open;
43
+ const selectedId = props.selectedId;
44
+ const selectedEntry = selected();
45
+ if (!open) {
46
+ setExpandedGroups(/* @__PURE__ */ new Set());
47
+ setLastSelectedId(void 0);
48
+ setReturnKey(void 0);
49
+ return;
50
+ }
51
+ if (selectedId && selectedEntry) {
52
+ const previous = lastSelectedId();
53
+ setLastSelectedId(selectedId);
54
+ if (selectedId !== previous) window.requestAnimationFrame(() => {
55
+ if (props.open && props.selectedId === selectedId) backButton?.focus();
56
+ });
57
+ return;
58
+ }
59
+ if (!lastSelectedId()) return;
60
+ const key = returnKey();
61
+ setLastSelectedId(void 0);
62
+ setReturnKey(void 0);
63
+ window.requestAnimationFrame(() => {
64
+ if (!props.open || props.selectedId) return;
65
+ const row = key ? rowRefs.get(key) : void 0;
66
+ if (row?.isConnected) row.focus();
67
+ else searchInput?.focus();
68
+ });
69
+ });
70
+ const registerRow = (key, element) => {
71
+ if (element) rowRefs.set(key, element);
72
+ else rowRefs.delete(key);
73
+ };
74
+ const selectEntry = (key, value) => {
75
+ setReturnKey(key);
76
+ props.onSelect(value);
77
+ };
78
+ const toggleGroup = (id) => {
79
+ setExpandedGroups((current) => {
80
+ const next = new Set(current);
81
+ if (next.has(id)) next.delete(id);
82
+ else next.add(id);
83
+ return next;
84
+ });
85
+ };
86
+ const previewCount = () => wide() ? 6 : 3;
87
+ const countLabel = () => props.status === "loading" ? props.loadingLabel : props.resultLabel(props.resultCount);
88
+ const supplementalContent = () => props.renderSupplementalView?.(props.tab);
89
+ return (() => {
90
+ var _el$ = _tmpl$();
91
+ insert(_el$, createComponent(Show, {
92
+ get when() {
93
+ return selected();
94
+ },
95
+ get fallback() {
96
+ return createComponent(Tabs, {
97
+ "class": "flex min-h-0 min-w-0 flex-1 flex-col gap-0",
98
+ get value() {
99
+ return props.tab;
100
+ },
101
+ onChange: (value) => value && props.onTabChange(value),
102
+ get children() {
103
+ return [createComponent(TabsList, {
104
+ get ["aria-label"]() {
105
+ return props.tabsLabel;
106
+ },
107
+ "class": "ms-auto max-w-full flex-wrap px-4 pt-2",
108
+ get children() {
109
+ return createComponent(For, {
110
+ get each() {
111
+ return props.tabs;
112
+ },
113
+ children: (tab) => createComponent(TabsTrigger, {
114
+ get value() {
115
+ return tab.id;
116
+ },
117
+ get children() {
118
+ return tab.label;
119
+ }
120
+ })
121
+ });
122
+ }
123
+ }), createComponent(TabsContent, {
124
+ get value() {
125
+ return props.tab;
126
+ },
127
+ "class": "flex min-h-0 min-w-0 flex-1 flex-col gap-3",
128
+ get children() {
129
+ return createComponent(Show, {
130
+ get when() {
131
+ return supplemental();
132
+ },
133
+ get fallback() {
134
+ return [
135
+ createComponent(Show, {
136
+ get when() {
137
+ return props.installError;
138
+ },
139
+ children: (message) => (() => {
140
+ var _el$5 = _tmpl$4();
141
+ insert(_el$5, message);
142
+ return _el$5;
143
+ })()
144
+ }),
145
+ (() => {
146
+ var _el$2 = _tmpl$2(), _el$3 = _el$2.firstChild;
147
+ insert(_el$2, () => props.filterControl, _el$3);
148
+ insert(_el$2, createComponent(InputGroup, {
149
+ "class": "min-w-0 flex-1 sm:max-w-md",
150
+ get children() {
151
+ return [createComponent(InputGroupAddon, { get children() {
152
+ return createComponent(Search, { "aria-hidden": "true" });
153
+ } }), createComponent(InputGroupInput, {
154
+ ref: (element) => searchInput = element,
155
+ type: "search",
156
+ get ["aria-label"]() {
157
+ return props.searchLabel;
158
+ },
159
+ get placeholder() {
160
+ return props.searchPlaceholder;
161
+ },
162
+ get value() {
163
+ return props.query;
164
+ },
165
+ onInput: (event) => props.onQueryChange(event.currentTarget.value)
166
+ })];
167
+ }
168
+ }), _el$3);
169
+ insert(_el$3, countLabel);
170
+ return _el$2;
171
+ })(),
172
+ createComponent(ScrollArea, {
173
+ role: "region",
174
+ get ["aria-label"]() {
175
+ return props.resultsRegionLabel;
176
+ },
177
+ orientation: "vertical",
178
+ "class": "flex min-h-0 min-w-0 flex-1 flex-col gap-5 px-4 pb-4",
179
+ get children() {
180
+ return [
181
+ createComponent(Show, {
182
+ get when() {
183
+ return props.status === "error";
184
+ },
185
+ get children() {
186
+ return createComponent(Empty, {
187
+ "class": "min-h-0 min-w-0 flex-1",
188
+ get role() {
189
+ return props.catalogError.role ?? "alert";
190
+ },
191
+ get children() {
192
+ return [createComponent(EmptyHeader, { get children() {
193
+ return [
194
+ createComponent(EmptyMedia, {
195
+ variant: "icon",
196
+ get children() {
197
+ return createComponent(Blocks, { "aria-hidden": "true" });
198
+ }
199
+ }),
200
+ createComponent(EmptyTitle, { get children() {
201
+ return props.catalogError.title;
202
+ } }),
203
+ createComponent(EmptyDescription, { get children() {
204
+ return props.catalogError.description;
205
+ } })
206
+ ];
207
+ } }), createComponent(Show, {
208
+ get when() {
209
+ return props.catalogErrorAction;
210
+ },
211
+ get children() {
212
+ return createComponent(EmptyContent, { get children() {
213
+ return props.catalogErrorAction;
214
+ } });
215
+ }
216
+ })];
217
+ }
218
+ });
219
+ }
220
+ }),
221
+ createComponent(Show, {
222
+ get when() {
223
+ return props.status === "loading";
224
+ },
225
+ get children() {
226
+ return createComponent(CatalogLoadingState, { get label() {
227
+ return props.loadingLabel;
228
+ } });
229
+ }
230
+ }),
231
+ createComponent(Show, {
232
+ get when() {
233
+ return props.status === "ready";
234
+ },
235
+ get children() {
236
+ return createComponent(Show, {
237
+ get when() {
238
+ return props.resultCount > 0;
239
+ },
240
+ get fallback() {
241
+ return createComponent(Empty, {
242
+ "class": "min-h-0 min-w-0 flex-1",
243
+ role: "status",
244
+ get children() {
245
+ return [createComponent(EmptyHeader, { get children() {
246
+ return [
247
+ createComponent(EmptyMedia, {
248
+ variant: "icon",
249
+ get children() {
250
+ return createComponent(Blocks, { "aria-hidden": "true" });
251
+ }
252
+ }),
253
+ createComponent(EmptyTitle, { get children() {
254
+ return props.emptyState.title;
255
+ } }),
256
+ createComponent(EmptyDescription, { get children() {
257
+ return props.emptyState.description;
258
+ } })
259
+ ];
260
+ } }), createComponent(Show, {
261
+ get when() {
262
+ return props.emptyStateAction;
263
+ },
264
+ get children() {
265
+ return createComponent(EmptyContent, { get children() {
266
+ return props.emptyStateAction;
267
+ } });
268
+ }
269
+ })];
270
+ }
271
+ });
272
+ },
273
+ get children() {
274
+ var _el$4 = _tmpl$3();
275
+ insert(_el$4, createComponent(For, {
276
+ get each() {
277
+ return groupRows();
278
+ },
279
+ children: (row) => createComponent(CatalogBrowserGroup, {
280
+ get group() {
281
+ return row.item();
282
+ },
283
+ get expanded() {
284
+ return expandedGroups().has(row.item().id);
285
+ },
286
+ get previewCount() {
287
+ return previewCount();
288
+ },
289
+ get disabled() {
290
+ return props.interactionDisabled ?? false;
291
+ },
292
+ get installedLabel() {
293
+ return props.installedLabel;
294
+ },
295
+ get publishedByLabel() {
296
+ return props.publishedByLabel;
297
+ },
298
+ get showMoreLabel() {
299
+ return props.showMoreLabel;
300
+ },
301
+ get showLessLabel() {
302
+ return props.showLessLabel;
303
+ },
304
+ get renderIcon() {
305
+ return props.renderIcon;
306
+ },
307
+ onSelect: (entry, key) => selectEntry(key, entry.value),
308
+ onRef: registerRow,
309
+ onToggle: toggleGroup
310
+ })
311
+ }));
312
+ return _el$4;
313
+ }
314
+ });
315
+ }
316
+ }),
317
+ createComponent(For, {
318
+ get each() {
319
+ return props.notices ?? [];
320
+ },
321
+ children: (notice) => (() => {
322
+ var _el$6 = _tmpl$5();
323
+ insert(_el$6, () => notice.message);
324
+ effect(() => setAttribute(_el$6, "role", notice.role));
325
+ return _el$6;
326
+ })()
327
+ })
328
+ ];
329
+ }
330
+ })
331
+ ];
332
+ },
333
+ get children() {
334
+ return supplementalContent();
335
+ }
336
+ });
337
+ }
338
+ })];
339
+ }
340
+ });
341
+ },
342
+ children: (entry) => (() => {
343
+ var _el$7 = _tmpl$6();
344
+ insert(_el$7, createComponent(Button, {
345
+ ref: (element) => backButton = element,
346
+ variant: "ghost",
347
+ size: "sm",
348
+ onClick: () => props.onBack(),
349
+ "class": "mx-4 mt-2 self-start",
350
+ get children() {
351
+ return [createComponent(ArrowLeft, {
352
+ "data-icon": "inline-start",
353
+ "aria-hidden": "true"
354
+ }), memo(() => props.backLabel)];
355
+ }
356
+ }), null);
357
+ insert(_el$7, createComponent(ScrollArea, {
358
+ role: "region",
359
+ get ["aria-label"]() {
360
+ return props.detailRegionLabel;
361
+ },
362
+ orientation: "vertical",
363
+ "class": "min-h-0 min-w-0 flex-1 px-4 pb-4",
364
+ get children() {
365
+ return props.renderDetail(entry().value);
366
+ }
367
+ }), null);
368
+ return _el$7;
369
+ })()
370
+ }));
371
+ effect(() => className(_el$, cn("flex min-h-0 min-w-0 flex-1 flex-col", props.class)));
372
+ return _el$;
373
+ })();
374
+ }
375
+ //#endregion
376
+ export { CatalogBrowser };
377
+
378
+ //# sourceMappingURL=catalog-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-browser.js","names":["createEffect","createMemo","createSignal","For","onCleanup","Show","ArrowLeft","Blocks","Search","keyedRows","Button","Empty","EmptyContent","EmptyDescription","EmptyHeader","EmptyMedia","EmptyTitle","InputGroup","InputGroupAddon","InputGroupInput","Tabs","TabsContent","TabsList","TabsTrigger","ScrollArea","cn","CatalogBrowserGroup","CatalogLoadingState","CatalogBrowserProps","CatalogBrowser","props","Value","expandedGroups","setExpandedGroups","ReadonlySet","Set","returnKey","setReturnKey","lastSelectedId","setLastSelectedId","rowRefs","Map","HTMLButtonElement","searchInput","HTMLInputElement","backButton","selectedTab","tabs","find","tab","id","supplemental","kind","selected","selectedId","entries","entry","undefined","groupRows","groups","group","wide","setWide","window","matchMedia","matches","updateWide","event","MediaQueryListEvent","query","addEventListener","removeEventListener","open","selectedEntry","previous","requestAnimationFrame","focus","key","row","get","isConnected","registerRow","element","set","delete","selectEntry","value","onSelect","toggleGroup","current","next","has","add","previewCount","countLabel","status","loadingLabel","resultLabel","resultCount","supplementalContent","renderSupplementalView","_el$","_tmpl$","_$insert","_$createComponent","when","fallback","onChange","onTabChange","children","aria-label","tabsLabel","each","label","installError","message","_el$5","_tmpl$4","_el$2","_tmpl$2","_el$3","firstChild","filterControl","ref","type","searchLabel","placeholder","searchPlaceholder","onInput","onQueryChange","currentTarget","role","resultsRegionLabel","orientation","catalogError","variant","title","description","catalogErrorAction","emptyState","emptyStateAction","_el$4","_tmpl$3","item","expanded","disabled","interactionDisabled","installedLabel","publishedByLabel","showMoreLabel","showLessLabel","renderIcon","onRef","onToggle","notices","notice","_el$6","_tmpl$5","_$effect","_$setAttribute","_el$7","_tmpl$6","size","onClick","onBack","_$memo","backLabel","detailRegionLabel","renderDetail","_$className","class","_$createComponent","_$setAttribute","_$memo","_$className"],"sources":["../../../../src/components/composites/catalog-browser/catalog-browser.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, onCleanup, Show } from 'solid-js'\nimport { ArrowLeft, Blocks, Search } from 'lucide-solid'\nimport { keyedRows } from '#lib/keyed-rows'\nimport { Button } from '../../ui/button'\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from '../../ui/empty'\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../ui/input-group'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../../ui/tabs'\nimport { ScrollArea } from '../../ui/scroll-area'\nimport { cn } from '#lib/utils'\nimport { CatalogBrowserGroup, CatalogLoadingState } from './catalog-browser-group'\nimport type { CatalogBrowserProps } from './catalog-types'\n\nexport function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>) {\n const [expandedGroups, setExpandedGroups] = createSignal<ReadonlySet<string>>(new Set())\n const [returnKey, setReturnKey] = createSignal<string>()\n const [lastSelectedId, setLastSelectedId] = createSignal<string>()\n const rowRefs = new Map<string, HTMLButtonElement>()\n let searchInput: HTMLInputElement | undefined\n let backButton: HTMLButtonElement | undefined\n\n const selectedTab = createMemo(() => props.tabs.find((tab) => tab.id === props.tab))\n const supplemental = () => selectedTab()?.kind === 'supplemental'\n const selected = createMemo(() => {\n const id = props.selectedId\n return id && !supplemental() ? props.entries.find((entry) => entry.id === id) : undefined\n })\n const groupRows = keyedRows(\n () => props.groups,\n (group) => group.id\n )\n const [wide, setWide] = createSignal(\n typeof window === 'undefined' || window.matchMedia('(min-width: 48rem)').matches\n )\n const updateWide = (event: MediaQueryListEvent) => setWide(event.matches)\n\n createEffect(() => {\n if (typeof window === 'undefined') return\n const query = window.matchMedia('(min-width: 48rem)')\n query.addEventListener('change', updateWide)\n onCleanup(() => query.removeEventListener('change', updateWide))\n })\n\n createEffect(() => {\n const open = props.open\n const selectedId = props.selectedId\n const selectedEntry = selected()\n if (!open) {\n setExpandedGroups(new Set<string>())\n setLastSelectedId(undefined)\n setReturnKey(undefined)\n return\n }\n if (selectedId && selectedEntry) {\n const previous = lastSelectedId()\n setLastSelectedId(selectedId)\n if (selectedId !== previous) {\n window.requestAnimationFrame(() => {\n if (props.open && props.selectedId === selectedId) backButton?.focus()\n })\n }\n return\n }\n const previous = lastSelectedId()\n if (!previous) return\n const key = returnKey()\n setLastSelectedId(undefined)\n setReturnKey(undefined)\n window.requestAnimationFrame(() => {\n if (!props.open || props.selectedId) return\n const row = key ? rowRefs.get(key) : undefined\n if (row?.isConnected) row.focus()\n else searchInput?.focus()\n })\n })\n\n const registerRow = (key: string, element: HTMLButtonElement | undefined) => {\n if (element) rowRefs.set(key, element)\n else rowRefs.delete(key)\n }\n const selectEntry = (key: string, value: Value) => {\n setReturnKey(key)\n props.onSelect(value)\n }\n const toggleGroup = (id: string) => {\n setExpandedGroups((current) => {\n const next = new Set(current)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n const previewCount = () => (wide() ? 6 : 3)\n const countLabel = () =>\n props.status === 'loading' ? props.loadingLabel : props.resultLabel(props.resultCount)\n const supplementalContent = () => props.renderSupplementalView?.(props.tab)\n\n return (\n <div class={cn('flex min-h-0 min-w-0 flex-1 flex-col', props.class)}>\n <Show\n when={selected()}\n fallback={\n <Tabs\n class=\"flex min-h-0 min-w-0 flex-1 flex-col gap-0\"\n value={props.tab}\n onChange={(value) => value && props.onTabChange(value)}\n >\n <TabsList aria-label={props.tabsLabel} class=\"ms-auto max-w-full flex-wrap px-4 pt-2\">\n <For each={props.tabs}>\n {(tab) => <TabsTrigger value={tab.id}>{tab.label}</TabsTrigger>}\n </For>\n </TabsList>\n <TabsContent value={props.tab} class=\"flex min-h-0 min-w-0 flex-1 flex-col gap-3\">\n <Show\n when={supplemental()}\n fallback={\n <>\n <Show when={props.installError}>\n {(message) => (\n <p class=\"text-destructive px-4 pt-2 text-sm\" role=\"alert\">\n {message()}\n </p>\n )}\n </Show>\n <div class=\"flex min-w-0 shrink-0 flex-wrap items-center gap-2 px-4 pt-2\">\n {props.filterControl}\n <InputGroup class=\"min-w-0 flex-1 sm:max-w-md\">\n <InputGroupAddon>\n <Search aria-hidden=\"true\" />\n </InputGroupAddon>\n <InputGroupInput\n ref={(element) => (searchInput = element)}\n type=\"search\"\n aria-label={props.searchLabel}\n placeholder={props.searchPlaceholder}\n value={props.query}\n onInput={(event) => props.onQueryChange(event.currentTarget.value)}\n />\n </InputGroup>\n <span class=\"text-muted-foreground ms-auto text-sm\" role=\"status\">\n {countLabel()}\n </span>\n </div>\n <ScrollArea\n role=\"region\"\n aria-label={props.resultsRegionLabel}\n orientation=\"vertical\"\n class=\"flex min-h-0 min-w-0 flex-1 flex-col gap-5 px-4 pb-4\"\n >\n <Show when={props.status === 'error'}>\n <Empty\n class=\"min-h-0 min-w-0 flex-1\"\n role={props.catalogError.role ?? 'alert'}\n >\n <EmptyHeader>\n <EmptyMedia variant=\"icon\">\n <Blocks aria-hidden=\"true\" />\n </EmptyMedia>\n <EmptyTitle>{props.catalogError.title}</EmptyTitle>\n <EmptyDescription>{props.catalogError.description}</EmptyDescription>\n </EmptyHeader>\n <Show when={props.catalogErrorAction}>\n <EmptyContent>{props.catalogErrorAction}</EmptyContent>\n </Show>\n </Empty>\n </Show>\n <Show when={props.status === 'loading'}>\n <CatalogLoadingState label={props.loadingLabel} />\n </Show>\n <Show when={props.status === 'ready'}>\n <Show\n when={props.resultCount > 0}\n fallback={\n <Empty class=\"min-h-0 min-w-0 flex-1\" role=\"status\">\n <EmptyHeader>\n <EmptyMedia variant=\"icon\">\n <Blocks aria-hidden=\"true\" />\n </EmptyMedia>\n <EmptyTitle>{props.emptyState.title}</EmptyTitle>\n <EmptyDescription>{props.emptyState.description}</EmptyDescription>\n </EmptyHeader>\n <Show when={props.emptyStateAction}>\n <EmptyContent>{props.emptyStateAction}</EmptyContent>\n </Show>\n </Empty>\n }\n >\n <div class=\"grid min-w-0 gap-5\">\n <For each={groupRows()}>\n {(row) => (\n <CatalogBrowserGroup\n group={row.item()}\n expanded={expandedGroups().has(row.item().id)}\n previewCount={previewCount()}\n disabled={props.interactionDisabled ?? false}\n installedLabel={props.installedLabel}\n publishedByLabel={props.publishedByLabel}\n showMoreLabel={props.showMoreLabel}\n showLessLabel={props.showLessLabel}\n renderIcon={props.renderIcon}\n onSelect={(entry, key) => selectEntry(key, entry.value)}\n onRef={registerRow}\n onToggle={toggleGroup}\n />\n )}\n </For>\n </div>\n </Show>\n </Show>\n <For each={props.notices ?? []}>\n {(notice) => (\n <p class=\"text-muted-foreground text-sm\" role={notice.role}>\n {notice.message}\n </p>\n )}\n </For>\n </ScrollArea>\n </>\n }\n >\n {supplementalContent()}\n </Show>\n </TabsContent>\n </Tabs>\n }\n >\n {(entry) => (\n <div class=\"flex min-h-0 min-w-0 flex-1 flex-col gap-3\" data-catalog-browser-detail>\n <Button\n ref={(element) => (backButton = element)}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => props.onBack()}\n class=\"mx-4 mt-2 self-start\"\n >\n <ArrowLeft data-icon=\"inline-start\" aria-hidden=\"true\" />\n {props.backLabel}\n </Button>\n <ScrollArea\n role=\"region\"\n aria-label={props.detailRegionLabel}\n orientation=\"vertical\"\n class=\"min-h-0 min-w-0 flex-1 px-4 pb-4\"\n >\n {props.renderDetail(entry().value)}\n </ScrollArea>\n </div>\n )}\n </Show>\n </div>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type JSX } from 'solid-js';
2
+ /** Shared item summary and action frame for catalog-owned detail content. */
3
+ export declare function CatalogDetail(props: {
4
+ title: string;
5
+ description: string;
6
+ category: string;
7
+ publisher: string;
8
+ publishedByLabel: (publisher: string) => string;
9
+ leading?: JSX.Element;
10
+ eyebrow?: string;
11
+ badges?: JSX.Element;
12
+ action?: JSX.Element;
13
+ status?: JSX.Element;
14
+ children?: JSX.Element;
15
+ }): JSX.Element;
16
+ /** A shared surface and heading for host-specific fields, permissions, and copy. */
17
+ export declare function CatalogDetailSection(props: {
18
+ title: string;
19
+ children?: JSX.Element;
20
+ }): JSX.Element;
21
+ //# sourceMappingURL=catalog-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-detail.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/catalog-browser/catalog-detail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,GAAG,EAAE,MAAM,UAAU,CAAA;AAIzD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,eA6BA;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAAE,eAcpF"}
@@ -0,0 +1,92 @@
1
+ import { Badge } from "../../ui/badge/badge.js";
2
+ import { Card, CardContent, CardFooter, CardHeader } from "../../ui/card/card.js";
3
+ import { createComponent, insert, memo, setAttribute, template } from "solid-js/web";
4
+ import { Show, createUniqueId } from "solid-js";
5
+ //#region src/components/composites/catalog-browser/catalog-detail.tsx
6
+ var _tmpl$ = /*#__PURE__*/ template(`<span class=shrink-0>`);
7
+ var _tmpl$2 = /*#__PURE__*/ template(`<div class="grid min-w-0 gap-1.5"><div class="flex min-w-0 flex-wrap items-center gap-1.5"></div><h2 class="text-base leading-tight font-semibold tracking-tight"></h2><p class="text-muted-foreground text-sm"></p><p class="text-muted-foreground text-xs">`);
8
+ var _tmpl$3 = /*#__PURE__*/ template(`<article class="grid min-w-0 gap-4"data-catalog-detail><div class="grid min-w-0 gap-3">`);
9
+ var _tmpl$4 = /*#__PURE__*/ template(`<h3 class="text-sm font-semibold tracking-tight">`);
10
+ var _tmpl$5 = /*#__PURE__*/ template(`<section class=min-w-0>`);
11
+ /** Shared item summary and action frame for catalog-owned detail content. */
12
+ function CatalogDetail(props) {
13
+ return (() => {
14
+ var _el$ = _tmpl$3(), _el$8 = _el$.firstChild;
15
+ insert(_el$, createComponent(Card, { get children() {
16
+ return [createComponent(CardHeader, {
17
+ "class": "flex-row items-start gap-3",
18
+ get children() {
19
+ return [createComponent(Show, {
20
+ get when() {
21
+ return props.leading;
22
+ },
23
+ get children() {
24
+ var _el$2 = _tmpl$();
25
+ insert(_el$2, () => props.leading);
26
+ return _el$2;
27
+ }
28
+ }), (() => {
29
+ var _el$3 = _tmpl$2(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling;
30
+ insert(_el$4, createComponent(Show, {
31
+ get when() {
32
+ return props.eyebrow;
33
+ },
34
+ get children() {
35
+ return createComponent(Badge, {
36
+ variant: "outline",
37
+ get children() {
38
+ return props.eyebrow;
39
+ }
40
+ });
41
+ }
42
+ }), null);
43
+ insert(_el$4, createComponent(Badge, {
44
+ variant: "secondary",
45
+ get children() {
46
+ return props.category;
47
+ }
48
+ }), null);
49
+ insert(_el$4, () => props.badges, null);
50
+ insert(_el$5, () => props.title);
51
+ insert(_el$6, () => props.description);
52
+ insert(_el$7, () => props.publishedByLabel(props.publisher));
53
+ return _el$3;
54
+ })()];
55
+ }
56
+ }), createComponent(CardFooter, {
57
+ "class": "flex-wrap justify-between gap-3",
58
+ get children() {
59
+ return [memo(() => props.action), memo(() => props.status)];
60
+ }
61
+ })];
62
+ } }), _el$8);
63
+ insert(_el$8, () => props.children);
64
+ return _el$;
65
+ })();
66
+ }
67
+ /** A shared surface and heading for host-specific fields, permissions, and copy. */
68
+ function CatalogDetailSection(props) {
69
+ const headingId = `catalog-detail-section-${createUniqueId()}`;
70
+ return (() => {
71
+ var _el$9 = _tmpl$5();
72
+ setAttribute(_el$9, "aria-labelledby", headingId);
73
+ insert(_el$9, createComponent(Card, { get children() {
74
+ return [createComponent(CardHeader, { get children() {
75
+ var _el$0 = _tmpl$4();
76
+ setAttribute(_el$0, "id", headingId);
77
+ insert(_el$0, () => props.title);
78
+ return _el$0;
79
+ } }), createComponent(CardContent, {
80
+ "class": "grid min-w-0 gap-3",
81
+ get children() {
82
+ return props.children;
83
+ }
84
+ })];
85
+ } }));
86
+ return _el$9;
87
+ })();
88
+ }
89
+ //#endregion
90
+ export { CatalogDetail, CatalogDetailSection };
91
+
92
+ //# sourceMappingURL=catalog-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-detail.js","names":["createUniqueId","Show","JSX","Badge","Card","CardContent","CardFooter","CardHeader","CatalogDetail","props","title","description","category","publisher","publishedByLabel","leading","Element","eyebrow","badges","action","status","children","_el$","_tmpl$3","_el$8","firstChild","_$insert","_$createComponent","when","_el$2","_tmpl$","_el$3","_tmpl$2","_el$4","_el$5","nextSibling","_el$6","_el$7","variant","_$memo","CatalogDetailSection","headingId","_el$9","_tmpl$5","_$setAttribute","_el$0","_tmpl$4","_$createComponent","_$memo"],"sources":["../../../../src/components/composites/catalog-browser/catalog-detail.tsx"],"sourcesContent":["import { createUniqueId, Show, type JSX } from 'solid-js'\nimport { Badge } from '../../ui/badge'\nimport { Card, CardContent, CardFooter, CardHeader } from '../../ui/card'\n\n/** Shared item summary and action frame for catalog-owned detail content. */\nexport function CatalogDetail(props: {\n title: string\n description: string\n category: string\n publisher: string\n publishedByLabel: (publisher: string) => string\n leading?: JSX.Element\n eyebrow?: string\n badges?: JSX.Element\n action?: JSX.Element\n status?: JSX.Element\n children?: JSX.Element\n}) {\n return (\n <article class=\"grid min-w-0 gap-4\" data-catalog-detail>\n <Card>\n <CardHeader class=\"flex-row items-start gap-3\">\n <Show when={props.leading}>\n <span class=\"shrink-0\">{props.leading}</span>\n </Show>\n <div class=\"grid min-w-0 gap-1.5\">\n <div class=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <Show when={props.eyebrow}>\n <Badge variant=\"outline\">{props.eyebrow}</Badge>\n </Show>\n <Badge variant=\"secondary\">{props.category}</Badge>\n {props.badges}\n </div>\n <h2 class=\"text-base leading-tight font-semibold tracking-tight\">{props.title}</h2>\n <p class=\"text-muted-foreground text-sm\">{props.description}</p>\n <p class=\"text-muted-foreground text-xs\">{props.publishedByLabel(props.publisher)}</p>\n </div>\n </CardHeader>\n <CardFooter class=\"flex-wrap justify-between gap-3\">\n {props.action}\n {props.status}\n </CardFooter>\n </Card>\n <div class=\"grid min-w-0 gap-3\">{props.children}</div>\n </article>\n )\n}\n\n/** A shared surface and heading for host-specific fields, permissions, and copy. */\nexport function CatalogDetailSection(props: { title: string; children?: JSX.Element }) {\n const headingId = `catalog-detail-section-${createUniqueId()}`\n return (\n <section class=\"min-w-0\" aria-labelledby={headingId}>\n <Card>\n <CardHeader>\n <h3 id={headingId} class=\"text-sm font-semibold tracking-tight\">\n {props.title}\n </h3>\n </CardHeader>\n <CardContent class=\"grid min-w-0 gap-3\">{props.children}</CardContent>\n </Card>\n </section>\n )\n}\n"],"mappings":";;;;;;;;;;;AAKA,SAAgBQ,cAAcC,OAY3B;CACD,cAAA;EAAA,IAAAa,OAAAC,QAAA,GAAAC,QAAAF,KAAAG;EAAAC,OAAAJ,MAAAK,gBAEKvB,MAAI,EAAA,IAAAiB,WAAA;GAAA,OAAA,CAAAM,gBACFpB,YAAU;IAAA,SAAA;IAAA,IAAAc,WAAA;KAAA,OAAA,CAAAM,gBACR1B,MAAI;MAAA,IAAC2B,OAAI;OAAA,OAAEnB,MAAMM;MAAO;MAAA,IAAAM,WAAA;OAAA,IAAAQ,QAAAC,OAAA;OAAAJ,OAAAG,aACCpB,MAAMM,OAAO;OAAA,OAAAc;MAAA;KAAA,CAAA,UAAA;MAAA,IAAAE,QAAAC,QAAA,GAAAC,QAAAF,MAAAN,YAAAS,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAD,MAAAD;MAAAT,OAAAO,OAAAN,gBAIlC1B,MAAI;OAAA,IAAC2B,OAAI;QAAA,OAAEnB,MAAMQ;OAAO;OAAA,IAAAI,WAAA;QAAA,OAAAM,gBACtBxB,OAAK;SAACmC,SAAO;SAAA,IAAAjB,WAAA;UAAA,OAAYZ,MAAMQ;SAAO;QAAA,CAAA;OAAA;MAAA,CAAA,GAAA,IAAA;MAAAS,OAAAO,OAAAN,gBAExCxB,OAAK;OAACmC,SAAO;OAAA,IAAAjB,WAAA;QAAA,OAAcZ,MAAMG;OAAQ;MAAA,CAAA,GAAA,IAAA;MAAAc,OAAAO,aACzCxB,MAAMS,QAAM,IAAA;MAAAQ,OAAAQ,aAEmDzB,MAAMC,KAAK;MAAAgB,OAAAU,aACnC3B,MAAME,WAAW;MAAAe,OAAAW,aACjB5B,MAAMK,iBAAiBL,MAAMI,SAAS,CAAC;MAAA,OAAAkB;KAAA,EAAA,CAAA,CAAA;IAAA;GAAA,CAAA,GAAAJ,gBAGpFrB,YAAU;IAAA,SAAA;IAAA,IAAAe,WAAA;KAAA,OAAA,CAAAkB,WACR9B,MAAMU,MAAM,GAAAoB,WACZ9B,MAAMW,MAAM,CAAA;IAAA;GAAA,CAAA,CAAA;EAAA,EAAA,CAAA,GAAAI,KAAA;EAAAE,OAAAF,aAGgBf,MAAMY,QAAQ;EAAA,OAAAC;CAAA,EAAA,CAAA;AAGrD;;AAGA,SAAgBkB,qBAAqB/B,OAAkD;CACrF,MAAMgC,YAAY,0BAA0BzC,eAAe;CAC3D,cAAA;EAAA,IAAA0C,QAAAC,QAAA;EAAAC,aAAAF,OAAA,mBAC4CD,SAAS;EAAAf,OAAAgB,OAAAf,gBAChDvB,MAAI,EAAA,IAAAiB,WAAA;GAAA,OAAA,CAAAM,gBACFpB,YAAU,EAAA,IAAAc,WAAA;IAAA,IAAAwB,QAAAC,QAAA;IAAAF,aAAAC,OAAA,MACDJ,SAAS;IAAAf,OAAAmB,aACdpC,MAAMC,KAAK;IAAA,OAAAmC;GAAA,EAAA,CAAA,GAAAlB,gBAGftB,aAAW;IAAA,SAAA;IAAA,IAAAgB,WAAA;KAAA,OAA6BZ,MAAMY;IAAQ;GAAA,CAAA,CAAA;EAAA,EAAA,CAAA,CAAA;EAAA,OAAAqB;CAAA,EAAA,CAAA;AAI/D"}
@@ -0,0 +1,78 @@
1
+ import type { JSX } from 'solid-js';
2
+ /** A host-owned catalog record reduced to the fields needed by the browser. */
3
+ export type CatalogBrowserEntry<Value> = Readonly<{
4
+ id: string;
5
+ value: Value;
6
+ name: string;
7
+ description: string;
8
+ category: string;
9
+ publisher: string;
10
+ installed: boolean;
11
+ }>;
12
+ /** One stable, host-ordered category in the browser. */
13
+ export type CatalogBrowserGroup<Value> = Readonly<{
14
+ id: string;
15
+ label: string;
16
+ entries: readonly CatalogBrowserEntry<Value>[];
17
+ }>;
18
+ export type CatalogBrowserTab = Readonly<{
19
+ id: string;
20
+ label: string;
21
+ /** A host-rendered view, such as navigation settings, outside the catalog. */
22
+ kind?: 'catalog' | 'supplemental';
23
+ }>;
24
+ export type CatalogBrowserNotice = Readonly<{
25
+ id: string;
26
+ role: 'alert' | 'status';
27
+ message: string;
28
+ }>;
29
+ export type CatalogBrowserMessage = Readonly<{
30
+ title: string;
31
+ description: string;
32
+ role?: 'alert' | 'status';
33
+ }>;
34
+ export type CatalogBrowserProps<Value> = Readonly<{
35
+ /** Optional layout hook for the host's containing surface. */
36
+ class?: string;
37
+ /** Whether the containing host surface is open; closing it clears view-only state. */
38
+ open: boolean;
39
+ tabs: readonly CatalogBrowserTab[];
40
+ tab: string;
41
+ tabsLabel: string;
42
+ onTabChange: (tab: string) => void;
43
+ /** A host-owned view is rendered in the same tab frame without catalog assumptions. */
44
+ renderSupplementalView?: (tab: string) => JSX.Element | undefined;
45
+ query: string;
46
+ onQueryChange: (query: string) => void;
47
+ searchLabel: string;
48
+ searchPlaceholder: string;
49
+ resultsRegionLabel: string;
50
+ filterControl?: JSX.Element;
51
+ resultCount: number;
52
+ resultLabel: (count: number) => string;
53
+ loadingLabel: string;
54
+ status: 'loading' | 'ready' | 'error';
55
+ catalogError: CatalogBrowserMessage;
56
+ catalogErrorAction?: JSX.Element;
57
+ installError?: string;
58
+ notices?: readonly CatalogBrowserNotice[];
59
+ emptyState: CatalogBrowserMessage;
60
+ emptyStateAction?: JSX.Element;
61
+ groups: readonly CatalogBrowserGroup<Value>[];
62
+ /** All selectable records, including records omitted by the current filter. */
63
+ entries: readonly CatalogBrowserEntry<Value>[];
64
+ selectedId: string | null;
65
+ onSelect: (value: Value) => void;
66
+ onBack: () => void;
67
+ backLabel: string;
68
+ detailRegionLabel: string;
69
+ installedLabel: string;
70
+ publishedByLabel: (publisher: string) => string;
71
+ showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string;
72
+ showLessLabel: string;
73
+ /** Temporarily disables catalog controls while a host menu owns interaction. */
74
+ interactionDisabled?: boolean;
75
+ renderIcon: (value: Value) => JSX.Element;
76
+ renderDetail: (value: Value) => JSX.Element;
77
+ }>;
78
+ //# sourceMappingURL=catalog-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-types.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/catalog-browser/catalog-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { CatalogBrowser } from './catalog-browser';
2
+ export { CatalogDetail, CatalogDetailSection } from './catalog-detail';
3
+ export type { CatalogBrowserEntry, CatalogBrowserGroup, CatalogBrowserMessage, CatalogBrowserNotice, CatalogBrowserProps, CatalogBrowserTab, } from './catalog-types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/catalog-browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACtE,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { CatalogBrowser } from "./catalog-browser.js";
2
+ import { CatalogDetail, CatalogDetailSection } from "./catalog-detail.js";
3
+ export { CatalogBrowser, CatalogDetail, CatalogDetailSection };