@kerfjs/ui 5.0.0-beta.49 → 5.0.0-beta.50

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 (257) hide show
  1. package/README.md +41 -11
  2. package/ai/catalog-authoring.json +12 -1
  3. package/ai/catalog-authoring.schema.json +49 -1
  4. package/ai/compile-time-contracts-v1.json +14 -0
  5. package/ai/compile-time-contracts-v1.schema.json +1 -0
  6. package/ai/component-catalog-v2-overrides.json +7 -0
  7. package/ai/component-catalog-v2.json +79 -23
  8. package/ai/component-catalog.json +86 -27
  9. package/ai/public-api-signatures-v1.md +217 -169
  10. package/ai/skill.md +23 -9
  11. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  12. package/dist/app-tab.d.ts +3 -1
  13. package/dist/app-tab.js +1 -1
  14. package/dist/badge.d.ts +24 -0
  15. package/dist/badge.js +3 -0
  16. package/dist/badge.js.map +1 -0
  17. package/dist/browser/badge.js +3 -0
  18. package/dist/browser/list-header.js +1 -0
  19. package/dist/browser/state-banner.js +1 -0
  20. package/dist/catalog-resources.d.ts +2 -2
  21. package/dist/catalog.d.ts +24 -125
  22. package/dist/catalog.js +387 -261
  23. package/dist/catalog.js.map +1 -1
  24. package/dist/{chunk-OGTJNHRG.js → chunk-2WMSE4MK.js} +5 -3
  25. package/dist/chunk-2WMSE4MK.js.map +1 -0
  26. package/dist/{chunk-GYGM363P.js → chunk-2YOUUEWR.js} +16 -6
  27. package/dist/chunk-2YOUUEWR.js.map +1 -0
  28. package/dist/{chunk-UDHHKZWO.js → chunk-3V75EQIP.js} +8 -4
  29. package/dist/chunk-3V75EQIP.js.map +1 -0
  30. package/dist/{chunk-W2FK7ZNY.js → chunk-4R777DUZ.js} +10 -2
  31. package/dist/chunk-4R777DUZ.js.map +1 -0
  32. package/dist/{chunk-T7DOWS6T.js → chunk-54HM36IQ.js} +6 -3
  33. package/dist/chunk-54HM36IQ.js.map +1 -0
  34. package/dist/{chunk-DAO2VFTT.js → chunk-5CE64WGC.js} +6 -4
  35. package/dist/chunk-5CE64WGC.js.map +1 -0
  36. package/dist/{chunk-SOK5EUF7.js → chunk-6ZXOQEAN.js} +4 -2
  37. package/dist/chunk-6ZXOQEAN.js.map +1 -0
  38. package/dist/{chunk-OGNE3OFT.js → chunk-AQSKJ6U6.js} +4 -2
  39. package/dist/chunk-AQSKJ6U6.js.map +1 -0
  40. package/dist/{chunk-VDUJZF5G.js → chunk-CMUIXJZM.js} +2 -2
  41. package/dist/{chunk-VDUJZF5G.js.map → chunk-CMUIXJZM.js.map} +1 -1
  42. package/dist/{chunk-OMSRSL3B.js → chunk-COUPLRZG.js} +5 -3
  43. package/dist/chunk-COUPLRZG.js.map +1 -0
  44. package/dist/{chunk-2TYUFZUC.js → chunk-D7GWXIAS.js} +4 -2
  45. package/dist/chunk-D7GWXIAS.js.map +1 -0
  46. package/dist/{chunk-AQFWBG23.js → chunk-DARTMI5Z.js} +5 -3
  47. package/dist/chunk-DARTMI5Z.js.map +1 -0
  48. package/dist/{chunk-V6GQKOX2.js → chunk-DJKWFYAA.js} +5 -3
  49. package/dist/chunk-DJKWFYAA.js.map +1 -0
  50. package/dist/{chunk-6NDBE2OK.js → chunk-E36EVCKG.js} +5 -3
  51. package/dist/chunk-E36EVCKG.js.map +1 -0
  52. package/dist/{chunk-IU4QUY5I.js → chunk-ELRMBQEC.js} +4 -2
  53. package/dist/chunk-ELRMBQEC.js.map +1 -0
  54. package/dist/{chunk-TIGSG6BX.js → chunk-HJKRCKDR.js} +7 -3
  55. package/dist/chunk-HJKRCKDR.js.map +1 -0
  56. package/dist/{chunk-Y6LYKFXY.js → chunk-HMQ2ZDGG.js} +5 -3
  57. package/dist/chunk-HMQ2ZDGG.js.map +1 -0
  58. package/dist/{chunk-WN52USHV.js → chunk-J3EE6XWD.js} +2 -2
  59. package/dist/{chunk-WN52USHV.js.map → chunk-J3EE6XWD.js.map} +1 -1
  60. package/dist/{chunk-CK6P5AUK.js → chunk-KKNK3JUT.js} +7 -4
  61. package/dist/chunk-KKNK3JUT.js.map +1 -0
  62. package/dist/{chunk-ZPWZIVI6.js → chunk-N3GKMPDW.js} +7 -3
  63. package/dist/chunk-N3GKMPDW.js.map +1 -0
  64. package/dist/{chunk-DYBPI5O2.js → chunk-NDUGJ4TU.js} +4 -2
  65. package/dist/chunk-NDUGJ4TU.js.map +1 -0
  66. package/dist/{chunk-WSXUPSID.js → chunk-NN6GYOA2.js} +7 -3
  67. package/dist/chunk-NN6GYOA2.js.map +1 -0
  68. package/dist/{chunk-VXFGMDA7.js → chunk-OQI7RCRP.js} +10 -2
  69. package/dist/chunk-OQI7RCRP.js.map +1 -0
  70. package/dist/{chunk-E34TE2ZI.js → chunk-S6ZTTTV7.js} +5 -3
  71. package/dist/chunk-S6ZTTTV7.js.map +1 -0
  72. package/dist/{chunk-V6HCTCVD.js → chunk-SIU2AC5W.js} +8 -4
  73. package/dist/chunk-SIU2AC5W.js.map +1 -0
  74. package/dist/{chunk-WVLMZ5SG.js → chunk-UMGY5JSP.js} +4 -2
  75. package/dist/chunk-UMGY5JSP.js.map +1 -0
  76. package/dist/{chunk-I4V3UDSA.js → chunk-V6RZWDII.js} +7 -5
  77. package/dist/chunk-V6RZWDII.js.map +1 -0
  78. package/dist/{chunk-CAB6NQ2T.js → chunk-VOCPXGQN.js} +3 -1
  79. package/dist/chunk-VOCPXGQN.js.map +1 -0
  80. package/dist/chunk-XD7DWYXG.js +34 -0
  81. package/dist/chunk-XD7DWYXG.js.map +1 -0
  82. package/dist/{chunk-B6JYRX3P.js → chunk-ZIYOJFZD.js} +43 -4
  83. package/dist/chunk-ZIYOJFZD.js.map +1 -0
  84. package/dist/{chunk-EYALJQQD.js → chunk-ZK5EGVFP.js} +4 -2
  85. package/dist/chunk-ZK5EGVFP.js.map +1 -0
  86. package/dist/{chunk-6WTETUZ6.js → chunk-ZLWQZUGF.js} +8 -2
  87. package/dist/chunk-ZLWQZUGF.js.map +1 -0
  88. package/dist/{chunk-XKFRMGMW.js → chunk-ZNZ2JDBW.js} +3 -1
  89. package/dist/chunk-ZNZ2JDBW.js.map +1 -0
  90. package/dist/{chunk-I45QO2IZ.js → chunk-ZSYLBVWG.js} +6 -4
  91. package/dist/chunk-ZSYLBVWG.js.map +1 -0
  92. package/dist/collapsible-panel.d.ts +3 -1
  93. package/dist/collapsible-panel.js +4 -2
  94. package/dist/collapsible-panel.js.map +1 -1
  95. package/dist/disclosure-arrow.d.ts +3 -1
  96. package/dist/disclosure-arrow.js +1 -1
  97. package/dist/empty-state.d.ts +3 -1
  98. package/dist/empty-state.js +1 -1
  99. package/dist/floating-toolbar.d.ts +3 -1
  100. package/dist/floating-toolbar.js +1 -1
  101. package/dist/grid.d.ts +3 -1
  102. package/dist/grid.js +1 -1
  103. package/dist/index.d.ts +3 -2
  104. package/dist/index.js +33 -32
  105. package/dist/list-action-row.d.ts +3 -1
  106. package/dist/list-action-row.js +1 -1
  107. package/dist/list-header.d.ts +6 -1
  108. package/dist/list-header.js +2 -1
  109. package/dist/list-inset-control.d.ts +3 -1
  110. package/dist/list-inset-control.js +1 -1
  111. package/dist/list-inset-text.d.ts +3 -1
  112. package/dist/list-inset-text.js +1 -1
  113. package/dist/list-item.d.ts +3 -1
  114. package/dist/list-item.js +1 -1
  115. package/dist/list.d.ts +3 -1
  116. package/dist/list.js +1 -1
  117. package/dist/loading-spinner.d.ts +3 -1
  118. package/dist/loading-spinner.js +1 -1
  119. package/dist/lucide-icon.d.ts +3 -1
  120. package/dist/lucide-icon.js +1 -1
  121. package/dist/nav-stack.d.ts +3 -1
  122. package/dist/nav-stack.js +1 -1
  123. package/dist/pane.d.ts +3 -1
  124. package/dist/pane.js +1 -1
  125. package/dist/resizable-region.d.ts +5 -2
  126. package/dist/resizable-region.js +1 -1
  127. package/dist/row.d.ts +3 -1
  128. package/dist/row.js +1 -1
  129. package/dist/segmented-control.d.ts +3 -1
  130. package/dist/segmented-control.js +1 -1
  131. package/dist/select.d.ts +3 -1
  132. package/dist/select.js +1 -1
  133. package/dist/skeleton.d.ts +3 -1
  134. package/dist/skeleton.js +1 -1
  135. package/dist/spacer.d.ts +3 -1
  136. package/dist/spacer.js +1 -1
  137. package/dist/split-view.d.ts +3 -1
  138. package/dist/split-view.js +24 -5
  139. package/dist/split-view.js.map +1 -1
  140. package/dist/state-banner.d.ts +3 -1
  141. package/dist/state-banner.js +2 -1
  142. package/dist/styles/badge.css +86 -0
  143. package/dist/styles/catalog/components/catalog-detail.css +35 -0
  144. package/dist/styles/catalog/components/catalog-example-stack.css +6 -0
  145. package/dist/styles/catalog/components/catalog-example.css +35 -0
  146. package/dist/styles/catalog/components/catalog-resource-footer.css +37 -0
  147. package/dist/styles/catalog/components/catalog-secondary-sections.css +38 -0
  148. package/dist/styles/catalog/components/catalog-section-list.css +22 -0
  149. package/dist/styles/catalog/components/catalog-sidebar.css +82 -0
  150. package/dist/styles/catalog/components/catalog-stage.css +60 -0
  151. package/dist/styles/catalog/components/catalog.css +22 -0
  152. package/dist/styles/catalog.css +10 -587
  153. package/dist/styles/list-header.css +4 -60
  154. package/dist/styles/resizable-region.css +24 -0
  155. package/dist/styles/select.css +0 -3
  156. package/dist/styles/split-view.css +1 -1
  157. package/dist/styles/state-banner.css +0 -27
  158. package/dist/styles/styles.css +1 -0
  159. package/dist/styles/tab-bar.css +6 -1
  160. package/dist/styles/text.css +4 -0
  161. package/dist/styles/token-search-field.css +5 -40
  162. package/dist/styles/toolbar-control-group.css +110 -16
  163. package/dist/styles/toolbar-text.css +4 -0
  164. package/dist/styles/toolbar.css +72 -0
  165. package/dist/styles/webawesome.css +22 -7
  166. package/dist/sunken-panel.d.ts +3 -1
  167. package/dist/sunken-panel.js +1 -1
  168. package/dist/surface-scaffold.d.ts +6 -2
  169. package/dist/surface-scaffold.js +1 -1
  170. package/dist/tab-bar.d.ts +8 -1
  171. package/dist/tab-bar.js +1 -1
  172. package/dist/tab-scaffold.d.ts +3 -1
  173. package/dist/tab-scaffold.js +3 -1
  174. package/dist/tab-scaffold.js.map +1 -1
  175. package/dist/text.d.ts +5 -2
  176. package/dist/text.js +1 -1
  177. package/dist/token-search-field.d.ts +5 -1
  178. package/dist/token-search-field.js +1 -1
  179. package/dist/toolbar-control-group.d.ts +33 -3
  180. package/dist/toolbar-control-group.js +1 -1
  181. package/dist/toolbar-text.d.ts +3 -1
  182. package/dist/toolbar-text.js +1 -1
  183. package/dist/toolbar.d.ts +9 -1
  184. package/dist/toolbar.js +1 -1
  185. package/dist/types-CzgSrFXP.d.ts +64 -0
  186. package/dist/value-table.d.ts +6 -2
  187. package/dist/value-table.js +1 -1
  188. package/dist/wire-resizable-regions.js +1 -1
  189. package/dist/wire-token-search-fields.js +1 -1
  190. package/dist/workbench.d.ts +3 -1
  191. package/dist/workbench.js +3 -1
  192. package/dist/workbench.js.map +1 -1
  193. package/docs/accessibility.md +11 -1
  194. package/docs/catalog.md +25 -7
  195. package/docs/component-contract.md +71 -22
  196. package/docs/component-selection.md +11 -9
  197. package/docs/design-philosophy.md +6 -5
  198. package/docs/recipes.md +5 -5
  199. package/docs/type-contracts.md +1 -0
  200. package/docs/ux-demo.md +4 -4
  201. package/docs/webawesome-theme.md +5 -4
  202. package/llms.txt +30 -10
  203. package/package.json +9 -2
  204. package/ux-demo/recipes/app-shell.css +87 -0
  205. package/ux-demo/recipes/app-shell.tsx +207 -178
  206. package/ux-demo/recipes/collapsible-sidebar.css +83 -0
  207. package/ux-demo/recipes/collapsible-sidebar.tsx +152 -122
  208. package/ux-demo/recipes/compact-toolbar.css +35 -0
  209. package/ux-demo/recipes/compact-toolbar.tsx +104 -100
  210. package/ux-demo/recipes/composer-form.css +19 -0
  211. package/ux-demo/recipes/composer-form.tsx +19 -15
  212. package/ux-demo/recipes/list-detail-dialog.css +42 -0
  213. package/ux-demo/recipes/list-detail-dialog.tsx +127 -125
  214. package/ux-demo/recipes/list-workspace-states.css +30 -0
  215. package/ux-demo/recipes/list-workspace-states.tsx +66 -60
  216. package/ux-demo/recipes/loading-inspector.css +7 -0
  217. package/ux-demo/recipes/loading-inspector.tsx +151 -131
  218. package/ux-demo/recipes/navigation-sidebar.css +12 -0
  219. package/ux-demo/recipes/navigation-sidebar.tsx +116 -105
  220. package/ux-demo/recipes/navigation-stack.css +12 -0
  221. package/ux-demo/recipes/navigation-stack.tsx +47 -37
  222. package/ux-demo/recipes/recipe-root.css +67 -0
  223. package/ux-demo/recipes/recipe-root.tsx +87 -0
  224. package/ux-demo/recipes/workspace-header.css +7 -0
  225. package/ux-demo/recipes/workspace-header.tsx +60 -61
  226. package/dist/chunk-2TYUFZUC.js.map +0 -1
  227. package/dist/chunk-6NDBE2OK.js.map +0 -1
  228. package/dist/chunk-6WTETUZ6.js.map +0 -1
  229. package/dist/chunk-AQFWBG23.js.map +0 -1
  230. package/dist/chunk-B6JYRX3P.js.map +0 -1
  231. package/dist/chunk-CAB6NQ2T.js.map +0 -1
  232. package/dist/chunk-CK6P5AUK.js.map +0 -1
  233. package/dist/chunk-DAO2VFTT.js.map +0 -1
  234. package/dist/chunk-DYBPI5O2.js.map +0 -1
  235. package/dist/chunk-E34TE2ZI.js.map +0 -1
  236. package/dist/chunk-EYALJQQD.js.map +0 -1
  237. package/dist/chunk-GYGM363P.js.map +0 -1
  238. package/dist/chunk-I45QO2IZ.js.map +0 -1
  239. package/dist/chunk-I4V3UDSA.js.map +0 -1
  240. package/dist/chunk-IU4QUY5I.js.map +0 -1
  241. package/dist/chunk-OGNE3OFT.js.map +0 -1
  242. package/dist/chunk-OGTJNHRG.js.map +0 -1
  243. package/dist/chunk-OMSRSL3B.js.map +0 -1
  244. package/dist/chunk-SOK5EUF7.js.map +0 -1
  245. package/dist/chunk-T7DOWS6T.js.map +0 -1
  246. package/dist/chunk-TIGSG6BX.js.map +0 -1
  247. package/dist/chunk-UDHHKZWO.js.map +0 -1
  248. package/dist/chunk-V6GQKOX2.js.map +0 -1
  249. package/dist/chunk-V6HCTCVD.js.map +0 -1
  250. package/dist/chunk-VXFGMDA7.js.map +0 -1
  251. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  252. package/dist/chunk-WSXUPSID.js.map +0 -1
  253. package/dist/chunk-WVLMZ5SG.js.map +0 -1
  254. package/dist/chunk-XKFRMGMW.js.map +0 -1
  255. package/dist/chunk-Y6LYKFXY.js.map +0 -1
  256. package/dist/chunk-ZPWZIVI6.js.map +0 -1
  257. package/ux-demo/recipes/recipes.css +0 -453
