@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
package/README.md CHANGED
@@ -93,6 +93,85 @@ Ctrl/Cmd + arrow moves skip disabled columns without wrapping at the edges.
93
93
  After a controlled move settles, focus follows the moved card only when the
94
94
  source card owned focus; another focus or pointer action cancels restoration.
95
95
 
96
+ `CatalogBrowser` presents a host-owned searchable catalog with ordered category
97
+ groups, discover/installed tabs, bounded group expansion, optional filters and
98
+ supplemental tabs. Give `entries` the full set of detail records so opening an
99
+ item remains stable when a query or tab filters the visible `groups`. The host
100
+ owns catalog verification, filtering, installed state, permission decisions,
101
+ errors, and actions. Selecting an item opens its host-rendered detail and
102
+ returns focus to the originating result when Back is chosen. `CatalogDetail`
103
+ provides the shared item summary/action frame and `CatalogDetailSection` gives
104
+ host-specific permissions or metadata a shared section surface. Supply
105
+ `resultsRegionLabel` and `detailRegionLabel` to name their keyboard-focusable,
106
+ shared `ScrollArea` regions. The results area scrolls notices along with loading,
107
+ empty, and error states even when those states contain no interactive control.
108
+
109
+ ```tsx
110
+ import {
111
+ CatalogBrowser,
112
+ CatalogDetail,
113
+ CatalogDetailSection,
114
+ type CatalogBrowserEntry,
115
+ type CatalogBrowserGroup,
116
+ } from '@adea-ai/ui/components/composites/catalog-browser'
117
+
118
+ const entries: readonly CatalogBrowserEntry<VerifiedPlugin>[] = /* all detail records */ []
119
+ const groups: readonly CatalogBrowserGroup<VerifiedPlugin>[] = /* visible filtered groups */ []
120
+
121
+ <CatalogBrowser
122
+ open={open()}
123
+ tabs={[
124
+ { id: 'discover', label: 'Discover' },
125
+ { id: 'installed', label: 'Installed' },
126
+ { id: 'navigation', label: 'Navigation', kind: 'supplemental' },
127
+ ]}
128
+ tab={tab()}
129
+ tabsLabel="Catalog views"
130
+ onTabChange={setTab}
131
+ query={query()}
132
+ onQueryChange={setQuery}
133
+ searchLabel="Search catalog"
134
+ searchPlaceholder="Search applications"
135
+ resultsRegionLabel="Catalog results"
136
+ resultCount={visibleCount()}
137
+ resultLabel={(count) => `${count} applications`}
138
+ loadingLabel="Loading catalog"
139
+ status={catalogStatus()}
140
+ catalogError={catalogError()}
141
+ emptyState={emptyState()}
142
+ groups={groups}
143
+ entries={entries}
144
+ selectedId={selectedId()}
145
+ onSelect={(plugin) => setSelectedId(plugin.id)}
146
+ onBack={() => setSelectedId(null)}
147
+ backLabel="Back to catalog"
148
+ detailRegionLabel="Application details"
149
+ installedLabel="Installed"
150
+ publishedByLabel={(publisher) => `Published by ${publisher}`}
151
+ showMoreLabel={(hidden) => `See ${hidden[0]?.name} and more`}
152
+ showLessLabel="Show less"
153
+ renderIcon={(plugin) => <PluginIcon plugin={plugin} />}
154
+ renderDetail={(plugin) => (
155
+ <CatalogDetail
156
+ title={plugin.name}
157
+ description={plugin.description}
158
+ category={plugin.category}
159
+ publisher={plugin.publisher}
160
+ publishedByLabel={(publisher) => `Published by ${publisher}`}
161
+ action={<InstallButton plugin={plugin} />}
162
+ >
163
+ <CatalogDetailSection title="Permissions">
164
+ <PluginPermissions plugin={plugin} />
165
+ </CatalogDetailSection>
166
+ </CatalogDetail>
167
+ )}
168
+ renderSupplementalView={(id) => (id === 'navigation' ? <NavigationSettings /> : undefined)}
169
+ />
170
+ ```
171
+
172
+ The `CatalogBrowser` story demonstrates category expansion, search, separate
173
+ installed content, a supplemental navigation surface, and host-provided details.
174
+
96
175
  Tailwind ignores dependency directories by default. Register the component
