@kerfjs/ui 5.0.0-beta.23 → 5.0.0-beta.25

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 (288) hide show
  1. package/README.md +45 -23
  2. package/ai/application-ui-diagnostic-ids-v1.json +3 -0
  3. package/ai/application-ui-profile.defaults.json +1 -1
  4. package/ai/compile-time-contracts-v1.json +5 -12
  5. package/ai/component-catalog-v2-overrides.json +12 -49
  6. package/ai/component-catalog-v2.d.ts +1 -0
  7. package/ai/component-catalog-v2.json +458 -123
  8. package/ai/component-catalog-v2.schema.json +2 -1
  9. package/ai/component-catalog.json +658 -195
  10. package/ai/public-api-signatures-v1.md +160 -80
  11. package/ai/skill.md +22 -22
  12. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  13. package/analyzer/cli.mjs +5 -2
  14. package/analyzer/index.d.mts +1 -0
  15. package/analyzer/index.mjs +117 -10
  16. package/dist/app-tab.d.ts +10 -2
  17. package/dist/app-tab.js +1 -1
  18. package/dist/browser/list-action-row.js +1 -0
  19. package/dist/browser/list-item.js +1 -0
  20. package/dist/browser/list.js +3 -0
  21. package/dist/browser/surface-scaffold.js +3 -0
  22. package/dist/catalog.d.ts +8 -4
  23. package/dist/catalog.js +21 -11
  24. package/dist/catalog.js.map +1 -1
  25. package/dist/{chunk-ELSJX4W7.js → chunk-4EF2CMYS.js} +25 -6
  26. package/dist/chunk-4EF2CMYS.js.map +1 -0
  27. package/dist/{chunk-OHU6CI22.js → chunk-B3A3IVO5.js} +2 -2
  28. package/dist/{chunk-OHU6CI22.js.map → chunk-B3A3IVO5.js.map} +1 -1
  29. package/dist/{chunk-K57KRAOV.js → chunk-FRVS5RFM.js} +24 -6
  30. package/dist/chunk-FRVS5RFM.js.map +1 -0
  31. package/dist/{chunk-DSNIYOZ3.js → chunk-GWEAPEZI.js} +16 -3
  32. package/dist/chunk-GWEAPEZI.js.map +1 -0
  33. package/dist/chunk-HP2B2L26.js +102 -0
  34. package/dist/chunk-HP2B2L26.js.map +1 -0
  35. package/dist/{chunk-OZWU5ZPZ.js → chunk-IJBSZ4NX.js} +2 -2
  36. package/dist/{chunk-OZWU5ZPZ.js.map → chunk-IJBSZ4NX.js.map} +1 -1
  37. package/dist/chunk-J5BFYY7Q.js +35 -0
  38. package/dist/chunk-J5BFYY7Q.js.map +1 -0
  39. package/dist/{chunk-GP5DP5DL.js → chunk-JFGXQBIP.js} +85 -24
  40. package/dist/chunk-JFGXQBIP.js.map +1 -0
  41. package/dist/{chunk-QQFJMRIB.js → chunk-KWWR5VMS.js} +2 -2
  42. package/dist/{chunk-QQFJMRIB.js.map → chunk-KWWR5VMS.js.map} +1 -1
  43. package/dist/chunk-OBLTAKSX.js +43 -0
  44. package/dist/chunk-OBLTAKSX.js.map +1 -0
  45. package/dist/{chunk-PIDTEQ3U.js → chunk-OT6RPYAP.js} +17 -3
  46. package/dist/chunk-OT6RPYAP.js.map +1 -0
  47. package/dist/{chunk-W7YD6E4N.js → chunk-R7ZWUN64.js} +2 -2
  48. package/dist/{chunk-W7YD6E4N.js.map → chunk-R7ZWUN64.js.map} +1 -1
  49. package/dist/{chunk-PZQVSDLH.js → chunk-RKVQEH4J.js} +1 -1
  50. package/dist/chunk-RKVQEH4J.js.map +1 -0
  51. package/dist/{chunk-7L6EHUMV.js → chunk-SYDMYBPG.js} +3 -3
  52. package/dist/chunk-SYDMYBPG.js.map +1 -0
  53. package/dist/{chunk-W4CXQYSG.js → chunk-TB6DY7H5.js} +3 -1
  54. package/dist/chunk-TB6DY7H5.js.map +1 -0
  55. package/dist/{chunk-AASLYRGE.js → chunk-UKKSMZYT.js} +18 -7
  56. package/dist/chunk-UKKSMZYT.js.map +1 -0
  57. package/dist/{chunk-BBRXX6PF.js → chunk-VCE4MPVE.js} +26 -4
  58. package/dist/chunk-VCE4MPVE.js.map +1 -0
  59. package/dist/{chunk-VLYV65LK.js → chunk-W5L2JSBY.js} +5 -3
  60. package/dist/chunk-W5L2JSBY.js.map +1 -0
  61. package/dist/{chunk-5VTB2BKP.js → chunk-WNWD54GR.js} +16 -2
  62. package/dist/chunk-WNWD54GR.js.map +1 -0
  63. package/dist/{chunk-M7JBER5U.js → chunk-X2U3QJCJ.js} +8 -2
  64. package/dist/chunk-X2U3QJCJ.js.map +1 -0
  65. package/dist/{chunk-DPDBVKNA.js → chunk-YMKH5XTF.js} +5 -3
  66. package/dist/chunk-YMKH5XTF.js.map +1 -0
  67. package/dist/collapsible-panel.d.ts +9 -1
  68. package/dist/collapsible-panel.js +36 -15
  69. package/dist/collapsible-panel.js.map +1 -1
  70. package/dist/divider-sides-267FA7sY.d.ts +4 -0
  71. package/dist/index.d.ts +5 -3
  72. package/dist/index.js +20 -19
  73. package/dist/list-action-row.d.ts +11 -1
  74. package/dist/list-action-row.js +2 -1
  75. package/dist/list-header.d.ts +15 -2
  76. package/dist/list-header.js +1 -1
  77. package/dist/list-item.d.ts +12 -1
  78. package/dist/list-item.js +2 -1
  79. package/dist/list.d.ts +19 -0
  80. package/dist/list.js +3 -0
  81. package/dist/list.js.map +1 -0
  82. package/dist/nav-stack.js +1 -1
  83. package/dist/resizable-region.d.ts +19 -2
  84. package/dist/resizable-region.js +1 -1
  85. package/dist/segmented-control.js +1 -1
  86. package/dist/select.d.ts +12 -1
  87. package/dist/select.js +1 -1
  88. package/dist/skeleton.d.ts +1 -1
  89. package/dist/skeleton.js +1 -1
  90. package/dist/split-view.js +2 -2
  91. package/dist/state-banner.d.ts +4 -2
  92. package/dist/state-banner.js +1 -1
  93. package/dist/styles/app-tab.css +26 -0
  94. package/dist/styles/catalog.css +8 -2
  95. package/dist/styles/collapsible-panel.css +66 -4
  96. package/dist/styles/list-action-row.css +64 -0
  97. package/dist/styles/list-header.css +32 -0
  98. package/dist/styles/list-item.css +45 -6
  99. package/dist/styles/list.css +43 -0
  100. package/dist/styles/resizable-region.css +132 -0
  101. package/dist/styles/select.css +68 -0
  102. package/dist/styles/state-banner.css +32 -1
  103. package/dist/styles/styles.css +2 -1
  104. package/dist/styles/sunken-panel.css +4 -0
  105. package/dist/styles/surface-scaffold.css +51 -0
  106. package/dist/styles/tab-bar.css +24 -0
  107. package/dist/styles/toolbar-control-group.css +73 -1
  108. package/dist/styles/toolbar-text.css +1 -1
  109. package/dist/styles/toolbar.css +38 -2
  110. package/dist/styles/webawesome.css +12 -0
  111. package/dist/styles/workbench.css +89 -0
  112. package/dist/sunken-panel.d.ts +5 -2
  113. package/dist/sunken-panel.js +1 -1
  114. package/dist/surface-scaffold.d.ts +25 -0
  115. package/dist/surface-scaffold.js +3 -0
  116. package/dist/surface-scaffold.js.map +1 -0
  117. package/dist/tab-bar.d.ts +11 -2
  118. package/dist/tab-bar.js +1 -1
  119. package/dist/toolbar-control-group.d.ts +16 -2
  120. package/dist/toolbar-control-group.js +1 -1
  121. package/dist/toolbar-text.js +1 -1
  122. package/dist/toolbar.d.ts +5 -3
  123. package/dist/toolbar.js +1 -1
  124. package/dist/value-table.js +1 -1
  125. package/dist/webawesome.d.ts +1 -0
  126. package/dist/wire-catalog.d.ts +4 -2
  127. package/dist/wire-catalog.js +95 -36
  128. package/dist/wire-catalog.js.map +1 -1
  129. package/dist/wire-resizable-regions.js +1 -1
  130. package/dist/wire-sidebar.d.ts +6 -1
  131. package/dist/wire-sidebar.js +27 -8
  132. package/dist/wire-sidebar.js.map +1 -1
  133. package/dist/wire-tab-bars.js +1 -1
  134. package/dist/wire-token-search-fields.d.ts +1 -1
  135. package/dist/wire-token-search-fields.js +1 -1
  136. package/dist/workbench.d.ts +8 -0
  137. package/dist/workbench.js +42 -0
  138. package/dist/workbench.js.map +1 -1
  139. package/docs/accessibility.md +67 -15
  140. package/docs/catalog.md +17 -12
  141. package/docs/collapsible-panel.md +7 -0
  142. package/docs/component-contract.md +19 -9
  143. package/docs/component-selection.md +65 -31
  144. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  145. package/docs/design/templates/empty-state/filtered.svg +1 -1
  146. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  147. package/docs/design/templates/empty-state/with-action.svg +1 -1
  148. package/docs/design/templates/empty-state-dark.svg +1 -7
  149. package/docs/design/templates/empty-state.svg +1 -7
  150. package/docs/design/templates/list/compact-dark.svg +1 -0
  151. package/docs/design/templates/list/compact.svg +1 -0
  152. package/docs/design/templates/list/stack-dark.svg +1 -0
  153. package/docs/design/templates/list/stack.svg +1 -0
  154. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  155. package/docs/design/templates/list-action-row/default.svg +1 -1
  156. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  157. package/docs/design/templates/list-action-row/selected.svg +1 -1
  158. package/docs/design/templates/list-action-row-dark.svg +1 -7
  159. package/docs/design/templates/list-action-row.svg +1 -7
  160. package/docs/design/templates/list-dark.svg +1 -0
  161. package/docs/design/templates/list-header/action-dark.svg +1 -1
  162. package/docs/design/templates/list-header/action.svg +1 -1
  163. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  164. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  165. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  166. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  167. package/docs/design/templates/list-header-dark.svg +1 -11
  168. package/docs/design/templates/list-header.svg +1 -11
  169. package/docs/design/templates/list-item/default-dark.svg +1 -1
  170. package/docs/design/templates/list-item/default.svg +1 -1
  171. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  172. package/docs/design/templates/list-item/multiline.svg +1 -1
  173. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  174. package/docs/design/templates/list-item/selected.svg +1 -1
  175. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  176. package/docs/design/templates/list-item/trailing.svg +1 -1
  177. package/docs/design/templates/list-item-dark.svg +1 -11
  178. package/docs/design/templates/list-item.svg +1 -11
  179. package/docs/design/templates/list.svg +1 -0
  180. package/docs/design/templates/segmented-control-dark.svg +1 -7
  181. package/docs/design/templates/segmented-control.svg +1 -7
  182. package/docs/design/templates/skeleton-dark.svg +1 -9
  183. package/docs/design/templates/skeleton.svg +1 -9
  184. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  185. package/docs/design/templates/state-banner/danger.svg +1 -1
  186. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  187. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  188. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  189. package/docs/design/templates/state-banner/info.svg +1 -1
  190. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  191. package/docs/design/templates/state-banner/success.svg +1 -1
  192. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  193. package/docs/design/templates/state-banner/warning.svg +1 -1
  194. package/docs/design/templates/state-banner-dark.svg +1 -11
  195. package/docs/design/templates/state-banner.svg +1 -11
  196. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  197. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  198. package/docs/design/templates/tab-bar-dark.svg +1 -5
  199. package/docs/design/templates/tab-bar.svg +1 -5
  200. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  201. package/docs/design/templates/token-search-field/empty.svg +1 -1
  202. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  203. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  204. package/docs/design/templates/token-search-field-dark.svg +1 -7
  205. package/docs/design/templates/token-search-field.svg +1 -7
  206. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  207. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  208. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  209. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  210. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  211. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  212. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  213. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  214. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  215. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  216. package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
  217. package/docs/design/templates/toolbar-control-group.svg +1 -11
  218. package/docs/design/templates/toolbar-dark.svg +1 -5
  219. package/docs/design/templates/toolbar-text-dark.svg +1 -9
  220. package/docs/design/templates/toolbar-text.svg +1 -9
  221. package/docs/design/templates/toolbar.svg +1 -5
  222. package/docs/design/templates/value-table/details-dark.svg +1 -1
  223. package/docs/design/templates/value-table/details.svg +1 -1
  224. package/docs/design/templates/value-table-dark.svg +1 -5
  225. package/docs/design/templates/value-table.svg +1 -5
  226. package/docs/design/templates.md +29 -20
  227. package/docs/examples/component-catalog-extension-v2.json +3 -6
  228. package/docs/examples/component-catalog-extension.json +1 -1
  229. package/docs/layout.md +7 -9
  230. package/docs/recipes.md +8 -7
  231. package/docs/sunken-panel.md +11 -1
  232. package/docs/surface-scaffold.md +17 -0
  233. package/docs/type-contracts.md +11 -10
  234. package/docs/ui-analyzer.md +19 -1
  235. package/docs/ui-doctor.md +7 -5
  236. package/docs/ux-demo.md +6 -3
  237. package/docs/webawesome-theme.md +4 -1
  238. package/docs/workbench.md +49 -2
  239. package/doctor/eslint-diagnostics.d.mts +16 -0
  240. package/doctor/eslint-diagnostics.mjs +17 -0
  241. package/doctor/index.mjs +21 -3
  242. package/llms.txt +33 -11
  243. package/package.json +14 -8
  244. package/traversal-exclusions.mjs +7 -1
  245. package/ux-demo/recipes/app-shell.tsx +36 -23
  246. package/ux-demo/recipes/collapsible-sidebar.tsx +23 -17
  247. package/ux-demo/recipes/composer-form.tsx +15 -6
  248. package/ux-demo/recipes/list-detail-dialog.tsx +31 -15
  249. package/ux-demo/recipes/list-workspace-states.tsx +16 -7
  250. package/ux-demo/recipes/loading-inspector.tsx +39 -18
  251. package/ux-demo/recipes/navigation-sidebar.tsx +1 -1
  252. package/ux-demo/recipes/recipes.css +7 -2
  253. package/ux-demo/recipes/workspace-header.tsx +17 -7
  254. package/dist/browser/panel-header.js +0 -7
  255. package/dist/chunk-5VTB2BKP.js.map +0 -1
  256. package/dist/chunk-7L6EHUMV.js.map +0 -1
  257. package/dist/chunk-AASLYRGE.js.map +0 -1
  258. package/dist/chunk-BBRXX6PF.js.map +0 -1
  259. package/dist/chunk-DPDBVKNA.js.map +0 -1
  260. package/dist/chunk-DSNIYOZ3.js.map +0 -1
  261. package/dist/chunk-ELSJX4W7.js.map +0 -1
  262. package/dist/chunk-GP5DP5DL.js.map +0 -1
  263. package/dist/chunk-K57KRAOV.js.map +0 -1
  264. package/dist/chunk-M7JBER5U.js.map +0 -1
  265. package/dist/chunk-NENBUYX5.js +0 -79
  266. package/dist/chunk-NENBUYX5.js.map +0 -1
  267. package/dist/chunk-PIDTEQ3U.js.map +0 -1
  268. package/dist/chunk-PZQVSDLH.js.map +0 -1
  269. package/dist/chunk-RYRIFZCT.js +0 -58
  270. package/dist/chunk-RYRIFZCT.js.map +0 -1
  271. package/dist/chunk-VLYV65LK.js.map +0 -1
  272. package/dist/chunk-W4CXQYSG.js.map +0 -1
  273. package/dist/panel-header.d.ts +0 -42
  274. package/dist/panel-header.js +0 -7
  275. package/dist/panel-header.js.map +0 -1
  276. package/dist/styles/panel-header.css +0 -64
  277. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  278. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  279. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  280. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  281. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  282. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  283. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  284. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  285. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  286. package/docs/design/templates/panel-header/title-only.svg +0 -1
  287. package/docs/design/templates/panel-header-dark.svg +0 -13
  288. package/docs/design/templates/panel-header.svg +0 -13
