@kerfjs/ui 5.0.0-beta.48 → 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 (260) hide show
  1. package/README.md +49 -13
  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 +164 -23
  8. package/ai/component-catalog.json +184 -27
  9. package/ai/public-api-signatures-v1.md +239 -168
  10. package/ai/skill.md +27 -12
  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/grid.js +3 -0
  19. package/dist/browser/list-header.js +1 -0
  20. package/dist/browser/state-banner.js +1 -0
  21. package/dist/catalog-resources.d.ts +2 -2
  22. package/dist/catalog.d.ts +24 -125
  23. package/dist/catalog.js +387 -261
  24. package/dist/catalog.js.map +1 -1
  25. package/dist/{chunk-OGTJNHRG.js → chunk-2WMSE4MK.js} +5 -3
  26. package/dist/chunk-2WMSE4MK.js.map +1 -0
  27. package/dist/{chunk-GYGM363P.js → chunk-2YOUUEWR.js} +16 -6
  28. package/dist/chunk-2YOUUEWR.js.map +1 -0
  29. package/dist/{chunk-UDHHKZWO.js → chunk-3V75EQIP.js} +8 -4
  30. package/dist/chunk-3V75EQIP.js.map +1 -0
  31. package/dist/{chunk-W2FK7ZNY.js → chunk-4R777DUZ.js} +10 -2
  32. package/dist/chunk-4R777DUZ.js.map +1 -0
  33. package/dist/{chunk-T7DOWS6T.js → chunk-54HM36IQ.js} +6 -3
  34. package/dist/chunk-54HM36IQ.js.map +1 -0
  35. package/dist/{chunk-DAO2VFTT.js → chunk-5CE64WGC.js} +6 -4
  36. package/dist/chunk-5CE64WGC.js.map +1 -0
  37. package/dist/{chunk-SOK5EUF7.js → chunk-6ZXOQEAN.js} +4 -2
  38. package/dist/chunk-6ZXOQEAN.js.map +1 -0
  39. package/dist/{chunk-OGNE3OFT.js → chunk-AQSKJ6U6.js} +4 -2
  40. package/dist/chunk-AQSKJ6U6.js.map +1 -0
  41. package/dist/{chunk-VDUJZF5G.js → chunk-CMUIXJZM.js} +2 -2
  42. package/dist/{chunk-VDUJZF5G.js.map → chunk-CMUIXJZM.js.map} +1 -1
  43. package/dist/{chunk-OMSRSL3B.js → chunk-COUPLRZG.js} +5 -3
  44. package/dist/chunk-COUPLRZG.js.map +1 -0
  45. package/dist/{chunk-2TYUFZUC.js → chunk-D7GWXIAS.js} +4 -2
  46. package/dist/chunk-D7GWXIAS.js.map +1 -0
  47. package/dist/{chunk-AQFWBG23.js → chunk-DARTMI5Z.js} +5 -3
  48. package/dist/chunk-DARTMI5Z.js.map +1 -0
  49. package/dist/{chunk-V6GQKOX2.js → chunk-DJKWFYAA.js} +5 -3
  50. package/dist/chunk-DJKWFYAA.js.map +1 -0
  51. package/dist/{chunk-6NDBE2OK.js → chunk-E36EVCKG.js} +5 -3
  52. package/dist/chunk-E36EVCKG.js.map +1 -0
  53. package/dist/chunk-ELRMBQEC.js +47 -0
  54. package/dist/chunk-ELRMBQEC.js.map +1 -0
  55. package/dist/{chunk-TIGSG6BX.js → chunk-HJKRCKDR.js} +7 -3
  56. package/dist/chunk-HJKRCKDR.js.map +1 -0
  57. package/dist/{chunk-Y6LYKFXY.js → chunk-HMQ2ZDGG.js} +5 -3
  58. package/dist/chunk-HMQ2ZDGG.js.map +1 -0
  59. package/dist/{chunk-WN52USHV.js → chunk-J3EE6XWD.js} +2 -2
  60. package/dist/{chunk-WN52USHV.js.map → chunk-J3EE6XWD.js.map} +1 -1
  61. package/dist/{chunk-CK6P5AUK.js → chunk-KKNK3JUT.js} +7 -4
  62. package/dist/chunk-KKNK3JUT.js.map +1 -0
  63. package/dist/{chunk-ZPWZIVI6.js → chunk-N3GKMPDW.js} +7 -3
  64. package/dist/chunk-N3GKMPDW.js.map +1 -0
  65. package/dist/{chunk-DYBPI5O2.js → chunk-NDUGJ4TU.js} +4 -2
  66. package/dist/chunk-NDUGJ4TU.js.map +1 -0
  67. package/dist/{chunk-WSXUPSID.js → chunk-NN6GYOA2.js} +7 -3
  68. package/dist/chunk-NN6GYOA2.js.map +1 -0
  69. package/dist/{chunk-VXFGMDA7.js → chunk-OQI7RCRP.js} +10 -2
  70. package/dist/chunk-OQI7RCRP.js.map +1 -0
  71. package/dist/{chunk-E34TE2ZI.js → chunk-S6ZTTTV7.js} +5 -3
  72. package/dist/chunk-S6ZTTTV7.js.map +1 -0
  73. package/dist/{chunk-V6HCTCVD.js → chunk-SIU2AC5W.js} +8 -4
  74. package/dist/chunk-SIU2AC5W.js.map +1 -0
  75. package/dist/{chunk-WVLMZ5SG.js → chunk-UMGY5JSP.js} +4 -2
  76. package/dist/chunk-UMGY5JSP.js.map +1 -0
  77. package/dist/{chunk-I4V3UDSA.js → chunk-V6RZWDII.js} +7 -5
  78. package/dist/chunk-V6RZWDII.js.map +1 -0
  79. package/dist/{chunk-CAB6NQ2T.js → chunk-VOCPXGQN.js} +3 -1
  80. package/dist/chunk-VOCPXGQN.js.map +1 -0
  81. package/dist/chunk-XD7DWYXG.js +34 -0
  82. package/dist/chunk-XD7DWYXG.js.map +1 -0
  83. package/dist/{chunk-B6JYRX3P.js → chunk-ZIYOJFZD.js} +43 -4
  84. package/dist/chunk-ZIYOJFZD.js.map +1 -0
  85. package/dist/{chunk-EYALJQQD.js → chunk-ZK5EGVFP.js} +4 -2
  86. package/dist/chunk-ZK5EGVFP.js.map +1 -0
  87. package/dist/{chunk-6WTETUZ6.js → chunk-ZLWQZUGF.js} +8 -2
  88. package/dist/chunk-ZLWQZUGF.js.map +1 -0
  89. package/dist/{chunk-XKFRMGMW.js → chunk-ZNZ2JDBW.js} +3 -1
  90. package/dist/chunk-ZNZ2JDBW.js.map +1 -0
  91. package/dist/{chunk-I45QO2IZ.js → chunk-ZSYLBVWG.js} +6 -4
  92. package/dist/chunk-ZSYLBVWG.js.map +1 -0
  93. package/dist/collapsible-panel.d.ts +3 -1
  94. package/dist/collapsible-panel.js +4 -2
  95. package/dist/collapsible-panel.js.map +1 -1
  96. package/dist/disclosure-arrow.d.ts +3 -1
  97. package/dist/disclosure-arrow.js +1 -1
  98. package/dist/empty-state.d.ts +3 -1
  99. package/dist/empty-state.js +1 -1
  100. package/dist/floating-toolbar.d.ts +3 -1
  101. package/dist/floating-toolbar.js +1 -1
  102. package/dist/grid.d.ts +20 -0
  103. package/dist/grid.js +4 -0
  104. package/dist/grid.js.map +1 -0
  105. package/dist/index.d.ts +4 -2
  106. package/dist/index.js +33 -31
  107. package/dist/list-action-row.d.ts +3 -1
  108. package/dist/list-action-row.js +1 -1
  109. package/dist/list-header.d.ts +6 -1
  110. package/dist/list-header.js +2 -1
  111. package/dist/list-inset-control.d.ts +3 -1
  112. package/dist/list-inset-control.js +1 -1
  113. package/dist/list-inset-text.d.ts +3 -1
  114. package/dist/list-inset-text.js +1 -1
  115. package/dist/list-item.d.ts +3 -1
  116. package/dist/list-item.js +1 -1
  117. package/dist/list.d.ts +3 -1
  118. package/dist/list.js +1 -1
  119. package/dist/loading-spinner.d.ts +3 -1
  120. package/dist/loading-spinner.js +1 -1
  121. package/dist/lucide-icon.d.ts +3 -1
  122. package/dist/lucide-icon.js +1 -1
  123. package/dist/nav-stack.d.ts +3 -1
  124. package/dist/nav-stack.js +1 -1
  125. package/dist/pane.d.ts +3 -1
  126. package/dist/pane.js +1 -1
  127. package/dist/resizable-region.d.ts +5 -2
  128. package/dist/resizable-region.js +1 -1
  129. package/dist/row.d.ts +3 -1
  130. package/dist/row.js +1 -1
  131. package/dist/segmented-control.d.ts +3 -1
  132. package/dist/segmented-control.js +1 -1
  133. package/dist/select.d.ts +3 -1
  134. package/dist/select.js +1 -1
  135. package/dist/skeleton.d.ts +3 -1
  136. package/dist/skeleton.js +1 -1
  137. package/dist/spacer.d.ts +3 -1
  138. package/dist/spacer.js +1 -1
  139. package/dist/split-view.d.ts +3 -1
  140. package/dist/split-view.js +24 -5
  141. package/dist/split-view.js.map +1 -1
  142. package/dist/state-banner.d.ts +3 -1
  143. package/dist/state-banner.js +2 -1
  144. package/dist/styles/badge.css +86 -0
  145. package/dist/styles/catalog/components/catalog-detail.css +35 -0
  146. package/dist/styles/catalog/components/catalog-example-stack.css +6 -0
  147. package/dist/styles/catalog/components/catalog-example.css +35 -0
  148. package/dist/styles/catalog/components/catalog-resource-footer.css +37 -0
  149. package/dist/styles/catalog/components/catalog-secondary-sections.css +38 -0
  150. package/dist/styles/catalog/components/catalog-section-list.css +22 -0
  151. package/dist/styles/catalog/components/catalog-sidebar.css +82 -0
  152. package/dist/styles/catalog/components/catalog-stage.css +60 -0
  153. package/dist/styles/catalog/components/catalog.css +22 -0
  154. package/dist/styles/catalog.css +10 -587
  155. package/dist/styles/grid.css +11 -0
  156. package/dist/styles/list-header.css +4 -60
  157. package/dist/styles/resizable-region.css +24 -0
  158. package/dist/styles/select.css +0 -3
  159. package/dist/styles/split-view.css +1 -1
  160. package/dist/styles/state-banner.css +0 -27
  161. package/dist/styles/styles.css +2 -0
  162. package/dist/styles/tab-bar.css +6 -1
  163. package/dist/styles/text.css +4 -0
  164. package/dist/styles/token-search-field.css +5 -40
  165. package/dist/styles/toolbar-control-group.css +110 -16
  166. package/dist/styles/toolbar-text.css +4 -0
  167. package/dist/styles/toolbar.css +72 -0
  168. package/dist/styles/webawesome.css +31 -0
  169. package/dist/sunken-panel.d.ts +3 -1
  170. package/dist/sunken-panel.js +1 -1
  171. package/dist/surface-scaffold.d.ts +6 -2
  172. package/dist/surface-scaffold.js +1 -1
  173. package/dist/tab-bar.d.ts +8 -1
  174. package/dist/tab-bar.js +1 -1
  175. package/dist/tab-scaffold.d.ts +3 -1
  176. package/dist/tab-scaffold.js +3 -1
  177. package/dist/tab-scaffold.js.map +1 -1
  178. package/dist/text.d.ts +5 -2
  179. package/dist/text.js +1 -1
  180. package/dist/token-search-field.d.ts +5 -1
  181. package/dist/token-search-field.js +1 -1
  182. package/dist/toolbar-control-group.d.ts +33 -3
  183. package/dist/toolbar-control-group.js +1 -1
  184. package/dist/toolbar-text.d.ts +3 -1
  185. package/dist/toolbar-text.js +1 -1
  186. package/dist/toolbar.d.ts +9 -1
  187. package/dist/toolbar.js +1 -1
  188. package/dist/types-CzgSrFXP.d.ts +64 -0
  189. package/dist/value-table.d.ts +6 -2
  190. package/dist/value-table.js +1 -1
  191. package/dist/wire-resizable-regions.js +1 -1
  192. package/dist/wire-token-search-fields.js +1 -1
  193. package/dist/workbench.d.ts +3 -1
  194. package/dist/workbench.js +3 -1
  195. package/dist/workbench.js.map +1 -1
  196. package/docs/accessibility.md +11 -1
  197. package/docs/catalog.md +25 -7
  198. package/docs/component-contract.md +71 -22
  199. package/docs/component-selection.md +19 -14
  200. package/docs/design-philosophy.md +6 -5
  201. package/docs/layout.md +24 -1
  202. package/docs/recipes.md +5 -5
  203. package/docs/type-contracts.md +1 -0
  204. package/docs/ux-demo.md +4 -4
  205. package/docs/webawesome-theme.md +8 -4
  206. package/llms.txt +35 -8
  207. package/package.json +15 -2
  208. package/ux-demo/recipes/app-shell.css +87 -0
  209. package/ux-demo/recipes/app-shell.tsx +207 -178
  210. package/ux-demo/recipes/collapsible-sidebar.css +83 -0
  211. package/ux-demo/recipes/collapsible-sidebar.tsx +152 -122
  212. package/ux-demo/recipes/compact-toolbar.css +35 -0
  213. package/ux-demo/recipes/compact-toolbar.tsx +104 -100
  214. package/ux-demo/recipes/composer-form.css +19 -0
  215. package/ux-demo/recipes/composer-form.tsx +19 -15
  216. package/ux-demo/recipes/list-detail-dialog.css +42 -0
  217. package/ux-demo/recipes/list-detail-dialog.tsx +127 -125
  218. package/ux-demo/recipes/list-workspace-states.css +30 -0
  219. package/ux-demo/recipes/list-workspace-states.tsx +66 -60
  220. package/ux-demo/recipes/loading-inspector.css +7 -0
  221. package/ux-demo/recipes/loading-inspector.tsx +151 -131
  222. package/ux-demo/recipes/navigation-sidebar.css +12 -0
  223. package/ux-demo/recipes/navigation-sidebar.tsx +116 -105
  224. package/ux-demo/recipes/navigation-stack.css +12 -0
  225. package/ux-demo/recipes/navigation-stack.tsx +47 -37
  226. package/ux-demo/recipes/recipe-root.css +67 -0
  227. package/ux-demo/recipes/recipe-root.tsx +87 -0
  228. package/ux-demo/recipes/workspace-header.css +7 -0
  229. package/ux-demo/recipes/workspace-header.tsx +60 -61
  230. package/dist/chunk-2TYUFZUC.js.map +0 -1
  231. package/dist/chunk-6NDBE2OK.js.map +0 -1
  232. package/dist/chunk-6WTETUZ6.js.map +0 -1
  233. package/dist/chunk-AQFWBG23.js.map +0 -1
  234. package/dist/chunk-B6JYRX3P.js.map +0 -1
  235. package/dist/chunk-CAB6NQ2T.js.map +0 -1
  236. package/dist/chunk-CK6P5AUK.js.map +0 -1
  237. package/dist/chunk-DAO2VFTT.js.map +0 -1
  238. package/dist/chunk-DYBPI5O2.js.map +0 -1
  239. package/dist/chunk-E34TE2ZI.js.map +0 -1
  240. package/dist/chunk-EYALJQQD.js.map +0 -1
  241. package/dist/chunk-GYGM363P.js.map +0 -1
  242. package/dist/chunk-I45QO2IZ.js.map +0 -1
  243. package/dist/chunk-I4V3UDSA.js.map +0 -1
  244. package/dist/chunk-OGNE3OFT.js.map +0 -1
  245. package/dist/chunk-OGTJNHRG.js.map +0 -1
  246. package/dist/chunk-OMSRSL3B.js.map +0 -1
  247. package/dist/chunk-SOK5EUF7.js.map +0 -1
  248. package/dist/chunk-T7DOWS6T.js.map +0 -1
  249. package/dist/chunk-TIGSG6BX.js.map +0 -1
  250. package/dist/chunk-UDHHKZWO.js.map +0 -1
  251. package/dist/chunk-V6GQKOX2.js.map +0 -1
  252. package/dist/chunk-V6HCTCVD.js.map +0 -1
  253. package/dist/chunk-VXFGMDA7.js.map +0 -1
  254. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  255. package/dist/chunk-WSXUPSID.js.map +0 -1
  256. package/dist/chunk-WVLMZ5SG.js.map +0 -1
  257. package/dist/chunk-XKFRMGMW.js.map +0 -1
  258. package/dist/chunk-Y6LYKFXY.js.map +0 -1
  259. package/dist/chunk-ZPWZIVI6.js.map +0 -1
  260. package/ux-demo/recipes/recipes.css +0 -453
