@kerfjs/ui 5.0.0-beta.110 → 5.0.0-beta.112

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 (211) hide show
  1. package/README.md +3 -0
  2. package/ai/component-catalog.json +161 -8
  3. package/ai/component-composition.json +119 -2
  4. package/ai/components/README.md +2 -0
  5. package/ai/components/backdrop-image.md +1 -0
  6. package/ai/components/button.md +5 -2
  7. package/ai/components/content-item.md +1 -0
  8. package/ai/components/editor-frame.md +80 -0
  9. package/ai/components/summary-row.md +5 -2
  10. package/ai/components/surface-scaffold.md +3 -0
  11. package/ai/components/value-preview.md +75 -0
  12. package/ai/public-api-signatures-v1.md +207 -50
  13. package/ai/skill.md +17 -0
  14. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  15. package/dist/backdrop-image.d.ts +11 -0
  16. package/dist/backdrop-image.js +1 -1
  17. package/dist/browser/content-item.js +1 -0
  18. package/dist/browser/editor-frame.js +3 -0
  19. package/dist/browser/value-preview.js +3 -0
  20. package/dist/button.d.ts +4 -2
  21. package/dist/button.js +1 -1
  22. package/dist/catalog-resources.d.ts +2 -1
  23. package/dist/catalog.d.ts +2 -1
  24. package/dist/catalog.js +6 -4
  25. package/dist/catalog.js.map +1 -1
  26. package/dist/{chunk-JCCN3U6X.js → chunk-2J7XKAZX.js} +3 -2
  27. package/dist/chunk-2J7XKAZX.js.map +1 -0
  28. package/dist/chunk-3KFMLOTH.js +201 -0
  29. package/dist/chunk-3KFMLOTH.js.map +1 -0
  30. package/dist/{chunk-ATGAJVZ6.js → chunk-3OP66VXU.js} +64 -4
  31. package/dist/chunk-3OP66VXU.js.map +1 -0
  32. package/dist/{chunk-ZNROKDSZ.js → chunk-3V4OCDTL.js} +2 -8
  33. package/dist/chunk-3V4OCDTL.js.map +1 -0
  34. package/dist/{chunk-3GLYIIFR.js → chunk-3WWX2O4G.js} +3 -2
  35. package/dist/chunk-3WWX2O4G.js.map +1 -0
  36. package/dist/{chunk-SCDWURBO.js → chunk-5CLMV5YU.js} +21 -3
  37. package/dist/chunk-5CLMV5YU.js.map +1 -0
  38. package/dist/{chunk-P7EJ4CAD.js → chunk-ETFP7HAR.js} +2 -2
  39. package/dist/{chunk-P7EJ4CAD.js.map → chunk-ETFP7HAR.js.map} +1 -1
  40. package/dist/chunk-F653O57X.js +41 -0
  41. package/dist/chunk-F653O57X.js.map +1 -0
  42. package/dist/{chunk-SOFPUW3O.js → chunk-IIQ2XIMU.js} +4 -3
  43. package/dist/chunk-IIQ2XIMU.js.map +1 -0
  44. package/dist/chunk-IRC5N7FA.js +16 -0
  45. package/dist/chunk-IRC5N7FA.js.map +1 -0
  46. package/dist/{chunk-SQ5DH66U.js → chunk-ITENVZ6Q.js} +2 -15
  47. package/dist/chunk-ITENVZ6Q.js.map +1 -0
  48. package/dist/{chunk-4UB5Z3ZZ.js → chunk-K67XBCHG.js} +8 -4
  49. package/dist/chunk-K67XBCHG.js.map +1 -0
  50. package/dist/chunk-OK7FUK7U.js +9 -0
  51. package/dist/chunk-OK7FUK7U.js.map +1 -0
  52. package/dist/{chunk-WSEJ2FDE.js → chunk-OUCHU7JB.js} +2 -2
  53. package/dist/{chunk-WSEJ2FDE.js.map → chunk-OUCHU7JB.js.map} +1 -1
  54. package/dist/{chunk-KPINJHIC.js → chunk-PS24PVR6.js} +3 -1
  55. package/dist/chunk-PS24PVR6.js.map +1 -0
  56. package/dist/{chunk-6CDILXF4.js → chunk-S3DCRI2M.js} +31 -5
  57. package/dist/chunk-S3DCRI2M.js.map +1 -0
  58. package/dist/chunk-V6N3YLTM.js +56 -0
  59. package/dist/chunk-V6N3YLTM.js.map +1 -0
  60. package/dist/{chunk-HQZG3OFL.js → chunk-XRZSK2WC.js} +3 -2
  61. package/dist/chunk-XRZSK2WC.js.map +1 -0
  62. package/dist/{chunk-CPSGUGAY.js → chunk-YPAQFBMN.js} +4 -4
  63. package/dist/{chunk-CPSGUGAY.js.map → chunk-YPAQFBMN.js.map} +1 -1
  64. package/dist/collapsible-panel.d.ts +1 -0
  65. package/dist/collapsible-panel.js +3 -2
  66. package/dist/collapsible-panel.js.map +1 -1
  67. package/dist/content-item.d.ts +46 -2
  68. package/dist/content-item.js +4 -1
  69. package/dist/editor-frame.d.ts +41 -0
  70. package/dist/editor-frame.js +3 -0
  71. package/dist/editor-frame.js.map +1 -0
  72. package/dist/index.d.ts +5 -2
  73. package/dist/index.js +27 -23
  74. package/dist/list-action-row.js +2 -1
  75. package/dist/list-detail-dialog.d.ts +2 -1
  76. package/dist/list-detail-dialog.js +5 -4
  77. package/dist/list-detail-dialog.js.map +1 -1
  78. package/dist/list-item.js +2 -1
  79. package/dist/{nav-stack-CU_0dKtI.d.ts → nav-stack-CrZF95VO.d.ts} +2 -1
  80. package/dist/nav-stack.d.ts +2 -1
  81. package/dist/nav-stack.js +2 -1
  82. package/dist/pane.d.ts +3 -23
  83. package/dist/pane.js +2 -1
  84. package/dist/split-view.d.ts +2 -1
  85. package/dist/split-view.js +2 -1
  86. package/dist/styles/backdrop-image.css +24 -1
  87. package/dist/styles/components/actions/popup-menu/popup-menu.css +1 -1
  88. package/dist/styles/components/collections/summary-row/summary-row.css +7 -3
  89. package/dist/styles/components/data-display/value-preview/value-preview.css +18 -0
  90. package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +24 -1
  91. package/dist/styles/components/surfaces/content-item/content-item.css +52 -0
  92. package/dist/styles/components/surfaces/editor-frame/editor-frame.css +121 -0
  93. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +25 -1
  94. package/dist/styles/content-item.css +3 -168
  95. package/dist/styles/editor-frame.css +121 -0
  96. package/dist/styles/foundation.css +9 -4
  97. package/dist/styles/popup-menu.css +1 -1
  98. package/dist/styles/styles.css +2 -0
  99. package/dist/styles/summary-row.css +7 -3
  100. package/dist/styles/surface-scaffold.css +25 -1
  101. package/dist/styles/value-preview.css +18 -0
  102. package/dist/styles/webawesome.css +2 -2
  103. package/dist/summary-row.d.ts +20 -11
  104. package/dist/summary-row.js +2 -1
  105. package/dist/surface-scaffold-register.js +1 -1
  106. package/dist/surface-scaffold.d.ts +30 -2
  107. package/dist/surface-scaffold.js +2 -2
  108. package/dist/surface-tint-DQgYCaP9.d.ts +25 -0
  109. package/dist/tab-navigator.d.ts +2 -1
  110. package/dist/tab-navigator.js +2 -1
  111. package/dist/tab-navigator.js.map +1 -1
  112. package/dist/toolbar.d.ts +1 -0
  113. package/dist/value-preview.d.ts +21 -0
  114. package/dist/value-preview.js +3 -0
  115. package/dist/value-preview.js.map +1 -0
  116. package/dist/wire-catalog.d.ts +2 -1
  117. package/dist/wire-catalog.js +1 -1
  118. package/dist/wire-content-items.js +88 -0
  119. package/dist/wire-content-items.js.map +1 -1
  120. package/dist/workbench-dialog.d.ts +2 -1
  121. package/dist/workbench-dialog.js +4 -3
  122. package/dist/workbench-dialog.js.map +1 -1
  123. package/dist/workbench.d.ts +2 -1
  124. package/dist/workbench.js +2 -1
  125. package/docs/accessibility.md +6 -0
  126. package/docs/backdrop-image.md +4 -0
  127. package/docs/button.md +15 -0
  128. package/docs/component-contract.md +34 -4
  129. package/docs/component-selection.md +16 -1
  130. package/docs/design/templates/button/emphasis-dark.svg +1 -1
  131. package/docs/design/templates/button-dark.svg +1 -1
  132. package/docs/design/templates/checkbox/error-dark.svg +1 -1
  133. package/docs/design/templates/checkbox/states.svg +1 -1
  134. package/docs/design/templates/checkbox-dark.svg +1 -1
  135. package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -1
  136. package/docs/design/templates/checkbox-group/vertical.svg +1 -1
  137. package/docs/design/templates/checkbox-group-dark.svg +1 -1
  138. package/docs/design/templates/checkbox-group.svg +1 -1
  139. package/docs/design/templates/checkbox.svg +1 -1
  140. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -1
  141. package/docs/design/templates/choice-chips-dark.svg +1 -1
  142. package/docs/design/templates/color-field/error-dark.svg +1 -1
  143. package/docs/design/templates/color-field/hint.svg +1 -1
  144. package/docs/design/templates/color-field-dark.svg +1 -1
  145. package/docs/design/templates/color-field.svg +1 -1
  146. package/docs/design/templates/color-picker/gray.svg +1 -1
  147. package/docs/design/templates/color-picker/hsb.svg +1 -1
  148. package/docs/design/templates/color-picker/rgb.svg +1 -1
  149. package/docs/design/templates/color-picker.svg +1 -1
  150. package/docs/design/templates/color-swatches/palette-dark.svg +1 -1
  151. package/docs/design/templates/color-swatches-dark.svg +1 -1
  152. package/docs/design/templates/disclosure/embedded.svg +1 -1
  153. package/docs/design/templates/disclosure/framed-sunken.svg +1 -1
  154. package/docs/design/templates/disclosure/plain.svg +1 -1
  155. package/docs/design/templates/disclosure.svg +1 -1
  156. package/docs/design/templates/message-composer/chat.svg +1 -1
  157. package/docs/design/templates/message-composer.svg +1 -1
  158. package/docs/design/templates/progress-bar/determinate.svg +1 -1
  159. package/docs/design/templates/progress-bar/tones.svg +1 -1
  160. package/docs/design/templates/progress-bar.svg +1 -1
  161. package/docs/design/templates/radio-group/horizontal-dark.svg +1 -1
  162. package/docs/design/templates/radio-group/vertical.svg +1 -1
  163. package/docs/design/templates/radio-group-dark.svg +1 -1
  164. package/docs/design/templates/radio-group.svg +1 -1
  165. package/docs/design/templates/search-field/empty.svg +1 -1
  166. package/docs/design/templates/search-field/tokens.svg +1 -1
  167. package/docs/design/templates/search-field.svg +1 -1
  168. package/docs/design/templates/select/form.svg +1 -1
  169. package/docs/design/templates/select.svg +1 -1
  170. package/docs/design/templates/slider/compact.svg +1 -1
  171. package/docs/design/templates/slider/readout.svg +1 -1
  172. package/docs/design/templates/slider/ticks.svg +1 -1
  173. package/docs/design/templates/slider.svg +1 -1
  174. package/docs/design/templates/switch/states.svg +1 -1
  175. package/docs/design/templates/switch.svg +1 -1
  176. package/docs/design/templates/tag-field/error-dark.svg +1 -1
  177. package/docs/design/templates/tag-field/error.svg +1 -1
  178. package/docs/design/templates/tag-field/tags.svg +1 -1
  179. package/docs/design/templates/tag-field-dark.svg +1 -1
  180. package/docs/design/templates/tag-field.svg +1 -1
  181. package/docs/design/templates/text-field/error-dark.svg +1 -1
  182. package/docs/design/templates/text-field/labeled.svg +1 -1
  183. package/docs/design/templates/text-field/multiline.svg +1 -1
  184. package/docs/design/templates/text-field/search.svg +1 -1
  185. package/docs/design/templates/text-field-dark.svg +1 -1
  186. package/docs/design/templates/text-field.svg +1 -1
  187. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -1
  188. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  189. package/docs/design/templates.md +3 -1
  190. package/docs/editor-frame.md +47 -0
  191. package/docs/investigations/content-item-media-scroll-performance.md +26 -0
  192. package/docs/layout.md +34 -0
  193. package/docs/manual-test-plan.md +27 -1
  194. package/docs/recipes.md +9 -0
  195. package/docs/surface-scaffold.md +50 -1
  196. package/docs/value-preview.md +16 -0
  197. package/llms.txt +10 -1
  198. package/package.json +13 -1
  199. package/dist/chunk-3GLYIIFR.js.map +0 -1
  200. package/dist/chunk-4UB5Z3ZZ.js.map +0 -1
  201. package/dist/chunk-5USKCWGL.js +0 -113
  202. package/dist/chunk-5USKCWGL.js.map +0 -1
  203. package/dist/chunk-6CDILXF4.js.map +0 -1
  204. package/dist/chunk-ATGAJVZ6.js.map +0 -1
  205. package/dist/chunk-HQZG3OFL.js.map +0 -1
  206. package/dist/chunk-JCCN3U6X.js.map +0 -1
  207. package/dist/chunk-KPINJHIC.js.map +0 -1
  208. package/dist/chunk-SCDWURBO.js.map +0 -1
  209. package/dist/chunk-SOFPUW3O.js.map +0 -1
  210. package/dist/chunk-SQ5DH66U.js.map +0 -1
  211. package/dist/chunk-ZNROKDSZ.js.map +0 -1
