@kerfjs/ui 5.0.0-beta.54 → 5.0.0-beta.56

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 (274) hide show
  1. package/README.md +14 -11
  2. package/ai/compile-time-contracts-v1.json +2 -2
  3. package/ai/component-catalog-v2.json +206 -39
  4. package/ai/component-catalog.json +306 -58
  5. package/ai/public-api-signatures-v1.md +671 -92
  6. package/ai/skill.md +43 -38
  7. package/ai/webawesome-jsx-signatures-v1.md +8 -2
  8. package/dist/app-tab.js +1 -1
  9. package/dist/badge.d.ts +35 -7
  10. package/dist/badge.js +1 -1
  11. package/dist/browser/content-item.js +3 -0
  12. package/dist/browser/popup-menu.js +3 -0
  13. package/dist/browser/select.js +1 -0
  14. package/dist/catalog-resources.d.ts +12 -1
  15. package/dist/catalog.d.ts +21 -4
  16. package/dist/catalog.js +260 -308
  17. package/dist/catalog.js.map +1 -1
  18. package/dist/{chunk-7IUSV4XG.js → chunk-24PHKUR3.js} +2 -2
  19. package/dist/chunk-24PHKUR3.js.map +1 -0
  20. package/dist/{chunk-WZ2GLEY4.js → chunk-2G2ZJQYK.js} +2 -14
  21. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  22. package/dist/{chunk-D7GWXIAS.js → chunk-5I7QGQVT.js} +1 -1
  23. package/dist/chunk-5I7QGQVT.js.map +1 -0
  24. package/dist/{chunk-HJKRCKDR.js → chunk-63ZWBGE3.js} +6 -3
  25. package/dist/chunk-63ZWBGE3.js.map +1 -0
  26. package/dist/{chunk-44IG7PFV.js → chunk-6CINWX2E.js} +3 -3
  27. package/dist/{chunk-44IG7PFV.js.map → chunk-6CINWX2E.js.map} +1 -1
  28. package/dist/{chunk-C2FAYFDE.js → chunk-AGXQQFKZ.js} +2 -2
  29. package/dist/{chunk-C2FAYFDE.js.map → chunk-AGXQQFKZ.js.map} +1 -1
  30. package/dist/{chunk-ATHXW6RP.js → chunk-AHEG27M7.js} +2 -2
  31. package/dist/{chunk-ATHXW6RP.js.map → chunk-AHEG27M7.js.map} +1 -1
  32. package/dist/{chunk-7GUQYHKA.js → chunk-AK67F6QN.js} +4 -1
  33. package/dist/chunk-AK67F6QN.js.map +1 -0
  34. package/dist/chunk-BFPBS5Y4.js +250 -0
  35. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  36. package/dist/chunk-DG6G5EPF.js +35 -0
  37. package/dist/chunk-DG6G5EPF.js.map +1 -0
  38. package/dist/{chunk-MTM43SJO.js → chunk-G33XC2NB.js} +1 -1
  39. package/dist/chunk-G33XC2NB.js.map +1 -0
  40. package/dist/{chunk-TZ5IHWB2.js → chunk-K6UNVKDK.js} +3 -3
  41. package/dist/{chunk-TZ5IHWB2.js.map → chunk-K6UNVKDK.js.map} +1 -1
  42. package/dist/chunk-KH6VUGHU.js +399 -0
  43. package/dist/chunk-KH6VUGHU.js.map +1 -0
  44. package/dist/{chunk-HMQ2ZDGG.js → chunk-KROD7KZK.js} +3 -2
  45. package/dist/chunk-KROD7KZK.js.map +1 -0
  46. package/dist/{chunk-5NDQABWK.js → chunk-M7QV3IHH.js} +3 -1
  47. package/dist/chunk-M7QV3IHH.js.map +1 -0
  48. package/dist/{chunk-RNZAKSME.js → chunk-MA6Z6EIM.js} +3 -3
  49. package/dist/{chunk-RNZAKSME.js.map → chunk-MA6Z6EIM.js.map} +1 -1
  50. package/dist/chunk-MA73TA6D.js +42 -0
  51. package/dist/chunk-MA73TA6D.js.map +1 -0
  52. package/dist/{chunk-ZMBU522F.js → chunk-MEY33VWB.js} +2 -2
  53. package/dist/{chunk-ZMBU522F.js.map → chunk-MEY33VWB.js.map} +1 -1
  54. package/dist/{chunk-T22EM4ET.js → chunk-MOBRFZH3.js} +81 -31
  55. package/dist/chunk-MOBRFZH3.js.map +1 -0
  56. package/dist/chunk-MP2GDBQZ.js +50 -0
  57. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  58. package/dist/{chunk-3NBL3OUQ.js → chunk-NAPE7WUS.js} +2 -2
  59. package/dist/chunk-NAPE7WUS.js.map +1 -0
  60. package/dist/{chunk-CMUIXJZM.js → chunk-NBYTIVHS.js} +2 -2
  61. package/dist/{chunk-CMUIXJZM.js.map → chunk-NBYTIVHS.js.map} +1 -1
  62. package/dist/chunk-O3EXIBEZ.js +114 -0
  63. package/dist/chunk-O3EXIBEZ.js.map +1 -0
  64. package/dist/{chunk-KPNTVB7A.js → chunk-PK4N5QTO.js} +8 -7
  65. package/dist/chunk-PK4N5QTO.js.map +1 -0
  66. package/dist/chunk-QQOTQTDD.js +415 -0
  67. package/dist/chunk-QQOTQTDD.js.map +1 -0
  68. package/dist/{chunk-BJJKFVWW.js → chunk-T4UZTNZ4.js} +5 -5
  69. package/dist/chunk-T4UZTNZ4.js.map +1 -0
  70. package/dist/chunk-V65EOWNF.js +83 -0
  71. package/dist/chunk-V65EOWNF.js.map +1 -0
  72. package/dist/{chunk-GUIHMIT2.js → chunk-VNPQDCQZ.js} +3 -3
  73. package/dist/{chunk-GUIHMIT2.js.map → chunk-VNPQDCQZ.js.map} +1 -1
  74. package/dist/{chunk-5I22LMCV.js → chunk-VZOFZPSO.js} +2 -2
  75. package/dist/chunk-VZOFZPSO.js.map +1 -0
  76. package/dist/chunk-WLG6SSNT.js +94 -0
  77. package/dist/chunk-WLG6SSNT.js.map +1 -0
  78. package/dist/{chunk-NE5JAOQS.js → chunk-WOUF7YXM.js} +3 -3
  79. package/dist/{chunk-NE5JAOQS.js.map → chunk-WOUF7YXM.js.map} +1 -1
  80. package/dist/collapsible-panel.d.ts +51 -13
  81. package/dist/collapsible-panel.js +38 -10
  82. package/dist/collapsible-panel.js.map +1 -1
  83. package/dist/content-item.d.ts +46 -0
  84. package/dist/content-item.js +4 -0
  85. package/dist/content-item.js.map +1 -0
  86. package/dist/css-values.d.ts +5 -11
  87. package/dist/css-values.js +1 -1
  88. package/dist/disclosure-arrow.d.ts +4 -1
  89. package/dist/disclosure-arrow.js +1 -1
  90. package/dist/floating-toolbar.d.ts +17 -6
  91. package/dist/floating-toolbar.js +1 -1
  92. package/dist/grid.js +1 -1
  93. package/dist/help-tags-register.d.ts +13 -0
  94. package/dist/help-tags-register.js +9 -0
  95. package/dist/help-tags-register.js.map +1 -0
  96. package/dist/index.d.ts +7 -5
  97. package/dist/index.js +31 -29
  98. package/dist/list-action-row.js +1 -1
  99. package/dist/list-header.d.ts +14 -1
  100. package/dist/list-header.js +1 -1
  101. package/dist/list-inset-control.d.ts +1 -1
  102. package/dist/list-inset-control.js +1 -1
  103. package/dist/list-inset-text.d.ts +9 -10
  104. package/dist/list-inset-text.js +2 -1
  105. package/dist/list-item.js +1 -1
  106. package/dist/list.d.ts +10 -3
  107. package/dist/list.js +1 -1
  108. package/dist/nav-stack.d.ts +38 -5
  109. package/dist/nav-stack.js +4 -1
  110. package/dist/pane.d.ts +20 -2
  111. package/dist/pane.js +1 -1
  112. package/dist/panel-toolbar-C8sF-YZC.d.ts +63 -0
  113. package/dist/popup-menu-register.d.ts +9 -0
  114. package/dist/popup-menu-register.js +31 -0
  115. package/dist/popup-menu-register.js.map +1 -0
  116. package/dist/popup-menu.d.ts +71 -0
  117. package/dist/popup-menu.js +3 -0
  118. package/dist/popup-menu.js.map +1 -0
  119. package/dist/row.d.ts +1 -1
  120. package/dist/row.js +1 -1
  121. package/dist/select-register.js +70 -3
  122. package/dist/select-register.js.map +1 -1
  123. package/dist/select.d.ts +46 -8
  124. package/dist/select.js +2 -1
  125. package/dist/{divider-sides-BzB6rphT.d.ts → sides-BPSWde0A.d.ts} +1 -3
  126. package/dist/skeleton.js +1 -1
  127. package/dist/spacer.js +1 -1
  128. package/dist/split-view.d.ts +31 -3
  129. package/dist/split-view.js +33 -5
  130. package/dist/split-view.js.map +1 -1
  131. package/dist/state-banner.js +1 -1
  132. package/dist/styles/badge.css +13 -0
  133. package/dist/styles/catalog/components/catalog-example.css +1 -17
  134. package/dist/styles/catalog/components/catalog-stage.css +9 -14
  135. package/dist/styles/catalog/components/catalog.css +8 -18
  136. package/dist/styles/catalog.css +0 -5
  137. package/dist/styles/collapsible-panel.css +192 -39
  138. package/dist/styles/content-item.css +30 -0
  139. package/dist/styles/floating-toolbar.css +5 -0
  140. package/dist/styles/foundation.css +28 -19
  141. package/dist/styles/layout.css +1 -21
  142. package/dist/styles/list-action-row.css +13 -1
  143. package/dist/styles/list-inset-text.css +1 -2
  144. package/dist/styles/list-item.css +14 -1
  145. package/dist/styles/list.css +1 -1
  146. package/dist/styles/nav-stack.css +29 -64
  147. package/dist/styles/pane.css +33 -1
  148. package/dist/styles/popup-menu.css +90 -0
  149. package/dist/styles/resizable-region.css +53 -10
  150. package/dist/styles/select.css +39 -12
  151. package/dist/styles/split-view.css +21 -25
  152. package/dist/styles/state-banner.css +13 -4
  153. package/dist/styles/styles.css +1 -0
  154. package/dist/styles/tab-bar.css +31 -3
  155. package/dist/styles/tab-scaffold.css +36 -14
  156. package/dist/styles/text.css +1 -1
  157. package/dist/styles/token-search-field.css +4 -4
  158. package/dist/styles/toolbar-control-group.css +44 -12
  159. package/dist/styles/toolbar.css +57 -7
  160. package/dist/styles/value-table.css +19 -2
  161. package/dist/styles/webawesome.css +3 -1
  162. package/dist/styles/workbench.css +165 -31
  163. package/dist/tab-scaffold.d.ts +35 -1
  164. package/dist/tab-scaffold.js +50 -16
  165. package/dist/tab-scaffold.js.map +1 -1
  166. package/dist/text.js +1 -1
  167. package/dist/token-search-field.d.ts +13 -2
  168. package/dist/token-search-field.js +1 -1
  169. package/dist/toolbar-text.js +1 -1
  170. package/dist/toolbar.d.ts +12 -4
  171. package/dist/toolbar.js +1 -1
  172. package/dist/{types-CEsieBZi.d.ts → types-DXAGogOS.d.ts} +48 -0
  173. package/dist/value-table.js +1 -1
  174. package/dist/webawesome.d.ts +7 -1
  175. package/dist/wire-catalog.d.ts +24 -1
  176. package/dist/wire-catalog.js +26 -3
  177. package/dist/wire-catalog.js.map +1 -1
  178. package/dist/wire-sidebar.js +6 -3
  179. package/dist/wire-sidebar.js.map +1 -1
  180. package/dist/wire-token-search-fields.js +1 -1
  181. package/dist/wire-workbench.js +1 -350
  182. package/dist/wire-workbench.js.map +1 -1
  183. package/dist/workbench.d.ts +144 -6
  184. package/dist/workbench.js +11 -208
  185. package/dist/workbench.js.map +1 -1
  186. package/docs/accessibility.md +126 -6
  187. package/docs/app-layouts.md +9 -7
  188. package/docs/catalog.md +41 -9
  189. package/docs/collapsible-panel.md +79 -5
  190. package/docs/component-contract.md +38 -12
  191. package/docs/component-selection.md +64 -55
  192. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  193. package/docs/design/templates/empty-state/with-action.svg +1 -1
  194. package/docs/design/templates/empty-state-dark.svg +1 -1
  195. package/docs/design/templates/empty-state.svg +1 -1
  196. package/docs/design/templates/list/compact-dark.svg +1 -1
  197. package/docs/design/templates/list/compact.svg +1 -1
  198. package/docs/design/templates/list/stack-dark.svg +1 -1
  199. package/docs/design/templates/list/stack.svg +1 -1
  200. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  201. package/docs/design/templates/list-action-row/default.svg +1 -1
  202. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  203. package/docs/design/templates/list-action-row/selected.svg +1 -1
  204. package/docs/design/templates/list-action-row-dark.svg +1 -1
  205. package/docs/design/templates/list-action-row.svg +1 -1
  206. package/docs/design/templates/list-dark.svg +1 -1
  207. package/docs/design/templates/list-item/default-dark.svg +1 -1
  208. package/docs/design/templates/list-item/default.svg +1 -1
  209. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  210. package/docs/design/templates/list-item/selected.svg +1 -1
  211. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  212. package/docs/design/templates/list-item/trailing.svg +1 -1
  213. package/docs/design/templates/list-item-dark.svg +1 -1
  214. package/docs/design/templates/list-item.svg +1 -1
  215. package/docs/design/templates/list.svg +1 -1
  216. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  217. package/docs/design/templates/state-banner/danger.svg +1 -1
  218. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  219. package/docs/design/templates/state-banner/info.svg +1 -1
  220. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  221. package/docs/design/templates/state-banner/success.svg +1 -1
  222. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  223. package/docs/design/templates/state-banner/warning.svg +1 -1
  224. package/docs/design/templates/state-banner-dark.svg +1 -1
  225. package/docs/design/templates/state-banner.svg +1 -1
  226. package/docs/design/templates/value-table/details-dark.svg +1 -1
  227. package/docs/design/templates/value-table/details.svg +1 -1
  228. package/docs/design/templates/value-table-dark.svg +1 -1
  229. package/docs/design/templates/value-table.svg +1 -1
  230. package/docs/design-philosophy.md +1 -1
  231. package/docs/examples/command-palette-adapter.tsx +3 -2
  232. package/docs/layout.md +74 -29
  233. package/docs/nav-stack.md +45 -1
  234. package/docs/recipes.md +48 -40
  235. package/docs/split-view.md +46 -2
  236. package/docs/surface-scaffold.md +1 -1
  237. package/docs/tab-scaffold.md +50 -1
  238. package/docs/type-contracts.md +17 -17
  239. package/docs/ux-demo.md +8 -4
  240. package/docs/webawesome-theme.md +1 -2
  241. package/docs/workbench.md +131 -10
  242. package/llms.txt +38 -9
  243. package/package.json +24 -2
  244. package/ux-demo/recipes/app-shell.tsx +141 -223
  245. package/ux-demo/recipes/collapsible-sidebar.tsx +47 -77
  246. package/ux-demo/recipes/list-detail-dialog.tsx +150 -54
  247. package/ux-demo/recipes/mount-recipe.ts +0 -5
  248. package/ux-demo/recipes/navigation-sidebar.tsx +3 -2
  249. package/ux-demo/recipes/navigation-stack.tsx +3 -2
  250. package/ux-demo/recipes/types.ts +0 -1
  251. package/dist/chunk-3NBL3OUQ.js.map +0 -1
  252. package/dist/chunk-5I22LMCV.js.map +0 -1
  253. package/dist/chunk-5NDQABWK.js.map +0 -1
  254. package/dist/chunk-7GUQYHKA.js.map +0 -1
  255. package/dist/chunk-7IUSV4XG.js.map +0 -1
  256. package/dist/chunk-BJJKFVWW.js.map +0 -1
  257. package/dist/chunk-D7GWXIAS.js.map +0 -1
  258. package/dist/chunk-DQA5FMOX.js +0 -85
  259. package/dist/chunk-DQA5FMOX.js.map +0 -1
  260. package/dist/chunk-HJKRCKDR.js.map +0 -1
  261. package/dist/chunk-HMQ2ZDGG.js.map +0 -1
  262. package/dist/chunk-KPNTVB7A.js.map +0 -1
  263. package/dist/chunk-MTM43SJO.js.map +0 -1
  264. package/dist/chunk-T22EM4ET.js.map +0 -1
  265. package/dist/chunk-WZ2GLEY4.js.map +0 -1
  266. package/dist/chunk-XD7DWYXG.js +0 -34
  267. package/dist/chunk-XD7DWYXG.js.map +0 -1
  268. package/dist/chunk-ZK5EGVFP.js +0 -27
  269. package/dist/chunk-ZK5EGVFP.js.map +0 -1
  270. package/dist/styles/catalog/components/catalog-detail.css +0 -35
  271. package/dist/styles/catalog/components/catalog-resource-footer.css +0 -37
  272. package/dist/styles/catalog/components/catalog-secondary-sections.css +0 -38
  273. package/dist/styles/catalog/components/catalog-section-list.css +0 -22
  274. package/dist/styles/catalog/components/catalog-sidebar.css +0 -82
