@kerfjs/ui 5.0.0-beta.62 → 5.0.0-beta.64

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 (169) hide show
  1. package/README.md +4 -0
  2. package/ai/component-catalog-extension.schema.json +13 -0
  3. package/ai/component-catalog.json +13 -2
  4. package/ai/component-composition.json +15 -2
  5. package/ai/components/list-item.md +1 -1
  6. package/ai/components/workbench.md +4 -2
  7. package/ai/public-api-signatures-v1.md +151 -44
  8. package/ai/skill.md +9 -5
  9. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  10. package/analyzer/index.mjs +3 -2
  11. package/catalog-projection-cli.mjs +96 -0
  12. package/catalog-projection.d.mts +55 -0
  13. package/catalog-projection.mjs +62 -0
  14. package/dist/browser/catalog.js +1 -1
  15. package/dist/browser/collapsible-panel.js +2 -0
  16. package/dist/browser/nav-stack.js +1 -0
  17. package/dist/browser/split-view.js +1 -0
  18. package/dist/browser/toolbar-control-group.js +1 -0
  19. package/dist/browser/workbench.js +1 -0
  20. package/dist/catalog-resources.d.ts +1 -1
  21. package/dist/catalog.d.ts +2 -2
  22. package/dist/catalog.js +11 -10
  23. package/dist/catalog.js.map +1 -1
  24. package/dist/chip.d.ts +9 -3
  25. package/dist/chip.js +1 -1
  26. package/dist/{chunk-UCKKT6KO.js → chunk-2EKHENQK.js} +7 -1
  27. package/dist/chunk-2EKHENQK.js.map +1 -0
  28. package/dist/{chunk-OD2VXAPL.js → chunk-3BYFWTP3.js} +4 -3
  29. package/dist/chunk-3BYFWTP3.js.map +1 -0
  30. package/dist/{chunk-5Q3N6EV7.js → chunk-5IJ6UGNZ.js} +3 -3
  31. package/dist/{chunk-5Q3N6EV7.js.map → chunk-5IJ6UGNZ.js.map} +1 -1
  32. package/dist/{chunk-KROD7KZK.js → chunk-AUVG54KC.js} +2 -2
  33. package/dist/{chunk-KROD7KZK.js.map → chunk-AUVG54KC.js.map} +1 -1
  34. package/dist/{chunk-AUKT3KMG.js → chunk-CQHN45XR.js} +17 -2
  35. package/dist/chunk-CQHN45XR.js.map +1 -0
  36. package/dist/{chunk-SWVW56CV.js → chunk-EN4LDR5Y.js} +2 -2
  37. package/dist/{chunk-SWVW56CV.js.map → chunk-EN4LDR5Y.js.map} +1 -1
  38. package/dist/{chunk-4MG3KXJM.js → chunk-F7OCOBTG.js} +2 -2
  39. package/dist/{chunk-4MG3KXJM.js.map → chunk-F7OCOBTG.js.map} +1 -1
  40. package/dist/{chunk-KYDDCJXU.js → chunk-HXCMWANP.js} +4 -4
  41. package/dist/{chunk-KYDDCJXU.js.map → chunk-HXCMWANP.js.map} +1 -1
  42. package/dist/{chunk-ENGVYQPG.js → chunk-IA4D5XNT.js} +60 -10
  43. package/dist/chunk-IA4D5XNT.js.map +1 -0
  44. package/dist/{chunk-F4QMLOXJ.js → chunk-IAOAZUOO.js} +2 -2
  45. package/dist/{chunk-F4QMLOXJ.js.map → chunk-IAOAZUOO.js.map} +1 -1
  46. package/dist/{chunk-VCBTX62E.js → chunk-J3KGJ6P6.js} +2 -2
  47. package/dist/chunk-J3KGJ6P6.js.map +1 -0
  48. package/dist/{chunk-X6ADHJNI.js → chunk-KFYANKJI.js} +25 -6
  49. package/dist/chunk-KFYANKJI.js.map +1 -0
  50. package/dist/{chunk-A3CKOW2R.js → chunk-M5H2RMCH.js} +165 -26
  51. package/dist/chunk-M5H2RMCH.js.map +1 -0
  52. package/dist/chunk-MOSIE4Z2.js +51 -0
  53. package/dist/chunk-MOSIE4Z2.js.map +1 -0
  54. package/dist/{chunk-RRB26JRJ.js → chunk-NSVLUDUW.js} +19 -4
  55. package/dist/chunk-NSVLUDUW.js.map +1 -0
  56. package/dist/{chunk-7JUBXOIV.js → chunk-NXWE5S57.js} +25 -6
  57. package/dist/chunk-NXWE5S57.js.map +1 -0
  58. package/dist/chunk-RGS4WX2M.js +44 -0
  59. package/dist/chunk-RGS4WX2M.js.map +1 -0
  60. package/dist/chunk-SH6F3CCG.js +80 -0
  61. package/dist/chunk-SH6F3CCG.js.map +1 -0
  62. package/dist/{chunk-EAC4CDY7.js → chunk-SMZGAPCU.js} +15 -2
  63. package/dist/chunk-SMZGAPCU.js.map +1 -0
  64. package/dist/{chunk-NNMLEDMD.js → chunk-TJK44RQC.js} +64 -11
  65. package/dist/chunk-TJK44RQC.js.map +1 -0
  66. package/dist/{chunk-6ZXOQEAN.js → chunk-WF75U3V4.js} +7 -1
  67. package/dist/chunk-WF75U3V4.js.map +1 -0
  68. package/dist/collapsible-panel.d.ts +18 -7
  69. package/dist/collapsible-panel.js +19 -3
  70. package/dist/collapsible-panel.js.map +1 -1
  71. package/dist/content-item.d.ts +40 -5
  72. package/dist/content-item.js +1 -1
  73. package/dist/disclosure-arrow.js +2 -1
  74. package/dist/grid.d.ts +5 -1
  75. package/dist/grid.js +1 -1
  76. package/dist/index.d.ts +3 -3
  77. package/dist/index.js +20 -20
  78. package/dist/list-action-row.js +1 -1
  79. package/dist/list-header.js +1 -1
  80. package/dist/list-item.js +1 -1
  81. package/dist/lucide-icon.d.ts +5 -2
  82. package/dist/lucide-icon.js +2 -1
  83. package/dist/nav-stack.js +2 -1
  84. package/dist/pane.d.ts +2 -1
  85. package/dist/pane.js +1 -1
  86. package/dist/{panel-toolbar-DqwtBxQL.d.ts → panel-toolbar-DDKh4uKd.d.ts} +11 -2
  87. package/dist/popup-menu-register.js +216 -3
  88. package/dist/popup-menu-register.js.map +1 -1
  89. package/dist/popup-menu.d.ts +4 -3
  90. package/dist/popup-menu.js +1 -1
  91. package/dist/select.js +1 -1
  92. package/dist/split-view.js +2 -1
  93. package/dist/split-view.js.map +1 -1
  94. package/dist/styles/catalog/components/catalog-example.css +4 -0
  95. package/dist/styles/chip.css +14 -0
  96. package/dist/styles/content-item.css +45 -0
  97. package/dist/styles/grid.css +7 -0
  98. package/dist/styles/list-action-row.css +4 -3
  99. package/dist/styles/list-header.css +4 -3
  100. package/dist/styles/list-item.css +21 -11
  101. package/dist/styles/lucide-icon.css +5 -0
  102. package/dist/styles/pane.css +3 -2
  103. package/dist/styles/popup-menu.css +24 -10
  104. package/dist/styles/segmented-control.css +3 -0
  105. package/dist/styles/select.css +11 -0
  106. package/dist/styles/sunken-panel.css +7 -0
  107. package/dist/styles/text.css +29 -0
  108. package/dist/styles/token-search-field.css +51 -11
  109. package/dist/styles/toolbar-control-group.css +49 -0
  110. package/dist/styles/workbench.css +130 -2
  111. package/dist/sunken-panel.d.ts +6 -1
  112. package/dist/sunken-panel.js +1 -1
  113. package/dist/text.d.ts +14 -3
  114. package/dist/text.js +1 -1
  115. package/dist/{token-search-field-DvgFLhLL.d.ts → token-search-field-Xk8jiw8Y.d.ts} +18 -4
  116. package/dist/token-search-field.d.ts +1 -1
  117. package/dist/token-search-field.js +2 -1
  118. package/dist/token-search-model.d.ts +1 -1
  119. package/dist/toolbar-control-group.d.ts +5 -1
  120. package/dist/toolbar-control-group.js +2 -1
  121. package/dist/toolbar.d.ts +5 -2
  122. package/dist/toolbar.js +1 -1
  123. package/dist/wire-catalog.js +1 -1
  124. package/dist/wire-content-items.d.ts +9 -0
  125. package/dist/wire-content-items.js +66 -0
  126. package/dist/wire-content-items.js.map +1 -0
  127. package/dist/wire-token-search-fields.d.ts +1 -1
  128. package/dist/wire-token-search-fields.js +2 -1
  129. package/dist/wire-workbench.d.ts +7 -0
  130. package/dist/wire-workbench.js +1 -1
  131. package/dist/workbench.d.ts +24 -8
  132. package/dist/workbench.js +2 -1
  133. package/docs/accessibility.md +30 -6
  134. package/docs/catalog.md +42 -2
  135. package/docs/collapsible-panel.md +8 -1
  136. package/docs/component-contract.md +43 -5
  137. package/docs/component-selection.md +46 -8
  138. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  139. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  140. package/docs/design/templates/toolbar-dark.svg +1 -1
  141. package/docs/design/templates/toolbar.svg +1 -1
  142. package/docs/examples/component-catalog-extension.json +6 -0
  143. package/docs/layout.md +56 -9
  144. package/docs/sunken-panel.md +22 -0
  145. package/docs/surface-scaffold.md +6 -3
  146. package/docs/ui-analyzer.md +4 -0
  147. package/docs/ux-demo.md +1 -0
  148. package/docs/workbench.md +42 -4
  149. package/llms.txt +9 -5
  150. package/package.json +16 -2
  151. package/scripts/component-catalog-extension-validation.mjs +28 -0
  152. package/dist/chunk-4R777DUZ.js +0 -34
  153. package/dist/chunk-4R777DUZ.js.map +0 -1
  154. package/dist/chunk-6ZXOQEAN.js.map +0 -1
  155. package/dist/chunk-7JUBXOIV.js.map +0 -1
  156. package/dist/chunk-A3CKOW2R.js.map +0 -1
  157. package/dist/chunk-AUKT3KMG.js.map +0 -1
  158. package/dist/chunk-EAC4CDY7.js.map +0 -1
  159. package/dist/chunk-ENGVYQPG.js.map +0 -1
  160. package/dist/chunk-MA73TA6D.js +0 -42
  161. package/dist/chunk-MA73TA6D.js.map +0 -1
  162. package/dist/chunk-N2DRU35S.js +0 -45
  163. package/dist/chunk-N2DRU35S.js.map +0 -1
  164. package/dist/chunk-NNMLEDMD.js.map +0 -1
  165. package/dist/chunk-OD2VXAPL.js.map +0 -1
  166. package/dist/chunk-RRB26JRJ.js.map +0 -1
  167. package/dist/chunk-UCKKT6KO.js.map +0 -1
  168. package/dist/chunk-VCBTX62E.js.map +0 -1
  169. package/dist/chunk-X6ADHJNI.js.map +0 -1
