@kerfjs/ui 5.0.0-beta.8 → 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.
Files changed (72) hide show
  1. package/README.md +20 -20
  2. package/ai/component-catalog.json +123 -80
  3. package/ai/public-api-signatures-v1.md +181 -26
  4. package/ai/skill.md +12 -12
  5. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  6. package/dist/browser/list-action-row.js +4 -0
  7. package/dist/browser/{menu-header.js → list-header.js} +2 -2
  8. package/dist/browser/{menu-item.js → list-item.js} +2 -2
  9. package/dist/catalog.d.ts +119 -0
  10. package/dist/catalog.js +128 -0
  11. package/dist/catalog.js.map +1 -0
  12. package/dist/{chunk-BNQ2YDV4.js → chunk-2TS7ZSYX.js} +2 -2
  13. package/dist/{chunk-BNQ2YDV4.js.map → chunk-2TS7ZSYX.js.map} +1 -1
  14. package/dist/{chunk-PONXLV5U.js → chunk-37T3VNIZ.js} +1 -1
  15. package/dist/{chunk-PONXLV5U.js.map → chunk-37T3VNIZ.js.map} +1 -1
  16. package/dist/{chunk-3YD6ZNRA.js → chunk-7JB7VPRI.js} +8 -8
  17. package/dist/{chunk-3YD6ZNRA.js.map → chunk-7JB7VPRI.js.map} +1 -1
  18. package/dist/{chunk-YKUUZPED.js → chunk-L4OKFDJY.js} +7 -7
  19. package/dist/{chunk-YKUUZPED.js.map → chunk-L4OKFDJY.js.map} +1 -1
  20. package/dist/{chunk-H6URQGJI.js → chunk-W5EQ3HYQ.js} +11 -11
  21. package/dist/{chunk-H6URQGJI.js.map → chunk-W5EQ3HYQ.js.map} +1 -1
  22. package/dist/index.d.ts +3 -3
  23. package/dist/index.js +10 -10
  24. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +7 -7
  25. package/dist/list-action-row.js +5 -0
  26. package/dist/list-action-row.js.map +1 -0
  27. package/dist/{menu-header.d.ts → list-header.d.ts} +9 -9
  28. package/dist/list-header.js +7 -0
  29. package/dist/list-header.js.map +1 -0
  30. package/dist/{menu-item.d.ts → list-item.d.ts} +5 -5
  31. package/dist/list-item.js +5 -0
  32. package/dist/list-item.js.map +1 -0
  33. package/dist/panel-header.js +1 -1
  34. package/dist/split-view.d.ts +1 -1
  35. package/dist/split-view.js.map +1 -1
  36. package/dist/styles/catalog.css +482 -0
  37. package/dist/styles/list-action-row.css +160 -0
  38. package/dist/styles/{menu-header.css → list-header.css} +33 -33
  39. package/dist/styles/list-item.css +123 -0
  40. package/dist/styles/styles.css +4 -3
  41. package/dist/value-table.js +1 -1
  42. package/dist/wire-catalog.d.ts +26 -0
  43. package/dist/wire-catalog.js +50 -0
  44. package/dist/wire-catalog.js.map +1 -0
  45. package/docs/accessibility.md +5 -5
  46. package/docs/catalog.md +154 -0
  47. package/docs/component-contract.md +12 -12
  48. package/docs/component-selection.md +12 -11
  49. package/docs/design-philosophy.md +4 -4
  50. package/docs/layout.md +8 -8
  51. package/docs/recipes.md +17 -5
  52. package/docs/split-view.md +1 -1
  53. package/docs/ux-demo.md +5 -5
  54. package/llms.txt +12 -8
  55. package/package.json +25 -16
  56. package/ux-demo/recipes/app-shell.tsx +3 -3
  57. package/ux-demo/recipes/list-detail-dialog.tsx +45 -0
  58. package/ux-demo/recipes/loaders.ts +4 -2
  59. package/ux-demo/recipes/loading-inspector.tsx +79 -0
  60. package/ux-demo/recipes/navigation-sidebar.tsx +5 -5
  61. package/ux-demo/recipes/navigation-stack.tsx +4 -4
  62. package/ux-demo/recipes/recipes.css +13 -7
  63. package/dist/browser/menu-action-row.js +0 -4
  64. package/dist/menu-action-row.js +0 -5
  65. package/dist/menu-action-row.js.map +0 -1
  66. package/dist/menu-header.js +0 -7
  67. package/dist/menu-header.js.map +0 -1
  68. package/dist/menu-item.js +0 -5
  69. package/dist/menu-item.js.map +0 -1
  70. package/dist/styles/menu-action-row.css +0 -160
  71. package/dist/styles/menu-item.css +0 -123
  72. 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 { MenuItem } from '@kerfjs/ui/menu-item';
