@kerfjs/ui 5.0.0-beta.107 → 5.0.0-beta.109
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.
- package/ai/component-catalog.json +26 -13
- package/ai/component-composition-rules.json +2 -2
- package/ai/component-composition.json +10 -4
- package/ai/components/button.md +5 -5
- package/ai/components/chip.md +1 -0
- package/ai/components/foundation.md +1 -1
- package/ai/components/list.md +1 -1
- package/ai/components/segmented-control.md +1 -0
- package/ai/components/surface-scaffold.md +1 -0
- package/ai/components/tab-bar.md +5 -5
- package/ai/components/text-field.md +3 -1
- package/ai/components/toolbar-control-group.md +1 -0
- package/ai/components/toolbar.md +1 -1
- package/ai/public-api-signatures-v1.md +66 -15
- package/ai/skill.md +13 -7
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/button.d.ts +3 -3
- package/dist/button.js +1 -1
- package/dist/catalog.js +4 -4
- package/dist/chip.d.ts +20 -2
- package/dist/chip.js +2 -1
- package/dist/{chunk-23PPPNH6.js → chunk-4OV272LF.js} +2 -2
- package/dist/{chunk-23PPPNH6.js.map → chunk-4OV272LF.js.map} +1 -1
- package/dist/{chunk-2PXZBFEC.js → chunk-5J6Z4BWY.js} +1 -1
- package/dist/{chunk-2PXZBFEC.js.map → chunk-5J6Z4BWY.js.map} +1 -1
- package/dist/{chunk-G4DRH4A5.js → chunk-6CDILXF4.js} +3 -1
- package/dist/chunk-6CDILXF4.js.map +1 -0
- package/dist/{chunk-RFLW4FPL.js → chunk-7AK5I7U7.js} +1 -1
- package/dist/chunk-7AK5I7U7.js.map +1 -0
- package/dist/{chunk-NLMEDZRM.js → chunk-CPSGUGAY.js} +5 -5
- package/dist/{chunk-NLMEDZRM.js.map → chunk-CPSGUGAY.js.map} +1 -1
- package/dist/{chunk-TXRKCGT3.js → chunk-KPINJHIC.js} +1 -1
- package/dist/chunk-KPINJHIC.js.map +1 -0
- package/dist/{chunk-N7MBGONH.js → chunk-LMHN2TJL.js} +22 -2
- package/dist/chunk-LMHN2TJL.js.map +1 -0
- package/dist/{chunk-NS2TBYM4.js → chunk-LZUUUHNH.js} +7 -3
- package/dist/chunk-LZUUUHNH.js.map +1 -0
- package/dist/{chunk-OY2MXIBB.js → chunk-NB6POCFH.js} +3 -1
- package/dist/chunk-NB6POCFH.js.map +1 -0
- package/dist/{chunk-AZ3WT77F.js → chunk-P7EJ4CAD.js} +2 -2
- package/dist/{chunk-AZ3WT77F.js.map → chunk-P7EJ4CAD.js.map} +1 -1
- package/dist/{chunk-Z4DS77U2.js → chunk-SOFPUW3O.js} +4 -4
- package/dist/{chunk-Z4DS77U2.js.map → chunk-SOFPUW3O.js.map} +1 -1
- package/dist/{chunk-QLA25V2K.js → chunk-WPNIKZMJ.js} +15 -1
- package/dist/chunk-WPNIKZMJ.js.map +1 -0
- package/dist/{chunk-DNWWF6UN.js → chunk-WSEJ2FDE.js} +4 -4
- package/dist/{chunk-DNWWF6UN.js.map → chunk-WSEJ2FDE.js.map} +1 -1
- package/dist/{chunk-WU57BYYM.js → chunk-YVZCKXR3.js} +8 -2
- package/dist/chunk-YVZCKXR3.js.map +1 -0
- package/dist/{chunk-CMLPFIC5.js → chunk-ZN7KUMPY.js} +3 -1
- package/dist/chunk-ZN7KUMPY.js.map +1 -0
- package/dist/collapsible-panel.js +2 -2
- package/dist/index.js +10 -10
- package/dist/list-detail-dialog.js +4 -4
- package/dist/list.d.ts +7 -1
- package/dist/list.js +1 -1
- package/dist/message-composer.js +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/segmented-control.d.ts +3 -1
- package/dist/segmented-control.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/styles/button.css +28 -2
- package/dist/styles/components/actions/button/button.css +28 -2
- package/dist/styles/components/actions/toolbar/toolbar.css +9 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +29 -1
- package/dist/styles/components/collections/framed-list/framed-list.css +2 -0
- package/dist/styles/components/layout/pane/pane.css +15 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +13 -0
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +6 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +16 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +2 -0
- package/dist/styles/foundation.css +63 -19
- package/dist/styles/framed-list.css +2 -0
- package/dist/styles/nav-stack.css +13 -0
- package/dist/styles/pane.css +15 -0
- package/dist/styles/surface-scaffold.css +2 -0
- package/dist/styles/tab-bar.css +6 -0
- package/dist/styles/tab-navigator.css +16 -0
- package/dist/styles/toolbar-control-group.css +29 -1
- package/dist/styles/toolbar.css +9 -0
- package/dist/styles/webawesome.css +11 -3
- package/dist/surface-scaffold.d.ts +9 -1
- package/dist/surface-scaffold.js +1 -1
- package/dist/tab-bar.d.ts +2 -2
- package/dist/tab-bar.js +1 -1
- package/dist/text-field.d.ts +7 -1
- package/dist/text-field.js +1 -1
- package/dist/toolbar-control-group.d.ts +8 -2
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar.d.ts +6 -1
- package/dist/toolbar.js +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-workbench.js +1 -1
- package/dist/workbench-dialog.js +3 -3
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +29 -11
- package/docs/component-contract.md +19 -6
- package/docs/component-selection.md +38 -12
- package/docs/design/templates/button/tones-dark.svg +1 -1
- package/docs/design/templates/button/tones.svg +1 -1
- package/docs/design/templates/button-dark.svg +1 -1
- package/docs/design/templates/button.svg +1 -1
- package/docs/design/templates/split-button/states-dark.svg +1 -1
- package/docs/design/templates/split-button/states.svg +1 -1
- package/docs/design/templates/split-button-dark.svg +1 -1
- package/docs/design/templates/split-button.svg +1 -1
- package/docs/design/templates/text-field/number-dark.svg +1 -0
- package/docs/design/templates/text-field/number.svg +1 -0
- package/docs/design/templates/text-field-dark.svg +1 -1
- package/docs/design/templates/text-field.svg +1 -1
- package/docs/layout.md +16 -5
- package/docs/webawesome-migration.md +2 -0
- package/docs/webawesome-theme.md +8 -2
- package/docs/workbench.md +7 -1
- package/llms.txt +19 -7
- package/package.json +1 -1
- package/dist/chunk-CMLPFIC5.js.map +0 -1
- package/dist/chunk-G4DRH4A5.js.map +0 -1
- package/dist/chunk-N7MBGONH.js.map +0 -1
- package/dist/chunk-NS2TBYM4.js.map +0 -1
- package/dist/chunk-OY2MXIBB.js.map +0 -1
- package/dist/chunk-QLA25V2K.js.map +0 -1
- package/dist/chunk-RFLW4FPL.js.map +0 -1
- package/dist/chunk-TXRKCGT3.js.map +0 -1
- 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
|
],
|
|
@@ -5274,6 +5278,7 @@
|
|
|
5274
5278
|
"uses": [
|
|
5275
5279
|
"tabs",
|
|
5276
5280
|
"toolbar-control-group",
|
|
5281
|
+
"button",
|
|
5277
5282
|
"wa-button"
|
|
5278
5283
|
],
|
|
5279
5284
|
"purpose": "Controlled tab strips whose tabs shrink and scroll while fixed leading, trailing, and far-edge end actions remain visible.",
|
|
@@ -5319,7 +5324,7 @@
|
|
|
5319
5324
|
"intrinsic or fill allocation",
|
|
5320
5325
|
"separate or adjacent trailing action",
|
|
5321
5326
|
"far-edge end action",
|
|
5322
|
-
"standalone Web Awesome action in trailing or end",
|
|
5327
|
+
"standalone Kerf Button or Web Awesome action in trailing or end",
|
|
5323
5328
|
"overflow dividers on each side with tabs scrolled out of view (wired by wireScrollDividers)"
|
|
5324
5329
|
],
|
|
5325
5330
|
"accessibility": [
|
|
@@ -5469,7 +5474,8 @@
|
|
|
5469
5474
|
"pill",
|
|
5470
5475
|
"equal width",
|
|
5471
5476
|
"small",
|
|
5472
|
-
"placeholder (loading)"
|
|
5477
|
+
"placeholder (loading)",
|
|
5478
|
+
"disabled (whole control)"
|
|
5473
5479
|
],
|
|
5474
5480
|
"accessibility": [
|
|
5475
5481
|
"Keep choice labels meaningful and every enabled native button in sequential Tab order."
|
|
@@ -6710,7 +6716,7 @@
|
|
|
6710
6716
|
"category": "Controls",
|
|
6711
6717
|
"kind": "component",
|
|
6712
6718
|
"source": "kerf",
|
|
6713
|
-
"description": "A labeled single-line input or multi-line textarea with hint and error text, an optional leading icon, clear button,
|
|
6719
|
+
"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
6720
|
"uses": [
|
|
6715
6721
|
"lucide-icon"
|
|
6716
6722
|
],
|
|
@@ -6722,7 +6728,8 @@
|
|
|
6722
6728
|
"useWhen": [
|
|
6723
6729
|
"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
6730
|
"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."
|
|
6731
|
+
"A filter or search field needs a leading icon and a clear button: icon and clearable.",
|
|
6732
|
+
"An exact number needs native range or decimal-step validation: type=number with min, max, and step (including step=any)."
|
|
6726
6733
|
],
|
|
6727
6734
|
"avoidWhen": [
|
|
6728
6735
|
"Do not use when only existing values are allowed; use Select.",
|
|
@@ -6768,7 +6775,8 @@
|
|
|
6768
6775
|
"disabled",
|
|
6769
6776
|
"read-only",
|
|
6770
6777
|
"required",
|
|
6771
|
-
"email, password, search, url, tel, or number type"
|
|
6778
|
+
"email, password, search, url, tel, or number type",
|
|
6779
|
+
"number type with native min, max, and step constraints"
|
|
6772
6780
|
],
|
|
6773
6781
|
"accessibility": [
|
|
6774
6782
|
"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 +7566,7 @@
|
|
|
7558
7566
|
"category": "Controls",
|
|
7559
7567
|
"kind": "component",
|
|
7560
7568
|
"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.",
|
|
7569
|
+
"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
7570
|
"uses": [
|
|
7563
7571
|
"loading-spinner"
|
|
7564
7572
|
],
|
|
@@ -7567,7 +7575,7 @@
|
|
|
7567
7575
|
"Button"
|
|
7568
7576
|
],
|
|
7569
7577
|
"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.",
|
|
7578
|
+
"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
7579
|
"A form submits or resets: type=\"submit\" or \"reset\" (the default type never submits), with name, value, and form when needed.",
|
|
7572
7580
|
"An action navigates: href renders a link with the same chrome.",
|
|
7573
7581
|
"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 +7602,7 @@
|
|
|
7594
7602
|
"form ownership"
|
|
7595
7603
|
],
|
|
7596
7604
|
"variants": [
|
|
7597
|
-
"neutral, brand, or danger tone",
|
|
7605
|
+
"neutral, brand, success, or danger tone",
|
|
7598
7606
|
"primary, secondary, or plain emphasis",
|
|
7599
7607
|
"default or compact size",
|
|
7600
7608
|
"rounded (default) or pill shape",
|
|
@@ -7610,7 +7618,7 @@
|
|
|
7610
7618
|
],
|
|
7611
7619
|
"accessibility": [
|
|
7612
7620
|
"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\".",
|
|
7621
|
+
"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
7622
|
"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
7623
|
],
|
|
7616
7624
|
"geometry": {
|
|
@@ -7643,6 +7651,11 @@
|
|
|
7643
7651
|
"--kui-color-brand-fill-quiet",
|
|
7644
7652
|
"--kui-color-brand-on-quiet",
|
|
7645
7653
|
"--kui-color-brand-border-loud",
|
|
7654
|
+
"--kui-color-success-fill-loud",
|
|
7655
|
+
"--kui-color-success-on-loud",
|
|
7656
|
+
"--kui-color-success-fill-quiet",
|
|
7657
|
+
"--kui-color-success-on-fill",
|
|
7658
|
+
"--kui-color-success-border-loud",
|
|
7646
7659
|
"--kui-color-danger-fill-loud",
|
|
7647
7660
|
"--kui-color-danger-on-loud",
|
|
7648
7661
|
"--kui-color-danger-fill-quiet",
|
|
@@ -178,14 +178,14 @@
|
|
|
178
178
|
{
|
|
179
179
|
"id": "trailing",
|
|
180
180
|
"jsx": { "prop": "trailing" },
|
|
181
|
-
"accepts": ["toolbar-control-group", "wa-button"],
|
|
181
|
+
"accepts": ["toolbar-control-group", "button", "wa-button"],
|
|
182
182
|
"cardinality": { "min": 0, "max": 1 },
|
|
183
183
|
"exclusiveWith": []
|
|
184
184
|
},
|
|
185
185
|
{
|
|
186
186
|
"id": "end",
|
|
187
187
|
"jsx": { "prop": "end" },
|
|
188
|
-
"accepts": ["toolbar-control-group", "wa-button"],
|
|
188
|
+
"accepts": ["toolbar-control-group", "button", "wa-button"],
|
|
189
189
|
"cardinality": { "min": 0, "max": 1 },
|
|
190
190
|
"exclusiveWith": []
|
|
191
191
|
}
|
|
@@ -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": [],
|
|
@@ -4378,14 +4379,14 @@
|
|
|
4378
4379
|
{
|
|
4379
4380
|
"id": "trailing",
|
|
4380
4381
|
"jsx": { "prop": "trailing" },
|
|
4381
|
-
"accepts": ["toolbar-control-group", "wa-button"],
|
|
4382
|
+
"accepts": ["toolbar-control-group", "button", "wa-button"],
|
|
4382
4383
|
"cardinality": { "min": 0, "max": 1 },
|
|
4383
4384
|
"exclusiveWith": []
|
|
4384
4385
|
},
|
|
4385
4386
|
{
|
|
4386
4387
|
"id": "end",
|
|
4387
4388
|
"jsx": { "prop": "end" },
|
|
4388
|
-
"accepts": ["toolbar-control-group", "wa-button"],
|
|
4389
|
+
"accepts": ["toolbar-control-group", "button", "wa-button"],
|
|
4389
4390
|
"cardinality": { "min": 0, "max": 1 },
|
|
4390
4391
|
"exclusiveWith": []
|
|
4391
4392
|
}
|
|
@@ -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",
|
package/ai/components/button.md
CHANGED
|
@@ -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
|
|
package/ai/components/chip.md
CHANGED
|
@@ -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
|
|
package/ai/components/list.md
CHANGED
|
@@ -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
|
|
|
@@ -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
|
package/ai/components/tab-bar.md
CHANGED
|
@@ -45,7 +45,7 @@ Exact prop names and types: [`@kerfjs/ui/tab-bar`](../public-api-signatures-v1.m
|
|
|
45
45
|
- intrinsic or fill allocation
|
|
46
46
|
- separate or adjacent trailing action
|
|
47
47
|
- far-edge end action
|
|
48
|
-
- standalone Web Awesome action in trailing or end
|
|
48
|
+
- standalone Kerf Button or Web Awesome action in trailing or end
|
|
49
49
|
- overflow dividers on each side with tabs scrolled out of view (wired by wireScrollDividers)
|
|
50
50
|
|
|
51
51
|
## Composition
|
|
@@ -53,14 +53,14 @@ Exact prop names and types: [`@kerfjs/ui/tab-bar`](../public-api-signatures-v1.m
|
|
|
53
53
|
- Parents: any.
|
|
54
54
|
- Contexts: `tabpanel-navigation`.
|
|
55
55
|
- Children: only `tab-bar-item` (required: `tab-bar-item`).
|
|
56
|
-
- Built from: [TabBarItem](./tabs.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md).
|
|
56
|
+
- Built from: [TabBarItem](./tabs.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./button.md), [Button](./wa-button.md).
|
|
57
57
|
|
|
58
58
|
Zones (a zone is bound to JSX only through its listed prop; never assume the zone id is a prop):
|
|
59
59
|
|
|
60
60
|
- `tabs` — JSX prop `children`; accepts [TabBarItem](./tabs.md); at least 1.
|
|
61
61
|
- `leading` — JSX prop `leading`; accepts [ToolbarControlGroup](./toolbar-control-group.md); 0–1.
|
|
62
|
-
- `trailing` — JSX prop `trailing`; accepts [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md); 0–1.
|
|
63
|
-
- `end` — JSX prop `end`; accepts [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md); 0–1.
|
|
62
|
+
- `trailing` — JSX prop `trailing`; accepts [ToolbarControlGroup](./toolbar-control-group.md), [Button](./button.md), [Button](./wa-button.md); 0–1.
|
|
63
|
+
- `end` — JSX prop `end`; accepts [ToolbarControlGroup](./toolbar-control-group.md), [Button](./button.md), [Button](./wa-button.md); 0–1.
|
|
64
64
|
|
|
65
65
|
## State and wiring
|
|
66
66
|
|
|
@@ -109,6 +109,6 @@ Everything else is internal: `kerf-ui-analyze` reports private or unknown `.kui-
|
|
|
109
109
|
|
|
110
110
|
## Related
|
|
111
111
|
|
|
112
|
-
- Components: [TabBarItem](./tabs.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./wa-button.md), [SegmentedControl](./segmented-control.md), [Select](./select.md), [Tab Group](./wa-tab-group.md).
|
|
112
|
+
- Components: [TabBarItem](./tabs.md), [ToolbarControlGroup](./toolbar-control-group.md), [Button](./button.md), [Button](./wa-button.md), [SegmentedControl](./segmented-control.md), [Select](./select.md), [Tab Group](./wa-tab-group.md).
|
|
113
113
|
- Docs: [`docs/component-selection.md`](../../docs/component-selection.md), [`docs/accessibility.md#tabs`](../../docs/accessibility.md#tabs).
|
|
114
114
|
- UX catalog route: `?component=tab-bar`.
|
|
@@ -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,
|
|
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
|
package/ai/components/toolbar.md
CHANGED
|
@@ -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.
|
|
3
|
+
Generated from emitted declarations for `@kerfjs/ui@5.0.0-beta.109` and `kerfjs@5.0.0-beta.109`. 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
|
-
/**
|
|
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
|
```
|
|
@@ -1444,12 +1461,12 @@ interface TabBarProps {
|
|
|
1444
1461
|
label: string;
|
|
1445
1462
|
children: KerfUiContent;
|
|
1446
1463
|
leading?: KerfUiContent;
|
|
1447
|
-
/** Tab-local action:
|
|
1464
|
+
/** Tab-local action: one ToolbarControlGroup, Kerf Button, or Web Awesome button. */
|
|
1448
1465
|
trailing?: KerfUiContent;
|
|
1449
1466
|
/**
|
|
1450
1467
|
* Action pinned to the far edge of the bar. Combine with an adjacent `trailing`
|
|
1451
1468
|
* action when the tab-local and workspace-level actions must remain distinct.
|
|
1452
|
-
* Accepts
|
|
1469
|
+
* Accepts one ToolbarControlGroup, Kerf Button, or Web Awesome button.
|
|
1453
1470
|
*/
|
|
1454
1471
|
end?: KerfUiContent;
|
|
1455
1472
|
className?: string;
|
|
@@ -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
|
|
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
|