@@ -4,6 +4,65 @@
4
4
  "package": "@kerfjs/ui",
5
5
  "description": "Machine-readable selection, composition, delivery, ownership, and accessibility metadata for Kerf UI and its supported Web Awesome set.",
6
6
  "entries": [
7
+ {
8
+ "id": "badge",
9
+ "name": "Badge",
10
+ "category": "Foundation",
11
+ "kind": "component",
12
+ "source": "kerf",
13
+ "description": "Self-styled, non-interactive status, count, and category metadata configured through semantic tone, appearance, shape, and size props.",
14
+ "uses": [],
15
+ "purpose": "Present compact metadata without application-authored badge CSS or consumer styling of component internals.",
16
+ "publicExports": [
17
+ "Badge"
18
+ ],
19
+ "useWhen": [
20
+ "Show a short status, count, category, or metadata label whose presentation should be configured rather than restyled."
21
+ ],
22
+ "avoidWhen": [
23
+ "Do not use Badge as a button, link, or removable chip; choose an interactive control with the correct native semantics.",
24
+ "Do not rely on tone alone to communicate meaning."
25
+ ],
26
+ "alternatives": [],
27
+ "appOwns": [
28
+ "metadata text",
29
+ "semantic tone mapping",
30
+ "accessible label for abbreviated content"
31
+ ],
32
+ "variants": [
33
+ "neutral, brand, pop, success, warning, or danger tone",
34
+ "quiet, solid, or outline appearance",
35
+ "pill or rounded shape",
36
+ "compact or default size",
37
+ "labeled or decorative duplicate"
38
+ ],
39
+ "accessibility": [
40
+ "Badge is non-interactive. Supply label when visible content is abbreviated, and ariaHidden when it repeats an accessible name owned by the surrounding component.",
41
+ "Keep meaningful text visible because tone is supplementary."
42
+ ],
43
+ "geometry": {
44
+ "margin": "none",
45
+ "border": "self",
46
+ "padding": "self"
47
+ },
48
+ "delivery": {
49
+ "browserImport": "@kerfjs/ui/badge",
50
+ "manualCssImport": "@kerfjs/ui/badge.css",
51
+ "sideEffects": [
52
+ "browser-condition-css"
53
+ ]
54
+ },
55
+ "wiring": [],
56
+ "publicClasses": [
57
+ "kui-badge"
58
+ ],
59
+ "publicTokens": [],
60
+ "links": {
61
+ "catalogRoute": "?component=badge",
62
+ "documentation": "docs/component-selection.md",
63
+ "recipe": "docs/component-selection.md#problem-to-component-matrix"
64
+ }
65
+ },
7
66
  {
8
67
  "id": "lucide-icon",
9
68
  "name": "LucideIcon",
@@ -630,7 +689,6 @@
630
689
  "publicClasses": [
631
690
  "kui-split-view",
632
691
  "kui-split-view__list",
633
- "kui-resizable-region",
634
692
  "kui-split-view__detail",
635
693
  "kui-split-view--compact"
636
694
  ],
@@ -776,6 +834,7 @@
776
834
  "slide, fade-slide, or instant content",
777
835
  "clipped, scrolling, or popup-visible content",
778
836
  "inline, overlay, or hidden responsive presentation",
837
+ "narrow or compact single-track responsive fill",
779
838
  "safe-area restore control"
780
839
  ],
781
840
  "accessibility": [
@@ -1082,17 +1141,19 @@
1082
1141
  "category": "Structure",
1083
1142
  "kind": "component",
1084
1143
  "source": "kerf",
1085
- "description": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
1144
+ "description": "Typed toolbar groups for buttons, semantic action links, compact mixed controls, selected states, dropdown surfaces, and avatar controls.",
1086
1145
  "uses": [
1087
1146
  "lucide-icon",
1088
1147
  "segmented-control"
1089
1148
  ],
1090
- "purpose": "Typed toolbar groups for compact, mixed, selected, dropdown, and avatar controls.",
1149
+ "purpose": "Provide complete toolbar action geometry through configuration, including semantic anchors, overflow containment, and dropdown menu insets without application CSS.",
1091
1150
  "publicExports": [
1151
+ "ToolbarActionLink",
1092
1152
  "ToolbarControlGroup"
1093
1153
  ],
1094
1154
  "useWhen": [
1095
1155
  "Group related controls inside a toolbar with a supported visual treatment.",
1156
+ "Use ToolbarActionLink for navigation or external resources that must retain native anchor semantics inside a group.",
1096
1157
  "Fill it with plain <button> controls (the group styles > button fully); use wa-button only for a Web Awesome feature such as a wa-dropdown popup trigger.",
1097
1158
  "For an avatar control, set content=avatar and avatarImage instead of inserting an img; one button paints the group and multiple buttons paint only the pressed highlight."
1098
1159
  ],
@@ -1112,6 +1173,7 @@
1112
1173
  ],
1113
1174
  "appOwns": [
1114
1175
  "actions",
1176
+ "link destination and copy",
1115
1177
  "pressed state",
1116
1178
  "expanded state",
1117
1179
  "avatar image URL"
@@ -1127,6 +1189,9 @@
1127
1189
  "raised, filled, or outline selected chrome",
1128
1190
  "brand, neutral, or pop selected tone",
1129
1191
  "nested dropdown trigger",
1192
+ "standard, compact, or list-zero dropdown menu inset",
1193
+ "visible or horizontally scrollable overflow",
1194
+ "always visible or compact-only responsive visibility",
1130
1195
  "avatar scrim",
1131
1196
  "contained avatar background on a single group or selected multi-button highlight"
1132
1197
  ],
@@ -1147,6 +1212,7 @@
1147
1212
  },
