@kerfjs/ui 5.0.0-beta.76 → 5.0.0-beta.78

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 (147) hide show
  1. package/README.md +15 -0
  2. package/ai/application-ui-diagnostic-ids-v1.json +3 -0
  3. package/ai/component-catalog.json +333 -28
  4. package/ai/component-composition.json +224 -17
  5. package/ai/components/nav-stack.md +4 -3
  6. package/ai/components/select.md +1 -0
  7. package/ai/components/split-view.md +1 -0
  8. package/ai/components/surface-scaffold.md +11 -2
  9. package/ai/components/text.md +4 -2
  10. package/ai/components/toolbar-control-group.md +22 -3
  11. package/ai/components/toolbar-text.md +21 -4
  12. package/ai/components/toolbar.md +12 -4
  13. package/ai/public-api-signatures-v1.md +99 -127
  14. package/ai/skill.md +37 -3
  15. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  16. package/dist/browser/nav-stack.js +2 -0
  17. package/dist/browser/split-view.js +2 -0
  18. package/dist/catalog-resources.d.ts +3 -3
  19. package/dist/catalog.d.ts +3 -3
  20. package/dist/catalog.js +6 -6
  21. package/dist/chunk-2GOCOLQL.js +270 -0
  22. package/dist/chunk-2GOCOLQL.js.map +1 -0
  23. package/dist/{chunk-ZVYA6TLR.js → chunk-4Y4L5YEI.js} +3 -1
  24. package/dist/chunk-4Y4L5YEI.js.map +1 -0
  25. package/dist/{chunk-XIZRXI7N.js → chunk-A7DYEERU.js} +13 -1
  26. package/dist/chunk-A7DYEERU.js.map +1 -0
  27. package/dist/{chunk-7QWIJEK5.js → chunk-DSLRNR43.js} +9 -8
  28. package/dist/chunk-DSLRNR43.js.map +1 -0
  29. package/dist/{chunk-AOAW55JN.js → chunk-DXQZ3BEO.js} +4 -1
  30. package/dist/chunk-DXQZ3BEO.js.map +1 -0
  31. package/dist/chunk-IKCUPTR2.js +170 -0
  32. package/dist/chunk-IKCUPTR2.js.map +1 -0
  33. package/dist/{chunk-HGSTMZZ6.js → chunk-JL4BBZP4.js} +5 -4
  34. package/dist/chunk-JL4BBZP4.js.map +1 -0
  35. package/dist/{chunk-IVLTEBBT.js → chunk-M6BWQMQY.js} +2 -2
  36. package/dist/{chunk-IVLTEBBT.js.map → chunk-M6BWQMQY.js.map} +1 -1
  37. package/dist/{chunk-72LLWYP2.js → chunk-NVKRZ5DI.js} +1 -1
  38. package/dist/chunk-NVKRZ5DI.js.map +1 -0
  39. package/dist/{chunk-GO2CZX4M.js → chunk-RRCD3A6G.js} +13 -5
  40. package/dist/chunk-RRCD3A6G.js.map +1 -0
  41. package/dist/{chunk-5PAVAR4B.js → chunk-VHXHLZ6R.js} +10 -1
  42. package/dist/chunk-VHXHLZ6R.js.map +1 -0
  43. package/dist/collapsible-panel.js +2 -2
  44. package/dist/index.d.ts +4 -3
  45. package/dist/index.js +9 -8
  46. package/dist/list-header.d.ts +1 -0
  47. package/dist/list-header.js +1 -1
  48. package/dist/nav-stack-B1Qc2e5q.d.ts +101 -0
  49. package/dist/nav-stack.d.ts +12 -93
  50. package/dist/nav-stack.js +5 -1
  51. package/dist/pane.d.ts +5 -2
  52. package/dist/pane.js +1 -1
  53. package/dist/select-register.js +3 -0
  54. package/dist/select-register.js.map +1 -1
  55. package/dist/select.d.ts +1 -0
  56. package/dist/select.js +1 -1
  57. package/dist/split-view.d.ts +9 -4
  58. package/dist/split-view.js +7 -3
  59. package/dist/split-view.js.map +1 -1
  60. package/dist/styles/components/actions/toolbar/toolbar.css +32 -0
  61. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +105 -7
  62. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +17 -0
  63. package/dist/styles/components/layout/pane/pane.css +7 -0
  64. package/dist/styles/components/navigation/nav-stack/nav-stack.css +17 -12
  65. package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +17 -0
  66. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +55 -0
  67. package/dist/styles/components/typography/text/text.css +19 -0
  68. package/dist/styles/nav-stack.css +17 -12
  69. package/dist/styles/pane.css +7 -0
  70. package/dist/styles/surface-scaffold.css +55 -0
  71. package/dist/styles/tab-scaffold.css +17 -0
  72. package/dist/styles/text.css +19 -0
  73. package/dist/styles/toolbar-control-group.css +105 -7
  74. package/dist/styles/toolbar-text.css +17 -0
  75. package/dist/styles/toolbar.css +32 -0
  76. package/dist/surface-scaffold-register.d.ts +4 -0
  77. package/dist/surface-scaffold-register.js +59 -0
  78. package/dist/surface-scaffold-register.js.map +1 -0
  79. package/dist/surface-scaffold.d.ts +10 -2
  80. package/dist/surface-scaffold.js +1 -1
  81. package/dist/tab-scaffold.d.ts +2 -0
  82. package/dist/tab-scaffold.js +1 -0
  83. package/dist/tab-scaffold.js.map +1 -1
  84. package/dist/text.d.ts +5 -2
  85. package/dist/text.js +1 -1
  86. package/dist/toolbar-control-group.d.ts +14 -2
  87. package/dist/toolbar-control-group.js +1 -1
  88. package/dist/toolbar-text.d.ts +10 -2
  89. package/dist/toolbar-text.js +1 -1
  90. package/dist/wire-nav-stack.js +58 -22
  91. package/dist/wire-nav-stack.js.map +1 -1
  92. package/dist/wire-toolbar-visibility.d.ts +13 -0
  93. package/dist/wire-toolbar-visibility.js +3 -0
  94. package/dist/wire-toolbar-visibility.js.map +1 -0
  95. package/dist/workbench.d.ts +5 -13
  96. package/dist/workbench.js +1 -1
  97. package/docs/accessibility.md +15 -0
  98. package/docs/collapsible-panel.md +4 -0
  99. package/docs/component-contract.md +38 -0
  100. package/docs/component-selection.md +56 -2
  101. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  102. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  103. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  104. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  105. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  106. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  107. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  108. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  109. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  110. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  111. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  112. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  113. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  114. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  115. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  116. package/docs/design/templates/toolbar-control-group.svg +1 -1
  117. package/docs/design/templates/toolbar-dark.svg +1 -1
  118. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  119. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  120. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  121. package/docs/design/templates/toolbar-text.svg +1 -1
  122. package/docs/design/templates/toolbar.svg +1 -1
  123. package/docs/design/templates.md +2 -0
  124. package/docs/layout.md +32 -1
  125. package/docs/nav-stack.md +35 -19
  126. package/docs/recipes.md +5 -1
  127. package/docs/split-view.md +7 -4
  128. package/docs/surface-scaffold.md +46 -0
  129. package/docs/tab-scaffold.md +57 -0
  130. package/docs/ui-doctor.md +23 -0
  131. package/docs/workbench.md +3 -2
  132. package/doctor/component-style-checks.mjs +224 -0
  133. package/doctor/index.mjs +42 -13
  134. package/llms.txt +34 -0
  135. package/package.json +11 -2
  136. package/ux-demo/recipes/list-detail-dialog.tsx +4 -0
  137. package/ux-demo/recipes/navigation-stack.tsx +2 -2
  138. package/dist/chunk-5PAVAR4B.js.map +0 -1
  139. package/dist/chunk-72LLWYP2.js.map +0 -1
  140. package/dist/chunk-7QWIJEK5.js.map +0 -1
  141. package/dist/chunk-AOAW55JN.js.map +0 -1
  142. package/dist/chunk-GO2CZX4M.js.map +0 -1
  143. package/dist/chunk-HGSTMZZ6.js.map +0 -1
  144. package/dist/chunk-SJY7KC45.js +0 -123
  145. package/dist/chunk-SJY7KC45.js.map +0 -1
  146. package/dist/chunk-XIZRXI7N.js.map +0 -1
  147. package/dist/chunk-ZVYA6TLR.js.map +0 -1
