@adea-ai/ui 0.95.7 → 0.96.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.
- package/dist/components/composites/catalog-browser/catalog-browser-group.d.ts +0 -1
- package/dist/components/composites/catalog-browser/catalog-browser-group.d.ts.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-browser-group.js +16 -18
- package/dist/components/composites/catalog-browser/catalog-browser-group.js.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-browser.d.ts.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-browser.js +7 -7
- package/dist/components/composites/catalog-browser/catalog-browser.js.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-detail.d.ts +1 -1
- package/dist/components/composites/catalog-browser/catalog-detail.d.ts.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-detail.js +57 -73
- package/dist/components/composites/catalog-browser/catalog-detail.js.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-types.d.ts +2 -1
- package/dist/components/composites/catalog-browser/catalog-types.d.ts.map +1 -1
- package/dist/r/catalog-browser.json +0 -1
- package/dist/r/registry.json +0 -1
- package/dist/r/src/components/composites/catalog-browser/catalog-browser-group.tsx +19 -8
- package/dist/r/src/components/composites/catalog-browser/catalog-browser.tsx +5 -3
- package/dist/r/src/components/composites/catalog-browser/catalog-detail.tsx +36 -35
- package/dist/r/src/components/composites/catalog-browser/catalog-types.ts +2 -1
- package/package.json +1 -1
- package/registry.json +0 -1
- package/src/components/composites/catalog-browser/catalog-browser-group.tsx +19 -8
- package/src/components/composites/catalog-browser/catalog-browser.tsx +5 -3
- package/src/components/composites/catalog-browser/catalog-detail.tsx +36 -35
- package/src/components/composites/catalog-browser/catalog-types.ts +2 -1
|
@@ -9,7 +9,6 @@ export declare function CatalogBrowserGroup<Value>(props: {
|
|
|
9
9
|
previewCount: number;
|
|
10
10
|
disabled: boolean;
|
|
11
11
|
installedLabel: string;
|
|
12
|
-
publishedByLabel: (publisher: string) => string;
|
|
13
12
|
showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string;
|
|
14
13
|
showLessLabel: string;
|
|
15
14
|
renderIcon: (value: Value) => JSX.Element;
|
|
@@ -1 +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;
|
|
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;AA8DD,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,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,eA4DA"}
|
|
@@ -9,7 +9,7 @@ import { For, Show, createUniqueId, onCleanup } from "solid-js";
|
|
|
9
9
|
var _tmpl$ = /*#__PURE__*/ template(`<div class="grid min-w-0 grid-cols-1 gap-3 md:grid-cols-2"aria-busy=true>`);
|
|
10
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
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="
|
|
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="flex min-w-0 items-center gap-1.5 text-xs"><span class="text-muted-foreground min-w-0 truncate"></span><span class="ms-auto flex shrink-0 items-center gap-1"><span class="rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary"></span><span class="rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary">`);
|
|
13
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
14
|
function CatalogLoadingState(props) {
|
|
15
15
|
return (() => {
|
|
@@ -53,7 +53,7 @@ function CatalogBrowserRow(props) {
|
|
|
53
53
|
},
|
|
54
54
|
variant: "outline",
|
|
55
55
|
size: "lg",
|
|
56
|
-
"class": "h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 whitespace-normal",
|
|
56
|
+
"class": "h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 py-2.5 whitespace-normal",
|
|
57
57
|
get disabled() {
|
|
58
58
|
return props.disabled;
|
|
59
59
|
},
|
|
@@ -66,7 +66,7 @@ function CatalogBrowserRow(props) {
|
|
|
66
66
|
return _el$4;
|
|
67
67
|
})(),
|
|
68
68
|
(() => {
|
|
69
|
-
var _el$5 = _tmpl$4(), _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$
|
|
69
|
+
var _el$5 = _tmpl$4(), _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$9 = _el$6.nextSibling.firstChild, _el$1 = _el$9.nextSibling.firstChild, _el$10 = _el$1.nextSibling;
|
|
70
70
|
insert(_el$7, () => props.entry.name);
|
|
71
71
|
insert(_el$6, createComponent(Show, {
|
|
72
72
|
get when() {
|
|
@@ -81,9 +81,9 @@ function CatalogBrowserRow(props) {
|
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
83
|
}), null);
|
|
84
|
-
insert(_el$
|
|
85
|
-
insert(_el$
|
|
86
|
-
insert(_el$
|
|
84
|
+
insert(_el$9, () => props.entry.description);
|
|
85
|
+
insert(_el$1, () => props.entry.publisher);
|
|
86
|
+
insert(_el$10, () => props.entry.category);
|
|
87
87
|
return _el$5;
|
|
88
88
|
})(),
|
|
89
89
|
createComponent(ChevronRight, { "aria-hidden": "true" })
|
|
@@ -98,18 +98,19 @@ function CatalogBrowserGroup(props) {
|
|
|
98
98
|
const preview = () => props.expanded ? props.group.entries : props.group.entries.slice(0, props.previewCount);
|
|
99
99
|
const rows = keyedRows(preview, (entry) => entry.id);
|
|
100
100
|
return (() => {
|
|
101
|
-
var _el$
|
|
102
|
-
setAttribute(_el$
|
|
103
|
-
setAttribute(_el$
|
|
104
|
-
insert(_el$
|
|
105
|
-
insert(_el$
|
|
101
|
+
var _el$11 = _tmpl$5(), _el$12 = _el$11.firstChild, _el$13 = _el$12.firstChild, _el$14 = _el$12.nextSibling;
|
|
102
|
+
setAttribute(_el$11, "aria-labelledby", headingId);
|
|
103
|
+
setAttribute(_el$13, "id", headingId);
|
|
104
|
+
insert(_el$13, () => props.group.label);
|
|
105
|
+
insert(_el$12, createComponent(Badge, {
|
|
106
106
|
variant: "outline",
|
|
107
|
+
"class": "border-primary/25 bg-primary-subtle tabular-nums text-primary",
|
|
107
108
|
get children() {
|
|
108
109
|
return props.group.entries.length;
|
|
109
110
|
}
|
|
110
111
|
}), null);
|
|
111
|
-
setAttribute(_el$
|
|
112
|
-
insert(_el$
|
|
112
|
+
setAttribute(_el$14, "id", listId);
|
|
113
|
+
insert(_el$14, createComponent(For, {
|
|
113
114
|
get each() {
|
|
114
115
|
return rows();
|
|
115
116
|
},
|
|
@@ -123,9 +124,6 @@ function CatalogBrowserGroup(props) {
|
|
|
123
124
|
get installedLabel() {
|
|
124
125
|
return props.installedLabel;
|
|
125
126
|
},
|
|
126
|
-
get publishedByLabel() {
|
|
127
|
-
return props.publishedByLabel;
|
|
128
|
-
},
|
|
129
127
|
get disabled() {
|
|
130
128
|
return props.disabled;
|
|
131
129
|
},
|
|
@@ -140,7 +138,7 @@ function CatalogBrowserGroup(props) {
|
|
|
140
138
|
}
|
|
141
139
|
})
|
|
142
140
|
}));
|
|
143
|
-
insert(_el$
|
|
141
|
+
insert(_el$11, createComponent(Show, {
|
|
144
142
|
get when() {
|
|
145
143
|
return hidden().length > 0;
|
|
146
144
|
},
|
|
@@ -186,7 +184,7 @@ function CatalogBrowserGroup(props) {
|
|
|
186
184
|
});
|
|
187
185
|
}
|
|
188
186
|
}), null);
|
|
189
|
-
return _el$
|
|
187
|
+
return _el$11;
|
|
190
188
|
})();
|
|
191
189
|
}
|
|
192
190
|
//#endregion
|
|
@@ -1 +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 // `h-auto!` must stay important: the size token's fixed `h-control-lg`\n // is a custom class tailwind-merge cannot conflict-resolve, so an\n // unimportant `h-auto` loses the stylesheet sort and clamps this\n // multi-line row to one control line, spilling its content over the\n // neighbouring rows.\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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"}
|
|
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","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","_el$1","_el$10","name","when","installed","description","publisher","category","group","expanded","previewCount","showMoreLabel","entries","remainingCount","showLessLabel","onToggle","headingId","listId","hidden","slice","preview","rows","_el$11","_tmpl$5","_el$12","_el$13","_el$14","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 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 // `h-auto!` must stay important: the size token's fixed `h-control-lg`\n // is a custom class tailwind-merge cannot conflict-resolve, so an\n // unimportant `h-auto` loses the stylesheet sort and clamps this\n // multi-line row to one control line, spilling its content over the\n // neighbouring rows.\n class=\"h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 py-2.5 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 {/* Exactly one content line: the description truncates and the\n publisher and category ride the same line as accent chips. */}\n <span class=\"flex min-w-0 items-center gap-1.5 text-xs\">\n <span class=\"text-muted-foreground min-w-0 truncate\">{props.entry.description}</span>\n <span class=\"ms-auto flex shrink-0 items-center gap-1\">\n <span class=\"rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary\">\n {props.entry.publisher}\n </span>\n <span class=\"rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary\">\n {props.entry.category}\n </span>\n </span>\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 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\n variant=\"outline\"\n class=\"border-primary/25 bg-primary-subtle tabular-nums text-primary\"\n >\n {props.group.entries.length}\n </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 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":";;;;;;;;;;;;;AAQA,SAAgBe,oBAAoBC,OAA0B;CAC5D,cAAA;EAAA,IAAAE,OAAAC,OAAA;EAAAC,OAAAF,MAAAG,gBAMKpB,KAAG;GAACqB,MAAM;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;IAAG;GAAC;GAACC,uBAC7B;IAAA,IAAAC,QAAAC,QAAA,GAAAC,QAAAF,MAAAG;IAAAP,OAAAI,OAAAH,gBAEIV,UAAQ,EAAA,SAAA,kBAAA,CAAA,GAAAe,KAAA;IAAAN,OAAAM,OAAAL,gBAENV,UAAQ,EAAA,SAAA,YAAA,CAAA,GAAA,IAAA;IAAAS,OAAAM,OAAAL,gBACRV,UAAQ,EAAA,SAAA,YAAA,CAAA,GAAA,IAAA;IAAAS,OAAAM,OAAAL,gBACRV,UAAQ,EAAA,SAAA,YAAA,CAAA,GAAA,IAAA;IAAA,OAAAa;GAAA,EAAA,CAAA;EAGd,CAAA,CAAA;EAAAI,aAAAC,aAAAX,MAAA,cAZSF,MAAMC,KAAK,CAAA;EAAA,OAAAC;CAAA,EAAA,CAAA;AAgB7B;AAEA,SAASY,kBAAyBd,OAQ/B;CACD,MAAMwB,MAAMI,KAAKC,UAAU,CAAC7B,MAAMiB,SAASjB,MAAMe,MAAMe,EAAE,CAAC;CAC1D,IAAIJ;CACJxC,gBAAgB;EACd,IAAIwC,SAAS1B,MAAMyB,MAAMD,KAAKO,KAAAA,CAAS;CACzC,CAAC;CAED,OAAA1B,gBACGX,QAAM;EAAAsC,MACCC,SAAS;GACbP,UAAUO;GACVjC,MAAMyB,MAAMD,KAAKS,IAAI;EACvB;EAAC,KAAA,2BAAA;GAAA,OACsBjC,MAAMe,MAAMe;EAAE;EACrCK,SAAO;EACPC,MAAI;EAAA,SAAA;EAAA,IAOJjB,WAAQ;GAAA,OAAEnB,MAAMmB;EAAQ;EACxBkB,eAAerC,MAAMuB,SAASvB,MAAMe,OAAOS,GAAG;EAAC,IAAAjB,WAAA;GAAA,OAAA;WAAA;KAAA,IAAA+B,QAAAC,QAAA;KAAAnC,OAAAkC,aAEvBtC,MAAMoB,WAAWpB,MAAMe,MAAMM,KAAK,CAAC;KAAA,OAAAiB;IAAA,EAAA,CAAA;WAAA;KAAA,IAAAE,QAAAC,QAAA,GAAAC,QAAAF,MAAA7B,YAAAgC,QAAAD,MAAA/B,YAAAmC,QAAAJ,MAAAG,YAAAlC,YAAAqC,QAAAF,MAAAD,YAAAlC,YAAAsC,SAAAD,MAAAH;KAAAzC,OAAAuC,aAGrB3C,MAAMe,MAAMmC,IAAI;KAAA9C,OAAAsC,OAAArC,gBACjDlB,MAAI;MAAA,IAACgE,OAAI;OAAA,OAAEnD,MAAMe,MAAMqC;MAAS;MAAA,IAAA7C,WAAA;OAAA,OAAAF,gBAC9BZ,OAAK;QAAC0C,SAAO;QAAA,IAAA5B,WAAA;SAAA,OAAcP,MAAMkB;QAAc;OAAA,CAAA;MAAA;KAAA,CAAA,GAAA,IAAA;KAAAd,OAAA0C,aAMI9C,MAAMe,MAAMsC,WAAW;KAAAjD,OAAA4C,aAGxEhD,MAAMe,MAAMuC,SAAS;KAAAlD,OAAA6C,cAGrBjD,MAAMe,MAAMwC,QAAQ;KAAA,OAAAf;IAAA,EAAA,CAAA;IAAAnC,gBAK5Bf,cAAY,EAAA,eAAA,OAAA,CAAA;GAAA;EAAA;CAAA,CAAA;AAGnB;AAEA,SAAgBO,oBAA2BG,OAYxC;CACD,MAAMgE,YAAY,yBAAyBhF,eAAe;CAC1D,MAAMiF,SAAS,yBAAyBjF,eAAe;CACvD,MAAMkF,eAAelE,MAAMwD,MAAMI,QAAQO,MAAMnE,MAAM0D,YAAY;CACjE,MAAMU,gBACJpE,MAAMyD,WAAWzD,MAAMwD,MAAMI,UAAU5D,MAAMwD,MAAMI,QAAQO,MAAM,GAAGnE,MAAM0D,YAAY;CACxF,MAAMW,OAAO7E,UAAU4E,UAAUrD,UAAUA,MAAMe,EAAE;CAEnD,cAAA;EAAA,IAAAwC,SAAAC,QAAA,GAAAC,SAAAF,OAAA3D,YAAA8D,SAAAD,OAAA7D,YAAA+D,SAAAF,OAAA3B;EAAAhC,aAAAyD,QAAA,mBACuDN,SAAS;EAAAnD,aAAA4D,QAAA,MAElDT,SAAS;EAAA5D,OAAAqE,cACdzE,MAAMwD,MAAMvD,KAAK;EAAAG,OAAAoE,QAAAnE,gBAEnBZ,OAAK;GACJ0C,SAAO;GAAA,SAAA;GAAA,IAAA5B,WAAA;IAAA,OAGNP,MAAMwD,MAAMI,QAAQe;GAAM;EAAA,CAAA,GAAA,IAAA;EAAA9D,aAAA6D,QAAA,MAGtBT,MAAM;EAAA7D,OAAAsE,QAAArE,gBACZpB,KAAG;GAAA,IAACqB,OAAI;IAAA,OAAE+D,KAAK;GAAC;GAAA9D,WACbqE,QAAGvE,gBACFS,mBAAiB;IAAA,IAChBC,QAAK;KAAA,OAAE6D,IAAIC,KAAK;IAAC;IAAA,IACjB5D,UAAO;KAAA,OAAEjB,MAAMwD,MAAM1B;IAAE;IAAA,IACvBZ,iBAAc;KAAA,OAAElB,MAAMkB;IAAc;IAAA,IACpCC,WAAQ;KAAA,OAAEnB,MAAMmB;IAAQ;IAAA,IACxBC,aAAU;KAAA,OAAEpB,MAAMoB;IAAU;IAAA,IAC5BG,WAAQ;KAAA,OAAEvB,MAAMuB;IAAQ;IAAA,IACxBE,QAAK;KAAA,OAAEzB,MAAMyB;IAAK;GAAA,CAAA;EAErB,CAAA,CAAA;EAAArB,OAAAkE,QAAAjE,gBAGJlB,MAAI;GAAA,IAACgE,OAAI;IAAA,OAAEe,OAAO,CAAC,CAACS,SAAS;GAAC;GAAA,IAAApE,WAAA;IAAA,OAAAF,gBAC5BX,QAAM;KACLyC,SAAO;KACPC,MAAI;KAAA,IACJjB,WAAQ;MAAA,OAAEnB,MAAMmB;KAAQ;KAAA,KAAA,mBAAA;MAAA,OACTnB,MAAMyD;KAAQ;KAAA,iBACdQ;KACf5B,eAAerC,MAAM+D,SAAS/D,MAAMwD,MAAM1B,EAAE;KAAC,IAAAvB,WAAA;MAAA,OAAAF,gBAE5ClB,MAAI;OAAA,IACHgE,OAAI;QAAA,OAAEnD,MAAMyD;OAAQ;OAAA,IACpBsB,WAAQ;QAAA,OAAA;SAAAC,WAEHhF,MAAM2D,cAAcO,OAAO,GAAGA,OAAO,CAAC,CAACS,MAAM,CAAC;SAAE;SAAGtE,gBACnDhB,aAAW;UAAA,aAAA;UAAA,eAAA;SAAA,CAAA;QAAA;OAAA;OAAA,IAAAkB,WAAA;QAAA,OAAA;SAAAyE,WAIfhF,MAAM8D,aAAa;SAAA;SAAAzD,gBAAGd,WAAS;UAAA,aAAA;UAAA,eAAA;SAAA,CAAA;QAAA;OAAA;MAAA,CAAA;KAAA;IAAA,CAAA;GAAA;EAAA,CAAA,GAAA,IAAA;EAAA,OAAA+E;CAAA,EAAA,CAAA;AAM5C"}
|
|
@@ -1 +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,
|
|
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,kCAgPtE"}
|
|
@@ -11,7 +11,7 @@ import { ArrowLeft, Blocks, Search } from "lucide-solid";
|
|
|
11
11
|
import { For, Show, createEffect, createMemo, createSignal, onCleanup } from "solid-js";
|
|
12
12
|
//#region src/components/composites/catalog-browser/catalog-browser.tsx
|
|
13
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-
|
|
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-primary ms-auto text-sm font-medium tabular-nums"role=status>`);
|
|
15
15
|
var _tmpl$3 = /*#__PURE__*/ template(`<div class="grid min-w-0 gap-5">`);
|
|
16
16
|
var _tmpl$4 = /*#__PURE__*/ template(`<p class="text-destructive px-4 pt-2 text-sm"role=alert>`);
|
|
17
17
|
var _tmpl$5 = /*#__PURE__*/ template(`<p class="text-muted-foreground text-sm">`);
|
|
@@ -148,9 +148,12 @@ function CatalogBrowser(props) {
|
|
|
148
148
|
insert(_el$2, createComponent(InputGroup, {
|
|
149
149
|
"class": "min-w-0 flex-1 sm:max-w-md",
|
|
150
150
|
get children() {
|
|
151
|
-
return [createComponent(InputGroupAddon, {
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
return [createComponent(InputGroupAddon, {
|
|
152
|
+
"class": "text-primary",
|
|
153
|
+
get children() {
|
|
154
|
+
return createComponent(Search, { "aria-hidden": "true" });
|
|
155
|
+
}
|
|
156
|
+
}), createComponent(InputGroupInput, {
|
|
154
157
|
ref: (element) => searchInput = element,
|
|
155
158
|
type: "search",
|
|
156
159
|
get ["aria-label"]() {
|
|
@@ -292,9 +295,6 @@ function CatalogBrowser(props) {
|
|
|
292
295
|
get installedLabel() {
|
|
293
296
|
return props.installedLabel;
|
|
294
297
|
},
|
|
295
|
-
get publishedByLabel() {
|
|
296
|
-
return props.publishedByLabel;
|
|
297
|
-
},
|
|
298
298
|
get showMoreLabel() {
|
|
299
299
|
return props.showMoreLabel;
|
|
300
300
|
},
|
|
@@ -1 +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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"}
|
|
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","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 class=\"text-primary\">\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\n class=\"text-primary ms-auto text-sm font-medium tabular-nums\"\n role=\"status\"\n >\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 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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"}
|
|
@@ -13,7 +13,7 @@ export declare function CatalogDetail(props: {
|
|
|
13
13
|
status?: JSX.Element;
|
|
14
14
|
children?: JSX.Element;
|
|
15
15
|
}): JSX.Element;
|
|
16
|
-
/** A shared
|
|
16
|
+
/** A shared compact row for host-specific fields, permissions, and copy. */
|
|
17
17
|
export declare function CatalogDetailSection(props: {
|
|
18
18
|
title: string;
|
|
19
19
|
children?: JSX.Element;
|
|
@@ -1 +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;
|
|
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;AAGzD,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,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAAE,eAgBpF"}
|
|
@@ -1,89 +1,73 @@
|
|
|
1
1
|
import { Badge } from "../../ui/badge/badge.js";
|
|
2
|
-
import {
|
|
3
|
-
import { createComponent, insert, memo, setAttribute, template } from "solid-js/web";
|
|
2
|
+
import { createComponent, insert, setAttribute, template } from "solid-js/web";
|
|
4
3
|
import { Show, createUniqueId } from "solid-js";
|
|
5
4
|
//#region src/components/composites/catalog-browser/catalog-detail.tsx
|
|
6
5
|
var _tmpl$ = /*#__PURE__*/ template(`<span class=shrink-0>`);
|
|
7
|
-
var _tmpl$2 = /*#__PURE__*/ template(`<div class="
|
|
8
|
-
var _tmpl$3 = /*#__PURE__*/ template(`<article class="grid min-w-0 gap-
|
|
9
|
-
var _tmpl$4 = /*#__PURE__*/ template(`<h3 class="text-
|
|
10
|
-
var _tmpl$5 = /*#__PURE__*/ template(`<section class=min-w-0>`);
|
|
6
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<div class="flex shrink-0 flex-col items-end gap-2">`);
|
|
7
|
+
var _tmpl$3 = /*#__PURE__*/ template(`<article class="grid min-w-0 gap-2"data-catalog-detail><div class="flex min-w-0 items-start gap-3 rounded-xl border border-border p-3"><div class="grid min-w-0 flex-1 gap-1"><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"></p></div></div><div class="grid min-w-0 gap-2">`);
|
|
8
|
+
var _tmpl$4 = /*#__PURE__*/ template(`<section class="grid min-w-0 gap-1.5 rounded-xl border border-border p-3"><h3 class="text-2xs font-semibold tracking-wider text-muted-foreground uppercase"></h3><div class="grid min-w-0 gap-1.5">`);
|
|
11
9
|
/** Shared item summary and action frame for catalog-owned detail content. */
|
|
12
10
|
function CatalogDetail(props) {
|
|
13
11
|
return (() => {
|
|
14
|
-
var _el$ = _tmpl$3(), _el$
|
|
15
|
-
insert(_el
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
})];
|
|
62
|
-
} }), _el$8);
|
|
63
|
-
insert(_el$8, () => props.children);
|
|
12
|
+
var _el$ = _tmpl$3(), _el$2 = _el$.firstChild, _el$4 = _el$2.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling, _el$0 = _el$2.nextSibling;
|
|
13
|
+
insert(_el$2, createComponent(Show, {
|
|
14
|
+
get when() {
|
|
15
|
+
return props.leading;
|
|
16
|
+
},
|
|
17
|
+
get children() {
|
|
18
|
+
var _el$3 = _tmpl$();
|
|
19
|
+
insert(_el$3, () => props.leading);
|
|
20
|
+
return _el$3;
|
|
21
|
+
}
|
|
22
|
+
}), _el$4);
|
|
23
|
+
insert(_el$5, createComponent(Show, {
|
|
24
|
+
get when() {
|
|
25
|
+
return props.eyebrow;
|
|
26
|
+
},
|
|
27
|
+
get children() {
|
|
28
|
+
return createComponent(Badge, {
|
|
29
|
+
variant: "outline",
|
|
30
|
+
get children() {
|
|
31
|
+
return props.eyebrow;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}), null);
|
|
36
|
+
insert(_el$5, createComponent(Badge, {
|
|
37
|
+
variant: "secondary",
|
|
38
|
+
get children() {
|
|
39
|
+
return props.category;
|
|
40
|
+
}
|
|
41
|
+
}), null);
|
|
42
|
+
insert(_el$5, () => props.badges, null);
|
|
43
|
+
insert(_el$6, () => props.title);
|
|
44
|
+
insert(_el$7, () => props.description);
|
|
45
|
+
insert(_el$8, () => props.publishedByLabel(props.publisher));
|
|
46
|
+
insert(_el$2, createComponent(Show, {
|
|
47
|
+
get when() {
|
|
48
|
+
return props.action || props.status;
|
|
49
|
+
},
|
|
50
|
+
get children() {
|
|
51
|
+
var _el$9 = _tmpl$2();
|
|
52
|
+
insert(_el$9, () => props.action, null);
|
|
53
|
+
insert(_el$9, () => props.status, null);
|
|
54
|
+
return _el$9;
|
|
55
|
+
}
|
|
56
|
+
}), null);
|
|
57
|
+
insert(_el$0, () => props.children);
|
|
64
58
|
return _el$;
|
|
65
59
|
})();
|
|
66
60
|
}
|
|
67
|
-
/** A shared
|
|
61
|
+
/** A shared compact row for host-specific fields, permissions, and copy. */
|
|
68
62
|
function CatalogDetailSection(props) {
|
|
69
63
|
const headingId = `catalog-detail-section-${createUniqueId()}`;
|
|
70
64
|
return (() => {
|
|
71
|
-
var _el$
|
|
72
|
-
setAttribute(_el$
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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;
|
|
65
|
+
var _el$1 = _tmpl$4(), _el$10 = _el$1.firstChild, _el$11 = _el$10.nextSibling;
|
|
66
|
+
setAttribute(_el$1, "aria-labelledby", headingId);
|
|
67
|
+
setAttribute(_el$10, "id", headingId);
|
|
68
|
+
insert(_el$10, () => props.title);
|
|
69
|
+
insert(_el$11, () => props.children);
|
|
70
|
+
return _el$1;
|
|
87
71
|
})();
|
|
88
72
|
}
|
|
89
73
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-detail.js","names":["createUniqueId","Show","JSX","Badge","
|
|
1
|
+
{"version":3,"file":"catalog-detail.js","names":["createUniqueId","Show","JSX","Badge","CatalogDetail","props","title","description","category","publisher","publishedByLabel","leading","Element","eyebrow","badges","action","status","children","_el$","_tmpl$3","_el$2","firstChild","_el$4","_el$5","_el$6","nextSibling","_el$7","_el$8","_el$0","_$insert","_$createComponent","when","_el$3","_tmpl$","variant","_el$9","_tmpl$2","CatalogDetailSection","headingId","_el$1","_tmpl$4","_el$10","_el$11","_$setAttribute","_$createComponent"],"sources":["../../../../src/components/composites/catalog-browser/catalog-detail.tsx"],"sourcesContent":["import { createUniqueId, Show, type JSX } from 'solid-js'\nimport { Badge } from '../../ui/badge'\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-2\" data-catalog-detail>\n <div class=\"flex min-w-0 items-start gap-3 rounded-xl border border-border p-3\">\n <Show when={props.leading}>\n <span class=\"shrink-0\">{props.leading}</span>\n </Show>\n <div class=\"grid min-w-0 flex-1 gap-1\">\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 <Show when={props.action || props.status}>\n <div class=\"flex shrink-0 flex-col items-end gap-2\">\n {props.action}\n {props.status}\n </div>\n </Show>\n </div>\n <div class=\"grid min-w-0 gap-2\">{props.children}</div>\n </article>\n )\n}\n\n/** A shared compact row 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\n class=\"grid min-w-0 gap-1.5 rounded-xl border border-border p-3\"\n aria-labelledby={headingId}\n >\n <h3\n id={headingId}\n class=\"text-2xs font-semibold tracking-wider text-muted-foreground uppercase\"\n >\n {props.title}\n </h3>\n <div class=\"grid min-w-0 gap-1.5\">{props.children}</div>\n </section>\n )\n}\n"],"mappings":";;;;;;;;;AAIA,SAAgBI,cAAcC,OAY3B;CACD,cAAA;EAAA,IAAAa,OAAAC,QAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAD,YAAAG,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAD,MAAAD,aAAAG,QAAAR,MAAAK;EAAAI,OAAAT,OAAAU,gBAGO7B,MAAI;GAAA,IAAC8B,OAAI;IAAA,OAAE1B,MAAMM;GAAO;GAAA,IAAAM,WAAA;IAAA,IAAAe,QAAAC,OAAA;IAAAJ,OAAAG,aACC3B,MAAMM,OAAO;IAAA,OAAAqB;GAAA;EAAA,CAAA,GAAAV,KAAA;EAAAO,OAAAN,OAAAO,gBAIlC7B,MAAI;GAAA,IAAC8B,OAAI;IAAA,OAAE1B,MAAMQ;GAAO;GAAA,IAAAI,WAAA;IAAA,OAAAa,gBACtB3B,OAAK;KAAC+B,SAAO;KAAA,IAAAjB,WAAA;MAAA,OAAYZ,MAAMQ;KAAO;IAAA,CAAA;GAAA;EAAA,CAAA,GAAA,IAAA;EAAAgB,OAAAN,OAAAO,gBAExC3B,OAAK;GAAC+B,SAAO;GAAA,IAAAjB,WAAA;IAAA,OAAcZ,MAAMG;GAAQ;EAAA,CAAA,GAAA,IAAA;EAAAqB,OAAAN,aACzClB,MAAMS,QAAM,IAAA;EAAAe,OAAAL,aAEmDnB,MAAMC,KAAK;EAAAuB,OAAAH,aACnCrB,MAAME,WAAW;EAAAsB,OAAAF,aACjBtB,MAAMK,iBAAiBL,MAAMI,SAAS,CAAC;EAAAoB,OAAAT,OAAAU,gBAElF7B,MAAI;GAAA,IAAC8B,OAAI;IAAA,OAAE1B,MAAMU,UAAUV,MAAMW;GAAM;GAAA,IAAAC,WAAA;IAAA,IAAAkB,QAAAC,QAAA;IAAAP,OAAAM,aAEnC9B,MAAMU,QAAM,IAAA;IAAAc,OAAAM,aACZ9B,MAAMW,QAAM,IAAA;IAAA,OAAAmB;GAAA;EAAA,CAAA,GAAA,IAAA;EAAAN,OAAAD,aAIcvB,MAAMY,QAAQ;EAAA,OAAAC;CAAA,EAAA,CAAA;AAGrD;;AAGA,SAAgBmB,qBAAqBhC,OAAkD;CACrF,MAAMiC,YAAY,0BAA0BtC,eAAe;CAC3D,cAAA;EAAA,IAAAuC,QAAAC,QAAA,GAAAC,SAAAF,MAAAlB,YAAAqB,SAAAD,OAAAhB;EAAAkB,aAAAJ,OAAA,mBAGqBD,SAAS;EAAAK,aAAAF,QAAA,MAGpBH,SAAS;EAAAT,OAAAY,cAGZpC,MAAMC,KAAK;EAAAuB,OAAAa,cAEqBrC,MAAMY,QAAQ;EAAA,OAAAsB;CAAA,EAAA,CAAA;AAGvD"}
|
|
@@ -67,7 +67,8 @@ export type CatalogBrowserProps<Value> = Readonly<{
|
|
|
67
67
|
backLabel: string;
|
|
68
68
|
detailRegionLabel: string;
|
|
69
69
|
installedLabel: string;
|
|
70
|
-
|
|
70
|
+
/** Optional legacy label: rows now show the bare publisher as an accent chip. */
|
|
71
|
+
publishedByLabel?: (publisher: string) => string;
|
|
71
72
|
showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string;
|
|
72
73
|
showLessLabel: string;
|
|
73
74
|
/** Temporarily disables catalog controls while a host menu owns interaction. */
|
|
@@ -1 +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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
|
|
1
|
+
{"version":3,"file":"catalog-types.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/catalog-browser/catalog-types.ts"],"names":[],"mappings":"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"}
|
package/dist/r/registry.json
CHANGED
|
@@ -33,7 +33,6 @@ function CatalogBrowserRow<Value>(props: {
|
|
|
33
33
|
entry: CatalogBrowserEntry<Value>
|
|
34
34
|
groupId: string
|
|
35
35
|
installedLabel: string
|
|
36
|
-
publishedByLabel: (publisher: string) => string
|
|
37
36
|
disabled: boolean
|
|
38
37
|
renderIcon: (value: Value) => JSX.Element
|
|
39
38
|
onSelect: (entry: CatalogBrowserEntry<Value>, key: string) => void
|
|
@@ -59,7 +58,7 @@ function CatalogBrowserRow<Value>(props: {
|
|
|
59
58
|
// unimportant `h-auto` loses the stylesheet sort and clamps this
|
|
60
59
|
// multi-line row to one control line, spilling its content over the
|
|
61
60
|
// neighbouring rows.
|
|
62
|
-
class="h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 whitespace-normal"
|
|
61
|
+
class="h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 py-2.5 whitespace-normal"
|
|
63
62
|
disabled={props.disabled}
|
|
64
63
|
onClick={() => props.onSelect(props.entry, key)}
|
|
65
64
|
>
|
|
@@ -71,9 +70,18 @@ function CatalogBrowserRow<Value>(props: {
|
|
|
71
70
|
<Badge variant="secondary">{props.installedLabel}</Badge>
|
|
72
71
|
</Show>
|
|
73
72
|
</span>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
{/* Exactly one content line: the description truncates and the
|
|
74
|
+
publisher and category ride the same line as accent chips. */}
|
|
75
|
+
<span class="flex min-w-0 items-center gap-1.5 text-xs">
|
|
76
|
+
<span class="text-muted-foreground min-w-0 truncate">{props.entry.description}</span>
|
|
77
|
+
<span class="ms-auto flex shrink-0 items-center gap-1">
|
|
78
|
+
<span class="rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary">
|
|
79
|
+
{props.entry.publisher}
|
|
80
|
+
</span>
|
|
81
|
+
<span class="rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary">
|
|
82
|
+
{props.entry.category}
|
|
83
|
+
</span>
|
|
84
|
+
</span>
|
|
77
85
|
</span>
|
|
78
86
|
</span>
|
|
79
87
|
<ChevronRight aria-hidden="true" />
|
|
@@ -87,7 +95,6 @@ export function CatalogBrowserGroup<Value>(props: {
|
|
|
87
95
|
previewCount: number
|
|
88
96
|
disabled: boolean
|
|
89
97
|
installedLabel: string
|
|
90
|
-
publishedByLabel: (publisher: string) => string
|
|
91
98
|
showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string
|
|
92
99
|
showLessLabel: string
|
|
93
100
|
renderIcon: (value: Value) => JSX.Element
|
|
@@ -108,7 +115,12 @@ export function CatalogBrowserGroup<Value>(props: {
|
|
|
108
115
|
<h3 id={headingId} class="min-w-0 flex-1 truncate text-sm font-semibold">
|
|
109
116
|
{props.group.label}
|
|
110
117
|
</h3>
|
|
111
|
-
<Badge
|
|
118
|
+
<Badge
|
|
119
|
+
variant="outline"
|
|
120
|
+
class="border-primary/25 bg-primary-subtle tabular-nums text-primary"
|
|
121
|
+
>
|
|
122
|
+
{props.group.entries.length}
|
|
123
|
+
</Badge>
|
|
112
124
|
</header>
|
|
113
125
|
<div id={listId} class="grid min-w-0 grid-cols-1 gap-2 md:grid-cols-2">
|
|
114
126
|
<For each={rows()}>
|
|
@@ -117,7 +129,6 @@ export function CatalogBrowserGroup<Value>(props: {
|
|
|
117
129
|
entry={row.item()}
|
|
118
130
|
groupId={props.group.id}
|
|
119
131
|
installedLabel={props.installedLabel}
|
|
120
|
-
publishedByLabel={props.publishedByLabel}
|
|
121
132
|
disabled={props.disabled}
|
|
122
133
|
renderIcon={props.renderIcon}
|
|
123
134
|
onSelect={props.onSelect}
|
|
@@ -131,7 +131,7 @@ export function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>) {
|
|
|
131
131
|
<div class="flex min-w-0 shrink-0 flex-wrap items-center gap-2 px-4 pt-2">
|
|
132
132
|
{props.filterControl}
|
|
133
133
|
<InputGroup class="min-w-0 flex-1 sm:max-w-md">
|
|
134
|
-
<InputGroupAddon>
|
|
134
|
+
<InputGroupAddon class="text-primary">
|
|
135
135
|
<Search aria-hidden="true" />
|
|
136
136
|
</InputGroupAddon>
|
|
137
137
|
<InputGroupInput
|
|
@@ -143,7 +143,10 @@ export function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>) {
|
|
|
143
143
|
onInput={(event) => props.onQueryChange(event.currentTarget.value)}
|
|
144
144
|
/>
|
|
145
145
|
</InputGroup>
|
|
146
|
-
<span
|
|
146
|
+
<span
|
|
147
|
+
class="text-primary ms-auto text-sm font-medium tabular-nums"
|
|
148
|
+
role="status"
|
|
149
|
+
>
|
|
147
150
|
{countLabel()}
|
|
148
151
|
</span>
|
|
149
152
|
</div>
|
|
@@ -200,7 +203,6 @@ export function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>) {
|
|
|
200
203
|
previewCount={previewCount()}
|
|
201
204
|
disabled={props.interactionDisabled ?? false}
|
|
202
205
|
installedLabel={props.installedLabel}
|
|
203
|
-
publishedByLabel={props.publishedByLabel}
|
|
204
206
|
showMoreLabel={props.showMoreLabel}
|
|
205
207
|
showLessLabel={props.showLessLabel}
|
|
206
208
|
renderIcon={props.renderIcon}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { createUniqueId, Show, type JSX } from 'solid-js'
|
|
2
2
|
import { Badge } from '../../ui/badge'
|
|
3
|
-
import { Card, CardContent, CardFooter, CardHeader } from '../../ui/card'
|
|
4
3
|
|
|
5
4
|
/** Shared item summary and action frame for catalog-owned detail content. */
|
|
6
5
|
export function CatalogDetail(props: {
|
|
@@ -17,48 +16,50 @@ export function CatalogDetail(props: {
|
|
|
17
16
|
children?: JSX.Element
|
|
18
17
|
}) {
|
|
19
18
|
return (
|
|
20
|
-
<article class="grid min-w-0 gap-
|
|
21
|
-
<
|
|
22
|
-
<
|
|
23
|
-
<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<div class="
|
|
27
|
-
<
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{props.badges}
|
|
33
|
-
</div>
|
|
34
|
-
<h2 class="text-base leading-tight font-semibold tracking-tight">{props.title}</h2>
|
|
35
|
-
<p class="text-muted-foreground text-sm">{props.description}</p>
|
|
36
|
-
<p class="text-muted-foreground text-xs">{props.publishedByLabel(props.publisher)}</p>
|
|
19
|
+
<article class="grid min-w-0 gap-2" data-catalog-detail>
|
|
20
|
+
<div class="flex min-w-0 items-start gap-3 rounded-xl border border-border p-3">
|
|
21
|
+
<Show when={props.leading}>
|
|
22
|
+
<span class="shrink-0">{props.leading}</span>
|
|
23
|
+
</Show>
|
|
24
|
+
<div class="grid min-w-0 flex-1 gap-1">
|
|
25
|
+
<div class="flex min-w-0 flex-wrap items-center gap-1.5">
|
|
26
|
+
<Show when={props.eyebrow}>
|
|
27
|
+
<Badge variant="outline">{props.eyebrow}</Badge>
|
|
28
|
+
</Show>
|
|
29
|
+
<Badge variant="secondary">{props.category}</Badge>
|
|
30
|
+
{props.badges}
|
|
37
31
|
</div>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{props.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
<h2 class="text-base leading-tight font-semibold tracking-tight">{props.title}</h2>
|
|
33
|
+
<p class="text-muted-foreground text-sm">{props.description}</p>
|
|
34
|
+
<p class="text-muted-foreground text-xs">{props.publishedByLabel(props.publisher)}</p>
|
|
35
|
+
</div>
|
|
36
|
+
<Show when={props.action || props.status}>
|
|
37
|
+
<div class="flex shrink-0 flex-col items-end gap-2">
|
|
38
|
+
{props.action}
|
|
39
|
+
{props.status}
|
|
40
|
+
</div>
|
|
41
|
+
</Show>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="grid min-w-0 gap-2">{props.children}</div>
|
|
45
44
|
</article>
|
|
46
45
|
)
|
|
47
46
|
}
|
|
48
47
|
|
|
49
|
-
/** A shared
|
|
48
|
+
/** A shared compact row for host-specific fields, permissions, and copy. */
|
|
50
49
|
export function CatalogDetailSection(props: { title: string; children?: JSX.Element }) {
|
|
51
50
|
const headingId = `catalog-detail-section-${createUniqueId()}`
|
|
52
51
|
return (
|
|
53
|
-
<section
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
<section
|
|
53
|
+
class="grid min-w-0 gap-1.5 rounded-xl border border-border p-3"
|
|
54
|
+
aria-labelledby={headingId}
|
|
55
|
+
>
|
|
56
|
+
<h3
|
|
57
|
+
id={headingId}
|
|
58
|
+
class="text-2xs font-semibold tracking-wider text-muted-foreground uppercase"
|
|
59
|
+
>
|
|
60
|
+
{props.title}
|
|
61
|
+
</h3>
|
|
62
|
+
<div class="grid min-w-0 gap-1.5">{props.children}</div>
|
|
62
63
|
</section>
|
|
63
64
|
)
|
|
64
65
|
}
|
|
@@ -73,7 +73,8 @@ export type CatalogBrowserProps<Value> = Readonly<{
|
|
|
73
73
|
backLabel: string
|
|
74
74
|
detailRegionLabel: string
|
|
75
75
|
installedLabel: string
|
|
76
|
-
|
|
76
|
+
/** Optional legacy label: rows now show the bare publisher as an accent chip. */
|
|
77
|
+
publishedByLabel?: (publisher: string) => string
|
|
77
78
|
showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string
|
|
78
79
|
showLessLabel: string
|
|
79
80
|
/** Temporarily disables catalog controls while a host menu owns interaction. */
|
package/package.json
CHANGED
package/registry.json
CHANGED
|
@@ -33,7 +33,6 @@ function CatalogBrowserRow<Value>(props: {
|
|
|
33
33
|
entry: CatalogBrowserEntry<Value>
|
|
34
34
|
groupId: string
|
|
35
35
|
installedLabel: string
|
|
36
|
-
publishedByLabel: (publisher: string) => string
|
|
37
36
|
disabled: boolean
|
|
38
37
|
renderIcon: (value: Value) => JSX.Element
|
|
39
38
|
onSelect: (entry: CatalogBrowserEntry<Value>, key: string) => void
|
|
@@ -59,7 +58,7 @@ function CatalogBrowserRow<Value>(props: {
|
|
|
59
58
|
// unimportant `h-auto` loses the stylesheet sort and clamps this
|
|
60
59
|
// multi-line row to one control line, spilling its content over the
|
|
61
60
|
// neighbouring rows.
|
|
62
|
-
class="h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 whitespace-normal"
|
|
61
|
+
class="h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 py-2.5 whitespace-normal"
|
|
63
62
|
disabled={props.disabled}
|
|
64
63
|
onClick={() => props.onSelect(props.entry, key)}
|
|
65
64
|
>
|
|
@@ -71,9 +70,18 @@ function CatalogBrowserRow<Value>(props: {
|
|
|
71
70
|
<Badge variant="secondary">{props.installedLabel}</Badge>
|
|
72
71
|
</Show>
|
|
73
72
|
</span>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
{/* Exactly one content line: the description truncates and the
|
|
74
|
+
publisher and category ride the same line as accent chips. */}
|
|
75
|
+
<span class="flex min-w-0 items-center gap-1.5 text-xs">
|
|
76
|
+
<span class="text-muted-foreground min-w-0 truncate">{props.entry.description}</span>
|
|
77
|
+
<span class="ms-auto flex shrink-0 items-center gap-1">
|
|
78
|
+
<span class="rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary">
|
|
79
|
+
{props.entry.publisher}
|
|
80
|
+
</span>
|
|
81
|
+
<span class="rounded bg-primary-subtle px-1.5 py-0.5 text-2xs font-medium text-primary">
|
|
82
|
+
{props.entry.category}
|
|
83
|
+
</span>
|
|
84
|
+
</span>
|
|
77
85
|
</span>
|
|
78
86
|
</span>
|
|
79
87
|
<ChevronRight aria-hidden="true" />
|
|
@@ -87,7 +95,6 @@ export function CatalogBrowserGroup<Value>(props: {
|
|
|
87
95
|
previewCount: number
|
|
88
96
|
disabled: boolean
|
|
89
97
|
installedLabel: string
|
|
90
|
-
publishedByLabel: (publisher: string) => string
|
|
91
98
|
showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string
|
|
92
99
|
showLessLabel: string
|
|
93
100
|
renderIcon: (value: Value) => JSX.Element
|
|
@@ -108,7 +115,12 @@ export function CatalogBrowserGroup<Value>(props: {
|
|
|
108
115
|
<h3 id={headingId} class="min-w-0 flex-1 truncate text-sm font-semibold">
|
|
109
116
|
{props.group.label}
|
|
110
117
|
</h3>
|
|
111
|
-
<Badge
|
|
118
|
+
<Badge
|
|
119
|
+
variant="outline"
|
|
120
|
+
class="border-primary/25 bg-primary-subtle tabular-nums text-primary"
|
|
121
|
+
>
|
|
122
|
+
{props.group.entries.length}
|
|
123
|
+
</Badge>
|
|
112
124
|
</header>
|
|
113
125
|
<div id={listId} class="grid min-w-0 grid-cols-1 gap-2 md:grid-cols-2">
|
|
114
126
|
<For each={rows()}>
|
|
@@ -117,7 +129,6 @@ export function CatalogBrowserGroup<Value>(props: {
|
|
|
117
129
|
entry={row.item()}
|
|
118
130
|
groupId={props.group.id}
|
|
119
131
|
installedLabel={props.installedLabel}
|
|
120
|
-
publishedByLabel={props.publishedByLabel}
|
|
121
132
|
disabled={props.disabled}
|
|
122
133
|
renderIcon={props.renderIcon}
|
|
123
134
|
onSelect={props.onSelect}
|
|
@@ -131,7 +131,7 @@ export function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>) {
|
|
|
131
131
|
<div class="flex min-w-0 shrink-0 flex-wrap items-center gap-2 px-4 pt-2">
|
|
132
132
|
{props.filterControl}
|
|
133
133
|
<InputGroup class="min-w-0 flex-1 sm:max-w-md">
|
|
134
|
-
<InputGroupAddon>
|
|
134
|
+
<InputGroupAddon class="text-primary">
|
|
135
135
|
<Search aria-hidden="true" />
|
|
136
136
|
</InputGroupAddon>
|
|
137
137
|
<InputGroupInput
|
|
@@ -143,7 +143,10 @@ export function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>) {
|
|
|
143
143
|
onInput={(event) => props.onQueryChange(event.currentTarget.value)}
|
|
144
144
|
/>
|
|
145
145
|
</InputGroup>
|
|
146
|
-
<span
|
|
146
|
+
<span
|
|
147
|
+
class="text-primary ms-auto text-sm font-medium tabular-nums"
|
|
148
|
+
role="status"
|
|
149
|
+
>
|
|
147
150
|
{countLabel()}
|
|
148
151
|
</span>
|
|
149
152
|
</div>
|
|
@@ -200,7 +203,6 @@ export function CatalogBrowser<Value>(props: CatalogBrowserProps<Value>) {
|
|
|
200
203
|
previewCount={previewCount()}
|
|
201
204
|
disabled={props.interactionDisabled ?? false}
|
|
202
205
|
installedLabel={props.installedLabel}
|
|
203
|
-
publishedByLabel={props.publishedByLabel}
|
|
204
206
|
showMoreLabel={props.showMoreLabel}
|
|
205
207
|
showLessLabel={props.showLessLabel}
|
|
206
208
|
renderIcon={props.renderIcon}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { createUniqueId, Show, type JSX } from 'solid-js'
|
|
2
2
|
import { Badge } from '../../ui/badge'
|
|
3
|
-
import { Card, CardContent, CardFooter, CardHeader } from '../../ui/card'
|
|
4
3
|
|
|
5
4
|
/** Shared item summary and action frame for catalog-owned detail content. */
|
|
6
5
|
export function CatalogDetail(props: {
|
|
@@ -17,48 +16,50 @@ export function CatalogDetail(props: {
|
|
|
17
16
|
children?: JSX.Element
|
|
18
17
|
}) {
|
|
19
18
|
return (
|
|
20
|
-
<article class="grid min-w-0 gap-
|
|
21
|
-
<
|
|
22
|
-
<
|
|
23
|
-
<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<div class="
|
|
27
|
-
<
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{props.badges}
|
|
33
|
-
</div>
|
|
34
|
-
<h2 class="text-base leading-tight font-semibold tracking-tight">{props.title}</h2>
|
|
35
|
-
<p class="text-muted-foreground text-sm">{props.description}</p>
|
|
36
|
-
<p class="text-muted-foreground text-xs">{props.publishedByLabel(props.publisher)}</p>
|
|
19
|
+
<article class="grid min-w-0 gap-2" data-catalog-detail>
|
|
20
|
+
<div class="flex min-w-0 items-start gap-3 rounded-xl border border-border p-3">
|
|
21
|
+
<Show when={props.leading}>
|
|
22
|
+
<span class="shrink-0">{props.leading}</span>
|
|
23
|
+
</Show>
|
|
24
|
+
<div class="grid min-w-0 flex-1 gap-1">
|
|
25
|
+
<div class="flex min-w-0 flex-wrap items-center gap-1.5">
|
|
26
|
+
<Show when={props.eyebrow}>
|
|
27
|
+
<Badge variant="outline">{props.eyebrow}</Badge>
|
|
28
|
+
</Show>
|
|
29
|
+
<Badge variant="secondary">{props.category}</Badge>
|
|
30
|
+
{props.badges}
|
|
37
31
|
</div>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{props.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
<h2 class="text-base leading-tight font-semibold tracking-tight">{props.title}</h2>
|
|
33
|
+
<p class="text-muted-foreground text-sm">{props.description}</p>
|
|
34
|
+
<p class="text-muted-foreground text-xs">{props.publishedByLabel(props.publisher)}</p>
|
|
35
|
+
</div>
|
|
36
|
+
<Show when={props.action || props.status}>
|
|
37
|
+
<div class="flex shrink-0 flex-col items-end gap-2">
|
|
38
|
+
{props.action}
|
|
39
|
+
{props.status}
|
|
40
|
+
</div>
|
|
41
|
+
</Show>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="grid min-w-0 gap-2">{props.children}</div>
|
|
45
44
|
</article>
|
|
46
45
|
)
|
|
47
46
|
}
|
|
48
47
|
|
|
49
|
-
/** A shared
|
|
48
|
+
/** A shared compact row for host-specific fields, permissions, and copy. */
|
|
50
49
|
export function CatalogDetailSection(props: { title: string; children?: JSX.Element }) {
|
|
51
50
|
const headingId = `catalog-detail-section-${createUniqueId()}`
|
|
52
51
|
return (
|
|
53
|
-
<section
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
<section
|
|
53
|
+
class="grid min-w-0 gap-1.5 rounded-xl border border-border p-3"
|
|
54
|
+
aria-labelledby={headingId}
|
|
55
|
+
>
|
|
56
|
+
<h3
|
|
57
|
+
id={headingId}
|
|
58
|
+
class="text-2xs font-semibold tracking-wider text-muted-foreground uppercase"
|
|
59
|
+
>
|
|
60
|
+
{props.title}
|
|
61
|
+
</h3>
|
|
62
|
+
<div class="grid min-w-0 gap-1.5">{props.children}</div>
|
|
62
63
|
</section>
|
|
63
64
|
)
|
|
64
65
|
}
|
|
@@ -73,7 +73,8 @@ export type CatalogBrowserProps<Value> = Readonly<{
|
|
|
73
73
|
backLabel: string
|
|
74
74
|
detailRegionLabel: string
|
|
75
75
|
installedLabel: string
|
|
76
|
-
|
|
76
|
+
/** Optional legacy label: rows now show the bare publisher as an accent chip. */
|
|
77
|
+
publishedByLabel?: (publisher: string) => string
|
|
77
78
|
showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string
|
|
78
79
|
showLessLabel: string
|
|
79
80
|
/** Temporarily disables catalog controls while a host menu owns interaction. */
|