package/dist/catalog.js CHANGED
@@ -1,56 +1,77 @@
1
- import { ToolbarControlGroup, ToolbarActionLink } from './chunk-ZIYOJFZD.js';
2
- import { Toolbar } from './chunk-MTM43SJO.js';
3
- import { ListItem } from './chunk-GUIHMIT2.js';
4
- import { List } from './chunk-3NBL3OUQ.js';
5
- import { ToolbarText } from './chunk-TZ5IHWB2.js';
6
- import { Pane } from './chunk-7GUQYHKA.js';
1
+ import { Workbench } from './chunk-QQOTQTDD.js';
7
2
 
3
+ import { PopupMenu } from './chunk-WLG6SSNT.js';
8
4
 
9
- import { ListHeader } from './chunk-KPNTVB7A.js';
5
+ import { Row } from './chunk-VZOFZPSO.js';
6
+ import { ListInsetText } from './chunk-DG6G5EPF.js';
7
+ import { ListItem } from './chunk-VNPQDCQZ.js';
8
+ import { List } from './chunk-NAPE7WUS.js';
10
9
 
10
+ import { ToolbarText } from './chunk-K6UNVKDK.js';
11
+
12
+
13
+ import { ListHeader } from './chunk-PK4N5QTO.js';
14
+ import { Text } from './chunk-24PHKUR3.js';
11
15
 