package/README.md CHANGED
@@ -342,6 +342,10 @@ guidance, public hooks, and explicit geometry ownership; then concatenate its
342
342
  identity alongside each input when ids could collide. This makes a combined
343
343
  tool reason about both sides of a composition using one vocabulary without
344
344
  pretending app-local components are `@kerfjs/ui` exports.
345
+ For a consumer UX demo, `@kerfjs/ui/catalog-projection` derives rows and
346
+ relationships from that extension; `kerf-catalog-demo --write` emits a typed
347
+ module and `--check` catches drift. See the [catalog guide](./docs/catalog.md)
348
+ for repository base and source path configuration.
345
349
 
346
350
  Composition-aware consumers use
347
351
  [`component-composition-extension.schema.json`](./ai/component-composition-extension.schema.json),
@@ -52,6 +52,14 @@
52
52
  "items": { "type": "string" },
53
53
  "uniqueItems": true
54
54
  },
55
+ "uses": {
56
+ "description": "Directly composed Kerf or consumer catalog entry ids.",
57
+ "type": "array",
58
+ "items": { "type": "string", "minLength": 1 },
59
+ "uniqueItems": true
60
+ },
61
+ "source": { "$ref": "#/$defs/repositoryPath" },
62
+ "demoSource": { "$ref": "#/$defs/repositoryPath" },
55
63
  "geometry": { "$ref": "#/$defs/geometry" },