@@ -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.23` and `kerfjs@5.0.0-beta.23`. 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.25` and `kerfjs@5.0.0-beta.25`. 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/disclosure-arrow`
6
6
 
@@ -25,18 +25,20 @@ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
25
25
 
26
26
  ```ts
27
27
  import { SafeHtml } from 'kerfjs';
28
+ import { D as DividerSides } from './divider-sides-267FA7sY.js';
28
29
 
29
30
  interface ToolbarProps {
30
31
  leading?: SafeHtml;
31
32
  center?: SafeHtml;
32
33
  trailing?: SafeHtml;
33
34
  label?: string;
34
- divider?: boolean;
35
+ /** Physical divider edges in canonical top/right/bottom/left order. Defaults to bottom. */
36
+ dividerSides?: DividerSides;
35
37
  className?: string;
36
38
  }
37
- declare function Toolbar({ leading, center, trailing, label, divider, className, }: ToolbarProps): SafeHtml;
39
+ declare function Toolbar({ leading, center, trailing, label, dividerSides, className, }: ToolbarProps): SafeHtml;
38
40
 
39
- export { Toolbar, type ToolbarProps };
41
+ export { DividerSides, Toolbar, type ToolbarProps };
40
42
  ```
41
43
 
42
44
  ## `@kerfjs/ui/toolbar-text`
@@ -91,6 +93,11 @@ type ToolbarControlGroupAppearance = 'contained' | 'borderless';
91
93
  type ToolbarControlGroupTone = 'default' | 'dark';
92
94
  type ToolbarControlGroupButtonAppearance = 'plain' | 'push';
93
95
  type ToolbarControlGroupShape = 'pill' | 'rounded';
96
+ type ToolbarControlGroupSize = 'default' | 'compact';
97
+ type ToolbarControlGroupDensity = 'comfortable' | 'tight';
98
+ type ToolbarControlGroupContent = 'icon' | 'text' | 'mixed' | 'avatar';
99
+ type ToolbarControlGroupSelectedChrome = 'raised' | 'filled' | 'outline';
100
+ type ToolbarControlGroupSelectedTone = 'brand' | 'neutral';
94
101
  interface ToolbarControlGroupProps {
95
102
  children: SafeHtml | SafeHtml[];
96
103
  label?: string;
@@ -102,10 +109,19 @@ interface ToolbarControlGroupProps {
102
109
  buttonAppearance?: ToolbarControlGroupButtonAppearance;
103
110
  /** Corner shape: fully round `pill` (default) or a softer `rounded` rectangle. */
104
111
  shape?: ToolbarControlGroupShape;
105
- }
106
- declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, }: ToolbarControlGroupProps): SafeHtml;
107
-
108
- export { ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupProps, type ToolbarControlGroupShape, type ToolbarControlGroupTone };
112
+ size?: ToolbarControlGroupSize;
113
+ density?: ToolbarControlGroupDensity;
114
+ content?: ToolbarControlGroupContent;
115
+ selectedChrome?: ToolbarControlGroupSelectedChrome;
116
+ selectedTone?: ToolbarControlGroupSelectedTone;
117
+ /** Size a nested Web Awesome dropdown trigger as part of this group. */
118
+ nestedDropdown?: boolean;
119
+ /** Add contrast behind photo-backed avatar content. */
120
+ scrim?: boolean;
121
+ }
122
+ declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, size, density, content, selectedChrome, selectedTone, nestedDropdown, scrim, }: ToolbarControlGroupProps): SafeHtml;
123
+
124
+ export { ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupContent, type ToolbarControlGroupDensity, type ToolbarControlGroupProps, type ToolbarControlGroupSelectedChrome, type ToolbarControlGroupSelectedTone, type ToolbarControlGroupShape, type ToolbarControlGroupSize, type ToolbarControlGroupTone };
109
125
  ```