12
- import { filterDataAttributes } from './chunk-SRSJO5QE.js';
13
16
 
14
17
 
15
18
 
19
+ import { ToolbarControlGroup, ToolbarActionLink } from './chunk-ZIYOJFZD.js';
20
+ import { Toolbar } from './chunk-G33XC2NB.js';
21
+
16
22
  import { LucideIcon } from './chunk-4R777DUZ.js';
17
- import { PanelLeftClose, Moon, Sun, PanelLeftOpen, Waypoints, ExternalLink } from 'lucide';
18
- import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
23
+ import { filterDataAttributes } from './chunk-SRSJO5QE.js';
24
+
25
+ import { Moon, Sun, Waypoints, ExternalLink } from 'lucide';
26
+ import { jsx, jsxs, Fragment } from 'kerfjs/jsx-runtime';
19
27
 
20
28
  function relatedMenuItems(related, selectAction) {
21
29
  const groups = [];
22
30
  for (const entry of related)
23
31
  if (!groups.includes(entry.group)) groups.push(entry.group);
24
- const nodes = [];
32
+ const items = [];
25
33
  groups.forEach((group, index) => {
26
- if (index > 0) nodes.push(/* @__PURE__ */ jsx("wa-divider", {}));
27
- nodes.push(/* @__PURE__ */ jsx("small", { class: "kui-catalog__related-heading", children: group }));
28
- for (const entry of related) {
34
+ if (index > 0) items.push({ kind: "divider" });
35
+ items.push({ kind: "heading", label: group });
36
+ for (const entry of related)
29
37
  if (entry.group === group)
30
- nodes.push(
31
- /* @__PURE__ */ jsx("wa-dropdown-item", { "data-action": selectAction, "data-item-id": entry.id, children: entry.name })
32
- );
33
- }
38
+ items.push({
39
+ label: entry.name,
40
+ action: selectAction,
41
+ attributes: { "data-item-id": entry.id }
42
+ });
34
43
  });
35
- return nodes;
44
+ return items;
36
45
  }
