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

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 (319) hide show
  1. package/README.md +69 -15
  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 +19 -2
  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.d.ts +19 -1
  8. package/ai/component-catalog-v2.json +920 -149
  9. package/ai/component-catalog-v2.schema.json +33 -1
  10. package/ai/component-catalog.json +689 -153
  11. package/ai/component-catalog.schema.json +21 -1
  12. package/ai/public-api-signatures-v1.md +404 -184
  13. package/ai/skill.md +31 -14
  14. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  15. package/analyzer/index.mjs +105 -35
  16. package/dist/app-tab.d.ts +3 -1
  17. package/dist/app-tab.js +1 -1
  18. package/dist/badge.d.ts +24 -0
  19. package/dist/badge.js +3 -0
  20. package/dist/badge.js.map +1 -0
  21. package/dist/browser/badge.js +3 -0
  22. package/dist/browser/list-header.js +1 -0
  23. package/dist/browser/state-banner.js +1 -0
  24. package/dist/catalog-resources.d.ts +2 -2
  25. package/dist/catalog.d.ts +47 -125
  26. package/dist/catalog.js +429 -262
  27. package/dist/catalog.js.map +1 -1
  28. package/dist/{chunk-W2FK7ZNY.js → chunk-4R777DUZ.js} +10 -2
  29. package/dist/chunk-4R777DUZ.js.map +1 -0
  30. package/dist/{chunk-OMSRSL3B.js → chunk-5FZZMIMD.js} +6 -4
  31. package/dist/chunk-5FZZMIMD.js.map +1 -0
  32. package/dist/{chunk-AQFWBG23.js → chunk-5PMGQDG7.js} +5 -3
  33. package/dist/chunk-5PMGQDG7.js.map +1 -0
  34. package/dist/{chunk-SOK5EUF7.js → chunk-6ZXOQEAN.js} +4 -2
  35. package/dist/chunk-6ZXOQEAN.js.map +1 -0
  36. package/dist/{chunk-I4V3UDSA.js → chunk-7GUQYHKA.js} +25 -6
  37. package/dist/chunk-7GUQYHKA.js.map +1 -0
  38. package/dist/{chunk-XKFRMGMW.js → chunk-7IUSV4XG.js} +3 -1
  39. package/dist/chunk-7IUSV4XG.js.map +1 -0
  40. package/dist/{chunk-IU4QUY5I.js → chunk-AEPXGCNF.js} +20 -3
  41. package/dist/chunk-AEPXGCNF.js.map +1 -0
  42. package/dist/{chunk-VDUJZF5G.js → chunk-CMUIXJZM.js} +2 -2
  43. package/dist/{chunk-VDUJZF5G.js.map → chunk-CMUIXJZM.js.map} +1 -1
  44. package/dist/{chunk-DAO2VFTT.js → chunk-D547PH4L.js} +7 -5
  45. package/dist/chunk-D547PH4L.js.map +1 -0
  46. package/dist/{chunk-2TYUFZUC.js → chunk-D7GWXIAS.js} +4 -2
  47. package/dist/chunk-D7GWXIAS.js.map +1 -0
  48. package/dist/{chunk-E34TE2ZI.js → chunk-DVZCMMB3.js} +6 -4
  49. package/dist/chunk-DVZCMMB3.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-EKYZCRCX.js +256 -0
  53. package/dist/chunk-EKYZCRCX.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-UDHHKZWO.js → chunk-JM53SMVF.js} +9 -5
  59. package/dist/chunk-JM53SMVF.js.map +1 -0
  60. package/dist/{chunk-OGTJNHRG.js → chunk-JMGKM7RK.js} +6 -4
  61. package/dist/chunk-JMGKM7RK.js.map +1 -0
  62. package/dist/{chunk-GYGM363P.js → chunk-KX7DP2GO.js} +17 -7
  63. package/dist/chunk-KX7DP2GO.js.map +1 -0
  64. package/dist/{chunk-OL4TC3U2.js → chunk-MO56ZZLG.js} +6 -2
  65. package/dist/chunk-MO56ZZLG.js.map +1 -0
  66. package/dist/{chunk-VXFGMDA7.js → chunk-MTM43SJO.js} +16 -2
  67. package/dist/chunk-MTM43SJO.js.map +1 -0
  68. package/dist/{chunk-ZPWZIVI6.js → chunk-N3GKMPDW.js} +7 -3
  69. package/dist/chunk-N3GKMPDW.js.map +1 -0
  70. package/dist/{chunk-DYBPI5O2.js → chunk-NDUGJ4TU.js} +4 -2
  71. package/dist/chunk-NDUGJ4TU.js.map +1 -0
  72. package/dist/{chunk-I45QO2IZ.js → chunk-NMGTHYW3.js} +7 -5
  73. package/dist/chunk-NMGTHYW3.js.map +1 -0
  74. package/dist/{chunk-WSXUPSID.js → chunk-NN6GYOA2.js} +7 -3
  75. package/dist/chunk-NN6GYOA2.js.map +1 -0
  76. package/dist/{chunk-OGNE3OFT.js → chunk-NZXWU4R5.js} +24 -3
  77. package/dist/chunk-NZXWU4R5.js.map +1 -0
  78. package/dist/{chunk-V6GQKOX2.js → chunk-O3RCCSQJ.js} +6 -4
  79. package/dist/chunk-O3RCCSQJ.js.map +1 -0
  80. package/dist/{chunk-WVLMZ5SG.js → chunk-S4QRSBFI.js} +25 -3
  81. package/dist/chunk-S4QRSBFI.js.map +1 -0
  82. package/dist/{chunk-CK6P5AUK.js → chunk-UBH743HV.js} +10 -7
  83. package/dist/chunk-UBH743HV.js.map +1 -0
  84. package/dist/{chunk-T7DOWS6T.js → chunk-ULCDZTWL.js} +7 -4
  85. package/dist/chunk-ULCDZTWL.js.map +1 -0
  86. package/dist/{chunk-V6HCTCVD.js → chunk-UPZ6EEJN.js} +9 -5
  87. package/dist/chunk-UPZ6EEJN.js.map +1 -0
  88. package/dist/{chunk-CAB6NQ2T.js → chunk-VOCPXGQN.js} +3 -1
  89. package/dist/chunk-VOCPXGQN.js.map +1 -0
  90. package/dist/chunk-XD7DWYXG.js +34 -0
  91. package/dist/chunk-XD7DWYXG.js.map +1 -0
  92. package/dist/{chunk-B6JYRX3P.js → chunk-ZIYOJFZD.js} +43 -4
  93. package/dist/chunk-ZIYOJFZD.js.map +1 -0
  94. package/dist/{chunk-EYALJQQD.js → chunk-ZK5EGVFP.js} +4 -2
  95. package/dist/chunk-ZK5EGVFP.js.map +1 -0
  96. package/dist/{chunk-6WTETUZ6.js → chunk-ZLWQZUGF.js} +8 -2
  97. package/dist/chunk-ZLWQZUGF.js.map +1 -0
  98. package/dist/collapsible-panel.d.ts +4 -2
  99. package/dist/collapsible-panel.js +4 -2
  100. package/dist/collapsible-panel.js.map +1 -1
  101. package/dist/css-values.d.ts +39 -3
  102. package/dist/css-values.js +1 -1
  103. package/dist/disclosure-arrow.d.ts +3 -1
  104. package/dist/disclosure-arrow.js +1 -1
  105. package/dist/empty-state.d.ts +3 -1
  106. package/dist/empty-state.js +1 -1
  107. package/dist/floating-toolbar.d.ts +3 -1
  108. package/dist/floating-toolbar.js +1 -1
  109. package/dist/grid.d.ts +17 -1
  110. package/dist/grid.js +2 -1
  111. package/dist/index.d.ts +4 -3
  112. package/dist/index.js +34 -33
  113. package/dist/list-action-row.d.ts +3 -1
  114. package/dist/list-action-row.js +1 -1
  115. package/dist/list-header.d.ts +6 -1
  116. package/dist/list-header.js +2 -1
  117. package/dist/list-inset-control.d.ts +3 -1
  118. package/dist/list-inset-control.js +1 -1
  119. package/dist/list-inset-text.d.ts +3 -1
  120. package/dist/list-inset-text.js +1 -1
  121. package/dist/list-item.d.ts +3 -1
  122. package/dist/list-item.js +1 -1
  123. package/dist/list.d.ts +23 -2
  124. package/dist/list.js +2 -1
  125. package/dist/loading-spinner.d.ts +3 -1
  126. package/dist/loading-spinner.js +1 -1
  127. package/dist/lucide-icon.d.ts +3 -1
  128. package/dist/lucide-icon.js +1 -1
  129. package/dist/nav-stack.d.ts +3 -1
  130. package/dist/nav-stack.js +1 -1
  131. package/dist/pane.d.ts +19 -2
  132. package/dist/pane.js +1 -1
  133. package/dist/resizable-region.d.ts +5 -2
  134. package/dist/resizable-region.js +1 -1
  135. package/dist/row.d.ts +21 -1
  136. package/dist/row.js +2 -1
  137. package/dist/segmented-control.d.ts +3 -1
  138. package/dist/segmented-control.js +1 -1
  139. package/dist/select.d.ts +16 -4
  140. package/dist/select.js +1 -1
  141. package/dist/skeleton.d.ts +3 -1
  142. package/dist/skeleton.js +1 -1
  143. package/dist/spacer.d.ts +3 -1
  144. package/dist/spacer.js +1 -1
  145. package/dist/split-view.d.ts +3 -1
  146. package/dist/split-view.js +24 -5
  147. package/dist/split-view.js.map +1 -1
  148. package/dist/state-banner.d.ts +3 -1
  149. package/dist/state-banner.js +2 -1
  150. package/dist/styles/badge.css +86 -0
  151. package/dist/styles/catalog/components/catalog-detail.css +35 -0
  152. package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
  153. package/dist/styles/catalog/components/catalog-example.css +180 -0
  154. package/dist/styles/catalog/components/catalog-resource-footer.css +37 -0
  155. package/dist/styles/catalog/components/catalog-secondary-sections.css +38 -0
  156. package/dist/styles/catalog/components/catalog-section-list.css +22 -0
  157. package/dist/styles/catalog/components/catalog-sidebar.css +82 -0
  158. package/dist/styles/catalog/components/catalog-stage.css +60 -0
  159. package/dist/styles/catalog/components/catalog.css +22 -0
  160. package/dist/styles/catalog.css +10 -587
  161. package/dist/styles/collapsible-panel.css +132 -4
  162. package/dist/styles/document.css +23 -0
  163. package/dist/styles/foundation.css +21 -7
  164. package/dist/styles/grid.css +10 -0
  165. package/dist/styles/list-header.css +49 -60
  166. package/dist/styles/list-inset-control.css +8 -1
  167. package/dist/styles/list-item.css +6 -0
  168. package/dist/styles/list.css +11 -0
  169. package/dist/styles/nav-stack.css +89 -2
  170. package/dist/styles/pane.css +86 -1
  171. package/dist/styles/resizable-region.css +117 -5
  172. package/dist/styles/row.css +10 -0
  173. package/dist/styles/select.css +39 -7
  174. package/dist/styles/split-view.css +108 -2
  175. package/dist/styles/state-banner.css +0 -27
  176. package/dist/styles/styles.css +1 -0
  177. package/dist/styles/tab-bar.css +6 -1
  178. package/dist/styles/tab-scaffold.css +64 -1
  179. package/dist/styles/text.css +10 -0
  180. package/dist/styles/token-search-field.css +5 -40
  181. package/dist/styles/toolbar-control-group.css +198 -25
  182. package/dist/styles/toolbar-text.css +8 -1
  183. package/dist/styles/toolbar.css +169 -5
  184. package/dist/styles/webawesome.css +70 -9
  185. package/dist/styles/workbench.css +136 -4
  186. package/dist/sunken-panel.d.ts +3 -1
  187. package/dist/sunken-panel.js +1 -1
  188. package/dist/surface-scaffold.d.ts +6 -2
  189. package/dist/surface-scaffold.js +1 -1
  190. package/dist/tab-bar.d.ts +8 -1
  191. package/dist/tab-bar.js +1 -1
  192. package/dist/tab-scaffold.d.ts +3 -1
  193. package/dist/tab-scaffold.js +3 -1
  194. package/dist/tab-scaffold.js.map +1 -1
  195. package/dist/text.d.ts +9 -5
  196. package/dist/text.js +1 -1
  197. package/dist/token-search-field.d.ts +5 -1
  198. package/dist/token-search-field.js +1 -1
  199. package/dist/toolbar-control-group.d.ts +33 -3
  200. package/dist/toolbar-control-group.js +1 -1
  201. package/dist/toolbar-text.d.ts +3 -1
  202. package/dist/toolbar-text.js +1 -1
  203. package/dist/toolbar.d.ts +30 -1
  204. package/dist/toolbar.js +1 -1
  205. package/dist/types-CEsieBZi.d.ts +69 -0
  206. package/dist/value-table.d.ts +6 -2
  207. package/dist/value-table.js +1 -1
  208. package/dist/wire-resizable-regions.js +1 -1
  209. package/dist/wire-sidebar.d.ts +18 -3
  210. package/dist/wire-sidebar.js +95 -14
  211. package/dist/wire-sidebar.js.map +1 -1
  212. package/dist/wire-token-search-fields.js +1 -1
  213. package/dist/workbench.d.ts +3 -1
  214. package/dist/workbench.js +3 -1
  215. package/dist/workbench.js.map +1 -1
  216. package/docs/accessibility.md +56 -9
  217. package/docs/app-layouts.md +73 -0
  218. package/docs/catalog.md +48 -9
  219. package/docs/collapsible-panel.md +81 -8
  220. package/docs/component-contract.md +96 -28
  221. package/docs/component-integration.md +9 -4
  222. package/docs/component-selection.md +36 -15
  223. package/docs/design/templates/list/stack-dark.svg +1 -1
  224. package/docs/design/templates/list/stack.svg +1 -1
  225. package/docs/design/templates/list-dark.svg +1 -1
  226. package/docs/design/templates/list-header/action-dark.svg +1 -1
  227. package/docs/design/templates/list-header/action.svg +1 -1
  228. package/docs/design/templates/list-header/count-dark.svg +1 -1
  229. package/docs/design/templates/list-header/count.svg +1 -1
  230. package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
  231. package/docs/design/templates/list-header/inline-action.svg +1 -1
  232. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  233. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  234. package/docs/design/templates/list-header-dark.svg +1 -1
  235. package/docs/design/templates/list-header.svg +1 -1
  236. package/docs/design/templates/list.svg +1 -1
  237. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
  238. package/docs/design/templates/state-banner/info-badge.svg +1 -1
  239. package/docs/design/templates/state-banner-dark.svg +1 -1
  240. package/docs/design/templates/state-banner.svg +1 -1
  241. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  242. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  243. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  244. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  245. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  246. package/docs/design/templates/toolbar-control-group.svg +1 -1
  247. package/docs/design/templates/toolbar-dark.svg +1 -1
  248. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  249. package/docs/design/templates/toolbar-text/default.svg +1 -1
  250. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  251. package/docs/design/templates/toolbar-text/large.svg +1 -1
  252. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  253. package/docs/design/templates/toolbar-text/small.svg +1 -1
  254. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  255. package/docs/design/templates/toolbar-text.svg +1 -1
  256. package/docs/design/templates/toolbar.svg +1 -1
  257. package/docs/design-philosophy.md +6 -5
  258. package/docs/document-baseline.md +31 -0
  259. package/docs/layout.md +86 -21
  260. package/docs/nav-stack.md +8 -0
  261. package/docs/recipes.md +78 -43
  262. package/docs/split-view.md +8 -0
  263. package/docs/tab-scaffold.md +4 -2
  264. package/docs/type-contracts.md +21 -16
  265. package/docs/ui-analyzer.md +19 -0
  266. package/docs/ui-evaluator.md +17 -0
  267. package/docs/ux-demo.md +8 -8
  268. package/docs/webawesome-theme.md +25 -6
  269. package/docs/workbench.md +20 -1
  270. package/evaluator/index.mjs +73 -8
  271. package/llms.txt +61 -23
  272. package/package.json +12 -3
  273. package/ux-demo/recipes/app-shell.tsx +244 -184
  274. package/ux-demo/recipes/collapsible-sidebar.tsx +175 -116
  275. package/ux-demo/recipes/compact-toolbar.tsx +119 -102
  276. package/ux-demo/recipes/composer-form.tsx +79 -69
  277. package/ux-demo/recipes/list-detail-dialog.tsx +120 -136
  278. package/ux-demo/recipes/list-workspace-states.tsx +85 -79
  279. package/ux-demo/recipes/loaders.ts +5 -2
  280. package/ux-demo/recipes/loading-inspector.tsx +151 -134
  281. package/ux-demo/recipes/navigation-sidebar.tsx +93 -80
  282. package/ux-demo/recipes/navigation-stack.tsx +33 -22
  283. package/ux-demo/recipes/types.ts +14 -0
  284. package/ux-demo/recipes/workspace-header.tsx +73 -57
  285. package/dist/chunk-2TYUFZUC.js.map +0 -1
  286. package/dist/chunk-6NDBE2OK.js.map +0 -1
  287. package/dist/chunk-6WTETUZ6.js.map +0 -1
  288. package/dist/chunk-AQFWBG23.js.map +0 -1
  289. package/dist/chunk-B6JYRX3P.js.map +0 -1
  290. package/dist/chunk-CAB6NQ2T.js.map +0 -1
  291. package/dist/chunk-CK6P5AUK.js.map +0 -1
  292. package/dist/chunk-DAO2VFTT.js.map +0 -1
  293. package/dist/chunk-DYBPI5O2.js.map +0 -1
  294. package/dist/chunk-E34TE2ZI.js.map +0 -1
  295. package/dist/chunk-EYALJQQD.js.map +0 -1
  296. package/dist/chunk-GYGM363P.js.map +0 -1
  297. package/dist/chunk-I45QO2IZ.js.map +0 -1
  298. package/dist/chunk-I4V3UDSA.js.map +0 -1
  299. package/dist/chunk-IU4QUY5I.js.map +0 -1
  300. package/dist/chunk-OGNE3OFT.js.map +0 -1
  301. package/dist/chunk-OGTJNHRG.js.map +0 -1
  302. package/dist/chunk-OL4TC3U2.js.map +0 -1
  303. package/dist/chunk-OMSRSL3B.js.map +0 -1
  304. package/dist/chunk-SOK5EUF7.js.map +0 -1
  305. package/dist/chunk-T7DOWS6T.js.map +0 -1
  306. package/dist/chunk-TIGSG6BX.js.map +0 -1
  307. package/dist/chunk-UDHHKZWO.js.map +0 -1
  308. package/dist/chunk-V6GQKOX2.js.map +0 -1
  309. package/dist/chunk-V6HCTCVD.js.map +0 -1
  310. package/dist/chunk-VXFGMDA7.js.map +0 -1
  311. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  312. package/dist/chunk-WN52USHV.js +0 -115
  313. package/dist/chunk-WN52USHV.js.map +0 -1
  314. package/dist/chunk-WSXUPSID.js.map +0 -1
  315. package/dist/chunk-WVLMZ5SG.js.map +0 -1
  316. package/dist/chunk-XKFRMGMW.js.map +0 -1
  317. package/dist/chunk-Y6LYKFXY.js.map +0 -1
  318. package/dist/chunk-ZPWZIVI6.js.map +0 -1
  319. package/ux-demo/recipes/recipes.css +0 -453
