@kerfjs/ui 5.0.0-beta.100 → 5.0.0-beta.101

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 (148) hide show
  1. package/README.md +3 -1
  2. package/ai/component-catalog.json +214 -18
  3. package/ai/component-composition.json +216 -8
  4. package/ai/components/README.md +2 -0
  5. package/ai/components/backdrop-image.md +84 -0
  6. package/ai/components/nav-stack.md +6 -1
  7. package/ai/components/pane.md +11 -1
  8. package/ai/components/recipe-media-detail.md +57 -0
  9. package/ai/components/surface-scaffold.md +13 -6
  10. package/ai/components/tab-navigator.md +6 -1
  11. package/ai/components/toolbar-control-group.md +1 -0
  12. package/ai/public-api-signatures-v1.md +356 -32
  13. package/ai/skill.md +53 -5
  14. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  15. package/dist/backdrop-image.d.ts +132 -0
  16. package/dist/backdrop-image.js +5 -0
  17. package/dist/backdrop-image.js.map +1 -0
  18. package/dist/browser/backdrop-image.js +3 -0
  19. package/dist/catalog-resources.d.ts +2 -2
  20. package/dist/catalog.d.ts +2 -2
  21. package/dist/catalog.js +10 -9
  22. package/dist/catalog.js.map +1 -1
  23. package/dist/{chunk-QIG4IGUP.js → chunk-2PXZBFEC.js} +3 -1
  24. package/dist/chunk-2PXZBFEC.js.map +1 -0
  25. package/dist/{chunk-T4WJ5VGP.js → chunk-3SKAEPPZ.js} +2 -2
  26. package/dist/{chunk-T4WJ5VGP.js.map → chunk-3SKAEPPZ.js.map} +1 -1
  27. package/dist/chunk-5NQF35VO.js +67 -0
  28. package/dist/chunk-5NQF35VO.js.map +1 -0
  29. package/dist/{chunk-CMETHPKR.js → chunk-6E2H2E5A.js} +29 -8
  30. package/dist/chunk-6E2H2E5A.js.map +1 -0
  31. package/dist/{chunk-PIVY32AE.js → chunk-BYFTHA4I.js} +16 -3
  32. package/dist/chunk-BYFTHA4I.js.map +1 -0
  33. package/dist/{chunk-HGV7J4T6.js → chunk-EKHDLBRP.js} +1 -1
  34. package/dist/chunk-EKHDLBRP.js.map +1 -0
  35. package/dist/{chunk-QROYYGWU.js → chunk-FNZQOUZ5.js} +2 -2
  36. package/dist/{chunk-QROYYGWU.js.map → chunk-FNZQOUZ5.js.map} +1 -1
  37. package/dist/{chunk-EOO6PYGF.js → chunk-IXLUZHGT.js} +4 -4
  38. package/dist/{chunk-EOO6PYGF.js.map → chunk-IXLUZHGT.js.map} +1 -1
  39. package/dist/{chunk-UMKV7YVQ.js → chunk-LPHU44S3.js} +5 -1
  40. package/dist/chunk-LPHU44S3.js.map +1 -0
  41. package/dist/{chunk-INI4WDWC.js → chunk-M5KZ26VV.js} +27 -4
  42. package/dist/chunk-M5KZ26VV.js.map +1 -0
  43. package/dist/{chunk-TLMMFQWM.js → chunk-NS762OVM.js} +3 -3
  44. package/dist/{chunk-TLMMFQWM.js.map → chunk-NS762OVM.js.map} +1 -1
  45. package/dist/{chunk-CXZXHZTR.js → chunk-OZ6X76G5.js} +34 -1
  46. package/dist/chunk-OZ6X76G5.js.map +1 -0
  47. package/dist/{chunk-YOA5W5ZH.js → chunk-PKL6QJKK.js} +31 -3
  48. package/dist/chunk-PKL6QJKK.js.map +1 -0
  49. package/dist/chunk-QTSMHH5J.js +85 -0
  50. package/dist/chunk-QTSMHH5J.js.map +1 -0
  51. package/dist/chunk-SCDWURBO.js +136 -0
  52. package/dist/chunk-SCDWURBO.js.map +1 -0
  53. package/dist/{chunk-RHD7RKGI.js → chunk-SIW64V65.js} +3 -3
  54. package/dist/{chunk-RHD7RKGI.js.map → chunk-SIW64V65.js.map} +1 -1
  55. package/dist/chunk-SQ5DH66U.js +37 -0
  56. package/dist/chunk-SQ5DH66U.js.map +1 -0
  57. package/dist/{chunk-PYBBYSZ3.js → chunk-YBWQR2OK.js} +5 -5
  58. package/dist/{chunk-PYBBYSZ3.js.map → chunk-YBWQR2OK.js.map} +1 -1
  59. package/dist/{chunk-3GLYIIFR.js → chunk-ZYU5WRC3.js} +2 -2
  60. package/dist/{chunk-3GLYIIFR.js.map → chunk-ZYU5WRC3.js.map} +1 -1
  61. package/dist/collapsible-panel.js +3 -2
  62. package/dist/collapsible-panel.js.map +1 -1
  63. package/dist/index.d.ts +5 -3
  64. package/dist/index.js +24 -20
  65. package/dist/list-action-row.js +1 -1
  66. package/dist/list-header.js +1 -1
  67. package/dist/list-item.js +1 -1
  68. package/dist/{nav-stack-VXTumzKa.d.ts → nav-stack-CU_0dKtI.d.ts} +41 -5
  69. package/dist/nav-stack.d.ts +4 -4
  70. package/dist/nav-stack.js +2 -1
  71. package/dist/pane.d.ts +76 -4
  72. package/dist/pane.js +2 -1
  73. package/dist/select.js +1 -1
  74. package/dist/split-view.d.ts +4 -4
  75. package/dist/split-view.js +3 -2
  76. package/dist/split-view.js.map +1 -1
  77. package/dist/state-banner.js +1 -1
  78. package/dist/styles/backdrop-image.css +241 -0
  79. package/dist/styles/components/actions/toolbar/toolbar.css +9 -0
  80. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +128 -0
  81. package/dist/styles/components/layout/pane/pane.css +121 -1
  82. package/dist/styles/components/navigation/nav-stack/nav-stack.css +207 -6
  83. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +121 -3
  84. package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +241 -0
  85. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +166 -2
  86. package/dist/styles/foundation.css +165 -8
  87. package/dist/styles/nav-stack.css +207 -6
  88. package/dist/styles/overlay-sheet.css +211 -0
  89. package/dist/styles/pane.css +121 -1
  90. package/dist/styles/styles.css +1 -0
  91. package/dist/styles/surface-scaffold.css +166 -2
  92. package/dist/styles/tab-navigator.css +121 -3
  93. package/dist/styles/toolbar-control-group.css +128 -0
  94. package/dist/styles/toolbar.css +9 -0
  95. package/dist/styles/webawesome.css +10 -0
  96. package/dist/surface-scaffold-register.d.ts +3 -2
  97. package/dist/surface-scaffold-register.js +113 -10
  98. package/dist/surface-scaffold-register.js.map +1 -1
  99. package/dist/surface-scaffold.d.ts +38 -5
  100. package/dist/surface-scaffold.js +1 -1
  101. package/dist/tab-navigator.d.ts +43 -3
  102. package/dist/tab-navigator.js +35 -6
  103. package/dist/tab-navigator.js.map +1 -1
  104. package/dist/toolbar-control-group.d.ts +13 -2
  105. package/dist/toolbar-control-group.js +1 -1
  106. package/dist/toolbar-text.d.ts +6 -1
  107. package/dist/toolbar-text.js +1 -1
  108. package/dist/toolbar.d.ts +1 -0
  109. package/dist/wire-catalog.d.ts +2 -2
  110. package/dist/wire-catalog.js +1 -1
  111. package/dist/wire-nav-stack.js +29 -3
  112. package/dist/wire-nav-stack.js.map +1 -1
  113. package/dist/wire-overlay-sheets.d.ts +20 -0
  114. package/dist/wire-overlay-sheets.js +4 -0
  115. package/dist/wire-overlay-sheets.js.map +1 -0
  116. package/dist/wire-scroll-dividers.js +1 -1
  117. package/dist/wire-token-search-fields.js +1 -1
  118. package/dist/workbench.d.ts +2 -2
  119. package/dist/workbench.js +2 -1
  120. package/docs/accessibility.md +35 -0
  121. package/docs/app-layouts.md +13 -0
  122. package/docs/backdrop-image.md +128 -0
  123. package/docs/component-contract.md +2 -0
  124. package/docs/component-selection.md +11 -2
  125. package/docs/design/templates/toolbar-control-group/glass-dark.svg +1 -0
  126. package/docs/design/templates/toolbar-control-group/glass.svg +1 -0
  127. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  128. package/docs/design/templates/toolbar-control-group.svg +1 -1
  129. package/docs/design/templates.md +8 -0
  130. package/docs/layout.md +135 -5
  131. package/docs/manual-test-plan.md +29 -0
  132. package/docs/nav-stack.md +37 -1
  133. package/docs/recipes.md +24 -0
  134. package/docs/surface-scaffold.md +149 -3
  135. package/docs/tab-navigator.md +36 -0
  136. package/docs/ux-demo.md +11 -1
  137. package/llms.txt +42 -4
  138. package/package.json +13 -1
  139. package/ux-demo/recipes/loaders.ts +2 -0
  140. package/ux-demo/recipes/media-detail.tsx +272 -0
  141. package/dist/chunk-CMETHPKR.js.map +0 -1
  142. package/dist/chunk-CXZXHZTR.js.map +0 -1
  143. package/dist/chunk-HGV7J4T6.js.map +0 -1
  144. package/dist/chunk-INI4WDWC.js.map +0 -1
  145. package/dist/chunk-PIVY32AE.js.map +0 -1
  146. package/dist/chunk-QIG4IGUP.js.map +0 -1
  147. package/dist/chunk-UMKV7YVQ.js.map +0 -1
  148. package/dist/chunk-YOA5W5ZH.js.map +0 -1
