@kerfjs/ui 5.0.0-beta.29 → 5.0.0-beta.30

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 (224) hide show
  1. package/README.md +43 -8
  2. package/ai/application-ui-diagnostic-ids-v1.json +5 -0
  3. package/ai/compile-time-contracts-v1.json +37 -0
  4. package/ai/compile-time-contracts-v1.schema.json +3 -1
  5. package/ai/component-catalog-v2-overrides.json +198 -1
  6. package/ai/component-catalog-v2.d.ts +22 -0
  7. package/ai/component-catalog-v2.json +488 -32
  8. package/ai/component-catalog-v2.schema.json +51 -0
  9. package/ai/component-catalog.json +251 -36
  10. package/ai/component-catalog.schema.json +23 -0
  11. package/ai/public-api-signatures-v1.md +231 -84
  12. package/ai/skill.md +32 -10
  13. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  14. package/analyzer/index.mjs +247 -5
  15. package/dist/app-tab.d.ts +3 -2
  16. package/dist/app-tab.js +2 -1
  17. package/dist/catalog-resources.d.ts +1 -0
  18. package/dist/catalog.d.ts +7 -6
  19. package/dist/catalog.js +8 -7
  20. package/dist/catalog.js.map +1 -1
  21. package/dist/{chunk-PX3YSS5C.js → chunk-6NDBE2OK.js} +1 -1
  22. package/dist/chunk-6NDBE2OK.js.map +1 -0
  23. package/dist/{chunk-B3A3IVO5.js → chunk-AQFWBG23.js} +3 -3
  24. package/dist/chunk-AQFWBG23.js.map +1 -0
  25. package/dist/{chunk-WNWD54GR.js → chunk-B6JYRX3P.js} +4 -2
  26. package/dist/chunk-B6JYRX3P.js.map +1 -0
  27. package/dist/{chunk-HP2B2L26.js → chunk-CAB6NQ2T.js} +1 -1
  28. package/dist/chunk-CAB6NQ2T.js.map +1 -0
  29. package/dist/{chunk-2NMQW7FX.js → chunk-CK6P5AUK.js} +4 -3
  30. package/dist/chunk-CK6P5AUK.js.map +1 -0
  31. package/dist/{chunk-VCE4MPVE.js → chunk-DAO2VFTT.js} +5 -6
  32. package/dist/chunk-DAO2VFTT.js.map +1 -0
  33. package/dist/{chunk-LPOMRC4C.js → chunk-DYBPI5O2.js} +1 -1
  34. package/dist/chunk-DYBPI5O2.js.map +1 -0
  35. package/dist/{chunk-IJBSZ4NX.js → chunk-E34TE2ZI.js} +4 -3
  36. package/dist/chunk-E34TE2ZI.js.map +1 -0
  37. package/dist/{chunk-4EF2CMYS.js → chunk-I45QO2IZ.js} +8 -7
  38. package/dist/chunk-I45QO2IZ.js.map +1 -0
  39. package/dist/{chunk-JRKSK2HX.js → chunk-I4V3UDSA.js} +1 -1
  40. package/dist/chunk-I4V3UDSA.js.map +1 -0
  41. package/dist/{chunk-FEY65TBV.js → chunk-KFUUFNTS.js} +1 -1
  42. package/dist/chunk-KFUUFNTS.js.map +1 -0
  43. package/dist/{chunk-QO55FN2Y.js → chunk-MFR2IIFG.js} +1 -1
  44. package/dist/chunk-MFR2IIFG.js.map +1 -0
  45. package/dist/{chunk-GWEAPEZI.js → chunk-OC275HHS.js} +4 -3
  46. package/dist/chunk-OC275HHS.js.map +1 -0
  47. package/dist/chunk-OL4TC3U2.js +156 -0
  48. package/dist/chunk-OL4TC3U2.js.map +1 -0
  49. package/dist/{chunk-OT6RPYAP.js → chunk-OMSRSL3B.js} +4 -3
  50. package/dist/chunk-OMSRSL3B.js.map +1 -0
  51. package/dist/{chunk-J5BFYY7Q.js → chunk-RL6COPKF.js} +12 -3
  52. package/dist/chunk-RL6COPKF.js.map +1 -0
  53. package/dist/{chunk-TB6DY7H5.js → chunk-SOK5EUF7.js} +1 -1
  54. package/dist/chunk-SOK5EUF7.js.map +1 -0
  55. package/dist/{chunk-RKVQEH4J.js → chunk-T7DOWS6T.js} +3 -3
  56. package/dist/chunk-T7DOWS6T.js.map +1 -0
  57. package/dist/{chunk-7KEUJIIC.js → chunk-TIGSG6BX.js} +1 -1
  58. package/dist/chunk-TIGSG6BX.js.map +1 -0
  59. package/dist/{chunk-W5L2JSBY.js → chunk-UDHHKZWO.js} +6 -5
  60. package/dist/chunk-UDHHKZWO.js.map +1 -0
  61. package/dist/{chunk-R7ZWUN64.js → chunk-V6GQKOX2.js} +4 -3
  62. package/dist/chunk-V6GQKOX2.js.map +1 -0
  63. package/dist/{chunk-KWWR5VMS.js → chunk-V6HCTCVD.js} +4 -3
  64. package/dist/chunk-V6HCTCVD.js.map +1 -0
  65. package/dist/{chunk-JFGXQBIP.js → chunk-VDUJZF5G.js} +76 -13
  66. package/dist/chunk-VDUJZF5G.js.map +1 -0
  67. package/dist/{chunk-SYDMYBPG.js → chunk-VXFGMDA7.js} +1 -1
  68. package/dist/chunk-VXFGMDA7.js.map +1 -0
  69. package/dist/{chunk-YMKH5XTF.js → chunk-WN52USHV.js} +2 -2
  70. package/dist/{chunk-YMKH5XTF.js.map → chunk-WN52USHV.js.map} +1 -1
  71. package/dist/{chunk-OBLTAKSX.js → chunk-WSXUPSID.js} +1 -1
  72. package/dist/chunk-WSXUPSID.js.map +1 -0
  73. package/dist/{chunk-X2U3QJCJ.js → chunk-ZPWZIVI6.js} +1 -1
  74. package/dist/chunk-ZPWZIVI6.js.map +1 -0
  75. package/dist/collapsible-panel.d.ts +5 -2
  76. package/dist/collapsible-panel.js.map +1 -1
  77. package/dist/css-values.d.ts +75 -0
  78. package/dist/css-values.js +3 -0
  79. package/dist/css-values.js.map +1 -0
  80. package/dist/empty-state.d.ts +2 -1
  81. package/dist/empty-state.js +1 -1
  82. package/dist/floating-toolbar.d.ts +4 -3
  83. package/dist/floating-toolbar.js +1 -1
  84. package/dist/index.d.ts +2 -0
  85. package/dist/index.js +26 -25
  86. package/dist/list-action-row.d.ts +1 -2
  87. package/dist/list-action-row.js +2 -1
  88. package/dist/list-header.d.ts +1 -1
  89. package/dist/list-header.js +2 -1
  90. package/dist/list-inset-control.d.ts +4 -3
  91. package/dist/list-inset-control.js +1 -1
  92. package/dist/list-inset-text.d.ts +4 -3
  93. package/dist/list-inset-text.js +1 -1
  94. package/dist/list-item.d.ts +4 -3
  95. package/dist/list-item.js +2 -1
  96. package/dist/list.d.ts +10 -8
  97. package/dist/list.js +2 -1
  98. package/dist/nav-stack.d.ts +9 -6
  99. package/dist/nav-stack.js +2 -1
  100. package/dist/pane.d.ts +6 -5
  101. package/dist/pane.js +1 -1
  102. package/dist/resizable-region.d.ts +2 -1
  103. package/dist/resizable-region.js +1 -1
  104. package/dist/segmented-control.d.ts +4 -3
  105. package/dist/segmented-control.js +2 -1
  106. package/dist/select.d.ts +3 -1
  107. package/dist/select.js +2 -1
  108. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  109. package/dist/skeleton.d.ts +7 -6
  110. package/dist/skeleton.js +2 -1
  111. package/dist/split-view.d.ts +5 -4
  112. package/dist/split-view.js +3 -2
  113. package/dist/split-view.js.map +1 -1
  114. package/dist/state-banner.d.ts +3 -2
  115. package/dist/state-banner.js +2 -1
  116. package/dist/styles/catalog.css +8 -1
  117. package/dist/styles/collapsible-panel.css +6 -2
  118. package/dist/styles/foundation.css +44 -0
  119. package/dist/styles/list-header.css +6 -0
  120. package/dist/styles/list-item.css +9 -0
  121. package/dist/styles/nav-stack.css +32 -2
  122. package/dist/styles/segmented-control.css +8 -1
  123. package/dist/styles/select.css +2 -1
  124. package/dist/styles/state-banner.css +14 -0
  125. package/dist/styles/tab-scaffold.css +1 -0
  126. package/dist/styles/token-search-field.css +4 -0
  127. package/dist/styles/toolbar-control-group.css +98 -16
  128. package/dist/styles/webawesome.css +22 -0
  129. package/dist/styles/workbench.css +4 -0
  130. package/dist/sunken-panel.d.ts +4 -3
  131. package/dist/sunken-panel.js +1 -1
  132. package/dist/surface-scaffold.d.ts +6 -5
  133. package/dist/surface-scaffold.js +1 -1
  134. package/dist/tab-bar.d.ts +6 -5
  135. package/dist/tab-bar.js +1 -1
  136. package/dist/tab-scaffold.d.ts +2 -1
  137. package/dist/tab-scaffold.js.map +1 -1
  138. package/dist/token-search-field.d.ts +5 -4
  139. package/dist/token-search-field.js +1 -1
  140. package/dist/toolbar-control-group.d.ts +10 -4
  141. package/dist/toolbar-control-group.js +1 -1
  142. package/dist/toolbar-text.js +2 -1
  143. package/dist/toolbar.d.ts +6 -5
  144. package/dist/toolbar.js +1 -1
  145. package/dist/value-table.d.ts +4 -2
  146. package/dist/value-table.js +2 -1
  147. package/dist/wire-nav-stack.d.ts +4 -1
  148. package/dist/wire-nav-stack.js +125 -0
  149. package/dist/wire-nav-stack.js.map +1 -1
  150. package/dist/wire-resizable-regions.js +1 -1
  151. package/dist/wire-tab-bars.d.ts +1 -0
  152. package/dist/wire-token-search-fields.js +1 -1
  153. package/dist/workbench.d.ts +7 -4
  154. package/dist/workbench.js.map +1 -1
  155. package/docs/accessibility.md +9 -3
  156. package/docs/collapsible-panel.md +4 -1
  157. package/docs/component-contract.md +56 -8
  158. package/docs/component-selection.md +45 -8
  159. package/docs/design/templates/list/compact-dark.svg +1 -1
  160. package/docs/design/templates/list/compact.svg +1 -1
  161. package/docs/design/templates/list/stack-dark.svg +1 -1
  162. package/docs/design/templates/list/stack.svg +1 -1
  163. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  164. package/docs/design/templates/list-action-row/default.svg +1 -1
  165. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  166. package/docs/design/templates/list-action-row/selected.svg +1 -1
  167. package/docs/design/templates/list-action-row-dark.svg +1 -1
  168. package/docs/design/templates/list-action-row.svg +1 -1
  169. package/docs/design/templates/list-dark.svg +1 -1
  170. package/docs/design/templates/list-item/default-dark.svg +1 -1
  171. package/docs/design/templates/list-item/default.svg +1 -1
  172. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  173. package/docs/design/templates/list-item/multiline.svg +1 -1
  174. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  175. package/docs/design/templates/list-item/selected.svg +1 -1
  176. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  177. package/docs/design/templates/list-item/trailing.svg +1 -1
  178. package/docs/design/templates/list-item-dark.svg +1 -1
  179. package/docs/design/templates/list-item.svg +1 -1
  180. package/docs/design/templates/list.svg +1 -1
  181. package/docs/design-philosophy.md +4 -2
  182. package/docs/examples/component-catalog-extension-v2.json +2 -0
  183. package/docs/layout.md +12 -4
  184. package/docs/nav-stack.md +29 -8
  185. package/docs/recipes.md +8 -4
  186. package/docs/split-view.md +6 -0
  187. package/docs/surface-scaffold.md +8 -0
  188. package/docs/tab-scaffold.md +3 -1
  189. package/docs/type-contracts.md +39 -12
  190. package/docs/ui-analyzer.md +17 -3
  191. package/docs/ui-doctor.md +7 -0
  192. package/docs/ux-demo.md +10 -4
  193. package/docs/webawesome-theme.md +6 -0
  194. package/docs/workbench.md +6 -4
  195. package/llms.txt +46 -6
  196. package/package.json +5 -1
  197. package/ux-demo/recipes/compact-toolbar.tsx +10 -9
  198. package/ux-demo/recipes/composer-form.tsx +6 -3
  199. package/ux-demo/recipes/loading-inspector.tsx +2 -1
  200. package/dist/chunk-2NMQW7FX.js.map +0 -1
  201. package/dist/chunk-4EF2CMYS.js.map +0 -1
  202. package/dist/chunk-7KEUJIIC.js.map +0 -1
  203. package/dist/chunk-B3A3IVO5.js.map +0 -1
  204. package/dist/chunk-FEY65TBV.js.map +0 -1
  205. package/dist/chunk-GWEAPEZI.js.map +0 -1
  206. package/dist/chunk-HP2B2L26.js.map +0 -1
  207. package/dist/chunk-IJBSZ4NX.js.map +0 -1
  208. package/dist/chunk-J5BFYY7Q.js.map +0 -1
  209. package/dist/chunk-JFGXQBIP.js.map +0 -1
  210. package/dist/chunk-JRKSK2HX.js.map +0 -1
  211. package/dist/chunk-KWWR5VMS.js.map +0 -1
  212. package/dist/chunk-LPOMRC4C.js.map +0 -1
  213. package/dist/chunk-OBLTAKSX.js.map +0 -1
  214. package/dist/chunk-OT6RPYAP.js.map +0 -1
  215. package/dist/chunk-PX3YSS5C.js.map +0 -1
  216. package/dist/chunk-QO55FN2Y.js.map +0 -1
  217. package/dist/chunk-R7ZWUN64.js.map +0 -1
  218. package/dist/chunk-RKVQEH4J.js.map +0 -1
  219. package/dist/chunk-SYDMYBPG.js.map +0 -1
  220. package/dist/chunk-TB6DY7H5.js.map +0 -1
  221. package/dist/chunk-VCE4MPVE.js.map +0 -1
  222. package/dist/chunk-W5L2JSBY.js.map +0 -1
  223. package/dist/chunk-WNWD54GR.js.map +0 -1
  224. package/dist/chunk-X2U3QJCJ.js.map +0 -1