@@ -1,6 +1,6 @@
1
1
  # Public API signatures for the UI authoring corpus
2
2
 
3
- Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.49` and `kerfjs@5.0.0-beta.49`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
3
+ Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.51` and `kerfjs@5.0.0-beta.51`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
4
4
 
5
5
  ## `@kerfjs/ui/css-values`
6
6
 
@@ -10,6 +10,7 @@ declare const cssLengthBrand: unique symbol;
10
10
  declare const cssLengthExpressionBrand: unique symbol;
11
11
  declare const cssFlexBrand: unique symbol;
12
12
  declare const cssColorBrand: unique symbol;
13
+ declare const cssForegroundColorBrand: unique symbol;
13
14
  /**
14
15
  * A complete typed CSS value minted by a property-specific Kerf UI builder.
15
16
  *
@@ -42,6 +43,18 @@ type CssFlex = CssValue & {
42
43
  type CssColor = CssValue & {
43
44
  readonly [cssColorBrand]: 'CssColor';
44
45
  };
46
+ /**
47
+ * A complete CSS color meant to paint a foreground: text or an icon drawn over
48
+ * a surface. Mint it with {@link uiColor} and a foreground token name
49
+ * ({@link UiForegroundColorName}) or with {@link foregroundColorVar}. It is a
50
+ * {@link CssColor}, but a plain `CssColor` is not a foreground color: fill,
51
+ * border, and surface tokens (including the `success` / `warning` / `danger` /
52
+ * `pop` fill aliases) are pale backgrounds that leave a foreground nearly
53
+ * invisible.
54
+ */
55
+ type CssForegroundColor = CssColor & {
56
+ readonly [cssForegroundColorBrand]: 'CssForegroundColor';
57
+ };
45
58
  type CssFlexKeyword = 'none' | 'auto' | 'initial';
46
59
  type CssFlexBasis = CssLength | 'auto' | 'content' | 'min-content' | 'max-content' | 'fit-content';
47
60
  type CssSizeKeyword = 'auto' | 'min-content' | 'max-content' | 'fit-content';
@@ -50,6 +63,13 @@ type CssSize = CssLength | CssSizeKeyword;
50
63
  declare const uiColorNames: readonly ["accent", "accent-text", "border", "border-quiet", "brand-border-loud", "brand-border-normal", "brand-border-quiet", "brand-fill-loud", "brand-fill-normal", "brand-fill-quiet", "brand-on-fill", "brand-on-loud", "brand-on-normal", "brand-on-quiet", "danger", "danger-border-loud", "danger-border-normal", "danger-border-quiet", "danger-fill-loud", "danger-fill-normal", "danger-fill-quiet", "danger-on-loud", "danger-on-normal", "danger-on-quiet", "danger-text", "neutral-border-loud", "neutral-border-normal", "neutral-border-quiet", "neutral-fill-loud", "neutral-fill-normal", "neutral-fill-quiet", "neutral-on-loud", "neutral-on-normal", "neutral-on-quiet", "pop", "pop-border-loud", "pop-border-normal", "pop-border-quiet", "pop-fill-loud", "pop-fill-normal", "pop-fill-quiet", "pop-on-fill", "pop-on-loud", "pop-on-normal", "pop-on-quiet", "pop-text", "success", "success-border-loud", "success-border-normal", "success-border-quiet", "success-fill-loud", "success-fill-normal", "success-fill-quiet", "success-on-fill", "success-on-loud", "success-on-normal", "success-on-quiet", "success-text", "surface", "surface-lowered", "surface-raised", "text", "text-link", "text-quiet", "warning", "warning-border-loud", "warning-border-normal", "warning-border-quiet", "warning-fill-loud", "warning-fill-normal", "warning-fill-quiet", "warning-on-fill", "warning-on-loud", "warning-on-normal", "warning-on-quiet", "warning-text"];
51
64
  /** Names of the public `--kui-color-*` semantic tokens. */
52
65
  type UiColorName = (typeof uiColorNames)[number];
66
+ /**
67
+ * The semantic tokens that paint a foreground: the `*-on-*` roles, the text
68
+ * roles, and their `*-text` compatibility aliases. The bare `success`,
69
+ * `warning`, `danger`, `pop`, and `accent` aliases are quiet fills, not
70
+ * foregrounds.
71
+ */
72
+ type UiForegroundColorName = Extract<UiColorName, `${string}-on-${string}` | `${string}-text` | 'text' | 'text-quiet' | 'text-link'>;
53
73
  /** Kerf UI's complete spacing-token vocabulary. `s` and `xl` are exceptions. */
54
74
  type UiSpaceName = 'none' | '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl';
55
75
  /** Create a complete pixel length. */