110
126
 
111
127
  ## `@kerfjs/ui/floating-toolbar`
@@ -151,6 +167,9 @@ type ListHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undef
151
167
  'data-action'?: never;
152
168
  'data-has-badge'?: never;
153
169
  'data-has-count'?: never;
170
+ 'data-density'?: never;
171
+ 'data-divider'?: never;
172
+ 'data-indicator-tone'?: never;
154
173
  'data-toggle'?: never;
155
174
  }>;
156
175
  type ListHeaderTriggerAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
@@ -162,6 +181,9 @@ type ListHeaderTriggerAttributes = Readonly<Record<`data-${string}`, string | un
162
181
  }>;
163
182
  interface ListHeaderBaseProps {
164
183
  label: string;
184
+ density?: 'standard' | 'compact';
185
+ divider?: 'none' | 'before' | 'after' | 'both';
186
+ indicatorTone?: 'neutral' | 'accent' | 'danger';
165
187
  /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */
166
188
  placeholder?: boolean;
167
189
  rootAttributes?: ListHeaderRootAttributes;
@@ -199,13 +221,20 @@ type ListHeaderIndicatorProps = {
199
221
  count: number;
200
222
  countLabel: string;
201
223
  badge?: never;
224
+ status?: never;
225
+ } | {
226
+ count?: never;
227
+ countLabel?: never;
228
+ badge: SafeHtml;
229
+ status?: never;
202
230
  } | {
203
231
  count?: never;
204
232
  countLabel?: never;
205
- badge?: SafeHtml;
233
+ badge?: never;
234
+ status?: SafeHtml;
206
235
  };
207
236
  type ListHeaderProps = ListHeaderBaseProps & ListHeaderIndicatorProps & ListHeaderModeProps;
208
- declare function ListHeader({ label, count, countLabel, badge, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, }: ListHeaderProps): SafeHtml;
237
+ declare function ListHeader({ label, count, countLabel, badge, status, density, divider, indicatorTone, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, }: ListHeaderProps): SafeHtml;
209
238
 
210
239
  export { ListHeader, type ListHeaderProps };
211
240
  ```
@@ -221,6 +250,10 @@ type ListActionRowRootAttributes = Readonly<Record<`data-${string}`, string | un
221
250
  'data-item-id'?: never;
222
251
  'data-has-icon'?: never;
223
252
  'data-multiline'?: never;
253
+ 'data-density'?: never;
254
+ 'data-divider'?: never;
255
+ 'data-busy'?: never;
256
+ 'data-trailing-visibility'?: never;
224
257
  'data-state'?: never;
225
258
  'data-selected'?: never;
226
259
  'data-pressed'?: never;
@@ -237,6 +270,11 @@ type ListActionRowTrailingAttributes = Readonly<Record<`data-${string}`, string
237
270
  interface ListActionRowProps {
238
271
  /** Visible dormant content for the primary button. Must not contain interactive descendants. */
239
272
  label: string | SafeHtml;
273
+ description?: string | SafeHtml;
274
+ status?: string | SafeHtml;
275
+ busy?: boolean;
276
+ density?: 'standard' | 'compact';
277
+ divider?: 'none' | 'before' | 'after' | 'both';
240
278
  /** Decorative dormant content for the primary button. Must not contain interactive descendants. */
241
279
  icon?: SafeHtml;
242
280
  action: string;
@@ -257,12 +295,13 @@ interface ListActionRowProps {
257
295
  trailingActionIcon: SafeHtml;
258
296
  trailingActionDisabled?: boolean;
259
297
  trailingActionTitle?: string;
298
+ trailingActionVisibility?: 'always' | 'interaction';
260
299
  className?: string;
261
300
  style?: string;
262
301
  rootAttributes?: ListActionRowRootAttributes;
263
302
  trailingActionAttributes?: ListActionRowTrailingAttributes;
264
303
  }
265
- declare function ListActionRow({ label, icon, action, itemId, selected, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, trailingAction, trailingActionLabel, trailingActionIcon, trailingActionDisabled, trailingActionTitle, className, style, rootAttributes, trailingActionAttributes, }: ListActionRowProps): SafeHtml;
304
+ 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, style, rootAttributes, trailingActionAttributes, }: ListActionRowProps): SafeHtml;
266
305
 
267
306
  export { ListActionRow, type ListActionRowProps };
268
307
  ```
@@ -278,12 +317,23 @@ type ListItemRootAttributes = Readonly<Record<`data-${string}`, string | undefin
278
317
  'data-item-id'?: never;
279
318
  'data-has-icon'?: never;
280
319
  'data-multiline'?: never;
320
+ 'data-density'?: never;
321
+ 'data-divider'?: never;
322
+ 'data-busy'?: never;
281
323
  'data-state'?: never;
282
324
  }>;