@@ -1,6 +1,86 @@
1
1
  # Public API signatures for the UI authoring corpus
2
2
 
3
- Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.29` and `kerfjs@5.0.0-beta.29`. 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.30` and `kerfjs@5.0.0-beta.30`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
4
+
5
+ ## `@kerfjs/ui/css-values`
6
+
7
+ ```ts
8
+ declare const cssValueBrand: unique symbol;
9
+ declare const cssLengthBrand: unique symbol;
10
+ declare const cssLengthExpressionBrand: unique symbol;
11
+ declare const cssFlexBrand: unique symbol;
12
+ declare const cssColorBrand: unique symbol;
13
+ /**
14
+ * A complete typed CSS value minted by a property-specific Kerf UI builder.
15
+ *
16
+ * This brand is an authoring correctness aid, not a sanitizer or security
17
+ * boundary. Prefer the narrower property grammar, such as {@link CssLength},
18
+ * whenever one is available.
19
+ */
20
+ type CssValue = string & {
21
+ readonly [cssValueBrand]: 'CssValue';
22
+ };
23
+ /**
24
+ * A complete CSS length-percentage value suitable for dimension-valued UI
25
+ * props. Despite the concise name, percentages are intentionally included.
26
+ */
27
+ type CssLength = CssValue & {
28
+ readonly [cssLengthBrand]: 'CssLength';
29
+ };
30
+ /**
31
+ * An incomplete arithmetic expression. Wrap it with {@link calc} before
32
+ * passing it to a prop that accepts {@link CssLength}.
33
+ */
34
+ type CssLengthExpression = string & {
35
+ readonly [cssLengthExpressionBrand]: 'CssLengthExpression';
36
+ };
37
+ /** A complete CSS `flex` shorthand. It is not interchangeable with a length. */
38
+ type CssFlex = CssValue & {
39
+ readonly [cssFlexBrand]: 'CssFlex';
40
+ };
41
+ /** A complete CSS color value. It is not interchangeable with a length. */
42
+ type CssColor = CssValue & {
43
+ readonly [cssColorBrand]: 'CssColor';
44
+ };
45
+ type CssFlexKeyword = 'none' | 'auto' | 'initial';
46
+ type CssFlexBasis = CssLength | 'auto' | 'content' | 'min-content' | 'max-content' | 'fit-content';
47
+ type CssSizeKeyword = 'auto' | 'min-content' | 'max-content' | 'fit-content';
48
+ /** A complete width/height value accepted by dimension-valued UI props. */
49
+ type CssSize = CssLength | CssSizeKeyword;
50
+ 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
+ /** Names of the public `--kui-color-*` semantic tokens. */
52
+ type UiColorName = (typeof uiColorNames)[number];
53
+ /** Kerf UI's complete spacing-token vocabulary. `s` and `xl` are exceptions. */
54
+ type UiSpaceName = 'none' | '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl';
55
+ /** Create a complete pixel length. */
56
+ declare function px(value: number): CssLength;
57
+ /** Create a complete root-font-relative length. */
58
+ declare function rem(value: number): CssLength;
59
+ /** Create a complete current-font-relative length. */
60
+ declare function em(value: number): CssLength;
61
+ /** Create a complete percentage length. */
62
+ declare function pct(value: number): CssLength;
63
+ /** Resolve a Kerf UI spacing step to its public custom property. */
64
+ declare function space(name: UiSpaceName): CssLength;
65
+ /**
66
+ * Reference an application-owned custom property whose contract is a CSS
67
+ * length-percentage. The deliberately narrow name grammar keeps this helper
68
+ * from becoming an arbitrary CSS-string constructor.
69
+ */
70
+ declare function lengthVar(name: `--${string}`, fallback?: CssLength): CssLength;
71
+ /** Combine two or more complete lengths into a non-standalone sum. */
72
+ declare function plus(first: CssLength, second: CssLength, ...rest: readonly CssLength[]): CssLengthExpression;
73
+ /** Turn a typed length expression into a complete CSS `calc()` value. */
74
+ declare function calc(expression: CssLengthExpression): CssLength;
75
+ /** Build a complete, structured CSS flex shorthand. */
76
+ 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;
79
+ /** Reference an application-owned custom property whose contract is a color. */
80
+ declare function colorVar(name: `--${string}`, fallback?: CssColor): CssColor;
81
+
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 };
83
+ ```
4
84
 