package/dist/catalog.js CHANGED
@@ -1,30 +1,22 @@
1
- import { ToolbarControlGroup } from './chunk-B6JYRX3P.js';
2
- import { Toolbar } from './chunk-VXFGMDA7.js';
3
- import { List } from './chunk-WVLMZ5SG.js';
4
- import { Pane } from './chunk-I4V3UDSA.js';
1
+ import { ToolbarControlGroup, ToolbarActionLink } from './chunk-ZIYOJFZD.js';
2
+ import { Toolbar } from './chunk-OQI7RCRP.js';
3
+ import { ListItem } from './chunk-ZSYLBVWG.js';
4
+ import { List } from './chunk-UMGY5JSP.js';
5
+ import { ToolbarText } from './chunk-DJKWFYAA.js';
6
+ import { Pane } from './chunk-V6RZWDII.js';
5
7
 
6
- import { ListHeader } from './chunk-GYGM363P.js';
7
- import { Text } from './chunk-XKFRMGMW.js';
8
- import { ListItem } from './chunk-I45QO2IZ.js';
9
- import { filterDataAttributes } from './chunk-SRSJO5QE.js';
10
8
 
9
+ import { ListHeader } from './chunk-2YOUUEWR.js';
10
+
11
+
12
+ import { filterDataAttributes } from './chunk-SRSJO5QE.js';
11
13
 