@@ -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.100` and `kerfjs@5.0.0-beta.100`. 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.101` and `kerfjs@5.0.0-beta.101`. 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
 
@@ -166,6 +166,7 @@ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
166
166
  import { S as Sides } from './sides-BPSWde0A.js';
167
167
  import { PaneSeparatorSide } from './pane.js';
168
168
  import './scroll-clearance-BikHljTc.js';
169
+ import './css-values.js';
169
170
 
170
171
  type ToolbarPosition = 'header' | 'footer';
171
172
  /** Control-band density: `default` (60px with 44px groups) or `compact`. */
@@ -253,7 +254,12 @@ type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
253
254
  interface ToolbarTextBaseProps {
254
255
  text: string;
255
256
  size?: ToolbarTextSize;
256
- /** Use dark-toolbar foregrounds on a dark or photo-backed toolbar. */
257
+ /**
258
+ * Use loud-toolbar foregrounds on a toolbar painted with the inverse loud
259
+ * fill, matching dark control groups; like them it inverts with the color
260
+ * scheme. Over a dark photo or scrim keep the default tone inside a
261
+ * `BackdropImage` overlay, which takes the dark scheme under its scrim.
262
+ */
257
263
  tone?: ToolbarTextTone;
258
264
  /** Hide below this Toolbar content width; requires wireToolbarVisibility. */
259
265
  hideBelow?: CssLength;
@@ -326,6 +332,8 @@ import { CssLength } from './css-values.js';
326
332
 
327
333
  type ToolbarControlGroupAppearance = 'contained' | 'borderless';
328
334
  type ToolbarControlGroupTone = 'default' | 'dark';
335
+ /** Surface material: the opaque `solid` fill (default) or translucent `glass`. */
336
+ type ToolbarControlGroupMaterial = 'solid' | 'glass';
329
337
  /** Quiet palette for a contained, single decorative icon tile. */
330
338
  type ToolbarControlGroupTileTone = 'neutral' | 'brand' | 'success' | 'warning' | 'danger';
331
339
  type ToolbarControlGroupButtonAppearance = 'plain' | 'push';
@@ -366,6 +374,15 @@ interface ToolbarControlGroupProps {
366
374
  single?: boolean;
367
375
  appearance?: ToolbarControlGroupAppearance;
368
376
  tone?: ToolbarControlGroupTone;
377
+ /**
378
+ * `glass` paints the group on the translucent chrome material (backdrop
379
+ * blur and saturation) with a specular edge and a soft shadow, for a group
380
+ * floating over imagery or a clear toolbar. Controls take the normal text
381
+ * color so they keep AA over any content; the fill turns opaque under
382
+ * reduced transparency, increased contrast, static effects, or without
383
+ * backdrop-filter support. A borderless group has no surface and ignores it.
384
+ */
385
+ material?: ToolbarControlGroupMaterial;
369
386
  /** Quiet fill, matching border and foreground for a contained single group whose only child is a decorative SVG. Ignored for interactive or mixed content. */
370
387
  tileTone?: ToolbarControlGroupTileTone;
371
388
  buttonAppearance?: ToolbarControlGroupButtonAppearance;
@@ -421,9 +438,9 @@ interface ToolbarControlGroupProps {
421
438
  /** Native named-slot assignment when composed inside a web component. */
422
439
  slot?: string;
423
440
  }
424
- 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;
441
+ declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, material, 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;
425
442
 
426
- 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 };
443
+ export { ToolbarActionLink, type ToolbarActionLinkProps, ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupContent, type ToolbarControlGroupDensity, type ToolbarControlGroupExpandedOverflow, type ToolbarControlGroupFocusRing, type ToolbarControlGroupMaterial, type ToolbarControlGroupMenuInset, type ToolbarControlGroupOverflow, type ToolbarControlGroupPlacement, type ToolbarControlGroupProps, type ToolbarControlGroupSelectedChrome, type ToolbarControlGroupSelectedTone, type ToolbarControlGroupShape, type ToolbarControlGroupSize, type ToolbarControlGroupSizing, type ToolbarControlGroupTileTone, type ToolbarControlGroupTone, type ToolbarControlGroupVisibility };
427
444
  ```
428
445
 
429
446
  ## `@kerfjs/ui/floating-toolbar`
@@ -1531,6 +1548,31 @@ declare function wireScrollDividers(root: Root, { targets }?: WireScrollDividers
1531
1548
  export { type ScrollDividerTarget, type WireScrollDividersOptions, wireScrollDividers };
1532
1549
  ```
1533
1550
 
1551
+ ## `@kerfjs/ui/wire-overlay-sheets`
1552
+
1553
+ ```ts
1554
+ /**
1555
+ * Give every resizable core `kerfjs/overlay` bottom sheet opened in
1556
+ * `container` the resize grabber a `resizable` `DialogSurface` sheet has: a
1557
+ * `role="separator"` at the sheet's top edge that resizes its visible height
1558
+ * by drag or keyboard (arrows, Page Up/Down, Home, End), between
1559
+ * `--kui-overlay-sheet-min-height` (160px) and the sheet's cap below the top
1560
+ * safe area. A sheet opts in with the `kui-overlay-sheet-resizable` class
1561
+ * (`overlay()` and the promise dialogs alike) and opens at its content
1562
+ * height each time.
1563
+ *
1564
+ * kerf appends each overlay to its `container` (`document.body` by
1565
+ * default), so call this once per container you open sheets in. The grabber
1566
+ * is `data-morph-preserve` and returns to the top of the sheet after each
1567
+ * re-render of the overlay's content. Requires
1568
+ * `@kerfjs/ui/overlay-sheet.css`. Returns a disposer that removes every
1569
+ * grabber and stops watching.
1570
+ */
1571
+ declare function wireOverlaySheets(container?: ParentNode): () => void;
1572
+
1573
+ export { wireOverlaySheets };
1574
+ ```
1575
+
1534
1576
  ## `@kerfjs/ui/wire-list-reorder`
1535
1577
 
1536
1578
  ```ts
@@ -1601,16 +1643,16 @@ export { wireListFocusScroll };
1601
1643
  ## `@kerfjs/ui/nav-stack`
1602
1644
 
1603
1645
  ```ts
1604
- export { c as NavStack, d as NavStackBottomToolbarPresentation, e as NavStackChromePresentation, N as NavStackProps, f as NavStackToolbarConfig, a as NavStackView, g as NavStackViewBottomToolbar, h as NavStackViewToolbar } from './nav-stack-VXTumzKa.js';
1646
+ export { c as NavStack, d as NavStackBottomToolbarPresentation, e as NavStackChromePresentation, N as NavStackProps, f as NavStackToolbarConfig, a as NavStackView, g as NavStackViewBottomToolbar, h as NavStackViewToolbar } from './nav-stack-CU_0dKtI.js';
1605
1647
  import 'kerfjs';
1606
1648
  import './semantic-content-BbzjvSu9.js';
1649
+ import './pane.js';
1650
+ import './scroll-clearance-BikHljTc.js';
1651
+ import './css-values.js';
1607
1652
  import './list.js';
1608
1653
  import './extension-attributes-mu8MFUl0.js';
1609
1654
  import './flex-alignment-4ms8ZbV8.js';
1610
- import './scroll-clearance-BikHljTc.js';
1611
1655
  import './sides-BPSWde0A.js';
1612
- import './css-values.js';
1613
- import './pane.js';
1614
1656
  import './panel-toolbar-vg6Ir5Dy.js';
1615
1657
  import './toolbar.js';
1616
1658
  import './lucide-icon.js';
@@ -1646,15 +1688,15 @@ export { type WireNavStackOptions, wireNavStack };
1646
1688
  ```ts
1647
1689
  import * as kerfjs from 'kerfjs';
1648
1690
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1649
- import { N as NavStackProps, a as NavStackView } from './nav-stack-VXTumzKa.js';
1691
+ import { N as NavStackProps, a as NavStackView } from './nav-stack-CU_0dKtI.js';
1650
1692
  import { ResizableRegionProps } from './resizable-region.js';
1693
+ import './pane.js';
1694
+ import './scroll-clearance-BikHljTc.js';
1695
+ import './css-values.js';
1651
1696
  import './list.js';
1652
1697
  import './extension-attributes-mu8MFUl0.js';
1653
1698
  import './flex-alignment-4ms8ZbV8.js';
1654
- import './scroll-clearance-BikHljTc.js';
1655
1699
  import './sides-BPSWde0A.js';
1656
- import './css-values.js';
1657
- import './pane.js';
1658
1700
  import './panel-toolbar-vg6Ir5Dy.js';
1659
1701
  import './toolbar.js';
1660
1702
  import './lucide-icon.js';
@@ -1751,6 +1793,38 @@ export { SplitView, type SplitViewCompactStack, type SplitViewCompactViewToolbar
1751
1793
  import * as kerfjs from 'kerfjs';
1752
1794
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1753
1795
  import { S as ScrollClearance } from './scroll-clearance-BikHljTc.js';
1796
+ import { CssColor } from './css-values.js';
1797
+
1798
+ /**
1799
+ * What clear (fully transparent) chrome fades in as content scrolls beneath
1800
+ * it: `none` stays clear; `material` fades in the translucent chrome
1801
+ * material; `surface` fades in the opaque surface. The fade tracks the scroll
1802
+ * over `scrollEdgeDistance` (opacity only), from the scroll state
1803
+ * `wireScrollDividers` reports; unwired, the chrome stays clear.
1804
+ */
1805
+ type ScrollEdge = 'none' | 'material' | 'surface';
1806
+
1807
+ /** The color scheme an app declares for a {@link SurfaceTint}'s color. */
1808
+ type SurfaceTintScheme = 'light' | 'dark';
1809
+ /**
1810
+ * A scoped tint for a layout surface: the app's color (usually sampled from
1811
+ * artwork it already knows) and the scheme that color belongs to. Kerf does no
1812
+ * color detection; `scheme` says whether the color reads as a light or a dark
1813
+ * surface. Inside the scope the surface, raised surface, text, quiet text, and
1814
+ * everything built on them (quiet fills, separators' backdrop, the chrome
1815
+ * material) re-derive from the color, with lightness clamped so text keeps
1816
+ * WCAG AA over any color.
1817
+ */
1818
+ interface SurfaceTint {
1819
+ color: CssColor;
1820
+ scheme: SurfaceTintScheme;
1821
+ /**
1822
+ * An optional accent (usually the artwork's most vivid color). The scope's
1823
+ * brand ramp re-derives from it: loud fills and their text, brand text and
1824
+ * links, text on brand fills, and the focus ring, each clamped to keep AA.
1825
+ */
1826
+ accent?: CssColor;
1827
+ }
1754
1828
 
1755
1829
  /**
1756
1830
  * Logical pane sides: where a {@link Pane} can show a separator and where it can
@@ -1774,10 +1848,16 @@ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
1774
1848
  'data-chrome-placement'?: never;
1775
1849
  'data-chrome-dividers'?: never;
1776
1850
  'data-appearance'?: never;
1851
+ 'data-background'?: never;
1852
+ 'data-kui-tint'?: never;
1853
+ 'data-kui-tint-accent'?: never;
1777
1854
  'data-deep-inset'?: never;
1778
1855
  'data-outlined'?: never;
1779
1856
  'data-scroll-clearance'?: never;
1780
1857
  'data-header-presentation'?: never;
1858
+ 'data-header-material'?: never;
1859
+ 'data-scroll-edge'?: never;
1860
+ 'data-scroll-edge-distance'?: never;
1781
1861
  'data-header-overlay'?: never;
1782
1862
  }>;
1783
1863
  /** How a Pane's header and footer relate to its scrolling content. */
@@ -1792,8 +1872,12 @@ type PaneChromeDividers = 'scroll' | 'always' | 'none';
1792
1872
  * How a Pane's header relates to its scrolling content: `docked` in its own
1793
1873
  * row above the content, or `overlay` laid over the content's top edge on the
1794
1874
  * translucent chrome material, so content scrolls visibly beneath it.
1875
+ * `clear` lays it over
1876
+ * the same edge fully transparent, for chrome over imagery: legibility comes
1877
+ * from glass control groups or a scrim, and with `scrollEdge="material"` the
1878
+ * chrome material fades in once content scrolls beneath it.
1795
1879
  */
1796
- type PaneHeaderPresentation = 'docked' | 'overlay';
1880
+ type PaneHeaderPresentation = 'docked' | 'overlay' | 'clear';
1797
1881
  /** Background treatment of the Pane's scrolling work surface. */
1798
1882
  type PaneAppearance = 'default' | 'sunken';
1799
1883
  interface PaneProps {
@@ -1839,8 +1923,38 @@ interface PaneProps {
1839
1923
  * content passing beneath it.
1840
1924
  */
1841
1925
  headerPresentation?: PaneHeaderPresentation;
1926
+ /**
1927
+ * With `headerPresentation="clear"`, `material` fades the chrome material
1928
+ * in behind the header once content scrolls beneath it (default `none`).
1929
+ */
1930
+ scrollEdge?: ScrollEdge;
1931
+ /**
1932
+ * The scroll distance, in CSS pixels, over which the scroll edge fades in
1933
+ * (default 60).
1934
+ */
1935
+ scrollEdgeDistance?: number;
1842
1936
  /** Paint the scrolling work surface with the shared lowered-surface color. */
1843
1937
  appearance?: PaneAppearance;
1938
+ /**
1939
+ * Paint the whole pane, header and footer included, in an app-chosen color
1940
+ * (`uiColor('surface-raised')`, `fillColor('#1f2a44')`, or `colorVar(…)`
1941
+ * from `@kerfjs/ui/css-values`). It replaces the appearance's fill: a sunken
1942
+ * pane drops its lowered color and grain. Omitted, the pane keeps its
1943
+ * default (transparent, or the sunken surface). Forced colors paint
1944
+ * `Canvas`. Keep text at AA over the color; a dark color needs a matching
1945
+ * tint or dark tones for its content.
1946
+ */
1947
+ background?: CssColor;
1948
+ /**
1949
+ * A scoped tint: `{ color, scheme }`, the app's color and the scheme it
1950
+ * belongs to. The pane paints the tinted surface (unless `background` is
1951
+ * set) and its whole subtree, chrome material and quiet fills included,
1952
+ * re-derives its surface and text tokens from the color with lightness
1953
+ * clamped to keep text at WCAG AA. Without relative color syntax, or under
1954
+ * `prefers-contrast: more`, the scope keeps the plain palette in the
1955
+ * declared scheme.
1956
+ */
1957
+ tint?: SurfaceTint;
1844
1958
  /**
1845
1959
  * Clear chrome that lies over the scrolling content's block-start and/or
1846
1960
  * block-end edge, such as a `DialogSurface` floating footer over a filling
@@ -1891,16 +2005,16 @@ interface PaneProps {
1891
2005
  * or a CollapsiblePanel) forwards, so the app configures that pane instead of
1892
2006
  * styling it. An omitted or `undefined` field keeps the composite's default.
1893
2007
  */
1894
- type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'headerPresentation' | 'appearance' | 'deepInset' | 'scrollClearance' | 'tabIndex' | 'outlined'>;
2008
+ type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'headerPresentation' | 'scrollEdge' | 'scrollEdgeDistance' | 'appearance' | 'background' | 'tint' | 'deepInset' | 'scrollClearance' | 'tabIndex' | 'outlined'>;
1895
2009
  /**
1896
2010
  * An unpadded application column with optional fixed header/footer slots and one
1897
2011
  * scrolling vertical content owner. Separator lines are independently opt-in on
1898
2012
  * each logical edge, so the same component works as a sidebar, main area,
1899
2013
  * inspector, or dialog column.
1900
2014
  */
1901
- declare function Pane({ header, children, footer, chromePlacement, chromeDividers, headerPresentation, appearance, deepInset, scrollClearance, tabIndex, outlined, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
2015
+ declare function Pane({ header, children, footer, chromePlacement, chromeDividers, headerPresentation, scrollEdge, scrollEdgeDistance, appearance, background, tint, deepInset, scrollClearance, tabIndex, outlined, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
1902
2016
 
1903
- export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneHeaderPresentation, type PaneProps, type PaneSeparatorSide, ScrollClearance };
2017
+ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneHeaderPresentation, type PaneProps, type PaneSeparatorSide, ScrollClearance, type ScrollEdge, type SurfaceTint, type SurfaceTintScheme };
1904
2018
  ```
1905
2019
 
1906
2020
  ## `@kerfjs/ui/workbench`
@@ -1908,14 +2022,14 @@ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlac
1908
2022
  ```ts
1909
2023
  import { SafeHtml } from 'kerfjs';
1910
2024
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1911
- import { b as NavPane, N as NavStackProps } from './nav-stack-VXTumzKa.js';
2025
+ import { b as NavPane, N as NavStackProps } from './nav-stack-CU_0dKtI.js';
1912
2026
  import { ListConfig } from './list.js';
1913
2027
  import { PaneConfig } from './pane.js';
1914
2028
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
1915
2029
  import { a as PanelToolbar, c as PanelBottomToolbar, b as PanelChromePlacement, d as PanelToggle } from './panel-toolbar-vg6Ir5Dy.js';
1916
2030
  import { ToolbarConfig } from './toolbar.js';
1917
- import './toolbar-text.js';
1918
2031
  import './css-values.js';
2032
+ import './toolbar-text.js';
1919
2033
  import './extension-attributes-mu8MFUl0.js';
1920
2034
  import './flex-alignment-4ms8ZbV8.js';
1921
2035
  import './scroll-clearance-BikHljTc.js';
@@ -2528,7 +2642,8 @@ export { type SidebarStorage, type WireSidebarOptions, type WireSidebarPanel, wi
2528
2642
  ```ts
2529
2643
  import { SafeHtml } from 'kerfjs';
2530
2644
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2531
- import { PaneAppearance } from './pane.js';
2645
+ import { PaneAppearance, SurfaceTint, ScrollEdge } from './pane.js';
2646
+ import { CssColor } from './css-values.js';
2532
2647
  import './scroll-clearance-BikHljTc.js';
2533
2648
 
2534
2649
  interface TabNavigatorTabBase<Id extends string> {
@@ -2540,6 +2655,17 @@ interface TabNavigatorTabBase<Id extends string> {
2540
2655
  content: KerfUiContent;
2541
2656
  /** Background of this scene's scrolling work surface. */
2542
2657
  appearance?: PaneAppearance;
2658
+ /**
2659
+ * Paint this scene in an app-chosen color (a `@kerfjs/ui/css-values` color
2660
+ * builder). It replaces the appearance's fill. Forced colors paint `Canvas`.
2661
+ */
2662
+ background?: CssColor;
2663
+ /**
2664
+ * A scoped tint (`{ color, scheme }`) for this scene: its surfaces and every
2665
+ * descendant re-derive their surface and text tokens from the app's color
2666
+ * in the declared scheme, with lightness clamped to keep text at WCAG AA.
2667
+ */
2668
+ tint?: SurfaceTint;
2543
2669
  /** Add 8px to every side of a plain scene's scrolling content. */
2544
2670
  deepInset?: boolean;
2545
2671
  /** Opt into keyboard (`0`) or programmatic (`-1`) focus on this scene. */
@@ -2585,8 +2711,13 @@ type TabNavigatorTab<Id extends string = string> = TabNavigatorTabBase<Id> & (Ta
2585
2711
  * How a {@link TabNavigator}'s tab bar relates to the active scene: `docked`
2586
2712
  * below it, or `overlay` laid over its bottom edge on the translucent chrome
2587
2713
  * material, so the scene's content scrolls visibly beneath the bar.
2714
+ * `clear` lays it over
2715
+ * the same edge fully transparent, for chrome over imagery: legibility comes
2716
+ * from glass control groups or a scrim, and with `scrollEdge="material"` the
2717
+ * chrome material fades in once content scrolls beneath
2718
+ * it, until the scene scrolls to its end.
2588
2719
  */
2589
- type TabNavigatorBarPresentation = 'docked' | 'overlay';
2720
+ type TabNavigatorBarPresentation = 'docked' | 'overlay' | 'clear';
2590
2721
  interface TabNavigatorProps<Id extends string = string> {
2591
2722
  id: string;
2592
2723
  /** Accessible name for the tab bar. */
@@ -2625,6 +2756,29 @@ interface TabNavigatorProps<Id extends string = string> {
2625
2756
  * toward the normal text color to keep AA over the content beneath.
2626
2757
  */
2627
2758
  barPresentation?: TabNavigatorBarPresentation;
2759
+ /**
2760
+ * With `barPresentation="clear"`, `material` fades the chrome material in
2761
+ * behind the bar while the active scene continues beneath it (default
2762
+ * `none`).
2763
+ */
2764
+ scrollEdge?: ScrollEdge;
2765
+ /**
2766
+ * The scroll distance, in CSS pixels, over which the scroll edge fades in
2767
+ * (default 60).
2768
+ */
2769
+ scrollEdgeDistance?: number;
2770
+ /**
2771
+ * Paint the navigator, and its docked tab bar, in an app-chosen color (a
2772
+ * `@kerfjs/ui/css-values` color builder) instead of the surface. A tab's own
2773
+ * `background` paints its scene. Forced colors paint `Canvas`.
2774
+ */
2775
+ background?: CssColor;
2776
+ /**
2777
+ * A scoped tint (`{ color, scheme }`) for the navigator, its bar, and every scene: its surfaces and every
2778
+ * descendant re-derive their surface and text tokens from the app's color
2779
+ * in the declared scheme, with lightness clamped to keep text at WCAG AA.
2780
+ */
2781
+ tint?: SurfaceTint;
2628
2782
  className?: string;
2629
2783
  /** Native named-slot assignment when composed inside a web component. */
2630
2784
  slot?: string;
@@ -2637,7 +2791,7 @@ interface TabNavigatorProps<Id extends string = string> {
2637
2791
  * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of
2638
2792
  * a bottom bar. See `docs/23-app-layouts.md` §3.4.
2639
2793
  */
2640
- declare function TabNavigator<Id extends string>({ id, label, tabs, active, separator, chromeDividers, barPresentation, className, slot, }: TabNavigatorProps<Id>): SafeHtml;
2794
+ declare function TabNavigator<Id extends string>({ id, label, tabs, active, separator, chromeDividers, barPresentation, scrollEdge, scrollEdgeDistance, background, tint, className, slot, }: TabNavigatorProps<Id>): SafeHtml;
2641
2795
 
2642
2796
  export { TabNavigator, type TabNavigatorBarPresentation, type TabNavigatorProps, type TabNavigatorTab };
2643
2797
  ```
@@ -2817,12 +2971,12 @@ import './toolbar.js';
2817
2971
  import './sides-BPSWde0A.js';
2818
2972
  import './pane.js';
2819
2973
  import './scroll-clearance-BikHljTc.js';
2974
+ import './css-values.js';
2820
2975
  import './workbench.js';
2821
- import './nav-stack-VXTumzKa.js';
2976
+ import './nav-stack-CU_0dKtI.js';
2822
2977
  import './list.js';
2823
2978
  import './extension-attributes-mu8MFUl0.js';
2824
2979
  import './flex-alignment-4ms8ZbV8.js';
2825
- import './css-values.js';
2826
2980
  import './panel-toolbar-vg6Ir5Dy.js';
2827
2981
  import './lucide-icon.js';
2828
2982
  import 'lucide';
@@ -2972,12 +3126,12 @@ import './semantic-content-BbzjvSu9.js';
2972
3126
  import './sides-BPSWde0A.js';
2973
3127
  import './pane.js';
2974
3128
  import './scroll-clearance-BikHljTc.js';
3129
+ import './css-values.js';
2975
3130
  import './workbench.js';
2976
- import './nav-stack-VXTumzKa.js';
3131
+ import './nav-stack-CU_0dKtI.js';
2977
3132
  import './list.js';
2978
3133
  import './extension-attributes-mu8MFUl0.js';
2979
3134
  import './flex-alignment-4ms8ZbV8.js';
2980
- import './css-values.js';
2981
3135
  import './panel-toolbar-vg6Ir5Dy.js';
2982
3136
  import './lucide-icon.js';
2983
3137
  import 'lucide';
@@ -3027,12 +3181,12 @@ import './semantic-content-BbzjvSu9.js';
3027
3181
  import './sides-BPSWde0A.js';
3028
3182
  import './pane.js';
3029
3183
  import './scroll-clearance-BikHljTc.js';
3184
+ import './css-values.js';
3030
3185
  import './workbench.js';
3031
- import './nav-stack-VXTumzKa.js';
3186
+ import './nav-stack-CU_0dKtI.js';
3032
3187
  import './list.js';
3033
3188
  import './extension-attributes-mu8MFUl0.js';
3034
3189
  import './flex-alignment-4ms8ZbV8.js';
3035
- import './css-values.js';
3036
3190
  import './panel-toolbar-vg6Ir5Dy.js';
3037
3191
  import './lucide-icon.js';
3038
3192
  import 'lucide';
@@ -4077,6 +4231,143 @@ declare function LucideIcon({ icon, name, appearance, className, color, inline,
4077
4231
  export { LucideIcon, type LucideIconProps, type LucideIconSize, type LucideNode };
4078
4232
  ```
4079
4233
 
4234
+ ## `@kerfjs/ui/backdrop-image`
4235
+
4236
+ ```ts
4237
+ import * as kerfjs from 'kerfjs';
4238
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
4239
+ import { S as StructuralRootAttributes } from './extension-attributes-mu8MFUl0.js';
4240
+ import { CssLength, CssColor } from './css-values.js';
4241
+
4242
+ /** How a single image fills the backdrop (`object-fit`). */
4243
+ type BackdropImageFit = 'cover' | 'contain' | 'fill';
4244
+ /** Which part of the image stays in view when it is cropped. */
4245
+ type BackdropImagePosition = 'center' | 'top' | 'bottom' | 'left' | 'right' | 'top left' | 'top right' | 'bottom left' | 'bottom right';
4246
+ /** Tile the image as a background instead of fitting one copy. */
4247
+ type BackdropImageRepeat = 'repeat' | 'repeat-x' | 'repeat-y';
4248
+ /**
4249
+ * How far the image lags the scroll: `none` scrolls with the content,
4250
+ * `subtle` lags by 35%, and a number from 0 to 1 is the lag factor (0.5
4251
+ * moves the image at half the scroll speed).
4252
+ */
4253
+ type BackdropImageParallax = 'none' | 'subtle' | number;
4254
+ /**
4255
+ * A dimming layer under `overlay` content: `bottom` darkens toward the
4256
+ * block end where a title sits, `full` dims the whole image evenly.
4257
+ */
4258
+ type BackdropImageScrim = 'none' | 'bottom' | 'full';
4259
+ /**
4260
+ * A scroll-linked progressive blur: a statically blurred copy of the image
4261
+ * fades in as the image block scrolls away. Only the copy's opacity (and the
4262
+ * optional dim layer's) animates; the blur itself is set once.
4263
+ */
4264
+ interface BackdropImageBlur {
4265
+ /**
4266
+ * CSS blur radius applied once to the copy. Default 24px; with
4267
+ * `blurredSrc` the default is no filter, since that asset is already soft.
4268
+ */
4269
+ radius?: CssLength;
4270
+ /**
4271
+ * An app-supplied pre-blurred or low-resolution copy of the image, used
4272
+ * instead of filtering `src`.
4273
+ */
4274
+ blurredSrc?: string;
4275
+ /**
4276
+ * Peak opacity, from 0 to 1, of a black dim layer that ramps in with the
4277
+ * blur. Default 0 (no dim layer).
4278
+ */
4279
+ dim?: number;
4280
+ }
4281
+ type BackdropImageRootAttributes = StructuralRootAttributes & Readonly<{
4282
+ 'data-component'?: never;
4283
+ 'data-blur'?: never;
4284
+ 'data-parallax'?: never;
4285
+ 'data-scrim'?: never;
4286
+ 'data-fade'?: never;
4287
+ 'data-repeat'?: never;
4288
+ 'data-under-chrome'?: never;
4289
+ }>;
4290
+ interface BackdropImageCommonProps {
4291
+ /** Image URL. */
4292
+ src: string;
4293
+ /**
4294
+ * Accessible description of the image. Pass `''` for a decorative image
4295
+ * that only sets a mood; assistive technology then skips it.
4296
+ */
4297
+ alt: string;
4298
+ /** Which part of a cropped image stays in view. Default `center`. */
4299
+ position?: BackdropImagePosition;
4300
+ /** Height of the image block. Default 320px (`remify(320)`). */
4301
+ height?: CssLength;
4302
+ /** How far the image lags the scroll. Default `none`. */
4303
+ parallax?: BackdropImageParallax;
4304
+ /**
4305
+ * The color the image fades into at its block end. It also paints the
4306
+ * whole surface, so `children` below the image sit on the same color and
4307
+ * the page reads as one surface. Omit for a hard edge with no surface.
4308
+ */
4309
+ fadeTo?: CssColor;
4310
+ /**
4311
+ * Blur the image progressively as it scrolls away, by cross-fading a
4312
+ * statically blurred copy. Static (unblurred) wherever parallax is.
4313
+ */
4314
+ blur?: BackdropImageBlur;
4315
+ /**
4316
+ * Run the image up beneath the scroller's block-start inset: an overlay or
4317
+ * clear Pane header, NavStack chrome handed to a view's Pane, and the top
4318
+ * safe area, the way a media page's artwork fills the screen behind
4319
+ * transparent chrome. The visible image keeps `height` below that inset,
4320
+ * and `overlay` content stays clear of the chrome. Place the image first in
4321
+ * the Pane's content; it reads the Pane's
4322
+ * `--kui-pane-content-inset-block-start`. Default `false`.
4323
+ */
4324
+ underChrome?: boolean;
4325
+ /** Dim the image under `overlay` content. Default `none`. */
4326
+ scrim?: BackdropImageScrim;
4327
+ /** Content laid over the image's block end, such as a title and actions. */
4328
+ overlay?: KerfUiContent;
4329
+ /** Content that continues below the image on the `fadeTo` surface. */
4330
+ children?: KerfUiContent;
4331
+ id?: string;
4332
+ className?: string;
4333
+ /** Safe `data-*`, `aria-*`, and structural `role` metadata on the root. */
4334
+ rootAttributes?: BackdropImageRootAttributes;
4335
+ /** Native named-slot assignment when composed inside a web component. */
4336
+ slot?: string;
4337
+ }
4338
+ /** One fitted image, with optional responsive candidates. */
4339
+ interface BackdropImageSingleProps extends BackdropImageCommonProps {
4340
+ repeat?: undefined;
4341
+ /** Responsive image candidates (`srcset`). */
4342
+ srcset?: string;
4343
+ /** Rendered-size hints for `srcset` (`sizes`). */
4344
+ sizes?: string;
4345
+ /** How the image fills the block. Default `cover`. */
4346
+ fit?: BackdropImageFit;
4347
+ }
4348
+ /** A tiled background image at its natural size. */
4349
+ interface BackdropImageTiledProps extends BackdropImageCommonProps {
4350
+ repeat: BackdropImageRepeat;
4351
+ srcset?: never;
4352
+ sizes?: never;
4353
+ fit?: never;
4354
+ }
4355
+ type BackdropImageProps = BackdropImageSingleProps | BackdropImageTiledProps;
4356
+ /**
4357
+ * An image backdrop at the top of a scrolling Pane or NavStack view: the
4358
+ * image can lag the scroll (parallax on a scroll-driven, compositor-only
4359
+ * transform), fade through a mask into `fadeTo`, and that color keeps
4360
+ * painting under `children` so the page reads as one surface. Kerf owns the
4361
+ * static fallbacks: no parallax without scroll-driven animation support,
4362
+ * under reduced motion, under `data-kui-effects="static"`, or on a
4363
+ * slow-update display, and a hard edge onto solid `fadeTo` under reduced
4364
+ * transparency.
4365
+ */
4366
+ declare function BackdropImage(props: BackdropImageProps): kerfjs.SafeHtml;
4367
+
4368
+ export { BackdropImage, type BackdropImageBlur, type BackdropImageFit, type BackdropImageParallax, type BackdropImagePosition, type BackdropImageProps, type BackdropImageRepeat, type BackdropImageScrim, type BackdropImageSingleProps, type BackdropImageTiledProps };
4369
+ ```
4370
+
4080
4371
  ## `@kerfjs/ui/wire-toolbar-visibility`
4081
4372
 
4082
4373
  ```ts
@@ -4103,7 +4394,19 @@ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
4103
4394
  import { CssLength } from './css-values.js';
4104
4395
 
4105
4396
  type DialogSurfaceSize = 'small' | 'medium' | 'large';
4106
- type DialogSurfacePresentation = 'modal' | 'side-sheet' | 'fullscreen';
4397
+ /**
4398
+ * How the dialog is presented: `modal` (default) centered on the screen,
4399
+ * `side-sheet` against the inline end, `fullscreen`, or `bottom-sheet`
4400
+ * attached to the bottom edge (square bottom corners, safe-area and
4401
+ * virtual-keyboard clearance, optionally user-resizable).
4402
+ */
4403
+ type DialogSurfacePresentation = 'modal' | 'side-sheet' | 'fullscreen' | 'bottom-sheet';
4404
+ /**
4405
+ * How a bottom sheet appears or leaves: `slide` (default) moves the panel in
4406
+ * from, or out to, the bottom edge; `standard` keeps Web Awesome's
4407
+ * scale-and-fade. Both honor `prefers-reduced-motion`.
4408
+ */
4409
+ type DialogSurfaceSheetMotion = 'slide' | 'standard';
4107
4410
  type SurfaceInset = 'none' | 'compact' | 'comfortable';
4108
4411
  type DialogSurfaceMaxHeight = CssLength | 'viewport';
4109
4412
  /** A definite modal height: a length or the full viewport, minus both gutters. */
@@ -4144,13 +4447,34 @@ interface DialogSurfaceProps {
4144
4447
  footerInset?: SurfaceInset;
4145
4448
  /** Modal edge clearance. Omit to retain Web Awesome's default viewport cap. */
4146
4449
  viewportGutter?: CssLength;
4147
- /** Modal height cap, bounded by the dynamic viewport minus both gutters. */
4450
+ /**
4451
+ * Modal height cap, bounded by the dynamic viewport minus both gutters. On a
4452
+ * bottom sheet, the cap (and the resize ceiling), bounded by the dynamic
4453
+ * viewport minus the top safe area and one gutter.
4454
+ */
4148
4455
  maxHeight?: DialogSurfaceMaxHeight;
4149
4456
  /**
4150
4457
  * Modal definite height, bounded the same way, so a filling child has a
4151
- * height to fill. Takes precedence over `maxHeight`.
4458
+ * height to fill. Takes precedence over `maxHeight`. On a bottom sheet, the
4459
+ * height it opens at (the visible height above the safe area or keyboard).
4152
4460
  */
4153
4461
  height?: DialogSurfaceHeight;
4462
+ /**
4463
+ * A resizable bottom sheet's resize floor (default 160px), the visible
4464
+ * height above the safe area or keyboard.
4465
+ */
4466
+ minHeight?: CssLength;
4467
+ /**
4468
+ * Let the person resize a bottom sheet by its top grabber (drag, or the
4469
+ * arrow, Page Up/Down, Home and End keys) between `minHeight` and the
4470
+ * sheet's cap. Needs the `/register` entry; each opening starts at `height`
4471
+ * (or the content height). Ignored by other presentations.
4472
+ */
4473
+ resizable?: boolean;
4474
+ /** How a bottom sheet appears (default `slide` up from the bottom edge). */
4475
+ enterMotion?: DialogSurfaceSheetMotion;
4476
+ /** How a bottom sheet is dismissed (default `slide` down off the bottom edge). */
4477
+ exitMotion?: DialogSurfaceSheetMotion;
4154
4478
  /**
4155
4479
  * Body layout (default `flow`); `fill` lets one child own the body and
4156
4480
  * `fill-last` stacks fixed rows above one filling last child.
@@ -4200,7 +4524,7 @@ interface DialogSurfaceProps {
4200
4524
  slot?: string;
4201
4525
  }
4202
4526
  /** Configure recurring Web Awesome dialog geometry without consumer ::part() CSS. */
4203
- declare function DialogSurface({ children, size, presentation, preferredWidth, bodyInset, footerInset, viewportGutter, maxHeight, height, bodyLayout, headerPresentation, footerPresentation, footerOffset, rootAttributes, className, slot, }: DialogSurfaceProps): kerfjs.SafeHtml;
4527
+ declare function DialogSurface({ children, size, presentation, preferredWidth, bodyInset, footerInset, viewportGutter, maxHeight, height, minHeight, resizable, enterMotion, exitMotion, bodyLayout, headerPresentation, footerPresentation, footerOffset, rootAttributes, className, slot, }: DialogSurfaceProps): kerfjs.SafeHtml;
4204
4528
  /** Where a PopoverDialogSurface appears: the top layer, or in flow. */
4205
4529
  type PopoverDialogSurfacePresentation = 'overlay' | 'embedded';
4206
4530
  /** Application `data-*` metadata on the surface root. */
@@ -4267,7 +4591,7 @@ interface PopupSurfaceProps {
4267
4591
  /** Configure recurring Web Awesome dropdown-menu geometry without consumer ::part() CSS. */
4268
4592
  declare function PopupSurface({ children, inset, className, slot, }: PopupSurfaceProps): kerfjs.SafeHtml;
4269
4593
 
4270
- export { DialogSurface, type DialogSurfaceBodyLayout, type DialogSurfaceFooterPresentation, type DialogSurfaceHeaderPresentation, type DialogSurfaceHeight, type DialogSurfaceMaxHeight, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceRootAttributes, type DialogSurfaceSize, PopoverDialogSurface, type PopoverDialogSurfaceDataAttributes, type PopoverDialogSurfacePresentation, type PopoverDialogSurfaceProps, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset };
4594
+ export { DialogSurface, type DialogSurfaceBodyLayout, type DialogSurfaceFooterPresentation, type DialogSurfaceHeaderPresentation, type DialogSurfaceHeight, type DialogSurfaceMaxHeight, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceRootAttributes, type DialogSurfaceSheetMotion, type DialogSurfaceSize, PopoverDialogSurface, type PopoverDialogSurfaceDataAttributes, type PopoverDialogSurfacePresentation, type PopoverDialogSurfaceProps, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset };
4271
4595
  ```
4272
4596
 
4273
4597
  ## `@kerfjs/ui/text`