56
64
  "documentation": { "type": "string", "minLength": 1 }
57
65
  },
@@ -74,6 +82,11 @@
74
82
  },
75
83
  "geometryOwner": {
76
84
  "enum": ["self", "parent", "child", "none", "conditional"]
85
+ },
86
+ "repositoryPath": {
87
+ "description": "A repository-relative POSIX path without traversal or empty segments.",
88
+ "type": "string",
89
+ "pattern": "^(?!.*(?:^|/)\\.{1,2}(?:/|$))[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$"
77
90
  }
78
91
  }
79
92
  }
@@ -1165,6 +1165,16 @@
1165
1165
  "import": "@kerfjs/ui/wire-workbench",
1166
1166
  "required": false,
1167
1167
  "stateAttributes": [
1168
+ {
1169
+ "name": "data-responsive-overlay-active",
1170
+ "on": "kui-workbench__rail and kui-workbench__drawer",
1171
+ "meaning": "Present while a panel's numeric responsiveOverlayAt threshold applies to the Workbench width; the same measurement drives overlay layout and collapsed-state transitions."
1172
+ },
1173
+ {
1174
+ "name": "data-numeric-overlays",
1175
+ "on": "kui-workbench",
1176
+ "meaning": "Space-separated left, right, drawer, rail-open, and open tokens mirror numeric overlay state for local CSS invalidation. Absent when no numeric overlay is active."
1177
+ },
1168
1178
  {
1169
1179
  "name": "data-handle-inset",
1170
1180
  "on": "kui-workbench__rail",
@@ -1206,7 +1216,8 @@
1206
1216
  "kui-workbench__panel-content",
1207
1217
  "kui-workbench__handle",
1208
1218
  "kui-workbench__handle-icon",
1209
- "kui-workbench__restore"
1219
+ "kui-workbench__restore",
1220
+ "kui-workbench__backdrop"
1210
1221
  ],
1211
1222
  "publicTokens": [
1212
1223
  "--kui-workbench-rail-width",
@@ -3102,7 +3113,7 @@
3102
3113
  "border": "self",
3103
3114
  "padding": "self",
3104
3115
  "notes": [
3105
- "Public resting background and border, hover border, and selected border tokens can be scoped to a row or its containing list without changing the default tones."
3116
+ "Public resting, hover, and selected text, fill, and border tokens can be scoped to a row or its containing list without changing the default tones."
3106
3117
  ]
3107
3118
  },
3108
3119
  "delivery": {
@@ -1091,6 +1091,18 @@
1091
1091
  "helpers": ["wireWorkbench", "wireScrollDividers"],
1092
1092
  "obligations": [],
1093
1093
  "stateAttributes": [
1094
+ {
1095
+ "name": "data-responsive-overlay-active",
1096
+ "on": "kui-workbench__rail and kui-workbench__drawer",
1097
+ "helper": "wireWorkbench",
1098
+ "meaning": "Present while a panel's numeric responsiveOverlayAt threshold applies to the Workbench width; the same measurement drives overlay layout and collapsed-state transitions."
1099
+ },
1100
+ {
1101
+ "name": "data-numeric-overlays",
1102
+ "on": "kui-workbench",
1103
+ "helper": "wireWorkbench",
1104
+ "meaning": "Space-separated left, right, drawer, rail-open, and open tokens mirror numeric overlay state for local CSS invalidation. Absent when no numeric overlay is active."
1105
+ },
1094
1106
  {
1095
1107
  "name": "data-handle-inset",
1096
1108
  "on": "kui-workbench__rail",
@@ -1152,7 +1164,8 @@
1152
1164
  "kui-workbench__panel-content",
1153
1165
  "kui-workbench__handle",
1154
1166
  "kui-workbench__handle-icon",
1155
- "kui-workbench__restore"
1167
+ "kui-workbench__restore",
1168
+ "kui-workbench__backdrop"
1156
1169
  ],
1157
1170
  "publicTokens": [
1158
1171
  "--kui-workbench-rail-width",
@@ -2538,7 +2551,7 @@
2538
2551
  "border": "self",
2539
2552
  "padding": "self",
2540
2553
  "notes": [
2541
- "Public resting background and border, hover border, and selected border tokens can be scoped to a row or its containing list without changing the default tones."
2554
+ "Public resting, hover, and selected text, fill, and border tokens can be scoped to a row or its containing list without changing the default tones."
2542
2555
  ]
2543
2556
  }
2544
2557
  },
@@ -69,7 +69,7 @@ No wiring helper.
69
69
 
70
70
  Margin: self · border: self · padding: self (layout role: navigation). `self` means the component already owns it — do not add wrapper padding, margin, or borders around it.
71
71
 
72
- - Public resting background and border, hover border, and selected border tokens can be scoped to a row or its containing list without changing the default tones.
72
+ - Public resting, hover, and selected text, fill, and border tokens can be scoped to a row or its containing list without changing the default tones.
73
73
 
74
74
  ## Accessibility
75
75
 
@@ -76,6 +76,8 @@ Zones (a zone is bound to JSX only through its listed prop; never assume the zon
76
76
 
77
77
  **Wiring-owned state attributes** — never render, remove, or branch on these as app state:
78
78
 
79
+ - `data-responsive-overlay-active` on `kui-workbench__rail and kui-workbench__drawer` (`wireWorkbench`): Present while a panel's numeric responsiveOverlayAt threshold applies to the Workbench width; the same measurement drives overlay layout and collapsed-state transitions.
80
+ - `data-numeric-overlays` on `kui-workbench` (`wireWorkbench`): Space-separated left, right, drawer, rail-open, and open tokens mirror numeric overlay state for local CSS invalidation. Absent when no numeric overlay is active.
79
81
  - `data-handle-inset` on `kui-workbench__rail` (`wireWorkbench`): Written by the shared resize wiring when the work-area minimum or a parent clamp holds a rail's maximum near its size. It carries no Workbench styling; the Workbench handle stays at the rail's inner edge.
80
82
  - `data-resizing` on `kui-workbench__rail` (`wireWorkbench`): Present on a resizable rail or the drawer while a pointer drag resizes it.
81
83
  - `data-scroll-overflow` on `kui-pane__content of each panel and work-area Pane` (`wireScrollDividers`): The physical edges, in canonical t/r/b/l order, beyond which content is scrolled out of view; absent when nothing is hidden (content that fits never reports its far edges). Re-applied if a re-render drops it.
@@ -99,9 +101,9 @@ Margin: none · border: self · padding: child (layout role: structure). `self`
99
101
 
100
102
  The component owns its own styles. Configure it through its props and variants; do not override its internals.
101
103
 
102
- Public class hooks (select for layout placement only, never to change the component's look): `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore`.
104
+ Public class hooks (select for layout placement only, never to change the component's look): `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore`, `kui-workbench__backdrop`.
103
105
 
104
- Never put `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore` on an element you write; render `Workbench` instead (`KUI-L103`).
106
+ Never put `kui-workbench`, `kui-workbench__rail`, `kui-workbench__rail--left`, `kui-workbench__rail--right`, `kui-workbench__drawer`, `kui-workbench__center`, `kui-workbench__main`, `kui-workbench__panel-content`, `kui-workbench__handle`, `kui-workbench__handle-icon`, `kui-workbench__restore`, `kui-workbench__backdrop` on an element you write; render `Workbench` instead (`KUI-L103`).
105
107
 
106
108
  Public tokens it reads: `--kui-workbench-rail-width`, `--kui-workbench-drawer-height`, `--kui-workbench-popup-z`, `--kui-workbench-overlay-z`, `--kui-workbench-overlay-max-width`, `--kui-workbench-overlay-max-height`, `--kui-workbench-restore-inset`, `--kui-workbench-restore-z`, `--kui-workbench-overlay-dismiss-margin`. Set a token only where its public contract allows; prefer a prop.
107
109