37
46
  function CatalogResourceFooter({
38
47
  name,
39
- active,
40
48
  resources,
41
49
  related,
42
50
  status,
43
- selectAction
51
+ selectAction,
52
+ toolbar
44
53
  }) {
45
- return /* @__PURE__ */ jsxs("div", { class: "kui-catalog__footer", children: [
46
- status ? /* @__PURE__ */ jsx("div", { class: "kui-catalog__status", children: status }) : null,
54
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
55
+ status ? /* @__PURE__ */ jsx(
56
+ Row,
57
+ {
58
+ hAlign: "space-between",
59
+ vAlign: "baseline",
60
+ gap: "xs",
61
+ wrap: true,
62
+ textInsets: "trl",
63
+ children: status
64
+ }
65
+ ) : null,
47
66
  /* @__PURE__ */ jsx(
48
67
  Toolbar,
49
68
  {
50
69
  label: `${name} resources`,
51
- dividerSides: "",
52
- responsive: "stack",
53
- responsiveAt: "narrow",
70
+ dividerSides: toolbar?.dividerSides ?? "",
71
+ centerAlign: toolbar?.centerAlign,
72
+ responsive: toolbar?.responsive ?? "stack",
73
+ responsiveAt: toolbar?.responsiveAt ?? "narrow",
74
+ safeAreaEdges: toolbar?.safeAreaEdges,
54
75
  leading: resources.length > 0 ? /* @__PURE__ */ jsx(
55
76
  ToolbarControlGroup,
56
77
  {
@@ -80,20 +101,14 @@ function CatalogResourceFooter({
80
101
  menuInset: "compact",
81
102
  size: "compact",
82
103
  label: "Related entries",
83
- children: /* @__PURE__ */ jsxs(
84
- "wa-dropdown",
104
+ children: /* @__PURE__ */ jsx(
105
+ PopupMenu,
85
106
  {
107
+ text: "Components",
108
+ icon: /* @__PURE__ */ jsx(LucideIcon, { icon: Waypoints, name: "waypoints" }),
86
109
  placement: "top-end",
87
- "data-key": `kui-catalog-related-${active}`,
88
- "data-catalog-related": true,
89
- "data-morph-skip-children": true,
90
- children: [
91
- /* @__PURE__ */ jsxs("wa-button", { slot: "trigger", appearance: "plain", "with-caret": true, children: [
92
- /* @__PURE__ */ jsx(LucideIcon, { icon: Waypoints, name: "waypoints" }),
93
- /* @__PURE__ */ jsx("span", { children: "Components" })
94
- ] }),
95
- relatedMenuItems(related, selectAction)
96
- ]
110
+ items: relatedMenuItems(related, selectAction),
111
+ rootAttributes: { "data-catalog-related": "" }
97
112
  }
98
113
  )
99
114
  }
@@ -102,135 +117,26 @@ function CatalogResourceFooter({
102
117
  )
103
118
  ] });
104
119
  }
105
- var protectedAttributes = /* @__PURE__ */ new Set(["data-catalog-stage"]);
106
- function CatalogStage({
107
- name,
108
- content,
109
- geometryOverlay,
110
- rootAttributes = {}
111
- }) {
112
- const safeRootAttributes = filterDataAttributes(
113
- rootAttributes,
114
- protectedAttributes
115
- );
116
- return /* @__PURE__ */ jsx(
117
- "section",
118
- {
119
- ...safeRootAttributes,
120
- class: "kui-catalog__stage",
121
- "data-catalog-stage": true,
122
- "aria-label": `${name} preview`,
123
- children: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__canvas", children: [
124
- content,
125
- geometryOverlay !== void 0 ? /* @__PURE__ */ jsx(
126
- "div",
127
- {
128
- class: "kui-catalog__geometry-overlay",
129
- "data-catalog-geometry-overlay": true,
130
- "data-morph-skip-children": true,
131
- "aria-hidden": "true"
132
- }
133
- ) : null
134
- ] })
135
- }
136
- );
137
- }
138
- function CatalogDetail({
139
- brandTitle,
120
+ function CatalogSectionEntries({
121
+ section,
140
122
  active,
141
- selected,
142
- content,
143
- collapsed,
144
- theme,
145
- headerActions,
146
- status,
147
- geometryOverlay,
148
- stageRootAttributes,
149
- selectAction,
150
- toggleSidebarAction,
151
- toggleThemeAction
123
+ selectAction
152
124
  }) {
153
- const name = selected?.name ?? "";
154
- const nextTheme = theme === "dark" ? "light" : "dark";
155
- return /* @__PURE__ */ jsx("article", { class: "kui-catalog__detail", children: /* @__PURE__ */ jsx(
156
- Pane,
157
- {
158
- contentClassName: "kui-catalog__detail-preview",
159
- header: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__header", children: [
160
- /* @__PURE__ */ jsx(
161
- Toolbar,
162
- {
163
- label: `${name} header`,
164
- dividerSides: "",
165
- leading: /* @__PURE__ */ jsxs(Fragment, { children: [
166
- collapsed ? /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
167
- "button",
168
- {
169
- type: "button",
170
- "data-action": toggleSidebarAction,
171
- "aria-label": `Expand ${brandTitle} catalog`,
172
- children: /* @__PURE__ */ jsx(
173
- LucideIcon,
174
- {
175
- icon: PanelLeftOpen,
176
- name: "panel-left-open"
177
- }
178
- )
179
- }
180
- ) }) : null,
181
- /* @__PURE__ */ jsx(ToolbarText, { text: name, size: "xlarge", headingLevel: 2 })
182
- ] }),
183
- trailing: /* @__PURE__ */ jsxs(Fragment, { children: [
184
- headerActions,
185
- theme ? /* @__PURE__ */ jsx(
186
- ToolbarControlGroup,
187
- {
188
- appearance: "borderless",
189
- content: "mixed",
190
- size: "compact",
191
- label: "Catalog display",
192
- children: /* @__PURE__ */ jsxs(
193
- "button",
194
- {
195
- type: "button",
196
- "data-action": toggleThemeAction,
197
- "aria-label": `Use ${nextTheme} theme`,
198
- "data-theme-preview": theme,
199
- children: [
200
- nextTheme === "dark" ? /* @__PURE__ */ jsx(LucideIcon, { icon: Moon, name: "moon" }) : /* @__PURE__ */ jsx(LucideIcon, { icon: Sun, name: "sun" }),
201
- /* @__PURE__ */ jsx("span", { children: nextTheme === "dark" ? "Dark" : "Light" })
202
- ]
203
- }
204
- )
205
- }
206
- ) : null
207
- ] })
208
- }
209
- ),
210
- selected?.description ? /* @__PURE__ */ jsx("p", { class: "kui-catalog__description kui-content-item", children: selected.description }) : null
211
- ] }),
212
- footer: /* @__PURE__ */ jsx(
213
- CatalogResourceFooter,
214
- {
215
- name,
216
- active,
217
- resources: selected?.resources ?? [],
218
- related: selected?.related ?? [],
219
- status,
220
- selectAction
221
- }
222
- ),
223
- children: /* @__PURE__ */ jsx(
224
- CatalogStage,
225
- {
226
- name,
227
- content,
228
- geometryOverlay,
229
- rootAttributes: stageRootAttributes
230
- }
231
- )
232
- }
233
- ) });
125
+ return /* @__PURE__ */ jsxs(List, { rootAttributes: { "data-catalog-section": section.category }, children: [
126
+ /* @__PURE__ */ jsx(ListHeader, { label: section.category }),
127
+ /* @__PURE__ */ jsx(List, { gap: "2xs", children: section.entries.map((entry) => /* @__PURE__ */ jsx(
128
+ ListItem,
129
+ {
130
+ action: selectAction,
131
+ itemId: entry.id,
132
+ label: entry.name,
133
+ status: entry.tags?.join(" \xB7 "),
134
+ selected: active === entry.id,
135
+ title: entry.description,
136
+ multiline: true
137
+ }
138
+ )) })
139
+ ] });
234
140
  }