5
85
  ## `@kerfjs/ui/disclosure-arrow`
6
86
 
@@ -24,19 +104,20 @@ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
24
104
  ## `@kerfjs/ui/toolbar`
25
105
 
26
106
  ```ts
27
- import { SafeHtml } from 'kerfjs';
107
+ import * as kerfjs from 'kerfjs';
28
108
  import { D as DividerSides } from './divider-sides-267FA7sY.js';
109
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
29
110
 
30
111
  interface ToolbarProps {
31
- leading?: SafeHtml;
32
- center?: SafeHtml;
33
- trailing?: SafeHtml;
112
+ leading?: KerfUiContent;
113
+ center?: KerfUiContent;
114
+ trailing?: KerfUiContent;
34
115
  label?: string;
35
116
  /** Physical divider edges in canonical top/right/bottom/left order. Defaults to bottom. */
36
117
  dividerSides?: DividerSides;
37
118
  className?: string;
38
119
  }
39
- declare function Toolbar({ leading, center, trailing, label, dividerSides, className, }: ToolbarProps): SafeHtml;
120
+ declare function Toolbar({ leading, center, trailing, label, dividerSides, className, }: ToolbarProps): kerfjs.SafeHtml;
40
121
 
41
122
  export { DividerSides, Toolbar, type ToolbarProps };
42
123
  ```