@@ -13,6 +13,7 @@ Configure recurring dialog and popup geometry without consumer ::part() override
13
13
  - A modal task needs a dialog: render a DialogSurface with a label (or labelledBy plus a heading), its body as children, and its buttons as footer, then open it with openDialog() and close it with closeDialog(), the close button, or any element with data-dialog-close. A raw Web Awesome dropdown that needs a list-compatible menu inset uses PopupSurface.
14
14
  - A dialog body should compose rows, sections, or aligned bare prose through List and ListInsetText.
15
15
  - A modal needs a typed preferred width, viewport gutter, or dynamic viewport-bounded height cap while retaining native body scrolling and footer actions.
16
+ - A dialog needs a less prominent built-in close control: closeEmphasis="quiet" softens the glyph while keeping the native button target and close behavior.
16
17
  - A dialog that must leave the page interactive and close on Escape or an outside press uses PopoverDialogSurface; one that fills its body with a SplitView or Pane uses height and bodyLayout="fill".
17
18
  - A chat-style dialog floats its composer over the transcript with footerPresentation="floating" and keeps a heading or notice above one scrolling transcript with bodyLayout="fill-last".
18
19
  - A phone-first task (compose, quick edit, a picker) should rise from the bottom edge as a sheet the person can resize: presentation="bottom-sheet" with height, and resizable with minHeight / maxHeight bounds.
