@kerfjs/ui 5.0.0-beta.24 → 5.0.0-beta.26

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 (149) hide show
  1. package/README.md +44 -23
  2. package/ai/application-ui-diagnostic-ids-v1.json +3 -0
  3. package/ai/application-ui-profile.defaults.json +1 -1
  4. package/ai/compile-time-contracts-v1.json +3 -11
  5. package/ai/component-catalog-v2-overrides.json +7 -37
  6. package/ai/component-catalog-v2.d.ts +1 -0
  7. package/ai/component-catalog-v2.json +415 -91
  8. package/ai/component-catalog-v2.schema.json +2 -1
  9. package/ai/component-catalog.json +602 -158
  10. package/ai/public-api-signatures-v1.md +132 -65
  11. package/ai/skill.md +20 -20
  12. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  13. package/analyzer/cli.mjs +5 -2
  14. package/analyzer/index.d.mts +1 -0
  15. package/analyzer/index.mjs +117 -10
  16. package/dist/app-tab.d.ts +10 -2
  17. package/dist/app-tab.js +1 -1
  18. package/dist/browser/list-action-row.js +1 -0
  19. package/dist/browser/list-item.js +1 -0
  20. package/dist/browser/surface-scaffold.js +3 -0
  21. package/dist/catalog.js +5 -4
  22. package/dist/catalog.js.map +1 -1
  23. package/dist/{chunk-FEAMR7S4.js → chunk-4EF2CMYS.js} +24 -5
  24. package/dist/chunk-4EF2CMYS.js.map +1 -0
  25. package/dist/{chunk-NWSEP5RT.js → chunk-FRVS5RFM.js} +23 -5
  26. package/dist/chunk-FRVS5RFM.js.map +1 -0
  27. package/dist/{chunk-PSKN344N.js → chunk-GWEAPEZI.js} +15 -2
  28. package/dist/chunk-GWEAPEZI.js.map +1 -0
  29. package/dist/chunk-HP2B2L26.js +102 -0
  30. package/dist/chunk-HP2B2L26.js.map +1 -0
  31. package/dist/{chunk-OJWWHFH3.js → chunk-JFGXQBIP.js} +49 -23
  32. package/dist/chunk-JFGXQBIP.js.map +1 -0
  33. package/dist/chunk-OBLTAKSX.js +43 -0
  34. package/dist/chunk-OBLTAKSX.js.map +1 -0
  35. package/dist/{chunk-Y45PPBDV.js → chunk-OT6RPYAP.js} +16 -2
  36. package/dist/chunk-OT6RPYAP.js.map +1 -0
  37. package/dist/{chunk-UFZKLBCF.js → chunk-VCE4MPVE.js} +25 -3
  38. package/dist/chunk-VCE4MPVE.js.map +1 -0
  39. package/dist/{chunk-5VTB2BKP.js → chunk-WNWD54GR.js} +16 -2
  40. package/dist/chunk-WNWD54GR.js.map +1 -0
  41. package/dist/{chunk-M7JBER5U.js → chunk-X2U3QJCJ.js} +8 -2
  42. package/dist/chunk-X2U3QJCJ.js.map +1 -0
  43. package/dist/{chunk-DPDBVKNA.js → chunk-YMKH5XTF.js} +5 -3
  44. package/dist/chunk-YMKH5XTF.js.map +1 -0
  45. package/dist/collapsible-panel.d.ts +9 -1
  46. package/dist/collapsible-panel.js +36 -15
  47. package/dist/collapsible-panel.js.map +1 -1
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.js +12 -12
  50. package/dist/list-action-row.d.ts +11 -1
  51. package/dist/list-action-row.js +2 -1
  52. package/dist/list-header.d.ts +15 -2
  53. package/dist/list-header.js +1 -1
  54. package/dist/list-item.d.ts +12 -1
  55. package/dist/list-item.js +2 -1
  56. package/dist/resizable-region.d.ts +19 -2
  57. package/dist/resizable-region.js +1 -1
  58. package/dist/select.d.ts +12 -1
  59. package/dist/select.js +1 -1
  60. package/dist/split-view.js +1 -1
  61. package/dist/styles/app-tab.css +26 -0
  62. package/dist/styles/collapsible-panel.css +66 -4
  63. package/dist/styles/list-action-row.css +64 -0
  64. package/dist/styles/list-header.css +32 -0
  65. package/dist/styles/list-item.css +39 -0
  66. package/dist/styles/resizable-region.css +132 -0
  67. package/dist/styles/select.css +68 -0
  68. package/dist/styles/styles.css +1 -1
  69. package/dist/styles/surface-scaffold.css +51 -0
  70. package/dist/styles/tab-bar.css +24 -0
  71. package/dist/styles/toolbar-control-group.css +73 -1
  72. package/dist/styles/toolbar-text.css +1 -1
  73. package/dist/styles/webawesome.css +12 -0
  74. package/dist/styles/workbench.css +89 -0
  75. package/dist/surface-scaffold.d.ts +25 -0
  76. package/dist/surface-scaffold.js +3 -0
  77. package/dist/surface-scaffold.js.map +1 -0
  78. package/dist/tab-bar.d.ts +11 -2
  79. package/dist/tab-bar.js +1 -1
  80. package/dist/toolbar-control-group.d.ts +16 -2
  81. package/dist/toolbar-control-group.js +1 -1
  82. package/dist/webawesome.d.ts +1 -0
  83. package/dist/wire-resizable-regions.js +1 -1
  84. package/dist/wire-sidebar.d.ts +6 -1
  85. package/dist/wire-sidebar.js +27 -8
  86. package/dist/wire-sidebar.js.map +1 -1
  87. package/dist/wire-token-search-fields.js +1 -1
  88. package/dist/workbench.d.ts +8 -0
  89. package/dist/workbench.js +42 -0
  90. package/dist/workbench.js.map +1 -1
  91. package/docs/accessibility.md +55 -12
  92. package/docs/collapsible-panel.md +7 -0
  93. package/docs/component-contract.md +5 -8
  94. package/docs/component-selection.md +63 -33
  95. package/docs/design/templates.md +5 -7
  96. package/docs/examples/component-catalog-extension-v2.json +3 -6
  97. package/docs/examples/component-catalog-extension.json +1 -1
  98. package/docs/layout.md +7 -9
  99. package/docs/recipes.md +8 -7
  100. package/docs/surface-scaffold.md +17 -0
  101. package/docs/type-contracts.md +6 -8
  102. package/docs/ui-analyzer.md +19 -1
  103. package/docs/ui-doctor.md +1 -1
  104. package/docs/ux-demo.md +6 -3
  105. package/docs/webawesome-theme.md +4 -1
  106. package/docs/workbench.md +49 -2
  107. package/doctor/eslint-diagnostics.d.mts +16 -0
  108. package/doctor/eslint-diagnostics.mjs +17 -0
  109. package/doctor/index.mjs +16 -1
  110. package/llms.txt +19 -9
  111. package/package.json +7 -7
  112. package/ux-demo/recipes/app-shell.tsx +36 -23
  113. package/ux-demo/recipes/collapsible-sidebar.tsx +22 -16
  114. package/ux-demo/recipes/composer-form.tsx +15 -6
  115. package/ux-demo/recipes/list-detail-dialog.tsx +31 -15
  116. package/ux-demo/recipes/list-workspace-states.tsx +16 -7
  117. package/ux-demo/recipes/loading-inspector.tsx +39 -18
  118. package/ux-demo/recipes/recipes.css +7 -2
  119. package/ux-demo/recipes/workspace-header.tsx +17 -7
  120. package/dist/browser/panel-header.js +0 -7
  121. package/dist/chunk-5VTB2BKP.js.map +0 -1
  122. package/dist/chunk-7XRDUG4Y.js +0 -58
  123. package/dist/chunk-7XRDUG4Y.js.map +0 -1
  124. package/dist/chunk-DPDBVKNA.js.map +0 -1
  125. package/dist/chunk-FEAMR7S4.js.map +0 -1
  126. package/dist/chunk-M7JBER5U.js.map +0 -1
  127. package/dist/chunk-NENBUYX5.js +0 -79
  128. package/dist/chunk-NENBUYX5.js.map +0 -1
  129. package/dist/chunk-NWSEP5RT.js.map +0 -1
  130. package/dist/chunk-OJWWHFH3.js.map +0 -1
  131. package/dist/chunk-PSKN344N.js.map +0 -1
  132. package/dist/chunk-UFZKLBCF.js.map +0 -1
  133. package/dist/chunk-Y45PPBDV.js.map +0 -1
  134. package/dist/panel-header.d.ts +0 -42
  135. package/dist/panel-header.js +0 -7
  136. package/dist/panel-header.js.map +0 -1
  137. package/dist/styles/panel-header.css +0 -64
  138. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  139. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  140. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  141. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  142. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  143. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  144. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  145. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  146. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  147. package/docs/design/templates/panel-header/title-only.svg +0 -1
  148. package/docs/design/templates/panel-header-dark.svg +0 -1
  149. package/docs/design/templates/panel-header.svg +0 -1