235
141
  function CatalogSecondarySections({
236
142
  group,
@@ -238,31 +144,25 @@ function CatalogSecondarySections({
238
144
  selectAction,
239
145
  toggleAction
240
146
  }) {
241
- return /* @__PURE__ */ jsxs("section", { class: "kui-catalog__group--secondary", children: [
147
+ const open = !group.collapsible || Boolean(group.expanded);
148
+ return /* @__PURE__ */ jsxs(List, { dividerSides: "t", controlInsets: "t", children: [
242
149
  group.collapsible ? /* @__PURE__ */ jsx(
243
150
  ListHeader,
244
151
  {
245
152
  label: group.label,
246
153
  toggle: true,
247
- expanded: Boolean(group.expanded),
154
+ expanded: open,
248
155
  action: toggleAction
249
156
  }
250
157
  ) : /* @__PURE__ */ jsx(ListHeader, { label: group.label }),
251
- !group.collapsible || group.expanded ? /* @__PURE__ */ jsx("div", { class: "kui-catalog__secondary", "data-catalog-secondary": true, children: group.sections.map((section) => /* @__PURE__ */ jsxs("section", { class: "kui-catalog__secondary-group", children: [
252
- /* @__PURE__ */ jsx("h3", { class: "kui-catalog__secondary-heading", children: section.category }),
253
- /* @__PURE__ */ jsx("div", { class: "kui-catalog__secondary-items", children: /* @__PURE__ */ jsx(List, { gap: "2xs", children: section.entries.map((entry) => /* @__PURE__ */ jsx(
254
- ListItem,
255
- {
256
- action: selectAction,
257
- itemId: entry.id,
258
- label: entry.name,
259
- status: entry.tags?.join(" \xB7 "),
260
- selected: active === entry.id,
261
- title: entry.description,
262
- multiline: true
263
- }
264
- )) }) })
265
- ] })) }) : null
158
+ open ? /* @__PURE__ */ jsx(List, { gap: "m", rootAttributes: { "data-catalog-secondary": "" }, children: group.sections.map((section) => /* @__PURE__ */ jsx(
159
+ CatalogSectionEntries,
160
+ {
161
+ section,
162
+ active,
163
+ selectAction
164
+ }
165
+ )) }) : null
266
166
  ] });
267
167
  }
268
168
  function CatalogSectionList({
@@ -270,108 +170,76 @@ function CatalogSectionList({
270
170
  active,
271
171
  selectAction
272
172
  }) {
273
- return /* @__PURE__ */ jsx("div", { class: "kui-catalog__sections", children: sections.map((section) => /* @__PURE__ */ jsxs("section", { class: "kui-catalog__group", children: [
274
- /* @__PURE__ */ jsx(ListHeader, { label: section.category }),
275
- /* @__PURE__ */ jsx("div", { class: "kui-catalog__items", children: /* @__PURE__ */ jsx(List, { gap: "2xs", children: section.entries.map((entry) => /* @__PURE__ */ jsx(
276
- ListItem,
277
- {
278
- action: selectAction,
279
- itemId: entry.id,
280
- label: entry.name,
281
- status: entry.tags?.join(" \xB7 "),
282
- selected: active === entry.id,
283
- title: entry.description,
284
- multiline: true
285
- }
286
- )) }) })
287
- ] })) });
173
+ return /* @__PURE__ */ jsx(Fragment, { children: sections.map((section) => /* @__PURE__ */ jsx(
174
+ CatalogSectionEntries,
175
+ {
176
+ section,
177
+ active,
178
+ selectAction
179
+ }
180
+ )) });
288
181
  }
289
182
  function CatalogSidebar({
290
183
  brand,
291
184
  sections,
292
185
  active,
293
- collapsed,
294
186
  secondarySections,
295
187
  footer,
296
188
  selectAction,
297
- toggleSidebarAction,
298
189
  toggleSecondaryAction
299
190
  }) {
191
+ return /* @__PURE__ */ jsx("nav", { "aria-label": `${brand.title} components`, children: /* @__PURE__ */ jsxs(List, { gap: "m", controlInsets: "b", children: [
192
+ brand.subtitle ? /* @__PURE__ */ jsx(ListInsetText, { sides: "rl", children: /* @__PURE__ */ jsx(Text, { variant: "span", size: "compact", tone: "quiet", children: brand.subtitle }) }) : null,
193
+ /* @__PURE__ */ jsx(
194
+ CatalogSectionList,
195
+ {
196
+ sections,
197
+ active,
198
+ selectAction
199
+ }
200
+ ),
201
+ secondarySections ? /* @__PURE__ */ jsx(
202
+ CatalogSecondarySections,
203
+ {
204
+ group: secondarySections,
205
+ active,
206
+ selectAction,
207
+ toggleAction: toggleSecondaryAction
208
+ }
209
+ ) : null,
210
+ footer
211
+ ] }) });
212
+ }
213
+ var protectedAttributes = /* @__PURE__ */ new Set(["data-catalog-stage"]);
214
+ function CatalogStage({
215
+ name,
216
+ content,
217
+ geometryOverlay,
218
+ rootAttributes = {}
219
+ }) {
220
+ const safeRootAttributes = filterDataAttributes(
221
+ rootAttributes,
222
+ protectedAttributes
223
+ );
300
224
  return /* @__PURE__ */ jsx(
301
- "aside",
225
+ "section",
302
226
  {
303
- class: "kui-catalog__sidebar",
304
- "aria-label": `${brand.title} catalog`,
305
- "data-collapsed": String(collapsed),
306
- children: /* @__PURE__ */ jsx(
307
- Pane,
308
- {
309
- header: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__brand", children: [
310
- /* @__PURE__ */ jsx(
311
- Toolbar,
312
- {
313
- label: `${brand.title} catalog header`,
314
- dividerSides: "",
315
- leading: /* @__PURE__ */ jsxs(Fragment, { children: [
316
- brand.logoUrl ? /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
317
- "img",
318
- {
319
- class: "kui-catalog__mark",
320
- src: brand.logoUrl,
321
- alt: ""
322
- }
323
- ) }) : null,
324
- /* @__PURE__ */ jsx(
325
- ToolbarText,
326
- {
327
- text: brand.title,
328
- size: "large",
329
- headingLevel: 1
330
- }
331
- )
332
- ] }),
333
- trailing: /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
334
- "button",
335
- {
336
- type: "button",
337
- "data-action": toggleSidebarAction,
338
- "aria-label": `Collapse ${brand.title} catalog`,
339
- children: /* @__PURE__ */ jsx(LucideIcon, { icon: PanelLeftClose, name: "panel-left-close" })
340
- }
341
- ) })
342
- }
343
- ),
344
- brand.subtitle ? /* @__PURE__ */ jsx("p", { class: "kui-catalog__subtitle", children: brand.subtitle }) : null
345
- ] }),
346
- children: /* @__PURE__ */ jsxs(
347
- "nav",
348
- {
349
- class: "kui-catalog__navigation",
350
- "aria-label": `${brand.title} components`,
351
- children: [
352
- /* @__PURE__ */ jsx(
353
- CatalogSectionList,
354
- {
355
- sections,
356
- active,
357
- selectAction
358
- }
359
- ),
360
- secondarySections ? /* @__PURE__ */ jsx(
361
- CatalogSecondarySections,
362
- {
363
- group: secondarySections,
364
- active,
365
- selectAction,
366
- toggleAction: toggleSecondaryAction
367
- }
368
- ) : null,
369
- footer
370
- ]
371
- }
372
- )
373
- }
374
- )
227
+ ...safeRootAttributes,
228
+ class: "kui-catalog__stage",
229
+ "data-catalog-stage": true,
230
+ "aria-label": `${name} preview`,
231
+ children: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__canvas", children: [
232
+ content,
233
+ geometryOverlay !== void 0 ? /* @__PURE__ */ jsx(
234
+ "div",
235
+ {
236
+ class: "kui-catalog__geometry-overlay",
237
+ "data-catalog-geometry-overlay": true,
238
+ "data-morph-skip-children": true,
239
+ "aria-hidden": "true"
240
+ }
241
+ ) : null
242
+ ] })
375
243
  }