12
14
 
13
- import { LucideIcon } from './chunk-W2FK7ZNY.js';
14
15
 
15
- import { PanelLeftClose, Waypoints, ExternalLink, Moon, Sun, PanelLeftOpen } from 'lucide';
16
+ import { LucideIcon } from './chunk-4R777DUZ.js';
17
+ import { PanelLeftClose, Moon, Sun, PanelLeftOpen, Waypoints, ExternalLink } from 'lucide';
16
18
  import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
17
19
 
18
- function findEntry(sections, id) {
19
- for (const section of sections) {
20
- for (const entry of section.entries) if (entry.id === id) return entry;
21
- }
22
- return void 0;
23
- }
24
- function catalogEntryTags(tags) {
25
- if (!tags?.length) return void 0;
26
- return /* @__PURE__ */ jsx("span", { class: "kui-catalog__tags", children: tags.map((tag) => /* @__PURE__ */ jsx("span", { class: "kui-catalog__tag", children: tag })) });
27
- }
28
20
  function relatedMenuItems(related, selectAction) {
29
21
  const groups = [];
30
22
  for (const entry of related)
@@ -42,6 +34,336 @@ function relatedMenuItems(related, selectAction) {
42
34
  });
43
35
  return nodes;
44
36
  }
37
+ function CatalogResourceFooter({
38
+ name,
39
+ active,
40
+ resources,
41
+ related,
42
+ status,
43
+ selectAction
44
+ }) {
45
+ return /* @__PURE__ */ jsxs("div", { class: "kui-catalog__footer", children: [
46
+ status ? /* @__PURE__ */ jsx("div", { class: "kui-catalog__status", children: status }) : null,
47
+ /* @__PURE__ */ jsx(
48
+ Toolbar,
49
+ {
50
+ label: `${name} resources`,
51
+ dividerSides: "",
52
+ responsive: "stack",
53
+ responsiveAt: "narrow",
54
+ leading: resources.length > 0 ? /* @__PURE__ */ jsx(
55
+ ToolbarControlGroup,
56
+ {
57
+ label: `${name} resources`,
58
+ content: "mixed",
59
+ size: "compact",
60
+ overflow: "scroll",
61
+ children: resources.map((resource) => /* @__PURE__ */ jsx(
62
+ ToolbarActionLink,
63
+ {
64
+ href: resource.href,
65
+ label: resource.label,
66
+ detail: resource.detail,
67
+ ariaLabel: `${name}: ${resource.label} (opens in new tab)`,
68
+ external: true,
69
+ icon: /* @__PURE__ */ jsx(LucideIcon, { icon: ExternalLink, name: "external-link" })
70
+ }
71
+ ))
72
+ }
73
+ ) : null,
74
+ trailing: related.length > 0 ? /* @__PURE__ */ jsx(
75
+ ToolbarControlGroup,
76
+ {
77
+ single: true,
78
+ content: "mixed",
79
+ nestedDropdown: true,
80
+ menuInset: "compact",
81
+ size: "compact",
82
+ label: "Related entries",
83
+ children: /* @__PURE__ */ jsxs(
84
+ "wa-dropdown",
85
+ {
86
+ 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
+ ]
97
+ }
98
+ )
99
+ }
100
+ ) : null
101
+ }
102
+ )
103
+ ] });
104
+ }
105
+ function CatalogStage({
106
+ name,
107
+ content,
108
+ geometryOverlay
109
+ }) {
110
+ return /* @__PURE__ */ jsx("section", { class: "kui-catalog__stage", "aria-label": `${name} preview`, children: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__canvas", children: [
111
+ content,
112
+ geometryOverlay !== void 0 ? /* @__PURE__ */ jsx(
113
+ "div",
114
+ {
115
+ class: "kui-catalog__geometry-overlay",
116
+ "data-catalog-geometry-overlay": true,
117
+ "data-morph-skip-children": true,
118
+ "aria-hidden": "true"
119
+ }
120
+ ) : null
121
+ ] }) });
122
+ }
123
+ function CatalogDetail({
124
+ brandTitle,
125
+ active,
126
+ selected,
127
+ content,
128
+ collapsed,
129
+ theme,
130
+ headerActions,
131
+ status,
132
+ geometryOverlay,
133
+ selectAction,
134
+ toggleSidebarAction,
135
+ toggleThemeAction
136
+ }) {
137
+ const name = selected?.name ?? "";
138
+ const nextTheme = theme === "dark" ? "light" : "dark";
139
+ return /* @__PURE__ */ jsx("article", { class: "kui-catalog__detail", children: /* @__PURE__ */ jsx(
140
+ Pane,
141
+ {
142
+ contentClassName: "kui-catalog__detail-preview",
143
+ header: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__header", children: [
144
+ /* @__PURE__ */ jsx(
145
+ Toolbar,
146
+ {
147
+ label: `${name} header`,
148
+ dividerSides: "",
149
+ leading: /* @__PURE__ */ jsxs(Fragment, { children: [
150
+ collapsed ? /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
151
+ "button",
152
+ {
153
+ type: "button",
154
+ "data-action": toggleSidebarAction,
155
+ "aria-label": `Expand ${brandTitle} catalog`,
156
+ children: /* @__PURE__ */ jsx(
157
+ LucideIcon,
158
+ {
159
+ icon: PanelLeftOpen,
160
+ name: "panel-left-open"
161
+ }
162
+ )
163
+ }
164
+ ) }) : null,
165
+ /* @__PURE__ */ jsx(ToolbarText, { text: name, size: "xlarge", headingLevel: 2 })
166
+ ] }),
167
+ trailing: /* @__PURE__ */ jsxs(Fragment, { children: [
168
+ headerActions,
169
+ theme ? /* @__PURE__ */ jsx(
170
+ ToolbarControlGroup,
171
+ {
172
+ appearance: "borderless",
173
+ content: "mixed",
174
+ size: "compact",
175
+ label: "Catalog display",
176
+ children: /* @__PURE__ */ jsxs(
177
+ "button",
178
+ {
179
+ type: "button",
180
+ "data-action": toggleThemeAction,
181
+ "aria-label": `Use ${nextTheme} theme`,
182
+ "data-theme-preview": theme,
183
+ children: [
184
+ nextTheme === "dark" ? /* @__PURE__ */ jsx(LucideIcon, { icon: Moon, name: "moon" }) : /* @__PURE__ */ jsx(LucideIcon, { icon: Sun, name: "sun" }),
185
+ /* @__PURE__ */ jsx("span", { children: nextTheme === "dark" ? "Dark" : "Light" })
186
+ ]
187
+ }
188
+ )
189
+ }
190
+ ) : null
191
+ ] })
192
+ }
193
+ ),
194
+ selected?.description ? /* @__PURE__ */ jsx("p", { class: "kui-catalog__description kui-content-item", children: selected.description }) : null
195
+ ] }),
196
+ footer: /* @__PURE__ */ jsx(
197
+ CatalogResourceFooter,
198
+ {
199
+ name,
200
+ active,
201
+ resources: selected?.resources ?? [],
202
+ related: selected?.related ?? [],
203
+ status,
204
+ selectAction
205
+ }
206
+ ),
207
+ children: /* @__PURE__ */ jsx(
208
+ CatalogStage,
209
+ {
210
+ name,
211
+ content,
212
+ geometryOverlay
213
+ }
214
+ )
215
+ }
216
+ ) });
217
+ }
218
+ function CatalogSecondarySections({
219
+ group,
220
+ active,
221
+ selectAction,
222
+ toggleAction
223
+ }) {
224
+ return /* @__PURE__ */ jsxs("section", { class: "kui-catalog__group--secondary", children: [
225
+ group.collapsible ? /* @__PURE__ */ jsx(
226
+ ListHeader,
227
+ {
228
+ label: group.label,
229
+ toggle: true,
230
+ expanded: Boolean(group.expanded),
231
+ action: toggleAction
232
+ }
233
+ ) : /* @__PURE__ */ jsx(ListHeader, { label: group.label }),
234
+ !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: [
235
+ /* @__PURE__ */ jsx("h3", { class: "kui-catalog__secondary-heading", children: section.category }),
236
+ /* @__PURE__ */ jsx("div", { class: "kui-catalog__secondary-items", children: /* @__PURE__ */ jsx(List, { gap: "2xs", children: section.entries.map((entry) => /* @__PURE__ */ jsx(
237
+ ListItem,
238
+ {
239
+ action: selectAction,
240
+ itemId: entry.id,
241
+ label: entry.name,
242
+ status: entry.tags?.join(" \xB7 "),
243
+ selected: active === entry.id,
244
+ title: entry.description,
245
+ multiline: true
246
+ }
247
+ )) }) })
248
+ ] })) }) : null
249
+ ] });
250
+ }
251
+ function CatalogSectionList({
252
+ sections,
253
+ active,
254
+ selectAction
255
+ }) {
256
+ return /* @__PURE__ */ jsx("div", { class: "kui-catalog__sections", children: sections.map((section) => /* @__PURE__ */ jsxs("section", { class: "kui-catalog__group", children: [
257
+ /* @__PURE__ */ jsx(ListHeader, { label: section.category }),
258
+ /* @__PURE__ */ jsx("div", { class: "kui-catalog__items", children: /* @__PURE__ */ jsx(List, { gap: "2xs", children: section.entries.map((entry) => /* @__PURE__ */ jsx(
259
+ ListItem,
260
+ {
261
+ action: selectAction,
262
+ itemId: entry.id,
263
+ label: entry.name,
264
+ status: entry.tags?.join(" \xB7 "),
265
+ selected: active === entry.id,
266
+ title: entry.description,
267
+ multiline: true
268
+ }
269
+ )) }) })
270
+ ] })) });
271
+ }
272
+ function CatalogSidebar({
273
+ brand,
274
+ sections,
275
+ active,
276
+ collapsed,
277
+ secondarySections,
278
+ footer,
279
+ selectAction,
280
+ toggleSidebarAction,
281
+ toggleSecondaryAction
282
+ }) {
283
+ return /* @__PURE__ */ jsx(
284
+ "aside",
285
+ {
286
+ class: "kui-catalog__sidebar",
287
+ "aria-label": `${brand.title} catalog`,
288
+ "data-collapsed": String(collapsed),
289
+ children: /* @__PURE__ */ jsx(
290
+ Pane,
291
+ {
292
+ header: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__brand", children: [
293
+ /* @__PURE__ */ jsx(
294
+ Toolbar,
295
+ {
296
+ label: `${brand.title} catalog header`,
297
+ dividerSides: "",
298
+ leading: /* @__PURE__ */ jsxs(Fragment, { children: [
299
+ brand.logoUrl ? /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
300
+ "img",
301
+ {
302
+ class: "kui-catalog__mark",
303
+ src: brand.logoUrl,
304
+ alt: ""
305
+ }
306
+ ) }) : null,
307
+ /* @__PURE__ */ jsx(
308
+ ToolbarText,
309
+ {
310
+ text: brand.title,
311
+ size: "large",
312
+ headingLevel: 1
313
+ }
314
+ )
315
+ ] }),
316
+ trailing: /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
317
+ "button",
318
+ {
319
+ type: "button",
320
+ "data-action": toggleSidebarAction,
321
+ "aria-label": `Collapse ${brand.title} catalog`,
322
+ children: /* @__PURE__ */ jsx(LucideIcon, { icon: PanelLeftClose, name: "panel-left-close" })
323
+ }
324
+ ) })
325
+ }
326
+ ),
327
+ brand.subtitle ? /* @__PURE__ */ jsx("p", { class: "kui-catalog__subtitle", children: brand.subtitle }) : null
328
+ ] }),
329
+ children: /* @__PURE__ */ jsxs(
330
+ "nav",
331
+ {
332
+ class: "kui-catalog__navigation",
333
+ "aria-label": `${brand.title} components`,
334
+ children: [
335
+ /* @__PURE__ */ jsx(
336
+ CatalogSectionList,
337
+ {
338
+ sections,
339
+ active,
340
+ selectAction
341
+ }
342
+ ),
343
+ secondarySections ? /* @__PURE__ */ jsx(
344
+ CatalogSecondarySections,
345
+ {
346
+ group: secondarySections,
347
+ active,
348
+ selectAction,
349
+ toggleAction: toggleSecondaryAction
350
+ }
351
+ ) : null,
352
+ footer
353
+ ]
354
+ }
355
+ )
356
+ }
357
+ )
358
+ }
359
+ );
360
+ }
361
+ function findEntry(sections, id) {
362
+ for (const section of sections) {
363
+ for (const entry of section.entries) if (entry.id === id) return entry;
364
+ }
365
+ return void 0;
366
+ }
45
367
  function Catalog({
46
368
  brand,
47
369
  sections,
@@ -58,13 +380,10 @@ function Catalog({
58
380
  toggleSidebarAction = "catalog-toggle-sidebar",
59
381
  toggleThemeAction = "catalog-toggle-theme",
60
382
  toggleSecondaryAction = "catalog-toggle-secondary",
61
- className = ""
383
+ className = "",
384
+ slot
62
385
  }) {
63
386
  const selected = findEntry(sections, active) ?? (secondarySections ? findEntry(secondarySections.sections, active) : void 0);
64
- const name = selected?.name ?? "";
65
- const nextTheme = theme === "dark" ? "light" : "dark";
66
- const resources = selected?.resources ?? [];
67
- const related = selected?.related ?? [];
68
387
  return /* @__PURE__ */ jsxs(
69
388
  "main",
70
389
  {
@@ -72,249 +391,44 @@ function Catalog({
72
391
  "data-component": "catalog",
73
392
  "data-sidebar-collapsed": String(collapsed),
74
393
  "data-geometry-overlay": geometryOverlay === void 0 ? void 0 : String(geometryOverlay),
394
+ slot,
75
395
  children: [
76
396
  /* @__PURE__ */ jsx(
77
- Pane,
397
+ CatalogSidebar,
78
398
  {
79
- element: "aside",
80
- className: "kui-catalog__sidebar",
81
- label: `${brand.title} catalog`,
82
- contentElement: "nav",
83
- contentLabel: `${brand.title} components`,
84
- separators: ["inline-end"],
85
- headerClassName: "kui-catalog__brand",
86
- header: /* @__PURE__ */ jsxs(Fragment, { children: [
87
- /* @__PURE__ */ jsx(
88
- Toolbar,
89
- {
90
- label: `${brand.title} catalog header`,
91
- dividerSides: "",
92
- leading: /* @__PURE__ */ jsxs(
93
- ToolbarControlGroup,
94
- {
95
- appearance: "borderless",
96
- className: "kui-catalog__identity",
97
- children: [
98
- brand.logoUrl ? /* @__PURE__ */ jsx("img", { class: "kui-catalog__mark", src: brand.logoUrl, alt: "" }) : /* @__PURE__ */ jsx(Fragment, {}),
99
- /* @__PURE__ */ jsx(Text, { variant: "h1", children: brand.title })
100
- ]
101
- }
102
- ),
103
- trailing: /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
104
- "button",
105
- {
106
- type: "button",
107
- "data-action": toggleSidebarAction,
108
- "aria-label": `Collapse ${brand.title} catalog`,
109
- children: /* @__PURE__ */ jsx(LucideIcon, { icon: PanelLeftClose, name: "panel-left-close" })
110
- }
111
- ) })
112
- }
113
- ),
114
- brand.subtitle ? /* @__PURE__ */ jsx(Text, { class: "kui-catalog__subtitle", children: brand.subtitle }) : /* @__PURE__ */ jsx(Fragment, {})
115
- ] }),
116
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
117
- sections.map((section) => /* @__PURE__ */ jsxs("section", { class: "kui-catalog__group", children: [
118
- /* @__PURE__ */ jsx(ListHeader, { label: section.category }),
119
- /* @__PURE__ */ jsx(List, { className: "kui-catalog__items", children: section.entries.map((entry) => /* @__PURE__ */ jsx(
120
- ListItem,
121
- {
122
- action: selectAction,
123
- itemId: entry.id,
124
- label: entry.name,
125
- trailing: catalogEntryTags(entry.tags),
126
- selected: active === entry.id,
127
- title: entry.description,
128
- multiline: true
129
- }
130
- )) })
131
- ] })),
132
- secondarySections ? /* @__PURE__ */ jsxs("section", { class: "kui-catalog__group kui-catalog__group--secondary", children: [
133
- secondarySections.collapsible ? /* @__PURE__ */ jsx(
134
- ListHeader,
135
- {
136
- label: secondarySections.label,
137
- toggle: true,
138
- expanded: Boolean(secondarySections.expanded),
139
- action: toggleSecondaryAction
140
- }
141
- ) : /* @__PURE__ */ jsx(ListHeader, { label: secondarySections.label }),
142
- !secondarySections.collapsible || secondarySections.expanded ? /* @__PURE__ */ jsx("div", { class: "kui-catalog__secondary", "data-catalog-secondary": true, children: secondarySections.sections.map((section) => /* @__PURE__ */ jsxs("section", { class: "kui-catalog__secondary-group", children: [
143
- /* @__PURE__ */ jsx(Text, { variant: "h3", class: "kui-catalog__secondary-heading", children: section.category }),
144
- /* @__PURE__ */ jsx(List, { className: "kui-catalog__items", children: section.entries.map((entry) => /* @__PURE__ */ jsx(
145
- ListItem,
146
- {
147
- action: selectAction,
148
- itemId: entry.id,
149
- label: entry.name,
150
- trailing: catalogEntryTags(entry.tags),
151
- selected: active === entry.id,
152
- title: entry.description,
153
- multiline: true
154
- }
155
- )) })
156
- ] })) }) : /* @__PURE__ */ jsx(Fragment, {})
157
- ] }) : /* @__PURE__ */ jsx(Fragment, {}),
158
- sidebarFooter ?? /* @__PURE__ */ jsx(Fragment, {})
159
- ] })
399
+ brand,
400
+ sections,
401
+ active,
402
+ collapsed,
403
+ secondarySections,
404
+ footer: sidebarFooter,
405
+ selectAction,
406
+ toggleSidebarAction,
407
+ toggleSecondaryAction
160
408
  }
161
409
  ),
162
410
  /* @__PURE__ */ jsx(
163
- Pane,
411
+ CatalogDetail,
164
412
  {
165
- element: "article",
166
- className: "kui-catalog__detail",
167
- contentElement: "section",
168
- contentLabel: `${name} preview`,
169
- contentClassName: "kui-catalog__stage",
170
- headerClassName: "kui-catalog__header",
171
- header: /* @__PURE__ */ jsxs(Fragment, { children: [
172
- /* @__PURE__ */ jsx(
173
- Toolbar,
174
- {
175
- label: `${name} header`,
176
- dividerSides: "",
177
- leading: /* @__PURE__ */ jsxs(Fragment, { children: [
178
- collapsed ? /* @__PURE__ */ jsx(ToolbarControlGroup, { appearance: "borderless", single: true, children: /* @__PURE__ */ jsx(
179
- "button",
180
- {
181
- type: "button",
182
- "data-action": toggleSidebarAction,
183
- "aria-label": `Expand ${brand.title} catalog`,
184
- children: /* @__PURE__ */ jsx(
185
- LucideIcon,
186
- {
187
- icon: PanelLeftOpen,
188
- name: "panel-left-open"
189
- }
190
- )
191
- }
192
- ) }) : /* @__PURE__ */ jsx(Fragment, {}),
193
- /* @__PURE__ */ jsx(
194
- ToolbarControlGroup,
195
- {
196
- appearance: "borderless",
197
- className: "kui-catalog__title",
198
- children: /* @__PURE__ */ jsx(Text, { variant: "h2", children: name })
199
- }
200
- )
201
- ] }),
202
- trailing: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__header-actions", children: [
203
- headerActions,
204
- theme ? /* @__PURE__ */ jsx(
205
- ToolbarControlGroup,
206
- {
207
- className: "kui-catalog__settings",
208
- label: "Catalog display",
209
- children: /* @__PURE__ */ jsxs(
210
- "button",
211
- {
212
- type: "button",
213
- "data-action": toggleThemeAction,
214
- "aria-label": `Use ${nextTheme} theme`,
215
- "data-theme-preview": theme,
216
- children: [
217
- nextTheme === "dark" ? /* @__PURE__ */ jsx(LucideIcon, { icon: Moon, name: "moon" }) : /* @__PURE__ */ jsx(LucideIcon, { icon: Sun, name: "sun" }),
218
- /* @__PURE__ */ jsx("span", { children: nextTheme === "dark" ? "Dark" : "Light" })
219
- ]
220
- }
221
- )
222
- }
223
- ) : /* @__PURE__ */ jsx(Fragment, {})
224
- ] })
225
- }
226
- ),
227
- selected?.description ? /* @__PURE__ */ jsx(Text, { class: "kui-catalog__description kui-content-item", children: selected.description }) : /* @__PURE__ */ jsx(Fragment, {})
228
- ] }),
229
- footerClassName: "kui-catalog__footer",
230
- footer: /* @__PURE__ */ jsxs(Fragment, { children: [
231
- status ? /* @__PURE__ */ jsx("div", { class: "kui-catalog__status", children: status }) : /* @__PURE__ */ jsx(Fragment, {}),
232
- /* @__PURE__ */ jsx(
233
- Toolbar,
234
- {
235
- label: `${name} resources`,
236
- dividerSides: "",
237
- leading: resources.length > 0 ? /* @__PURE__ */ jsx(
238
- "nav",
239
- {
240
- class: "kui-catalog__resources",
241
- "aria-label": `${name} resources`,
242
- children: /* @__PURE__ */ jsx(
243
- ToolbarControlGroup,
244
- {
245
- className: "kui-catalog__resource-group",
246
- label: `${name} resources`,
247
- children: resources.map((resource) => /* @__PURE__ */ jsxs(
248
- "a",
249
- {
250
- class: "kui-catalog__resource",
251
- href: resource.href,
252
- target: "_blank",
253
- rel: "noopener noreferrer",
254
- "aria-label": `${name}: ${resource.label} (opens in new tab)`,
255
- children: [
256
- /* @__PURE__ */ jsx(
257
- LucideIcon,
258
- {
259
- icon: ExternalLink,
260
- name: "external-link"
261
- }
262
- ),
263
- /* @__PURE__ */ jsx("span", { children: resource.label }),
264
- resource.detail ? /* @__PURE__ */ jsx("code", { children: resource.detail }) : /* @__PURE__ */ jsx(Fragment, {})
265
- ]
266
- }
267
- ))
268
- }
269
- )
270
- }
271
- ) : /* @__PURE__ */ jsx(Fragment, {}),
272
- trailing: related.length > 0 ? /* @__PURE__ */ jsx("div", { class: "kui-catalog__related", "data-catalog-related": true, children: /* @__PURE__ */ jsx(
273
- ToolbarControlGroup,
274
- {
275
- single: true,
276
- className: "kui-catalog__related-group",
277
- label: "Related entries",
278
- children: /* @__PURE__ */ jsxs(
279
- "wa-dropdown",
280
- {
281
- class: "kui-catalog__related-menu",
282
- placement: "top-end",
283
- "data-key": `kui-catalog-related-${active}`,
284
- "data-morph-skip-children": true,
285
- children: [
286
- /* @__PURE__ */ jsx("wa-button", { slot: "trigger", appearance: "plain", "with-caret": true, children: /* @__PURE__ */ jsxs("span", { class: "kui-catalog__related-trigger", children: [
287
- /* @__PURE__ */ jsx(LucideIcon, { icon: Waypoints, name: "waypoints" }),
288
- /* @__PURE__ */ jsx("span", { class: "kui-catalog__related-label", children: "Components" })
289
- ] }) }),
290
- relatedMenuItems(related, selectAction)
291
- ]
292
- }
293
- )
294
- }
295
- ) }) : /* @__PURE__ */ jsx(Fragment, {})
296
- }
297
- )
298
- ] }),
299
- children: /* @__PURE__ */ jsxs("div", { class: "kui-catalog__canvas", children: [
300
- content,
301
- geometryOverlay !== void 0 ? /* @__PURE__ */ jsx(
302
- "div",
303
- {
304
- class: "kui-catalog__geometry-overlay",
305
- "data-catalog-geometry-overlay": true,
306
- "data-morph-skip-children": true,
307
- "aria-hidden": "true"
308
- }
309
- ) : /* @__PURE__ */ jsx(Fragment, {})
310
- ] })
413
+ brandTitle: brand.title,
414
+ active,
415
+ selected,
416
+ content,
417
+ collapsed,
418
+ theme,
419
+ headerActions,
420
+ status,
421
+ geometryOverlay,
422
+ selectAction,
423
+ toggleSidebarAction,
424
+ toggleThemeAction
311
425
  }
