@kerfjs/ui 5.0.0-beta.29 → 5.0.0-beta.30

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 (224) hide show
  1. package/README.md +43 -8
  2. package/ai/application-ui-diagnostic-ids-v1.json +5 -0
  3. package/ai/compile-time-contracts-v1.json +37 -0
  4. package/ai/compile-time-contracts-v1.schema.json +3 -1
  5. package/ai/component-catalog-v2-overrides.json +198 -1
  6. package/ai/component-catalog-v2.d.ts +22 -0
  7. package/ai/component-catalog-v2.json +488 -32
  8. package/ai/component-catalog-v2.schema.json +51 -0
  9. package/ai/component-catalog.json +251 -36
  10. package/ai/component-catalog.schema.json +23 -0
  11. package/ai/public-api-signatures-v1.md +231 -84
  12. package/ai/skill.md +32 -10
  13. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  14. package/analyzer/index.mjs +247 -5
  15. package/dist/app-tab.d.ts +3 -2
  16. package/dist/app-tab.js +2 -1
  17. package/dist/catalog-resources.d.ts +1 -0
  18. package/dist/catalog.d.ts +7 -6
  19. package/dist/catalog.js +8 -7
  20. package/dist/catalog.js.map +1 -1
  21. package/dist/{chunk-PX3YSS5C.js → chunk-6NDBE2OK.js} +1 -1
  22. package/dist/chunk-6NDBE2OK.js.map +1 -0
  23. package/dist/{chunk-B3A3IVO5.js → chunk-AQFWBG23.js} +3 -3
  24. package/dist/chunk-AQFWBG23.js.map +1 -0
  25. package/dist/{chunk-WNWD54GR.js → chunk-B6JYRX3P.js} +4 -2
  26. package/dist/chunk-B6JYRX3P.js.map +1 -0
  27. package/dist/{chunk-HP2B2L26.js → chunk-CAB6NQ2T.js} +1 -1
  28. package/dist/chunk-CAB6NQ2T.js.map +1 -0
  29. package/dist/{chunk-2NMQW7FX.js → chunk-CK6P5AUK.js} +4 -3
  30. package/dist/chunk-CK6P5AUK.js.map +1 -0
  31. package/dist/{chunk-VCE4MPVE.js → chunk-DAO2VFTT.js} +5 -6
  32. package/dist/chunk-DAO2VFTT.js.map +1 -0
  33. package/dist/{chunk-LPOMRC4C.js → chunk-DYBPI5O2.js} +1 -1
  34. package/dist/chunk-DYBPI5O2.js.map +1 -0
  35. package/dist/{chunk-IJBSZ4NX.js → chunk-E34TE2ZI.js} +4 -3
  36. package/dist/chunk-E34TE2ZI.js.map +1 -0
  37. package/dist/{chunk-4EF2CMYS.js → chunk-I45QO2IZ.js} +8 -7
  38. package/dist/chunk-I45QO2IZ.js.map +1 -0
  39. package/dist/{chunk-JRKSK2HX.js → chunk-I4V3UDSA.js} +1 -1
  40. package/dist/chunk-I4V3UDSA.js.map +1 -0
  41. package/dist/{chunk-FEY65TBV.js → chunk-KFUUFNTS.js} +1 -1
  42. package/dist/chunk-KFUUFNTS.js.map +1 -0
  43. package/dist/{chunk-QO55FN2Y.js → chunk-MFR2IIFG.js} +1 -1
  44. package/dist/chunk-MFR2IIFG.js.map +1 -0
  45. package/dist/{chunk-GWEAPEZI.js → chunk-OC275HHS.js} +4 -3
  46. package/dist/chunk-OC275HHS.js.map +1 -0
  47. package/dist/chunk-OL4TC3U2.js +156 -0
  48. package/dist/chunk-OL4TC3U2.js.map +1 -0
  49. package/dist/{chunk-OT6RPYAP.js → chunk-OMSRSL3B.js} +4 -3
  50. package/dist/chunk-OMSRSL3B.js.map +1 -0
  51. package/dist/{chunk-J5BFYY7Q.js → chunk-RL6COPKF.js} +12 -3
  52. package/dist/chunk-RL6COPKF.js.map +1 -0
  53. package/dist/{chunk-TB6DY7H5.js → chunk-SOK5EUF7.js} +1 -1
  54. package/dist/chunk-SOK5EUF7.js.map +1 -0
  55. package/dist/{chunk-RKVQEH4J.js → chunk-T7DOWS6T.js} +3 -3
  56. package/dist/chunk-T7DOWS6T.js.map +1 -0
  57. package/dist/{chunk-7KEUJIIC.js → chunk-TIGSG6BX.js} +1 -1
  58. package/dist/chunk-TIGSG6BX.js.map +1 -0
  59. package/dist/{chunk-W5L2JSBY.js → chunk-UDHHKZWO.js} +6 -5
  60. package/dist/chunk-UDHHKZWO.js.map +1 -0
  61. package/dist/{chunk-R7ZWUN64.js → chunk-V6GQKOX2.js} +4 -3
  62. package/dist/chunk-V6GQKOX2.js.map +1 -0
  63. package/dist/{chunk-KWWR5VMS.js → chunk-V6HCTCVD.js} +4 -3
  64. package/dist/chunk-V6HCTCVD.js.map +1 -0
  65. package/dist/{chunk-JFGXQBIP.js → chunk-VDUJZF5G.js} +76 -13
  66. package/dist/chunk-VDUJZF5G.js.map +1 -0
  67. package/dist/{chunk-SYDMYBPG.js → chunk-VXFGMDA7.js} +1 -1
  68. package/dist/chunk-VXFGMDA7.js.map +1 -0
  69. package/dist/{chunk-YMKH5XTF.js → chunk-WN52USHV.js} +2 -2
  70. package/dist/{chunk-YMKH5XTF.js.map → chunk-WN52USHV.js.map} +1 -1
  71. package/dist/{chunk-OBLTAKSX.js → chunk-WSXUPSID.js} +1 -1
  72. package/dist/chunk-WSXUPSID.js.map +1 -0
  73. package/dist/{chunk-X2U3QJCJ.js → chunk-ZPWZIVI6.js} +1 -1
  74. package/dist/chunk-ZPWZIVI6.js.map +1 -0
  75. package/dist/collapsible-panel.d.ts +5 -2
  76. package/dist/collapsible-panel.js.map +1 -1
  77. package/dist/css-values.d.ts +75 -0
  78. package/dist/css-values.js +3 -0
  79. package/dist/css-values.js.map +1 -0
  80. package/dist/empty-state.d.ts +2 -1
  81. package/dist/empty-state.js +1 -1
  82. package/dist/floating-toolbar.d.ts +4 -3
  83. package/dist/floating-toolbar.js +1 -1
  84. package/dist/index.d.ts +2 -0
  85. package/dist/index.js +26 -25
  86. package/dist/list-action-row.d.ts +1 -2
  87. package/dist/list-action-row.js +2 -1
  88. package/dist/list-header.d.ts +1 -1
  89. package/dist/list-header.js +2 -1
  90. package/dist/list-inset-control.d.ts +4 -3
  91. package/dist/list-inset-control.js +1 -1
  92. package/dist/list-inset-text.d.ts +4 -3
  93. package/dist/list-inset-text.js +1 -1
  94. package/dist/list-item.d.ts +4 -3
  95. package/dist/list-item.js +2 -1
  96. package/dist/list.d.ts +10 -8
  97. package/dist/list.js +2 -1
  98. package/dist/nav-stack.d.ts +9 -6
  99. package/dist/nav-stack.js +2 -1
  100. package/dist/pane.d.ts +6 -5
  101. package/dist/pane.js +1 -1
  102. package/dist/resizable-region.d.ts +2 -1
  103. package/dist/resizable-region.js +1 -1
  104. package/dist/segmented-control.d.ts +4 -3
  105. package/dist/segmented-control.js +2 -1
  106. package/dist/select.d.ts +3 -1
  107. package/dist/select.js +2 -1
  108. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  109. package/dist/skeleton.d.ts +7 -6
  110. package/dist/skeleton.js +2 -1
  111. package/dist/split-view.d.ts +5 -4
  112. package/dist/split-view.js +3 -2
  113. package/dist/split-view.js.map +1 -1
  114. package/dist/state-banner.d.ts +3 -2
  115. package/dist/state-banner.js +2 -1
  116. package/dist/styles/catalog.css +8 -1
  117. package/dist/styles/collapsible-panel.css +6 -2
  118. package/dist/styles/foundation.css +44 -0
  119. package/dist/styles/list-header.css +6 -0
  120. package/dist/styles/list-item.css +9 -0
  121. package/dist/styles/nav-stack.css +32 -2
  122. package/dist/styles/segmented-control.css +8 -1
  123. package/dist/styles/select.css +2 -1
  124. package/dist/styles/state-banner.css +14 -0
  125. package/dist/styles/tab-scaffold.css +1 -0
  126. package/dist/styles/token-search-field.css +4 -0
  127. package/dist/styles/toolbar-control-group.css +98 -16
  128. package/dist/styles/webawesome.css +22 -0
  129. package/dist/styles/workbench.css +4 -0
  130. package/dist/sunken-panel.d.ts +4 -3
  131. package/dist/sunken-panel.js +1 -1
  132. package/dist/surface-scaffold.d.ts +6 -5
  133. package/dist/surface-scaffold.js +1 -1
  134. package/dist/tab-bar.d.ts +6 -5
  135. package/dist/tab-bar.js +1 -1
  136. package/dist/tab-scaffold.d.ts +2 -1
  137. package/dist/tab-scaffold.js.map +1 -1
  138. package/dist/token-search-field.d.ts +5 -4
  139. package/dist/token-search-field.js +1 -1
  140. package/dist/toolbar-control-group.d.ts +10 -4
  141. package/dist/toolbar-control-group.js +1 -1
  142. package/dist/toolbar-text.js +2 -1
  143. package/dist/toolbar.d.ts +6 -5
  144. package/dist/toolbar.js +1 -1
  145. package/dist/value-table.d.ts +4 -2
  146. package/dist/value-table.js +2 -1
  147. package/dist/wire-nav-stack.d.ts +4 -1
  148. package/dist/wire-nav-stack.js +125 -0
  149. package/dist/wire-nav-stack.js.map +1 -1
  150. package/dist/wire-resizable-regions.js +1 -1
  151. package/dist/wire-tab-bars.d.ts +1 -0
  152. package/dist/wire-token-search-fields.js +1 -1
  153. package/dist/workbench.d.ts +7 -4
  154. package/dist/workbench.js.map +1 -1
  155. package/docs/accessibility.md +9 -3
  156. package/docs/collapsible-panel.md +4 -1
  157. package/docs/component-contract.md +56 -8
  158. package/docs/component-selection.md +45 -8
  159. package/docs/design/templates/list/compact-dark.svg +1 -1
  160. package/docs/design/templates/list/compact.svg +1 -1
  161. package/docs/design/templates/list/stack-dark.svg +1 -1
  162. package/docs/design/templates/list/stack.svg +1 -1
  163. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  164. package/docs/design/templates/list-action-row/default.svg +1 -1
  165. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  166. package/docs/design/templates/list-action-row/selected.svg +1 -1
  167. package/docs/design/templates/list-action-row-dark.svg +1 -1
  168. package/docs/design/templates/list-action-row.svg +1 -1
  169. package/docs/design/templates/list-dark.svg +1 -1
  170. package/docs/design/templates/list-item/default-dark.svg +1 -1
  171. package/docs/design/templates/list-item/default.svg +1 -1
  172. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  173. package/docs/design/templates/list-item/multiline.svg +1 -1
  174. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  175. package/docs/design/templates/list-item/selected.svg +1 -1
  176. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  177. package/docs/design/templates/list-item/trailing.svg +1 -1
  178. package/docs/design/templates/list-item-dark.svg +1 -1
  179. package/docs/design/templates/list-item.svg +1 -1
  180. package/docs/design/templates/list.svg +1 -1
  181. package/docs/design-philosophy.md +4 -2
  182. package/docs/examples/component-catalog-extension-v2.json +2 -0
  183. package/docs/layout.md +12 -4
  184. package/docs/nav-stack.md +29 -8
  185. package/docs/recipes.md +8 -4
  186. package/docs/split-view.md +6 -0
  187. package/docs/surface-scaffold.md +8 -0
  188. package/docs/tab-scaffold.md +3 -1
  189. package/docs/type-contracts.md +39 -12
  190. package/docs/ui-analyzer.md +17 -3
  191. package/docs/ui-doctor.md +7 -0
  192. package/docs/ux-demo.md +10 -4
  193. package/docs/webawesome-theme.md +6 -0
  194. package/docs/workbench.md +6 -4
  195. package/llms.txt +46 -6
  196. package/package.json +5 -1
  197. package/ux-demo/recipes/compact-toolbar.tsx +10 -9
  198. package/ux-demo/recipes/composer-form.tsx +6 -3
  199. package/ux-demo/recipes/loading-inspector.tsx +2 -1
  200. package/dist/chunk-2NMQW7FX.js.map +0 -1
  201. package/dist/chunk-4EF2CMYS.js.map +0 -1
  202. package/dist/chunk-7KEUJIIC.js.map +0 -1
  203. package/dist/chunk-B3A3IVO5.js.map +0 -1
  204. package/dist/chunk-FEY65TBV.js.map +0 -1
  205. package/dist/chunk-GWEAPEZI.js.map +0 -1
  206. package/dist/chunk-HP2B2L26.js.map +0 -1
  207. package/dist/chunk-IJBSZ4NX.js.map +0 -1
  208. package/dist/chunk-J5BFYY7Q.js.map +0 -1
  209. package/dist/chunk-JFGXQBIP.js.map +0 -1
  210. package/dist/chunk-JRKSK2HX.js.map +0 -1
  211. package/dist/chunk-KWWR5VMS.js.map +0 -1
  212. package/dist/chunk-LPOMRC4C.js.map +0 -1
  213. package/dist/chunk-OBLTAKSX.js.map +0 -1
  214. package/dist/chunk-OT6RPYAP.js.map +0 -1
  215. package/dist/chunk-PX3YSS5C.js.map +0 -1
  216. package/dist/chunk-QO55FN2Y.js.map +0 -1
  217. package/dist/chunk-R7ZWUN64.js.map +0 -1
  218. package/dist/chunk-RKVQEH4J.js.map +0 -1
  219. package/dist/chunk-SYDMYBPG.js.map +0 -1
  220. package/dist/chunk-TB6DY7H5.js.map +0 -1
  221. package/dist/chunk-VCE4MPVE.js.map +0 -1
  222. package/dist/chunk-W5L2JSBY.js.map +0 -1
  223. package/dist/chunk-WNWD54GR.js.map +0 -1
  224. package/dist/chunk-X2U3QJCJ.js.map +0 -1