@@ -74,12 +94,28 @@ declare function plus(first: CssLength, second: CssLength, ...rest: readonly Css
74
94
  declare function calc(expression: CssLengthExpression): CssLength;
75
95
  /** Build a complete, structured CSS flex shorthand. */
76
96
  declare function flex(grow: number, shrink?: number, basis?: CssFlexBasis): CssFlex;
77
- /** Resolve a public Kerf UI semantic color token. */
78
- declare function uiColor(name: UiColorName): CssColor;
97
+ /**
98
+ * The brand {@link uiColor} returns for a token name: a
99
+ * {@link CssForegroundColor} for a foreground token, otherwise a plain
100
+ * {@link CssColor}.
101
+ */
102
+ type UiColor<Name extends UiColorName> = Name extends UiForegroundColorName ? CssForegroundColor : CssColor;
103
+ /**
104
+ * Resolve a public Kerf UI semantic color token. A foreground token name
105
+ * (`success-on-quiet`, `text-quiet`, …) returns a {@link CssForegroundColor};
106
+ * any other token returns a plain {@link CssColor}.
107
+ */
108
+ declare function uiColor<Name extends UiColorName>(name: Name): UiColor<Name>;
79
109
  /** Reference an application-owned custom property whose contract is a color. */
80
110
  declare function colorVar(name: `--${string}`, fallback?: CssColor): CssColor;
111
+ /**
112
+ * Reference an application-owned custom property whose contract is a
113
+ * foreground color (text or an icon over a surface). Use it where a prop
114
+ * accepts only {@link CssForegroundColor}, such as `SelectChoice.color`.
115
+ */
116
+ declare function foregroundColorVar(name: `--${string}`, fallback?: CssForegroundColor): CssForegroundColor;
81
117
 
82
- export { type CssColor, type CssFlex, type CssFlexBasis, type CssFlexKeyword, type CssLength, type CssLengthExpression, type CssSize, type CssSizeKeyword, type CssValue, type UiColorName, type UiSpaceName, calc, colorVar, em, flex, lengthVar, pct, plus, px, rem, space, uiColor };
118
+ export { type CssColor, type CssFlex, type CssFlexBasis, type CssFlexKeyword, type CssForegroundColor, type CssLength, type CssLengthExpression, type CssSize, type CssSizeKeyword, type CssValue, type UiColor, type UiColorName, type UiForegroundColorName, type UiSpaceName, calc, colorVar, em, flex, foregroundColorVar, lengthVar, pct, plus, px, rem, space, uiColor };
83
119
  ```
84
120
 
85
121
  ## `@kerfjs/ui/disclosure-arrow`
@@ -95,8 +131,10 @@ interface DisclosureArrowProps {
95
131
  /** Replacement icons should use right as their unrotated orientation. */
96
132
  icon?: SafeHtml;
97
133
  className?: string;
134
+ /** Native named-slot assignment when composed inside a web component. */
135
+ slot?: string;
98
136
  }
99
- declare function DisclosureArrow({ open, openDirection, closedDirection, icon, className, }: DisclosureArrowProps): SafeHtml;
137
+ declare function DisclosureArrow({ open, openDirection, closedDirection, icon, className, slot, }: DisclosureArrowProps): SafeHtml;
100
138
 
101
139
  export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
102
140
  ```
@@ -106,6 +144,7 @@ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
106
144
  ```ts
107
145
  import * as kerfjs from 'kerfjs';
108
146
  import { D as DividerSides } from './divider-sides-BzB6rphT.js';
147
+ import { PaneSeparatorSide } from './pane.js';
109
148
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
110
149
 
111
150
  interface ToolbarProps {
@@ -115,9 +154,37 @@ interface ToolbarProps {
115
154
  label?: string;
116
155
  /** Physical divider edges in canonical top/right/bottom/left order. Defaults to bottom. */
117
156
  dividerSides?: DividerSides;
157
+ /** Horizontal treatment of the center zone. Defaults to centered content. */
158
+ centerAlign?: 'center' | 'stretch';
159
+ /**
160
+ * Component-owned responsive layout; applications choose the policy rather
161
+ * than restyling toolbar internals. Under every policy the trailing zone
162
+ * wraps its groups instead of clipping an action.
163
+ * - `none` keeps one row; the leading identity truncates first.
164
+ * - `stack` stacks the zones at `responsiveAt`, wrapping stacked control
165
+ * groups onto further rows.
166
+ * - `wrap` keeps one row while every zone fits at its natural width, and
167
+ * otherwise moves the trailing zone below a whole leading identity.
168
+ * - `center-priority` gives an expanded center control the full row.
169
+ */
170
+ responsive?: 'none' | 'stack' | 'wrap' | 'center-priority';
171
+ /** Container width at which `responsive="stack"` activates. */
172
+ responsiveAt?: 'compact' | 'narrow';
173
+ /**
174
+ * Screen edges this toolbar claims for device safe-area compensation, for an
175
+ * app bar or bottom bar that sits directly at a screen edge rather than in a
176
+ * Pane header or footer. Each listed side pads by the inset its surrounding
177
+ * layout reports through `--kui-edge-inset-*`, or the full device inset when
178
+ * nothing routes that edge, while the toolbar's box and dividers paint
179
+ * through. Omitted, the toolbar pads only the inline edges an owner such as
180
+ * a Pane header hands it, and never a block edge.
181
+ */
182
+ safeAreaEdges?: readonly PaneSeparatorSide[];
118
183
  className?: string;
184
+ /** Native named-slot assignment when composed inside a web component. */
185
+ slot?: string;
119
186
  }
120
- declare function Toolbar({ leading, center, trailing, label, dividerSides, className, }: ToolbarProps): kerfjs.SafeHtml;
187
+ declare function Toolbar({ leading, center, trailing, label, dividerSides, centerAlign, responsive, responsiveAt, safeAreaEdges, className, slot, }: ToolbarProps): kerfjs.SafeHtml;
121
188
 
122
189
  export { DividerSides, Toolbar, type ToolbarProps };
123
190
  ```
@@ -150,6 +217,8 @@ interface ToolbarTextBaseProps {
150
217
  * instead. Default true.
151
218
  */
152
219
  ellipsis?: boolean;
220
+ /** Native named-slot assignment when composed inside a web component. */
221
+ slot?: string;
153
222
  }
154
223
  type ToolbarTextWrappingProps = {
155
224
  /** Wrap onto multiple lines; combine with `maxLines` to cap them. */
@@ -160,7 +229,7 @@ type ToolbarTextWrappingProps = {
160
229
  maxLines?: never;
161
230
  };
162
231
  type ToolbarTextProps = ToolbarTextBaseProps & ToolbarTextWrappingProps;
163
- declare function ToolbarText({ text, size, className, id, headingLevel, placeholder, wrap, ellipsis, maxLines, }: ToolbarTextProps): kerfjs.SafeHtml;
232
+ declare function ToolbarText({ text, size, className, id, headingLevel, placeholder, wrap, ellipsis, maxLines, slot, }: ToolbarTextProps): kerfjs.SafeHtml;
164
233
 
165
234
  export { type HeadingLevel, ToolbarText, type ToolbarTextProps, type ToolbarTextSize };
166
235
  ```
@@ -177,9 +246,29 @@ type ToolbarControlGroupButtonAppearance = 'plain' | 'push';
177
246
  type ToolbarControlGroupShape = 'pill' | 'rounded';
178
247
  type ToolbarControlGroupSize = 'default' | 'compact';
179
248
  type ToolbarControlGroupDensity = 'comfortable' | 'tight';
180
- type ToolbarControlGroupContent = 'icon' | 'text' | 'mixed' | 'avatar';
249
+ type ToolbarControlGroupContent = 'icon' | 'text' | 'mixed' | 'avatar' | 'search';
250
+ type ToolbarControlGroupFocusRing = 'control' | 'outline' | 'halo';
181
251
  type ToolbarControlGroupSelectedChrome = 'raised' | 'filled' | 'outline';
182
252
  type ToolbarControlGroupSelectedTone = 'brand' | 'neutral' | 'pop';
253
+ type ToolbarControlGroupOverflow = 'visible' | 'scroll';
254
+ type ToolbarControlGroupMenuInset = 'standard' | 'compact' | 'list-zero';
255
+ type ToolbarControlGroupVisibility = 'always' | 'compact-only';
256
+ interface ToolbarActionLinkProps {
257
+ href: string;
258
+ label: string;
259
+ icon?: KerfUiContent;
260
+ /** Optional machine-readable detail hidden visually but included in the default accessible name. */
261
+ detail?: string;
262
+ /** Override the accessible name when surrounding context is needed. */
263
+ ariaLabel?: string;
264
+ /** Open in a new tab with a safe rel and announce that behavior. */
265
+ external?: boolean;
266
+ className?: string;
267
+ /** Native named-slot assignment when composed inside a web component. */
268
+ slot?: string;
269
+ }
270
+ /** A semantic anchor with ToolbarControlGroup-owned action geometry. */
271
+ declare function ToolbarActionLink({ href, label, icon, detail, ariaLabel, external, className, slot, }: ToolbarActionLinkProps): kerfjs.SafeHtml;
183
272
  interface ToolbarControlGroupProps {
184
273
  children: KerfUiContent;
185
274
  label?: string;
@@ -194,10 +283,18 @@ interface ToolbarControlGroupProps {
194
283
  size?: ToolbarControlGroupSize;
195
284
  density?: ToolbarControlGroupDensity;
196
285
  content?: ToolbarControlGroupContent;
286
+ /** Whether controls paint focus individually or the group paints an outline/halo on focus-within. */
287
+ focusRing?: ToolbarControlGroupFocusRing;
197
288
  selectedChrome?: ToolbarControlGroupSelectedChrome;
198
289
  selectedTone?: ToolbarControlGroupSelectedTone;
199
290
  /** Size a nested Web Awesome dropdown trigger as part of this group. */
200
291
  nestedDropdown?: boolean;
292
+ /** Configure the nested dropdown menu inset without consumer ::part() CSS. */
293
+ menuInset?: ToolbarControlGroupMenuInset;
294
+ /** Keep an overlong row of actions inside the available width with horizontal scrolling. */
295
+ overflow?: ToolbarControlGroupOverflow;
296
+ /** Responsive visibility owned by the enclosing Toolbar container. */
297
+ visibility?: ToolbarControlGroupVisibility;
201
298
  /** Add contrast behind photo-backed avatar content. */
202
299
  scrim?: boolean;
203
300
  /**
@@ -205,10 +302,12 @@ interface ToolbarControlGroupProps {
205
302
  * multi-control group paints it only on the pressed selection highlight.
206
303
  */
207
304
  avatarImage?: string;
305
+ /** Native named-slot assignment when composed inside a web component. */
306
+ slot?: string;
208
307
  }
209
- declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, size, density, content, selectedChrome, selectedTone, nestedDropdown, scrim, avatarImage, }: ToolbarControlGroupProps): kerfjs.SafeHtml;
308
+ declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, size, density, content, focusRing, selectedChrome, selectedTone, nestedDropdown, menuInset, overflow, visibility, scrim, avatarImage, slot, }: ToolbarControlGroupProps): kerfjs.SafeHtml;
210
309
 
211
- export { ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupContent, type ToolbarControlGroupDensity, type ToolbarControlGroupProps, type ToolbarControlGroupSelectedChrome, type ToolbarControlGroupSelectedTone, type ToolbarControlGroupShape, type ToolbarControlGroupSize, type ToolbarControlGroupTone };
310
+ export { ToolbarActionLink, type ToolbarActionLinkProps, ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupContent, type ToolbarControlGroupDensity, type ToolbarControlGroupFocusRing, type ToolbarControlGroupMenuInset, type ToolbarControlGroupOverflow, type ToolbarControlGroupProps, type ToolbarControlGroupSelectedChrome, type ToolbarControlGroupSelectedTone, type ToolbarControlGroupShape, type ToolbarControlGroupSize, type ToolbarControlGroupTone, type ToolbarControlGroupVisibility };
212
311
  ```
213
312
 
214
313
  ## `@kerfjs/ui/floating-toolbar`
@@ -230,6 +329,8 @@ interface FloatingToolbarProps {
230
329
  */
231
330
  position?: FloatingToolbarPosition;
232
331
  className?: string;
332
+ /** Native named-slot assignment when composed inside a web component. */
333
+ slot?: string;
233
334
  }
234
335
  /**
235
336
  * A toolbar that floats above the main content of its nearest positioned
@@ -240,7 +341,7 @@ interface FloatingToolbarProps {
240
341
  * top toolbar's own inset); override that token to move it. The app owns the
241
342
  * controls and their behavior — wire them with `delegate()` as usual.
242
343
  */
243
- declare function FloatingToolbar({ children, label, position, className, }: FloatingToolbarProps): kerfjs.SafeHtml;
344
+ declare function FloatingToolbar({ children, label, position, className, slot, }: FloatingToolbarProps): kerfjs.SafeHtml;
244
345
 
245
346
  export { FloatingToolbar, type FloatingToolbarPosition, type FloatingToolbarProps };
246
347
  ```
@@ -258,6 +359,7 @@ type ListHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undef
258
359
  'data-density'?: never;
259
360
  'data-divider'?: never;
260
361
  'data-inline'?: never;
362
+ 'data-width'?: never;
261
363
  'data-indicator-tone'?: never;
262
364
  'data-toggle'?: never;
263
365
  }>;
@@ -274,11 +376,15 @@ interface ListHeaderBaseProps {
274
376
  divider?: 'none' | 'before' | 'after' | 'both';
275
377
  /** Shrink-wrap the header without its default outer margin, border, or padding. */
276
378
  inline?: boolean;
379
+ /** Fill the available row or shrink-wrap while retaining normal header geometry. */
380
+ width?: 'fill' | 'content';
277
381
  indicatorTone?: 'neutral' | 'accent' | 'pop' | 'danger';
278
382
  /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */
279
383
  placeholder?: boolean;
280
384
  rootAttributes?: ListHeaderRootAttributes;
281
385
  triggerAttributes?: ListHeaderTriggerAttributes;
386
+ /** Native named-slot assignment when composed inside a web component. */
387
+ slot?: string;
282
388
  }
283
389
  type ListHeaderModeProps = {
284
390
  /** Render the title as a controlled disclosure trigger. */
@@ -325,7 +431,7 @@ type ListHeaderIndicatorProps = {
325
431
  status?: SafeHtml;
326
432
  };
327
433
  type ListHeaderProps = ListHeaderBaseProps & ListHeaderIndicatorProps & ListHeaderModeProps;
328
- declare function ListHeader({ label, count, countLabel, badge, status, density, divider, inline, indicatorTone, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, }: ListHeaderProps): SafeHtml;
434
+ declare function ListHeader({ label, count, countLabel, badge, status, density, divider, inline, width, indicatorTone, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, slot, }: ListHeaderProps): SafeHtml;
329
435
 
330
436
  export { ListHeader, type ListHeaderProps };
331
437
  ```
@@ -340,12 +446,29 @@ import { H as HorizontalAlignment, L as ListVerticalAlignment } from './flex-ali
340
446
  export { V as VerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
341
447
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
342
448
 
449
+ type ListRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
450
+ 'data-component'?: never;
451
+ 'data-gap'?: never;
452
+ 'data-flex'?: never;
453
+ 'data-fill'?: never;
454
+ 'data-h-align'?: never;
455
+ 'data-v-align'?: never;
456
+ 'data-scrollable'?: never;
457
+ 'data-text-insets'?: never;
458
+ 'data-control-insets'?: never;
459
+ }>;
343
460
  interface ListProps {
344
461
  children?: KerfUiContent;
345
462
  /** Use the standard item gap, a named UI spacing token, or a typed CSS length. Defaults to no gap. */
346
463
  gap?: boolean | UiSpaceName | CssLength;
347
464
  /** Allow this list to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */
348
465
  flex?: boolean | CssFlexKeyword | CssFlex;
466
+ /**
467
+ * Fill the height of a parent with a definite height, such as an app root or
468
+ * a fixed-height frame, when this list is that parent's layout root. Inside a
469
+ * flex layout use `flex` instead. Defaults to false.
470
+ */
471
+ fill?: boolean;
349
472
  /** Horizontal alignment. Defaults to full to preserve stretch-aligned list children. */
350
473
  hAlign?: HorizontalAlignment;
351
474
  /** Vertical distribution. Defaults to top. */
@@ -359,9 +482,13 @@ interface ListProps {
359
482
  /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */
360
483
  controlInsets?: Sides;
361
484
  className?: string;
485
+ /** Safe `data-*` metadata; List-owned structural attributes remain protected. */
486
+ rootAttributes?: ListRootAttributes;
487
+ /** Native named-slot assignment when composed inside a web component. */
488
+ slot?: string;
362
489
  }
363
- /** A stretch-aligned vertical stack with optional gap, flex, scroll, and dividers. */
364
- declare function List({ children, gap, flex, hAlign, vAlign, scrollable, dividerSides, textInsets, controlInsets, className, }: ListProps): kerfjs.SafeHtml;
490
+ /** A stretch-aligned vertical stack with optional gap, flex, fill, scroll, and dividers. */
491
+ declare function List({ children, gap, flex, fill, hAlign, vAlign, scrollable, dividerSides, textInsets, controlInsets, className, rootAttributes, slot, }: ListProps): kerfjs.SafeHtml;
365
492
 
366
493
  export { CssFlex, CssFlexKeyword, CssLength, DividerSides, HorizontalAlignment, List, type ListProps, ListVerticalAlignment, Sides, UiSpaceName };
367
494
  ```
@@ -426,8 +553,10 @@ interface ListActionRowProps {
426
553
  className?: string;
427
554
  rootAttributes?: ListActionRowRootAttributes;
428
555
  trailingActionAttributes?: ListActionRowTrailingAttributes;
556
+ /** Native named-slot assignment when composed inside a web component. */
557
+ slot?: string;
429
558
  }
430
- declare function ListActionRow({ label, description, status, busy, density, divider, icon, action, itemId, selected, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, trailingAction, trailingActionLabel, trailingActionIcon, trailingActionDisabled, trailingActionTitle, trailingActionVisibility, className, rootAttributes, trailingActionAttributes, }: ListActionRowProps): SafeHtml;
559
+ declare function ListActionRow({ label, description, status, busy, density, divider, icon, action, itemId, selected, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, trailingAction, trailingActionLabel, trailingActionIcon, trailingActionDisabled, trailingActionTitle, trailingActionVisibility, className, rootAttributes, trailingActionAttributes, slot, }: ListActionRowProps): SafeHtml;
431
560
 
432
561
  export { ListActionRow, type ListActionRowProps };
433
562
  ```
@@ -476,8 +605,10 @@ interface ListItemProps {
476
605
  /** Render the row as an unanimated loading skeleton, disabling its action. */
477
606
  placeholder?: boolean;
478
607
  rootAttributes?: ListItemRootAttributes;
608
+ /** Native named-slot assignment when composed inside a web component. */
609
+ slot?: string;
479
610
  }
480
- declare function ListItem({ label, description, icon, trailing, status, busy, density, divider, selected, action, itemId, className, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, rootAttributes, }: ListItemProps): SafeHtml;
611
+ declare function ListItem({ label, description, icon, trailing, status, busy, density, divider, selected, action, itemId, className, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, rootAttributes, slot, }: ListItemProps): SafeHtml;
481
612
 
482
613
  export { ListItem, type ListItemProps };
483
614
  ```
@@ -495,6 +626,8 @@ interface ListInsetControlProps {
495
626
  /** Physical inset sides in canonical top/right/bottom/left order. Defaults to all sides. */
496
627
  sides?: Sides;
497
628
  className?: string;
629
+ /** Native named-slot assignment when composed inside a web component. */
630
+ slot?: string;
498
631
  }
499
632
  /**
500
633
  * Insets a control into a pane/list content region: an 8px inline margin (so its
@@ -502,7 +635,7 @@ interface ListInsetControlProps {
502
635
  * Use it for controls that carry their own border and padding but no outer margin
503
636
  * — the wrapper adds only the alignment margin and layout, not a second inset.
504
637
  */
505
- declare function ListInsetControl({ children, sides, className, }: ListInsetControlProps): kerfjs.SafeHtml;
638
+ declare function ListInsetControl({ children, sides, className, slot, }: ListInsetControlProps): kerfjs.SafeHtml;
506
639
 
507
640
  export { ListInsetControl, type ListInsetControlProps, Sides };
508
641
  ```
@@ -527,6 +660,8 @@ interface ListInsetTextProps {
527
660
  */
528
661
  horizontalOnly?: boolean;
529
662
  className?: string;
663
+ /** Native named-slot assignment when composed inside a web component. */
664
+ slot?: string;
530
665
  }
531
666
  /**
532
667
  * Gives bare text the content-item geometry — an 8px inline margin, a 1px
@@ -536,7 +671,7 @@ interface ListInsetTextProps {
536
671
  * Pass `horizontalOnly` to keep the horizontal inset but drop the vertical box
537
672
  * space for tight text layout.
538
673
  */
539
- declare function ListInsetText({ children, sides, horizontalOnly, className, }: ListInsetTextProps): kerfjs.SafeHtml;
674
+ declare function ListInsetText({ children, sides, horizontalOnly, className, slot, }: ListInsetTextProps): kerfjs.SafeHtml;
540
675
 
541
676
  export { ListInsetText, type ListInsetTextProps, Sides };
542
677
  ```
@@ -555,15 +690,19 @@ interface ValueTableRowProps {
555
690
  className?: string;
556
691
  /** Render the value as an unanimated loading skeleton, keeping the field label. */
557
692
  placeholder?: boolean;
693
+ /** Native named-slot assignment when composed inside a web component. */
694
+ slot?: string;
558
695
  }
559
- declare function ValueTableRow({ label, value, icon, className, placeholder, }: ValueTableRowProps): SafeHtml;
696
+ declare function ValueTableRow({ label, value, icon, className, placeholder, slot, }: ValueTableRowProps): SafeHtml;
560
697
 
561
698
  interface ValueTableProps {
562
699
  label: string;
563
700
  className?: string;
564
701
  children: KerfUiContent;
702
+ /** Native named-slot assignment when composed inside a web component. */
703
+ slot?: string;
565
704
  }
566
- declare function ValueTable({ label, className, children, }: ValueTableProps): kerfjs.SafeHtml;
705
+ declare function ValueTable({ label, className, children, slot, }: ValueTableProps): kerfjs.SafeHtml;
567
706
 
568
707
  export { ValueTable, type ValueTableProps, ValueTableRow, type ValueTableRowProps };
569
708
  ```
@@ -606,8 +745,10 @@ interface AppTabProps {
606
745
  /** Render as an unanimated loading skeleton, disabling select/close and dragging. */
607
746
  placeholder?: boolean;
608
747
  rootAttributes?: AppTabRootAttributes;
748
+ /** Native named-slot assignment when composed inside a web component. */
749
+ slot?: string;
609
750
  }
610
- declare function AppTab({ id, name, selected, closable, draggable, leading, trailing, presentation, size, labelMaxWidth, closeIcon, selectAction, closeAction, className, placeholder, rootAttributes, }: AppTabProps): SafeHtml;
751
+ declare function AppTab({ id, name, selected, closable, draggable, leading, trailing, presentation, size, labelMaxWidth, closeIcon, selectAction, closeAction, className, placeholder, rootAttributes, slot, }: AppTabProps): SafeHtml;
611
752
 
612
753
  export { AppTab, type AppTabPresentation, type AppTabProps, type AppTabSize };
613
754
  ```
@@ -628,6 +769,11 @@ interface TabBarProps {
628
769
  children: KerfUiContent;
629
770
  leading?: KerfUiContent;
630
771
  trailing?: KerfUiContent;
772
+ /**
773
+ * Action pinned to the far edge of the bar. Combine with an adjacent `trailing`
774
+ * action when the tab-local and workspace-level actions must remain distinct.
775
+ */
776
+ end?: KerfUiContent;
631
777
  className?: string;
632
778
  /**
633
779
  * Keyboard activation mode for this strip, emitted as `data-tab-activation` for
@@ -642,9 +788,11 @@ interface TabBarProps {
642
788
  presentation?: TabBarPresentation;
643
789
  /** Keep a trailing action beside the final tab or at the far edge of the bar. */
644
790
  trailingPlacement?: TabBarTrailingPlacement;
791
+ /** Native named-slot assignment when composed inside a web component. */
792
+ slot?: string;
645
793
  }
646
794
  /** Render a controlled tab strip. The application owns selection, order, and persistence. */
647
- declare function TabBar({ id, label, children, leading, trailing, className, activation, allocation, presentation, trailingPlacement, }: TabBarProps): kerfjs.SafeHtml;
795
+ declare function TabBar({ id, label, children, leading, trailing, end, className, activation, allocation, presentation, trailingPlacement, slot, }: TabBarProps): kerfjs.SafeHtml;
648
796
 
649
797
  export { type TabActivation, TabBar, type TabBarAllocation, type TabBarPresentation, type TabBarProps, type TabBarTrailingPlacement };
650
798
  ```
@@ -722,6 +870,8 @@ interface NavStackProps {
722
870
  /** Optional persistent bottom toolbar used when the active view does not provide one. */
723
871
  bottomToolbar?: KerfUiContent;
724
872
  className?: string;
873
+ /** Native named-slot assignment when composed inside a web component. */
874
+ slot?: string;
725
875
  }
726
876
  /**
727
877
  * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last
@@ -729,7 +879,7 @@ interface NavStackProps {
729
879
  * cross-fades the chrome across a change. A single-pane layout is a `NavStack`
730
880
  * with one entry. See `docs/23-app-layouts.md` §3.1.
731
881
  */
732
- declare function NavStack({ id, label, views, backLabel, hideToolbar, bottomToolbar, className, }: NavStackProps): kerfjs.SafeHtml;
882
+ declare function NavStack({ id, label, views, backLabel, hideToolbar, bottomToolbar, className, slot, }: NavStackProps): kerfjs.SafeHtml;
733
883
 
734
884
  export { NavStack, type NavStackProps, type NavStackView };
735
885
  ```
@@ -792,6 +942,8 @@ interface SplitViewProps {
792
942
  /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */
793
943
  resizable?: SplitViewResizable;
794
944
  className?: string;
945
+ /** Native named-slot assignment when composed inside a web component. */
946
+ slot?: string;
795
947
  }
796
948
  /**
797
949
  * A list-detail split. On roomy classes it shows both panes side
@@ -800,7 +952,7 @@ interface SplitViewProps {
800
952
  * resizable wiring with `wireResizableRegions` and the compact back with
801
953
  * `wireNavStack`.
802
954
  */
803
- declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, }: SplitViewProps): kerfjs.SafeHtml;
955
+ declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, slot, }: SplitViewProps): kerfjs.SafeHtml;
804
956
 
805
957
  export { SplitView, type SplitViewProps, type SplitViewResizable };
806
958
  ```
@@ -811,7 +963,10 @@ export { SplitView, type SplitViewProps, type SplitViewResizable };
811
963
  import * as kerfjs from 'kerfjs';
812
964
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
813
965
 
814
- /** Logical sides that can show a {@link Pane} separator. */
966
+ /**
967
+ * Logical pane sides: where a {@link Pane} can show a separator and where it can
968
+ * compensate for a device safe-area inset.
969
+ */
815
970
  type PaneSeparatorSide = 'block-start' | 'block-end' | 'inline-start' | 'inline-end';
816
971
  /** Semantic root elements supported by {@link Pane}. */
817
972
  type PaneElement = 'article' | 'aside' | 'div' | 'main' | 'section';
@@ -823,6 +978,10 @@ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
823
978
  'data-separator-block-end'?: never;
824
979
  'data-separator-inline-start'?: never;
825
980
  'data-separator-inline-end'?: never;
981
+ 'data-safe-area-block-start'?: never;
982
+ 'data-safe-area-block-end'?: never;
983
+ 'data-safe-area-inline-start'?: never;
984
+ 'data-safe-area-inline-end'?: never;
826
985
  }>;
827
986
  interface PaneProps {
828
987
  /** Optional fixed chrome above the scrolling content, arranged vertically. */
@@ -837,6 +996,14 @@ interface PaneProps {
837
996
  contentElement?: PaneContentElement;
838
997
  /** Independent logical-edge separator lines. Defaults to none. */
839
998
  separators?: readonly PaneSeparatorSide[];
999
+ /**
1000
+ * Sides on which the pane may compensate for a device safe-area inset.
1001
+ * Defaults to every side: the pane pads its slots for each side that still
1002
+ * reaches an unsafe screen edge, as its surrounding layout reports, while its
1003
+ * background and separators paint through. List only the sides an app-owned
1004
+ * layout places at a screen edge, or pass `[]` to opt out.
1005
+ */
1006
+ safeAreaEdges?: readonly PaneSeparatorSide[];
840
1007
  id?: string;
841
1008
  /** Accessible name for a landmark root such as `aside` or `main`. */
842
1009
  label?: string;
@@ -848,6 +1015,8 @@ interface PaneProps {
848
1015
  footerClassName?: string;
849
1016
  /** Safe `data-*` metadata; Pane-owned structural attributes remain protected. */
850
1017
  rootAttributes?: PaneRootAttributes;
1018
+ /** Native named-slot assignment when composed inside a web component. */
1019
+ slot?: string;
851
1020
  }
852
1021
  /**
853
1022
  * An unpadded application column with optional fixed header/footer slots and one
@@ -855,7 +1024,7 @@ interface PaneProps {
855
1024
  * each logical edge, so the same component works as a sidebar, main area,
856
1025
  * inspector, or dialog column.
857
1026
  */
858
- declare function Pane({ header, children, footer, element, contentElement, separators, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, }: PaneProps): kerfjs.SafeHtml;
1027
+ declare function Pane({ header, children, footer, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
859
1028
 
860
1029
  export { Pane, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
861
1030
  ```
@@ -893,6 +1062,8 @@ interface WorkbenchProps {
893
1062
  rightRail?: WorkbenchPanel;
894
1063
  bottomDrawer?: WorkbenchPanel;
895
1064
  className?: string;
1065
+ /** Native named-slot assignment when composed inside a web component. */
1066
+ slot?: string;
896
1067
  }
897
1068
  /**
898
1069
  * The Xcode-like multi-panel workspace: a collapsible left rail, right rail, and
@@ -904,7 +1075,7 @@ interface WorkbenchProps {
904
1075
  * each `collapsed` flag; the collapse is pure CSS (no wire). See
905
1076
  * `docs/23-app-layouts.md` §3.3.
906
1077
  */
907
- declare function Workbench({ id, label, main, leftRail, rightRail, bottomDrawer, className, }: WorkbenchProps): SafeHtml;
1078
+ declare function Workbench({ id, label, main, leftRail, rightRail, bottomDrawer, className, slot, }: WorkbenchProps): SafeHtml;
908
1079
 
909
1080
  export { Workbench, type WorkbenchPanel, type WorkbenchProps };
910
1081
  ```
@@ -943,6 +1114,8 @@ interface CollapsiblePanelToggleProps {
943
1114
  /** Accessible label; defaults to "Collapse"/"Expand". */
944
1115
  label?: string;
945
1116
  className?: string;
1117
+ /** Native named-slot assignment when composed inside a web component. */
1118
+ slot?: string;
946
1119
  }
947
1120
  /**
948
1121
  * A standard collapse/expand toggle button for a {@link CollapsiblePanel}: the
@@ -951,7 +1124,7 @@ interface CollapsiblePanelToggleProps {
951
1124
  * put it in the panel's own header (to collapse) and somewhere always-visible
952
1125
  * (to expand while collapsed).
953
1126
  */
954
- declare function CollapsiblePanelToggle({ side, collapsed, action, panelId, label, className, }: CollapsiblePanelToggleProps): SafeHtml;
1127
+ declare function CollapsiblePanelToggle({ side, collapsed, action, panelId, label, className, slot, }: CollapsiblePanelToggleProps): SafeHtml;
955
1128
  interface CollapsiblePanelProps {
956
1129
  /** A stable id for the panel — `wireSidebar` targets it and toggles reference it. */
957
1130
  id: string;
@@ -984,7 +1157,7 @@ interface CollapsiblePanelProps {
984
1157
  * underneath the transform transition. The app owns the `collapsed` signal;
985
1158
  * pair it with `wireSidebar` for the toggle, focus, compact-overlay, keyboard,
986
1159
  * and persistence semantics, and with `CollapsiblePanelToggle` for the standard
987
- * affordance. See `docs/24-collapsible-panel.md`.
1160
+ * affordance. See `ui/docs/collapsible-panel.md` and `docs/23-app-layouts.md`.
988
1161
  */
989
1162
  declare function CollapsiblePanel({ id, side, collapsed, size, label, children, separator, collapseMotion, contentOverflow, presentation, restoreControl, restorePosition, className, }: CollapsiblePanelProps): SafeHtml;
990
1163
 
@@ -1010,9 +1183,18 @@ interface WireSidebarPanel {
1010
1183
  collapsed: Signal<boolean>;
1011
1184
  /** `data-action` value the panel's toggle button(s) carry. */
1012
1185
  toggleAction: string;
1013
- /** When set, the collapsed state is loaded from and saved to `storage` under
1014
- * this key (a persistence hook), so the panel remembers its state. */
1186
+ /** When set, the panel's inline collapsed state is loaded from and saved to
1187
+ * `storage` under this key (a persistence hook), so the panel remembers the
1188
+ * user's inline choice. A compact overlay's open/closed state is transient
1189
+ * and is never persisted. */
1015
1190
  storageKey?: string;
1191
+ /** The panel's inline (non-compact) collapsed state when `storage` holds no
1192
+ * choice for it; wire-up seeds the signal with it. Defaults to the signal's
1193
+ * own value. Set it when the app seeds the signal from the device class
1194
+ * (`signal(device.value.compact)`) so a compact first render already starts
1195
+ * collapsed while a later crossing to a wide class still restores this
1196
+ * inline default. */
1197
+ inlineCollapsed?: boolean;
1016
1198
  }
1017
1199
  interface WireSidebarOptions {
1018
1200
  panels: readonly WireSidebarPanel[];
@@ -1022,6 +1204,12 @@ interface WireSidebarOptions {
1022
1204
  * dismissable backdrop, Escape and backdrop-click collapse it, and focus is
1023
1205
  * trapped within the open panel (the ARIA dialog pattern). Without it the panel
1024
1206
  * is always inline.
1207
+ *
1208
+ * An overlay is transient and user-initiated: whenever the compact overlay
1209
+ * presentation begins (wire-up on a compact device, or a crossing from a wide
1210
+ * class), every panel starts collapsed so nothing blocks the page until the
1211
+ * user opens it. The inline state is remembered and restored when the device
1212
+ * crosses back to a wide class (and on disposal).
1025
1213
  */
1026
1214
  deviceClass?: ReadonlySignal<DeviceClass>;
1027
1215
  /** Compact devices either overlay the panels (default) or hide them in favor
@@ -1037,7 +1225,7 @@ interface WireSidebarOptions {
1037
1225
  * delegation with focus restore, focus-into on open, an optional compact overlay
1038
1226
  * (backdrop + Escape + focus trap) driven by {@link deviceClass}, and an optional
1039
1227
  * persistence hook. The app owns each `collapsed` signal and the layout; this wire
1040
- * owns the interaction. Returns a disposer. See `docs/24-collapsible-panel.md`.
1228
+ * owns the interaction. Returns a disposer. See `ui/docs/collapsible-panel.md` and `docs/23-app-layouts.md`.
1041
1229
  */
1042
1230
  declare function wireSidebar(root: HTMLElement, { panels, deviceClass, compactPresentation, exclusiveCompact, storage, }: WireSidebarOptions): () => void;
1043
1231
 
@@ -1066,6 +1254,8 @@ interface TabScaffoldProps<Id extends string = string> {
1066
1254
  /** The controlled active tab id (the app owns selection). */
1067
1255
  active: NoInfer<Id>;
1068
1256
  className?: string;
1257
+ /** Native named-slot assignment when composed inside a web component. */
1258
+ slot?: string;
1069
1259
  }
1070
1260
  /**
1071
1261
  * A mobile-first, iOS-like bottom tab scaffold: a bottom tab bar that switches
@@ -1075,7 +1265,7 @@ interface TabScaffoldProps<Id extends string = string> {
1075
1265
  * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of
1076
1266
  * a bottom bar. See `docs/23-app-layouts.md` §3.4.
1077
1267
  */
1078
- declare function TabScaffold<Id extends string>({ id, label, tabs, active, className, }: TabScaffoldProps<Id>): SafeHtml;
1268
+ declare function TabScaffold<Id extends string>({ id, label, tabs, active, className, slot, }: TabScaffoldProps<Id>): SafeHtml;
1079
1269
 
1080
1270
  export { TabScaffold, type TabScaffoldProps, type TabScaffoldTab };
1081
1271
  ```
@@ -1109,6 +1299,7 @@ type ResizableRegionCollapseMotion = 'none' | 'slide' | 'fade-slide';
1109
1299
  type ResizableRegionContentOverflow = 'clip' | 'auto' | 'visible';
1110
1300
  type ResizableRegionPresentation = 'inline' | 'overlay' | 'hidden';
1111
1301
  type ResizableRegionRestorePosition = 'bottom-start' | 'bottom-end';
1302
+ type ResizableRegionResponsiveFillAt = 'compact' | 'narrow';
1112
1303
  interface ResizableRegionProps {
1113
1304
  id: string;
1114
1305
  label: string;
@@ -1131,15 +1322,17 @@ interface ResizableRegionProps {
1131
1322
  restoreControl?: SafeHtml;
1132
1323
  /** Safe-area-aware viewport corner for `restoreControl`. */
1133
1324
  restorePosition?: ResizableRegionRestorePosition;
1325
+ /** Fill the available inline track and hide the separator below a container breakpoint. */
1326
+ responsiveFillAt?: ResizableRegionResponsiveFillAt;
1134
1327
  /** Decorative dormant content for the separator handle. Must not contain interactive descendants. */
1135
1328
  handleIcon?: SafeHtml;
1136
1329
  children: KerfUiContent;
1137
1330
  }
1138
1331
  declare const clampRegionSize: (size: number, min: number, max: number) => number;
1139
1332
  declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
1140
- declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, separator, collapseMotion, contentOverflow, presentation, restoreControl, restorePosition, handleIcon, children, }: ResizableRegionProps): SafeHtml;
1333
+ declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, separator, collapseMotion, contentOverflow, presentation, restoreControl, restorePosition, responsiveFillAt, handleIcon, children, }: ResizableRegionProps): SafeHtml;
1141
1334
 
1142
- export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionCollapseMotion, type ResizableRegionContentOverflow, type ResizableRegionEdge, type ResizableRegionPresentation, type ResizableRegionProps, type ResizableRegionRestorePosition, type ResizableRegionSeparator, clampRegionSize, resizeRegionFromPointer };
1335
+ export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionCollapseMotion, type ResizableRegionContentOverflow, type ResizableRegionEdge, type ResizableRegionPresentation, type ResizableRegionProps, type ResizableRegionResponsiveFillAt, type ResizableRegionRestorePosition, type ResizableRegionSeparator, clampRegionSize, resizeRegionFromPointer };
1143
1336
  ```
1144
1337
 
1145
1338
  ## `@kerfjs/ui/wire-resizable-regions`
@@ -1232,106 +1425,36 @@ export { DEFAULT_BREAKPOINTS, type DeviceBreakpoints, type DeviceClass, type Dev
1232
1425
  ## `@kerfjs/ui/catalog`
1233
1426
 
1234
1427
  ```ts
1428
+ import * as kerfjs from 'kerfjs';
1235
1429
  import { SafeHtml } from 'kerfjs';
1430
+ import { a as CatalogProps } from './types-CEsieBZi.js';
1431
+ export { b as CatalogBrand, c as CatalogEntry, d as CatalogRelated, C as CatalogResource, e as CatalogSecondaryGroup, f as CatalogSection, g as CatalogStageRootAttributes } from './types-CEsieBZi.js';
1236
1432
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1237
1433
 
1238
- /** A reference link shown in the detail footer for the active entry. */
1239
- interface CatalogResource {
1240
- label: string;
1241
- href: string;
1242
- /** Optional monospace detail (e.g. a file path) shown after the label. */
1243
- detail?: string;
1244
- }
1245
- /** A related entry offered in the detail footer's "Related entries" popup menu. */
1246
- interface CatalogRelated {
1247
- id: string;
1248
- name: string;
1249
- /** Group heading in the menu, e.g. "Uses" / "Used by". */
1250
- group: string;
1251
- }
1252
- interface CatalogEntry {
1253
- id: string;
1254
- name: string;
1255
- description?: string;
1256
- /** Short metadata tags shown at the trailing edge of the sidebar row. */
1257
- tags?: readonly string[];
1258
- resources?: readonly CatalogResource[];
1259
- related?: readonly CatalogRelated[];
1260
- }
1261
- interface CatalogSection {
1262
- category: string;
1263
- entries: readonly CatalogEntry[];
1264
- }
1265
- /**
1266
- * A secondary group of sections shown below the primary sidebar sections with a
1267
- * quieter "ecosystem" treatment (e.g. third-party components). Optionally
1268
- * collapsible — the app owns `expanded` and toggles it from `wireCatalog`'s
1269
- * `onToggleSecondary`.
1270
- */
1271
- interface CatalogSecondaryGroup {
1272
- label: string;
1273
- sections: readonly CatalogSection[];
1274
- /** When true, the group's label is a disclosure toggle controlling `expanded`. */
1275
- collapsible?: boolean;
1276
- /** Whether the group is expanded (controlled). Ignored unless `collapsible`. */
1277
- expanded?: boolean;
1278
- }
1279
- interface CatalogBrand {
1280
- title: string;
1281
- subtitle?: string;
1282
- /** Logo image URL (rendered decorative). Omit for a text-only brand. */
1283
- logoUrl?: string;
1284
- }
1285
- interface CatalogProps {
1286
- brand: CatalogBrand;
1287
- sections: readonly CatalogSection[];
1288
- /** The controlled active entry id — the app owns this signal. */
1289
- active: string;
1290
- /** The rendered preview for the active entry; the app computes it from `active`. */
1291
- content: KerfUiContent;
1292
- /** Whether the sidebar is collapsed (controlled). */
1293
- collapsed?: boolean;
1294
- /** Current theme; when set, a theme toggle is shown that switches to the opposite. Omit to hide it. */
1295
- theme?: 'light' | 'dark';
1296
- /** Extra header controls placed before the theme toggle (each a `ToolbarControlGroup`). */
1297
- headerActions?: KerfUiContent;
1298
- /** A secondary "ecosystem" group of sections below the primary category groups. */
1299
- secondarySections?: CatalogSecondaryGroup;
1300
- /** Extra sidebar content below the category groups (and the secondary group). */
1301
- sidebarFooter?: KerfUiContent;
1302
- /** Status line content shown at the start of the detail footer. */
1303
- status?: KerfUiContent;
1304
- /**
1305
- * Whether to highlight specimens' computed borders (or transparent outer
1306
- * bounds) and non-zero margins. Pass a boolean (rather than omitting the
1307
- * prop) when the active entry can switch between component and composition
1308
- * previews; `wireCatalogGeometryOverlay` keeps the overlay synchronized.
1309
- */
1310
- geometryOverlay?: boolean;
1311
- selectAction?: string;
1312
- toggleSidebarAction?: string;
1313
- toggleThemeAction?: string;
1314
- /** Action fired by the secondary group's disclosure toggle (when collapsible). */
1315
- toggleSecondaryAction?: string;
1316
- className?: string;
1317
- }
1318
- /**
1319
- * A reusable component-catalog shell: a collapsible category sidebar, a titled
1320
- * detail stage that renders the active entry's preview, and a footer with
1321
- * reference links and a related-entry popup menu. Built entirely from public
1322
- * `@kerfjs/ui` primitives. Controlled and stateless — the app owns the `active`,
1323
- * `collapsed`, and `theme` signals and computes `content` from `active` in its own
1324
- * render; wire the sidebar/collapse/theme actions with `wireCatalog`.
1325
- */
1326
- declare function Catalog({ brand, sections, active, content, collapsed, theme, headerActions, secondarySections, sidebarFooter, status, geometryOverlay, selectAction, toggleSidebarAction, toggleThemeAction, toggleSecondaryAction, className, }: CatalogProps): SafeHtml;
1327
- /**
1328
- * How a {@link CatalogExample}'s content aligns its visible left edge with the
1329
- * example's `ListHeader` label (which sits 16px in — 8px title + 8px label):
1330
- * - `'glyph'` — a bare glyph/text specimen with no inline geometry insets the full 16px.
1331
- * - `'inline-control'` — a control that already carries ~8px of its own inline padding insets 8px so its content lands on the same line.
1332
- * - `'none'` — a content-item / composition that owns its geometry and already aligns; no inset (default).
1333
- */
1434
+ /** Controlled, stateless component-catalog shell. */
1435
+ declare function Catalog({ brand, sections, active, content, collapsed, theme, headerActions, secondarySections, sidebarFooter, status, geometryOverlay, stageRootAttributes, selectAction, toggleSidebarAction, toggleThemeAction, toggleSecondaryAction, className, slot, }: CatalogProps): kerfjs.SafeHtml;
1436
+
1437
+ /** How a specimen aligns its visible edge with its `ListHeader` label. */
1334
1438
  type CatalogExampleAlign = 'glyph' | 'inline-control' | 'none';
1439
+ interface CatalogExampleViewport {
1440
+ layout?: 'grid' | 'flex' | 'flex-column';
1441
+ width?: 'full' | 'compact' | 'medium' | 'wide' | 'text' | 'control';
1442
+ /** Fixed specimen height; `app` frames an application-sized recipe or layout.
1443
+ * A fixed height is definite, so a child that fills with `height: 100%`
1444
+ * (a horizontal `ResizableRegion`, say) spans the whole frame. */
1445
+ height?: 'short' | 'reduced' | 'medium' | 'tall' | 'app';
1446
+ /** A minimum the frame may grow past. It is not a definite height: a child
1447
+ * sized with `height: 100%` falls back to its content height, so use
1448
+ * `height` when the specimen must fill the frame. */
1449
+ minHeight?: 'short' | 'medium';
1450
+ frame?: 'solid' | 'dashed';
1451
+ surface?: 'default' | 'lowered';
1452
+ overflow?: 'hidden' | 'auto-x';
1453
+ responsive?: 'roomy-only';
1454
+ shadow?: boolean;
1455
+ /** Public component custom properties applied to the specimen viewport. */
1456
+ tokens?: Readonly<Record<`--${string}`, string>>;
1457
+ }
1335
1458
  type CatalogExampleRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
1336
1459
  'data-catalog-example'?: never;
1337
1460
  'data-catalog-example-stack'?: never;
@@ -1339,58 +1462,50 @@ type CatalogExampleRootAttributes = Readonly<Record<`data-${string}`, string | u
1339
1462
  'data-catalog-example-note'?: never;
1340
1463
  'data-align'?: never;
1341
1464
  }>;
1342
- type CatalogExampleStackRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
1343
- 'data-catalog-example'?: never;
1344
- 'data-catalog-example-stack'?: never;
1345
- 'data-catalog-example-label'?: never;
1346
- 'data-catalog-example-note'?: never;
1347
- 'data-align'?: never;
1348
- }>;
1349
1465
  interface CatalogExampleProps {
1350
- /** The example's label, shown as a `ListHeader` above the specimen. Omit for a bare specimen. */
1351
1466
  label?: string;
1352
- /** Optional explanatory note between the label and the specimen. */
1353
1467
  note?: SafeHtml | string;
1354
- /** Alignment inset for the specimen — see {@link CatalogExampleAlign}. Default `'none'`. */
1355
1468
  align?: CatalogExampleAlign;
1356
- /** Safe authoring `data-*` metadata for the rendered section. Helper-owned structural attributes remain protected. */
1469
+ /** Optional catalog-owned constraints for demonstrating layout components. */
1470
+ viewport?: CatalogExampleViewport;
1471
+ /** Replacement guidance shown when a roomy-only viewport is hidden. */
1472
+ compactFallback?: SafeHtml | string;
1357
1473
  rootAttributes?: CatalogExampleRootAttributes;
1358
1474
  className?: string;
1359
1475
  children?: KerfUiContent;
1476
+ /** Native named-slot assignment when composed inside a web component. */
1477
+ slot?: string;
1360
1478
  }
1361
- /**
1362
- * One labeled example in a catalog preview: a `ListHeader` label, an optional
1363
- * note, and the specimen. `align` insets the specimen so its visible left edge
1364
- * lines up with the label text, encoding the catalog's alignment rules as a
1365
- * first-class prop instead of per-demo CSS. The inset is published as the
1366
- * `--kui-catalog-example-align` custom property so a debug overlay can exclude it
1367
- * from a specimen's measured margin.
1368
- */
1369
- declare function CatalogExample({ label, note, align, rootAttributes, className, children, }: CatalogExampleProps): SafeHtml;
1479
+ /** A labeled catalog specimen with optional explanatory text and alignment. */
1480
+ declare function CatalogExample({ label, note, align, viewport, compactFallback, rootAttributes, className, children, slot, }: CatalogExampleProps): SafeHtml;
1481
+
1482
+ type CatalogExampleStackRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
1483
+ 'data-catalog-example'?: never;
1484
+ 'data-catalog-example-stack'?: never;
1485
+ 'data-catalog-example-label'?: never;
1486
+ 'data-catalog-example-note'?: never;
1487
+ 'data-align'?: never;
1488
+ }>;
1370
1489
  interface CatalogExampleStackProps {
1371
- /** Accessible label for the stack region. */
1372
1490
  label?: string;
1373
- /** Safe authoring `data-*` metadata for the rendered stack. Helper-owned structural attributes remain protected. */
1374
1491
  rootAttributes?: CatalogExampleStackRootAttributes;
1375
1492
  className?: string;
1376
1493
  children?: KerfUiContent;
1494
+ /** Native named-slot assignment when composed inside a web component. */
1495
+ slot?: string;
1377
1496
  }
1378
- /**
1379
- * A vertically-stacked group of {@link CatalogExample}s with the catalog's
1380
- * example rhythm. The semantic `section` becomes a named `region` when `label`
1381
- * is supplied; an unlabeled stack remains an ordinary grouping.
1382
- */
1383
- declare function CatalogExampleStack({ label, rootAttributes, className, children, }: CatalogExampleStackProps): SafeHtml;
1497
+ /** A vertically stacked group of catalog examples. */
1498
+ declare function CatalogExampleStack({ label, rootAttributes, className, children, slot, }: CatalogExampleStackProps): kerfjs.SafeHtml;
1384
1499
 
1385
- export { Catalog, type CatalogBrand, type CatalogEntry, CatalogExample, type CatalogExampleAlign, type CatalogExampleProps, CatalogExampleStack, type CatalogExampleStackProps, type CatalogProps, type CatalogRelated, type CatalogResource, type CatalogSecondaryGroup, type CatalogSection };
1500
+ export { Catalog, CatalogExample, type CatalogExampleAlign, type CatalogExampleProps, CatalogExampleStack, type CatalogExampleStackProps, type CatalogExampleViewport, CatalogProps };
1386
1501
  ```
1387
1502
 
1388
1503
  ## `@kerfjs/ui/catalog-resources`
1389
1504
 
1390
1505
  ```ts
1391
- import { CatalogResource } from './catalog.js';
1392
- import 'kerfjs';
1506
+ import { C as CatalogResource } from './types-CEsieBZi.js';
1393
1507
  import './semantic-content-BbzjvSu9.js';
1508
+ import 'kerfjs';
1394
1509
 
1395
1510
  /**
1396
1511
  * Standard resource labels for a Kerf catalog detail footer. Keep these labels
@@ -1517,8 +1632,10 @@ interface SegmentedControlProps<Value extends string = string> {
1517
1632
  className?: string;
1518
1633
  /** Render as an unanimated loading skeleton, disabling every segment. */
1519
1634
  placeholder?: boolean;
1635
+ /** Native named-slot assignment when composed inside a web component. */
1636
+ slot?: string;
1520
1637
  }
1521
- declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps<Value>): kerfjs.SafeHtml;
1638
+ declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, slot, }: SegmentedControlProps<Value>): kerfjs.SafeHtml;
1522
1639
 
1523
1640
  export { SegmentedControl, type SegmentedControlAppearance, type SegmentedControlChoice, type SegmentedControlLayout, type SegmentedControlProps, type SegmentedControlShape, type SegmentedControlSize };
1524
1641
  ```
@@ -1527,7 +1644,7 @@ export { SegmentedControl, type SegmentedControlAppearance, type SegmentedContro
1527
1644
 
1528
1645
  ```ts
1529
1646
  import { SafeHtml } from 'kerfjs';
1530
- import { CssColor } from './css-values.js';
1647
+ import { CssForegroundColor } from './css-values.js';
1531
1648
  import { LucideNode } from './lucide-icon.js';
1532
1649
  import 'lucide';
1533
1650
 
@@ -1536,9 +1653,19 @@ interface SelectChoice<Value extends string = string> {
1536
1653
  label: string;
1537
1654
  icon?: LucideNode;
1538
1655
  iconName?: string;
1539
- /** Typed semantic or application-owned color for the optional icon. */
1540
- color?: CssColor;
1656
+ /**
1657
+ * Foreground color for the optional icon: a semantic foreground token such
1658
+ * as `uiColor('success-on-quiet')`, or an application-owned
1659
+ * `foregroundColorVar('--app-icon-color')`. Fill tokens such as
1660
+ * `uiColor('success')` are pale background tints and do not type-check.
1661
+ */
1662
+ color?: CssForegroundColor;
1541
1663
  group?: string;
1664
+ /**
1665
+ * Draw a divider between this choice and the previous choice in the same
1666
+ * list. A group boundary is already a separator, so the first choice of a
1667
+ * group (or of the whole menu) never draws a second one.
1668
+ */
1542
1669
  separatorBefore?: boolean;
1543
1670
  }
1544
1671
  type SelectAccessibleName = {
@@ -1575,9 +1702,11 @@ interface SelectBaseProps<Value extends string = string> {
1575
1702
  focusRingOwner?: SelectFocusRingOwner;
1576
1703
  /** Maximum closed-control label width in CSS pixels before ellipsis. */
1577
1704
  labelMaxWidth?: number;
1705
+ /** Native named-slot assignment when composed inside a web component. */
1706
+ slot?: string;
1578
1707
  }
1579
1708
  type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName;
1580
- declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, hint, disabled, fitMenu, renderSelected, placeholder, presentation, size, selectedPresentation, focusRingOwner, labelMaxWidth, }: SelectProps<Value>): SafeHtml;
1709
+ declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, hint, disabled, fitMenu, renderSelected, placeholder, presentation, size, selectedPresentation, focusRingOwner, labelMaxWidth, slot, }: SelectProps<Value>): SafeHtml;
1581
1710
 
1582
1711
  export { Select, type SelectChoice, type SelectFocusRingOwner, type SelectPresentation, type SelectProps, type SelectSelectedPresentation, type SelectSize };
1583
1712
  ```
@@ -1602,8 +1731,10 @@ interface StateBannerProps {
1602
1731
  className?: string;
1603
1732
  /** Render the title, badge, and detail as unanimated loading skeletons, keeping the icon and tone. */
1604
1733
  placeholder?: boolean;
1734
+ /** Native named-slot assignment when composed inside a web component. */
1735
+ slot?: string;
1605
1736
  }
1606
- declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
1737
+ declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, className, placeholder, slot, }: StateBannerProps): SafeHtml;
1607
1738
 
1608
1739
  export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
1609
1740
  ```
@@ -1621,8 +1752,10 @@ interface EmptyStateProps {
1621
1752
  action?: KerfUiContent;
1622
1753
  busy?: boolean;
1623
1754
  className?: string;
1755
+ /** Native named-slot assignment when composed inside a web component. */
1756
+ slot?: string;
1624
1757
  }
1625
- declare function EmptyState({ title, detail, icon, action, busy, className, }: EmptyStateProps): SafeHtml;
1758
+ declare function EmptyState({ title, detail, icon, action, busy, className, slot, }: EmptyStateProps): SafeHtml;
1626
1759
 
1627
1760
  export { EmptyState, type EmptyStateProps };
1628
1761
  ```
@@ -1635,9 +1768,11 @@ import * as kerfjs from 'kerfjs';
1635
1768
  interface LoadingSpinnerProps {
1636
1769
  className?: string;
1637
1770
  label?: string;
1771
+ /** Native named-slot assignment when composed inside a web component. */
1772
+ slot?: string;
1638
1773
  }
1639
1774
  /** Stable viewBox-centered progress ring based on svg-spinners' MIT-licensed 180-ring. */
1640
- declare function LoadingSpinner({ className, label }: LoadingSpinnerProps): kerfjs.SafeHtml;
1775
+ declare function LoadingSpinner({ className, label, slot, }: LoadingSpinnerProps): kerfjs.SafeHtml;
1641
1776
 
1642
1777
  export { LoadingSpinner, type LoadingSpinnerProps };
1643
1778
  ```
@@ -1660,6 +1795,8 @@ interface SkeletonProps {
1660
1795
  /** Accessible label. Omit to keep the block decorative (`aria-hidden`). */
1661
1796
  label?: string;
1662
1797
  className?: string;
1798
+ /** Native named-slot assignment when composed inside a web component. */
1799
+ slot?: string;
1663
1800
  }
1664
1801
  /**
1665
1802
  * A subtle, deliberately **unanimated** loading placeholder block. Use it for a
@@ -1667,7 +1804,7 @@ interface SkeletonProps {
1667
1804
  * `placeholder` prop. Decorative by default (`aria-hidden`); pass `label` to
1668
1805
  * announce it. Sizes to its slot unless `width`/`height` are given.
1669
1806
  */
1670
- declare function Skeleton({ width, height, radius, lines, label, className, }: SkeletonProps): kerfjs.SafeHtml;
1807
+ declare function Skeleton({ width, height, radius, lines, label, className, slot, }: SkeletonProps): kerfjs.SafeHtml;
1671
1808
 
1672
1809
  export { Skeleton, type SkeletonProps };
1673
1810
  ```
@@ -1686,13 +1823,15 @@ interface SunkenPanelProps {
1686
1823
  /** Corner shape: a rounded rectangle (default) or square corners. */
1687
1824
  shape?: SunkenPanelShape;
1688
1825
  className?: string;
1826
+ /** Native named-slot assignment when composed inside a web component. */
1827
+ slot?: string;
1689
1828
  }
1690
1829
  /**
1691
1830
  * A lowered application surface with one compact inset and a vertical content
1692
1831
  * stack. The panel owns its background and padding; children own their own
1693
1832
  * borders and internal geometry.
1694
1833
  */
1695
- declare function SunkenPanel({ children, ariaLabel, shape, className, }: SunkenPanelProps): kerfjs.SafeHtml;
1834
+ declare function SunkenPanel({ children, ariaLabel, shape, className, slot, }: SunkenPanelProps): kerfjs.SafeHtml;
1696
1835
 
1697
1836
  export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
1698
1837
  ```
@@ -1728,12 +1867,16 @@ interface TokenSearchFieldBaseProps {
1728
1867
  autofocus?: boolean;
1729
1868
  leading?: KerfUiContent;
1730
1869
  trailing?: KerfUiContent;
1870
+ /** Standalone field chrome or the inset visual layer of a configured toolbar group. */
1871
+ presentation?: 'standalone' | 'toolbar-group';
1731
1872
  editAction?: string;
1732
1873
  removeAction?: string;
1733
1874
  clearAction?: string;
1734
1875
  clearLabel?: string;
1735
1876
  className?: string;
1736
1877
  editorAttributes?: TokenSearchEditorAttributes;
1878
+ /** Native named-slot assignment when composed inside a web component. */
1879
+ slot?: string;
1737
1880
  }
1738
1881
  type TokenSearchCollapsibleProps = {
1739
1882
  /** Allow an empty field to render as one iconic action. */
@@ -1753,7 +1896,7 @@ interface TokenSearchFieldValue {
1753
1896
  query: string;
1754
1897
  tokens: TokenSearchToken[];
1755
1898
  }
1756
- declare function TokenSearchField({ id, label, query, tokens, placeholder, tokenPlaceholder, disabled, autofocus, collapsible, expanded, expandAction, expandLabel, leading, trailing, editAction, removeAction, clearAction, clearLabel, className, editorAttributes, }: TokenSearchFieldProps): kerfjs.SafeHtml;
1899
+ declare function TokenSearchField({ id, label, query, tokens, placeholder, tokenPlaceholder, disabled, autofocus, collapsible, expanded, expandAction, expandLabel, leading, trailing, presentation, editAction, removeAction, clearAction, clearLabel, className, editorAttributes, slot, }: TokenSearchFieldProps): kerfjs.SafeHtml;
1757
1900
  /** Read editable text and ordered token offsets from a rendered TokenSearchField editor. */
1758
1901
  declare function readTokenSearchField(editor: HTMLElement, knownTokens?: readonly TokenSearchToken[]): TokenSearchFieldValue;
1759
1902
  /** Focus an editor and place its caret at a text offset, skipping atomic token chips. */
@@ -1955,6 +2098,35 @@ declare function delegateActions<E extends Element = Element>(root: HTMLElement,
1955
2098
  export { type ActionHandler, type DelegateActionsOptions, action, delegateActions };
1956
2099
  ```
1957
2100
 
2101
+ ## `@kerfjs/ui/badge`
2102
+
2103
+ ```ts
2104
+ import { SafeHtml } from 'kerfjs';
2105
+
2106
+ type BadgeTone = 'neutral' | 'brand' | 'pop' | 'success' | 'warning' | 'danger';
2107
+ type BadgeAppearance = 'quiet' | 'solid' | 'outline';
2108
+ type BadgeShape = 'pill' | 'rounded';
2109
+ type BadgeSize = 'compact' | 'default';
2110
+ interface BadgeProps {
2111
+ children: SafeHtml | string | number;
2112
+ tone?: BadgeTone;
2113
+ appearance?: BadgeAppearance;
2114
+ shape?: BadgeShape;
2115
+ size?: BadgeSize;
2116
+ /** Optional accessible name when the visible content is abbreviated. */
2117
+ label?: string;
2118
+ /** Hide a repeated visual badge from assistive technology. */
2119
+ ariaHidden?: boolean;
2120
+ className?: string;
2121
+ /** Native named-slot assignment when composed inside a web component. */
2122
+ slot?: string;
2123
+ }
2124
+ /** Compact, non-interactive metadata whose tone, emphasis, and shape are configured by props. */
2125
+ declare function Badge({ children, tone, appearance, shape, size, label, ariaHidden, className, slot, }: BadgeProps): SafeHtml;
2126
+
2127
+ export { Badge, type BadgeAppearance, type BadgeProps, type BadgeShape, type BadgeSize, type BadgeTone };
2128
+ ```
2129
+
1958
2130
  ## `@kerfjs/ui/lucide-icon`
1959
2131
 
1960
2132
  ```ts
@@ -1967,9 +2139,11 @@ interface LucideIconProps {
1967
2139
  name: string;
1968
2140
  className?: string;
1969
2141
  label?: string;
2142
+ /** Native named-slot assignment when composed inside a web component. */
2143
+ slot?: string;
1970
2144
  }
1971
2145
  /** Render a Lucide-compatible icon node without copying icon SVG strings. */
1972
- declare function LucideIcon({ icon, name, className, label }: LucideIconProps): kerfjs.SafeHtml;
2146
+ declare function LucideIcon({ icon, name, className, label, slot, }: LucideIconProps): kerfjs.SafeHtml;
1973
2147
 
1974
2148
  export { LucideIcon, type LucideIconProps, type LucideNode };
1975
2149
  ```
@@ -1990,17 +2164,21 @@ interface DialogSurfaceProps {
1990
2164
  bodyInset?: SurfaceInset;
1991
2165
  footerInset?: SurfaceInset;
1992
2166
  className?: string;
2167
+ /** Native named-slot assignment when composed inside a web component. */
2168
+ slot?: string;
1993
2169
  }
1994
2170
  /** Configure recurring Web Awesome dialog geometry without consumer ::part() CSS. */
1995
- declare function DialogSurface({ children, size, presentation, bodyInset, footerInset, className, }: DialogSurfaceProps): kerfjs.SafeHtml;
2171
+ declare function DialogSurface({ children, size, presentation, bodyInset, footerInset, className, slot, }: DialogSurfaceProps): kerfjs.SafeHtml;
1996
2172
  type PopupSurfaceInset = 'standard' | 'compact' | 'list-zero';
1997
2173
  interface PopupSurfaceProps {
1998
2174
  children: KerfUiContent;
1999
2175
  inset?: PopupSurfaceInset;
2000
2176
  className?: string;
2177
+ /** Native named-slot assignment when composed inside a web component. */
2178
+ slot?: string;
2001
2179
  }
2002
2180
  /** Configure recurring Web Awesome dropdown-menu geometry without consumer ::part() CSS. */
2003
- declare function PopupSurface({ children, inset, className, }: PopupSurfaceProps): kerfjs.SafeHtml;
2181
+ declare function PopupSurface({ children, inset, className, slot, }: PopupSurfaceProps): kerfjs.SafeHtml;
2004
2182
 
2005
2183
  export { DialogSurface, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceSize, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset };
2006
2184
  ```
@@ -2012,13 +2190,14 @@ import * as kerfjs from 'kerfjs';
2012
2190
  import { KerfBaseAttrs } from 'kerfjs/jsx-runtime';
2013
2191
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2014
2192
 
2015
- type TextVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p';
2193
+ type TextVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';
2016
2194
  type TextTone = 'default' | 'quiet' | 'danger';
2017
2195
  type TextSize = 'default' | 'compact';
2018
2196
  type TextFont = 'default' | 'monospace';
2197
+ type TextBorder = 'transparent' | 'none';
2019
2198
  type TextContent = KerfUiContent | string | number | readonly TextContent[];
2020
2199
  type TextProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
2021
- /** Native heading or paragraph element to render. Defaults to `p`. */
2200
+ /** Native heading, paragraph, or inline span element to render. Defaults to `p`. */
2022
2201
  variant?: TextVariant;
2023
2202
  /** Semantic foreground treatment. Defaults to the inherited foreground. */
2024
2203
  tone?: TextTone;
@@ -2026,17 +2205,20 @@ type TextProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
2026
2205
  size?: TextSize;
2027
2206
  /** Font family independent of the native semantic element. */
2028
2207
  font?: TextFont;
2208
+ /** Transparent alignment border or no border when embedded in owner chrome. */
2209
+ border?: TextBorder;
2029
2210
  children: TextContent;
2030
2211
  class?: string;
2031
2212
  className?: string;
2032
2213
  };
2033
2214
  /**
2034
- * Semantic heading or paragraph text with the standard content-item padding.
2215
+ * Semantic heading, paragraph, or inline text. Block variants use the standard
2216
+ * content-item padding; `span` adds no box geometry.
2035
2217
  * All ordinary native heading/paragraph attributes pass through to the element.
2036
2218
  */
2037
- declare function Text({ variant: Variant, tone, size, font, children, class: classValue, className, ...attributes }: TextProps): kerfjs.SafeHtml;
2219
+ declare function Text({ variant: Variant, tone, size, font, border, children, class: classValue, className, ...attributes }: TextProps): kerfjs.SafeHtml;
2038
2220
 
2039
- export { Text, type TextContent, type TextFont, type TextProps, type TextSize, type TextTone, type TextVariant };
2221
+ export { Text, type TextBorder, type TextContent, type TextFont, type TextProps, type TextSize, type TextTone, type TextVariant };
2040
2222
  ```
2041
2223
 
2042
2224
  ## `@kerfjs/ui/row`
@@ -2048,6 +2230,16 @@ import { S as Sides } from './divider-sides-BzB6rphT.js';
2048
2230
  import { H as HorizontalAlignment, V as VerticalAlignment } from './flex-alignment-4ms8ZbV8.js';
2049
2231
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2050
2232
 
2233
+ type RowRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
2234
+ 'data-component'?: never;
2235
+ 'data-h-align'?: never;
2236
+ 'data-v-align'?: never;
2237
+ 'data-flex'?: never;
2238
+ 'data-fill'?: never;
2239
+ 'data-wrap'?: never;
2240
+ 'data-text-insets'?: never;
2241
+ 'data-control-insets'?: never;
2242
+ }>;
2051
2243
  interface RowProps {
2052
2244
  children?: KerfUiContent;
2053
2245
  /** Horizontal distribution. Defaults to left. */
@@ -2058,6 +2250,12 @@ interface RowProps {
2058
2250
  gap?: UiSpaceName | CssLength;
2059
2251
  /** Allow this row to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */
2060
2252
  flex?: boolean | CssFlexKeyword | CssFlex;
2253
+ /**
2254
+ * Fill the height of a parent with a definite height, such as an app root or
2255
+ * a fixed-height frame, when this row is that parent's layout root. Inside a
2256
+ * flex layout use `flex` instead. Defaults to false.
2257
+ */
2258
+ fill?: boolean;
2061
2259
  /** Allow children to wrap onto additional lines. */
2062
2260
  wrap?: boolean;
2063
2261
  /** Physical sides that receive the standard 17px text inset. */
@@ -2065,9 +2263,13 @@ interface RowProps {
2065
2263
  /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */
2066
2264
  controlInsets?: Sides;
2067
2265
  className?: string;
2266
+ /** Safe `data-*` metadata; Row-owned structural attributes remain protected. */
2267
+ rootAttributes?: RowRootAttributes;
2268
+ /** Native named-slot assignment when composed inside a web component. */
2269
+ slot?: string;
2068
2270
  }
2069
2271
  /** A horizontal flex row with explicit physical-axis alignment and spacing. */
2070
- declare function Row({ children, hAlign, vAlign, gap, flex, wrap, textInsets, controlInsets, className, }: RowProps): kerfjs.SafeHtml;
2272
+ declare function Row({ children, hAlign, vAlign, gap, flex, fill, wrap, textInsets, controlInsets, className, rootAttributes, slot, }: RowProps): kerfjs.SafeHtml;
2071
2273
 
2072
2274
  export { CssFlex, CssFlexKeyword, CssLength, HorizontalAlignment, Row, type RowProps, Sides, UiSpaceName, VerticalAlignment };
2073
2275
  ```
@@ -2079,6 +2281,12 @@ import * as kerfjs from 'kerfjs';
2079
2281
  import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
2080
2282
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2081
2283
 
2284
+ type GridRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
2285
+ 'data-component'?: never;
2286
+ 'data-columns'?: never;
2287
+ 'data-flex'?: never;
2288
+ 'data-fill'?: never;
2289
+ }>;
2082
2290
  interface GridProps {
2083
2291
  children?: KerfUiContent;
2084
2292
  /** Number of equal-width columns. Must be a positive safe integer. */
@@ -2087,10 +2295,20 @@ interface GridProps {
2087
2295
  gap?: UiSpaceName | CssLength;
2088
2296
  /** Allow this grid to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */
2089
2297
  flex?: boolean | CssFlexKeyword | CssFlex;
2298
+ /**
2299
+ * Fill the height of a parent with a definite height, such as an app root or
2300
+ * a fixed-height frame, when this grid is that parent's layout root. Inside a
2301
+ * flex layout use `flex` instead. Defaults to false.
2302
+ */
2303
+ fill?: boolean;
2090
2304
  className?: string;
2305
+ /** Safe `data-*` metadata; Grid-owned structural attributes remain protected. */
2306
+ rootAttributes?: GridRootAttributes;
2307
+ /** Native named-slot assignment when composed inside a web component. */
2308
+ slot?: string;
2091
2309
  }
2092
2310
  /** A fixed-count grid whose columns share the available width equally. */
2093
- declare function Grid({ children, columns, gap, flex, className, }: GridProps): kerfjs.SafeHtml;
2311
+ declare function Grid({ children, columns, gap, flex, fill, className, rootAttributes, slot, }: GridProps): kerfjs.SafeHtml;
2094
2312
 
2095
2313
  export { CssFlex, CssFlexKeyword, CssLength, Grid, type GridProps, UiSpaceName };
2096
2314
  ```
@@ -2109,9 +2327,11 @@ interface SpacerProps {
2109
2327
  /** A named UI spacing token or typed physical height. */
2110
2328
  height?: UiSpaceName | CssLength;
2111
2329
  className?: string;
2330
+ /** Native named-slot assignment when composed inside a web component. */
2331
+ slot?: string;
2112
2332
  }
2113
2333
  /** A decorative fixed-size or flexible gap for Row, List, and other flex layouts. */
2114
- declare function Spacer({ flex, width, height, className, }: SpacerProps): kerfjs.SafeHtml;
2334
+ declare function Spacer({ flex, width, height, className, slot, }: SpacerProps): kerfjs.SafeHtml;
2115
2335
 
2116
2336
  export { CssLength, Spacer, type SpacerProps, UiSpaceName };
2117
2337
  ```