1148
1213
  "wiring": [],
1149
1214
  "publicClasses": [
1215
+ "kui-toolbar-action-link",
1150
1216
  "kui-toolbar-control-group"
1151
1217
  ],
1152
1218
  "publicTokens": [
@@ -1457,7 +1523,7 @@
1457
1523
  },
1458
1524
  {
1459
1525
  "id": "headers",
1460
- "name": "Header composition",
1526
+ "name": "Headers",
1461
1527
  "category": "Structure",
1462
1528
  "kind": "composition",
1463
1529
  "source": "kerf",
@@ -1680,6 +1746,104 @@
1680
1746
  "recipe": "docs/layout.md#row-and-list-alignment"
1681
1747
  }
1682
1748
  },
1749
+ {
1750
+ "id": "grid",
1751
+ "name": "Grid",
1752
+ "category": "Structure",
1753
+ "kind": "component",
1754
+ "source": "kerf",
1755
+ "description": "A fixed positive number of evenly distributed minmax columns with a typed xs gap by default and optional flex participation.",
1756
+ "uses": [],
1757
+ "purpose": "Arrange related siblings in equal-width columns without repeating application-owned grid-template-columns CSS.",
1758
+ "publicExports": ["Grid"],
1759
+ "cssValueProps": [
1760
+ {
1761
+ "path": "gap",
1762
+ "grammar": "length",
1763
+ "helpers": ["px", "rem", "em", "pct", "space", "lengthVar", "calc"],
1764
+ "nonStandaloneHelpers": ["plus"],
1765
+ "shorthands": ["none", "2xs", "xs", "s", "m", "l", "xl"],
1766
+ "canonicalShorthands": ["none", "2xs", "xs", "m", "l"],
1767
+ "exceptionalShorthands": ["s", "xl"],
1768
+ "rawPolicy": "forbid",
1769
+ "examples": ["gap=\"m\"", "gap={space(\"m\")}", "gap={calc(plus(rem(0.25), pct(10)))}"]
1770
+ },
1771
+ {
1772
+ "path": "flex",
1773
+ "grammar": "flex",
1774
+ "helpers": ["flex"],
1775
+ "shorthands": ["none", "auto", "initial"],
1776
+ "canonicalShorthands": ["none", "auto", "initial"],
1777
+ "exceptionalShorthands": [],
1778
+ "rawPolicy": "forbid",
1779
+ "examples": ["flex", "flex=\"none\"", "flex={flex(1, 1, rem(20))}"]
1780
+ }
1781
+ ],
1782
+ "useWhen": [
1783
+ "Arrange related siblings into a fixed positive number of equal-width columns.",
1784
+ "Prevent wider intrinsic content from making one fractional track wider than its peers.",
1785
+ "Use a finite flex keyword or the flex() builder when Grid participates in a flexible parent layout."
1786
+ ],
1787
+ "avoidWhen": [
1788
+ "Do not use Grid for intrinsic, asymmetric, spanning, auto-fit, or masonry tracks; use application-owned CSS grid.",
1789
+ "Do not use Grid when columns need a user-operable separator; use ResizableRegion.",
1790
+ "Do not expect Grid to choose responsive breakpoints or change the column count; the application owns that policy.",
1791
+ "Do not pass raw CSS strings to gap or flex, mix their distinct grammars, or use s/xl spacing steps without a deliberate exception."
1792
+ ],
1793
+ "alternatives": [
1794
+ {
1795
+ "id": "row",
1796
+ "relationship": "axis-alternative",
1797
+ "when": "Use Row for one horizontal flex line, alignment, or wrapping rather than fixed equal tracks."
1798
+ },
1799
+ {
1800
+ "id": "list",
1801
+ "relationship": "axis-alternative",
1802
+ "when": "Use List when the main layout axis is vertical."
1803
+ },
1804
+ {
1805
+ "id": "resize",
1806
+ "relationship": "interactive-alternative",
1807
+ "when": "Use ResizableRegion when people must adjust the boundary between tracks."
1808
+ }
1809
+ ],
1810
+ "appOwns": [
1811
+ "child semantics and content",
1812
+ "column count and responsive changes",
1813
+ "typed gap and flex choices"
1814
+ ],
1815
+ "variants": [
1816
+ "any positive safe-integer equal-track count",
1817
+ "named none/2xs/xs/s/m/l/xl token gap",
1818
+ "typed CssLength gap",
1819
+ "boolean, finite-keyword, or typed CssFlex flex"
1820
+ ],
1821
+ "accessibility": [
1822
+ "Grid adds layout only and no grid role; children retain responsibility for native or ARIA semantics.",
1823
+ "Responsive column-count changes must preserve source and focus order."
1824
+ ],
1825
+ "geometry": {
1826
+ "margin": "none",
1827
+ "border": "none",
1828
+ "padding": "none",
1829
+ "notes": [
1830
+ "Every track uses minmax(0, 1fr), so unequal intrinsic widths cannot break equal distribution."
1831
+ ]
1832
+ },
1833
+ "delivery": {
1834
+ "browserImport": "@kerfjs/ui/grid",
1835
+ "manualCssImport": "@kerfjs/ui/grid.css",
1836
+ "sideEffects": ["browser-condition-css"]
1837
+ },
1838
+ "wiring": [],
1839
+ "publicClasses": ["kui-grid"],
1840
+ "publicTokens": ["--kui-grid-gap", "--kui-layout-item-gap"],
1841
+ "links": {
1842
+ "catalogRoute": "?component=grid",
1843
+ "documentation": "docs/layout.md",
1844
+ "recipe": "docs/layout.md#grid"
1845
+ }
1846
+ },
1683
1847
  {
1684
1848
  "id": "spacer",
1685
1849
  "name": "Spacer",
@@ -1894,11 +2058,12 @@
1894
2058
  "source": "kerf",
1895
2059
  "description": "Configurable section headings with full-width or shrink-wrapped inline presentation, semantic count/status indicators, density, group dividers, a logical-end action, disclosure states, and protected native-popover trigger metadata.",
1896
2060
  "uses": [
2061
+ "badge",
1897
2062
  "lucide-icon",
1898
2063
  "disclosure-arrow",
1899
2064
  "text"
1900
2065
  ],
1901
- "purpose": "Fill the available section width by default, or shrink-wrap without outer geometry when inline, while splitting a dormant title and mutually exclusive semantic count or legacy badge from an optional logical-end action with an 18px visual; disclosure mode renders the title cluster as a button with a default production DisclosureArrow.",
2066
+ "purpose": "Fill the available section width by default, or shrink-wrap without outer geometry when inline, while splitting a dormant title and mutually exclusive semantic count or badge from an optional logical-end action with an 18px visual; disclosure mode renders the title cluster as a button with a default production DisclosureArrow.",
1902
2067
  "publicExports": [
1903
2068
  "ListHeader"
1904
2069
  ],
@@ -1957,16 +2122,12 @@
1957
2122
  "kui-list-header",
1958
2123
  "kui-list-header__action",
1959
2124
  "kui-list-header__action-layer",
1960
- "kui-list-header__badge",
1961
- "kui-list-header__count",
1962
2125
  "kui-list-header__label",
1963
2126
  "kui-list-header__title",
1964
2127
  "kui-list-header__toggle"
1965
2128
  ],