@@ -9,6 +9,7 @@
9
9
  Leading, centered, and trailing toolbar composition.
10
10
 
11
11
  - Compose application chrome or a page, panel, or dialog heading with leading, center, and trailing regions.
12
+ - Use typed hideBelow/showBelow lengths with wireToolbarVisibility(root) for per-item toolbar priority; keep primary actions available and provide a showBelow overflow alternative.
12
13
 
13
14
  **Not when:**
14
15
 
@@ -17,13 +18,15 @@ Leading, centered, and trailing toolbar composition.
17
18
  ## Imports
18
19
 
19
20
  - JavaScript: `@kerfjs/ui/toolbar` — exports `Toolbar`.
21
+ - JavaScript: `@kerfjs/ui/wire-toolbar-visibility` — exports `wireToolbarVisibility`.
20
22
  - CSS: the browser build of `@kerfjs/ui/toolbar` pulls its CSS automatically; import `@kerfjs/ui/toolbar.css` manually only without the `browser` export condition.
21
23
  - Wiring: `wireScrollDividers` from `@kerfjs/ui/wire-scroll-dividers` (optional).
24
+ - Wiring: `wireToolbarVisibility` from `@kerfjs/ui/wire-toolbar-visibility` (optional).
22
25
  - Declared side effects: browser-condition-css.
23
26
 
24
27
  ## Props
25
28
 