package/README.md CHANGED
@@ -15,7 +15,7 @@ For connective application patterns, use the seven [production composition
15
15
  recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
16
16
  public-subpath source, semantic layout ownership, and explicit application
17
17
  customization boundaries. The composer recipe demonstrates one coherent form
18
- surface with `PanelHeader` hierarchy and field/action controls aligned to the
18
+ surface with a `Toolbar`/`ToolbarText` heading and field/action controls aligned to the
19
19
  shared 8px gutter; only persistent feedback adds a nested semantic
20
20
  `StateBanner` surface.
21
21
 
@@ -41,11 +41,7 @@ mount(root, () => (
41
41
  <>
42
42
  <Toolbar
43
43
  label="Document"
44
- leading={
45
- <ToolbarControlGroup appearance="borderless" single>
46
- <ToolbarText text="Notes" />
47
- </ToolbarControlGroup>
48
- }
44
+ leading={<ToolbarText text="Notes" />}
49
45
  />
50
46
  <section>
51
47
  <ListHeader
@@ -120,6 +116,7 @@ as a `New` marker.
120
116
  | `DisclosureArrow` | `@kerfjs/ui/disclosure-arrow` | `@kerfjs/ui/disclosure-arrow.css` |
121
117
  | `Toolbar` | `@kerfjs/ui/toolbar` | `@kerfjs/ui/toolbar.css` |
122
118
  | `ToolbarControlGroup` | `@kerfjs/ui/toolbar-control-group` | `@kerfjs/ui/toolbar-control-group.css` |
119
+ | `DialogSurface`, `PopupSurface` | `@kerfjs/ui/surface-scaffold` | `@kerfjs/ui/surface-scaffold.css` |
123
120
  | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
124
121
  | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
125
122
  | `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
@@ -129,6 +126,14 @@ as a `New` marker.
129
126
  | `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
130
127
  | `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
131
128
  | `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
129
+ | `NavStack` | `@kerfjs/ui/nav-stack` | `@kerfjs/ui/nav-stack.css` |
130
+ | `wireNavStack` | `@kerfjs/ui/wire-nav-stack` | — |
131
+ | `SplitView` | `@kerfjs/ui/split-view` | `@kerfjs/ui/split-view.css` |
132
+ | `TabScaffold` | `@kerfjs/ui/tab-scaffold` | `@kerfjs/ui/tab-scaffold.css` |
133
+ | `wireTabScaffold` | `@kerfjs/ui/wire-tab-scaffold` | — |
134
+ | `Workbench` | `@kerfjs/ui/workbench` | `@kerfjs/ui/workbench.css` |
135
+ | `CollapsiblePanel`, `CollapsiblePanelToggle` | `@kerfjs/ui/collapsible-panel` | `@kerfjs/ui/collapsible-panel.css` |
136
+ | `wireSidebar` | `@kerfjs/ui/wire-sidebar` | — |
132
137
  | Content and navigation composition | — | `@kerfjs/ui/layout.css` |
133
138
  | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
134
139
  | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
@@ -144,22 +149,22 @@ as a `New` marker.
144
149
  | `wireTokenSearchFields` | `@kerfjs/ui/wire-token-search-fields` | — |
145
150
  | `StateBanner` | `@kerfjs/ui/state-banner` | `@kerfjs/ui/state-banner.css` |
146
151
  | `EmptyState` | `@kerfjs/ui/empty-state` | `@kerfjs/ui/empty-state.css` |
147
- | `PanelHeader` | `@kerfjs/ui/panel-header` | `@kerfjs/ui/panel-header.css` |
148
152
  | `ValueTable`, `ValueTableRow` | `@kerfjs/ui/value-table` | `@kerfjs/ui/value-table.css` |
149
153
 
150
- Opt-in application layouts keep JavaScript and CSS explicit. For the
151
- desktop-class multi-panel shell, import `Workbench` from
152
- `@kerfjs/ui/workbench` and load `@kerfjs/ui/workbench.css`; its supported
153
- classes and size tokens are cataloged under the `workbench` entry. See
154
- [`docs/workbench.md`](./docs/workbench.md) for panel ownership and responsive
155
- replacement guidance.
156
-
157
- `PanelHeader` is a plain `Toolbar` used as a panel, dialog, or page heading: an
158
- optional icon control group (given a brand fill with a matching border), the
159
- title as extra-large `ToolbarText`, the app's trailing action controls, and an
160
- optional subtitle on a separate row below the title. It overrides no toolbar
161
- styles the app passes its own trailing controls (typically a
162
- `ToolbarControlGroup`).
154
+ Opt-in application layouts keep JavaScript and CSS explicit. Import each
155
+ layout from its component subpath, load the matching manual CSS export, and
156
+ add its wire subpath when the layout has interactive behavior. The catalog
157
+ entries for `nav-stack`, `split-view`, `tab-scaffold`, `workbench`, and
158
+ `collapsible-panel` document their selection rules, ownership boundaries,
159
+ public classes, tokens, and focused demos. See
160
+ [`docs/app-layouts.md`](./docs/app-layouts.md) for the layout decision matrix.
161
+
162
+ Compose panel, dialog, and page headings directly with `Toolbar`: put an optional
163
+ icon in a `ToolbarControlGroup`, use a direct extra-large `ToolbarText` for the
164
+ title, and put actions in the trailing zone inside their own control group. Set
165
+ `headingLevel` for page or section headings. Supporting copy is app-owned content
166
+ below the toolbar and should be connected to its host with `aria-describedby`
167
+ when it adds useful context.
163
168
 
164
169
  `DisclosureArrow` defaults to an 18px root-scaled decorative visual. Override
165
170
  `--kui-disclosure-arrow-size` at the narrowest useful scope when a consumer
@@ -303,7 +308,7 @@ retention policy, and a separate unscored human-visual rubric. See the
303
308
 
304
309
  ### Unified repair-loop doctor
305
310
 
306
- Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
311
+ Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. Its isolated Kerf lint pass preserves each file's applicable core-rule and suppression settings without executing consumer plugin rules. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
307
312
 
308
313
  For code generation, pair catalog selection guidance with the checked-in
309
314
  [`public-api-signatures-v1.md`](./ai/public-api-signatures-v1.md) declaration
@@ -479,7 +484,12 @@ Call `wireTokenSearchFields()` once at a stable root to make Enter submit throug
479
484
  `onSubmit` without inserting a contenteditable line break and to preserve focus
480
485
  plus the text-relative caret when keyboard deletion of a chip causes controlled
481
486
  rendering to replace the editor. A select-all deletion is normalized to a truly
482
- empty editor even when the browser leaves an atomic chip or line break behind.
487
+ empty editor even when the browser leaves an atomic chip or line break behind;
488
+ replacement typing consumes that intent so a later Backspace/Delete remains an
489
+ ordinary character edit.
490
+ Managed deletion keeps a collapsible replacement editor open and focused before
491
+ the next keystroke; applications must persist both query and tokens from the DOM
492
+ read. Genuine outside focus and Escape still collapse an empty field.
483
493
  Text still wraps visually when it reaches the field edge.
484
494
  Clear actions should empty the editor's `textContent` before clearing app state.
485
495
  The leading icon, first text line, clear action, and trailing slot share one
@@ -517,6 +527,13 @@ import "@kerfjs/ui/select/register";
517
527
  ```
518
528
 
519
529
  That boundary keeps Web Awesome and its custom-element side effects out of bundles that use unrelated components. Automated consumer-bundle tests enforce it.
530
+ Use `label` for a visible label or `ariaLabel` for a visually hidden name. A
531
+ nonempty visible label takes precedence when both are supplied. Kerf names the
532
+ actual shadow combobox without adding visible label spacing; this also works
533
+ with `renderSelected`, and needs no application shadow-DOM patch. Use `hint`
534
+ for persistent supporting text below the control and `placeholderText` for the
535
+ empty value inside the closed control. Loading placeholders preserve the hint.
536
+
520
537
  `Select` also owns the Kerf/Web Awesome reconciliation boundary: option icons
521
538
  keep stable slotted elements across rerenders, and `renderSelected` content is
522
539
  replaced when the controlled value changes. Consumers do not need to add
@@ -529,7 +546,11 @@ Awesome Tabs, `LucideIcon` over Web Awesome Icon, and `ResizableRegion` over
529
546
  Split Panel. `ResizableRegion` includes Hot Sheet 2's 1px separator and
530
547
  hover/focus grip. Its optional `handleIcon` replaces only the decorative glyph;
531
548
  the component and `wireResizableRegions()` retain separator semantics and
532
- pointer/keyboard behavior. Consider Web Awesome Popup when its anchored-positioning
549
+ pointer/keyboard behavior. Typed policies cover separator visibility,
550
+ instant-track/composited-content collapse, popup-safe overflow,
551
+ inline/overlay/hidden responsive presentation, and safe-area restore controls;
552
+ the same policies are available on `Workbench` and `CollapsiblePanel`. Consider
553
+ Web Awesome Popup when its anchored-positioning
533
554
  engine removes custom placement code; treat Tree, Animated Image, Comparison,
534
555
  Zoomable Frame, and the displaced alternatives above as exceptional rather
535
556
  than default patterns. The detailed rationale lives in the theme contract.
@@ -38,6 +38,9 @@
38
38
  "KUI-L007",
39
39
  "KUI-L008",
40
40
  "KUI-L009",
41
+ "KUI-L010",
42
+ "KUI-L011",
43
+ "KUI-L012",
41
44
  "KUI-L090",
42
45
  "KUI-L101",
43
46
  "KUI-L102",
@@ -19,7 +19,7 @@
19
19
  "avoid": ["@kerfjs/ui:wa-button-group"]
20
20
  },
21
21
  "navigation-row": { "preferred": "@kerfjs/ui:list-item" },
22
- "panel-heading": { "preferred": "@kerfjs/ui:panel-header" },
22
+ "panel-heading": { "preferred": "@kerfjs/ui:toolbar" },
23
23
  "structured-search": { "preferred": "@kerfjs/ui:token-search-field" }
24
24
  },
25
25
  "theme": {
@@ -54,14 +54,6 @@
54
54
  },
55
55
  {
56
56
  "id": "KUI-T007",
57
- "catalogKey": "@kerfjs/ui:panel-header",
58
- "publicImport": "@kerfjs/ui/panel-header",
59
- "symbols": ["PanelHeaderProps"],
60
- "kind": "conditional-property",
61
- "summary": "PanelHeader summaryId cannot be supplied without rendered summary content."
62
- },
63
- {
64
- "id": "KUI-T008",
65
57
  "catalogKey": "@kerfjs/ui:toolbar-text",
66
58
  "publicImport": "@kerfjs/ui/toolbar-text",
67
59
  "symbols": ["ToolbarTextProps"],
@@ -69,14 +61,14 @@
69
61
  "summary": "ToolbarText maxLines is accepted only when wrapping is enabled."
70
62
  },
71
63
  {
72
- "id": "KUI-T009",
64
+ "id": "KUI-T008",
73
65
  "publicImport": "@kerfjs/ui/tab-scaffold",
74
66
  "symbols": ["TabScaffoldTab", "TabScaffoldProps"],
75
67
  "kind": "literal-identity",
76
68
  "summary": "Literal TabScaffold active ids are constrained to the declared tab ids; dynamic integrations may widen the generic to string."
77
69
  },
78
70
  {
79
- "id": "KUI-T010",
71
+ "id": "KUI-T009",
80
72
  "catalogKey": "@kerfjs/ui:token-search-field",
81
73
  "publicImport": "@kerfjs/ui/wire-token-search-fields",
82
74
  "symbols": ["TokenSearchKeyboardOptions", "WireTokenSearchFieldsOptions"],
@@ -84,7 +76,7 @@
84
76
  "summary": "Adjacent-token removal requires the callback that commits removal to application-owned state."
85
77
  },
86
78
  {
87
- "id": "KUI-T011",
79
+ "id": "KUI-T010",
88
80
  "publicImport": "@kerfjs/ui",
89
81
  "symbols": [
90
82
  "DividerSides",
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "@kerfjs/ui:toolbar": {
3
3
  "_source": "docs/component-selection.md#toolbar-composition",
4
- "contexts": ["application-chrome", "panel-header"],
4
+ "contexts": [
5
+ "application-chrome",
6
+ "page-header",
7
+ "panel-header",
8
+ "dialog-header"
9
+ ],
5
10
  "zones": [
6
11
  {
7
12
  "id": "leading",
@@ -40,7 +45,7 @@
40
45
  "_source": "docs/component-selection.md#toolbar-composition",
41
46
  "parents": {
42
47
  "mode": "listed",
43
- "entries": ["@kerfjs/ui:toolbar", "@kerfjs/ui:panel-header"]
48
+ "entries": ["@kerfjs/ui:toolbar"]
44
49
  },
45
50
  "contexts": ["toolbar-zone"],
46
51
  "zones": [
@@ -57,41 +62,6 @@
57
62
  "requiredConcepts": ["control"]
58
63
  }
59
64
  },
60
- "@kerfjs/ui:panel-header": {
61
- "_source": "docs/component-selection.md#problem-to-component-matrix",
62
- "contexts": ["page-header", "panel-header", "dialog-header"],
63
- "zones": [
64
- {
65
- "id": "title",
66
- "accepts": ["text"],
67
- "cardinality": { "min": 1, "max": 1 },
68
- "exclusiveWith": []
69
- },
70
- {
71
- "id": "subtitle",
72
- "accepts": ["text"],
73
- "cardinality": { "min": 0, "max": 1 },
74
- "exclusiveWith": []
75
- },
76
- {
77
- "id": "controls",
78
- "accepts": ["control"],
79
- "cardinality": { "min": 0, "max": "unbounded" },
80
- "exclusiveWith": []
81
- }
82
- ],
83
- "state": [
84
- { "id": "placeholder", "owner": "controlled", "required": false }
85
- ],
86
- "diagnostics": [
87
- {
88
- "id": "KUI-C102",
89
- "severity": "error",
90
- "when": "the title is absent",
91
- "message": "PanelHeader requires a title that names its page, panel, or dialog."
92
- }
93
- ]
94
- },
95
65
  "@kerfjs/ui:list": {
96
66
  "_source": "docs/component-selection.md#problem-to-component-matrix",
97
67
  "contexts": ["application-ui", "navigation-list", "vertical-layout"],
@@ -54,6 +54,7 @@ export interface CatalogCompositionEntryV2 {
54
54
  rootClass: string | null;
55
55
  publicClasses: string[];
56
56
  publicTokens: string[];
57
+ publicParts?: string[];
57
58
  };
58
59
  diagnostics: CatalogDiagnostic[];
59
60
  provenance: { selection: string; composition: string };