package/README.md CHANGED
@@ -83,6 +83,15 @@ mount(root, () => (
83
83
 
84
84
  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.
85
85
 
86
+ Component content positions use one convention: `children` is the homogeneous
87
+ primary region, while semantic positions and replacement content use explicit
88
+ named `SafeHtml` props such as `header`, `footer`, `leading`, `trailing`,
89
+ `icon`, and `action`. These named `SafeHtml` prop slots are ordinary typed
90
+ function-component props—not native `<slot>` elements, wrapper slot
91
+ components, or a generic `slots` object. The v2 composition catalog publishes
92
+ sound prop bindings as `zone.jsx.prop`, allowing ESLint to validate statically
93
+ visible content and cardinality without guessing from zone names.
94
+
86
95
  `ListItem.rootAttributes`, `ListHeader.rootAttributes`,
87
96
  `ListActionRow.rootAttributes`, `AppTab.rootAttributes`,
88
97
  `CatalogExample.rootAttributes`, and `CatalogExampleStack.rootAttributes` carry typed
@@ -108,6 +117,21 @@ Do not concatenate a count into `label` or pass a numeric `badge`; the mutually
108
117
  exclusive legacy `badge` slot remains available for non-count `SafeHtml` such
109
118
  as a `New` marker.
110
119
 
120
+ `List.gap` accepts boolean default spacing, a direct spacing name such as
121
+ `gap="xs"` or `gap="m"`, or a branded `CssLength`. Import `space`, `rem`, `em`,
122
+ `px`, `pct`, `lengthVar`, `plus`, and `calc` from the CSS-free
123
+ `@kerfjs/ui/css-values` subpath when a named step is not enough. `plus` returns
124
+ an incomplete expression, so wrap it with `calc` before passing it to a prop.
125
+ Raw CSS strings are deliberately rejected; the opaque brands catch authoring
126
+ mistakes but are not sanitizers.
127
+
128
+ The same property-specific boundary applies beyond spacing: use `flex()` (or a
129
+ finite keyword) for `List.flex`; length builders and intrinsic-size keywords for
130
+ `Skeleton.width`/`height`; length builders for `Skeleton.radius`; and
131
+ `uiColor()` or `colorVar()` for `SelectChoice.color`. These grammars are not
132
+ interchangeable. `ListItem` and `ListActionRow` deliberately expose no raw
133
+ `style` declarations; use `className`, public tokens, and component props.
134
+
111
135
  ## Component subpaths
112
136
 
113
137
  | Component | Browser import (includes reachable CSS) | Manual CSS export |
@@ -120,6 +144,7 @@ as a `New` marker.
120
144
  | `FloatingToolbar` | `@kerfjs/ui/floating-toolbar` | `@kerfjs/ui/floating-toolbar.css` |
121
145
  | `ToolbarText` | `@kerfjs/ui/toolbar-text` | `@kerfjs/ui/toolbar-text.css` |
122
146
  | `List` | `@kerfjs/ui/list` | `@kerfjs/ui/list.css` |
147
+ | Typed CSS dimension builders | `@kerfjs/ui/css-values` | — |
123
148
  | `ListActionRow` | `@kerfjs/ui/list-action-row` | `@kerfjs/ui/list-action-row.css` |
124
149
  | `ListItem` | `@kerfjs/ui/list-item` | `@kerfjs/ui/list-item.css` |
125
150
  | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
@@ -288,9 +313,11 @@ are merged with catalog diagnostics before exception validation.
288
313
  Run `kerf-ui-analyze --root . src` (or import
289
314
  `@kerfjs/ui/analyzer`) to evaluate cross-file integration facts against the
290
315
  composition catalogs and application profile. It catches provable private
291
- selector reach-through, unknown tokens, competing geometry owners, and nested
292
- scroll owners; it reports forced dimensions, repeated insets, off-scale literal
293
- spacing, and dynamic classes separately as review findings. Text, versioned JSON,
316
+ selector reach-through, unknown tokens, competing geometry owners, nested
317
+ scroll owners, and cataloged CSS-value violations in JavaScript/TypeScript
318
+ component calls and JSX. It reports forced dimensions, repeated insets,
319
+ exceptional spacing shorthands, and dynamic classes separately as review
320
+ findings. Text, versioned JSON,
294
321
  and SARIF outputs carry stable `KUI-L###` ids, repository-relative locations,
295
322
  evidence, and ownership chains. See the [analyzer guide](./docs/ui-analyzer.md).
296
323
 
@@ -407,6 +434,9 @@ Awesome modules the application renders.
407
434
  `webawesome.css` includes Web Awesome's native/base theme and then applies the
408
435
  Hot Sheet 2 palette, surfaces, status colors, focus treatment, form geometry,
409
436
  radii, tooltips, and shadows through Web Awesome's public `--wa-*` contract.
437
+ On `wa-dialog`, the optional `hide-actions` class hides the exported
438
+ `header-actions` shadow part for compositions that provide another dismissal
439
+ affordance.
410
440
  Those tokens flow into all free component families. Every free Web Awesome 3.12
411
441
  component has an individual UX-catalog route under the collapsible ecosystem
412
442
  section, but the theme entry does not import or register component JavaScript,
@@ -427,8 +457,10 @@ classes for explicit appearance boundaries:
427
457
  ```
428
458
 
429
459
  `foundation.css` follows Hot Sheet 2's Web Awesome-compatible semantic palette.
430
- Brand, neutral, success, warning, and danger each expose fill, border, and
431
- foreground roles through `--kui-color-*`; stateful components also expose
460
+ Brand, pop, neutral, success, warning, and danger each expose fill, border, and
461
+ foreground roles through `--kui-color-*`. Pop is attractive, non-status emphasis
462
+ for featured, novel, or celebratory content; it never substitutes for success,
463
+ warning, or danger. Stateful components also expose
432
464
  component variables such as `--kui-state-banner-background`. Override the
433
465
  foundation for an application theme, a tone variable for one semantic state, or
434
466
  a component variable on one instance without replacing component selectors.
@@ -437,8 +469,8 @@ needs a selector, the component catalog's `publicClasses` arrays define the
437
469
  exact stable anatomy: public-class-to-public-class selectors are supported;
438
470
  descendant tag, id, attribute-only, and unlisted-class selectors are not.
439
471
 
440
- `StateBanner` has opinionated `neutral`, `info`, `success`, `warning`, and
441
- `danger` palettes. Override an individual banner with
472
+ `StateBanner` has opinionated `neutral`, `info`, `pop`, `success`, `warning`,
473
+ and `danger` palettes. Override an individual banner with
442
474
  `--kui-state-banner-background`, `--kui-state-banner-border`,
443
475
  `--kui-state-banner-foreground`, `--kui-state-banner-detail`,
444
476
  `--kui-state-banner-action-background`, and
@@ -537,7 +569,10 @@ empty value inside the closed control. Loading placeholders preserve the hint.
537
569
  `Select` also owns the Kerf/Web Awesome reconciliation boundary: option icons
538
570
  keep stable slotted elements across rerenders, and `renderSelected` content is
539
571
  replaced when the controlled value changes. Consumers do not need to add
540
- `data-key` or `data-morph-skip` workarounds around choice icons.
572
+ `data-key` or `data-morph-skip` workarounds around choice icons. Icon-bearing
573
+ options retain the standard icon-to-label gap. When a compact Select is wrapped
574
+ in a `ToolbarControlGroup`, use `focusRingOwner="group"`; the group paints the
575
+ focus ring with its configured pill or rounded geometry.
541
576
 
542
577
  For application choices and panes, prefer Kerf's purpose-built primitives:
543
578
  `Select` over direct Web Awesome selection/dropdown composition,
@@ -41,6 +41,11 @@
41
41
  "KUI-L010",
42
42
  "KUI-L011",
43
43
  "KUI-L012",
44
+ "KUI-L013",
45
+ "KUI-L014",
46
+ "KUI-L015",
47
+ "KUI-L016",
48
+ "KUI-L017",
44
49
  "KUI-L090",
45
50
  "KUI-L101",
46
51
  "KUI-L102",
@@ -89,6 +89,43 @@
89
89
  ],
90
90
  "kind": "finite-vocabulary",
91
91
  "summary": "Finite public variant vocabularies, including canonical divider-edge combinations, are named exported unions rather than anonymous string sets."
92
+ },
93
+ {
94
+ "id": "KUI-T011",
95
+ "publicImport": "@kerfjs/ui",
96
+ "symbols": ["KerfUiContent"],
97
+ "kind": "recursive-semantic-content",
98
+ "summary": "Semantic UI content zones accept SafeHtml, runtime-empty boolean/nullish values, and readonly nested arrays while rejecting arbitrary strings, numbers, and signals."
99
+ },
100
+ {
101
+ "id": "KUI-T012",
102
+ "catalogKey": "@kerfjs/ui:list",
103
+ "publicImport": "@kerfjs/ui/css-values",
104
+ "symbols": [
105
+ "CssValue",
106
+ "CssLength",
107
+ "CssLengthExpression",
108
+ "UiSpaceName",
109
+ "space",
110
+ "plus",
111
+ "calc"
112
+ ],
113
+ "kind": "property-specific-css-value",
114
+ "summary": "List gap accepts finite spacing shorthands or branded complete length-percentage values, while raw CSS strings and non-standalone arithmetic expressions remain rejected."
115
+ },
116
+ {
117
+ "id": "KUI-T013",
118
+ "publicImport": "@kerfjs/ui/css-values",
119
+ "symbols": [
120
+ "CssFlex",
121
+ "CssSize",
122
+ "CssColor",
123
+ "flex",
124
+ "uiColor",
125
+ "colorVar"
126
+ ],
127
+ "kind": "property-specific-css-value",
128
+ "summary": "List flex, Skeleton dimensions, and Select icon colors use separate typed CSS grammars; row declaration-string props are absent rather than sharing a generic CSS escape hatch."
92
129
  }
93
130
  ]
94
131
  }
@@ -36,7 +36,9 @@
36
36
  "discriminated-union",
37
37
  "finite-vocabulary",
38
38
  "literal-identity",
39
- "protected-attributes"
39
+ "property-specific-css-value",
40
+ "protected-attributes",
41
+ "recursive-semantic-content"
40
42
  ]
41
43
  },
42
44
  "summary": { "type": "string", "minLength": 1 }
@@ -10,18 +10,21 @@
10
10
  "zones": [
11
11
  {
12
12
  "id": "leading",
13
+ "jsx": { "prop": "leading" },
13
14
  "accepts": ["toolbar-text", "toolbar-control-group"],
14
15
  "cardinality": { "min": 0, "max": "unbounded" },
15
16
  "exclusiveWith": []
16
17
  },
17
18
  {
18
19
  "id": "center",
20
+ "jsx": { "prop": "center" },
19
21
  "accepts": ["toolbar-text", "toolbar-control-group"],
20
22
  "cardinality": { "min": 0, "max": "unbounded" },
21
23
  "exclusiveWith": []
22
24
  },
23
25
  {
24
26
  "id": "trailing",
27
+ "jsx": { "prop": "trailing" },
25
28
  "accepts": ["toolbar-text", "toolbar-control-group"],
26
29
  "cardinality": { "min": 0, "max": "unbounded" },
27
30
  "exclusiveWith": []
@@ -41,6 +44,39 @@
41
44
  }
42
45
  ]
43
46
  },
47
+ "@kerfjs/ui:pane": {
48
+ "_source": "docs/layout.md#anatomy",
49
+ "contexts": [
50
+ "application-column",
51
+ "sidebar",
52
+ "main-content",
53
+ "inspector",
54
+ "dialog-column"
55
+ ],
56
+ "zones": [
57
+ {
58
+ "id": "header",
59
+ "jsx": { "prop": "header" },
60
+ "accepts": ["fixed-chrome"],
61
+ "cardinality": { "min": 0, "max": "unbounded" },
62
+ "exclusiveWith": []
63
+ },
64
+ {
65
+ "id": "content",
66
+ "jsx": { "prop": "children" },
67
+ "accepts": ["pane-content"],
68
+ "cardinality": { "min": 0, "max": "unbounded" },
69
+ "exclusiveWith": []
70
+ },
71
+ {
72
+ "id": "footer",
73
+ "jsx": { "prop": "footer" },
74
+ "accepts": ["fixed-chrome"],
75
+ "cardinality": { "min": 0, "max": "unbounded" },
76
+ "exclusiveWith": []
77
+ }
78
+ ]
79
+ },
44
80
  "@kerfjs/ui:toolbar-control-group": {
45
81
  "_source": "docs/component-selection.md#toolbar-composition",
46
82
  "parents": {
@@ -102,9 +138,24 @@
102
138
  "zones": [
103
139
  {
104
140
  "id": "tabs",
105
- "accepts": ["app-tab"],
141
+ "jsx": { "prop": "children" },
142
+ "accepts": ["tabs"],
106
143
  "cardinality": { "min": 1, "max": "unbounded" },
107
144
  "exclusiveWith": []
145
+ },
146
+ {
147
+ "id": "leading",
148
+ "jsx": { "prop": "leading" },
149
+ "accepts": ["toolbar-control-group"],
150
+ "cardinality": { "min": 0, "max": 1 },
151
+ "exclusiveWith": []
152
+ },
153
+ {
154
+ "id": "trailing",
155
+ "jsx": { "prop": "trailing" },
156
+ "accepts": ["toolbar-control-group"],
157
+ "cardinality": { "min": 0, "max": 1 },
158
+ "exclusiveWith": []
108
159
  }
109
160
  ],
110
161
  "state": [
@@ -133,6 +184,37 @@
133
184
  }
134
185
  ]
135
186
  },
187
+ "@kerfjs/ui:tabs": {
188
+ "_source": "docs/accessibility.md#tabs",
189
+ "parents": {
190
+ "mode": "listed",
191
+ "entries": ["@kerfjs/ui:tab-bar"]
192
+ },
193
+ "contexts": ["tabpanel-navigation"],
194
+ "zones": [
195
+ {
196
+ "id": "leading-decoration",
197
+ "jsx": { "prop": "leading" },
198
+ "accepts": ["dormant-decoration"],
199
+ "cardinality": { "min": 0, "max": 1 },
200
+ "exclusiveWith": []
201
+ },
202
+ {
203
+ "id": "trailing-decoration",
204
+ "jsx": { "prop": "trailing" },
205
+ "accepts": ["dormant-decoration"],
206
+ "cardinality": { "min": 0, "max": 1 },
207
+ "exclusiveWith": []
208
+ },
209
+ {
210
+ "id": "close-icon",
211
+ "jsx": { "prop": "closeIcon" },
212
+ "accepts": ["dormant-decoration"],
213
+ "cardinality": { "min": 0, "max": 1 },
214
+ "exclusiveWith": []
215
+ }
216
+ ]
217
+ },
136
218
  "@kerfjs/ui:segmented-control": {
137
219
  "_source": "docs/accessibility.md#segmentedcontrol",
138
220
  "contexts": ["compact-exclusive-choice"],
@@ -147,6 +229,22 @@
147
229
  "@kerfjs/ui:token-search-field": {
148
230
  "_source": "docs/accessibility.md#tokensearchfield",
149
231
  "contexts": ["structured-search-editor"],
232
+ "zones": [
233
+ {
234
+ "id": "leading-decoration",
235
+ "jsx": { "prop": "leading" },
236
+ "accepts": ["dormant-decoration"],
237
+ "cardinality": { "min": 0, "max": 1 },
238
+ "exclusiveWith": []
239
+ },
240
+ {
241
+ "id": "trailing-control",
242
+ "jsx": { "prop": "trailing" },
243
+ "accepts": ["control"],
244
+ "cardinality": { "min": 0, "max": 1 },
245
+ "exclusiveWith": []
246
+ }
247
+ ],
150
248
  "state": [
151
249
  { "id": "tokens", "owner": "controlled", "required": true },
152
250
  { "id": "text", "owner": "component", "required": true },
@@ -169,6 +267,97 @@
169
267
  }
170
268
  ]
171
269
  },
270
+ "@kerfjs/ui:state-banner": {
271
+ "_source": "docs/component-selection.md#problem-to-component-matrix",
272
+ "contexts": ["persistent-status", "recoverable-error"],
273
+ "zones": [
274
+ {
275
+ "id": "icon",
276
+ "jsx": { "prop": "icon" },
277
+ "accepts": ["dormant-decoration"],
278
+ "cardinality": { "min": 0, "max": 1 },
279
+ "exclusiveWith": []
280
+ },
281
+ {
282
+ "id": "action",
283
+ "jsx": { "prop": "action" },
284
+ "accepts": ["control"],
285
+ "cardinality": { "min": 0, "max": 1 },
286
+ "exclusiveWith": []
287
+ }
288
+ ]
289
+ },
290
+ "@kerfjs/ui:empty-state": {
291
+ "_source": "docs/component-selection.md#problem-to-component-matrix",
292
+ "contexts": ["empty-content", "busy-content"],
293
+ "zones": [
294
+ {
295
+ "id": "icon",
296
+ "jsx": { "prop": "icon" },
297
+ "accepts": ["dormant-decoration"],
298
+ "cardinality": { "min": 0, "max": 1 },
299
+ "exclusiveWith": []
300
+ },
301
+ {
302
+ "id": "action",
303
+ "jsx": { "prop": "action" },
304
+ "accepts": ["control"],
305
+ "cardinality": { "min": 0, "max": 1 },
306
+ "exclusiveWith": []
307
+ }
308
+ ]
309
+ },
310
+ "@kerfjs/ui:split-view": {
311
+ "_source": "docs/split-view.md#split-view-list-detail",
312
+ "contexts": ["list-detail", "responsive-master-detail"],
313
+ "zones": [
314
+ {
315
+ "id": "list",
316
+ "jsx": { "prop": "list" },
317
+ "accepts": ["list-region"],
318
+ "cardinality": { "min": 1, "max": 1 },
319
+ "exclusiveWith": []
320
+ },
321
+ {
322
+ "id": "detail",
323
+ "jsx": { "prop": "detail" },
324
+ "accepts": ["detail-region"],
325
+ "cardinality": { "min": 1, "max": 1 },
326
+ "exclusiveWith": []
327
+ }
328
+ ]
329
+ },
330
+ "@kerfjs/ui:workbench": {
331
+ "_source": "docs/workbench.md#workbench",
332
+ "contexts": ["desktop-application-shell"],
333
+ "zones": [
334
+ {
335
+ "id": "main",
336
+ "jsx": { "prop": "main" },
337
+ "accepts": ["workspace-region"],
338
+ "cardinality": { "min": 1, "max": 1 },
339
+ "exclusiveWith": []
340
+ },
341
+ {
342
+ "id": "left-rail",
343
+ "accepts": ["panel-region"],
344
+ "cardinality": { "min": 0, "max": 1 },
345
+ "exclusiveWith": []
346
+ },
347
+ {
348
+ "id": "right-rail",
349
+ "accepts": ["panel-region"],
350
+ "cardinality": { "min": 0, "max": 1 },
351
+ "exclusiveWith": []
352
+ },
353
+ {
354
+ "id": "bottom-drawer",
355
+ "accepts": ["panel-region"],
356
+ "cardinality": { "min": 0, "max": 1 },
357
+ "exclusiveWith": []
358
+ }
359
+ ]
360
+ },
172
361
  "@kerfjs/ui:resize": {
173
362
  "_source": "docs/accessibility.md#resizableregion",
174
363
  "contexts": ["adjustable-pane-boundary"],
@@ -224,6 +413,14 @@
224
413
  }
225
414
  ]
226
415
  },
416
+ "@kerfjs/ui:wa-dialog": {
417
+ "_source": "docs/webawesome-theme.md#coverage",
418
+ "boundaries": {
419
+ "rootClass": null,
420
+ "publicClasses": ["hide-actions"],
421
+ "publicTokens": []
422
+ }
423
+ },
227
424
  "@kerfjs/ui:wa-radio-group": {
228
425
  "_source": "docs/webawesome-theme.md#coverage",
229
426
  "children": {
@@ -9,6 +9,25 @@ export type CatalogDiagnostic = {
9
9
  when: string;
10
10
  message: string;
11
11
  };
12
+ export type CatalogCssValueProp = {
13
+ path: string;
14
+ grammar:
15
+ | 'length'
16
+ | 'size'
17
+ | 'flex'
18
+ | 'color'
19
+ | 'declarations'
20
+ | 'media-query'
21
+ | 'pixels';
22
+ helpers: string[];
23
+ nonStandaloneHelpers?: string[];
24
+ shorthands: string[];
25
+ canonicalShorthands: string[];
26
+ exceptionalShorthands: string[];
27
+ rawPolicy: 'forbid' | 'allow' | 'unsafe-only';
28
+ unsafeHelper?: string;
29
+ examples: string[];
30
+ };
12
31
  export interface CatalogCompositionEntryV2 {
13
32
  key: CatalogQualifiedKey;
14
33
  package: string;
@@ -23,6 +42,8 @@ export interface CatalogCompositionEntryV2 {
23
42
  contexts: string[];
24
43
  zones: Array<{
25
44
  id: string;
45
+ /** Static JSX binding when this zone is supplied by a public prop. */
46
+ jsx?: { prop: string };
26
47
  accepts: string[];
27
48
  cardinality: CatalogCardinality;
28
49
  exclusiveWith: string[];
@@ -56,6 +77,7 @@ export interface CatalogCompositionEntryV2 {
56
77
  publicTokens: string[];
57
78
  publicParts?: string[];
58
79
  };
80
+ cssValueProps?: CatalogCssValueProp[];
59
81
  diagnostics: CatalogDiagnostic[];
60
82
  provenance: { selection: string; composition: string };
61
83
  }