@kerfjs/ui 5.0.0-beta.107 → 5.0.0-beta.108

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 (118) hide show
  1. package/ai/component-catalog.json +24 -12
  2. package/ai/component-composition.json +8 -2
  3. package/ai/components/button.md +5 -5
  4. package/ai/components/chip.md +1 -0
  5. package/ai/components/foundation.md +1 -1
  6. package/ai/components/list.md +1 -1
  7. package/ai/components/segmented-control.md +1 -0
  8. package/ai/components/surface-scaffold.md +1 -0
  9. package/ai/components/text-field.md +3 -1
  10. package/ai/components/toolbar-control-group.md +1 -0
  11. package/ai/components/toolbar.md +1 -1
  12. package/ai/public-api-signatures-v1.md +64 -13
  13. package/ai/skill.md +12 -6
  14. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  15. package/dist/button.d.ts +3 -3
  16. package/dist/button.js +1 -1
  17. package/dist/catalog.js +4 -4
  18. package/dist/chip.d.ts +20 -2
  19. package/dist/chip.js +2 -1
  20. package/dist/{chunk-23PPPNH6.js → chunk-4OV272LF.js} +2 -2
  21. package/dist/{chunk-23PPPNH6.js.map → chunk-4OV272LF.js.map} +1 -1
  22. package/dist/{chunk-2PXZBFEC.js → chunk-5J6Z4BWY.js} +1 -1
  23. package/dist/{chunk-2PXZBFEC.js.map → chunk-5J6Z4BWY.js.map} +1 -1
  24. package/dist/{chunk-G4DRH4A5.js → chunk-6CDILXF4.js} +3 -1
  25. package/dist/chunk-6CDILXF4.js.map +1 -0
  26. package/dist/{chunk-NLMEDZRM.js → chunk-CPSGUGAY.js} +5 -5
  27. package/dist/{chunk-NLMEDZRM.js.map → chunk-CPSGUGAY.js.map} +1 -1
  28. package/dist/{chunk-TXRKCGT3.js → chunk-KPINJHIC.js} +1 -1
  29. package/dist/chunk-KPINJHIC.js.map +1 -0
  30. package/dist/{chunk-N7MBGONH.js → chunk-LMHN2TJL.js} +22 -2
  31. package/dist/chunk-LMHN2TJL.js.map +1 -0
  32. package/dist/{chunk-NS2TBYM4.js → chunk-LZUUUHNH.js} +7 -3
  33. package/dist/chunk-LZUUUHNH.js.map +1 -0
  34. package/dist/{chunk-OY2MXIBB.js → chunk-NB6POCFH.js} +3 -1
  35. package/dist/chunk-NB6POCFH.js.map +1 -0
  36. package/dist/{chunk-AZ3WT77F.js → chunk-P7EJ4CAD.js} +2 -2
  37. package/dist/{chunk-AZ3WT77F.js.map → chunk-P7EJ4CAD.js.map} +1 -1
  38. package/dist/{chunk-Z4DS77U2.js → chunk-SOFPUW3O.js} +4 -4
  39. package/dist/{chunk-Z4DS77U2.js.map → chunk-SOFPUW3O.js.map} +1 -1
  40. package/dist/{chunk-QLA25V2K.js → chunk-WPNIKZMJ.js} +15 -1
  41. package/dist/chunk-WPNIKZMJ.js.map +1 -0
  42. package/dist/{chunk-DNWWF6UN.js → chunk-WSEJ2FDE.js} +4 -4
  43. package/dist/{chunk-DNWWF6UN.js.map → chunk-WSEJ2FDE.js.map} +1 -1
  44. package/dist/{chunk-WU57BYYM.js → chunk-YVZCKXR3.js} +8 -2
  45. package/dist/chunk-YVZCKXR3.js.map +1 -0
  46. package/dist/{chunk-CMLPFIC5.js → chunk-ZN7KUMPY.js} +3 -1
  47. package/dist/chunk-ZN7KUMPY.js.map +1 -0
  48. package/dist/collapsible-panel.js +2 -2
  49. package/dist/index.js +9 -9
  50. package/dist/list-detail-dialog.js +4 -4
  51. package/dist/list.d.ts +7 -1
  52. package/dist/list.js +1 -1
  53. package/dist/message-composer.js +1 -1
  54. package/dist/nav-stack.js +1 -1
  55. package/dist/segmented-control.d.ts +3 -1
  56. package/dist/segmented-control.js +1 -1
  57. package/dist/split-view.js +1 -1
  58. package/dist/styles/button.css +28 -2
  59. package/dist/styles/components/actions/button/button.css +28 -2
  60. package/dist/styles/components/actions/toolbar/toolbar.css +9 -0
  61. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +29 -1
  62. package/dist/styles/components/collections/framed-list/framed-list.css +2 -0
  63. package/dist/styles/components/layout/pane/pane.css +15 -0
  64. package/dist/styles/components/navigation/nav-stack/nav-stack.css +13 -0
  65. package/dist/styles/components/navigation/tab-bar/tab-bar.css +6 -0
  66. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +16 -0
  67. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +2 -0
  68. package/dist/styles/foundation.css +63 -19
  69. package/dist/styles/framed-list.css +2 -0
  70. package/dist/styles/nav-stack.css +13 -0
  71. package/dist/styles/pane.css +15 -0
  72. package/dist/styles/surface-scaffold.css +2 -0
  73. package/dist/styles/tab-bar.css +6 -0
  74. package/dist/styles/tab-navigator.css +16 -0
  75. package/dist/styles/toolbar-control-group.css +29 -1
  76. package/dist/styles/toolbar.css +9 -0
  77. package/dist/styles/webawesome.css +11 -3
  78. package/dist/surface-scaffold.d.ts +9 -1
  79. package/dist/surface-scaffold.js +1 -1
  80. package/dist/text-field.d.ts +7 -1
  81. package/dist/text-field.js +1 -1
  82. package/dist/toolbar-control-group.d.ts +8 -2
  83. package/dist/toolbar-control-group.js +1 -1
  84. package/dist/toolbar.d.ts +6 -1
  85. package/dist/toolbar.js +1 -1
  86. package/dist/wire-catalog.js +1 -1
  87. package/dist/wire-workbench.js +1 -1
  88. package/dist/workbench-dialog.js +3 -3
  89. package/dist/workbench.js +1 -1
  90. package/docs/accessibility.md +25 -9
  91. package/docs/component-contract.md +19 -6
  92. package/docs/component-selection.md +38 -12
  93. package/docs/design/templates/button/tones-dark.svg +1 -1
  94. package/docs/design/templates/button/tones.svg +1 -1
  95. package/docs/design/templates/button-dark.svg +1 -1
  96. package/docs/design/templates/button.svg +1 -1
  97. package/docs/design/templates/split-button/states-dark.svg +1 -1
  98. package/docs/design/templates/split-button/states.svg +1 -1
  99. package/docs/design/templates/split-button-dark.svg +1 -1
  100. package/docs/design/templates/split-button.svg +1 -1
  101. package/docs/design/templates/text-field/number-dark.svg +1 -0
  102. package/docs/design/templates/text-field/number.svg +1 -0
  103. package/docs/design/templates/text-field-dark.svg +1 -1
  104. package/docs/design/templates/text-field.svg +1 -1
  105. package/docs/layout.md +16 -5
  106. package/docs/webawesome-migration.md +2 -0
  107. package/docs/webawesome-theme.md +8 -2
  108. package/docs/workbench.md +7 -1
  109. package/llms.txt +17 -5
  110. package/package.json +1 -1
  111. package/dist/chunk-CMLPFIC5.js.map +0 -1
  112. package/dist/chunk-G4DRH4A5.js.map +0 -1
  113. package/dist/chunk-N7MBGONH.js.map +0 -1
  114. package/dist/chunk-NS2TBYM4.js.map +0 -1
  115. package/dist/chunk-OY2MXIBB.js.map +0 -1
  116. package/dist/chunk-QLA25V2K.js.map +0 -1
  117. package/dist/chunk-TXRKCGT3.js.map +0 -1
  118. package/dist/chunk-WU57BYYM.js.map +0 -1