312
426
  )
313
427
  ]
314
428
  }
315
429
  );
316
430
  }
317
- var catalogExampleProtectedAttributes = /* @__PURE__ */ new Set([
431
+ var protectedAttributes = /* @__PURE__ */ new Set([
318
432
  "data-catalog-example",
319
433
  "data-catalog-example-stack",
320
434
  "data-catalog-example-label",
@@ -327,11 +441,12 @@ function CatalogExample({
327
441
  align = "none",
328
442
  rootAttributes = {},
329
443
  className = "",
330
- children
444
+ children,
445
+ slot
331
446
  }) {
332
447
  const safeRootAttributes = filterDataAttributes(
333
448
  rootAttributes,
334
- catalogExampleProtectedAttributes
449
+ protectedAttributes
335
450
  );
336
451
  return /* @__PURE__ */ jsxs(
337
452
  "section",
@@ -340,29 +455,39 @@ function CatalogExample({
340
455
  class: `kui-catalog-example ${className}`.trim(),
341
456
  "data-catalog-example": true,
342
457
  "data-align": align,
458
+ slot,
343
459
  children: [
344
460
  label !== void 0 ? /* @__PURE__ */ jsx(
345
461
  ListHeader,
346
462
  {
347
463
  label,
464
+ width: "content",
348
465
  rootAttributes: { "data-catalog-example-label": "" }
349
466
  }
350
- ) : /* @__PURE__ */ jsx(Fragment, {}),
351
- note !== void 0 ? /* @__PURE__ */ jsx(Text, { class: "kui-catalog-example__note", "data-catalog-example-note": true, children: note }) : null,
467
+ ) : null,
468
+ note !== void 0 ? /* @__PURE__ */ jsx("p", { class: "kui-catalog-example__note", "data-catalog-example-note": true, children: note }) : null,
352
469
  children
353
470
  ]
354
471
  }
355
472
  );
356
473
  }
474
+ var protectedAttributes2 = /* @__PURE__ */ new Set([
475
+ "data-catalog-example",
476
+ "data-catalog-example-stack",
477
+ "data-catalog-example-label",
478
+ "data-catalog-example-note",
479
+ "data-align"
480
+ ]);
357
481
  function CatalogExampleStack({
358
482
  label,
359
483
  rootAttributes = {},
360
484
  className = "",
361
- children
485
+ children,
486
+ slot
362
487
  }) {
363
488
  const safeRootAttributes = filterDataAttributes(
364
489
  rootAttributes,
365
- catalogExampleProtectedAttributes
490
+ protectedAttributes2
366
491
  );
367
492
  return /* @__PURE__ */ jsx(
368
493
  "section",
@@ -371,6 +496,7 @@ function CatalogExampleStack({
371
496
  class: `kui-catalog-example-stack ${className}`.trim(),
372
497
  "data-catalog-example-stack": true,
373
498
  "aria-label": label,
499
+ slot,
374
500
  children
375
501
  }
376
502
  );