@kerfjs/ui 5.0.0-beta.7 → 5.0.0-beta.9
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/README.md +20 -20
- package/ai/component-catalog.json +130 -83
- package/ai/public-api-signatures-v1.md +200 -29
- package/ai/skill.md +12 -12
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/list-action-row.js +4 -0
- package/dist/browser/{menu-header.js → list-header.js} +2 -2
- package/dist/browser/{menu-item.js → list-item.js} +2 -2
- package/dist/catalog.d.ts +119 -0
- package/dist/catalog.js +128 -0
- package/dist/catalog.js.map +1 -0
- package/dist/{chunk-TZNCCM5H.js → chunk-2TS7ZSYX.js} +4 -4
- package/dist/chunk-2TS7ZSYX.js.map +1 -0
- package/dist/{chunk-PONXLV5U.js → chunk-37T3VNIZ.js} +1 -1
- package/dist/{chunk-PONXLV5U.js.map → chunk-37T3VNIZ.js.map} +1 -1
- package/dist/{chunk-3YD6ZNRA.js → chunk-7JB7VPRI.js} +8 -8
- package/dist/{chunk-3YD6ZNRA.js.map → chunk-7JB7VPRI.js.map} +1 -1
- package/dist/{chunk-N3SUXLLS.js → chunk-BLK3UEEI.js} +2 -2
- package/dist/{chunk-N3SUXLLS.js.map → chunk-BLK3UEEI.js.map} +1 -1
- package/dist/{chunk-YKUUZPED.js → chunk-L4OKFDJY.js} +7 -7
- package/dist/{chunk-YKUUZPED.js.map → chunk-L4OKFDJY.js.map} +1 -1
- package/dist/{chunk-KJYXOTG3.js → chunk-RUNWEPR4.js} +3 -3
- package/dist/chunk-RUNWEPR4.js.map +1 -0
- package/dist/{chunk-H6URQGJI.js → chunk-W5EQ3HYQ.js} +11 -11
- package/dist/{chunk-H6URQGJI.js.map → chunk-W5EQ3HYQ.js.map} +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +11 -11
- package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +7 -7
- package/dist/list-action-row.js +5 -0
- package/dist/list-action-row.js.map +1 -0
- package/dist/{menu-header.d.ts → list-header.d.ts} +9 -9
- package/dist/list-header.js +7 -0
- package/dist/list-header.js.map +1 -0
- package/dist/{menu-item.d.ts → list-item.d.ts} +5 -5
- package/dist/list-item.js +5 -0
- package/dist/list-item.js.map +1 -0
- package/dist/nav-stack.js +1 -1
- package/dist/panel-header.d.ts +9 -1
- package/dist/panel-header.js +1 -1
- package/dist/split-view.d.ts +1 -1
- package/dist/split-view.js +1 -1
- package/dist/split-view.js.map +1 -1
- package/dist/styles/catalog.css +482 -0
- package/dist/styles/list-action-row.css +160 -0
- package/dist/styles/{menu-header.css → list-header.css} +33 -33
- package/dist/styles/list-item.css +123 -0
- package/dist/styles/styles.css +4 -3
- package/dist/toolbar-text.d.ts +10 -2
- package/dist/toolbar-text.js +1 -1
- package/dist/value-table.js +1 -1
- package/dist/wire-catalog.d.ts +26 -0
- package/dist/wire-catalog.js +50 -0
- package/dist/wire-catalog.js.map +1 -0
- package/docs/accessibility.md +15 -10
- package/docs/catalog.md +154 -0
- package/docs/component-contract.md +12 -12
- package/docs/component-selection.md +14 -13
- package/docs/design-philosophy.md +4 -4
- package/docs/layout.md +8 -8
- package/docs/recipes.md +17 -5
- package/docs/split-view.md +1 -1
- package/docs/ux-demo.md +5 -5
- package/llms.txt +12 -8
- package/package.json +25 -16
- package/ux-demo/recipes/app-shell.tsx +3 -3
- package/ux-demo/recipes/list-detail-dialog.tsx +45 -0
- package/ux-demo/recipes/loaders.ts +4 -2
- package/ux-demo/recipes/loading-inspector.tsx +79 -0
- package/ux-demo/recipes/navigation-sidebar.tsx +5 -5
- package/ux-demo/recipes/navigation-stack.tsx +4 -4
- package/ux-demo/recipes/recipes.css +13 -7
- package/dist/browser/menu-action-row.js +0 -4
- package/dist/chunk-KJYXOTG3.js.map +0 -1
- package/dist/chunk-TZNCCM5H.js.map +0 -1
- package/dist/menu-action-row.js +0 -5
- package/dist/menu-action-row.js.map +0 -1
- package/dist/menu-header.js +0 -7
- package/dist/menu-header.js.map +0 -1
- package/dist/menu-item.js +0 -5
- package/dist/menu-item.js.map +0 -1
- package/dist/styles/menu-action-row.css +0 -160
- package/dist/styles/menu-item.css +0 -123
- package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
package/README.md
CHANGED
|
@@ -23,9 +23,9 @@ npm install kerfjs @kerfjs/ui
|
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
```tsx
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
26
|
+
import { ListItem } from '@kerfjs/ui/list-item';
|
|
27
|
+
import { ListHeader } from '@kerfjs/ui/list-header';
|
|
28
|
+
import { ListActionRow } from '@kerfjs/ui/list-action-row';
|
|
29
29
|
import { Toolbar } from '@kerfjs/ui/toolbar';
|
|
30
30
|
import { ToolbarControlGroup } from '@kerfjs/ui/toolbar-control-group';
|
|
31
31
|
import { ToolbarText } from '@kerfjs/ui/toolbar-text';
|
|
@@ -33,7 +33,7 @@ import { ToolbarText } from '@kerfjs/ui/toolbar-text';
|
|
|
33
33
|
mount(root, () => <>
|
|
34
34
|
<Toolbar label="Document" leading={<ToolbarControlGroup appearance="borderless" single><ToolbarText text="Notes" /></ToolbarControlGroup>} />
|
|
35
35
|
<section>
|
|
36
|
-
<
|
|
36
|
+
<ListHeader
|
|
37
37
|
label="Workspace"
|
|
38
38
|
action="show-workspace-actions"
|
|
39
39
|
actionLabel="Workspace actions"
|
|
@@ -45,13 +45,13 @@ mount(root, () => <>
|
|
|
45
45
|
'aria-haspopup': 'dialog',
|
|
46
46
|
}}
|
|
47
47
|
/>
|
|
48
|
-
<
|
|
48
|
+
<ListItem
|
|
49
49
|
action="open-notes"
|
|
50
50
|
label="Notes"
|
|
51
51
|
selected
|
|
52
52
|
rootAttributes={{ 'data-command-color': 'blue', 'data-drop-status': 'ready' }}
|
|
53
53
|
/>
|
|
54
|
-
<
|
|
54
|
+
<ListActionRow
|
|
55
55
|
action="open-file"
|
|
56
56
|
itemId="src/main.ts"
|
|
57
57
|
label="src/main.ts"
|
|
@@ -66,17 +66,17 @@ mount(root, () => <>
|
|
|
66
66
|
|
|
67
67
|
Components return Kerf `SafeHtml`. They do not own application state or attach transient listeners. Actions are stable `data-action` hooks; the application wires them once with `delegate()` or `delegateActions()` and retains the disposer.
|
|
68
68
|
|
|
69
|
-
`
|
|
70
|
-
`
|
|
69
|
+
`ListItem.rootAttributes`, `ListHeader.rootAttributes`,
|
|
70
|
+
`ListActionRow.rootAttributes`, and `AppTab.rootAttributes` carry typed
|
|
71
71
|
application `data-*` metadata without
|
|
72
|
-
teaching the package domain fields. `
|
|
73
|
-
`
|
|
72
|
+
teaching the package domain fields. `ListHeader.triggerAttributes` and
|
|
73
|
+
`ListActionRow.trailingActionAttributes` additionally support native popover
|
|
74
74
|
target and relationship attributes. Roles and component-owned action, selection,
|
|
75
75
|
disclosure, naming, disabled, and icon semantics remain protected props; an
|
|
76
76
|
isolated `role="menuitem"` is not an extension shortcut.
|
|
77
77
|
The slots are also filtered at runtime, so structurally widened objects and
|
|
78
78
|
JavaScript callers cannot bypass those protections with case-variant names.
|
|
79
|
-
`
|
|
79
|
+
`ListItem.trailing` is dormant metadata. Use `ListActionRow` when a row needs
|
|
80
80
|
sibling primary and trailing native-button actions with independent names,
|
|
81
81
|
disabled states, focus, and click ownership. Its `label`, `icon`, and
|
|
82
82
|
`trailingActionIcon` slots are dormant content and must not contain controls.
|
|
@@ -99,9 +99,9 @@ as a `New` marker.
|
|
|
99
99
|
| `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
|
|
100
100
|
| `ToolbarControlGroup` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
|
|
101
101
|
| `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
102
|
+
| `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
|
|
103
|
+
| `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
|
|
104
|
+
| `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
|
|
105
105
|
| Pane, content, and navigation composition | — | `@kerfjs/ui/layout.css` |
|
|
106
106
|
| `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
|
|
107
107
|
| `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
|
|
@@ -135,14 +135,14 @@ scale of `.5` through `--kui-disclosure-icon-scale`. Author replacement
|
|
|
135
135
|
transform is applied. Direction changes take the shortest rotation path; a
|
|
136
136
|
180-degree closed-to-open tie uses counterclockwise rotation.
|
|
137
137
|
|
|
138
|
-
`
|
|
138
|
+
`ListHeader` supplies that production `DisclosureArrow` automatically when
|
|
139
139
|
`toggle` is true and `actionIcon` is omitted. Keep `expanded` synchronized with
|
|
140
140
|
real controlled content and preserve the button's stable label; ordinary
|
|
141
141
|
navigation must not display a disclosure arrow. A custom `actionIcon` remains
|
|
142
142
|
an escape hatch and replaces the default arrow entirely. The header fills its
|
|
143
143
|
available inline width, keeping a separate action at the logical end in a 44px
|
|
144
144
|
target. Its visible action glyph defaults to 18px through
|
|
145
|
-
`--kui-
|
|
145
|
+
`--kui-list-header-action-icon-size`.
|
|
146
146
|
|
|
147
147
|
## Machine-readable catalog
|
|
148
148
|
|
|
@@ -205,9 +205,9 @@ Add `.kui-content` to make its major children a vertical stack with 24px gaps.
|
|
|
205
205
|
<div class="kui-pane__toolbar"><Toolbar label="Workspace" ... /></div>
|
|
206
206
|
<nav class="kui-pane__content kui-content">
|
|
207
207
|
<section>
|
|
208
|
-
<
|
|
209
|
-
<
|
|
210
|
-
<
|
|
208
|
+
<ListHeader label="Workspace" count={3} countLabel="3 workspaces" />
|
|
209
|
+
<ListItem action="open" label="Inbox" icon={inboxIcon} />
|
|
210
|
+
<ListItem action="open" label="Drafts" />
|
|
211
211
|
</section>
|
|
212
212
|
<div class="kui-content-item">Workspace details</div>
|
|
213
213
|
</nav>
|
|
@@ -217,7 +217,7 @@ Add `.kui-content` to make its major children a vertical stack with 24px gaps.
|
|
|
217
217
|
Ordinary children use `.kui-content-item`: 8px inline margin, a real 1px border
|
|
218
218
|
(transparent by default), 8px padding, and 12px rounded corners. The pill
|
|
219
219
|
modifier uses a 22px radius. A component can expose a transparent border or
|
|
220
|
-
background without changing layout. `
|
|
220
|
+
background without changing layout. `ListHeader` follows the same rule while
|
|
221
221
|
keeping its dormant title and count-or-badge cluster separate from its optional
|
|
222
222
|
44px action.
|
|
223
223
|
|
|
@@ -488,7 +488,9 @@
|
|
|
488
488
|
"small",
|
|
489
489
|
"placeholder (loading)"
|
|
490
490
|
],
|
|
491
|
-
"accessibility": [
|
|
491
|
+
"accessibility": [
|
|
492
|
+
"Plain text is not a heading; pass headingLevel to expose role=heading + aria-level for a page/section title."
|
|
493
|
+
],
|
|
492
494
|
"delivery": {
|
|
493
495
|
"browserImport": "@kerfjs/ui/toolbar-text",
|
|
494
496
|
"manualCssImport": "@kerfjs/ui/toolbar-text.css",
|
|
@@ -614,11 +616,13 @@
|
|
|
614
616
|
"optional summary",
|
|
615
617
|
"icon",
|
|
616
618
|
"actions",
|
|
617
|
-
"placeholder (loading)"
|
|
619
|
+
"placeholder (loading)",
|
|
620
|
+
"page heading (headingLevel)"
|
|
618
621
|
],
|
|
619
622
|
"accessibility": [
|
|
620
623
|
"Connect the title id and any provided summary id to the dialog or panel host.",
|
|
621
|
-
"Pass the trailing actions as a labeled ToolbarControlGroup when the group needs an accessible name."
|
|
624
|
+
"Pass the trailing actions as a labeled ToolbarControlGroup when the group needs an accessible name.",
|
|
625
|
+
"For a page/view title pass headingLevel (usually 1) so the title exposes role=heading + aria-level as a heading landmark; omit it for a dialog title, which is referenced via aria-labelledby to titleId."
|
|
622
626
|
],
|
|
623
627
|
"delivery": {
|
|
624
628
|
"browserImport": "@kerfjs/ui/panel-header",
|
|
@@ -717,21 +721,21 @@
|
|
|
717
721
|
}
|
|
718
722
|
},
|
|
719
723
|
{
|
|
720
|
-
"id": "
|
|
721
|
-
"name": "
|
|
724
|
+
"id": "list",
|
|
725
|
+
"name": "List composition",
|
|
722
726
|
"category": "Navigation",
|
|
723
727
|
"kind": "composition",
|
|
724
728
|
"source": "kerf",
|
|
725
729
|
"description": "Navigation rows and section headers composed as ordinary content items inside a pane.",
|
|
726
730
|
"uses": [
|
|
727
|
-
"
|
|
728
|
-
"
|
|
729
|
-
"
|
|
731
|
+
"list-header",
|
|
732
|
+
"list-action-row",
|
|
733
|
+
"list-item"
|
|
730
734
|
],
|
|
731
|
-
"purpose": "Compose navigation with the same pane, content stack, item, and toolbar geometry used throughout the application, including a controlled
|
|
735
|
+
"purpose": "Compose navigation with the same pane, content stack, item, and toolbar geometry used throughout the application, including a controlled ListHeader disclosure only when it reveals real content.",
|
|
732
736
|
"publicExports": [],
|
|
733
737
|
"useWhen": [
|
|
734
|
-
"Compose navigation sections in a .kui-content stack, using
|
|
738
|
+
"Compose navigation sections in a .kui-content stack, using ListHeader, ListItem, and ListActionRow children plus optional .kui-content-item surfaces."
|
|
735
739
|
],
|
|
736
740
|
"avoidWhen": [
|
|
737
741
|
"Do not add sidebar-specific wrapper padding or use the pattern for unrelated inline controls.",
|
|
@@ -751,8 +755,8 @@
|
|
|
751
755
|
"pane toolbar or footer"
|
|
752
756
|
],
|
|
753
757
|
"accessibility": [
|
|
754
|
-
"Use native links for link navigation, retain
|
|
755
|
-
"A
|
|
758
|
+
"Use native links for link navigation, retain ListItem button semantics for actions, and keep standalone header and toolbar actions at least 44px square.",
|
|
759
|
+
"A ListHeader disclosure controls real content, keeps a stable accessible name and aria-expanded state, and uses the production DisclosureArrow visual."
|
|
756
760
|
],
|
|
757
761
|
"delivery": {
|
|
758
762
|
"manualCssImport": "@kerfjs/ui/layout.css",
|
|
@@ -773,14 +777,14 @@
|
|
|
773
777
|
"--kui-layout-rounded-radius"
|
|
774
778
|
],
|
|
775
779
|
"links": {
|
|
776
|
-
"catalogRoute": "?component=
|
|
780
|
+
"catalogRoute": "?component=list",
|
|
777
781
|
"documentation": "docs/component-selection.md",
|
|
778
782
|
"recipe": "docs/component-selection.md#correct-composition-and-duplicated-markup-trap"
|
|
779
783
|
}
|
|
780
784
|
},
|
|
781
785
|
{
|
|
782
|
-
"id": "
|
|
783
|
-
"name": "
|
|
786
|
+
"id": "list-header",
|
|
787
|
+
"name": "ListHeader",
|
|
784
788
|
"category": "Navigation",
|
|
785
789
|
"kind": "component",
|
|
786
790
|
"source": "kerf",
|
|
@@ -791,7 +795,7 @@
|
|
|
791
795
|
],
|
|
792
796
|
"purpose": "Fill the available section width while splitting a dormant title and mutually exclusive semantic count or legacy badge from an optional logical-end 44px action with an 18px visual, or render that title cluster as a disclosure button with a default production DisclosureArrow.",
|
|
793
797
|
"publicExports": [
|
|
794
|
-
"
|
|
798
|
+
"ListHeader"
|
|
795
799
|
],
|
|
796
800
|
"useWhen": [
|
|
797
801
|
"Label a navigation section with an optional semantic count, non-count badge, action, or disclosure state; toggle mode supplies an 18px DisclosureArrow unless actionIcon replaces it."
|
|
@@ -828,22 +832,22 @@
|
|
|
828
832
|
"The application controls and updates disclosure state and the revealed content; the default DisclosureArrow mirrors expanded while the button name stays stable. triggerAttributes can describe the controlled relationship but cannot replace the owned accessible name or expanded state."
|
|
829
833
|
],
|
|
830
834
|
"delivery": {
|
|
831
|
-
"browserImport": "@kerfjs/ui/
|
|
832
|
-
"manualCssImport": "@kerfjs/ui/
|
|
835
|
+
"browserImport": "@kerfjs/ui/list-header",
|
|
836
|
+
"manualCssImport": "@kerfjs/ui/list-header.css",
|
|
833
837
|
"sideEffects": [
|
|
834
838
|
"browser-condition-css"
|
|
835
839
|
]
|
|
836
840
|
},
|
|
837
841
|
"wiring": [],
|
|
838
842
|
"publicClasses": [
|
|
839
|
-
"kui-
|
|
840
|
-
"kui-
|
|
841
|
-
"kui-
|
|
842
|
-
"kui-
|
|
843
|
-
"kui-
|
|
844
|
-
"kui-
|
|
845
|
-
"kui-
|
|
846
|
-
"kui-
|
|
843
|
+
"kui-list-header",
|
|
844
|
+
"kui-list-header__action",
|
|
845
|
+
"kui-list-header__action-layer",
|
|
846
|
+
"kui-list-header__badge",
|
|
847
|
+
"kui-list-header__count",
|
|
848
|
+
"kui-list-header__label",
|
|
849
|
+
"kui-list-header__title",
|
|
850
|
+
"kui-list-header__toggle"
|
|
847
851
|
],
|
|
848
852
|
"publicTokens": [
|
|
849
853
|
"--kui-color-neutral-border-quiet",
|
|
@@ -851,24 +855,24 @@
|
|
|
851
855
|
"--kui-color-neutral-on-quiet",
|
|
852
856
|
"--kui-focus-ring",
|
|
853
857
|
"--kui-font-xs",
|
|
854
|
-
"--kui-
|
|
855
|
-
"--kui-
|
|
858
|
+
"--kui-list-header-action-icon-size",
|
|
859
|
+
"--kui-list-header-color",
|
|
856
860
|
"--kui-layout-inline-margin",
|
|
857
861
|
"--kui-layout-item-gap",
|
|
858
862
|
"--kui-layout-item-padding",
|
|
859
863
|
"--kui-layout-pill-radius",
|
|
860
|
-
"--kui-
|
|
861
|
-
"--kui-
|
|
864
|
+
"--kui-list-header-count-font-size",
|
|
865
|
+
"--kui-list-header-hover-background"
|
|
862
866
|
],
|
|
863
867
|
"links": {
|
|
864
|
-
"catalogRoute": "?component=
|
|
868
|
+
"catalogRoute": "?component=list-header",
|
|
865
869
|
"documentation": "docs/component-selection.md",
|
|
866
870
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
867
871
|
}
|
|
868
872
|
},
|
|
869
873
|
{
|
|
870
|
-
"id": "
|
|
871
|
-
"name": "
|
|
874
|
+
"id": "list-action-row",
|
|
875
|
+
"name": "ListActionRow",
|
|
872
876
|
"category": "Navigation",
|
|
873
877
|
"kind": "component",
|
|
874
878
|
"source": "kerf",
|
|
@@ -878,17 +882,17 @@
|
|
|
878
882
|
],
|
|
879
883
|
"purpose": "Keep a selectable primary row action and an independently named trailing action as sibling native controls inside one noninteractive visual row.",
|
|
880
884
|
"publicExports": [
|
|
881
|
-
"
|
|
885
|
+
"ListActionRow"
|
|
882
886
|
],
|
|
883
887
|
"useWhen": [
|
|
884
888
|
"A navigation or item row needs both a primary selectable action and an independently focusable trailing action."
|
|
885
889
|
],
|
|
886
890
|
"avoidWhen": [
|
|
887
|
-
"Use
|
|
891
|
+
"Use ListItem when trailing content is dormant metadata; use AppTab only for tablist semantics and ToolbarControlGroup only for toolbar controls."
|
|
888
892
|
],
|
|
889
893
|
"alternatives": [
|
|
890
894
|
{
|
|
891
|
-
"id": "
|
|
895
|
+
"id": "list-item",
|
|
892
896
|
"relationship": "nearest",
|
|
893
897
|
"when": "Trailing content is noninteractive."
|
|
894
898
|
},
|
|
@@ -915,22 +919,22 @@
|
|
|
915
919
|
],
|
|
916
920
|
"accessibility": [
|
|
917
921
|
"The noninteractive root contains two sibling native buttons in primary-then-trailing focus order; each button has its own action, item identity, accessible name, and disabled state.",
|
|
918
|
-
"Selection semantics are exposed only by the primary button; label, icon, and trailingActionIcon are dormant SafeHtml and must not contain interactive descendants; never place an interactive descendant in
|
|
922
|
+
"Selection semantics are exposed only by the primary button; label, icon, and trailingActionIcon are dormant SafeHtml and must not contain interactive descendants; never place an interactive descendant in ListItem.trailing."
|
|
919
923
|
],
|
|
920
924
|
"delivery": {
|
|
921
|
-
"browserImport": "@kerfjs/ui/
|
|
922
|
-
"manualCssImport": "@kerfjs/ui/
|
|
925
|
+
"browserImport": "@kerfjs/ui/list-action-row",
|
|
926
|
+
"manualCssImport": "@kerfjs/ui/list-action-row.css",
|
|
923
927
|
"sideEffects": [
|
|
924
928
|
"browser-condition-css"
|
|
925
929
|
]
|
|
926
930
|
},
|
|
927
931
|
"wiring": [],
|
|
928
932
|
"publicClasses": [
|
|
929
|
-
"kui-
|
|
930
|
-
"kui-
|
|
931
|
-
"kui-
|
|
932
|
-
"kui-
|
|
933
|
-
"kui-
|
|
933
|
+
"kui-list-action-row",
|
|
934
|
+
"kui-list-action-row__icon",
|
|
935
|
+
"kui-list-action-row__label",
|
|
936
|
+
"kui-list-action-row__primary",
|
|
937
|
+
"kui-list-action-row__trailing-action"
|
|
934
938
|
],
|
|
935
939
|
"publicTokens": [
|
|
936
940
|
"--kui-color-brand-border-quiet",
|
|
@@ -946,25 +950,25 @@
|
|
|
946
950
|
"--kui-layout-item-padding",
|
|
947
951
|
"--kui-layout-rounded-radius",
|
|
948
952
|
"--kui-radius-pill",
|
|
949
|
-
"--kui-
|
|
950
|
-
"--kui-
|
|
951
|
-
"--kui-
|
|
952
|
-
"--kui-
|
|
953
|
-
"--kui-
|
|
954
|
-
"--kui-
|
|
955
|
-
"--kui-
|
|
956
|
-
"--kui-
|
|
957
|
-
"--kui-
|
|
953
|
+
"--kui-list-action-row-background",
|
|
954
|
+
"--kui-list-action-row-border",
|
|
955
|
+
"--kui-list-action-row-color",
|
|
956
|
+
"--kui-list-action-row-hover-background",
|
|
957
|
+
"--kui-list-action-row-hover-border",
|
|
958
|
+
"--kui-list-action-row-selected-background",
|
|
959
|
+
"--kui-list-action-row-selected-border",
|
|
960
|
+
"--kui-list-action-row-selected-color",
|
|
961
|
+
"--kui-list-action-row-trailing-hover-background"
|
|
958
962
|
],
|
|
959
963
|
"links": {
|
|
960
|
-
"catalogRoute": "?component=
|
|
964
|
+
"catalogRoute": "?component=list-action-row",
|
|
961
965
|
"documentation": "docs/component-selection.md",
|
|
962
966
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
963
967
|
}
|
|
964
968
|
},
|
|
965
969
|
{
|
|
966
|
-
"id": "
|
|
967
|
-
"name": "
|
|
970
|
+
"id": "list-item",
|
|
971
|
+
"name": "ListItem",
|
|
968
972
|
"category": "Navigation",
|
|
969
973
|
"kind": "component",
|
|
970
974
|
"source": "kerf",
|
|
@@ -974,17 +978,17 @@
|
|
|
974
978
|
],
|
|
975
979
|
"purpose": "Selectable, disabled, trailing, and multiline navigation rows.",
|
|
976
980
|
"publicExports": [
|
|
977
|
-
"
|
|
981
|
+
"ListItem"
|
|
978
982
|
],
|
|
979
983
|
"useWhen": [
|
|
980
984
|
"Render a selectable, disabled, trailing, or multiline sidebar/navigation action row."
|
|
981
985
|
],
|
|
982
986
|
"avoidWhen": [
|
|
983
|
-
"Do not use for an ordinary inline link, form button, isolated ARIA menuitem, or an interactive trailing action; use
|
|
987
|
+
"Do not use for an ordinary inline link, form button, isolated ARIA menuitem, or an interactive trailing action; use ListActionRow for sibling row actions."
|
|
984
988
|
],
|
|
985
989
|
"alternatives": [
|
|
986
990
|
{
|
|
987
|
-
"id": "
|
|
991
|
+
"id": "list-action-row",
|
|
988
992
|
"relationship": "nearest",
|
|
989
993
|
"when": "The trailing region must be independently interactive."
|
|
990
994
|
}
|
|
@@ -1008,18 +1012,18 @@
|
|
|
1008
1012
|
"Uses native button activation; selected maps to aria-current and pressed to aria-pressed; rootAttributes cannot add role=menuitem or replace owned ARIA; trailing is dormant content and must not contain controls."
|
|
1009
1013
|
],
|
|
1010
1014
|
"delivery": {
|
|
1011
|
-
"browserImport": "@kerfjs/ui/
|
|
1012
|
-
"manualCssImport": "@kerfjs/ui/
|
|
1015
|
+
"browserImport": "@kerfjs/ui/list-item",
|
|
1016
|
+
"manualCssImport": "@kerfjs/ui/list-item.css",
|
|
1013
1017
|
"sideEffects": [
|
|
1014
1018
|
"browser-condition-css"
|
|
1015
1019
|
]
|
|
1016
1020
|
},
|
|
1017
1021
|
"wiring": [],
|
|
1018
1022
|
"publicClasses": [
|
|
1019
|
-
"kui-
|
|
1020
|
-
"kui-
|
|
1021
|
-
"kui-
|
|
1022
|
-
"kui-
|
|
1023
|
+
"kui-list-item",
|
|
1024
|
+
"kui-list-item__icon",
|
|
1025
|
+
"kui-list-item__label",
|
|
1026
|
+
"kui-list-item__trailing"
|
|
1023
1027
|
],
|
|
1024
1028
|
"publicTokens": [
|
|
1025
1029
|
"--kui-color-brand-fill-normal",
|
|
@@ -1028,17 +1032,17 @@
|
|
|
1028
1032
|
"--kui-color-neutral-on-normal",
|
|
1029
1033
|
"--kui-color-neutral-on-quiet",
|
|
1030
1034
|
"--kui-focus-ring",
|
|
1031
|
-
"--kui-
|
|
1032
|
-
"--kui-
|
|
1033
|
-
"--kui-
|
|
1034
|
-
"--kui-
|
|
1035
|
+
"--kui-list-item-color",
|
|
1036
|
+
"--kui-list-item-hover-background",
|
|
1037
|
+
"--kui-list-item-selected-background",
|
|
1038
|
+
"--kui-list-item-selected-color",
|
|
1035
1039
|
"--kui-layout-inline-margin",
|
|
1036
1040
|
"--kui-layout-item-gap",
|
|
1037
1041
|
"--kui-layout-item-padding",
|
|
1038
1042
|
"--kui-layout-rounded-radius"
|
|
1039
1043
|
],
|
|
1040
1044
|
"links": {
|
|
1041
|
-
"catalogRoute": "?component=
|
|
1045
|
+
"catalogRoute": "?component=list-item",
|
|
1042
1046
|
"documentation": "docs/component-selection.md",
|
|
1043
1047
|
"recipe": "docs/component-selection.md#problem-to-component-matrix"
|
|
1044
1048
|
}
|
|
@@ -4358,8 +4362,8 @@
|
|
|
4358
4362
|
"toolbar",
|
|
4359
4363
|
"toolbar-text",
|
|
4360
4364
|
"toolbar-control-group",
|
|
4361
|
-
"
|
|
4362
|
-
"
|
|
4365
|
+
"list-header",
|
|
4366
|
+
"list-item",
|
|
4363
4367
|
"panel-header",
|
|
4364
4368
|
"resize",
|
|
4365
4369
|
"value-table",
|
|
@@ -4399,8 +4403,8 @@
|
|
|
4399
4403
|
"source": "kerf",
|
|
4400
4404
|
"purpose": "Navigation sections with icon and iconless rows, a content-item surface, disclosure, and pane footer actions.",
|
|
4401
4405
|
"uses": [
|
|
4402
|
-
"
|
|
4403
|
-
"
|
|
4406
|
+
"list-header",
|
|
4407
|
+
"list-item",
|
|
4404
4408
|
"toolbar",
|
|
4405
4409
|
"toolbar-control-group"
|
|
4406
4410
|
],
|
|
@@ -4469,16 +4473,16 @@
|
|
|
4469
4473
|
}
|
|
4470
4474
|
},
|
|
4471
4475
|
{
|
|
4472
|
-
"id": "recipe-
|
|
4473
|
-
"name": "
|
|
4476
|
+
"id": "recipe-list-detail-dialog",
|
|
4477
|
+
"name": "List-detail dialog",
|
|
4474
4478
|
"category": "Recipes",
|
|
4475
4479
|
"kind": "recipe",
|
|
4476
4480
|
"source": "kerf",
|
|
4477
4481
|
"purpose": "Production modal containing a PanelHeader, navigable record master list, and ValueTable detail.",
|
|
4478
4482
|
"uses": [
|
|
4479
4483
|
"panel-header",
|
|
4480
|
-
"
|
|
4481
|
-
"
|
|
4484
|
+
"list-header",
|
|
4485
|
+
"list-item",
|
|
4482
4486
|
"value-table",
|
|
4483
4487
|
"wa-dialog",
|
|
4484
4488
|
"wa-button"
|
|
@@ -4505,9 +4509,9 @@
|
|
|
4505
4509
|
]
|
|
4506
4510
|
},
|
|
4507
4511
|
"links": {
|
|
4508
|
-
"catalogRoute": "?component=recipe-
|
|
4509
|
-
"documentation": "docs/recipes.md#
|
|
4510
|
-
"recipe": "docs/recipes.md#
|
|
4512
|
+
"catalogRoute": "?component=recipe-list-detail-dialog",
|
|
4513
|
+
"documentation": "docs/recipes.md#list-detail-dialog",
|
|
4514
|
+
"recipe": "docs/recipes.md#list-detail-dialog"
|
|
4511
4515
|
}
|
|
4512
4516
|
},
|
|
4513
4517
|
{
|
|
@@ -4643,8 +4647,8 @@
|
|
|
4643
4647
|
"source": "kerf",
|
|
4644
4648
|
"purpose": "A push/pop navigation stack drill-down with animated slides and a live device class.",
|
|
4645
4649
|
"uses": [
|
|
4646
|
-
"
|
|
4647
|
-
"
|
|
4650
|
+
"list-header",
|
|
4651
|
+
"list-item",
|
|
4648
4652
|
"lucide-icon",
|
|
4649
4653
|
"layout"
|
|
4650
4654
|
],
|
|
@@ -4673,6 +4677,49 @@
|
|
|
4673
4677
|
"documentation": "docs/recipes.md#navigation-stack",
|
|
4674
4678
|
"recipe": "docs/recipes.md#navigation-stack"
|
|
4675
4679
|
}
|
|
4680
|
+
},
|
|
4681
|
+
{
|
|
4682
|
+
"id": "recipe-loading-inspector",
|
|
4683
|
+
"name": "Loading inspector",
|
|
4684
|
+
"category": "Recipes",
|
|
4685
|
+
"kind": "recipe",
|
|
4686
|
+
"source": "kerf",
|
|
4687
|
+
"purpose": "A record inspector whose per-record values load asynchronously \u2014 every value-bearing component takes a shared placeholder flag, so the same chrome renders a faithful loading state and then the populated record.",
|
|
4688
|
+
"uses": [
|
|
4689
|
+
"panel-header",
|
|
4690
|
+
"value-table",
|
|
4691
|
+
"select",
|
|
4692
|
+
"segmented-control",
|
|
4693
|
+
"list-item",
|
|
4694
|
+
"state-banner",
|
|
4695
|
+
"skeleton",
|
|
4696
|
+
"lucide-icon"
|
|
4697
|
+
],
|
|
4698
|
+
"useWhen": [
|
|
4699
|
+
"A detail or inspector view must render its real chrome while its per-record values are still loading, then swap to the populated record without duplicating markup."
|
|
4700
|
+
],
|
|
4701
|
+
"avoidWhen": [
|
|
4702
|
+
"Do not hand-build a separate empty-state layout, and do not use it for known progress \u2014 use LoadingSpinner for that."
|
|
4703
|
+
],
|
|
4704
|
+
"appOwns": [
|
|
4705
|
+
"loading lifecycle",
|
|
4706
|
+
"which values are unknown",
|
|
4707
|
+
"fetching, transport, and domain data"
|
|
4708
|
+
],
|
|
4709
|
+
"accessibility": [
|
|
4710
|
+
"Each component marks itself aria-busy and disables its own controls while loading; the composition keeps labels and structure stable across the transition."
|
|
4711
|
+
],
|
|
4712
|
+
"delivery": {
|
|
4713
|
+
"sideEffects": [
|
|
4714
|
+
"lazy-recipe-css",
|
|
4715
|
+
"individual-custom-element-registration"
|
|
4716
|
+
]
|
|
4717
|
+
},
|
|
4718
|
+
"links": {
|
|
4719
|
+
"catalogRoute": "?component=recipe-loading-inspector",
|
|
4720
|
+
"documentation": "docs/recipes.md#loading-inspector",
|
|
4721
|
+
"recipe": "docs/recipes.md#loading-inspector"
|
|
4722
|
+
}
|
|
4676
4723
|
}
|
|
4677
4724
|
]
|
|
4678
4725
|
}
|