@adea-ai/ui 0.95.6 → 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.
Files changed (25) hide show
  1. package/dist/components/composites/catalog-browser/catalog-browser-group.d.ts +0 -1
  2. package/dist/components/composites/catalog-browser/catalog-browser-group.d.ts.map +1 -1
  3. package/dist/components/composites/catalog-browser/catalog-browser-group.js +16 -18
  4. package/dist/components/composites/catalog-browser/catalog-browser-group.js.map +1 -1
  5. package/dist/components/composites/catalog-browser/catalog-browser.d.ts.map +1 -1
  6. package/dist/components/composites/catalog-browser/catalog-browser.js +7 -7
  7. package/dist/components/composites/catalog-browser/catalog-browser.js.map +1 -1
  8. package/dist/components/composites/catalog-browser/catalog-detail.d.ts +1 -1
  9. package/dist/components/composites/catalog-browser/catalog-detail.d.ts.map +1 -1
  10. package/dist/components/composites/catalog-browser/catalog-detail.js +57 -73
  11. package/dist/components/composites/catalog-browser/catalog-detail.js.map +1 -1
  12. package/dist/components/composites/catalog-browser/catalog-types.d.ts +2 -1
  13. package/dist/components/composites/catalog-browser/catalog-types.d.ts.map +1 -1
  14. package/dist/r/catalog-browser.json +0 -1
  15. package/dist/r/registry.json +0 -1
  16. package/dist/r/src/components/composites/catalog-browser/catalog-browser-group.tsx +24 -8
  17. package/dist/r/src/components/composites/catalog-browser/catalog-browser.tsx +5 -3
  18. package/dist/r/src/components/composites/catalog-browser/catalog-detail.tsx +36 -35
  19. package/dist/r/src/components/composites/catalog-browser/catalog-types.ts +2 -1
  20. package/package.json +1 -1
  21. package/registry.json +0 -1
  22. package/src/components/composites/catalog-browser/catalog-browser-group.tsx +24 -8
  23. package/src/components/composites/catalog-browser/catalog-browser.tsx +5 -3
  24. package/src/components/composites/catalog-browser/catalog-detail.tsx +36 -35
  25. 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;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"}
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="text-muted-foreground line-clamp-2 text-xs"></span><span class="text-muted-foreground truncate text-2xs"> · `);
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$8 = _el$6.nextSibling, _el$9 = _el$8.nextSibling, _el$0 = _el$9.firstChild;
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$8, () => props.entry.description);
85
- insert(_el$9, () => props.publishedByLabel(props.entry.publisher), _el$0);
86
- insert(_el$9, () => props.entry.category, null);
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$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, {
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$12, "id", listId);
112
- insert(_el$12, createComponent(For, {
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$1, createComponent(Show, {
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$1;
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 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":"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"}
@@ -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,kCA8OtE"}
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-muted-foreground ms-auto text-sm"role=status>`);
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, { get children() {
152
- return createComponent(Search, { "aria-hidden": "true" });
153
- } }), createComponent(InputGroupInput, {
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 surface and heading for host-specific fields, permissions, and copy. */
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;AAIzD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,eA6BA;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAAE,eAcpF"}
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 { Card, CardContent, CardFooter, CardHeader } from "../../ui/card/card.js";
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="grid min-w-0 gap-1.5"><div class="flex min-w-0 flex-wrap items-center gap-1.5"></div><h2 class="text-base leading-tight font-semibold tracking-tight"></h2><p class="text-muted-foreground text-sm"></p><p class="text-muted-foreground text-xs">`);
8
- var _tmpl$3 = /*#__PURE__*/ template(`<article class="grid min-w-0 gap-4"data-catalog-detail><div class="grid min-w-0 gap-3">`);
9
- var _tmpl$4 = /*#__PURE__*/ template(`<h3 class="text-sm font-semibold tracking-tight">`);
10
- var _tmpl$5 = /*#__PURE__*/ template(`<section class=min-w-0>`);
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$8 = _el$.firstChild;
15
- insert(_el$, createComponent(Card, { get children() {
16
- return [createComponent(CardHeader, {
17
- "class": "flex-row items-start gap-3",
18
- get children() {
19
- return [createComponent(Show, {
20
- get when() {
21
- return props.leading;
22
- },
23
- get children() {
24
- var _el$2 = _tmpl$();
25
- insert(_el$2, () => props.leading);
26
- return _el$2;
27
- }
28
- }), (() => {
29
- var _el$3 = _tmpl$2(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling;
30
- insert(_el$4, createComponent(Show, {
31
- get when() {
32
- return props.eyebrow;
33
- },
34
- get children() {
35
- return createComponent(Badge, {
36
- variant: "outline",
37
- get children() {
38
- return props.eyebrow;
39
- }
40
- });
41
- }
42
- }), null);
43
- insert(_el$4, createComponent(Badge, {
44
- variant: "secondary",
45
- get children() {
46
- return props.category;
47
- }
48
- }), null);
49
- insert(_el$4, () => props.badges, null);
50
- insert(_el$5, () => props.title);
51
- insert(_el$6, () => props.description);
52
- insert(_el$7, () => props.publishedByLabel(props.publisher));
53
- return _el$3;
54
- })()];
55
- }
56
- }), createComponent(CardFooter, {
57
- "class": "flex-wrap justify-between gap-3",
58
- get children() {
59
- return [memo(() => props.action), memo(() => props.status)];
60
- }
61
- })];
62
- } }), _el$8);
63
- insert(_el$8, () => props.children);
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 surface and heading for host-specific fields, permissions, and copy. */
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$9 = _tmpl$5();
72
- setAttribute(_el$9, "aria-labelledby", headingId);
73
- insert(_el$9, createComponent(Card, { get children() {
74
- return [createComponent(CardHeader, { get children() {
75
- var _el$0 = _tmpl$4();
76
- setAttribute(_el$0, "id", headingId);
77
- insert(_el$0, () => props.title);
78
- return _el$0;
79
- } }), createComponent(CardContent, {
80
- "class": "grid min-w-0 gap-3",
81
- get children() {
82
- return props.children;
83
- }
84
- })];
85
- } }));
86
- return _el$9;
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","Card","CardContent","CardFooter","CardHeader","CatalogDetail","props","title","description","category","publisher","publishedByLabel","leading","Element","eyebrow","badges","action","status","children","_el$","_tmpl$3","_el$8","firstChild","_$insert","_$createComponent","when","_el$2","_tmpl$","_el$3","_tmpl$2","_el$4","_el$5","nextSibling","_el$6","_el$7","variant","_$memo","CatalogDetailSection","headingId","_el$9","_tmpl$5","_$setAttribute","_el$0","_tmpl$4","_$createComponent","_$memo"],"sources":["../../../../src/components/composites/catalog-browser/catalog-detail.tsx"],"sourcesContent":["import { createUniqueId, Show, type JSX } from 'solid-js'\nimport { Badge } from '../../ui/badge'\nimport { Card, CardContent, CardFooter, CardHeader } from '../../ui/card'\n\n/** Shared item summary and action frame for catalog-owned detail content. */\nexport function CatalogDetail(props: {\n title: string\n description: string\n category: string\n publisher: string\n publishedByLabel: (publisher: string) => string\n leading?: JSX.Element\n eyebrow?: string\n badges?: JSX.Element\n action?: JSX.Element\n status?: JSX.Element\n children?: JSX.Element\n}) {\n return (\n <article class=\"grid min-w-0 gap-4\" data-catalog-detail>\n <Card>\n <CardHeader class=\"flex-row items-start gap-3\">\n <Show when={props.leading}>\n <span class=\"shrink-0\">{props.leading}</span>\n </Show>\n <div class=\"grid min-w-0 gap-1.5\">\n <div class=\"flex min-w-0 flex-wrap items-center gap-1.5\">\n <Show when={props.eyebrow}>\n <Badge variant=\"outline\">{props.eyebrow}</Badge>\n </Show>\n <Badge variant=\"secondary\">{props.category}</Badge>\n {props.badges}\n </div>\n <h2 class=\"text-base leading-tight font-semibold tracking-tight\">{props.title}</h2>\n <p class=\"text-muted-foreground text-sm\">{props.description}</p>\n <p class=\"text-muted-foreground text-xs\">{props.publishedByLabel(props.publisher)}</p>\n </div>\n </CardHeader>\n <CardFooter class=\"flex-wrap justify-between gap-3\">\n {props.action}\n {props.status}\n </CardFooter>\n </Card>\n <div class=\"grid min-w-0 gap-3\">{props.children}</div>\n </article>\n )\n}\n\n/** A shared surface and heading for host-specific fields, permissions, and copy. */\nexport function CatalogDetailSection(props: { title: string; children?: JSX.Element }) {\n const headingId = `catalog-detail-section-${createUniqueId()}`\n return (\n <section class=\"min-w-0\" aria-labelledby={headingId}>\n <Card>\n <CardHeader>\n <h3 id={headingId} class=\"text-sm font-semibold tracking-tight\">\n {props.title}\n </h3>\n </CardHeader>\n <CardContent class=\"grid min-w-0 gap-3\">{props.children}</CardContent>\n </Card>\n </section>\n )\n}\n"],"mappings":";;;;;;;;;;;AAKA,SAAgBQ,cAAcC,OAY3B;CACD,cAAA;EAAA,IAAAa,OAAAC,QAAA,GAAAC,QAAAF,KAAAG;EAAAC,OAAAJ,MAAAK,gBAEKvB,MAAI,EAAA,IAAAiB,WAAA;GAAA,OAAA,CAAAM,gBACFpB,YAAU;IAAA,SAAA;IAAA,IAAAc,WAAA;KAAA,OAAA,CAAAM,gBACR1B,MAAI;MAAA,IAAC2B,OAAI;OAAA,OAAEnB,MAAMM;MAAO;MAAA,IAAAM,WAAA;OAAA,IAAAQ,QAAAC,OAAA;OAAAJ,OAAAG,aACCpB,MAAMM,OAAO;OAAA,OAAAc;MAAA;KAAA,CAAA,UAAA;MAAA,IAAAE,QAAAC,QAAA,GAAAC,QAAAF,MAAAN,YAAAS,QAAAD,MAAAE,aAAAC,QAAAF,MAAAC,aAAAE,QAAAD,MAAAD;MAAAT,OAAAO,OAAAN,gBAIlC1B,MAAI;OAAA,IAAC2B,OAAI;QAAA,OAAEnB,MAAMQ;OAAO;OAAA,IAAAI,WAAA;QAAA,OAAAM,gBACtBxB,OAAK;SAACmC,SAAO;SAAA,IAAAjB,WAAA;UAAA,OAAYZ,MAAMQ;SAAO;QAAA,CAAA;OAAA;MAAA,CAAA,GAAA,IAAA;MAAAS,OAAAO,OAAAN,gBAExCxB,OAAK;OAACmC,SAAO;OAAA,IAAAjB,WAAA;QAAA,OAAcZ,MAAMG;OAAQ;MAAA,CAAA,GAAA,IAAA;MAAAc,OAAAO,aACzCxB,MAAMS,QAAM,IAAA;MAAAQ,OAAAQ,aAEmDzB,MAAMC,KAAK;MAAAgB,OAAAU,aACnC3B,MAAME,WAAW;MAAAe,OAAAW,aACjB5B,MAAMK,iBAAiBL,MAAMI,SAAS,CAAC;MAAA,OAAAkB;KAAA,EAAA,CAAA,CAAA;IAAA;GAAA,CAAA,GAAAJ,gBAGpFrB,YAAU;IAAA,SAAA;IAAA,IAAAe,WAAA;KAAA,OAAA,CAAAkB,WACR9B,MAAMU,MAAM,GAAAoB,WACZ9B,MAAMW,MAAM,CAAA;IAAA;GAAA,CAAA,CAAA;EAAA,EAAA,CAAA,GAAAI,KAAA;EAAAE,OAAAF,aAGgBf,MAAMY,QAAQ;EAAA,OAAAC;CAAA,EAAA,CAAA;AAGrD;;AAGA,SAAgBkB,qBAAqB/B,OAAkD;CACrF,MAAMgC,YAAY,0BAA0BzC,eAAe;CAC3D,cAAA;EAAA,IAAA0C,QAAAC,QAAA;EAAAC,aAAAF,OAAA,mBAC4CD,SAAS;EAAAf,OAAAgB,OAAAf,gBAChDvB,MAAI,EAAA,IAAAiB,WAAA;GAAA,OAAA,CAAAM,gBACFpB,YAAU,EAAA,IAAAc,WAAA;IAAA,IAAAwB,QAAAC,QAAA;IAAAF,aAAAC,OAAA,MACDJ,SAAS;IAAAf,OAAAmB,aACdpC,MAAMC,KAAK;IAAA,OAAAmC;GAAA,EAAA,CAAA,GAAAlB,gBAGftB,aAAW;IAAA,SAAA;IAAA,IAAAgB,WAAA;KAAA,OAA6BZ,MAAMY;IAAQ;GAAA,CAAA,CAAA;EAAA,EAAA,CAAA,CAAA;EAAA,OAAAqB;CAAA,EAAA,CAAA;AAI/D"}
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
- publishedByLabel: (publisher: string) => string;
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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"}
@@ -9,7 +9,6 @@
9
9
  "registryDependencies": [
10
10
  "@adea-ai/ui/badge",
11
11
  "@adea-ai/ui/button",
12
- "@adea-ai/ui/card",
13
12
  "@adea-ai/ui/empty",
14
13
  "@adea-ai/ui/input-group",
15
14
  "@adea-ai/ui/scroll-area",
@@ -1896,7 +1896,6 @@
1896
1896
  "registryDependencies": [
1897
1897
  "@adea-ai/ui/badge",
1898
1898
  "@adea-ai/ui/button",
1899
- "@adea-ai/ui/card",
1900
1899
  "@adea-ai/ui/empty",
1901
1900
  "@adea-ai/ui/input-group",
1902
1901
  "@adea-ai/ui/scroll-area",
@@ -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
@@ -54,7 +53,12 @@ function CatalogBrowserRow<Value>(props: {
54
53
  data-catalog-entry-id={props.entry.id}
55
54
  variant="outline"
56
55
  size="lg"
57
- class="h-auto min-h-row-lg w-full min-w-0 justify-start gap-3 whitespace-normal"
56
+ // `h-auto!` must stay important: the size token's fixed `h-control-lg`
57
+ // is a custom class tailwind-merge cannot conflict-resolve, so an
58
+ // unimportant `h-auto` loses the stylesheet sort and clamps this
59
+ // multi-line row to one control line, spilling its content over the
60
+ // neighbouring rows.
61
+ class="h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 py-2.5 whitespace-normal"
58
62
  disabled={props.disabled}
59
63
  onClick={() => props.onSelect(props.entry, key)}
60
64
  >
@@ -66,9 +70,18 @@ function CatalogBrowserRow<Value>(props: {
66
70
  <Badge variant="secondary">{props.installedLabel}</Badge>
67
71
  </Show>
68
72
  </span>
69
- <span class="text-muted-foreground line-clamp-2 text-xs">{props.entry.description}</span>
70
- <span class="text-muted-foreground truncate text-2xs">
71
- {props.publishedByLabel(props.entry.publisher)} · {props.entry.category}
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>
72
85
  </span>
73
86
  </span>
74
87
  <ChevronRight aria-hidden="true" />
@@ -82,7 +95,6 @@ export function CatalogBrowserGroup<Value>(props: {
82
95
  previewCount: number
83
96
  disabled: boolean
84
97
  installedLabel: string
85
- publishedByLabel: (publisher: string) => string
86
98
  showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string
87
99
  showLessLabel: string
88
100
  renderIcon: (value: Value) => JSX.Element
@@ -103,7 +115,12 @@ export function CatalogBrowserGroup<Value>(props: {
103
115
  <h3 id={headingId} class="min-w-0 flex-1 truncate text-sm font-semibold">
104
116
  {props.group.label}
105
117
  </h3>
106
- <Badge variant="outline">{props.group.entries.length}</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>
107
124
  </header>
108
125
  <div id={listId} class="grid min-w-0 grid-cols-1 gap-2 md:grid-cols-2">
109
126
  <For each={rows()}>
@@ -112,7 +129,6 @@ export function CatalogBrowserGroup<Value>(props: {
112
129
  entry={row.item()}
113
130
  groupId={props.group.id}
114
131
  installedLabel={props.installedLabel}
115
- publishedByLabel={props.publishedByLabel}
116
132
  disabled={props.disabled}
117
133
  renderIcon={props.renderIcon}
118
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 class="text-muted-foreground ms-auto text-sm" role="status">
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-4" data-catalog-detail>
21
- <Card>
22
- <CardHeader class="flex-row items-start gap-3">
23
- <Show when={props.leading}>
24
- <span class="shrink-0">{props.leading}</span>
25
- </Show>
26
- <div class="grid min-w-0 gap-1.5">
27
- <div class="flex min-w-0 flex-wrap items-center gap-1.5">
28
- <Show when={props.eyebrow}>
29
- <Badge variant="outline">{props.eyebrow}</Badge>
30
- </Show>
31
- <Badge variant="secondary">{props.category}</Badge>
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
- </CardHeader>
39
- <CardFooter class="flex-wrap justify-between gap-3">
40
- {props.action}
41
- {props.status}
42
- </CardFooter>
43
- </Card>
44
- <div class="grid min-w-0 gap-3">{props.children}</div>
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 surface and heading for host-specific fields, permissions, and copy. */
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 class="min-w-0" aria-labelledby={headingId}>
54
- <Card>
55
- <CardHeader>
56
- <h3 id={headingId} class="text-sm font-semibold tracking-tight">
57
- {props.title}
58
- </h3>
59
- </CardHeader>
60
- <CardContent class="grid min-w-0 gap-3">{props.children}</CardContent>
61
- </Card>
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
- publishedByLabel: (publisher: string) => string
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adea-ai/ui",
3
- "version": "0.95.6",
3
+ "version": "0.96.0",
4
4
  "description": "The Adea design system: Kobalte-backed Solid components, semantic OKLCH tokens, and the app-shell layout primitives shared by Adea and Cortana.",
5
5
  "keywords": [
6
6
  "adea",
package/registry.json CHANGED
@@ -1896,7 +1896,6 @@
1896
1896
  "registryDependencies": [
1897
1897
  "@adea-ai/ui/badge",
1898
1898
  "@adea-ai/ui/button",
1899
- "@adea-ai/ui/card",
1900
1899
  "@adea-ai/ui/empty",
1901
1900
  "@adea-ai/ui/input-group",
1902
1901
  "@adea-ai/ui/scroll-area",
@@ -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
@@ -54,7 +53,12 @@ function CatalogBrowserRow<Value>(props: {
54
53
  data-catalog-entry-id={props.entry.id}
55
54
  variant="outline"
56
55
  size="lg"
57
- class="h-auto min-h-row-lg w-full min-w-0 justify-start gap-3 whitespace-normal"
56
+ // `h-auto!` must stay important: the size token's fixed `h-control-lg`
57
+ // is a custom class tailwind-merge cannot conflict-resolve, so an
58
+ // unimportant `h-auto` loses the stylesheet sort and clamps this
59
+ // multi-line row to one control line, spilling its content over the
60
+ // neighbouring rows.
61
+ class="h-auto! min-h-row-lg w-full min-w-0 justify-start gap-3 py-2.5 whitespace-normal"
58
62
  disabled={props.disabled}
59
63
  onClick={() => props.onSelect(props.entry, key)}
60
64
  >
@@ -66,9 +70,18 @@ function CatalogBrowserRow<Value>(props: {
66
70
  <Badge variant="secondary">{props.installedLabel}</Badge>
67
71
  </Show>
68
72
  </span>
69
- <span class="text-muted-foreground line-clamp-2 text-xs">{props.entry.description}</span>
70
- <span class="text-muted-foreground truncate text-2xs">
71
- {props.publishedByLabel(props.entry.publisher)} · {props.entry.category}
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>
72
85
  </span>
73
86
  </span>
74
87
  <ChevronRight aria-hidden="true" />
@@ -82,7 +95,6 @@ export function CatalogBrowserGroup<Value>(props: {
82
95
  previewCount: number
83
96
  disabled: boolean
84
97
  installedLabel: string
85
- publishedByLabel: (publisher: string) => string
86
98
  showMoreLabel: (entries: readonly CatalogBrowserEntry<Value>[], remainingCount: number) => string
87
99
  showLessLabel: string
88
100
  renderIcon: (value: Value) => JSX.Element
@@ -103,7 +115,12 @@ export function CatalogBrowserGroup<Value>(props: {
103
115
  <h3 id={headingId} class="min-w-0 flex-1 truncate text-sm font-semibold">
104
116
  {props.group.label}
105
117
  </h3>
106
- <Badge variant="outline">{props.group.entries.length}</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>
107
124
  </header>
108
125
  <div id={listId} class="grid min-w-0 grid-cols-1 gap-2 md:grid-cols-2">
109
126
  <For each={rows()}>
@@ -112,7 +129,6 @@ export function CatalogBrowserGroup<Value>(props: {
112
129
  entry={row.item()}
113
130
  groupId={props.group.id}
114
131
  installedLabel={props.installedLabel}
115
- publishedByLabel={props.publishedByLabel}
116
132
  disabled={props.disabled}
117
133
  renderIcon={props.renderIcon}
118
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 class="text-muted-foreground ms-auto text-sm" role="status">
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-4" data-catalog-detail>
21
- <Card>
22
- <CardHeader class="flex-row items-start gap-3">
23
- <Show when={props.leading}>
24
- <span class="shrink-0">{props.leading}</span>
25
- </Show>
26
- <div class="grid min-w-0 gap-1.5">
27
- <div class="flex min-w-0 flex-wrap items-center gap-1.5">
28
- <Show when={props.eyebrow}>
29
- <Badge variant="outline">{props.eyebrow}</Badge>
30
- </Show>
31
- <Badge variant="secondary">{props.category}</Badge>
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
- </CardHeader>
39
- <CardFooter class="flex-wrap justify-between gap-3">
40
- {props.action}
41
- {props.status}
42
- </CardFooter>
43
- </Card>
44
- <div class="grid min-w-0 gap-3">{props.children}</div>
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 surface and heading for host-specific fields, permissions, and copy. */
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 class="min-w-0" aria-labelledby={headingId}>
54
- <Card>
55
- <CardHeader>
56
- <h3 id={headingId} class="text-sm font-semibold tracking-tight">
57
- {props.title}
58
- </h3>
59
- </CardHeader>
60
- <CardContent class="grid min-w-0 gap-3">{props.children}</CardContent>
61
- </Card>
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
- publishedByLabel: (publisher: string) => string
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. */