@@ -87,7 +168,8 @@ export { type HeadingLevel, ToolbarText, type ToolbarTextProps, type ToolbarText
87
168
  ## `@kerfjs/ui/toolbar-control-group`
88
169
 
89
170
  ```ts
90
- import { SafeHtml } from 'kerfjs';
171
+ import * as kerfjs from 'kerfjs';
172
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
91
173
 
92
174
  type ToolbarControlGroupAppearance = 'contained' | 'borderless';
93
175
  type ToolbarControlGroupTone = 'default' | 'dark';
@@ -97,9 +179,9 @@ type ToolbarControlGroupSize = 'default' | 'compact';
97
179
  type ToolbarControlGroupDensity = 'comfortable' | 'tight';
98
180
  type ToolbarControlGroupContent = 'icon' | 'text' | 'mixed' | 'avatar';
99
181
  type ToolbarControlGroupSelectedChrome = 'raised' | 'filled' | 'outline';
100
- type ToolbarControlGroupSelectedTone = 'brand' | 'neutral';
182
+ type ToolbarControlGroupSelectedTone = 'brand' | 'neutral' | 'pop';
101
183
  interface ToolbarControlGroupProps {
102
- children: SafeHtml | SafeHtml[];
184
+ children: KerfUiContent;
103
185
  label?: string;
104
186
  className?: string;
105
187
  expanded?: boolean;
@@ -118,8 +200,13 @@ interface ToolbarControlGroupProps {
118
200
  nestedDropdown?: boolean;
119
201
  /** Add contrast behind photo-backed avatar content. */
120
202
  scrim?: boolean;
203
+ /**
204
+ * Avatar image URL. A single-control group paints it on the group; a
205
+ * multi-control group paints it only on the pressed selection highlight.
206
+ */
207
+ avatarImage?: string;
121
208
  }
122
- declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, size, density, content, selectedChrome, selectedTone, nestedDropdown, scrim, }: ToolbarControlGroupProps): SafeHtml;
209
+ declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, size, density, content, selectedChrome, selectedTone, nestedDropdown, scrim, avatarImage, }: ToolbarControlGroupProps): kerfjs.SafeHtml;
123
210
 
124
211
  export { ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupContent, type ToolbarControlGroupDensity, type ToolbarControlGroupProps, type ToolbarControlGroupSelectedChrome, type ToolbarControlGroupSelectedTone, type ToolbarControlGroupShape, type ToolbarControlGroupSize, type ToolbarControlGroupTone };
125
212
  ```
@@ -127,13 +214,14 @@ export { ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarCo
127
214
  ## `@kerfjs/ui/floating-toolbar`
128
215
 
129
216
  ```ts
130
- import { SafeHtml } from 'kerfjs';
217
+ import * as kerfjs from 'kerfjs';
218
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
131
219
 
132
220
  /** Where a {@link FloatingToolbar} floats within its positioned container. */
133
221
  type FloatingToolbarPosition = 'bottom' | 'bottom-start' | 'bottom-end' | 'top' | 'top-start' | 'top-end';
134
222
  interface FloatingToolbarProps {
135
223
  /** Toolbar contents — normally one or more `ToolbarControlGroup`s. */
136
- children: SafeHtml | SafeHtml[];
224
+ children: KerfUiContent;
137
225
  /** Accessible name for the toolbar (required — it exposes `role="toolbar"`). */
138
226
  label: string;
139
227
  /**
@@ -152,7 +240,7 @@ interface FloatingToolbarProps {
152
240
  * top toolbar's own inset); override that token to move it. The app owns the
153
241
  * controls and their behavior — wire them with `delegate()` as usual.
154
242
  */
155
- declare function FloatingToolbar({ children, label, position, className, }: FloatingToolbarProps): SafeHtml;
243
+ declare function FloatingToolbar({ children, label, position, className, }: FloatingToolbarProps): kerfjs.SafeHtml;
156
244
 
157
245
  export { FloatingToolbar, type FloatingToolbarPosition, type FloatingToolbarProps };
158
246
  ```
@@ -183,7 +271,7 @@ interface ListHeaderBaseProps {
183
271
  label: string;
184
272
  density?: 'standard' | 'compact';
185
273
  divider?: 'none' | 'before' | 'after' | 'both';
186
- indicatorTone?: 'neutral' | 'accent' | 'danger';
274
+ indicatorTone?: 'neutral' | 'accent' | 'pop' | 'danger';
187
275
  /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */
188
276
  placeholder?: boolean;
189
277
  rootAttributes?: ListHeaderRootAttributes;
@@ -239,6 +327,32 @@ declare function ListHeader({ label, count, countLabel, badge, status, density,
239
327
  export { ListHeader, type ListHeaderProps };
240
328
  ```
241
329
 
330
+ ## `@kerfjs/ui/list`
331
+
332
+ ```ts
333
+ import * as kerfjs from 'kerfjs';
334
+ import { UiSpaceName, CssLength, CssFlexKeyword, CssFlex } from './css-values.js';
335
+ import { D as DividerSides } from './divider-sides-267FA7sY.js';
336
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
337
+
338
+ interface ListProps {
339
+ children?: KerfUiContent;
340
+ /** Use the standard item gap, a named UI spacing token, or a typed CSS length. Defaults to no gap. */
341
+ gap?: boolean | UiSpaceName | CssLength;
342
+ /** Allow this list to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */
343
+ flex?: boolean | CssFlexKeyword | CssFlex;
344
+ /** Own vertical scrolling and overscroll containment. */
345
+ scrollable?: boolean;
346
+ /** Physical divider edges in canonical top/right/bottom/left order. */
347
+ dividerSides?: DividerSides;
348
+ className?: string;
349
+ }
350
+ /** A stretch-aligned vertical stack with optional gap, flex, scroll, and dividers. */
351
+ declare function List({ children, gap, flex, scrollable, dividerSides, className, }: ListProps): kerfjs.SafeHtml;
352
+
353
+ export { CssFlex, CssFlexKeyword, CssLength, DividerSides, List, type ListProps, UiSpaceName };
354
+ ```
355
+
242
356
  ## `@kerfjs/ui/list-action-row`
243
357
 
244
358
  ```ts
@@ -297,11 +411,10 @@ interface ListActionRowProps {
297
411
  trailingActionTitle?: string;
298
412
  trailingActionVisibility?: 'always' | 'interaction';
299
413
  className?: string;
300
- style?: string;
301
414
  rootAttributes?: ListActionRowRootAttributes;
302
415
  trailingActionAttributes?: ListActionRowTrailingAttributes;
303
416
  }
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;
417
+ 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;
305
418
 
306
419
  export { ListActionRow, type ListActionRowProps };
307
420
  ```
@@ -310,12 +423,14 @@ export { ListActionRow, type ListActionRowProps };
310
423
 
311
424
  ```ts
312
425
  import { SafeHtml } from 'kerfjs';
426
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
313
427
 
314
428
  type ListItemRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
315
429
  'data-component'?: never;
316
430
  'data-action'?: never;
317
431
  'data-item-id'?: never;
318
432
  'data-has-icon'?: never;
433
+ 'data-has-description'?: never;
319
434
  'data-multiline'?: never;
320
435
  'data-density'?: never;
321
436
  'data-divider'?: never;
@@ -327,7 +442,7 @@ interface ListItemProps {
327
442
  /** App-owned supporting text rendered in the component's stable label stack. */
328
443
  description?: string | SafeHtml;
329
444
  icon?: SafeHtml;
330
- trailing?: SafeHtml;
445
+ trailing?: KerfUiContent;
331
446
  /** Dormant status metadata rendered before trailing content. */
332
447
  status?: string | SafeHtml;
333
448
  /** Show a progress indicator and expose the row as busy without replacing its content. */
@@ -338,7 +453,6 @@ interface ListItemProps {
338
453
  action: string;
339
454
  itemId?: string;
340
455
  className?: string;
341
- style?: string;
342
456
  pressed?: boolean;
343
457
  accessibleLabel?: string;
344
458
  title?: string;
@@ -350,7 +464,7 @@ interface ListItemProps {
350
464
  placeholder?: boolean;
351
465
  rootAttributes?: ListItemRootAttributes;
352
466
  }
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;
467
+ 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;
354
468
 
355
469
  export { ListItem, type ListItemProps };
356
470
  ```
@@ -358,11 +472,12 @@ export { ListItem, type ListItemProps };
358
472
  ## `@kerfjs/ui/list-inset-control`
359
473
 
360
474
  ```ts
361
- import { SafeHtml } from 'kerfjs';
475
+ import * as kerfjs from 'kerfjs';
476
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
362
477
 
363
478
  interface ListInsetControlProps {
364
479
  /** Control(s) that own their own border and padding (e.g. an input, a `wa-*`). */
365
- children: SafeHtml | SafeHtml[];
480
+ children: KerfUiContent;
366
481
  className?: string;
367
482
  }
368
483
  /**
@@ -371,7 +486,7 @@ interface ListInsetControlProps {
371
486
  * Use it for controls that carry their own border and padding but no outer margin
372
487
  * — the wrapper adds only the alignment margin and layout, not a second inset.
373
488
  */
374
- declare function ListInsetControl({ children, className, }: ListInsetControlProps): SafeHtml;
489
+ declare function ListInsetControl({ children, className, }: ListInsetControlProps): kerfjs.SafeHtml;
375
490
 
376
491
  export { ListInsetControl, type ListInsetControlProps };
377
492
  ```
@@ -379,11 +494,12 @@ export { ListInsetControl, type ListInsetControlProps };
379
494
  ## `@kerfjs/ui/list-inset-text`
380
495
 
381
496
  ```ts
382
- import { SafeHtml } from 'kerfjs';
497
+ import * as kerfjs from 'kerfjs';
498
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
383
499
 
384
500
  interface ListInsetTextProps {
385
501
  /** Text (or inline content) that carries no margin, border, or padding of its own. */
386
- children: SafeHtml | SafeHtml[] | string;
502
+ children: KerfUiContent | string;
387
503
  /**
388
504
  * Keep only the horizontal geometry (inline margin, left/right border, and
389
505
  * left/right padding) and drop the vertical margin, border, and padding. Use it
@@ -401,7 +517,7 @@ interface ListInsetTextProps {
401
517
  * Pass `horizontalOnly` to keep the horizontal inset but drop the vertical box
402
518
  * space for tight text layout.
403
519
  */
404
- declare function ListInsetText({ children, horizontalOnly, className, }: ListInsetTextProps): SafeHtml;
520
+ declare function ListInsetText({ children, horizontalOnly, className, }: ListInsetTextProps): kerfjs.SafeHtml;
405
521
 
406
522
  export { ListInsetText, type ListInsetTextProps };
407
523
  ```
@@ -409,7 +525,9 @@ export { ListInsetText, type ListInsetTextProps };
409
525
  ## `@kerfjs/ui/value-table`
410
526
 
411
527
  ```ts
528
+ import * as kerfjs from 'kerfjs';
412
529
  import { SafeHtml } from 'kerfjs';
530
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
413
531
 
414
532
  interface ValueTableRowProps {
415
533
  label: string | SafeHtml;
@@ -424,9 +542,9 @@ declare function ValueTableRow({ label, value, icon, className, placeholder, }:
424
542
  interface ValueTableProps {
425
543
  label: string;
426
544
  className?: string;
427
- children: SafeHtml | readonly SafeHtml[];
545
+ children: KerfUiContent;
428
546
  }
429
- declare function ValueTable({ label, className, children, }: ValueTableProps): SafeHtml;
547
+ declare function ValueTable({ label, className, children, }: ValueTableProps): kerfjs.SafeHtml;
430
548
 
431
549
  export { ValueTable, type ValueTableProps, ValueTableRow, type ValueTableRowProps };
432
550
  ```
@@ -435,6 +553,7 @@ export { ValueTable, type ValueTableProps, ValueTableRow, type ValueTableRowProp
435
553
 
436
554
  ```ts
437
555
  import { SafeHtml } from 'kerfjs';
556
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
438
557
 
439
558
  type AppTabRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
440
559
  'data-component'?: never;
@@ -452,8 +571,8 @@ interface AppTabProps {
452
571
  selected?: boolean;
453
572
  closable?: boolean;
454
573
  draggable?: boolean;
455
- leading?: SafeHtml;
456
- trailing?: SafeHtml;
574
+ leading?: KerfUiContent;
575
+ trailing?: KerfUiContent;
457
576
  /** Visual treatment within a TabBar. Icon-only tabs retain `name` as their accessible name. */
458
577
  presentation?: AppTabPresentation;
459
578
  /** Compact tabs use the 32px application-rail height. */
@@ -477,7 +596,8 @@ export { AppTab, type AppTabPresentation, type AppTabProps, type AppTabSize };
477
596
  ## `@kerfjs/ui/tab-bar`
478
597
 
479
598
  ```ts
480
- import { SafeHtml } from 'kerfjs';
599
+ import * as kerfjs from 'kerfjs';
600
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
481
601
 
482
602
  type TabActivation = 'automatic' | 'manual';
483
603
  type TabBarAllocation = 'intrinsic' | 'fill';
@@ -486,9 +606,9 @@ type TabBarTrailingPlacement = 'separate' | 'adjacent';
486
606
  interface TabBarProps {
487
607
  id: string;
488
608
  label: string;
489
- children: SafeHtml | readonly SafeHtml[];
490
- leading?: SafeHtml;
491
- trailing?: SafeHtml;
609
+ children: KerfUiContent;
610
+ leading?: KerfUiContent;
611
+ trailing?: KerfUiContent;
492
612
  className?: string;
493
613
  /**
494
614
  * Keyboard activation mode for this strip, emitted as `data-tab-activation` for
@@ -505,7 +625,7 @@ interface TabBarProps {
505
625
  trailingPlacement?: TabBarTrailingPlacement;
506
626
  }
507
627
  /** Render a controlled tab strip. The application owns selection, order, and persistence. */
508
- declare function TabBar({ id, label, children, leading, trailing, className, activation, allocation, presentation, trailingPlacement, }: TabBarProps): SafeHtml;
628
+ declare function TabBar({ id, label, children, leading, trailing, className, activation, allocation, presentation, trailingPlacement, }: TabBarProps): kerfjs.SafeHtml;
509
629
 
510
630
  export { type TabActivation, TabBar, type TabBarAllocation, type TabBarPresentation, type TabBarProps, type TabBarTrailingPlacement };
511
631
  ```
@@ -515,6 +635,7 @@ export { type TabActivation, TabBar, type TabBarAllocation, type TabBarPresentat
515
635
  ```ts
516
636
  import { TabActivation } from './tab-bar.js';
517
637
  import 'kerfjs';
638
+ import './semantic-content-BbzjvSu9.js';
518
639
 
519
640
  type TabReorderSource = 'pointer' | 'keyboard';
520
641
  type TabDropPosition = 'before' | 'after';
@@ -551,7 +672,8 @@ export { TabActivation, type TabDropPosition, type TabReorder, type TabReorderSo
551
672
  ## `@kerfjs/ui/nav-stack`
552
673
 
553
674
  ```ts
554
- import { SafeHtml } from 'kerfjs';
675
+ import * as kerfjs from 'kerfjs';
676
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
555
677
 
556
678
  /**
557
679
  * One entry in a {@link NavStack}. The app owns the stack as an array (usually a
@@ -560,11 +682,13 @@ import { SafeHtml } from 'kerfjs';
560
682
  interface NavStackView {
561
683
  /** Stable identity for keyed reconcile and transition direction. */
562
684
  key: string;
563
- content: SafeHtml;
685
+ content: KerfUiContent;
564
686
  /** Title shown in the top toolbar for this view. */
565
687
  title?: string;
566
688
  /** Trailing actions for this view's top toolbar. */
567
- toolbar?: SafeHtml;
689
+ toolbar?: KerfUiContent;
690
+ /** Bottom toolbar for this view. Cross-fades with the top chrome on navigation. */
691
+ bottomToolbar?: KerfUiContent;
568
692
  }
569
693
  interface NavStackProps {
570
694
  id: string;
@@ -576,8 +700,8 @@ interface NavStackProps {
576
700
  backLabel?: string;
577
701
  /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */
578
702
  hideToolbar?: boolean;
579
- /** Optional persistent bottom toolbar. */
580
- bottomToolbar?: SafeHtml;
703
+ /** Optional persistent bottom toolbar used when the active view does not provide one. */
704
+ bottomToolbar?: KerfUiContent;
581
705
  className?: string;
582
706
  }
583
707
  /**
@@ -586,7 +710,7 @@ interface NavStackProps {
586
710
  * cross-fades the chrome across a change. A single-pane layout is a `NavStack`
587
711
  * with one entry. See `docs/23-app-layouts.md` §3.1.
588
712
  */
589
- declare function NavStack({ id, label, views, backLabel, hideToolbar, bottomToolbar, className, }: NavStackProps): SafeHtml;
713
+ declare function NavStack({ id, label, views, backLabel, hideToolbar, bottomToolbar, className, }: NavStackProps): kerfjs.SafeHtml;
590
714
 
591
715
  export { NavStack, type NavStackProps, type NavStackView };
592
716
  ```
@@ -604,7 +728,10 @@ interface WireNavStackOptions {
604
728
  * Animate a `NavStack`'s push/pop transitions and wire its back control. The app
605
729
  * owns the stack (a signal of `NavStackView[]`) and re-renders `NavStack` when it
606
730
  * changes; this helper slides the content and settles the chrome across each
607
- * change, and calls `onBack` when the back control is used. Returns a disposer.
731
+ * change, moves focus into every new top view, restores that view's last focused
732
+ * descendant on pop, and calls `onBack` when the back control is used. Mark a
733
+ * preferred initial target with `data-nav-focus`; otherwise the first focusable
734
+ * descendant (or the view itself) receives focus. Returns a disposer.
608
735
  */
609
736
  declare function wireNavStack(root: Element, options?: WireNavStackOptions): () => void;
610
737
 
@@ -614,7 +741,8 @@ export { type WireNavStackOptions, wireNavStack };
614
741
  ## `@kerfjs/ui/split-view`
615
742
 
616
743
  ```ts
617
- import { SafeHtml } from 'kerfjs';
744
+ import * as kerfjs from 'kerfjs';
745
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
618
746
 
619
747
  interface SplitViewResizable {
620
748
  size: number;
@@ -625,9 +753,9 @@ interface SplitViewProps {
625
753
  id: string;
626
754
  label: string;
627
755
  /** The list (primary) pane. */
628
- list: SafeHtml;
756
+ list: KerfUiContent;
629
757
  /** The detail (secondary) pane. */
630
- detail: SafeHtml;
758
+ detail: KerfUiContent;
631
759
  /**
632
760
  * Compact ("one pane at a time") classes — a handset or portrait tablet.
633
761
  * Derive from `deviceClass().value.compact`. When true the split collapses to
@@ -653,7 +781,7 @@ interface SplitViewProps {
653
781
  * resizable wiring with `wireResizableRegions` and the compact back with
654
782
  * `wireNavStack`.
655
783
  */
656
- declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, }: SplitViewProps): SafeHtml;
784
+ declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, }: SplitViewProps): kerfjs.SafeHtml;
657
785
 
658
786
  export { SplitView, type SplitViewProps, type SplitViewResizable };
659
787
  ```
@@ -661,7 +789,8 @@ export { SplitView, type SplitViewProps, type SplitViewResizable };
661
789
  ## `@kerfjs/ui/pane`
662
790
 
663
791
  ```ts
664
- import { SafeHtml } from 'kerfjs';
792
+ import * as kerfjs from 'kerfjs';
793
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
665
794
 
666
795
  /** Logical sides that can show a {@link Pane} separator. */
667
796
  type PaneSeparatorSide = 'block-start' | 'block-end' | 'inline-start' | 'inline-end';
@@ -678,11 +807,11 @@ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
678
807
  }>;
679
808
  interface PaneProps {
680
809
  /** Optional fixed chrome above the scrolling content, arranged vertically. */
681
- header?: SafeHtml | readonly SafeHtml[];
810
+ header?: KerfUiContent;
682
811
  /** The pane's primary vertical, scrolling content stack. */
683
- children?: SafeHtml | readonly SafeHtml[];
812
+ children?: KerfUiContent;
684
813
  /** Optional fixed chrome below the scrolling content. */
685
- footer?: SafeHtml | readonly SafeHtml[];
814
+ footer?: KerfUiContent;
686
815
  /** Root semantics. Defaults to `div`. */
687
816
  element?: PaneElement;
688
817
  /** Scrolling content semantics. Defaults to `div`. */
@@ -707,7 +836,7 @@ interface PaneProps {
707
836
  * each logical edge, so the same component works as a sidebar, main area,
708
837
  * inspector, or dialog column.
709
838
  */
710
- declare function Pane({ header, children, footer, element, contentElement, separators, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, }: PaneProps): SafeHtml;
839
+ declare function Pane({ header, children, footer, element, contentElement, separators, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, }: PaneProps): kerfjs.SafeHtml;
711
840
 
712
841
  export { Pane, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
713
842
  ```
@@ -717,10 +846,11 @@ export { Pane, type PaneContentElement, type PaneElement, type PaneProps, type P
717
846
  ```ts
718
847
  import { SafeHtml } from 'kerfjs';
719
848
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
849
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
720
850
 
721
851
  /** A collapsible Workbench panel — a side rail or the bottom drawer. */
722
852
  interface WorkbenchPanel {
723
- content: SafeHtml;
853
+ content: KerfUiContent;
724
854
  /** Whether the panel is currently collapsed (the app owns this). */
725
855
  collapsed?: boolean;
726
856
  /** Rail width, or drawer height, in px. Overrides the CSS default. */
@@ -739,7 +869,7 @@ interface WorkbenchProps {
739
869
  id: string;
740
870
  label: string;
741
871
  /** The central work area. */
742
- main: SafeHtml;
872
+ main: KerfUiContent;
743
873
  leftRail?: WorkbenchPanel;
744
874
  rightRail?: WorkbenchPanel;
745
875
  bottomDrawer?: WorkbenchPanel;
@@ -750,8 +880,10 @@ interface WorkbenchProps {
750
880
  * bottom drawer around a central work area (any absent). Collapsing snaps the
751
881
  * panel's track to zero in one reflow while its fixed-size content slides out via
752
882
  * a composited transform — the instant-width / sliding-content technique, so the
753
- * work area relayouts once, not per frame. The app owns each `collapsed` flag;
754
- * the collapse is pure CSS (no wire). See `docs/23-app-layouts.md` §3.3.
883
+ * work area relayouts once, not per frame. Bottom-drawer content stays anchored
884
+ * to the shell's stable bottom edge throughout that transition. The app owns
885
+ * each `collapsed` flag; the collapse is pure CSS (no wire). See
886
+ * `docs/23-app-layouts.md` §3.3.
755
887
  */
756
888
  declare function Workbench({ id, label, main, leftRail, rightRail, bottomDrawer, className, }: WorkbenchProps): SafeHtml;
757
889
 
@@ -764,6 +896,7 @@ export { Workbench, type WorkbenchPanel, type WorkbenchProps };
764
896
  import { SafeHtml } from 'kerfjs';
765
897
  import { LucideIcon } from './lucide-icon.js';
766
898
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
899
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
767
900
  import 'lucide';
768
901
 
769
902
  /** Which edge a {@link CollapsiblePanel} docks to. */
@@ -812,7 +945,7 @@ interface CollapsiblePanelProps {
812
945
  /** Accessible label for the panel region. */
813
946
  label?: string;
814
947
  /** Panel content. */
815
- children?: SafeHtml | readonly SafeHtml[];
948
+ children?: KerfUiContent;
816
949
  separator?: ResizableRegionSeparator;
817
950
  collapseMotion?: ResizableRegionCollapseMotion;
818
951
  contentOverflow?: ResizableRegionContentOverflow;
@@ -827,7 +960,9 @@ interface CollapsiblePanelProps {
827
960
  * {@link Workbench} shell. It owns only the presentation: a fixed-size content
828
961
  * area that stays laid out while the panel's track snaps to zero and the content
829
962
  * slides out via `transform` (one reflow, composited — the same technique
830
- * `Workbench` and the catalog sidebar use). The app owns the `collapsed` signal;
963
+ * `Workbench` and the catalog sidebar use). Bottom-drawer content stays anchored
964
+ * to the panel's fixed bottom edge, so the track cannot move its layout origin
965
+ * underneath the transform transition. The app owns the `collapsed` signal;
831
966
  * pair it with `wireSidebar` for the toggle, focus, compact-overlay, keyboard,
832
967
  * and persistence semantics, and with `CollapsiblePanelToggle` for the standard
833
968
  * affordance. See `docs/24-collapsible-panel.md`.
@@ -894,6 +1029,7 @@ export { type SidebarStorage, type WireSidebarOptions, type WireSidebarPanel, wi
894
1029
 
895
1030
  ```ts
896
1031
  import { SafeHtml } from 'kerfjs';
1032
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
897
1033
 
898
1034
  interface TabScaffoldTab<Id extends string = string> {
899
1035
  id: Id;
@@ -901,7 +1037,7 @@ interface TabScaffoldTab<Id extends string = string> {
901
1037
  /** Decorative icon shown above the label in the bottom bar. */
902
1038
  icon?: SafeHtml;
903
1039
  /** The tab's content — typically a `NavStack` so each tab keeps its own stack. */
904
- content: SafeHtml;
1040
+ content: KerfUiContent;
905
1041
  }
906
1042
  interface TabScaffoldProps<Id extends string = string> {
907
1043
  id: string;
@@ -945,6 +1081,7 @@ export { type WireTabScaffoldOptions, wireTabScaffold };
945
1081
 
946
1082
  ```ts
947
1083
  import { SafeHtml } from 'kerfjs';
1084
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
948
1085
 
949
1086
  type ResizableRegionAxis = 'horizontal' | 'vertical';
950
1087
  type ResizableRegionEdge = 'start' | 'end';
@@ -977,7 +1114,7 @@ interface ResizableRegionProps {
977
1114
  restorePosition?: ResizableRegionRestorePosition;
978
1115
  /** Decorative dormant content for the separator handle. Must not contain interactive descendants. */
979
1116
  handleIcon?: SafeHtml;
980
- children: SafeHtml | SafeHtml[];
1117
+ children: KerfUiContent;
981
1118
  }
982
1119
  declare const clampRegionSize: (size: number, min: number, max: number) => number;
983
1120
  declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
@@ -1077,6 +1214,7 @@ export { DEFAULT_BREAKPOINTS, type DeviceBreakpoints, type DeviceClass, type Dev
1077
1214
 
1078
1215
  ```ts
1079
1216
  import { SafeHtml } from 'kerfjs';
1217
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1080
1218
 
1081
1219
  /** A reference link shown in the detail footer for the active entry. */
1082
1220
  interface CatalogResource {
@@ -1131,19 +1269,19 @@ interface CatalogProps {
1131
1269
  /** The controlled active entry id — the app owns this signal. */
1132
1270
  active: string;
1133
1271
  /** The rendered preview for the active entry; the app computes it from `active`. */
1134
- content: SafeHtml;
1272
+ content: KerfUiContent;
1135
1273
  /** Whether the sidebar is collapsed (controlled). */
1136
1274
  collapsed?: boolean;
1137
1275
  /** Current theme; when set, a theme toggle is shown that switches to the opposite. Omit to hide it. */
1138
1276
  theme?: 'light' | 'dark';
1139
1277
  /** Extra header controls placed before the theme toggle (each a `ToolbarControlGroup`). */
1140
- headerActions?: SafeHtml;
1278
+ headerActions?: KerfUiContent;
1141
1279
  /** A secondary "ecosystem" group of sections below the primary category groups. */
1142
1280
  secondarySections?: CatalogSecondaryGroup;
1143
1281
  /** Extra sidebar content below the category groups (and the secondary group). */
1144
- sidebarFooter?: SafeHtml;
1282
+ sidebarFooter?: KerfUiContent;
1145
1283
  /** Status line content shown at the start of the detail footer. */
1146
- status?: SafeHtml;
1284
+ status?: KerfUiContent;
1147
1285
  /**
1148
1286
  * Whether to highlight specimens' computed borders (or transparent outer
1149
1287
  * bounds) and non-zero margins. Pass a boolean (rather than omitting the
@@ -1199,7 +1337,7 @@ interface CatalogExampleProps {
1199
1337
  /** Safe authoring `data-*` metadata for the rendered section. Helper-owned structural attributes remain protected. */
1200
1338
  rootAttributes?: CatalogExampleRootAttributes;
1201
1339
  className?: string;
1202
- children?: SafeHtml | readonly SafeHtml[];
1340
+ children?: KerfUiContent;
1203
1341
  }
1204
1342
  /**
1205
1343
  * One labeled example in a catalog preview: a `ListHeader` label, an optional
@@ -1216,7 +1354,7 @@ interface CatalogExampleStackProps {
1216
1354
  /** Safe authoring `data-*` metadata for the rendered stack. Helper-owned structural attributes remain protected. */
1217
1355
  rootAttributes?: CatalogExampleStackRootAttributes;
1218
1356
  className?: string;
1219
- children?: SafeHtml | readonly SafeHtml[];
1357
+ children?: KerfUiContent;
1220
1358
  }
1221
1359
  /**
1222
1360
  * A vertically-stacked group of {@link CatalogExample}s with the catalog's
@@ -1233,6 +1371,7 @@ export { Catalog, type CatalogBrand, type CatalogEntry, CatalogExample, type Cat
1233
1371
  ```ts
1234
1372
  import { CatalogResource } from './catalog.js';
1235
1373
  import 'kerfjs';
1374
+ import './semantic-content-BbzjvSu9.js';
1236
1375
 
1237
1376
  /**
1238
1377
  * Standard resource labels for a Kerf catalog detail footer. Keep these labels
@@ -1332,7 +1471,8 @@ export { type CatalogRevealOptions, type WireCatalogOptions, revealCatalogEntry,
1332
1471
  ## `@kerfjs/ui/segmented-control`
1333
1472
 
1334
1473
  ```ts
1335
- import { SafeHtml } from 'kerfjs';
1474
+ import * as kerfjs from 'kerfjs';
1475
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1336
1476
 
1337
1477
  type SegmentedControlAppearance = 'filled' | 'outlined' | 'toolbar';
1338
1478
  type SegmentedControlShape = 'rounded' | 'pill';
@@ -1341,7 +1481,7 @@ type SegmentedControlLayout = 'content' | 'equal';
1341
1481
  interface SegmentedControlChoice<Value extends string = string> {
1342
1482
  value: Value;
1343
1483
  label: string;
1344
- content?: SafeHtml;
1484
+ content?: KerfUiContent;
1345
1485
  title?: string;
1346
1486
  disabled?: boolean;
1347
1487
  }
@@ -1359,7 +1499,7 @@ interface SegmentedControlProps<Value extends string = string> {
1359
1499
  /** Render as an unanimated loading skeleton, disabling every segment. */
1360
1500
  placeholder?: boolean;
1361
1501
  }
1362
- declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps<Value>): SafeHtml;
1502
+ declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps<Value>): kerfjs.SafeHtml;
1363
1503
 
1364
1504
  export { SegmentedControl, type SegmentedControlAppearance, type SegmentedControlChoice, type SegmentedControlLayout, type SegmentedControlProps, type SegmentedControlShape, type SegmentedControlSize };
1365
1505
  ```
@@ -1368,6 +1508,7 @@ export { SegmentedControl, type SegmentedControlAppearance, type SegmentedContro
1368
1508
 
1369
1509
  ```ts
1370
1510
  import { SafeHtml } from 'kerfjs';
1511
+ import { CssColor } from './css-values.js';
1371
1512
  import { LucideNode } from './lucide-icon.js';
1372
1513
  import 'lucide';
1373
1514
 
@@ -1376,7 +1517,8 @@ interface SelectChoice<Value extends string = string> {
1376
1517
  label: string;
1377
1518
  icon?: LucideNode;
1378
1519
  iconName?: string;
1379
- color?: string;
1520
+ /** Typed semantic or application-owned color for the optional icon. */
1521
+ color?: CssColor;
1380
1522
  group?: string;
1381
1523
  separatorBefore?: boolean;
1382
1524
  }
@@ -1425,8 +1567,9 @@ export { Select, type SelectChoice, type SelectFocusRingOwner, type SelectPresen
1425
1567
 
1426
1568
  ```ts
1427
1569
  import { SafeHtml } from 'kerfjs';
1570
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1428
1571
 
1429
- type StateBannerTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
1572
+ type StateBannerTone = 'neutral' | 'info' | 'pop' | 'success' | 'warning' | 'danger';
1430
1573
  type StateBannerUrgency = 'status' | 'alert';
1431
1574
  interface StateBannerProps {
1432
1575
  title: string;
@@ -1434,7 +1577,7 @@ interface StateBannerProps {
1434
1577
  /** Optional compact status or count shown beside the title. */
1435
1578
  badge?: string;
1436
1579
  icon?: SafeHtml;
1437
- action?: SafeHtml;
1580
+ action?: KerfUiContent;
1438
1581
  tone?: StateBannerTone;
1439
1582
  urgency?: StateBannerUrgency;
1440
1583
  className?: string;
@@ -1450,12 +1593,13 @@ export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBan
1450
1593
 
1451
1594
  ```ts
1452
1595
  import { SafeHtml } from 'kerfjs';
1596
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1453
1597
 
1454
1598
  interface EmptyStateProps {
1455
1599
  title: string;
1456
1600
  detail?: string;
1457
1601
  icon?: SafeHtml;
1458
- action?: SafeHtml;
1602
+ action?: KerfUiContent;
1459
1603
  busy?: boolean;
1460
1604
  className?: string;
1461
1605
  }
@@ -1483,14 +1627,15 @@ export { LoadingSpinner, type LoadingSpinnerProps };
1483
1627
 
1484
1628
  ```ts
1485
1629
  import * as kerfjs from 'kerfjs';
1630
+ import { CssSize, CssLength } from './css-values.js';
1486
1631
 
1487
1632
  interface SkeletonProps {
1488
- /** Width as any browser CSS length (e.g. `7.5rem`, `60%`). Defaults to filling its slot. */
1489
- width?: string;
1490
- /** Height as any CSS length. Defaults to a single text line. */
1491
- height?: string;
1492
- /** Corner radius override (a CSS length). Defaults to the small radius token. */
1493
- radius?: string;
1633
+ /** Typed width or intrinsic sizing keyword. Defaults to filling its slot. */
1634
+ width?: CssSize;
1635
+ /** Typed height or intrinsic sizing keyword. Defaults to a single text line. */
1636
+ height?: CssSize;
1637
+ /** Typed corner-radius override. Defaults to the small radius token. */
1638
+ radius?: CssLength;
1494
1639
  /** Render this many stacked lines (the last one shorter), for multi-line text. */
1495
1640
  lines?: number;
1496
1641
  /** Accessible label. Omit to keep the block decorative (`aria-hidden`). */
@@ -1511,11 +1656,12 @@ export { Skeleton, type SkeletonProps };
1511
1656
  ## `@kerfjs/ui/sunken-panel`
1512
1657
 
1513
1658
  ```ts
1514
- import { SafeHtml } from 'kerfjs';
1659
+ import * as kerfjs from 'kerfjs';
1660
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1515
1661
 
1516
1662
  type SunkenPanelShape = 'rounded' | 'square';
1517
1663
  interface SunkenPanelProps {
1518
- children?: SafeHtml | readonly SafeHtml[];
1664
+ children?: KerfUiContent;
1519
1665
  /** Optional accessible landmark name for a distinct application region. */
1520
1666
  ariaLabel?: string;
1521
1667
  /** Corner shape: a rounded rectangle (default) or square corners. */
@@ -1527,7 +1673,7 @@ interface SunkenPanelProps {
1527
1673
  * stack. The panel owns its background and padding; children own their own
1528
1674
  * borders and internal geometry.
1529
1675
  */
1530
- declare function SunkenPanel({ children, ariaLabel, shape, className, }: SunkenPanelProps): SafeHtml;
1676
+ declare function SunkenPanel({ children, ariaLabel, shape, className, }: SunkenPanelProps): kerfjs.SafeHtml;
1531
1677
 
1532
1678
  export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
1533
1679
  ```
@@ -1535,7 +1681,8 @@ export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
1535
1681
  ## `@kerfjs/ui/token-search-field`
1536
1682
 
1537
1683
  ```ts
1538
- import { SafeHtml } from 'kerfjs';
1684
+ import * as kerfjs from 'kerfjs';
1685
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1539
1686
 
1540
1687
  interface TokenSearchToken {
1541
1688
  value: string;
@@ -1560,8 +1707,8 @@ interface TokenSearchFieldBaseProps {
1560
1707
  tokenPlaceholder?: string;
1561
1708
  disabled?: boolean;
1562
1709
  autofocus?: boolean;
1563
- leading?: SafeHtml;
1564
- trailing?: SafeHtml;
1710
+ leading?: KerfUiContent;
1711
+ trailing?: KerfUiContent;
1565
1712
  editAction?: string;
1566
1713
  removeAction?: string;
1567
1714
  clearAction?: string;
@@ -1587,7 +1734,7 @@ interface TokenSearchFieldValue {
1587
1734
  query: string;
1588
1735
  tokens: TokenSearchToken[];
1589
1736
  }
1590
- declare function TokenSearchField({ id, label, query, tokens, placeholder, tokenPlaceholder, disabled, autofocus, collapsible, expanded, expandAction, expandLabel, leading, trailing, editAction, removeAction, clearAction, clearLabel, className, editorAttributes, }: TokenSearchFieldProps): SafeHtml;
1737
+ 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;
1591
1738
  /** Read editable text and ordered token offsets from a rendered TokenSearchField editor. */
1592
1739
  declare function readTokenSearchField(editor: HTMLElement, knownTokens?: readonly TokenSearchToken[]): TokenSearchFieldValue;
1593
1740
  /** Focus an editor and place its caret at a text offset, skipping atomic token chips. */