97
176
  directories your application uses in its stylesheet, relative to that stylesheet:
98
177
 
package/dist/NOTICE CHANGED
@@ -390,3 +390,29 @@ Redux and Framer Motion ownership. Relevant test contracts come from
390
390
  `website/src/test/rowDisclosure.test.tsx`; compiled and Solid packed consumers are
391
391
  exercised in headless Chromium, WebKit and native Node SSR. Full runtime projection,
392
392
  durable application storage and production Chat adoption remain host-owned gates.
393
+
394
+ ## Catalog browser translated from KiroCrew (issue #425 selected unit)
395
+
396
+ `packages/ui/src/components/composites/catalog-browser/` translates the
397
+ category, search, discover/installed, result-detail and focus-return composition
398
+ from `website/src/pages/apps/DiscoverPage.tsx` and
399
+ `website/src/components/appstore/CategoryRail.tsx`, pinned at KiroCrew revision
400
+ `283e136c0f902e965a535a7c9548c57c7504fed0`.
401
+
402
+ Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
403
+ This product includes software developed at Amazon.com, Inc.
404
+ (https://www.amazon.com/). Licensed under the Apache License, Version 2.0.
405
+
406
+ The translated presentation keeps stable host-ordered categories, discover and
407
+ installed views, bounded category expansion, native search, item details, and
408
+ focus return to the selected result. `CatalogDetail` supplies a shared summary,
409
+ action and section frame; hosts own verified records, filtering, installed
410
+ truth, permissions, recovery, install effects and detail copy. The nearest
411
+ donor behavior tests are `website/playwright/apps.spec.ts` and
412
+ `website/src/test/appstoreCategories.test.ts`.
413
+
414
+ KiroCrew's React/runtime, catalog transport, account and entitlement state,
415
+ installation/execution authority, provider data and app-specific services are
416
+ excluded. Its distinct `/apps/library` core-app launchpad is also excluded:
417
+ this selected unit is the external verified plugin marketplace adapter, while
418
+ Adea's #757 App Library remains a separate core-view and rail-management flow.
@@ -0,0 +1,20 @@
1
+ import { type JSX } from 'solid-js';
2
+ import type { CatalogBrowserEntry, CatalogBrowserGroup as CatalogGroup } from './catalog-types';
3
+ export declare function CatalogLoadingState(props: {
4
+ label: string;
5
+ }): JSX.Element;
6
+ export declare function CatalogBrowserGroup<Value>(props: {
7
+ group: CatalogGroup<Value>;
8
+ expanded: boolean;
9
+ previewCount: number;
10
+ disabled: boolean;
11
+ installedLabel: string;
12
+ publishedByLabel: (publisher: string) => string;
13
+ showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string;
14
+ showLessLabel: string;
15
+ renderIcon: (value: Value) => JSX.Element;
16
+ onSelect: (entry: CatalogBrowserEntry<Value>, key: string) => void;
17
+ onRef: (key: string, element: HTMLButtonElement | undefined) => void;
18
+ onToggle: (id: string) => void;
19
+ }): JSX.Element;
20
+ //# sourceMappingURL=catalog-browser-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-browser-group.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/catalog-browser/catalog-browser-group.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAA;AAMzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE/F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,eAqB3D;AAiDD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE;IAChD,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,aAAa,EAAE,CAAC,OAAO,EAAE,SAAS,mBAAmB,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAAA;IACjG,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,GAAG,CAAC,OAAO,CAAA;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,KAAK,IAAI,CAAA;IACpE,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B,eAwDA"}
@@ -0,0 +1,195 @@
1
+ import { Badge } from "../../ui/badge/badge.js";
2
+ import { Button } from "../../ui/button/button.js";
3
+ import { Skeleton } from "../../ui/skeleton/skeleton.js";
4
+ import { keyedRows } from "../../../lib/keyed-rows.js";
5
+ import { createComponent, effect, insert, memo, setAttribute, template } from "solid-js/web";
6
+ import { ChevronDown, ChevronRight, ChevronUp } from "lucide-solid";
7
+ import { For, Show, createUniqueId, onCleanup } from "solid-js";
8
+ //#region src/components/composites/catalog-browser/catalog-browser-group.tsx
9
+ var _tmpl$ = /*#__PURE__*/ template(`<div class="grid min-w-0 grid-cols-1 gap-3 md:grid-cols-2"aria-busy=true>`);
10
+ var _tmpl$2 = /*#__PURE__*/ template(`<div class="flex min-w-0 items-center gap-3 rounded-xl border border-border p-3"><div class="grid min-w-0 flex-1 gap-2">`);
11
+ var _tmpl$3 = /*#__PURE__*/ template(`<span class=shrink-0>`);
12
+ var _tmpl$4 = /*#__PURE__*/ template(`<span class="flex min-w-0 flex-1 flex-col gap-1 text-left"><span class="flex min-w-0 flex-wrap items-center gap-2"><strong class="min-w-0 truncate"></strong></span><span class="text-muted-foreground line-clamp-2 text-xs"></span><span class="text-muted-foreground truncate text-2xs"> · `);
13
+ var _tmpl$5 = /*#__PURE__*/ template(`<section class="grid min-w-0 gap-2"><header class="flex min-w-0 items-center gap-2"><h3 class="min-w-0 flex-1 truncate text-sm font-semibold"></h3></header><div class="grid min-w-0 grid-cols-1 gap-2 md:grid-cols-2">`);
14
+ function CatalogLoadingState(props) {
15
+ return (() => {
16
+ var _el$ = _tmpl$();
17
+ insert(_el$, createComponent(For, {
18
+ each: [
19
+ 0,
20
+ 1,
21
+ 2,
22
+ 3,
23
+ 4,
24
+ 5,
25
+ 6
26
+ ],
27
+ children: () => (() => {
28
+ var _el$2 = _tmpl$2(), _el$3 = _el$2.firstChild;
29
+ insert(_el$2, createComponent(Skeleton, { "class": "size-9 shrink-0" }), _el$3);
30
+ insert(_el$3, createComponent(Skeleton, { "class": "h-4 w-2/5" }), null);
31
+ insert(_el$3, createComponent(Skeleton, { "class": "h-3 w-4/5" }), null);
32
+ insert(_el$3, createComponent(Skeleton, { "class": "h-3 w-3/5" }), null);
33
+ return _el$2;
34
+ })()
35
+ }));
36
+ effect(() => setAttribute(_el$, "aria-label", props.label));
37
+ return _el$;
38
+ })();
39
+ }
40
+ function CatalogBrowserRow(props) {
41
+ const key = JSON.stringify([props.groupId, props.entry.id]);
42
+ let element;
43
+ onCleanup(() => {
44
+ if (element) props.onRef(key, void 0);
45
+ });
46
+ return createComponent(Button, {
47
+ ref: (node) => {
48
+ element = node;
49
+ props.onRef(key, node);
50
+ },
51
+ get ["data-catalog-entry-id"]() {
52
+ return props.entry.id;
53
+ },
54
+ variant: "outline",
55
+ size: "lg",
56
+ "class": "h-auto min-h-row-lg w-full min-w-0 justify-start gap-3 whitespace-normal",
57
+ get disabled() {
58
+ return props.disabled;
59
+ },
60
+ onClick: () => props.onSelect(props.entry, key),
61
+ get children() {
62
+ return [
63
+ (() => {
64
+ var _el$4 = _tmpl$3();
65
+ insert(_el$4, () => props.renderIcon(props.entry.value));
66
+ return _el$4;
67
+ })(),
68
+ (() => {
69
+ var _el$5 = _tmpl$4(), _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$6.nextSibling, _el$9 = _el$8.nextSibling, _el$0 = _el$9.firstChild;
70
+ insert(_el$7, () => props.entry.name);
71
+ insert(_el$6, createComponent(Show, {
72
+ get when() {
73
+ return props.entry.installed;
74
+ },
75
+ get children() {
76
+ return createComponent(Badge, {
77
+ variant: "secondary",
78
+ get children() {
79
+ return props.installedLabel;
80
+ }
81
+ });
82
+ }
83
+ }), null);
84
+ insert(_el$8, () => props.entry.description);
85
+ insert(_el$9, () => props.publishedByLabel(props.entry.publisher), _el$0);
86
+ insert(_el$9, () => props.entry.category, null);
87
+ return _el$5;
88
+ })(),
89
+ createComponent(ChevronRight, { "aria-hidden": "true" })
90
+ ];
91
+ }
92
+ });
93
+ }
94
+ function CatalogBrowserGroup(props) {
95
+ const headingId = `catalog-browser-group-${createUniqueId()}`;
96
+ const listId = `catalog-browser-items-${createUniqueId()}`;
97
+ const hidden = () => props.group.entries.slice(props.previewCount);
98
+ const preview = () => props.expanded ? props.group.entries : props.group.entries.slice(0, props.previewCount);
99
+ const rows = keyedRows(preview, (entry) => entry.id);
100
+ return (() => {
101
+ var _el$1 = _tmpl$5(), _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild, _el$12 = _el$10.nextSibling;
102
+ setAttribute(_el$1, "aria-labelledby", headingId);
103
+ setAttribute(_el$11, "id", headingId);
104
+ insert(_el$11, () => props.group.label);
105
+ insert(_el$10, createComponent(Badge, {
106
+ variant: "outline",
107
+ get children() {
108
+ return props.group.entries.length;
109
+ }
110
+ }), null);
111
+ setAttribute(_el$12, "id", listId);
112
+ insert(_el$12, createComponent(For, {
113
+ get each() {
114
+ return rows();
115
+ },
116
+ children: (row) => createComponent(CatalogBrowserRow, {
117
+ get entry() {
118
+ return row.item();
119
+ },
120
+ get groupId() {
121
+ return props.group.id;
122
+ },
123
+ get installedLabel() {
124
+ return props.installedLabel;
125
+ },
126
+ get publishedByLabel() {
127
+ return props.publishedByLabel;
128
+ },
129
+ get disabled() {
130
+ return props.disabled;
131
+ },
132
+ get renderIcon() {
133
+ return props.renderIcon;
134
+ },
135
+ get onSelect() {
136
+ return props.onSelect;
137
+ },
138
+ get onRef() {
139
+ return props.onRef;
140
+ }
141
+ })
142
+ }));
143
+ insert(_el$1, createComponent(Show, {
144
+ get when() {
145
+ return hidden().length > 0;
146
+ },
147
+ get children() {
148
+ return createComponent(Button, {
149
+ variant: "ghost",
150
+ size: "lg",
151
+ get disabled() {
152
+ return props.disabled;
153
+ },
154
+ get ["aria-expanded"]() {
155
+ return props.expanded;
156
+ },
157
+ "aria-controls": listId,
158
+ onClick: () => props.onToggle(props.group.id),
159
+ get children() {
160
+ return createComponent(Show, {
161
+ get when() {
162
+ return props.expanded;
163
+ },
164
+ get fallback() {
165
+ return [
166
+ memo(() => props.showMoreLabel(hidden(), hidden().length)),
167
+ " ",
168
+ createComponent(ChevronDown, {
169
+ "data-icon": "inline-end",
170
+ "aria-hidden": "true"
171
+ })
172
+ ];
173
+ },
174
+ get children() {
175
+ return [
176
+ memo(() => props.showLessLabel),
177
+ " ",
178
+ createComponent(ChevronUp, {
179
+ "data-icon": "inline-end",
180
+ "aria-hidden": "true"
181
+ })
182
+ ];
183
+ }
184
+ });
185
+ }
186
+ });
187
+ }
188
+ }), null);
189
+ return _el$1;
190
+ })();
191
+ }
192
+ //#endregion
193
+ export { CatalogBrowserGroup, CatalogLoadingState };
194
+
195
+ //# sourceMappingURL=catalog-browser-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-browser-group.js","names":["createUniqueId","For","onCleanup","Show","JSX","ChevronDown","ChevronRight","ChevronUp","keyedRows","Badge","Button","Skeleton","CatalogBrowserEntry","CatalogBrowserGroup","CatalogGroup","CatalogLoadingState","props","label","_el$","_tmpl$","_$insert","_$createComponent","each","children","_el$2","_tmpl$2","_el$3","firstChild","_$effect","_$setAttribute","CatalogBrowserRow","entry","Value","groupId","installedLabel","publishedByLabel","publisher","disabled","renderIcon","value","Element","onSelect","key","onRef","element","HTMLButtonElement","JSON","stringify","id","undefined","ref","node","data-catalog-entry-id","variant","size","onClick","_el$4","_tmpl$3","_el$5","_tmpl$4","_el$6","_el$7","_el$8","nextSibling","_el$9","_el$0","name","when","installed","description","category","group","expanded","previewCount","showMoreLabel","entries","remainingCount","showLessLabel","onToggle","headingId","listId","hidden","slice","preview","rows","_el$1","_tmpl$5","_el$10","_el$11","_el$12","length","row","item","aria-expanded","fallback","_$memo","_$createComponent","_$setAttribute","_$memo"],"sources":["../../../../src/components/composites/catalog-browser/catalog-browser-group.tsx"],"sourcesContent":["import { createUniqueId, For, onCleanup, Show, type JSX } from 'solid-js'\nimport { ChevronDown, ChevronRight, ChevronUp } from 'lucide-solid'\nimport { keyedRows } from '#lib/keyed-rows'\nimport { Badge } from '../../ui/badge'\nimport { Button } from '../../ui/button'\nimport { Skeleton } from '../../ui/skeleton'\nimport type { CatalogBrowserEntry, CatalogBrowserGroup as CatalogGroup } from './catalog-types'\n\nexport function CatalogLoadingState(props: { label: string }) {\n return (\n <div\n class=\"grid min-w-0 grid-cols-1 gap-3 md:grid-cols-2\"\n aria-busy=\"true\"\n aria-label={props.label}\n >\n <For each={[0, 1, 2, 3, 4, 5, 6]}>\n {() => (\n <div class=\"flex min-w-0 items-center gap-3 rounded-xl border border-border p-3\">\n <Skeleton class=\"size-9 shrink-0\" />\n <div class=\"grid min-w-0 flex-1 gap-2\">\n <Skeleton class=\"h-4 w-2/5\" />\n <Skeleton class=\"h-3 w-4/5\" />\n <Skeleton class=\"h-3 w-3/5\" />\n </div>\n </div>\n )}\n </For>\n </div>\n )\n}\n\nfunction CatalogBrowserRow<Value>(props: {\n entry: CatalogBrowserEntry<Value>\n groupId: string\n installedLabel: string\n publishedByLabel: (publisher: string) => string\n disabled: boolean\n renderIcon: (value: Value) => JSX.Element\n onSelect: (entry: CatalogBrowserEntry<Value>, key: string) => void\n onRef: (key: string, element: HTMLButtonElement | undefined) => void\n}) {\n const key = JSON.stringify([props.groupId, props.entry.id])\n let element: HTMLButtonElement | undefined\n onCleanup(() => {\n if (element) props.onRef(key, undefined)\n })\n\n return (\n <Button\n ref={(node) => {\n element = node\n props.onRef(key, node)\n }}\n data-catalog-entry-id={props.entry.id}\n variant=\"outline\"\n size=\"lg\"\n class=\"h-auto min-h-row-lg w-full min-w-0 justify-start gap-3 whitespace-normal\"\n disabled={props.disabled}\n onClick={() => props.onSelect(props.entry, key)}\n >\n <span class=\"shrink-0\">{props.renderIcon(props.entry.value)}</span>\n <span class=\"flex min-w-0 flex-1 flex-col gap-1 text-left\">\n <span class=\"flex min-w-0 flex-wrap items-center gap-2\">\n <strong class=\"min-w-0 truncate\">{props.entry.name}</strong>\n <Show when={props.entry.installed}>\n <Badge variant=\"secondary\">{props.installedLabel}</Badge>\n </Show>\n </span>\n <span class=\"text-muted-foreground line-clamp-2 text-xs\">{props.entry.description}</span>\n <span class=\"text-muted-foreground truncate text-2xs\">\n {props.publishedByLabel(props.entry.publisher)} · {props.entry.category}\n </span>\n </span>\n <ChevronRight aria-hidden=\"true\" />\n </Button>\n )\n}\n\nexport function CatalogBrowserGroup<Value>(props: {\n group: CatalogGroup<Value>\n expanded: boolean\n previewCount: number\n disabled: boolean\n installedLabel: string\n publishedByLabel: (publisher: string) => string\n showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string\n showLessLabel: string\n renderIcon: (value: Value) => JSX.Element\n onSelect: (entry: CatalogBrowserEntry<Value>, key: string) => void\n onRef: (key: string, element: HTMLButtonElement | undefined) => void\n onToggle: (id: string) => void\n}) {\n const headingId = `catalog-browser-group-${createUniqueId()}`\n const listId = `catalog-browser-items-${createUniqueId()}`\n const hidden = () => props.group.entries.slice(props.previewCount)\n const preview = () =>\n props.expanded ? props.group.entries : props.group.entries.slice(0, props.previewCount)\n const rows = keyedRows(preview, (entry) => entry.id)\n\n return (\n <section class=\"grid min-w-0 gap-2\" aria-labelledby={headingId}>\n <header class=\"flex min-w-0 items-center gap-2\">\n <h3 id={headingId} class=\"min-w-0 flex-1 truncate text-sm font-semibold\">\n {props.group.label}\n </h3>\n <Badge variant=\"outline\">{props.group.entries.length}</Badge>\n </header>\n <div id={listId} class=\"grid min-w-0 grid-cols-1 gap-2 md:grid-cols-2\">\n <For each={rows()}>\n {(row) => (\n <CatalogBrowserRow\n entry={row.item()}\n groupId={props.group.id}\n installedLabel={props.installedLabel}\n publishedByLabel={props.publishedByLabel}\n disabled={props.disabled}\n renderIcon={props.renderIcon}\n onSelect={props.onSelect}\n onRef={props.onRef}\n />\n )}\n </For>\n </div>\n <Show when={hidden().length > 0}>\n <Button\n variant=\"ghost\"\n size=\"lg\"\n disabled={props.disabled}\n aria-expanded={props.expanded}\n aria-controls={listId}\n onClick={() => props.onToggle(props.group.id)}\n >\n <Show\n when={props.expanded}\n fallback={\n <>\n {props.showMoreLabel(hidden(), hidden().length)}{' '}\n <ChevronDown data-icon=\"inline-end\" aria-hidden=\"true\" />\n </>\n }\n >\n {props.showLessLabel} <ChevronUp data-icon=\"inline-end\" aria-hidden=\"true\" />\n </Show>\n </Button>\n </Show>\n </section>\n )\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CatalogBrowserProps } from './catalog-types';
2
+ export declare function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>): import("solid-js").JSX.Element;
3
+ //# sourceMappingURL=catalog-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-browser.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/catalog-browser/catalog-browser.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC,kCA8OtE"}