@@ -57,6 +58,7 @@ Exact prop names and types: [`@kerfjs/ui/surface-scaffold`](../public-api-signat
57
58
  - core kerfjs/overlay confirm/prompt/form/choice as a bottom sheet styled by @kerfjs/ui/overlay-sheet.css
58
59
  - resizable core kerfjs/overlay bottom sheet: the kui-overlay-sheet-resizable class plus wireOverlaySheets adds the resizable DialogSurface sheet grabber
59
60
  - header with label text or heading content, headerActions, a close button, and an optional footer; withoutHeader for content that owns its heading and close control
61
+ - normal (default) or quiet closeEmphasis on the built-in close button
60
62
  - accessible description by describedBy: the heading ToolbarText descriptionId or app-owned body summary copy
61
63
  - light dismiss (a backdrop press closes; otherwise the panel pulses)
62
64
 
@@ -89,6 +91,7 @@ Margin: parent · border: child · padding: self (layout role: structure). `self
89
91
 
90
92
  - DialogSurface is a native \<dialog> opened modally (showModal): it is in the top layer, the rest of the page is inert, focus stays inside, and it returns to the opener on close. Focus starts on an autofocus element, otherwise on the panel.
91
93
  - Name it with label (also its title text) or labelledBy (the id of a heading, such as a ToolbarText). The close button is named Close (closeLabel) and Escape asks to close; the cancelable kui-request-close event reports source close-button, escape, or backdrop.
94
+ - closeEmphasis="quiet" uses a smaller, quiet-colored close glyph inside the same 40px target; hover, focus ring, forced colors, accessible naming, and close requests remain available.
92
95
  - Name a PopoverDialogSurface with label or labelledBy. Describe either surface with describedBy (rendered as aria-describedby on the dialog root), usually the heading ToolbarText descriptionId or app-owned summary copy in the body; rootAttributes accepts only data-\* attributes, so it never sets aria-describedby.
93
96
  - A floating header's title uses the normal text color, which keeps WCAG AA over the 80% raised chrome material on any content; the material turns opaque under prefers-reduced-transparency, prefers-contrast: more, forced colors, or without backdrop-filter.
94
97
  - A resizable bottom sheet's grabber is a focusable horizontal separator ("Resize sheet") with aria-valuemin, aria-valuenow, and aria-valuemax in visible px; the arrow keys, Page Up/Down, Home, and End resize it, and its slide motion is skipped under prefers-reduced-motion.
@@ -0,0 +1,75 @@
1
+ # ValuePreview
2
+
3
+ <!-- Generated by scripts/sync-component-docs.mjs from ai/component-catalog.json and ai/component-composition.json. Do not edit; run `npm run catalog:sync`. -->
4
+
5
+ `@kerfjs/ui:value-preview` · Kerf UI · component · Structure
6
+
7
+ A bounded, read-only multiline text value with keyboard scrolling.
8
+
9
+ ## When to use
10
+
11
+ Display a literal long value with line breaks and long tokens inside a bounded scroll region.
12
+
13
+ - A read-only value may have multiple lines or long unbroken text and needs bounded scrolling, such as a conflict version.
14
+
15
+ **Not when:**
16
+
17
+ - Do not use for editing; use a multiline TextField.
18
+ - Do not use for short label/value facts; use ValueTable.
19
+
20
+ **Alternatives:**
21
+
22
+ - [ValueTable](./value-table.md) (nearest) — Use ValueTable for rows of short labelled facts.
23
+
24
+ ## Imports
25
+
26
+ - JavaScript: `@kerfjs/ui/value-preview` — exports `ValuePreview`.
27
+ - CSS: the browser build of `@kerfjs/ui/value-preview` pulls its CSS automatically; import `@kerfjs/ui/value-preview.css` manually only without the `browser` export condition.
28
+ - Declared side effects: browser-condition-css.
29
+
30
+ ## Props
31
+
32
+ Exact prop names and types: [`@kerfjs/ui/value-preview`](../public-api-signatures-v1.md#kerfjsuivalue-preview) in `public-api-signatures-v1.md`. Do not infer props from examples.
33
+
34
+ **Variants (configure, do not restyle):**
35
+
36
+ - typed minimum and maximum height
37
+
38
+ ## Composition
39
+
40
+ - Parents: any.
41
+ - Contexts: `application-ui`.
42
+ - Children: unrestricted.
43
+ - Built from: [SunkenPanel](./sunken-panel.md).
44
+
45
+ ## State and wiring
46
+
47
+ **The app owns:** value; empty wording.
48
+
49
+ No wiring helper.
50
+
51
+ ## Geometry
52
+
53
+ Margin: none · border: none · padding: none (layout role: structure). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
54
+
55
+ ## Accessibility
56
+
57
+ - Give the focusable output a label so keyboard and screen-reader users can identify and scroll it.
58
+
59
+ ## Styling boundary
60
+
61
+ The component owns its own styles. Configure it through its props and variants; do not override its internals.
62
+
63
+ Public class hooks (select for layout placement only, never to change the component's look): `kui-value-preview`.
64
+
65
+ Never put `kui-value-preview` on an element you write; render `ValuePreview` instead (`KUI-L103`).
66
+
67
+ Public tokens it reads: `--kui-color-text`, `--kui-font-xs`, `--kui-focus-ring`. Set a token only where its public contract allows; prefer a prop.
68
+
69
+ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-*` selectors (`KUI-L001`, `KUI-L010`), unknown or private tokens (`KUI-L002`, `KUI-L012`), and any application rule that restyles the component, forced dimensions included (`KUI-L019`).
70
+
71
+ ## Related
72
+
73
+ - Components: [SunkenPanel](./sunken-panel.md), [ValueTable](./value-table.md).
74
+ - Docs: [`docs/value-preview.md`](../../docs/value-preview.md).
75
+ - UX catalog route: `?component=value-preview`.
@@ -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.110` and `kerfjs@5.0.0-beta.110`. 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.112` and `kerfjs@5.0.0-beta.112`. 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
 
@@ -167,6 +167,7 @@ import { S as Sides } from './sides-BPSWde0A.js';
167
167
  import { PaneSeparatorSide } from './pane.js';
168
168
  import './scroll-clearance-BikHljTc.js';
169
169
  import './css-values.js';
170
+ import './surface-tint-DQgYCaP9.js';
170
171
 
171
172
  type ToolbarPosition = 'header' | 'footer';
172
173
  /** Control-band density: `default` (60px with 44px groups) or `compact`. */
@@ -1195,7 +1196,11 @@ export { ListInsetText, type ListInsetTextProps, Sides };
1195
1196
  ```ts
1196
1197
  import * as kerfjs from 'kerfjs';
1197
1198
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1199
+ import { CssColor } from './css-values.js';
1198
1200
  import { S as SemanticTone } from './semantic-tone-CdW013KF.js';
1201
+ import { S as SurfaceTint } from './surface-tint-DQgYCaP9.js';
1202
+ import { BackdropImagePosition, BackdropImageParallax, BackdropImageBlur, BackdropImageScrim } from './backdrop-image.js';
1203
+ import './extension-attributes-mu8MFUl0.js';
1199
1204
 
1200
1205
  /**
1201
1206
  * Base surface treatment, semantic status colors, or `brand-loud`: the solid
@@ -1214,12 +1219,43 @@ type ContentItemFrame = 'none' | 'framed';
1214
1219
  type ContentItemShape = 'rounded' | 'pill';
1215
1220
  /** `single` uses an option; `multiple` uses a grid row; `toggle` uses a pressed button. */
1216
1221
  type ContentItemSelectionMode = 'none' | 'single' | 'multiple' | 'toggle';
1222
+ /** One card-owned lead image in the containing feed's shared scrollport. */
1223
+ interface ContentItemMedia {
1224
+ src: string;
1225
+ alt: string;
1226
+ srcset?: string;
1227
+ sizes?: string;
1228
+ /** Width divided by height; reserves the image block before it loads. Default 16/9. */
1229
+ aspectRatio?: number;
1230
+ position?: BackdropImagePosition;
1231
+ /** Default subtle (35% lag); set none for a static lead image. */
1232
+ parallax?: BackdropImageParallax;
1233
+ /** App-supplied soft copy; its opacity changes, never its blur filter. */
1234
+ blurredSrc?: string;
1235
+ /** Shared BackdropImage blur behavior; use instead of `blurredSrc`. */
1236
+ blur?: BackdropImageBlur;
1237
+ /** Skip offscreen media painting in long feeds while retaining card geometry. */
1238
+ deferOffscreen?: boolean;
1239
+ /** Color the image dissolves into and the card body continues on. */
1240
+ fadeTo?: CssColor;
1241
+ /** Content layered over the image, including native controls. */
1242
+ overlay?: KerfUiContent;
1243
+ /** Dim the image behind overlay content. */
1244
+ scrim?: BackdropImageScrim;
1245
+ /** Extend the image to the card's top, left, and right inner edges. */
1246
+ edgeToEdge?: boolean;
1247
+ }
1217
1248
  type ContentItemRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
1218
1249
  'data-component'?: never;
1219
1250
  'data-appearance'?: never;
1220
1251
  'data-outlined'?: never;
1221
1252
  'data-bubble'?: never;
1222
1253
  'data-grid-row'?: never;
1254
+ 'data-media-state'?: never;
1255
+ 'data-media-edge'?: never;
1256
+ 'data-media-fade'?: never;
1257
+ 'data-kui-tint'?: never;
1258
+ 'data-kui-tint-accent'?: never;
1223
1259
  }>;
1224
1260
  type ContentItemInteractiveRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
1225
1261
  'data-component'?: never;
@@ -1227,6 +1263,11 @@ type ContentItemInteractiveRootAttributes = Readonly<Record<`data-${string}`, st
1227
1263
  'data-outlined'?: never;
1228
1264
  'data-bubble'?: never;
1229
1265
  'data-grid-row'?: never;
1266
+ 'data-media-state'?: never;
1267
+ 'data-media-edge'?: never;
1268
+ 'data-media-fade'?: never;
1269
+ 'data-kui-tint'?: never;
1270
+ 'data-kui-tint-accent'?: never;
1230
1271
  'data-action'?: never;
1231
1272
  'data-item-id'?: never;
1232
1273
  'data-interactive'?: never;
@@ -1242,6 +1283,10 @@ interface ContentItemBaseProps {
1242
1283
  * semantic values match StateBanner. Defaults to `transparent`.
1243
1284
  */
1244
1285
  appearance?: ContentItemAppearance;
1286
+ /** Reserved lead image with a per-image scroll timeline. Wire the containing root with `wireContentItems`. */
1287
+ media?: ContentItemMedia;
1288
+ /** App-sampled image color, scoped to this card once its image loads. */
1289
+ tint?: SurfaceTint;
1245
1290
  /** Item content; a plain string is allowed for bare copy. */
1246
1291
  children?: KerfUiContent | string;
1247
1292
  /**
@@ -1318,9 +1363,9 @@ type ContentItemProps = ContentItemBaseProps & ({
1318
1363
  * border (transparent unless `framed`), 8px padding, and a rounded or pill
1319
1364
  * radius. It owns that whole geometry, so wrappers must not add more.
1320
1365
  */
1321
- declare function ContentItem({ appearance, children, frame, flush, shape, bubble, title, ariaLabel, focusTarget, outlined, tabIndex, gridRow, interactive, action, itemId, selectionMode, selected, disabled, className, rootAttributes, slot, }: ContentItemProps): kerfjs.SafeHtml;
1366
+ declare function ContentItem({ appearance, media, tint, children, frame, flush, shape, bubble, title, ariaLabel, focusTarget, outlined, tabIndex, gridRow, interactive, action, itemId, selectionMode, selected, disabled, className, rootAttributes, slot, }: ContentItemProps): kerfjs.SafeHtml;
1322
1367
 
1323
- export { ContentItem, type ContentItemAppearance, type ContentItemBubble, type ContentItemFrame, type ContentItemProps, type ContentItemSelectionMode, type ContentItemShape, SemanticTone };
1368
+ export { ContentItem, type ContentItemAppearance, type ContentItemBubble, type ContentItemFrame, type ContentItemMedia, type ContentItemProps, type ContentItemSelectionMode, type ContentItemShape, SemanticTone };
1324
1369
  ```
1325
1370
 
1326
1371
  ## `@kerfjs/ui/value-table`
@@ -1722,12 +1767,13 @@ export { wireListFocusScroll };
1722
1767
  ## `@kerfjs/ui/nav-stack`
1723
1768
 
1724
1769
  ```ts
1725
- 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';
1770
+ 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-CrZF95VO.js';
1726
1771
  import 'kerfjs';
1727
1772
  import './semantic-content-BbzjvSu9.js';
1728
1773
  import './pane.js';
1729
1774
  import './scroll-clearance-BikHljTc.js';
1730
1775
  import './css-values.js';
1776
+ import './surface-tint-DQgYCaP9.js';
1731
1777
  import './list.js';
1732
1778
  import './extension-attributes-mu8MFUl0.js';
1733
1779
  import './flex-alignment-4ms8ZbV8.js';
@@ -1767,11 +1813,12 @@ export { type WireNavStackOptions, wireNavStack };
1767
1813
  ```ts
1768
1814
  import * as kerfjs from 'kerfjs';
1769
1815
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1770
- import { N as NavStackProps, a as NavStackView } from './nav-stack-CU_0dKtI.js';
1816
+ import { N as NavStackProps, a as NavStackView } from './nav-stack-CrZF95VO.js';
1771
1817
  import { ResizableRegionProps } from './resizable-region.js';
1772
1818
  import './pane.js';
1773
1819
  import './scroll-clearance-BikHljTc.js';
1774
1820
  import './css-values.js';
1821
+ import './surface-tint-DQgYCaP9.js';
1775
1822
  import './list.js';
1776
1823
  import './extension-attributes-mu8MFUl0.js';
1777
1824
  import './flex-alignment-4ms8ZbV8.js';
@@ -1876,6 +1923,8 @@ import * as kerfjs from 'kerfjs';
1876
1923
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
1877
1924
  import { S as ScrollClearance } from './scroll-clearance-BikHljTc.js';
1878
1925
  import { CssColor } from './css-values.js';
1926
+ import { S as SurfaceTint } from './surface-tint-DQgYCaP9.js';
1927
+ export { a as SurfaceTintScheme } from './surface-tint-DQgYCaP9.js';
1879
1928
 
1880
1929
  /**
1881
1930
  * What clear (fully transparent) chrome fades in as content scrolls beneath
@@ -1886,28 +1935,6 @@ import { CssColor } from './css-values.js';
1886
1935
  */
1887
1936
  type ScrollEdge = 'none' | 'material' | 'surface';
1888
1937
 
1889
- /** The color scheme an app declares for a {@link SurfaceTint}'s color. */
1890
- type SurfaceTintScheme = 'light' | 'dark';
1891
- /**
1892
- * A scoped tint for a layout surface: the app's color (usually sampled from
1893
- * artwork it already knows) and the scheme that color belongs to. Kerf does no
1894
- * color detection; `scheme` says whether the color reads as a light or a dark
1895
- * surface. Inside the scope the surface, raised surface, text, quiet text, and
1896
- * everything built on them (quiet fills, separators' backdrop, the chrome
1897
- * material) re-derive from the color, with lightness clamped so text keeps
1898
- * WCAG AA over any color.
1899
- */
1900
- interface SurfaceTint {
1901
- color: CssColor;
1902
- scheme: SurfaceTintScheme;
1903
- /**
1904
- * An optional accent (usually the artwork's most vivid color). The scope's
1905
- * brand ramp re-derives from it: loud fills and their text, brand text and
1906
- * links, text on brand fills, and the focus ring, each clamped to keep AA.
1907
- */
1908
- accent?: CssColor;
1909
- }
1910
-
1911
1938
  /**
1912
1939
  * Logical pane sides: where a {@link Pane} can show a separator and where it can
1913
1940
  * compensate for a device safe-area inset.
@@ -2129,7 +2156,7 @@ type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separator
2129
2156
  */
2130
2157
  declare function Pane({ header, children, footer, chromePlacement, chromeDividers, compactChrome, compactChromeOpen, 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;
2131
2158
 
2132
- export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneCompactChrome, type PaneCompactChromePolicy, type PaneConfig, type PaneContentElement, type PaneElement, type PaneHeaderPresentation, type PaneProps, type PaneSeparatorSide, ScrollClearance, type ScrollEdge, type SurfaceTint, type SurfaceTintScheme };
2159
+ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneCompactChrome, type PaneCompactChromePolicy, type PaneConfig, type PaneContentElement, type PaneElement, type PaneHeaderPresentation, type PaneProps, type PaneSeparatorSide, ScrollClearance, type ScrollEdge, SurfaceTint };
2133
2160
  ```
2134
2161
 
2135
2162
  ## `@kerfjs/ui/workbench`
@@ -2137,13 +2164,14 @@ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlac
2137
2164
  ```ts
2138
2165
  import { SafeHtml } from 'kerfjs';
2139
2166
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2140
- import { b as NavPane, N as NavStackProps } from './nav-stack-CU_0dKtI.js';
2167
+ import { b as NavPane, N as NavStackProps } from './nav-stack-CrZF95VO.js';
2141
2168
  import { ListConfig } from './list.js';
2142
2169
  import { PaneConfig } from './pane.js';
2143
2170
  import { ResizableRegionSeparator, ResizableRegionCollapseMotion, ResizableRegionContentOverflow, ResizableRegionPresentation, ResizableRegionRestorePosition } from './resizable-region.js';
2144
2171
  import { a as PanelToolbar, c as PanelBottomToolbar, b as PanelChromePlacement, d as PanelToggle } from './panel-toolbar-vg6Ir5Dy.js';
2145
2172
  import { ToolbarConfig } from './toolbar.js';
2146
2173
  import './css-values.js';
2174
+ import './surface-tint-DQgYCaP9.js';
2147
2175
  import './toolbar-text.js';
2148
2176
  import './extension-attributes-mu8MFUl0.js';
2149
2177
  import './flex-alignment-4ms8ZbV8.js';
@@ -2557,6 +2585,7 @@ import './sides-BPSWde0A.js';
2557
2585
  import './extension-attributes-mu8MFUl0.js';
2558
2586
  import './flex-alignment-4ms8ZbV8.js';
2559
2587
  import './scroll-clearance-BikHljTc.js';
2588
+ import './surface-tint-DQgYCaP9.js';
2560
2589
 
2561
2590
  /** Which edge a {@link CollapsiblePanel} docks to. */
2562
2591
  type CollapsiblePanelSide = PanelSide;
@@ -2762,8 +2791,9 @@ export { type SidebarStorage, type WireSidebarOptions, type WireSidebarPanel, wi
2762
2791
  ```ts
2763
2792
  import { SafeHtml } from 'kerfjs';
2764
2793
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2765
- import { PaneAppearance, SurfaceTint, ScrollEdge } from './pane.js';
2794
+ import { PaneAppearance, ScrollEdge } from './pane.js';
2766
2795
  import { CssColor } from './css-values.js';
2796
+ import { S as SurfaceTint } from './surface-tint-DQgYCaP9.js';
2767
2797
  import './scroll-clearance-BikHljTc.js';
2768
2798
 
2769
2799
  interface TabNavigatorTabBase<Id extends string> {
@@ -3092,8 +3122,9 @@ import './sides-BPSWde0A.js';
3092
3122
  import './pane.js';
3093
3123
  import './scroll-clearance-BikHljTc.js';
3094
3124
  import './css-values.js';
3125
+ import './surface-tint-DQgYCaP9.js';
3095
3126
  import './workbench.js';
3096
- import './nav-stack-CU_0dKtI.js';
3127
+ import './nav-stack-CrZF95VO.js';
3097
3128
  import './list.js';
3098
3129
  import './extension-attributes-mu8MFUl0.js';
3099
3130
  import './flex-alignment-4ms8ZbV8.js';
@@ -3247,8 +3278,9 @@ import './sides-BPSWde0A.js';
3247
3278
  import './pane.js';
3248
3279
  import './scroll-clearance-BikHljTc.js';
3249
3280
  import './css-values.js';
3281
+ import './surface-tint-DQgYCaP9.js';
3250
3282
  import './workbench.js';
3251
- import './nav-stack-CU_0dKtI.js';
3283
+ import './nav-stack-CrZF95VO.js';
3252
3284
  import './list.js';
3253
3285
  import './extension-attributes-mu8MFUl0.js';
3254
3286
  import './flex-alignment-4ms8ZbV8.js';
@@ -3302,8 +3334,9 @@ import './sides-BPSWde0A.js';
3302
3334
  import './pane.js';
3303
3335
  import './scroll-clearance-BikHljTc.js';
3304
3336
  import './css-values.js';
3337
+ import './surface-tint-DQgYCaP9.js';
3305
3338
  import './workbench.js';
3306
- import './nav-stack-CU_0dKtI.js';
3339
+ import './nav-stack-CrZF95VO.js';
3307
3340
  import './list.js';
3308
3341
  import './extension-attributes-mu8MFUl0.js';
3309
3342
  import './flex-alignment-4ms8ZbV8.js';
@@ -4545,6 +4578,9 @@ type BackdropImageRootAttributes = StructuralRootAttributes & Readonly<{
4545
4578
  'data-fade'?: never;
4546
4579
  'data-repeat'?: never;
4547
4580
  'data-under-chrome'?: never;
4581
+ 'data-aspect-ratio'?: never;
4582
+ 'data-inline-bleed'?: never;
4583
+ 'data-defer-offscreen'?: never;
4548
4584
  }>;
4549
4585
  interface BackdropImageCommonProps {
4550
4586
  /** Image URL. */
@@ -4558,6 +4594,12 @@ interface BackdropImageCommonProps {
4558
4594
  position?: BackdropImagePosition;
4559
4595
  /** Height of the image block. Default 320px (`remify(320)`). */
4560
4596
  height?: CssLength;
4597
+ /** Reserve image height from its width, useful for an inline card. Cannot be combined with `height`. */
4598
+ aspectRatio?: number;
4599
+ /** Native image loading behavior. Omit for the browser default. */
4600
+ loading?: 'eager' | 'lazy';
4601
+ /** Bleed to a Pane's inline content edges. Set false when embedded in a card. Defaults to true. */
4602
+ bleedInline?: boolean;
4561
4603
  /** How far the image lags the scroll. Default `none`. */
4562
4604
  parallax?: BackdropImageParallax;
4563
4605
  /**
@@ -4571,6 +4613,8 @@ interface BackdropImageCommonProps {
4571
4613
  * statically blurred copy. Static (unblurred) wherever parallax is.
4572
4614
  */
4573
4615
  blur?: BackdropImageBlur;
4616
+ /** Skip painting the image hero while it is off screen in a long feed. */
4617
+ deferOffscreen?: boolean;
4574
4618
  /**
4575
4619
  * Run the image up beneath the scroller's block-start inset: an overlay or
4576
4620
  * clear Pane header, NavStack chrome handed to a view's Pane, and the top
@@ -4672,6 +4716,15 @@ declare function openDialog(dialog: HTMLDialogElement): void;
4672
4716
  * `close` event fires once it has closed.
4673
4717
  */
4674
4718
  declare function closeDialog(dialog: HTMLDialogElement): void;
4719
+ /**
4720
+ * Reconcile one controlled stack after rendering its DialogSurface layers.
4721
+ * Opening back-to-front establishes native top-layer order; unchanged layers
4722
+ * keep their DOM nodes and focus. The application owns `stack.open` and handles
4723
+ * `kui-request-close` to update that state before calling this again.
4724
+ */
4725
+ declare function syncDialogStack(root: ParentNode): void;
4726
+ /** Follow a controlled stack's render updates until the returned stop runs. */
4727
+ declare function wireDialogStack(root: ParentNode): () => void;
4675
4728
 
4676
4729
  type DialogSurfaceSize = 'small' | 'medium' | 'large';
4677
4730
  /**
@@ -4712,6 +4765,8 @@ type DialogSurfaceFooterPresentation = 'docked' | 'floating';
4712
4765
  * material, so content scrolls visibly beneath the title bar.
4713
4766
  */
4714
4767
  type DialogSurfaceHeaderPresentation = 'docked' | 'floating';
4768
+ /** The built-in close control's visual weight; `normal` keeps the default. */
4769
+ type DialogSurfaceCloseEmphasis = 'normal' | 'quiet';
4715
4770
  /**
4716
4771
  * Application `data-*` identity on the DialogSurface root, such as
4717
4772
  * `data-key`; the surface's own configuration attributes stay protected.
@@ -4729,6 +4784,19 @@ type DialogSurfaceName = {
4729
4784
  labelledBy: string;
4730
4785
  };
4731
4786
  type DialogSurfaceProps = DialogSurfaceName & DialogSurfaceOptions;
4787
+ /** Controlled state of one native modal layer inside a `wireDialogStack` root. */
4788
+ interface DialogSurfaceStack {
4789
+ /** Whether this layer belongs in the native top layer. */
4790
+ open: boolean;
4791
+ /** The one frontmost open layer; it owns modal focus and accessibility. */
4792
+ active: boolean;
4793
+ /** One-based order from the back to the front. */
4794
+ position: number;
4795
+ /** Number of layers in the stack, including closed layers still rendered. */
4796
+ count: number;
4797
+ /** Optional vertical offset for an inactive layer; omitted on phones. */
4798
+ offset?: CssLength;
4799
+ }
4732
4800
  interface DialogSurfaceOptions {
4733
4801
  /** The dialog's id, for `openDialog(document.getElementById(id))`. */
4734
4802
  id?: string;
@@ -4748,6 +4816,8 @@ interface DialogSurfaceOptions {
4748
4816
  alert?: boolean;
4749
4817
  /** The body content. */
4750
4818
  children: KerfUiContent;
4819
+ /** Controlled modal stack state; call `wireDialogStack` on the containing root. */
4820
+ stack?: DialogSurfaceStack;
4751
4821
  /**
4752
4822
  * Header title content in place of the `label` text, such as an xl
4753
4823
  * `ToolbarText` with a description. The dialog keeps its `label` (or
@@ -4767,6 +4837,8 @@ interface DialogSurfaceOptions {
4767
4837
  lightDismiss?: boolean;
4768
4838
  /** The close button's accessible name (default `Close`). */
4769
4839
  closeLabel?: string;
4840
+ /** Soften the built-in close control without changing its 40px target. */
4841
+ closeEmphasis?: DialogSurfaceCloseEmphasis;
4770
4842
  size?: DialogSurfaceSize;
4771
4843
  presentation?: DialogSurfacePresentation;
4772
4844
  /** Modal preferred width. Takes precedence over size, within the viewport cap. */
@@ -4860,7 +4932,7 @@ interface DialogSurfaceOptions {
4860
4932
  * floating header and footer measurement, the bottom sheet's keyboard
4861
4933
  * clearance and grabber, and re-render resilience while open.
4862
4934
  */
4863
- declare function DialogSurface({ id, label, labelledBy, describedBy, alert, heading, headerActions, footer, withoutHeader, lightDismiss, closeLabel, children, size, presentation, preferredWidth, bodyInset, footerInset, viewportGutter, maxHeight, height, minHeight, resizable, enterMotion, exitMotion, bodyLayout, headerPresentation, footerPresentation, footerOffset, rootAttributes, className, slot, }: DialogSurfaceProps): kerfjs.SafeHtml;
4935
+ declare function DialogSurface({ id, label, labelledBy, describedBy, alert, heading, headerActions, footer, withoutHeader, lightDismiss, closeLabel, closeEmphasis, children, stack, size, presentation, preferredWidth, bodyInset, footerInset, viewportGutter, maxHeight, height, minHeight, resizable, enterMotion, exitMotion, bodyLayout, headerPresentation, footerPresentation, footerOffset, rootAttributes, className, slot, }: DialogSurfaceProps): kerfjs.SafeHtml;
4864
4936
  /** Where a PopoverDialogSurface appears: the top layer, or in flow. */
4865
4937
  type PopoverDialogSurfacePresentation = 'overlay' | 'embedded';
4866
4938
  /** Application `data-*` metadata on the surface root. */
@@ -4927,7 +4999,7 @@ interface PopupSurfaceProps {
4927
4999
  /** Configure recurring Web Awesome dropdown-menu geometry without consumer ::part() CSS. */
4928
5000
  declare function PopupSurface({ children, inset, className, slot, }: PopupSurfaceProps): kerfjs.SafeHtml;
4929
5001
 
4930
- export { type DialogCloseSource, type DialogRequestCloseDetail, DialogSurface, type DialogSurfaceBodyLayout, type DialogSurfaceFooterPresentation, type DialogSurfaceHeaderPresentation, type DialogSurfaceHeight, type DialogSurfaceMaxHeight, type DialogSurfaceName, type DialogSurfaceOptions, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceRootAttributes, type DialogSurfaceSheetMotion, type DialogSurfaceSize, PopoverDialogSurface, type PopoverDialogSurfaceDataAttributes, type PopoverDialogSurfacePresentation, type PopoverDialogSurfaceProps, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset, closeDialog, openDialog };
5002
+ export { type DialogCloseSource, type DialogRequestCloseDetail, DialogSurface, type DialogSurfaceBodyLayout, type DialogSurfaceCloseEmphasis, type DialogSurfaceFooterPresentation, type DialogSurfaceHeaderPresentation, type DialogSurfaceHeight, type DialogSurfaceMaxHeight, type DialogSurfaceName, type DialogSurfaceOptions, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceRootAttributes, type DialogSurfaceSheetMotion, type DialogSurfaceSize, type DialogSurfaceStack, PopoverDialogSurface, type PopoverDialogSurfaceDataAttributes, type PopoverDialogSurfacePresentation, type PopoverDialogSurfaceProps, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset, closeDialog, openDialog, syncDialogStack, wireDialogStack };
4931
5003
  ```
4932
5004
 
4933
5005
  ## `@kerfjs/ui/list-detail-dialog`
@@ -4939,9 +5011,10 @@ import { CssLength } from './css-values.js';
4939
5011
  import { SplitViewListWidth } from './split-view.js';
4940
5012
  import { DialogSurfaceSize, DialogSurfaceHeight, DialogSurfaceMaxHeight, DialogSurfaceRootAttributes } from './surface-scaffold.js';
4941
5013
  export { DialogCloseSource, DialogRequestCloseDetail, closeDialog, openDialog } from './surface-scaffold.js';
4942
- import './nav-stack-CU_0dKtI.js';
5014
+ import './nav-stack-CrZF95VO.js';
4943
5015
  import './pane.js';
4944
5016
  import './scroll-clearance-BikHljTc.js';
5017
+ import './surface-tint-DQgYCaP9.js';
4945
5018
  import './list.js';
4946
5019
  import './extension-attributes-mu8MFUl0.js';
4947
5020
  import './flex-alignment-4ms8ZbV8.js';
@@ -5067,9 +5140,10 @@ import { CssLength } from './css-values.js';
5067
5140
  import { WorkbenchMainBottomToolbar, WorkbenchPanel } from './workbench.js';
5068
5141
  import { DialogSurfaceSize, DialogSurfaceHeight, DialogSurfaceMaxHeight, DialogSurfaceRootAttributes } from './surface-scaffold.js';
5069
5142
  export { DialogCloseSource, DialogRequestCloseDetail, closeDialog, openDialog } from './surface-scaffold.js';
5070
- import './nav-stack-CU_0dKtI.js';
5143
+ import './nav-stack-CrZF95VO.js';
5071
5144
  import './pane.js';
5072
5145
  import './scroll-clearance-BikHljTc.js';
5146
+ import './surface-tint-DQgYCaP9.js';
5073
5147
  import './list.js';
5074
5148
  import './extension-attributes-mu8MFUl0.js';
5075
5149
  import './flex-alignment-4ms8ZbV8.js';
@@ -5277,6 +5351,78 @@ declare function Text({ variant: Variant, tone, color, size, font, border, flush
5277
5351
  export { FieldLabel, type FieldLabelProps, Sides, Text, type TextAlign, type TextBorder, type TextContent, type TextFont, type TextLineHeight, type TextProps, type TextSize, type TextTone, type TextTruncate, type TextTruncateKeep, type TextVariant, type TextWrap };
5278
5352
  ```
5279
5353
 
5354
+ ## `@kerfjs/ui/editor-frame`
5355
+
5356
+ ```ts
5357
+ import * as kerfjs from 'kerfjs';
5358
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
5359
+ import { CssLength } from './css-values.js';
5360
+
5361
+ type EditorFrameMode = 'source' | 'preview';
5362
+ type EditorFrameAppearance = 'framed' | 'embedded';
5363
+ type EditorFrameInset = 'padded' | 'flush';
5364
+ interface EditorFrameProps {
5365
+ /** A Toolbar or other fixed controls above the writing surface. */
5366
+ toolbar?: KerfUiContent;
5367
+ /** A native textarea in source mode, or rendered content in preview mode. */
5368
+ children: KerfUiContent;
5369
+ mode: EditorFrameMode;
5370
+ /** Framed fixed-height card (default) or unframed content within a host. */
5371
+ appearance?: EditorFrameAppearance;
5372
+ /** Remove the writing surface inset when the host owns the text column. */
5373
+ inset?: EditorFrameInset;
5374
+ /** Fill the viewport inset as a raised editor overlay. */
5375
+ expanded?: boolean;
5376
+ /** Framed block size; defaults to 320px. Ignored while expanded or embedded. */
5377
+ height?: CssLength;
5378
+ /** Maximum framed inline size; defaults to 672px. */
5379
+ maxWidth?: CssLength;
5380
+ /** Embedded source height restored by the app. */
5381
+ sourceHeight?: CssLength;
5382
+ /** Let an embedded native textarea grow with its content. */
5383
+ sourceAutosize?: boolean;
5384
+ /** Name a distinct editor region for assistive technology. */
5385
+ label?: string;
5386
+ /** App-owned root identity for delegation or a stable morph key. */
5387
+ rootAttributes?: Readonly<Record<`data-${string}`, string | undefined>>;
5388
+ slot?: string;
5389
+ }
5390
+ /**
5391
+ * A fixed toolbar over one writing surface. Source mode gives a native
5392
+ * textarea the scrollport; preview mode scrolls the surface around rendered
5393
+ * content. The app owns editing, draft restoration, and preview actions.
5394
+ */
5395
+ declare function EditorFrame({ toolbar, children, mode, appearance, inset, expanded, height, maxWidth, sourceHeight, sourceAutosize, label, rootAttributes, slot, }: EditorFrameProps): kerfjs.SafeHtml;
5396
+
5397
+ export { EditorFrame, type EditorFrameAppearance, type EditorFrameInset, type EditorFrameMode, type EditorFrameProps };
5398
+ ```
5399
+
5400
+ ## `@kerfjs/ui/value-preview`
5401
+
5402
+ ```ts
5403
+ import * as kerfjs from 'kerfjs';
5404
+ import { CssLength } from './css-values.js';
5405
+
5406
+ interface ValuePreviewProps {
5407
+ /** Accessible name for the keyboard-scrollable value. */
5408
+ label: string;
5409
+ /** Literal plain-text value, including newlines and long unbroken text. */
5410
+ value: string;
5411
+ /** Minimum height; defaults to 48px. */
5412
+ minHeight?: CssLength;
5413
+ /** Maximum height before the value scrolls; defaults to 96px. */
5414
+ maxHeight?: CssLength;
5415
+ id?: string;
5416
+ className?: string;
5417
+ /** Native named-slot assignment when composed inside a web component. */
5418
+ slot?: string;
5419
+ }
5420
+ /** Read-only, bounded multiline text for a containing surface such as SunkenPanel. */
5421
+ declare function ValuePreview({ label, value, minHeight, maxHeight, id, className, slot, }: ValuePreviewProps): kerfjs.SafeHtml;
5422
+
5423
+ export { ValuePreview, type ValuePreviewProps };
5424
+ ```
5425
+
5280
5426
  ## `@kerfjs/ui/framed-list`
5281
5427
 
5282
5428
  ```ts
@@ -5348,7 +5494,7 @@ type SummaryRowRootAttributes = Readonly<Record<`data-${string}`, string | undef
5348
5494
  'data-selected'?: never;
5349
5495
  'data-dimmed'?: never;
5350
5496
  }>;
5351
- interface SummaryRowProps {
5497
+ interface SummaryRowBaseProps {
5352
5498
  /** The identity line: an identifier, inline status glyphs, and the title. */
5353
5499
  title: KerfUiContent;
5354
5500
  /** Optional leading glyph, such as a category icon. */
@@ -5363,7 +5509,7 @@ interface SummaryRowProps {
5363
5509
  titleLines?: number;
5364
5510
  /** A leading state rail in a semantic tone (Up Next, blocked, …). */
5365
5511
  rail?: SemanticTone;
5366
- /** Selected state, exposed as `aria-selected`. */
5512
+ /** Selected visual state; also exposed as `aria-selected` for an option. */
5367
5513
  selected?: boolean;
5368
5514
  /** Dim a finished or cut item; hover and selection restore it. */
5369
5515
  dimmed?: boolean;
@@ -5371,21 +5517,30 @@ interface SummaryRowProps {
5371
5517
  listEdge?: SummaryRowListEdge;
5372
5518
  /** Skip rendering while off screen in long lists (`content-visibility`). */
5373
5519
  deferRendering?: boolean;
5374
- /** Accessible name when the visible content is not a good one. */
5375
- ariaLabel?: string;
5376
5520
  id?: string;
5377
5521
  className?: string;
5378
- /** Safe `data-*` identity (an item id or delegated action) on the option. */
5522
+ /** Safe `data-*` identity (an item id or delegated action) on the root. */
5379
5523
  rootAttributes?: SummaryRowRootAttributes;
5380
5524
  }
5525
+ type SummaryRowProps = SummaryRowBaseProps & ({
5526
+ /** Selectable option, the default; place it in a labeled listbox. */
5527
+ semanticRole?: 'option';
5528
+ /** Native HTML drag source on this option root, in row or card form. */
5529
+ draggable?: boolean;
5530
+ /** Accessible name when the visible content is not a good one. */
5531
+ ariaLabel?: string;
5532
+ } | {
5533
+ /** Static labeled group; nested actions own focus and activation. */
5534
+ semanticRole: 'group';
5535
+ draggable?: never;
5536
+ ariaLabel: string;
5537
+ });
5381
5538
  /**
5382
- * A selectable, keyboard-focusable summary of one item, as a list row or a
5383
- * board card: an optional leading glyph and state rail, a clamped identity line
5384
- * with trailing quiet metadata, and a wrapping metadata line. It is a
5385
- * `role="option"`; place rows in a labeled `role="listbox"` and own selection
5386
- * and keyboard movement in the application.
5539
+ * A list row or board card with a clamped identity line, metadata, and state
5540
+ * rail. The default is a focusable `role="option"` for a labeled listbox;
5541
+ * `semanticRole="group"` gives a static labeled row for nested actions.
5387
5542
  */
5388
- declare function SummaryRow({ title, leading, trailingMeta, metadata, presentation, titleLines, rail, selected, dimmed, listEdge, deferRendering, ariaLabel, id, className, rootAttributes, }: SummaryRowProps): SafeHtml;
5543
+ declare function SummaryRow({ title, leading, trailingMeta, metadata, presentation, titleLines, rail, selected, dimmed, listEdge, deferRendering, semanticRole, draggable, ariaLabel, id, className, rootAttributes, }: SummaryRowProps): SafeHtml;
5389
5544
 
5390
5545
  export { SummaryRow, type SummaryRowListEdge, type SummaryRowPresentation, type SummaryRowProps };
5391
5546
  ```
@@ -6662,6 +6817,8 @@ interface ButtonOptions {
6662
6817
  * flips it in its `action` handler. A link (`href`) cannot be a toggle.
6663
6818
  */
6664
6819
  pressed?: boolean;
6820
+ /** Mark the current step in a sequence with `aria-current="step"`. */
6821
+ currentStep?: boolean;
6665
6822
  /**
6666
6823
  * Busy: a spinner replaces the label (which still names it) and the button
6667
6824
  * reports `aria-busy`. Presses still reach it; the application decides
@@ -6716,12 +6873,12 @@ interface ButtonOptions {
6716
6873
  * in one of four tones and three emphases, at the 44px control height or
6717
6874
  * compact, with a label or as an icon-only square, rounded or pill-shaped,
6718
6875
  * sized to its label or filling its parent's width, and optionally a
6719
- * `pressed` toggle. Inside a
6876
+ * `pressed` toggle or `currentStep` marker. Inside a
6720
6877
  * `ToolbarControlGroup`, use a plain `<button>`, which the group styles; use
6721
6878
  * Button for a dialog footer, a form, or a standalone action beside other
6722
6879
  * content.
6723
6880
  */
6724
- declare function Button({ children, tone, emphasis, size, shape, fill, pressed, icon, loading, disabled, type, name, value, form, href, target, action, focusRingInset, badge, badgeLabel, badgeTone, ariaLabel, title, id, className, rootAttributes, slot, }: ButtonProps): kerfjs.SafeHtml;
6881
+ declare function Button({ children, tone, emphasis, size, shape, fill, pressed, currentStep, icon, loading, disabled, type, name, value, form, href, target, action, focusRingInset, badge, badgeLabel, badgeTone, ariaLabel, title, id, className, rootAttributes, slot, }: ButtonProps): kerfjs.SafeHtml;
6725
6882
 
6726
6883
  export { Button, type ButtonContent, type ButtonEmphasis, type ButtonLabel, type ButtonOptions, type ButtonProps, type ButtonRootAttributes, type ButtonShape, type ButtonSize, type ButtonTone, type ButtonType };
6727
6884
  ```