376
244
  );
377
245
  }
@@ -382,6 +250,7 @@ function findEntry(sections, id) {
382
250
  return void 0;
383
251
  }
384
252
  function Catalog({
253
+ id = "kui-catalog",
385
254
  brand,
386
255
  sections,
387
256
  active,
@@ -398,11 +267,19 @@ function Catalog({
398
267
  toggleSidebarAction = "catalog-toggle-sidebar",
399
268
  toggleThemeAction = "catalog-toggle-theme",
400
269
  toggleSecondaryAction = "catalog-toggle-secondary",
270
+ headerPlacement = "auto",
271
+ footerPlacement = "auto",
272
+ sidebar = {},
273
+ mainToolbar,
274
+ footerToolbar,
401
275
  className = "",
402
276
  slot
403
277
  }) {
404
278
  const selected = findEntry(sections, active) ?? (secondarySections ? findEntry(secondarySections.sections, active) : void 0);
405
- return /* @__PURE__ */ jsxs(
279
+ const name = selected?.name ?? "";
280
+ const nextTheme = theme === "dark" ? "light" : "dark";
281
+ const catalogName = `${brand.title} catalog`;
282
+ return /* @__PURE__ */ jsx(
406
283
  "main",
407
284
  {
408
285
  class: `kui-catalog ${className}`.trim(),
@@ -410,40 +287,107 @@ function Catalog({
410
287
  "data-sidebar-collapsed": String(collapsed),
411
288
  "data-geometry-overlay": geometryOverlay === void 0 ? void 0 : String(geometryOverlay),
412
289
  slot,
413
- children: [
414
- /* @__PURE__ */ jsx(
415
- CatalogSidebar,
416
- {
417
- brand,
418
- sections,
419
- active,
420
- collapsed,
421
- secondarySections,
422
- footer: sidebarFooter,
423
- selectAction,
424
- toggleSidebarAction,
425
- toggleSecondaryAction
426
- }
427
- ),
428
- /* @__PURE__ */ jsx(
429
- CatalogDetail,
430
- {
431
- brandTitle: brand.title,
432
- active,
433
- selected,
434
- content,
290
+ children: /* @__PURE__ */ jsx(
291
+ Workbench,
292
+ {
293
+ id,
294
+ label: catalogName,
295
+ leftRail: {
296
+ label: catalogName,
297
+ size: sidebar.size ?? 288,
298
+ resizable: sidebar.resizable,
299
+ separator: sidebar.separator,
300
+ collapseMotion: sidebar.collapseMotion,
301
+ presentation: sidebar.presentation,
302
+ responsiveOverlayAt: sidebar.responsiveOverlayAt,
303
+ compactOverlay: sidebar.compactOverlay,
435
304
  collapsed,
436
- theme,
437
- headerActions,
438
- status,
439
- geometryOverlay,
440
- stageRootAttributes,
441
- selectAction,
442
- toggleSidebarAction,
443
- toggleThemeAction
444
- }
445
- )
446
- ]
305
+ toolbar: {
306
+ ...sidebar.toolbar,
307
+ label: `${catalogName} header`,
308
+ title: /* @__PURE__ */ jsxs(Fragment, { children: [
309
+ brand.logoUrl ? /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx("img", { class: "kui-catalog__mark", src: brand.logoUrl, alt: "" }) }) : null,
310
+ /* @__PURE__ */ jsx(ToolbarText, { text: brand.title, size: "large", headingLevel: 1 })
311
+ ] }),
312
+ toggle: { action: toggleSidebarAction, name: catalogName }
313
+ },
314
+ content: /* @__PURE__ */ jsx(
315
+ CatalogSidebar,
316
+ {
317
+ brand,
318
+ sections,
319
+ active,
320
+ secondarySections,
321
+ footer: sidebarFooter,
322
+ selectAction,
323
+ toggleSecondaryAction
324
+ }
325
+ )
326
+ },
327
+ mainToolbar: {
328
+ ...mainToolbar,
329
+ label: `${name} header`,
330
+ // The entry title stays whole; actions wrap below it when narrow.
331
+ responsive: mainToolbar?.responsive ?? "wrap",
332
+ title: /* @__PURE__ */ jsx(ToolbarText, { text: name, size: "xlarge", headingLevel: 2 }),
333
+ trailing: /* @__PURE__ */ jsxs(Fragment, { children: [
334
+ headerActions,
335
+ theme ? /* @__PURE__ */ jsx(
336
+ ToolbarControlGroup,
337
+ {
338
+ appearance: "borderless",
339
+ content: "mixed",
340
+ size: "compact",
341
+ label: "Catalog display",
342
+ children: /* @__PURE__ */ jsxs(
343
+ "button",
344
+ {
345
+ type: "button",
346
+ "data-action": toggleThemeAction,
347
+ "aria-label": `Use ${nextTheme} theme`,
348
+ "data-theme-preview": theme,
349
+ children: [
350
+ nextTheme === "dark" ? /* @__PURE__ */ jsx(LucideIcon, { icon: Moon, name: "moon" }) : /* @__PURE__ */ jsx(LucideIcon, { icon: Sun, name: "sun" }),
351
+ /* @__PURE__ */ jsx("span", { children: nextTheme === "dark" ? "Dark" : "Light" })
352
+ ]
353
+ }
354
+ )
355
+ }
356
+ ) : null
357
+ ] })
358
+ },
359
+ mainFooter: /* @__PURE__ */ jsx(
360
+ CatalogResourceFooter,
361
+ {
362
+ name,
363
+ resources: selected?.resources ?? [],
364
+ related: selected?.related ?? [],
365
+ status,
366
+ selectAction,
367
+ toolbar: footerToolbar
368
+ }
369
+ ),
370
+ mainHeader: selected?.description ? /* @__PURE__ */ jsx(
371
+ ListInsetText,
372
+ {
373
+ sides: "trbl",
374
+ rootAttributes: { "data-catalog-description": "" },
375
+ children: /* @__PURE__ */ jsx(Text, { variant: "span", children: selected.description })
376
+ }
377
+ ) : null,
378
+ mainHeaderPlacement: headerPlacement,
379
+ mainFooterPlacement: footerPlacement,
380
+ main: /* @__PURE__ */ jsx(List, { flex: true, children: /* @__PURE__ */ jsx(
381
+ CatalogStage,
382
+ {
383
+ name,
384
+ content,
385
+ geometryOverlay,
386
+ rootAttributes: stageRootAttributes
387
+ }
388
+ ) })
389
+ }
390
+ )
447
391
  }
448
392
  );
449
393
  }
@@ -505,8 +449,16 @@ function CatalogExample({
505
449
  rootAttributes: { "data-catalog-example-label": "" }
506
450
  }
507
451
  ) : null,
508
- note !== void 0 ? /* @__PURE__ */ jsx("p", { class: "kui-catalog-example__note", "data-catalog-example-note": true, children: note }) : null,
509
- compactFallback !== void 0 ? /* @__PURE__ */ jsx("p", { class: "kui-catalog-example__compact-fallback", children: compactFallback }) : null,
452
+ note !== void 0 ? /* @__PURE__ */ jsx(
453
+ ListInsetText,
454
+ {
455
+ sides: "rl",
456
+ className: "kui-catalog-example__note",
457
+ rootAttributes: { "data-catalog-example-note": "" },
458
+ children: /* @__PURE__ */ jsx(Text, { variant: "span", size: "compact", tone: "quiet", children: note })
459
+ }
460
+ ) : null,
461
+ compactFallback !== void 0 ? /* @__PURE__ */ jsx(Text, { tone: "quiet", className: "kui-catalog-example__compact-fallback", children: compactFallback }) : null,
510
462
  specimen
511
463
  ]
512
464
  }