@@ -115,7 +115,8 @@
115
115
  "quiet, solid, or outline appearance",
116
116
  "pill or rounded shape",
117
117
  "compact or default size",
118
- "removable, link, action, or plain, enabled or disabled"
118
+ "removable, link, action, or plain, enabled or disabled",
119
+ "rootAttributes: safe data-* identity on the plain, link, or action root"
119
120
  ],
120
121
  "accessibility": [
121
122
  "The remove control is a native button and requires an action and a specific removeLabel. A disabled chip disables that button and removes it from keyboard interaction.",
@@ -487,7 +488,8 @@
487
488
  "--kui-focus-ring",
488
489
  "--kui-shadow-s",
489
490
  "--kui-shadow-m",
490
- "--kui-shadow-l"
491
+ "--kui-shadow-l",
492
+ "--kui-color-brand"
491
493
  ],
492
494
  "links": {
493
495
  "catalogRoute": "?component=foundation",
@@ -1791,7 +1793,7 @@
1791
1793
  ],
1792
1794
  "variants": [
1793
1795
  "no dividers (default)",
1794
- "scroll dividers when named as wireScrollDividers targets chrome",
1796
+ "scroll dividers when named as wireScrollDividers targets chrome (by its id)",
1795
1797
  "top/right/bottom/left divider combinations",
1796
1798
  "centered content",
1797
1799
  "stacked zones at compact or narrow widths",
@@ -1970,6 +1972,7 @@
1970
1972
  "standard, compact, or list-zero dropdown menu inset",
1971
1973
  "visible, horizontally scrollable, or whole-action wrapping overflow",
1972
1974
  "always visible or compact-only responsive visibility",
1975
+ "yield to an expanded trailing sibling at 480px, or exactly while a trailing-priority Toolbar row is active (yield-to-priority-row)",
1973
1976
  "relocate on panel collapse",
1974
1977
  "avatar scrim",
1975
1978
  "contained avatar background on a single group or selected multi-button highlight",
@@ -2171,6 +2174,7 @@
2171
2174
  "small, medium, or large dialog",
2172
2175
  "data-* rootAttributes (a data-key) so sibling dialogs morph by identity",
2173
2176
  "modal, side-sheet, fullscreen, or bottom-sheet dialog",
2177
+ "alert dialog (alert): role=\"alertdialog\" on the native dialog, described by its message through describedBy",
2174
2178
  "bottom sheet attached to the bottom edge: square bottom corners, safe-area and virtual-keyboard clearance behind the panel, slide (or standard) enter and exit motion, and an optional resizable top grabber bounded by minHeight and maxHeight",
2175
2179
  "typed modal preferred width, viewport gutter, and maximum height, including viewport cap",
2176
2180
  "definite viewport-bounded modal height and a fill body layout for one child",
@@ -4152,7 +4156,7 @@
4152
4156
  "top/right/bottom/left text and control inset combinations",
4153
4157
  "fill: the layout root fills a definite-height parent",
4154
4158
  "rootAttributes: safe data-*, aria-*, and structural role on the root",
4155
- "scroll dividers when named as wireScrollDividers targets chrome",
4159
+ "scroll dividers when named as wireScrollDividers targets chrome or scroller (by its id)",
4156
4160
  "multi-select grid for rich ContentItem rows",
4157
4161
  "contentWidth (compact 440px, medium 640px, wide 864px) and contentAlign for a readable, centered page column"
4158
4162
  ],
@@ -5469,7 +5473,8 @@
5469
5473
  "pill",
5470
5474
  "equal width",
5471
5475
  "small",
5472
- "placeholder (loading)"
5476
+ "placeholder (loading)",
5477
+ "disabled (whole control)"
5473
5478
  ],