283
325
  interface ListItemProps {
284
326
  label: string | SafeHtml;
327
+ /** App-owned supporting text rendered in the component's stable label stack. */
328
+ description?: string | SafeHtml;
285
329
  icon?: SafeHtml;
286
330
  trailing?: SafeHtml;
331
+ /** Dormant status metadata rendered before trailing content. */
332
+ status?: string | SafeHtml;
333
+ /** Show a progress indicator and expose the row as busy without replacing its content. */
334
+ busy?: boolean;
335
+ density?: 'standard' | 'compact';
336
+ divider?: 'none' | 'before' | 'after' | 'both';
287
337
  selected?: boolean;
288
338
  action: string;
289
339
  itemId?: string;
@@ -300,7 +350,7 @@ interface ListItemProps {
300
350
  placeholder?: boolean;
301
351
  rootAttributes?: ListItemRootAttributes;
302
352
  }
303
- declare function ListItem({ label, icon, trailing, selected, action, itemId, className, style, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, rootAttributes, }: ListItemProps): SafeHtml;
353
+ declare function ListItem({ label, description, icon, trailing, status, busy, density, divider, selected, action, itemId, className, style, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, rootAttributes, }: ListItemProps): SafeHtml;
304
354
 
305
355
  export { ListItem, type ListItemProps };
306
356
  ```
@@ -356,53 +406,6 @@ declare function ListInsetText({ children, horizontalOnly, className, }: ListIns
356
406
  export { ListInsetText, type ListInsetTextProps };
357
407
  ```
358
408
 
359
- ## `@kerfjs/ui/panel-header`
360
-
361
- ```ts
362
- import { SafeHtml } from 'kerfjs';
363
- import { HeadingLevel } from './toolbar-text.js';
364
-
365
- interface PanelHeaderBaseProps {
366
- title: string;
367
- titleId: string;
368
- icon?: SafeHtml;
369
- iconClassName?: string;
370
- actions?: SafeHtml;
371
- /**
372
- * Expose the title as a heading landmark (`role="heading"` + `aria-level`). Set it
373
- * for a PAGE or view heading so screen-reader heading navigation works and the view
374
- * has a primary heading; omit it (the default) for a dialog title, which is instead
375
- * referenced via `aria-labelledby={titleId}` and needs no heading landmark.
376
- */
377
- headingLevel?: HeadingLevel;
378
- /** Render the title and summary as unanimated loading skeletons, keeping the icon and actions. */
379
- placeholder?: boolean;
380
- }
381
- type PanelHeaderSummaryProps = {
382
- summary: string;
383
- summaryId?: string;
384
- } | {
385
- summary?: never;
386
- summaryId?: never;
387
- };
388
- type PanelHeaderProps = PanelHeaderBaseProps & PanelHeaderSummaryProps;
389
- /**
390
- * The heading of a panel, dialog, or page: a plain `Toolbar` whose leading zone
391
- * holds an optional icon control group and the title as extra-large `ToolbarText`,
392
- * whose trailing zone holds the app's action controls, and with an optional
393
- * subtitle on its own row, left-aligned with the title.
394
- *
395
- * PanelHeader overrides no Toolbar styles — it is just a Toolbar with an xl title.
396
- * The only styling it adds is the icon group's fill/border color and the subtitle.
397
- * When no icon is provided, the icon group is omitted entirely. The `actions` slot
398
- * is passed straight into the toolbar's trailing zone; the app supplies whatever
399
- * trailing controls it needs (typically a `ToolbarControlGroup`).
400
- */
401
- declare function PanelHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions, headingLevel, placeholder, }: PanelHeaderProps): SafeHtml;
402
-
403
- export { PanelHeader, type PanelHeaderProps };
404
- ```
405
-
406
409
  ## `@kerfjs/ui/value-table`
407
410
 
408
411
  ```ts
@@ -441,6 +444,8 @@ type AppTabRootAttributes = Readonly<Record<`data-${string}`, string | undefined
441
444
  'data-tab-dragging'?: never;
442
445
  'data-tab-drop-position'?: never;
443
446
  }>;
447
+ type AppTabPresentation = 'pill' | 'segmented' | 'icon-only';
448
+ type AppTabSize = 'default' | 'compact';
444
449
  interface AppTabProps {
445
450
  id: string;
446
451
  name: string;
@@ -449,6 +454,12 @@ interface AppTabProps {
449
454
  draggable?: boolean;
450
455
  leading?: SafeHtml;
451
456
  trailing?: SafeHtml;
457
+ /** Visual treatment within a TabBar. Icon-only tabs retain `name` as their accessible name. */
458
+ presentation?: AppTabPresentation;
459
+ /** Compact tabs use the 32px application-rail height. */
460
+ size?: AppTabSize;
461
+ /** Maximum visible label width in CSS pixels before ellipsis. */
462
+ labelMaxWidth?: number;
452
463
  /** Decorative dormant content for the close button. Must not contain interactive descendants. */
453
464
  closeIcon?: SafeHtml;
454
465
  selectAction?: string;
@@ -458,9 +469,9 @@ interface AppTabProps {
458
469
  placeholder?: boolean;
459
470
  rootAttributes?: AppTabRootAttributes;
460
471
  }
461
- declare function AppTab({ id, name, selected, closable, draggable, leading, trailing, closeIcon, selectAction, closeAction, className, placeholder, rootAttributes, }: AppTabProps): SafeHtml;
472
+ declare function AppTab({ id, name, selected, closable, draggable, leading, trailing, presentation, size, labelMaxWidth, closeIcon, selectAction, closeAction, className, placeholder, rootAttributes, }: AppTabProps): SafeHtml;
462
473
 
463
- export { AppTab, type AppTabProps };
474
+ export { AppTab, type AppTabPresentation, type AppTabProps, type AppTabSize };
464
475
  ```
465
476
 
466
477
  ## `@kerfjs/ui/tab-bar`
@@ -469,6 +480,9 @@ export { AppTab, type AppTabProps };
469
480
  import { SafeHtml } from 'kerfjs';
470
481
 
471
482
  type TabActivation = 'automatic' | 'manual';
483
+ type TabBarAllocation = 'intrinsic' | 'fill';
484
+ type TabBarPresentation = 'rail' | 'segmented' | 'inspector';
485
+ type TabBarTrailingPlacement = 'separate' | 'adjacent';
472
486
  interface TabBarProps {
473
487
  id: string;
474
488
  label: string;
@@ -483,11 +497,17 @@ interface TabBarProps {
483
497
  * selects with Enter / Space / click — use it when selecting a tab is a heavy action.
484
498
  */
485
499
  activation?: TabActivation;
500
+ /** How available strip width is allocated across child AppTabs. */
501
+ allocation?: TabBarAllocation;
502
+ /** Named strip chrome for application rails, segmented tabs, or inspectors. */
503
+ presentation?: TabBarPresentation;
504
+ /** Keep a trailing action beside the final tab or at the far edge of the bar. */
505
+ trailingPlacement?: TabBarTrailingPlacement;
486
506
  }
487
507
  /** Render a controlled tab strip. The application owns selection, order, and persistence. */
488
- declare function TabBar({ id, label, children, leading, trailing, className, activation, }: TabBarProps): SafeHtml;
508
+ declare function TabBar({ id, label, children, leading, trailing, className, activation, allocation, presentation, trailingPlacement, }: TabBarProps): SafeHtml;
489
509
 
490
- export { type TabActivation, TabBar, type TabBarProps };
510
+ export { type TabActivation, TabBar, type TabBarAllocation, type TabBarPresentation, type TabBarProps, type TabBarTrailingPlacement };
491
511
  ```
492
512
 
493
513
  ## `@kerfjs/ui/wire-tab-bars`
@@ -696,6 +716,7 @@ export { Pane, type PaneContentElement, type PaneElement, type PaneProps, type P
696
716
 
697
717
  ```ts
698
718
  import { SafeHtml } from 'kerfjs';
719
+ import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
699
720
 
700
721
  /** A collapsible Workbench panel — a side rail or the bottom drawer. */
701
722
  interface WorkbenchPanel {
@@ -706,6 +727,13 @@ interface WorkbenchPanel {
706
727
  size?: number;
707
728
  /** Accessible name for the panel region. */
708
729
  label?: string;
730
+ separator?: ResizableRegionSeparator;
731
+ collapseMotion?: ResizableRegionCollapseMotion;
732
+ contentOverflow?: ResizableRegionContentOverflow;
733
+ presentation?: ResizableRegionPresentation;
734
+ /** Control shown in a safe-area-aware viewport corner while collapsed. */
735
+ restoreControl?: SafeHtml;
736
+ restorePosition?: ResizableRegionRestorePosition;
709
737
  }
710
738
  interface WorkbenchProps {
711
739
  id: string;
@@ -735,6 +763,7 @@ export { Workbench, type WorkbenchPanel, type WorkbenchProps };
735
763
  ```ts
736
764
  import { SafeHtml } from 'kerfjs';
737
765
  import { LucideIcon } from './lucide-icon.js';
766
+ import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
738
767
  import 'lucide';
739
768
 
740
769
  /** Which edge a {@link CollapsiblePanel} docks to. */
@@ -784,6 +813,13 @@ interface CollapsiblePanelProps {
784
813
  label?: string;
785
814
  /** Panel content. */
786
815
  children?: SafeHtml | readonly SafeHtml[];
816
+ separator?: ResizableRegionSeparator;
817
+ collapseMotion?: ResizableRegionCollapseMotion;
818
+ contentOverflow?: ResizableRegionContentOverflow;
819
+ presentation?: ResizableRegionPresentation;
820
+ /** Control shown in a safe-area-aware viewport corner while collapsed. */
821
+ restoreControl?: SafeHtml;
822
+ restorePosition?: ResizableRegionRestorePosition;
787
823
  className?: string;
788
824
  }
789
825
  /**
@@ -796,7 +832,7 @@ interface CollapsiblePanelProps {
796
832
  * and persistence semantics, and with `CollapsiblePanelToggle` for the standard
797
833
  * affordance. See `docs/24-collapsible-panel.md`.
798
834
  */
799
- declare function CollapsiblePanel({ id, side, collapsed, size, label, children, className, }: CollapsiblePanelProps): SafeHtml;
835
+ declare function CollapsiblePanel({ id, side, collapsed, size, label, children, separator, collapseMotion, contentOverflow, presentation, restoreControl, restorePosition, className, }: CollapsiblePanelProps): SafeHtml;
800
836
 
801
837
  export { CollapsiblePanel, type CollapsiblePanelProps, type CollapsiblePanelSide, CollapsiblePanelToggle, type CollapsiblePanelToggleProps, collapsiblePanelToggleIcon };
802
838
  ```
@@ -834,6 +870,11 @@ interface WireSidebarOptions {
834
870
  * is always inline.
835
871
  */
836
872
  deviceClass?: ReadonlySignal<DeviceClass>;
873
+ /** Compact devices either overlay the panels (default) or hide them in favor
874
+ * of an application-owned responsive replacement. */
875
+ compactPresentation?: 'overlay' | 'hidden';
876
+ /** Collapse the other panels when one opens in compact overlay mode. */
877
+ exclusiveCompact?: boolean;
837
878
  /** Persistence store (default `globalThis.localStorage`, if present). */
838
879
  storage?: SidebarStorage;
839
880
  }
@@ -844,7 +885,7 @@ interface WireSidebarOptions {
844
885
  * persistence hook. The app owns each `collapsed` signal and the layout; this wire
845
886
  * owns the interaction. Returns a disposer. See `docs/24-collapsible-panel.md`.
846
887
  */
847
- declare function wireSidebar(root: HTMLElement, { panels, deviceClass, storage }: WireSidebarOptions): () => void;
888
+ declare function wireSidebar(root: HTMLElement, { panels, deviceClass, compactPresentation, exclusiveCompact, storage, }: WireSidebarOptions): () => void;
848
889
 
849
890
  export { type SidebarStorage, type WireSidebarOptions, type WireSidebarPanel, wireSidebar };
850
891
  ```
@@ -907,6 +948,11 @@ import { SafeHtml } from 'kerfjs';
907
948
 
908
949
  type ResizableRegionAxis = 'horizontal' | 'vertical';
909
950
  type ResizableRegionEdge = 'start' | 'end';
951
+ type ResizableRegionSeparator = 'auto' | 'hidden';
952
+ type ResizableRegionCollapseMotion = 'none' | 'slide' | 'fade-slide';
953
+ type ResizableRegionContentOverflow = 'clip' | 'auto' | 'visible';
954
+ type ResizableRegionPresentation = 'inline' | 'overlay' | 'hidden';
955
+ type ResizableRegionRestorePosition = 'bottom-start' | 'bottom-end';
910
956
  interface ResizableRegionProps {
911
957
  id: string;
912
958
  label: string;
@@ -917,15 +963,27 @@ interface ResizableRegionProps {
917
963
  edge?: ResizableRegionEdge;
918
964
  collapsed?: boolean;
919
965
  transitioning?: boolean;
966
+ /** Whether the separator line is painted. The resize hit target remains available. */
967
+ separator?: ResizableRegionSeparator;
968
+ /** Keep the track change instant while optionally sliding the fixed-size content. */
969
+ collapseMotion?: ResizableRegionCollapseMotion;
970
+ /** Overflow policy for content such as an open popup inside a bottom drawer. */
971
+ contentOverflow?: ResizableRegionContentOverflow;
972
+ /** Inline layout, an edge overlay, or a responsive replacement that removes the region. */
973
+ presentation?: ResizableRegionPresentation;
974
+ /** Always-available control rendered while collapsed, outside the clipped region. */
975
+ restoreControl?: SafeHtml;
976
+ /** Safe-area-aware viewport corner for `restoreControl`. */
977
+ restorePosition?: ResizableRegionRestorePosition;
920
978
  /** Decorative dormant content for the separator handle. Must not contain interactive descendants. */
921
979
  handleIcon?: SafeHtml;
922
980
  children: SafeHtml | SafeHtml[];
923
981
  }
924
982
  declare const clampRegionSize: (size: number, min: number, max: number) => number;
925
983
  declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
926
- declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, handleIcon, children, }: ResizableRegionProps): SafeHtml;
984
+ declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, separator, collapseMotion, contentOverflow, presentation, restoreControl, restorePosition, handleIcon, children, }: ResizableRegionProps): SafeHtml;
927
985
 
928
- export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionEdge, type ResizableRegionProps, clampRegionSize, resizeRegionFromPointer };
986
+ export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionCollapseMotion, type ResizableRegionContentOverflow, type ResizableRegionEdge, type ResizableRegionPresentation, type ResizableRegionProps, type ResizableRegionRestorePosition, type ResizableRegionSeparator, clampRegionSize, resizeRegionFromPointer };
929
987
  ```
930
988
 
931
989
  ## `@kerfjs/ui/wire-resizable-regions`
@@ -1087,10 +1145,10 @@ interface CatalogProps {
1087
1145
  /** Status line content shown at the start of the detail footer. */
1088
1146
  status?: SafeHtml;
1089
1147
  /**
1090
- * Whether to highlight transparent specimens' outer bounds and non-zero
1091
- * margins. Pass a boolean (rather than omitting the prop) when the active
1092
- * entry can switch between component and composition previews;
1093
- * `wireCatalogGeometryOverlay` keeps the overlay synchronized.
1148
+ * Whether to highlight specimens' computed borders (or transparent outer
1149
+ * bounds) and non-zero margins. Pass a boolean (rather than omitting the
1150
+ * prop) when the active entry can switch between component and composition
1151
+ * previews; `wireCatalogGeometryOverlay` keeps the overlay synchronized.
1094
1152
  */
1095
1153
  geometryOverlay?: boolean;
1096
1154
  selectAction?: string;
@@ -1120,11 +1178,15 @@ type CatalogExampleAlign = 'glyph' | 'inline-control' | 'none';
1120
1178
  type CatalogExampleRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
1121
1179
  'data-catalog-example'?: never;
1122
1180
  'data-catalog-example-stack'?: never;
1181
+ 'data-catalog-example-label'?: never;
1182
+ 'data-catalog-example-note'?: never;
1123
1183
  'data-align'?: never;
1124
1184
  }>;
1125
1185
  type CatalogExampleStackRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
1126
1186
  'data-catalog-example'?: never;
1127
1187
  'data-catalog-example-stack'?: never;
1188
+ 'data-catalog-example-label'?: never;
1189
+ 'data-catalog-example-note'?: never;
1128
1190
  'data-align'?: never;
1129
1191
  }>;
1130
1192
  interface CatalogExampleProps {
@@ -1249,8 +1311,10 @@ interface CatalogRevealOptions {
1249
1311
  declare function revealCatalogEntry(root: HTMLElement, id: string, { block, inline, behavior, media, }?: CatalogRevealOptions): () => void;
1250
1312
  /**
1251
1313
  * Keep a Catalog's opt-in geometry overlay synchronized with its preview.
1252
- * Transparent specimens receive a dashed outer bound and positive margins use
1253
- * devtools-style orange bands. Returns a disposer.
1314
+ * Specimens receive computed border highlights (or a dashed bound when they
1315
+ * have no border and are transparent), while positive computed margins use
1316
+ * devtools-style orange bands. CSS/stylesheet-only changes are observed too.
1317
+ * Returns a disposer.
1254
1318
  */
1255
1319
  declare function wireCatalogGeometryOverlay(root: HTMLElement): () => void;
1256
1320
  /**
@@ -1330,14 +1394,25 @@ interface SelectBaseProps<Value extends string = string> {
1330
1394
  className?: string;
1331
1395
  /** Empty-value hint text shown in the closed control (the native select placeholder). */
1332
1396
  placeholderText?: string;
1397
+ /** Supporting text shown below the control and associated with its combobox. */
1398
+ hint?: string;
1333
1399
  disabled?: boolean;
1334
1400
  fitMenu?: boolean;
1335
1401
  renderSelected?: (choice: SelectChoice<Value>) => SafeHtml;
1336
1402
  /** Render as an unanimated loading skeleton: the label above a static, empty control box. */
1337
1403
  placeholder?: boolean;
1404
+ /** Form (default), borderless toolbar, or intrinsic navigation chrome. */
1405
+ presentation?: 'form' | 'toolbar-borderless' | 'navigation';
1406
+ size?: 'default' | 'compact';
1407
+ /** Show only the selected choice icon while retaining the Select's accessible name. */
1408
+ selectedPresentation?: 'label' | 'icon-only';
1409
+ /** Let an enclosing ToolbarControlGroup paint the composed focus ring. */
1410
+ focusRingOwner?: 'select' | 'group';
1411
+ /** Maximum closed-control label width in CSS pixels before ellipsis. */
1412
+ labelMaxWidth?: number;
1338
1413
  }
1339
1414
  type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName;
1340
- declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, disabled, fitMenu, renderSelected, placeholder, }: SelectProps<Value>): SafeHtml;
1415
+ 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;
1341
1416
 
1342
1417
  export { Select, type SelectChoice, type SelectProps };
1343
1418
  ```
@@ -1352,15 +1427,17 @@ type StateBannerUrgency = 'status' | 'alert';
1352
1427
  interface StateBannerProps {
1353
1428
  title: string;
1354
1429
  detail?: string;
1430
+ /** Optional compact status or count shown beside the title. */
1431
+ badge?: string;
1355
1432
  icon?: SafeHtml;
1356
1433
  action?: SafeHtml;
1357
1434
  tone?: StateBannerTone;
1358
1435
  urgency?: StateBannerUrgency;
1359
1436
  className?: string;
1360
- /** Render the title and detail as unanimated loading skeletons, keeping the icon and tone. */
1437
+ /** Render the title, badge, and detail as unanimated loading skeletons, keeping the icon and tone. */
1361
1438
  placeholder?: boolean;
1362
1439
  }
1363
- declare function StateBanner({ title, detail, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
1440
+ declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
1364
1441
 
1365
1442
  export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
1366
1443
  ```
@@ -1404,7 +1481,7 @@ export { LoadingSpinner, type LoadingSpinnerProps };
1404
1481
  import * as kerfjs from 'kerfjs';
1405
1482
 
1406
1483
  interface SkeletonProps {
1407
- /** Width as any CSS length (e.g. `remify(120px)`, `60%`). Defaults to filling its slot. */
1484
+ /** Width as any browser CSS length (e.g. `7.5rem`, `60%`). Defaults to filling its slot. */
1408
1485
  width?: string;
1409
1486
  /** Height as any CSS length. Defaults to a single text line. */
1410
1487
  height?: string;
@@ -1432,10 +1509,13 @@ export { Skeleton, type SkeletonProps };
1432
1509
  ```ts
1433
1510
  import { SafeHtml } from 'kerfjs';
1434
1511
 
1512
+ type SunkenPanelShape = 'rounded' | 'square';
1435
1513
  interface SunkenPanelProps {
1436
1514
  children?: SafeHtml | readonly SafeHtml[];
1437
1515
  /** Optional accessible landmark name for a distinct application region. */
1438
1516
  ariaLabel?: string;
1517
+ /** Corner shape: a rounded rectangle (default) or square corners. */
1518
+ shape?: SunkenPanelShape;
1439
1519
  className?: string;
1440
1520
  }
1441
1521
  /**
@@ -1443,9 +1523,9 @@ interface SunkenPanelProps {
1443
1523
  * stack. The panel owns its background and padding; children own their own
1444
1524
  * borders and internal geometry.
1445
1525
  */
1446
- declare function SunkenPanel({ children, ariaLabel, className, }: SunkenPanelProps): SafeHtml;
1526
+ declare function SunkenPanel({ children, ariaLabel, shape, className, }: SunkenPanelProps): SafeHtml;
1447
1527
 
1448
- export { SunkenPanel, type SunkenPanelProps };
1528
+ export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
1449
1529
  ```
1450
1530
 
1451
1531
  ## `@kerfjs/ui/token-search-field`
@@ -1578,7 +1658,7 @@ interface TokenSearchCollapsibleOptions {
1578
1658
  collapseOnEmptyBlur?: boolean;
1579
1659
  /** Collapse an empty field on Escape and restore focus to its trigger. Default: true. */
1580
1660
  collapseOnEscape?: boolean;
1581
- /** Focus the editor on expand and the trigger on Escape-collapse. Default: true. */
1661
+ /** Focus the editor on expand/controlled clear and the trigger on Escape-collapse. Default: true. */
1582
1662
  manageFocus?: boolean;
1583
1663
  /**
1584
1664
  * Keep an empty field expanded when focus moves to a caller-owned surface