27
- import { MenuHeader } from '@kerfjs/ui/menu-header';
28
- import { MenuActionRow } from '@kerfjs/ui/menu-action-row';
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
- <MenuHeader
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
- <MenuItem
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
- <MenuActionRow
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
- `MenuItem.rootAttributes`, `MenuHeader.rootAttributes`,
70
- `MenuActionRow.rootAttributes`, and `AppTab.rootAttributes` carry typed
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. `MenuHeader.triggerAttributes` and
73
- `MenuActionRow.trailingActionAttributes` additionally support native popover
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
- `MenuItem.trailing` is dormant metadata. Use `MenuActionRow` when a row needs
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
- | `MenuActionRow` | `@kerfjs/ui/menu-action-row` | `@kerfjs/ui/menu-action-row.css` |
103
- | `MenuItem` | `@kerfjs/ui/menu-item` | `@kerfjs/ui/menu-item.css` |
104
- | `MenuHeader` | `@kerfjs/ui/menu-header` | `@kerfjs/ui/menu-header.css` |
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
- `MenuHeader` supplies that production `DisclosureArrow` automatically when
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-menu-header-action-icon-size`.
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
- <MenuHeader label="Workspace" count={3} countLabel="3 workspaces" />
209
- <MenuItem action="open" label="Inbox" icon={inboxIcon} />
210
- <MenuItem action="open" label="Drafts" />
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. `MenuHeader` follows the same rule while
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
 
@@ -721,21 +721,21 @@
721
721
  }
722
722
  },
723
723
  {
724
- "id": "menu",
725
- "name": "Menu composition",
724
+ "id": "list",
725
+ "name": "List composition",
726
726
  "category": "Navigation",
727
727
  "kind": "composition",
728
728
  "source": "kerf",
729
729
  "description": "Navigation rows and section headers composed as ordinary content items inside a pane.",
730
730
  "uses": [
731
- "menu-header",
732
- "menu-action-row",
733
- "menu-item"
731
+ "list-header",
732
+ "list-action-row",
733
+ "list-item"
734
734
  ],
735
- "purpose": "Compose navigation with the same pane, content stack, item, and toolbar geometry used throughout the application, including a controlled MenuHeader disclosure only when it reveals real content.",
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.",
736
736
  "publicExports": [],
737
737
  "useWhen": [
738
- "Compose navigation sections in a .kui-content stack, using MenuHeader, MenuItem, and MenuActionRow children plus optional .kui-content-item surfaces."
738
+ "Compose navigation sections in a .kui-content stack, using ListHeader, ListItem, and ListActionRow children plus optional .kui-content-item surfaces."
739
739
  ],
740
740
  "avoidWhen": [
741
741
  "Do not add sidebar-specific wrapper padding or use the pattern for unrelated inline controls.",
@@ -755,8 +755,8 @@
755
755
  "pane toolbar or footer"
756
756
  ],
757
757
  "accessibility": [
758
- "Use native links for link navigation, retain MenuItem button semantics for actions, and keep standalone header and toolbar actions at least 44px square.",
759
- "A MenuHeader disclosure controls real content, keeps a stable accessible name and aria-expanded state, and uses the production DisclosureArrow visual."
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."
760
760
  ],
761
761
  "delivery": {
762
762
  "manualCssImport": "@kerfjs/ui/layout.css",
@@ -777,14 +777,14 @@
777
777
  "--kui-layout-rounded-radius"
778
778
  ],
779
779
  "links": {
780
- "catalogRoute": "?component=menu",
780
+ "catalogRoute": "?component=list",
781
781
  "documentation": "docs/component-selection.md",
782
782
  "recipe": "docs/component-selection.md#correct-composition-and-duplicated-markup-trap"
783
783
  }
784
784
  },
785
785
  {
786
- "id": "menu-header",
787
- "name": "MenuHeader",
786
+ "id": "list-header",
787
+ "name": "ListHeader",
788
788
  "category": "Navigation",
789
789
  "kind": "component",
790
790
  "source": "kerf",
@@ -795,7 +795,7 @@
795
795
  ],
796
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.",
797
797
  "publicExports": [
798
- "MenuHeader"
798
+ "ListHeader"
799
799
  ],
800
800
  "useWhen": [
801
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."
@@ -832,22 +832,22 @@
832
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."
833
833
  ],
834
834
  "delivery": {
835
- "browserImport": "@kerfjs/ui/menu-header",
836
- "manualCssImport": "@kerfjs/ui/menu-header.css",
835
+ "browserImport": "@kerfjs/ui/list-header",
836
+ "manualCssImport": "@kerfjs/ui/list-header.css",
837
837
  "sideEffects": [
838
838
  "browser-condition-css"
839
839
  ]
840
840
  },
841
841
  "wiring": [],
842
842
  "publicClasses": [
843
- "kui-menu-header",
844
- "kui-menu-header__action",
845
- "kui-menu-header__action-layer",
846
- "kui-menu-header__badge",
847
- "kui-menu-header__count",
848
- "kui-menu-header__label",
849
- "kui-menu-header__title",
850
- "kui-menu-header__toggle"
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"
851
851
  ],
852
852
  "publicTokens": [
853
853
  "--kui-color-neutral-border-quiet",
@@ -855,24 +855,24 @@
855
855
  "--kui-color-neutral-on-quiet",
856
856
  "--kui-focus-ring",
857
857
  "--kui-font-xs",
858
- "--kui-menu-header-action-icon-size",
859
- "--kui-menu-header-color",
858
+ "--kui-list-header-action-icon-size",
859
+ "--kui-list-header-color",
860
860
  "--kui-layout-inline-margin",
861
861
  "--kui-layout-item-gap",
862
862
  "--kui-layout-item-padding",
863
863
  "--kui-layout-pill-radius",
864
- "--kui-menu-header-count-font-size",
865
- "--kui-menu-header-hover-background"
864
+ "--kui-list-header-count-font-size",
865
+ "--kui-list-header-hover-background"
866
866
  ],
867
867
  "links": {
868
- "catalogRoute": "?component=menu-header",
868
+ "catalogRoute": "?component=list-header",
869
869
  "documentation": "docs/component-selection.md",
870
870
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
871
871
  }
872
872
  },
873
873
  {
874
- "id": "menu-action-row",
875
- "name": "MenuActionRow",
874
+ "id": "list-action-row",
875
+ "name": "ListActionRow",
876
876
  "category": "Navigation",
877
877
  "kind": "component",
878
878
  "source": "kerf",
@@ -882,17 +882,17 @@
882
882
  ],
883
883
  "purpose": "Keep a selectable primary row action and an independently named trailing action as sibling native controls inside one noninteractive visual row.",
884
884
  "publicExports": [
885
- "MenuActionRow"
885
+ "ListActionRow"
886
886
  ],
887
887
  "useWhen": [
888
888
  "A navigation or item row needs both a primary selectable action and an independently focusable trailing action."
889
889
  ],
890
890
  "avoidWhen": [
891
- "Use MenuItem when trailing content is dormant metadata; use AppTab only for tablist semantics and ToolbarControlGroup only for toolbar controls."
891
+ "Use ListItem when trailing content is dormant metadata; use AppTab only for tablist semantics and ToolbarControlGroup only for toolbar controls."
892
892
  ],
893
893
  "alternatives": [
894
894
  {
895
- "id": "menu-item",
895
+ "id": "list-item",
896
896
  "relationship": "nearest",
897
897
  "when": "Trailing content is noninteractive."
898
898
  },
@@ -919,22 +919,22 @@
919
919
  ],
920
920
  "accessibility": [
921
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.",
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 MenuItem.trailing."
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."
923
923
  ],
924
924
  "delivery": {
925
- "browserImport": "@kerfjs/ui/menu-action-row",
926
- "manualCssImport": "@kerfjs/ui/menu-action-row.css",
925
+ "browserImport": "@kerfjs/ui/list-action-row",
926
+ "manualCssImport": "@kerfjs/ui/list-action-row.css",
927
927
  "sideEffects": [
928
928
  "browser-condition-css"
929
929
  ]
930
930
  },
931
931
  "wiring": [],
932
932
  "publicClasses": [
933
- "kui-menu-action-row",
934
- "kui-menu-action-row__icon",
935
- "kui-menu-action-row__label",
936
- "kui-menu-action-row__primary",
937
- "kui-menu-action-row__trailing-action"
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"
938
938
  ],
939
939
  "publicTokens": [
940
940
  "--kui-color-brand-border-quiet",
@@ -950,25 +950,25 @@
950
950
  "--kui-layout-item-padding",
951
951
  "--kui-layout-rounded-radius",
952
952
  "--kui-radius-pill",
953
- "--kui-menu-action-row-background",
954
- "--kui-menu-action-row-border",
955
- "--kui-menu-action-row-color",
956
- "--kui-menu-action-row-hover-background",
957
- "--kui-menu-action-row-hover-border",
958
- "--kui-menu-action-row-selected-background",
959
- "--kui-menu-action-row-selected-border",
960
- "--kui-menu-action-row-selected-color",
961
- "--kui-menu-action-row-trailing-hover-background"
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"
962
962
  ],
963
963
  "links": {
964
- "catalogRoute": "?component=menu-action-row",
964
+ "catalogRoute": "?component=list-action-row",
965
965
  "documentation": "docs/component-selection.md",
966
966
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
967
967
  }
968
968
  },
969
969
  {
970
- "id": "menu-item",
971
- "name": "MenuItem",
970
+ "id": "list-item",
971
+ "name": "ListItem",
972
972
  "category": "Navigation",
973
973
  "kind": "component",
974
974
  "source": "kerf",
@@ -978,17 +978,17 @@
978
978
  ],
979
979
  "purpose": "Selectable, disabled, trailing, and multiline navigation rows.",
980
980
  "publicExports": [
981
- "MenuItem"
981
+ "ListItem"
982
982
  ],
983
983
  "useWhen": [
984
984
  "Render a selectable, disabled, trailing, or multiline sidebar/navigation action row."
985
985
  ],
986
986
  "avoidWhen": [
987
- "Do not use for an ordinary inline link, form button, isolated ARIA menuitem, or an interactive trailing action; use MenuActionRow for sibling row actions."
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."
988
988
  ],
989
989
  "alternatives": [
990
990
  {
991
- "id": "menu-action-row",
991
+ "id": "list-action-row",
992
992
  "relationship": "nearest",
993
993
  "when": "The trailing region must be independently interactive."
994
994
  }
@@ -1012,18 +1012,18 @@
1012
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."
1013
1013
  ],
1014
1014
  "delivery": {
1015
- "browserImport": "@kerfjs/ui/menu-item",
1016
- "manualCssImport": "@kerfjs/ui/menu-item.css",
1015
+ "browserImport": "@kerfjs/ui/list-item",
1016
+ "manualCssImport": "@kerfjs/ui/list-item.css",
1017
1017
  "sideEffects": [
1018
1018
  "browser-condition-css"
1019
1019
  ]
1020
1020
  },
1021
1021
  "wiring": [],
1022
1022
  "publicClasses": [
1023
- "kui-menu-item",
1024
- "kui-menu-item__icon",
1025
- "kui-menu-item__label",
1026
- "kui-menu-item__trailing"
1023
+ "kui-list-item",
1024
+ "kui-list-item__icon",
1025
+ "kui-list-item__label",
1026
+ "kui-list-item__trailing"
1027
1027
  ],
1028
1028
  "publicTokens": [
1029
1029
  "--kui-color-brand-fill-normal",
@@ -1032,17 +1032,17 @@
1032
1032
  "--kui-color-neutral-on-normal",
1033
1033
  "--kui-color-neutral-on-quiet",
1034
1034
  "--kui-focus-ring",
1035
- "--kui-menu-item-color",
1036
- "--kui-menu-item-hover-background",
1037
- "--kui-menu-item-selected-background",
1038
- "--kui-menu-item-selected-color",
1035
+ "--kui-list-item-color",
1036
+ "--kui-list-item-hover-background",
1037
+ "--kui-list-item-selected-background",
1038
+ "--kui-list-item-selected-color",
1039
1039
  "--kui-layout-inline-margin",
1040
1040
  "--kui-layout-item-gap",
1041
1041
  "--kui-layout-item-padding",
1042
1042
  "--kui-layout-rounded-radius"
1043
1043
  ],
1044
1044
  "links": {
1045
- "catalogRoute": "?component=menu-item",
1045
+ "catalogRoute": "?component=list-item",
1046
1046
  "documentation": "docs/component-selection.md",
1047
1047
  "recipe": "docs/component-selection.md#problem-to-component-matrix"
1048
1048
  }
@@ -4362,8 +4362,8 @@
4362
4362
  "toolbar",
4363
4363
  "toolbar-text",
4364
4364
  "toolbar-control-group",
4365
- "menu-header",
4366
- "menu-item",
4365
+ "list-header",
4366
+ "list-item",
4367
4367
  "panel-header",
4368
4368
  "resize",
4369
4369
  "value-table",
@@ -4403,8 +4403,8 @@
4403
4403
  "source": "kerf",
4404
4404
  "purpose": "Navigation sections with icon and iconless rows, a content-item surface, disclosure, and pane footer actions.",
4405
4405
  "uses": [
4406
- "menu-header",
4407
- "menu-item",
4406
+ "list-header",
4407
+ "list-item",
4408
4408
  "toolbar",
4409
4409
  "toolbar-control-group"
4410
4410
  ],
@@ -4473,16 +4473,16 @@
4473
4473
  }
4474
4474
  },
4475
4475
  {
4476
- "id": "recipe-master-detail-dialog",
4477
- "name": "Master-detail dialog",
4476
+ "id": "recipe-list-detail-dialog",
4477
+ "name": "List-detail dialog",
4478
4478
  "category": "Recipes",
4479
4479
  "kind": "recipe",
4480
4480
  "source": "kerf",
4481
4481
  "purpose": "Production modal containing a PanelHeader, navigable record master list, and ValueTable detail.",
4482
4482
  "uses": [
4483
4483
  "panel-header",
4484
- "menu-header",
4485
- "menu-item",
4484
+ "list-header",
4485
+ "list-item",
4486
4486
  "value-table",
4487
4487
  "wa-dialog",
4488
4488
  "wa-button"
@@ -4509,9 +4509,9 @@
4509
4509
  ]
4510
4510
  },
4511
4511
  "links": {
4512
- "catalogRoute": "?component=recipe-master-detail-dialog",
4513
- "documentation": "docs/recipes.md#master-detail-dialog",
4514
- "recipe": "docs/recipes.md#master-detail-dialog"
4512
+ "catalogRoute": "?component=recipe-list-detail-dialog",
4513
+ "documentation": "docs/recipes.md#list-detail-dialog",
4514
+ "recipe": "docs/recipes.md#list-detail-dialog"
4515
4515
  }
4516
4516
  },
4517
4517
  {
@@ -4647,8 +4647,8 @@
4647
4647
  "source": "kerf",
4648
4648
  "purpose": "A push/pop navigation stack drill-down with animated slides and a live device class.",
4649
4649
  "uses": [
4650
- "menu-header",
4651
- "menu-item",
4650
+ "list-header",
4651
+ "list-item",
4652
4652
  "lucide-icon",
4653
4653
  "layout"
4654
4654
  ],
@@ -4677,6 +4677,49 @@
4677
4677
  "documentation": "docs/recipes.md#navigation-stack",
4678
4678
  "recipe": "docs/recipes.md#navigation-stack"
4679
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
+ }
4680
4723
  }
4681
4724
  ]
4682
4725
  }