5474
5479
  "accessibility": [
5475
5480
  "Keep choice labels meaningful and every enabled native button in sequential Tab order."
@@ -6710,7 +6715,7 @@
6710
6715
  "category": "Controls",
6711
6716
  "kind": "component",
6712
6717
  "source": "kerf",
6713
- "description": "A labeled single-line input or multi-line textarea with hint and error text, an optional leading icon, clear button, and character count, at the 44px control height or compact.",
6718
+ "description": "A labeled single-line input or multi-line textarea with hint and error text, an optional leading icon, clear button, character count, and native numeric constraints, at the 44px control height or compact.",
6714
6719
  "uses": [
6715
6720
  "lucide-icon"
6716
6721
  ],
@@ -6722,7 +6727,8 @@
6722
6727
  "useWhen": [
6723
6728
  "A form or dialog collects a line of free text: label names it (or ariaLabel when nearby content already does), hint explains it, and error reports a validation problem.",
6724
6729
  "People write a longer note or message: multiline with rows, or rows plus maxRows to grow with the content; maxLength with showCount shows the remaining budget.",
6725
- "A filter or search field needs a leading icon and a clear button: icon and clearable."
6730
+ "A filter or search field needs a leading icon and a clear button: icon and clearable.",
6731
+ "An exact number needs native range or decimal-step validation: type=number with min, max, and step (including step=any)."
6726
6732
  ],
6727
6733
  "avoidWhen": [
6728
6734
  "Do not use when only existing values are allowed; use Select.",
@@ -6768,7 +6774,8 @@
6768
6774
  "disabled",
6769
6775
  "read-only",
6770
6776
  "required",
6771
- "email, password, search, url, tel, or number type"
6777
+ "email, password, search, url, tel, or number type",
6778
+ "number type with native min, max, and step constraints"
6772
6779
  ],
6773
6780
  "accessibility": [
6774
6781
  "The whole field is a <label> around a native <input> or <textarea>, so clicking anywhere on it focuses the field; the input is named by label (aria-label, with the visible label text hidden from assistive technology so the clear button and count stay out of the name) or by ariaLabel. Focus shows the standard focus ring around the box.",
@@ -7558,7 +7565,7 @@
7558
7565
  "category": "Controls",
7559
7566
  "kind": "component",
7560
7567
  "source": "kerf",
7561
- "description": "A standalone action button: a native button (or a link with href) in a neutral, brand, or danger tone and a primary, secondary, or plain emphasis, at the 44px control height or compact.",
7568
+ "description": "A standalone action button: a native button (or a link with href) in a neutral, brand, success, or danger tone and a primary, secondary, or plain emphasis, at the 44px control height or compact.",
7562
7569
  "uses": [
7563
7570
  "loading-spinner"
7564
7571
  ],
@@ -7567,7 +7574,7 @@
7567
7574
  "Button"
7568
7575
  ],
7569
7576
  "useWhen": [
7570
- "A dialog footer, a form, or content needs an action button: tone=\"brand\" for the main action, tone=\"danger\" for a destructive one, and emphasis=\"secondary\" or \"plain\" for the quieter actions beside it.",
7577
+ "A dialog footer, a form, or content needs an action button: tone=\"brand\" for the main action, tone=\"success\" for a positive action such as a pricing check, tone=\"danger\" for a destructive one, and emphasis=\"secondary\" or \"plain\" for the quieter actions beside it.",
7571
7578
  "A form submits or resets: type=\"submit\" or \"reset\" (the default type never submits), with name, value, and form when needed.",
7572
7579
  "An action navigates: href renders a link with the same chrome.",
7573
7580
  "A single primary action spans its form, sheet, or narrow column: fill makes it span the parent's available inline width, label centered, as SplitButton's fill does."
@@ -7594,7 +7601,7 @@
7594
7601
  "form ownership"
7595
7602
  ],
7596
7603
  "variants": [
7597
- "neutral, brand, or danger tone",
7604
+ "neutral, brand, success, or danger tone",
7598
7605
  "primary, secondary, or plain emphasis",
7599
7606
  "default or compact size",
7600
7607
  "rounded (default) or pill shape",
@@ -7610,7 +7617,7 @@
7610
7617
  ],
7611
7618
  "accessibility": [
7612
7619
  "A native <button> (type=\"button\" unless set) or, with href, an <a>; its label names it, or ariaLabel when the label is not enough. Focus shows the standard focus ring 1px outside the box; with focusRingInset it is drawn inside the box, two-tone with a surface-colored line inside the ring color, so it keeps 3:1 contrast on a loud fill of its own hue.",
7613
- "Loading shows a spinner in place of the label, which still names the button, and sets aria-busy=\"true\". A disabled link drops its href and reports aria-disabled=\"true\".",
7620
+ "Loading shows a spinner in place of the label, which still names the button, and sets aria-busy=\"true\". A disabled link drops its href and reports aria-disabled=\"true\". Disabled success uses a quiet success fill and readable on-fill text instead of fading the label.",
7614
7621
  "With pressed, it is a toggle: aria-pressed reports the state, and the pressed look adds a doubled outline (secondary and plain) or a darkened fill with an inset ring (primary), so the state never relies on hue alone; forced-colors mode paints it Highlight. An icon-only Button is named by ariaLabel, and help tags show that name on hover and keyboard focus. A title gives native hover text that says more than the name and replaces the help tag."
7615
7622
  ],
7616
7623
  "geometry": {
@@ -7643,6 +7650,11 @@
7643
7650
  "--kui-color-brand-fill-quiet",
7644
7651
  "--kui-color-brand-on-quiet",
7645
7652
  "--kui-color-brand-border-loud",
7653
+ "--kui-color-success-fill-loud",
7654
+ "--kui-color-success-on-loud",
7655
+ "--kui-color-success-fill-quiet",
7656
+ "--kui-color-success-on-fill",
7657
+ "--kui-color-success-border-loud",
7646
7658
  "--kui-color-danger-fill-loud",
7647
7659
  "--kui-color-danger-on-loud",
7648
7660
  "--kui-color-danger-fill-quiet",
@@ -415,7 +415,8 @@
415
415
  "--kui-focus-ring",
416
416
  "--kui-shadow-s",
417
417
  "--kui-shadow-m",
418
- "--kui-shadow-l"
418
+ "--kui-shadow-l",
419
+ "--kui-color-brand"
419
420
  ]
420
421
  },
421
422
  "diagnostics": [],