26
- Exact prop names and types: [`@kerfjs/ui/toolbar`](../public-api-signatures-v1.md#kerfjsuitoolbar), [`@kerfjs/ui/wire-scroll-dividers`](../public-api-signatures-v1.md#kerfjsuiwire-scroll-dividers) in `public-api-signatures-v1.md`. Do not infer props from examples.
29
+ Exact prop names and types: [`@kerfjs/ui/toolbar`](../public-api-signatures-v1.md#kerfjsuitoolbar), [`@kerfjs/ui/wire-toolbar-visibility`](../public-api-signatures-v1.md#kerfjsuiwire-toolbar-visibility), [`@kerfjs/ui/wire-scroll-dividers`](../public-api-signatures-v1.md#kerfjsuiwire-scroll-dividers) in `public-api-signatures-v1.md`. Do not infer props from examples.
27
30
 
28
31
  **Variants (configure, do not restyle):**
29
32
 
@@ -38,13 +41,14 @@ Exact prop names and types: [`@kerfjs/ui/toolbar`](../public-api-signatures-v1.m
38
41
  - trailing groups and a standalone primary wa-button wrap instead of clipping
39
42
  - outer inset independently configurable from zone gap
40
43
  - app bar or bottom bar claiming its screen edges (safeAreaEdges)
44
+ - typed hideBelow/showBelow thresholds at the nearest Toolbar content width
41
45
 
42
46
  ## Composition
43
47
 
44
48
  - Parents: any.
45
49
  - Contexts: `application-chrome`, `page-header`, `panel-header`, `dialog-header`.
46
50
  - Children: only [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md).
47
- - Built from: [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md).
51
+ - Built from: [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md), [PopupMenu](./popup-menu.md).
48
52
 
49
53
  Zones (a zone is bound to JSX only through its listed prop; never assume the zone id is a prop):
50
54
 
@@ -56,12 +60,16 @@ Zones (a zone is bound to JSX only through its listed prop; never assume the zon
56
60
 
57
61
  **The app owns:** actions; command availability; responsive relocation; which screen edges an app bar or bottom bar outside a Pane header or footer claims for device safe areas (safeAreaEdges).
58
62
 
59
- **Wiring:** `wireScrollDividers` is optional.
63
+ **Wiring:** `wireScrollDividers`, `wireToolbarVisibility` is optional.
60
64
 
61
65
  **Wiring-owned state attributes** — never render, remove, or branch on these as app state:
62
66
 
63
67
  - `data-scroll-overflow` on `the targets scroller` (`wireScrollDividers`): The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it.
64
68
  - `data-scroll-divider` on `a Toolbar named as targets chrome` (`wireScrollDividers`): The sides, in t/r/b/l order, on which this chrome currently draws its scroll divider: the side facing the scroller while content is hidden beyond it. Re-applied if a re-render drops it.
69
+ - `data-toolbar-width-hidden` on `ToolbarText, ToolbarControlGroup and its paired busy status` (`wireToolbarVisibility`): True when typed hideBelow/showBelow thresholds hide this item at the nearest Toolbar content width. Re-applied after rendering; disposal restores prior markers.
70
+ - `data-toolbar-visibility-probe` on `private aria-hidden measurement boxes under Toolbar` (`wireToolbarVisibility`): Internal out-of-flow CSS length resolver; created and removed by wireToolbarVisibility.
71
+ - `data-morph-preserve` on `private aria-hidden measurement boxes and visibility state children` (`wireToolbarVisibility`): Keeps helper-owned geometry and state across Kerf renders; replacement and explicit removal are repaired, and disposal removes them.
72
+ - `data-toolbar-visibility-state` on `private hidden children of width-managed items and paired busy statuses` (`wireToolbarVisibility`): Preserves actual CSS visibility while rendering removes a transient parent marker, preventing geometry-driven render feedback.
65
73
 
66
74
  ## Geometry
67
75
 
@@ -92,6 +100,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
92
100
 
93
101
  ## Related
94
102
 
95
- - Components: [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md).
103
+ - Components: [ToolbarText](./toolbar-text.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md), [PopupMenu](./popup-menu.md).
96
104
  - Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/component-selection.md#ambiguous-choices`](../../docs/component-selection.md#ambiguous-choices).
97
105
  - UX catalog route: `?component=toolbar`.
@@ -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.76` and `kerfjs@5.0.0-beta.76`. 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.78` and `kerfjs@5.0.0-beta.78`. This bounded reference covers only APIs used by the seven-task corpus. It is interface evidence, not an implementation or runtime guarantee.
4
4
 
5
5
  ## `@kerfjs/ui/css-values`
6
6
 
@@ -217,13 +217,21 @@ export { Sides, Toolbar, type ToolbarConfig, type ToolbarPosition, type ToolbarP
217
217
 
218
218
  ```ts
219
219
  import * as kerfjs from 'kerfjs';
220
+ import { CssLength } from './css-values.js';
220
221
 
221
222
  type ToolbarTextSize = 'xlarge' | 'xlarge-fixed' | 'large' | 'default' | 'small' | 'xsmall';
223
+ type ToolbarTextTone = 'default' | 'dark';
222
224
  /** ARIA heading level for a title exposed as a heading landmark. */
223
225
  type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
224
226
  interface ToolbarTextBaseProps {
225
227
  text: string;
226
228
  size?: ToolbarTextSize;
229
+ /** Use dark-toolbar foregrounds on a dark or photo-backed toolbar. */
230
+ tone?: ToolbarTextTone;
231
+ /** Hide below this Toolbar content width; requires wireToolbarVisibility. */
232
+ hideBelow?: CssLength;
233
+ /** Show only below this Toolbar content width; requires wireToolbarVisibility. */
234
+ showBelow?: CssLength;
227
235
  className?: string;
228
236
  /** Optional id, e.g. so a dialog can reference the title via aria-labelledby. */
229
237
  id?: string;
@@ -264,9 +272,9 @@ type ToolbarTextProps = ToolbarTextBaseProps & (({
264
272
  wrap?: never;
265
273
  maxLines?: never;
266
274
  });
267
- declare function ToolbarText({ text, size, className, id, headingLevel, placeholder, wrap, ellipsis, maxLines, fill, slot, action, }: ToolbarTextProps): kerfjs.SafeHtml;
275
+ declare function ToolbarText({ text, size, tone, hideBelow, showBelow, className, id, headingLevel, placeholder, wrap, ellipsis, maxLines, fill, slot, action, }: ToolbarTextProps): kerfjs.SafeHtml;
268
276
 
269
- export { type HeadingLevel, ToolbarText, type ToolbarTextProps, type ToolbarTextSize };
277
+ export { type HeadingLevel, ToolbarText, type ToolbarTextProps, type ToolbarTextSize, type ToolbarTextTone };
270
278
  ```
271
279
 
272
280
  ## `@kerfjs/ui/toolbar-control-group`
@@ -274,9 +282,12 @@ export { type HeadingLevel, ToolbarText, type ToolbarTextProps, type ToolbarText
274
282
  ```ts
275
283
  import * as kerfjs from 'kerfjs';
276
284
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
285
+ import { CssLength } from './css-values.js';
277
286
 
278
287
  type ToolbarControlGroupAppearance = 'contained' | 'borderless';
279
288
  type ToolbarControlGroupTone = 'default' | 'dark';
289
+ /** Quiet palette for a contained, single decorative icon tile. */
290
+ type ToolbarControlGroupTileTone = 'neutral' | 'brand' | 'success' | 'warning' | 'danger';
280
291
  type ToolbarControlGroupButtonAppearance = 'plain' | 'push';
281
292
  type ToolbarControlGroupShape = 'pill' | 'rounded';
282
293
  type ToolbarControlGroupSize = 'default' | 'compact';
@@ -286,6 +297,7 @@ type ToolbarControlGroupFocusRing = 'control' | 'outline' | 'halo';
286
297
  type ToolbarControlGroupSelectedChrome = 'raised' | 'filled' | 'outline';
287
298
  type ToolbarControlGroupSelectedTone = 'brand' | 'neutral' | 'pop';
288
299
  type ToolbarControlGroupOverflow = 'visible' | 'scroll' | 'wrap';
300
+ type ToolbarControlGroupExpandedOverflow = 'clip' | 'visible';
289
301
  type ToolbarControlGroupMenuInset = 'standard' | 'compact' | 'list-zero';
290
302
  type ToolbarControlGroupVisibility = 'always' | 'compact-only' | 'hide-collapsed-tiny' | 'yield-to-expanded-sibling';
291
303
  type ToolbarControlGroupSizing = 'content' | 'grow' | 'fill';
@@ -314,6 +326,8 @@ interface ToolbarControlGroupProps {
314
326
  single?: boolean;
315
327
  appearance?: ToolbarControlGroupAppearance;
316
328
  tone?: ToolbarControlGroupTone;
329
+ /** Quiet fill, matching border and foreground for a contained single group whose only child is a decorative SVG. Ignored for interactive or mixed content. */
330
+ tileTone?: ToolbarControlGroupTileTone;
317
331
  buttonAppearance?: ToolbarControlGroupButtonAppearance;
318
332
  /** Corner shape: fully round `pill` (default) or a softer `rounded` rectangle. */
319
333
  shape?: ToolbarControlGroupShape;
@@ -330,8 +344,14 @@ interface ToolbarControlGroupProps {
330
344
  menuInset?: ToolbarControlGroupMenuInset;
331
345
  /** Keep an overlong row inside the available width by scrolling or wrapping. */
332
346
  overflow?: ToolbarControlGroupOverflow;
347
+ /** Let app-owned anchored surfaces extend outside an expanded search group. Collapsed searches retain their clipping. */
348
+ expandedOverflow?: ToolbarControlGroupExpandedOverflow;
333
349
  /** Responsive visibility owned by the enclosing Toolbar container. */
334
350
  visibility?: ToolbarControlGroupVisibility;
351
+ /** Hide below this Toolbar content width; requires wireToolbarVisibility. */
352
+ hideBelow?: CssLength;
353
+ /** Show only below this Toolbar content width; requires wireToolbarVisibility. */
354
+ showBelow?: CssLength;
335
355
  /** Intrinsic (default), grow from a basis, or occupy a full wrapping row. */
336
356
  sizing?: ToolbarControlGroupSizing;
337
357
  /** Place this group at the end of its flex row in a wrapping Toolbar zone. */
@@ -354,9 +374,9 @@ interface ToolbarControlGroupProps {
354
374
  /** Native named-slot assignment when composed inside a web component. */
355
375
  slot?: string;
356
376
  }
357
- declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, size, density, content, focusRing, selectedChrome, selectedTone, nestedDropdown, menuInset, overflow, visibility, sizing, placement, growBasis, relocateOnCollapse, scrim, busy, busyLabel, avatarImage, slot, }: ToolbarControlGroupProps): kerfjs.SafeHtml;
377
+ declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, tileTone, buttonAppearance, shape, size, density, content, focusRing, selectedChrome, selectedTone, nestedDropdown, menuInset, overflow, expandedOverflow, visibility, hideBelow, showBelow, sizing, placement, growBasis, relocateOnCollapse, scrim, busy, busyLabel, avatarImage, slot, }: ToolbarControlGroupProps): kerfjs.SafeHtml;
358
378
 
359
- export { ToolbarActionLink, type ToolbarActionLinkProps, ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupContent, type ToolbarControlGroupDensity, type ToolbarControlGroupFocusRing, type ToolbarControlGroupMenuInset, type ToolbarControlGroupOverflow, type ToolbarControlGroupPlacement, type ToolbarControlGroupProps, type ToolbarControlGroupSelectedChrome, type ToolbarControlGroupSelectedTone, type ToolbarControlGroupShape, type ToolbarControlGroupSize, type ToolbarControlGroupSizing, type ToolbarControlGroupTone, type ToolbarControlGroupVisibility };
379
+ export { ToolbarActionLink, type ToolbarActionLinkProps, ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupContent, type ToolbarControlGroupDensity, type ToolbarControlGroupExpandedOverflow, type ToolbarControlGroupFocusRing, type ToolbarControlGroupMenuInset, type ToolbarControlGroupOverflow, type ToolbarControlGroupPlacement, type ToolbarControlGroupProps, type ToolbarControlGroupSelectedChrome, type ToolbarControlGroupSelectedTone, type ToolbarControlGroupShape, type ToolbarControlGroupSize, type ToolbarControlGroupSizing, type ToolbarControlGroupTileTone, type ToolbarControlGroupTone, type ToolbarControlGroupVisibility };
360
380
  ```
361
381
 
362
382
  ## `@kerfjs/ui/floating-toolbar`
@@ -525,6 +545,7 @@ export { PopupMenu, type PopupMenuDivider, type PopupMenuElement, type PopupMenu
525
545
  ```ts
526
546
  import { SafeHtml } from 'kerfjs';
527
547
  import { HeadingLevel } from './toolbar-text.js';
548
+ import './css-values.js';
528
549
 
529
550
  type ListHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
530
551
  'data-component'?: never;
@@ -1264,100 +1285,19 @@ export { type ScrollDividerTarget, type WireScrollDividersOptions, wireScrollDiv
1264
1285
  ## `@kerfjs/ui/nav-stack`
1265
1286
 
1266
1287
  ```ts
1267
- import * as kerfjs from 'kerfjs';
1268
- import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1269
- import { ToolbarConfig } from './toolbar.js';
1270
- import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
1271
- import { PaneAppearance } from './pane.js';
1288
+ export { c as NavStack, N as NavStackProps, d as NavStackToolbarConfig, a as NavStackView, e as NavStackViewBottomToolbar, f as NavStackViewToolbar } from './nav-stack-B1Qc2e5q.js';
1289
+ import 'kerfjs';
1290
+ import './semantic-content-BbzjvSu9.js';
1291
+ import './list.js';
1292
+ import './flex-alignment-4ms8ZbV8.js';
1272
1293
  import './sides-BPSWde0A.js';
1273
-
1274
- /**
1275
- * One entry in a {@link NavStack}. The app owns the stack as an array (usually a
1276
- * signal); `NavStack` renders it and `wireNavStack` animates the transitions.
1277
- */
1278
- interface NavStackView {
1279
- /** Stable identity for keyed reconcile and transition direction. */
1280
- key: string;
1281
- content: KerfUiContent;
1282
- /** Background of this view's scrolling work surface. */
1283
- appearance?: PaneAppearance;
1284
- /** Title shown in the top toolbar for this view. */
1285
- title?: string;
1286
- /** Leading groups for this view's top toolbar, after the back control and before the title. */
1287
- leading?: KerfUiContent;
1288
- /** Center content for this view's top toolbar (placed per `toolbarConfig.centerAlign`). */
1289
- center?: KerfUiContent;
1290
- /** Trailing actions for this view's top toolbar. */
1291
- toolbar?: KerfUiContent;
1292
- /** Fixed chrome below this view's toolbar, above its scrolling content. */
1293
- header?: KerfUiContent;
1294
- /** Bottom toolbar for this view. Cross-fades with the top chrome on navigation. */
1295
- bottomToolbar?: KerfUiContent;
1296
- }
1297
- /**
1298
- * The top toolbar's configuration. Its `ToolbarConfig` forwards to the real
1299
- * `Toolbar` the stack renders; by default that toolbar draws no divider and
1300
- * claims the top and side safe-area edges the stack still touches.
1301
- */
1302
- interface NavStackToolbarConfig extends ToolbarConfig {
1303
- /** Accessible name of the top toolbar (default: none). */
1304
- label?: string;
1305
- /** Size of the view title's `ToolbarText` (default `large`). */
1306
- titleSize?: ToolbarTextSize;
1307
- /** Expose the view title as a heading at this level (default: a plain span). */
1308
- headingLevel?: HeadingLevel;
1309
- }
1310
- interface NavStackProps {
1311
- id: string;
1312
- /** Accessible name for the stack region. */
1313
- label: string;
1314
- /** The stack, root first; the last entry is the active top view. */
1315
- views: NavStackView[];
1316
- /** Accessible label for the icon-only back control (default "Back"). */
1317
- backLabel?: string;
1318
- /** The back control's icon (default a chevron-left `LucideIcon`). */
1319
- backIcon?: KerfUiContent;
1320
- /**
1321
- * Visible text beside the back icon, such as the previous view's title
1322
- * (default: icon only). When set, the text names the control and
1323
- * `backLabel` is not used.
1324
- */
1325
- backText?: string;
1326
- /** The top toolbar's configuration, forwarded to its `Toolbar`. */
1327
- toolbarConfig?: NavStackToolbarConfig;
1328
- /** Persistent last group in every view's top toolbar, supplied by a hosting panel. */
1329
- panelToggle?: KerfUiContent;
1330
- /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */
1331
- hideToolbar?: boolean;
1332
- /** Optional persistent bottom toolbar used when the active view does not provide one. */
1333
- bottomToolbar?: KerfUiContent;
1334
- /**
1335
- * The line under the top chrome and over the bottom toolbar, where they
1336
- * meet the active view. `scroll` (default) shows the chrome's line only
1337
- * while the view's content is scrolled beneath it, and the bottom
1338
- * toolbar's only while more content lies below — never when the content
1339
- * fits — once `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is
1340
- * wired above the stack; unwired, neither shows. `always` shows both
1341
- * without the wiring; `none` neither, even when wired. The line is drawn
1342
- * inside the chrome, so no state moves the chrome or the content. A
1343
- * `toolbarConfig.dividerSides` edge is the Toolbar's own and is unaffected.
1344
- */
1345
- chromeDividers?: 'scroll' | 'always' | 'none';
1346
- className?: string;
1347
- /** Native named-slot assignment when composed inside a web component. */
1348
- slot?: string;
1349
- }
1350
- /**
1351
- * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last
1352
- * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and
1353
- * cross-fades the chrome across a change. Its top chrome is a real `Toolbar`: the
1354
- * back control and title lead, the active view's `leading` / `center` / `toolbar`
1355
- * content fills the zones, and `toolbarConfig` configures it. A single-pane
1356
- * layout is a `NavStack` with one entry. See `docs/23-app-layouts.md` §3.1.
1357
- */
1358
- declare function NavStack({ id, label, views, backLabel, backIcon, backText, toolbarConfig, panelToggle, hideToolbar, bottomToolbar, chromeDividers, className, slot, }: NavStackProps): kerfjs.SafeHtml;
1359
-
1360
- export { NavStack, type NavStackProps, type NavStackToolbarConfig, type NavStackView };
1294
+ import './css-values.js';
1295
+ import './pane.js';
1296
+ import './panel-toolbar-CL9tYOkh.js';
1297
+ import './toolbar.js';
1298
+ import './lucide-icon.js';
1299
+ import 'lucide';
1300
+ import './toolbar-text.js';
1361
1301
  ```
1362
1302
 
1363
1303
  ## `@kerfjs/ui/wire-nav-stack`
@@ -1388,13 +1328,18 @@ export { type WireNavStackOptions, wireNavStack };
1388
1328
  ```ts
1389
1329
  import * as kerfjs from 'kerfjs';
1390
1330
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1391
- import { NavStackProps, NavStackView } from './nav-stack.js';
1331
+ import { N as NavStackProps, a as NavStackView } from './nav-stack-B1Qc2e5q.js';
1392
1332
  import { ResizableRegionProps } from './resizable-region.js';
1393
- import './toolbar.js';
1333
+ import './list.js';
1334
+ import './flex-alignment-4ms8ZbV8.js';
1394
1335
  import './sides-BPSWde0A.js';
1336
+ import './css-values.js';
1395
1337
  import './pane.js';
1338
+ import './panel-toolbar-CL9tYOkh.js';
1339
+ import './toolbar.js';
1340
+ import './lucide-icon.js';
1341
+ import 'lucide';
1396
1342
  import './toolbar-text.js';
1397
- import './css-values.js';
1398
1343
 
1399
1344
  /**
1400
1345
  * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /
@@ -1409,7 +1354,7 @@ interface SplitViewResizable extends Pick<ResizableRegionProps, 'separator' | 'h
1409
1354
  max: number;
1410
1355
  }
1411
1356
  /** One compact view's top- and bottom-toolbar content (see `NavStackView`). */
1412
- type SplitViewCompactViewToolbars = Pick<NavStackView, 'leading' | 'center' | 'toolbar' | 'bottomToolbar'>;
1357
+ type SplitViewCompactViewToolbars = Pick<NavStackView, 'toolbar' | 'bottomToolbar'>;
1413
1358
  /**
1414
1359
  * The compact `NavStack`'s configuration: its toolbar configuration, back
1415
1360
  * control, persistent bottom toolbar, and chrome dividers forward to the
@@ -1490,6 +1435,7 @@ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
1490
1435
  'data-chrome-placement'?: never;
1491
1436
  'data-chrome-dividers'?: never;
1492
1437
  'data-appearance'?: never;
1438
+ 'data-deep-inset'?: never;
1493
1439
  }>;
1494
1440
  /** How a Pane's header and footer relate to its scrolling content. */
1495
1441
  type PaneChromePlacement = 'fixed' | 'auto';
@@ -1529,6 +1475,8 @@ interface PaneProps {
1529
1475
  chromeDividers?: PaneChromeDividers;
1530
1476
  /** Paint the scrolling work surface with the shared lowered-surface color. */
1531
1477
  appearance?: PaneAppearance;
1478
+ /** Add an extra 8px inline gutter to scrolling content (default: false). */
1479
+ deepInset?: boolean;
1532
1480
  /** Root semantics. Defaults to `div`. */
1533
1481
  element?: PaneElement;
1534
1482
  /** Scrolling content semantics. Defaults to `div`. */
@@ -1563,14 +1511,14 @@ interface PaneProps {
1563
1511
  * or a CollapsiblePanel) forwards, so the app configures that pane instead of
1564
1512
  * styling it. An omitted or `undefined` field keeps the composite's default.
1565
1513
  */
1566
- type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'appearance'>;
1514
+ type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'appearance' | 'deepInset'>;
1567
1515
  /**
1568
1516
  * An unpadded application column with optional fixed header/footer slots and one
1569
1517
  * scrolling vertical content owner. Separator lines are independently opt-in on
1570
1518
  * each logical edge, so the same component works as a sidebar, main area,
1571
1519
  * inspector, or dialog column.
1572
1520
  */
1573
- declare function Pane({ header, children, footer, chromePlacement, chromeDividers, appearance, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
1521
+ declare function Pane({ header, children, footer, chromePlacement, chromeDividers, appearance, deepInset, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
1574
1522
 
1575
1523
  export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
1576
1524
  ```
@@ -1580,16 +1528,16 @@ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlac
1580
1528
  ```ts
1581
1529
  import { SafeHtml } from 'kerfjs';
1582
1530
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1531
+ import { b as NavPane, N as NavStackProps } from './nav-stack-B1Qc2e5q.js';
1583
1532
  import { ListConfig } from './list.js';
1584
- import { NavStackProps } from './nav-stack.js';
1585
1533
  import { PaneConfig } from './pane.js';
1586
1534
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
1587
- import { a as PanelToolbar, b as PanelChromePlacement, c as PanelBottomToolbar, d as PanelToggle } from './panel-toolbar-CL9tYOkh.js';
1535
+ import { a as PanelToolbar, c as PanelBottomToolbar, b as PanelChromePlacement, d as PanelToggle } from './panel-toolbar-CL9tYOkh.js';
1588
1536
  import { ToolbarConfig } from './toolbar.js';
1537
+ import './toolbar-text.js';
1538
+ import './css-values.js';
1589
1539
  import './flex-alignment-4ms8ZbV8.js';
1590
1540
  import './sides-BPSWde0A.js';
1591
- import './css-values.js';
1592
- import './toolbar-text.js';
1593
1541
  import './lucide-icon.js';
1594
1542
  import 'lucide';
1595
1543
 
@@ -1711,19 +1659,11 @@ interface WorkbenchPanelBase {
1711
1659
  restorePosition?: ResizableRegionRestorePosition;
1712
1660
  }
1713
1661
  /** The original static panel body: one toolbar, optional fixed chrome, and one Pane. */
1714
- interface WorkbenchStaticPanel extends WorkbenchPanelBase {
1715
- content: KerfUiContent;
1662
+ interface WorkbenchStaticPanel extends WorkbenchPanelBase, NavPane<WorkbenchPanelToolbar, WorkbenchPanelBottomToolbar> {
1716
1663
  /** The composed toolbar; marked groups and its toggle relocate on collapse. */
1717
1664
  toolbar?: WorkbenchPanelToolbar;
1718
- header?: KerfUiContent;
1719
- headerList?: ListConfig;
1720
1665
  headerPlacement?: WorkbenchChromePlacement;
1721
- footer?: KerfUiContent;
1722
- footerList?: ListConfig;
1723
- bottomToolbar?: WorkbenchPanelBottomToolbar;
1724
1666
  footerPlacement?: WorkbenchChromePlacement;
1725
- /** Configuration for the static toolbar panel's Pane. */
1726
- pane?: PaneConfig;
1727
1667
  navStack?: never;
1728
1668
  }
1729
1669
  /** A panel whose active NavStack view supplies the toolbar, fixed header, and scroll body. */
@@ -2191,6 +2131,8 @@ interface TabScaffoldTabBase<Id extends string> {
2191
2131
  content: KerfUiContent;
2192
2132
  /** Background of this scene's scrolling work surface. */
2193
2133
  appearance?: PaneAppearance;
2134
+ /** Add an extra 8px inline gutter to a plain scene's scrolling content. */
2135
+ deepInset?: boolean;
2194
2136
  }
2195
2137
  /** A tab with an optional count or short-status badge. */
2196
2138
  interface TabScaffoldTabCountBadge {
@@ -2433,15 +2375,15 @@ import './toolbar.js';
2433
2375
  import './sides-BPSWde0A.js';
2434
2376
  import './pane.js';
2435
2377
  import './workbench.js';
2378
+ import './nav-stack-B1Qc2e5q.js';
2436
2379
  import './list.js';
2437
2380
  import './flex-alignment-4ms8ZbV8.js';
2438
2381
  import './css-values.js';
2439
- import './nav-stack.js';
2440
- import './toolbar-text.js';
2441
- import './resizable-region.js';
2442
2382
  import './panel-toolbar-CL9tYOkh.js';
2443
2383
  import './lucide-icon.js';
2444
2384
  import 'lucide';
2385
+ import './toolbar-text.js';
2386
+ import './resizable-region.js';
2445
2387
 
2446
2388
  /**
2447
2389
  * Controlled, stateless component-catalog shell: a `Workbench` whose left rail
@@ -2528,15 +2470,15 @@ import './semantic-content-BbzjvSu9.js';
2528
2470
  import './sides-BPSWde0A.js';
2529
2471
  import './pane.js';
2530
2472
  import './workbench.js';
2473
+ import './nav-stack-B1Qc2e5q.js';
2531
2474
  import './list.js';
2532
2475
  import './flex-alignment-4ms8ZbV8.js';
2533
2476
  import './css-values.js';
2534
- import './nav-stack.js';
2535
- import './toolbar-text.js';
2536
- import './resizable-region.js';
2537
2477
  import './panel-toolbar-CL9tYOkh.js';
2538
2478
  import './lucide-icon.js';
2539
2479
  import 'lucide';
2480
+ import './toolbar-text.js';
2481
+ import './resizable-region.js';
2540
2482
 
2541
2483
  /**
2542
2484
  * Standard resource labels for a Kerf catalog detail footer. Keep these labels
@@ -2751,6 +2693,7 @@ interface SelectBaseProps<Value extends string = string> {
2751
2693
  /** Supporting text shown below the control and associated with its combobox. */
2752
2694
  hint?: string;
2753
2695
  disabled?: boolean;
2696
+ /** Match menu width to the trigger; default menus grow to content within viewport gutters. */
2754
2697
  fitMenu?: boolean;
2755
2698
  /** Render as an unanimated loading skeleton: the label above a static, empty control box. */
2756
2699
  placeholder?: boolean;
@@ -3312,27 +3255,53 @@ declare function LucideIcon({ icon, name, appearance, className, color, inline,
3312
3255
  export { LucideIcon, type LucideIconProps, type LucideIconSize, type LucideNode };
3313
3256
  ```
3314
3257
 
3258
+ ## `@kerfjs/ui/wire-toolbar-visibility`
3259
+
3260
+ ```ts
3261
+ type Root = HTMLElement | Document;
3262
+ /**
3263
+ * Wire ToolbarText and ToolbarControlGroup width thresholds below root.
3264
+ * Below is strict: hideBelow hides at width < threshold; showBelow hides at
3265
+ * width >= threshold. Percentages use the closest Toolbar's content box;
3266
+ * em and custom properties use the item's own inherited context. Invalid,
3267
+ * negative, unresolved, or contradictory thresholds leave the item visible.
3268
+ * This helper changes only a component-owned visibility marker. Existing
3269
+ * CSS visibility policies still apply. Dispose with the owning application.
3270
+ */
3271
+ declare function wireToolbarVisibility(root: Root): () => void;
3272
+
3273
+ export { wireToolbarVisibility };
3274
+ ```
3275
+
3315
3276
  ## `@kerfjs/ui/surface-scaffold`
3316
3277
 
3317
3278
  ```ts
3318
3279
  import * as kerfjs from 'kerfjs';
3319
3280
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3281
+ import { CssLength } from './css-values.js';
3320
3282
 
3321
3283
  type DialogSurfaceSize = 'small' | 'medium' | 'large';
3322
3284
  type DialogSurfacePresentation = 'modal' | 'side-sheet' | 'fullscreen';
3323
3285
  type SurfaceInset = 'none' | 'compact' | 'comfortable';
3286
+ type DialogSurfaceMaxHeight = CssLength | 'viewport';
3324
3287
  interface DialogSurfaceProps {
3325
3288
  children: KerfUiContent;
3326
3289
  size?: DialogSurfaceSize;
3327
3290
  presentation?: DialogSurfacePresentation;
3291
+ /** Modal preferred width. Takes precedence over size, within the viewport cap. */
3292
+ preferredWidth?: CssLength;
3328
3293
  bodyInset?: SurfaceInset;
3329
3294
  footerInset?: SurfaceInset;
3295
+ /** Modal edge clearance. Omit to retain Web Awesome's default viewport cap. */
3296
+ viewportGutter?: CssLength;
3297
+ /** Modal height cap, bounded by the dynamic viewport minus both gutters. */
3298
+ maxHeight?: DialogSurfaceMaxHeight;
3330
3299
  className?: string;
3331
3300
  /** Native named-slot assignment when composed inside a web component. */
3332
3301
  slot?: string;
3333
3302
  }
3334
3303
  /** Configure recurring Web Awesome dialog geometry without consumer ::part() CSS. */
3335
- declare function DialogSurface({ children, size, presentation, bodyInset, footerInset, className, slot, }: DialogSurfaceProps): kerfjs.SafeHtml;
3304
+ declare function DialogSurface({ children, size, presentation, preferredWidth, bodyInset, footerInset, viewportGutter, maxHeight, className, slot, }: DialogSurfaceProps): kerfjs.SafeHtml;
3336
3305
  type PopupSurfaceInset = 'standard' | 'compact' | 'list-zero';
3337
3306
  interface PopupSurfaceProps {
3338
3307
  children: KerfUiContent;
@@ -3344,7 +3313,7 @@ interface PopupSurfaceProps {
3344
3313
  /** Configure recurring Web Awesome dropdown-menu geometry without consumer ::part() CSS. */
3345
3314
  declare function PopupSurface({ children, inset, className, slot, }: PopupSurfaceProps): kerfjs.SafeHtml;
3346
3315
 
3347
- export { DialogSurface, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceSize, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset };
3316
+ export { DialogSurface, type DialogSurfaceMaxHeight, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceSize, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset };
3348
3317
  ```
3349
3318
 
3350
3319
  ## `@kerfjs/ui/text`
@@ -3353,6 +3322,7 @@ export { DialogSurface, type DialogSurfacePresentation, type DialogSurfaceProps,
3353
3322
  import * as kerfjs from 'kerfjs';
3354
3323
  import { KerfBaseAttrs } from 'kerfjs/jsx-runtime';
3355
3324
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3325
+ import { S as Sides } from './sides-BPSWde0A.js';
3356
3326
  import { CssForegroundColor } from './css-values.js';
3357
3327
 
3358
3328
  type FieldLabelProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
@@ -3384,6 +3354,8 @@ type TextCommonProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> &
3384
3354
  font?: TextFont;
3385
3355
  /** Transparent alignment border or no border when embedded in owner chrome. */
3386
3356
  border?: TextBorder;
3357
+ /** Add the shared control gutter outside selected physical edges. */
3358
+ controlMargins?: Sides;
3387
3359
  /** Remove the block variant's item padding and border in compact content. */
3388
3360
  flush?: boolean;
3389
3361
  /** Use compact leading for short dialog or metadata copy. */
@@ -3407,9 +3379,9 @@ type TextProps = TextCommonProps & ({
3407
3379
  * content-item padding; `span` adds no box geometry.
3408
3380
  * All ordinary native heading/paragraph attributes pass through to the element.
3409
3381
  */
3410
- declare function Text({ variant: Variant, tone, color, size, font, border, flush, lineHeight, wrap, maxLines, children, class: classValue, className, style, ...attributes }: TextProps): kerfjs.SafeHtml;
3382
+ declare function Text({ variant: Variant, tone, color, size, font, border, flush, controlMargins, lineHeight, wrap, maxLines, children, class: classValue, className, style, ...attributes }: TextProps): kerfjs.SafeHtml;
3411
3383
 
3412
- export { FieldLabel, type FieldLabelProps, Text, type TextBorder, type TextContent, type TextFont, type TextLineHeight, type TextProps, type TextSize, type TextTone, type TextVariant, type TextWrap };
3384
+ export { FieldLabel, type FieldLabelProps, Sides, Text, type TextBorder, type TextContent, type TextFont, type TextLineHeight, type TextProps, type TextSize, type TextTone, type TextVariant, type TextWrap };
3413
3385
  ```
3414
3386
 
3415
3387
  ## `@kerfjs/ui/row`