1966
2129
  "publicTokens": [
1967
2130
  "--kui-color-neutral-border-quiet",
1968
- "--kui-color-neutral-fill-quiet",
1969
- "--kui-color-neutral-on-quiet",
1970
2131
  "--kui-focus-ring",
1971
2132
  "--kui-font-xs",
1972
2133
  "--kui-list-header-action-icon-size",
@@ -1974,15 +2135,8 @@
1974
2135
  "--kui-layout-inline-margin",
1975
2136
  "--kui-layout-item-gap",
1976
2137
  "--kui-layout-item-padding",
1977
- "--kui-layout-pill-radius",
1978
- "--kui-list-header-count-font-size",
1979
2138
  "--kui-list-header-hover-background",
1980
- "--kui-list-group-divider-color",
1981
- "--kui-color-brand-on-normal",
1982
- "--kui-color-pop-fill-normal",
1983
- "--kui-color-pop-on-normal",
1984
- "--kui-color-danger-fill-normal",
1985
- "--kui-color-danger-on-normal"
2139
+ "--kui-list-group-divider-color"
1986
2140
  ],
1987
2141
  "links": {
1988
2142
  "catalogRoute": "?component=list-header",
@@ -2345,7 +2499,7 @@
2345
2499
  },
2346
2500
  {
2347
2501
  "id": "application-tabs",
2348
- "name": "Application tabs composition",
2502
+ "name": "Application tabs",
2349
2503
  "category": "Navigation",
2350
2504
  "kind": "composition",
2351
2505
  "source": "kerf",
@@ -2503,12 +2657,12 @@
2503
2657
  "category": "Navigation",
2504
2658
  "kind": "component",
2505
2659
  "source": "kerf",
2506
- "description": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
2660
+ "description": "Controlled tab strips with typed presentation and allocation, a scroll-owning tab region, an optional adjacent trailing action, and a separately pinned far-edge end action.",
2507
2661
  "uses": [
2508
2662
  "tabs",
2509
2663
  "toolbar-control-group"
2510
2664
  ],
2511
- "purpose": "Controlled tab strips with typed rail, segmented, and inspector presentation plus intrinsic or fill allocation.",
2665
+ "purpose": "Controlled tab strips whose tabs shrink and scroll while fixed leading, trailing, and far-edge end actions remain visible.",
2512
2666
  "publicExports": [
2513
2667
  "TabBar",
2514
2668
  "wireTabBars",
@@ -2549,7 +2703,8 @@
2549
2703
  "reorderable",
2550
2704
  "rail, segmented, and inspector presentation",
2551
2705
  "intrinsic or fill allocation",
2552
- "separate or adjacent trailing action"
2706
+ "separate or adjacent trailing action",
2707
+ "far-edge end action"
2553
2708
  ],
2554
2709
  "accessibility": [
2555
2710
  "Keep exactly one selected tab at tabindex 0 and preserve the wiring keyboard model."
@@ -2557,7 +2712,10 @@
2557
2712
  "geometry": {
2558
2713
  "margin": "none",
2559
2714
  "border": "self",
2560
- "padding": "self"
2715
+ "padding": "self",
2716
+ "notes": [
2717
+ "TabBar owns inline flex allocation: tabs shrink and scroll, an adjacent trailing action follows the tab strip, and the end action stays pinned at the far edge; leading, trailing, and end actions do not shrink."
2718
+ ]
2561
2719
  },
2562
2720
  "delivery": {
2563
2721
  "browserImport": "@kerfjs/ui/tab-bar",
@@ -2582,7 +2740,8 @@
2582
2740
  "kui-tab-bar",
2583
2741
  "kui-tab-bar__leading",
2584
2742
  "kui-tab-bar__tabs",
2585
- "kui-tab-bar__trailing"
2743
+ "kui-tab-bar__trailing",
2744
+ "kui-tab-bar__end"
2586
2745
  ],
2587
2746
  "publicTokens": [
2588
2747
  "--kui-tab-bar-background",
@@ -3048,7 +3207,7 @@
3048
3207
  },
3049
3208
  {
3050
3209
  "id": "feedback",
3051
- "name": "Feedback composition",
3210
+ "name": "Feedback",
3052
3211
  "category": "Feedback",
3053
3212
  "kind": "composition",
3054
3213
  "source": "kerf",
@@ -3125,6 +3284,7 @@
3125
3284
  "source": "kerf",
3126
3285
  "description": "Polite status and assertive alert feedback with semantic tones, plus non-status pop emphasis for featured or novel content.",
3127
3286
  "uses": [
3287
+ "badge",
3128
3288
  "lucide-icon"
3129
3289
  ],
3130
3290
  "purpose": "Present persistent inline feedback or attractive non-status emphasis with a named semantic tone.",
@@ -3191,7 +3351,6 @@
3191
3351
  "publicClasses": [
3192
3352
  "kui-state-banner",
3193
3353
  "kui-state-banner__action",
3194
- "kui-state-banner__badge",
3195
3354
  "kui-state-banner__copy",
3196
3355
  "kui-state-banner__detail",
3197
3356
  "kui-state-banner__icon"
@@ -3223,8 +3382,6 @@
3223
3382
  "--kui-state-banner-action-background",
3224
3383
  "--kui-state-banner-action-hover-background",
3225
3384
  "--kui-state-banner-background",
3226
- "--kui-state-banner-badge-background",
3227
- "--kui-state-banner-badge-foreground",
3228
3385
  "--kui-state-banner-border",
3229
3386
  "--kui-state-banner-danger-background",
3230
3387
  "--kui-state-banner-danger-border",