@@ -6093,7 +6094,7 @@
6093
6094
  "accessibility": {
6094
6095
  "obligations": [
6095
6096
  "A native <button> (type=\"button\" unless set) or, with href, an <a>; its label names it, or ariaLabel when the label is not enough. Focus shows the standard focus ring 1px outside the box; with focusRingInset it is drawn inside the box, two-tone with a surface-colored line inside the ring color, so it keeps 3:1 contrast on a loud fill of its own hue.",
6096
- "Loading shows a spinner in place of the label, which still names the button, and sets aria-busy=\"true\". A disabled link drops its href and reports aria-disabled=\"true\".",
6097
+ "Loading shows a spinner in place of the label, which still names the button, and sets aria-busy=\"true\". A disabled link drops its href and reports aria-disabled=\"true\". Disabled success uses a quiet success fill and readable on-fill text instead of fading the label.",
6097
6098
  "With pressed, it is a toggle: aria-pressed reports the state, and the pressed look adds a doubled outline (secondary and plain) or a darkened fill with an inset ring (primary), so the state never relies on hue alone; forced-colors mode paints it Highlight. An icon-only Button is named by ariaLabel, and help tags show that name on hover and keyboard focus. A title gives native hover text that says more than the name and replaces the help tag."
6098
6099
  ]
6099
6100
  },
@@ -6118,6 +6119,11 @@
6118
6119
  "--kui-color-brand-fill-quiet",
6119
6120
  "--kui-color-brand-on-quiet",
6120
6121
  "--kui-color-brand-border-loud",
6122
+ "--kui-color-success-fill-loud",
6123
+ "--kui-color-success-on-loud",
6124
+ "--kui-color-success-fill-quiet",
6125
+ "--kui-color-success-on-fill",
6126
+ "--kui-color-success-border-loud",
6121
6127
  "--kui-color-danger-fill-loud",
6122
6128
  "--kui-color-danger-on-loud",
6123
6129
  "--kui-color-danger-fill-quiet",
@@ -4,13 +4,13 @@
4
4
 
5
5
  `@kerfjs/ui:button` · Kerf UI · component · Controls
6
6
 
7
- A standalone action button: a native button (or a link with href) in a neutral, brand, or danger tone and a primary, secondary, or plain emphasis, at the 44px control height or compact.
7
+ A standalone action button: a native button (or a link with href) in a neutral, brand, success, or danger tone and a primary, secondary, or plain emphasis, at the 44px control height or compact.
8
8
 
9
9
  ## When to use
10
10
 
11
11
  Trigger an action from a dialog footer, a form, or content outside any Toolbar, with Kerf's button chrome and native button semantics.
12
12
 
13
- - A dialog footer, a form, or content needs an action button: tone="brand" for the main action, tone="danger" for a destructive one, and emphasis="secondary" or "plain" for the quieter actions beside it.
13
+ - A dialog footer, a form, or content needs an action button: tone="brand" for the main action, tone="success" for a positive action such as a pricing check, tone="danger" for a destructive one, and emphasis="secondary" or "plain" for the quieter actions beside it.
14
14
  - A form submits or resets: type="submit" or "reset" (the default type never submits), with name, value, and form when needed.
15
15
  - An action navigates: href renders a link with the same chrome.
16
16
  - A single primary action spans its form, sheet, or narrow column: fill makes it span the parent's available inline width, label centered, as SplitButton's fill does.
@@ -38,7 +38,7 @@ Exact prop names and types: [`@kerfjs/ui/button`](../public-api-signatures-v1.md
38
38
 
39
39
  **Variants (configure, do not restyle):**
40
40
 
41
- - neutral, brand, or danger tone
41
+ - neutral, brand, success, or danger tone
42
42
  - primary, secondary, or plain emphasis
43
43
  - default or compact size
44
44
  - rounded (default) or pill shape
@@ -72,7 +72,7 @@ Margin: none · border: self · padding: self (layout role: controls). `self` me
72
72
  ## Accessibility
73
73
 
74
74
  - A native \<button> (type="button" unless set) or, with href, an \<a>; its label names it, or ariaLabel when the label is not enough. Focus shows the standard focus ring 1px outside the box; with focusRingInset it is drawn inside the box, two-tone with a surface-colored line inside the ring color, so it keeps 3:1 contrast on a loud fill of its own hue.
75
- - Loading shows a spinner in place of the label, which still names the button, and sets aria-busy="true". A disabled link drops its href and reports aria-disabled="true".
75
+ - Loading shows a spinner in place of the label, which still names the button, and sets aria-busy="true". A disabled link drops its href and reports aria-disabled="true". Disabled success uses a quiet success fill and readable on-fill text instead of fading the label.
76
76
  - With pressed, it is a toggle: aria-pressed reports the state, and the pressed look adds a doubled outline (secondary and plain) or a darkened fill with an inset ring (primary), so the state never relies on hue alone; forced-colors mode paints it Highlight. An icon-only Button is named by ariaLabel, and help tags show that name on hover and keyboard focus. A title gives native hover text that says more than the name and replaces the help tag.
77
77
 
78
78
  ## Styling boundary
@@ -83,7 +83,7 @@ Public class hooks (select for layout placement only, never to change the compon
83
83
 
84
84
  Never put `kui-button`, `kui-button__icon`, `kui-button__label`, `kui-button__spinner` on an element you write; render `Button` instead (`KUI-L103`).
85
85
 
86
- Public tokens it reads: `--kui-color-neutral-fill-loud`, `--kui-color-neutral-on-loud`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-on-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-on-quiet`, `--kui-color-brand-border-loud`, `--kui-color-danger-fill-loud`, `--kui-color-danger-on-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-on-quiet`, `--kui-color-danger-border-loud`, `--kui-focus-ring`, `--kui-font-m`, `--kui-font-s`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
86
+ Public tokens it reads: `--kui-color-neutral-fill-loud`, `--kui-color-neutral-on-loud`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-border-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-on-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-on-quiet`, `--kui-color-brand-border-loud`, `--kui-color-success-fill-loud`, `--kui-color-success-on-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-on-fill`, `--kui-color-success-border-loud`, `--kui-color-danger-fill-loud`, `--kui-color-danger-on-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-on-quiet`, `--kui-color-danger-border-loud`, `--kui-focus-ring`, `--kui-font-m`, `--kui-font-s`, `--kui-layout-rounded-radius`. Set a token only where its public contract allows; prefer a prop.
87
87
 
88
88
  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`).
89
89
 
@@ -38,6 +38,7 @@ Exact prop names and types: [`@kerfjs/ui/chip`](../public-api-signatures-v1.md#k
38
38
  - pill or rounded shape
39
39
  - compact or default size
40
40
  - removable, link, action, or plain, enabled or disabled
41
+ - rootAttributes: safe data-\* identity on the plain, link, or action root
41
42
 
42
43
  ## Composition
43
44
 
@@ -55,7 +55,7 @@ Margin: none · border: none · padding: none (layout role: foundation). `self`
55
55
 
56
56
  The component owns its own styles. Configure it through its props and variants; do not override its internals.
57
57
 
58
- Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-xl`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-sunken-texture`, `--kui-sunken-surface`, `--kui-color-surface-current`, `--kui-color-surface-current-region`, `--kui-color-surface-current-tint`, `--kui-chrome-material`, `--kui-chrome-material-raised`, `--kui-chrome-material-filter`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-m`, `--kui-shadow-l`. Set a token only where its public contract allows; prefer a prop.
58
+ Public tokens it reads: `--kui-font-sans`, `--kui-font-mono`, `--kui-font-2xs`, `--kui-font-xs`, `--kui-font-s`, `--kui-font-m`, `--kui-font-l`, `--kui-font-xl`, `--kui-font-2xl`, `--kui-font-weight-semibold`, `--kui-space-none`, `--kui-space-2xs`, `--kui-space-xs`, `--kui-space-s`, `--kui-space-m`, `--kui-space-l`, `--kui-space-xl`, `--kui-bp-mobile`, `--kui-bp-tablet`, `--kui-bp-desktop`, `--kui-bp-xl-desktop`, `--kui-layout-inline-margin`, `--kui-layout-item-border-width`, `--kui-layout-item-padding`, `--kui-layout-item-gap`, `--kui-layout-content-gap`, `--kui-layout-control-gap`, `--kui-layout-metadata-gap`, `--kui-layout-highlight-inset`, `--kui-layout-rounded-radius`, `--kui-layout-pill-radius`, `--kui-toolbar-group-inner-size`, `--kui-toolbar-group-size`, `--kui-toolbar-gap`, `--kui-safe-area-block-start`, `--kui-safe-area-block-end`, `--kui-safe-area-inline-start`, `--kui-safe-area-inline-end`, `--kui-radius-s`, `--kui-radius-m`, `--kui-radius-l`, `--kui-radius-circle`, `--kui-radius-pill`, `--kui-disclosure-icon-scale`, `--kui-color-surface`, `--kui-color-surface-raised`, `--kui-color-surface-lowered`, `--kui-sunken-texture`, `--kui-sunken-surface`, `--kui-color-surface-current`, `--kui-color-surface-current-region`, `--kui-color-surface-current-tint`, `--kui-chrome-material`, `--kui-chrome-material-raised`, `--kui-chrome-material-filter`, `--kui-color-text`, `--kui-color-text-quiet`, `--kui-color-text-link`, `--kui-color-neutral-fill-quiet`, `--kui-color-neutral-fill-normal`, `--kui-color-neutral-fill-loud`, `--kui-color-neutral-border-quiet`, `--kui-color-neutral-border-normal`, `--kui-color-neutral-border-loud`, `--kui-color-neutral-on-quiet`, `--kui-color-neutral-on-normal`, `--kui-color-neutral-on-loud`, `--kui-color-brand-fill-loud`, `--kui-color-brand-fill-quiet`, `--kui-color-brand-fill-normal`, `--kui-color-brand-border-quiet`, `--kui-color-brand-border-normal`, `--kui-color-brand-border-loud`, `--kui-color-brand-on-quiet`, `--kui-color-brand-on-normal`, `--kui-color-brand-on-loud`, `--kui-color-brand-on-fill`, `--kui-color-pop-fill-loud`, `--kui-color-pop-fill-quiet`, `--kui-color-pop-fill-normal`, `--kui-color-pop-border-quiet`, `--kui-color-pop-border-normal`, `--kui-color-pop-border-loud`, `--kui-color-pop-on-quiet`, `--kui-color-pop-on-normal`, `--kui-color-pop-on-loud`, `--kui-color-pop-on-fill`, `--kui-color-success-fill-loud`, `--kui-color-success-fill-quiet`, `--kui-color-success-fill-normal`, `--kui-color-success-border-quiet`, `--kui-color-success-border-normal`, `--kui-color-success-border-loud`, `--kui-color-success-on-quiet`, `--kui-color-success-on-normal`, `--kui-color-success-on-loud`, `--kui-color-success-on-fill`, `--kui-color-warning-fill-loud`, `--kui-color-warning-fill-quiet`, `--kui-color-warning-fill-normal`, `--kui-color-warning-border-quiet`, `--kui-color-warning-border-normal`, `--kui-color-warning-border-loud`, `--kui-color-warning-on-quiet`, `--kui-color-warning-on-normal`, `--kui-color-warning-on-loud`, `--kui-color-warning-on-fill`, `--kui-color-danger-fill-loud`, `--kui-color-danger-fill-quiet`, `--kui-color-danger-fill-normal`, `--kui-color-danger-border-quiet`, `--kui-color-danger-border-normal`, `--kui-color-danger-border-loud`, `--kui-color-danger-on-quiet`, `--kui-color-danger-on-normal`, `--kui-color-danger-on-loud`, `--kui-color-danger-on-fill`, `--kui-focus-ring`, `--kui-shadow-s`, `--kui-shadow-m`, `--kui-shadow-l`, `--kui-color-brand`. Set a token only where its public contract allows; prefer a prop.
59
59
 
60
60
  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`).
61
61
 
@@ -61,7 +61,7 @@ Exact prop names and types: [`@kerfjs/ui/list`](../public-api-signatures-v1.md#k
61
61
  - top/right/bottom/left text and control inset combinations
62
62
  - fill: the layout root fills a definite-height parent
63
63
  - rootAttributes: safe data-\*, aria-\*, and structural role on the root
64
- - scroll dividers when named as wireScrollDividers targets chrome
64
+ - scroll dividers when named as wireScrollDividers targets chrome or scroller (by its id)
65
65
  - multi-select grid for rich ContentItem rows
66
66
  - contentWidth (compact 440px, medium 640px, wide 864px) and contentAlign for a readable, centered page column
67
67
 
@@ -40,6 +40,7 @@ Exact prop names and types: [`@kerfjs/ui/segmented-control`](../public-api-signa
40
40
  - equal width
41
41
  - small
42
42
  - placeholder (loading)
43
+ - disabled (whole control)
43
44
 
44
45
  ## Composition
45
46
 
@@ -41,6 +41,7 @@ Exact prop names and types: [`@kerfjs/ui/surface-scaffold`](../public-api-signat
41
41
  - small, medium, or large dialog
42
42
  - data-\* rootAttributes (a data-key) so sibling dialogs morph by identity
43
43
  - modal, side-sheet, fullscreen, or bottom-sheet dialog
44
+ - alert dialog (alert): role="alertdialog" on the native dialog, described by its message through describedBy
44
45
  - bottom sheet attached to the bottom edge: square bottom corners, safe-area and virtual-keyboard clearance behind the panel, slide (or standard) enter and exit motion, and an optional resizable top grabber bounded by minHeight and maxHeight
45
46
  - typed modal preferred width, viewport gutter, and maximum height, including viewport cap
46
47
  - definite viewport-bounded modal height and a fill body layout for one child
@@ -4,7 +4,7 @@
4
4
 
5
5
  `@kerfjs/ui:text-field` · Kerf UI · component · Controls
6
6
 
7
- A labeled single-line input or multi-line textarea with hint and error text, an optional leading icon, clear button, and character count, at the 44px control height or compact.
7
+ A labeled single-line input or multi-line textarea with hint and error text, an optional leading icon, clear button, character count, and native numeric constraints, at the 44px control height or compact.
8
8
 
9
9
  ## When to use
10
10
 
@@ -13,6 +13,7 @@ Collect free text (names, addresses, notes, comments) with Kerf's field chrome,
13
13
  - A form or dialog collects a line of free text: label names it (or ariaLabel when nearby content already does), hint explains it, and error reports a validation problem.
14
14
  - People write a longer note or message: multiline with rows, or rows plus maxRows to grow with the content; maxLength with showCount shows the remaining budget.
15
15
  - A filter or search field needs a leading icon and a clear button: icon and clearable.
16
+ - An exact number needs native range or decimal-step validation: type=number with min, max, and step (including step=any).
16
17
 
17
18
  **Not when:**
18
19
 
@@ -53,6 +54,7 @@ Exact prop names and types: [`@kerfjs/ui/text-field`](../public-api-signatures-v
53
54
  - read-only
54
55
  - required
55
56
  - email, password, search, url, tel, or number type
57
+ - number type with native min, max, and step constraints
56
58
 
57
59
  ## Composition
58
60
 
@@ -57,6 +57,7 @@ Exact prop names and types: [`@kerfjs/ui/toolbar-control-group`](../public-api-s
57
57
  - standard, compact, or list-zero dropdown menu inset
58
58
  - visible, horizontally scrollable, or whole-action wrapping overflow
59
59
  - always visible or compact-only responsive visibility
60
+ - yield to an expanded trailing sibling at 480px, or exactly while a trailing-priority Toolbar row is active (yield-to-priority-row)
60
61
  - relocate on panel collapse
61
62
  - avatar scrim
62
63
  - contained avatar background on a single group or selected multi-button highlight
@@ -31,7 +31,7 @@ Exact prop names and types: [`@kerfjs/ui/toolbar`](../public-api-signatures-v1.m
31
31
  **Variants (configure, do not restyle):**
32
32
 
33
33
  - no dividers (default)
34
- - scroll dividers when named as wireScrollDividers targets chrome
34
+ - scroll dividers when named as wireScrollDividers targets chrome (by its id)
35
35
  - top/right/bottom/left divider combinations
36
36
  - centered content
37
37
  - stacked zones at compact or narrow widths
@@ -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.107` and `kerfjs@5.0.0-beta.107`. 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.108` and `kerfjs@5.0.0-beta.108`. 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
 
@@ -172,6 +172,11 @@ type ToolbarPosition = 'header' | 'footer';
172
172
  /** Control-band density: `default` (60px with 44px groups) or `compact`. */
173
173
  type ToolbarDensity = 'default' | 'compact';
174
174
  interface ToolbarProps {
175
+ /**
176
+ * The toolbar's id, so app code can address it: name it as a scrolling
177
+ * List's chrome in `wireScrollDividers({ targets })`, or find it in tests.
178
+ */
179
+ id?: string;
175
180
  leading?: KerfUiContent;
176
181
  center?: KerfUiContent;
177
182
  trailing?: KerfUiContent;
@@ -236,7 +241,7 @@ interface ToolbarProps {
236
241
  * toolbar) forwards, so the app configures that toolbar instead of styling it.
237
242
  */
238
243
  type ToolbarConfig = Pick<ToolbarProps, 'density' | 'dividerSides' | 'centerAlign' | 'responsive' | 'responsiveAt' | 'safeAreaEdges'>;
239
- declare function Toolbar({ leading, center, trailing, label, position, density, dividerSides, centerAlign, responsive, responsiveAt, safeAreaEdges, className, slot, }: ToolbarProps): kerfjs.SafeHtml;
244
+ declare function Toolbar({ id, leading, center, trailing, label, position, density, dividerSides, centerAlign, responsive, responsiveAt, safeAreaEdges, className, slot, }: ToolbarProps): kerfjs.SafeHtml;
240
245
 
241
246
  export { Sides, Toolbar, type ToolbarConfig, type ToolbarDensity, type ToolbarPosition, type ToolbarProps };
242
247
  ```
@@ -347,7 +352,7 @@ type ToolbarControlGroupSelectedTone = 'brand' | 'neutral' | 'pop';
347
352
  type ToolbarControlGroupOverflow = 'visible' | 'scroll' | 'wrap';
348
353
  type ToolbarControlGroupExpandedOverflow = 'clip' | 'visible';
349
354
  type ToolbarControlGroupMenuInset = 'standard' | 'compact' | 'list-zero';
350
- type ToolbarControlGroupVisibility = 'always' | 'compact-only' | 'hide-collapsed-tiny' | 'yield-to-expanded-sibling';
355
+ type ToolbarControlGroupVisibility = 'always' | 'compact-only' | 'hide-collapsed-tiny' | 'yield-to-expanded-sibling' | 'yield-to-priority-row';
351
356
  type ToolbarControlGroupSizing = 'content' | 'grow' | 'fill';
352
357
  type ToolbarControlGroupPlacement = 'start' | 'end';
353
358
  interface ToolbarActionLinkProps {
@@ -410,7 +415,13 @@ interface ToolbarControlGroupProps {
410
415
  overflow?: ToolbarControlGroupOverflow;
411
416
  /** Let app-owned anchored surfaces extend outside an expanded search group. Collapsed searches retain their clipping. */
412
417
  expandedOverflow?: ToolbarControlGroupExpandedOverflow;
413
- /** Responsive visibility owned by the enclosing Toolbar container. */
418
+ /**
419
+ * Responsive visibility owned by the enclosing Toolbar container.
420
+ * `yield-to-priority-row` hides this trailing group exactly while its
421
+ * Toolbar's `responsive="trailing-priority"` row is active (an expanded
422
+ * trailing sibling at the Toolbar's `responsiveAt` width), so the app never
423
+ * restates that breakpoint with `hideBelow`.
424
+ */
414
425
  visibility?: ToolbarControlGroupVisibility;
415
426
  /** Hide below this Toolbar content width; requires wireToolbarVisibility. */
416
427
  hideBelow?: CssLength;
@@ -893,6 +904,12 @@ interface ListProps {
893
904
  /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */
894
905
  controlInsets?: Sides;
895
906
  className?: string;
907
+ /**
908
+ * The list's id, so app code can address it: name it as a
909
+ * `wireScrollDividers` scroller (with a `Toolbar` above it as its chrome),
910
+ * or find it in tests.
911
+ */
912
+ id?: string;
896
913
  /**
897
914
  * Safe `data-*`, `aria-*`, and structural `role` metadata (a named drop
898
915
  * `region`, `aria-busy`); List-owned structural attributes remain
@@ -910,7 +927,7 @@ interface ListProps {
910
927
  */
911
928
  type ListConfig = Pick<ListProps, 'gap' | 'hAlign' | 'vAlign' | 'dividerSides' | 'textInsets' | 'controlInsets'>;
912
929
  /** A stretch-aligned vertical stack with optional gap, flex, fill, scroll, and dividers. */
913
- declare function List({ children, selectionMode, ariaLabel, gap, flex, fill, hAlign, vAlign, scrollable, scrollClearance, frame, maxHeight, minHeight, surface, inset, contentWidth, contentAlign, dividerSides, textInsets, controlInsets, className, rootAttributes, slot, }: ListProps): kerfjs.SafeHtml;
930
+ declare function List({ children, selectionMode, ariaLabel, gap, flex, fill, hAlign, vAlign, scrollable, scrollClearance, frame, maxHeight, minHeight, surface, inset, contentWidth, contentAlign, dividerSides, textInsets, controlInsets, className, id, rootAttributes, slot, }: ListProps): kerfjs.SafeHtml;
914
931
 
915
932
  export { CssFlex, CssFlexKeyword, CssLength, HorizontalAlignment, List, type ListConfig, type ListContentWidth, type ListInset, type ListProps, type ListSurface, ListVerticalAlignment, ScrollClearance, Sides, UiGap };
916
933
  ```
@@ -3447,10 +3464,12 @@ interface SegmentedControlProps<Value extends string = string> {
3447
3464
  className?: string;
3448
3465
  /** Render as a loading placeholder: every choice keeps its live label or icon, none is selected, and every segment is disabled. */
3449
3466
  placeholder?: boolean;
3467
+ /** Disable the whole control: every segment is disabled and dimmed, the selection stays visible, and the group reports `aria-disabled`. A choice's own `disabled` still disables just that segment. */
3468
+ disabled?: boolean;
3450
3469
  /** Native named-slot assignment when composed inside a web component. */
3451
3470
  slot?: string;
3452
3471
  }
3453
- declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, slot, }: SegmentedControlProps<Value>): kerfjs.SafeHtml;
3472
+ declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, disabled, slot, }: SegmentedControlProps<Value>): kerfjs.SafeHtml;
3454
3473
 
3455
3474
  export { SegmentedControl, type SegmentedControlAppearance, type SegmentedControlChoice, type SegmentedControlLayout, type SegmentedControlProps, type SegmentedControlShape, type SegmentedControlSize };
3456
3475
  ```
@@ -4324,6 +4343,19 @@ import './css-values.js';
4324
4343
  * and derives its fill, border, and focus ring from `currentColor`.
4325
4344
  */
4326
4345
  type ChipTone = SemanticTone | 'inherit';
4346
+ /** Safe `data-*` identity on a Chip root; Chip-owned attributes are protected. */
4347
+ type ChipRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
4348
+ 'data-component'?: never;
4349
+ 'data-tone'?: never;
4350
+ 'data-appearance'?: never;
4351
+ 'data-shape'?: never;
4352
+ 'data-size'?: never;
4353
+ 'data-disabled'?: never;
4354
+ 'data-truncate'?: never;
4355
+ 'data-item-id'?: never;
4356
+ 'data-link'?: never;
4357
+ 'data-action'?: never;
4358
+ }>;
4327
4359
  interface ChipCommonProps {
4328
4360
  /** Decorative leading icon, normally an unsized LucideIcon. */
4329
4361
  icon?: SafeHtml;
@@ -4334,6 +4366,11 @@ interface ChipCommonProps {
4334
4366
  disabled?: boolean;
4335
4367
  /** Record identifier available to an application delegated action handler. */
4336
4368
  itemId?: string;
4369
+ /**
4370
+ * Safe `data-*` identity on the chip root (a plain, link, or action chip),
4371
+ * for tests and delegated handlers; use `itemId` for the record id.
4372
+ */
4373
+ rootAttributes?: ChipRootAttributes;
4337
4374
  className?: string;
4338
4375
  /** Native named-slot assignment when composed inside a web component. */
4339
4376
  slot?: string;
@@ -4409,9 +4446,9 @@ type ChipProps = ChipCommonProps & ChipLabelProps & (({
4409
4446
  * `href` is set, or a native button when `action` is set. The application
4410
4447
  * owns removal, the link destination, and the action handler.
4411
4448
  */
4412
- declare function Chip({ children, icon, truncate, tone, appearance, shape, size, disabled, itemId, className, slot, href, download, external, removeAction, removeLabel, action, actionLabel, }: ChipProps): SafeHtml;
4449
+ declare function Chip({ children, icon, truncate, tone, appearance, shape, size, disabled, itemId, rootAttributes, className, slot, href, download, external, removeAction, removeLabel, action, actionLabel, }: ChipProps): SafeHtml;
4413
4450
 
4414
- export { Chip, type ChipProps, type ChipTone };
4451
+ export { Chip, type ChipProps, type ChipRootAttributes, type ChipTone };
4415
4452
  ```
4416
4453
 
4417
4454
  ## `@kerfjs/ui/lucide-icon`
@@ -4701,6 +4738,14 @@ interface DialogSurfaceOptions {
4701
4738
  * copy in the body; rendered as `aria-describedby` on the `<dialog>`.
4702
4739
  */
4703
4740
  describedBy?: string;
4741
+ /**
4742
+ * An alert dialog: a confirmation that interrupts the person to report
4743
+ * something urgent or ask before a destructive action ("Delete this
4744
+ * topic?"). Renders `role="alertdialog"` on the `<dialog>`; set
4745
+ * `describedBy` to the element holding the message, and leave
4746
+ * `lightDismiss` off so the person answers it.
4747
+ */
4748
+ alert?: boolean;
4704
4749
  /** The body content. */
4705
4750
  children: KerfUiContent;
4706
4751
  /**
@@ -4815,7 +4860,7 @@ interface DialogSurfaceOptions {
4815
4860
  * floating header and footer measurement, the bottom sheet's keyboard
4816
4861
  * clearance and grabber, and re-render resilience while open.
4817
4862
  */
4818
- declare function DialogSurface({ id, label, labelledBy, describedBy, 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;
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;
4819
4864
  /** Where a PopoverDialogSurface appears: the top layer, or in flow. */
4820
4865
  type PopoverDialogSurfacePresentation = 'overlay' | 'embedded';
4821
4866
  /** Application `data-*` metadata on the surface root. */
@@ -6126,6 +6171,12 @@ interface TextFieldOptions {
6126
6171
  showCount?: boolean;
6127
6172
  /** Single-line value kind (default `text`). */
6128
6173
  type?: TextFieldType;
6174
+ /** Native lower bound for `type="number"` (number or numeric string). */
6175
+ min?: number | string;
6176
+ /** Native upper bound for `type="number"` (number or numeric string). */
6177
+ max?: number | string;
6178
+ /** Native number increment (number, numeric string, or `"any"`). */
6179
+ step?: number | string;
6129
6180
  /** A multi-line field: a `<textarea>`. */
6130
6181
  multiline?: boolean;
6131
6182
  /** A multi-line field's height in lines (default 3). */
@@ -6154,7 +6205,7 @@ interface TextFieldOptions {
6154
6205
  * The whole field is one `<label>`, so clicking anywhere on it focuses the
6155
6206
  * input; the input is named by `label` (or `ariaLabel`) directly.
6156
6207
  */
6157
- declare function TextField({ label, ariaLabel, value, name, placeholder, hint, error, size, icon, clearable, clearLabel, maxLength, showCount, type, multiline, rows, maxRows, disabled, readOnly, required, autocomplete, id, className, rootAttributes, slot, }: TextFieldProps): kerfjs.SafeHtml;
6208
+ declare function TextField({ label, ariaLabel, value, name, placeholder, hint, error, size, icon, clearable, clearLabel, maxLength, showCount, type, min, max, step, multiline, rows, maxRows, disabled, readOnly, required, autocomplete, id, className, rootAttributes, slot, }: TextFieldProps): kerfjs.SafeHtml;
6158
6209
 
6159
6210
  export { TextField, type TextFieldName, type TextFieldOptions, type TextFieldProps, type TextFieldRootAttributes, type TextFieldSize, type TextFieldType };
6160
6211
  ```
@@ -6556,8 +6607,8 @@ import { BadgeTone } from './badge.js';
6556
6607
  import './css-values.js';
6557
6608
  import './semantic-tone-CdW013KF.js';
6558
6609
 
6559
- /** The color family: `neutral` (default), `brand` for the main action, `danger` for a destructive one. */
6560
- type ButtonTone = 'neutral' | 'brand' | 'danger';
6610
+ /** The color family: `neutral` (default), `brand` for the main action, `success` for a positive one, `danger` for a destructive one. */
6611
+ type ButtonTone = 'neutral' | 'brand' | 'success' | 'danger';
6561
6612
  /**
6562
6613
  * How loudly it asks: `primary` (default) fills the button, `secondary`
6563
6614
  * outlines it, and `plain` shows only its text until hovered.
@@ -6660,7 +6711,7 @@ interface ButtonOptions {
6660
6711
  }
6661
6712
  /**
6662
6713
  * A standalone action button: a native `<button>` (or a link with `href`)
6663
- * in one of three tones and three emphases, at the 44px control height or
6714
+ * in one of four tones and three emphases, at the 44px control height or
6664
6715
  * compact, with a label or as an icon-only square, rounded or pill-shaped,
6665
6716
  * sized to its label or filling its parent's width, and optionally a
6666
6717
  * `pressed` toggle. Inside a