@kerfjs/ui 5.0.0-beta.17 → 5.0.0-beta.21

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 (274) hide show
  1. package/README.md +221 -81
  2. package/ai/application-ui-diagnostic-ids-v1.json +92 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +41 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +25 -0
  10. package/ai/catalog-authoring.schema.json +61 -0
  11. package/ai/compile-time-contracts-v1.json +101 -0
  12. package/ai/compile-time-contracts-v1.schema.json +49 -0
  13. package/ai/component-catalog-extension-v2.d.ts +7 -0
  14. package/ai/component-catalog-extension-v2.schema.json +7 -0
  15. package/ai/component-catalog-extension.schema.json +79 -0
  16. package/ai/component-catalog-v2-overrides.json +326 -0
  17. package/ai/component-catalog-v2.d.ts +67 -0
  18. package/ai/component-catalog-v2.json +4441 -0
  19. package/ai/component-catalog-v2.schema.json +246 -0
  20. package/ai/component-catalog.json +649 -6
  21. package/ai/component-catalog.schema.json +15 -0
  22. package/ai/public-api-signatures-v1.md +357 -91
  23. package/ai/skill.md +95 -50
  24. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  25. package/analyzer/cli.mjs +46 -0
  26. package/analyzer/index.d.mts +45 -0
  27. package/analyzer/index.mjs +743 -0
  28. package/analyzer/report.schema.json +66 -0
  29. package/dist/app-tab.d.ts +1 -1
  30. package/dist/app-tab.js +1 -1
  31. package/dist/browser/pane.js +3 -0
  32. package/dist/browser/sunken-panel.js +3 -0
  33. package/dist/catalog-resources.d.ts +34 -0
  34. package/dist/catalog-resources.js +22 -0
  35. package/dist/catalog-resources.js.map +1 -0
  36. package/dist/catalog.d.ts +29 -4
  37. package/dist/catalog.js +302 -84
  38. package/dist/catalog.js.map +1 -1
  39. package/dist/chunk-5VTB2BKP.js +35 -0
  40. package/dist/chunk-5VTB2BKP.js.map +1 -0
  41. package/dist/chunk-6WTETUZ6.js +21 -0
  42. package/dist/chunk-6WTETUZ6.js.map +1 -0
  43. package/dist/chunk-7KEUJIIC.js +218 -0
  44. package/dist/chunk-7KEUJIIC.js.map +1 -0
  45. package/dist/chunk-7L6EHUMV.js +31 -0
  46. package/dist/chunk-7L6EHUMV.js.map +1 -0
  47. package/dist/{chunk-XXMOARTH.js → chunk-AASLYRGE.js} +57 -16
  48. package/dist/chunk-AASLYRGE.js.map +1 -0
  49. package/dist/chunk-BBRXX6PF.js +108 -0
  50. package/dist/chunk-BBRXX6PF.js.map +1 -0
  51. package/dist/{chunk-6NLRBSVX.js → chunk-CN2XNTAM.js} +129 -72
  52. package/dist/chunk-CN2XNTAM.js.map +1 -0
  53. package/dist/chunk-DPDBVKNA.js +113 -0
  54. package/dist/chunk-DPDBVKNA.js.map +1 -0
  55. package/dist/chunk-DSNIYOZ3.js +114 -0
  56. package/dist/chunk-DSNIYOZ3.js.map +1 -0
  57. package/dist/chunk-ELSJX4W7.js +68 -0
  58. package/dist/chunk-ELSJX4W7.js.map +1 -0
  59. package/dist/{chunk-AHQI52QO.js → chunk-FEY65TBV.js} +6 -2
  60. package/dist/chunk-FEY65TBV.js.map +1 -0
  61. package/dist/chunk-JRKSK2HX.js +79 -0
  62. package/dist/chunk-JRKSK2HX.js.map +1 -0
  63. package/dist/chunk-K57KRAOV.js +117 -0
  64. package/dist/chunk-K57KRAOV.js.map +1 -0
  65. package/dist/chunk-LPOMRC4C.js +25 -0
  66. package/dist/chunk-LPOMRC4C.js.map +1 -0
  67. package/dist/chunk-M7JBER5U.js +41 -0
  68. package/dist/chunk-M7JBER5U.js.map +1 -0
  69. package/dist/chunk-NENBUYX5.js +79 -0
  70. package/dist/chunk-NENBUYX5.js.map +1 -0
  71. package/dist/chunk-OHU6CI22.js +83 -0
  72. package/dist/chunk-OHU6CI22.js.map +1 -0
  73. package/dist/{chunk-YGN7OMLT.js → chunk-OZWU5ZPZ.js} +2 -2
  74. package/dist/chunk-OZWU5ZPZ.js.map +1 -0
  75. package/dist/chunk-PIDTEQ3U.js +105 -0
  76. package/dist/chunk-PIDTEQ3U.js.map +1 -0
  77. package/dist/chunk-PX3YSS5C.js +32 -0
  78. package/dist/chunk-PX3YSS5C.js.map +1 -0
  79. package/dist/chunk-PZQVSDLH.js +61 -0
  80. package/dist/chunk-PZQVSDLH.js.map +1 -0
  81. package/dist/chunk-QO55FN2Y.js +20 -0
  82. package/dist/chunk-QO55FN2Y.js.map +1 -0
  83. package/dist/chunk-QQFJMRIB.js +45 -0
  84. package/dist/chunk-QQFJMRIB.js.map +1 -0
  85. package/dist/chunk-RYRIFZCT.js +58 -0
  86. package/dist/chunk-RYRIFZCT.js.map +1 -0
  87. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  88. package/dist/chunk-SRSJO5QE.js.map +1 -0
  89. package/dist/chunk-VLYV65LK.js +38 -0
  90. package/dist/chunk-VLYV65LK.js.map +1 -0
  91. package/dist/chunk-W4CXQYSG.js +23 -0
  92. package/dist/chunk-W4CXQYSG.js.map +1 -0
  93. package/dist/{chunk-WXMGNX2Y.js → chunk-W7YD6E4N.js} +2 -2
  94. package/dist/chunk-W7YD6E4N.js.map +1 -0
  95. package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
  96. package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
  97. package/dist/collapsible-panel.d.ts +2 -2
  98. package/dist/collapsible-panel.js +47 -6
  99. package/dist/collapsible-panel.js.map +1 -1
  100. package/dist/device-class.js +33 -5
  101. package/dist/device-class.js.map +1 -1
  102. package/dist/disclosure-arrow.js +1 -1
  103. package/dist/empty-state.d.ts +1 -1
  104. package/dist/empty-state.js +1 -1
  105. package/dist/floating-toolbar.d.ts +1 -1
  106. package/dist/floating-toolbar.js +1 -1
  107. package/dist/index.d.ts +6 -4
  108. package/dist/index.js +27 -25
  109. package/dist/list-action-row.d.ts +1 -1
  110. package/dist/list-action-row.js +1 -1
  111. package/dist/list-header.d.ts +30 -9
  112. package/dist/list-header.js +1 -1
  113. package/dist/list-inset-control.d.ts +1 -1
  114. package/dist/list-inset-control.js +1 -1
  115. package/dist/list-inset-text.d.ts +1 -1
  116. package/dist/list-inset-text.js +1 -1
  117. package/dist/list-item.d.ts +1 -1
  118. package/dist/list-item.js +1 -1
  119. package/dist/loading-spinner.js +1 -1
  120. package/dist/nav-stack.d.ts +1 -1
  121. package/dist/nav-stack.js +1 -1
  122. package/dist/pane.d.ts +49 -0
  123. package/dist/pane.js +4 -0
  124. package/dist/pane.js.map +1 -0
  125. package/dist/panel-header.d.ts +10 -4
  126. package/dist/panel-header.js +1 -1
  127. package/dist/resizable-region.d.ts +1 -1
  128. package/dist/resizable-region.js +1 -1
  129. package/dist/segmented-control.d.ts +6 -6
  130. package/dist/segmented-control.js +1 -1
  131. package/dist/select.d.ts +11 -5
  132. package/dist/select.js +1 -1
  133. package/dist/skeleton.d.ts +1 -1
  134. package/dist/skeleton.js +1 -1
  135. package/dist/split-view.d.ts +1 -1
  136. package/dist/split-view.js +70 -10
  137. package/dist/split-view.js.map +1 -1
  138. package/dist/state-banner.d.ts +4 -3
  139. package/dist/state-banner.js +1 -1
  140. package/dist/styles/catalog.css +32 -6
  141. package/dist/styles/layout.css +2 -20
  142. package/dist/styles/pane.css +62 -0
  143. package/dist/styles/segmented-control.css +3 -7
  144. package/dist/styles/sunken-panel.css +18 -0
  145. package/dist/sunken-panel.d.ts +16 -0
  146. package/dist/sunken-panel.js +3 -0
  147. package/dist/sunken-panel.js.map +1 -0
  148. package/dist/tab-bar.d.ts +4 -3
  149. package/dist/tab-bar.js +1 -1
  150. package/dist/tab-scaffold.d.ts +6 -6
  151. package/dist/tab-scaffold.js +43 -8
  152. package/dist/tab-scaffold.js.map +1 -1
  153. package/dist/token-search-field.d.ts +25 -9
  154. package/dist/token-search-field.js +1 -1
  155. package/dist/toolbar-control-group.d.ts +10 -6
  156. package/dist/toolbar-control-group.js +1 -1
  157. package/dist/toolbar-text.d.ts +10 -11
  158. package/dist/toolbar-text.js +1 -1
  159. package/dist/toolbar.d.ts +1 -1
  160. package/dist/toolbar.js +1 -1
  161. package/dist/value-table.d.ts +2 -2
  162. package/dist/value-table.js +1 -1
  163. package/dist/wire-catalog.d.ts +31 -2
  164. package/dist/wire-catalog.js +203 -8
  165. package/dist/wire-catalog.js.map +1 -1
  166. package/dist/wire-nav-stack.js +22 -7
  167. package/dist/wire-nav-stack.js.map +1 -1
  168. package/dist/wire-resizable-regions.d.ts +1 -1
  169. package/dist/wire-resizable-regions.js +1 -1
  170. package/dist/wire-sidebar.js +52 -41
  171. package/dist/wire-sidebar.js.map +1 -1
  172. package/dist/wire-tab-bars.d.ts +5 -2
  173. package/dist/wire-tab-bars.js +1 -1
  174. package/dist/wire-tab-scaffold.js +9 -4
  175. package/dist/wire-tab-scaffold.js.map +1 -1
  176. package/dist/wire-token-search-fields.d.ts +12 -7
  177. package/dist/wire-token-search-fields.js +1 -1
  178. package/dist/workbench.d.ts +1 -1
  179. package/dist/workbench.js +56 -9
  180. package/dist/workbench.js.map +1 -1
  181. package/docs/app-layouts.md +7 -7
  182. package/docs/catalog.md +249 -46
  183. package/docs/collapsible-panel.md +38 -11
  184. package/docs/component-contract.md +132 -7
  185. package/docs/component-selection.md +79 -67
  186. package/docs/design/templates.md +1 -1
  187. package/docs/design-philosophy.md +7 -9
  188. package/docs/device-class.md +8 -8
  189. package/docs/examples/application-ui-profile.json +60 -0
  190. package/docs/examples/command-palette-adapter.tsx +67 -17
  191. package/docs/examples/component-catalog-extension-v2.json +81 -0
  192. package/docs/examples/component-catalog-extension.json +45 -0
  193. package/docs/layout.md +51 -32
  194. package/docs/nav-stack.md +15 -6
  195. package/docs/recipes.md +4 -4
  196. package/docs/split-view.md +3 -3
  197. package/docs/sunken-panel.md +43 -0
  198. package/docs/tab-scaffold.md +16 -7
  199. package/docs/type-contracts.md +99 -0
  200. package/docs/ui-analyzer.md +81 -0
  201. package/docs/ui-doctor.md +77 -0
  202. package/docs/ui-evaluator.md +122 -0
  203. package/docs/webawesome-theme.md +8 -8
  204. package/docs/workbench.md +18 -5
  205. package/doctor/cli.mjs +115 -0
  206. package/doctor/config.schema.json +68 -0
  207. package/doctor/index.d.mts +116 -0
  208. package/doctor/index.mjs +1256 -0
  209. package/doctor/report.schema.json +118 -0
  210. package/evaluator/cli.mjs +89 -0
  211. package/evaluator/index.d.mts +90 -0
  212. package/evaluator/index.mjs +1138 -0
  213. package/evaluator/report.schema.json +152 -0
  214. package/llms.txt +58 -15
  215. package/package.json +70 -10
  216. package/ux-demo/recipes/app-shell.tsx +206 -10
  217. package/ux-demo/recipes/collapsible-sidebar.tsx +167 -44
  218. package/ux-demo/recipes/compact-toolbar.tsx +114 -12
  219. package/ux-demo/recipes/composer-form.tsx +106 -18
  220. package/ux-demo/recipes/list-detail-dialog.tsx +144 -8
  221. package/ux-demo/recipes/list-workspace-states.tsx +165 -8
  222. package/ux-demo/recipes/loaders.ts +5 -2
  223. package/ux-demo/recipes/loading-inspector.tsx +124 -41
  224. package/ux-demo/recipes/mount-recipe.ts +27 -6
  225. package/ux-demo/recipes/navigation-sidebar.tsx +120 -9
  226. package/ux-demo/recipes/navigation-stack.tsx +61 -19
  227. package/ux-demo/recipes/types.ts +3 -1
  228. package/ux-demo/recipes/workspace-header.tsx +57 -2
  229. package/dist/chunk-2Z5TWHKQ.js +0 -34
  230. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  231. package/dist/chunk-37T3VNIZ.js +0 -19
  232. package/dist/chunk-37T3VNIZ.js.map +0 -1
  233. package/dist/chunk-55DATV3A.js +0 -10
  234. package/dist/chunk-55DATV3A.js.map +0 -1
  235. package/dist/chunk-5ATCDSQS.js +0 -42
  236. package/dist/chunk-5ATCDSQS.js.map +0 -1
  237. package/dist/chunk-5E2HVJ33.js +0 -10
  238. package/dist/chunk-5E2HVJ33.js.map +0 -1
  239. package/dist/chunk-6NLRBSVX.js.map +0 -1
  240. package/dist/chunk-7BR3DO2A.js.map +0 -1
  241. package/dist/chunk-7JB7VPRI.js +0 -34
  242. package/dist/chunk-7JB7VPRI.js.map +0 -1
  243. package/dist/chunk-7LDCTU7D.js +0 -134
  244. package/dist/chunk-7LDCTU7D.js.map +0 -1
  245. package/dist/chunk-AHQI52QO.js.map +0 -1
  246. package/dist/chunk-AQNKJRFH.js +0 -79
  247. package/dist/chunk-AQNKJRFH.js.map +0 -1
  248. package/dist/chunk-AVZHJN6C.js +0 -14
  249. package/dist/chunk-AVZHJN6C.js.map +0 -1
  250. package/dist/chunk-B24C4A6T.js +0 -22
  251. package/dist/chunk-B24C4A6T.js.map +0 -1
  252. package/dist/chunk-CH4SQ6H5.js +0 -39
  253. package/dist/chunk-CH4SQ6H5.js.map +0 -1
  254. package/dist/chunk-DAFFDO33.js +0 -14
  255. package/dist/chunk-DAFFDO33.js.map +0 -1
  256. package/dist/chunk-I7INRJO4.js +0 -17
  257. package/dist/chunk-I7INRJO4.js.map +0 -1
  258. package/dist/chunk-L4OKFDJY.js +0 -24
  259. package/dist/chunk-L4OKFDJY.js.map +0 -1
  260. package/dist/chunk-M5JRI6MN.js +0 -27
  261. package/dist/chunk-M5JRI6MN.js.map +0 -1
  262. package/dist/chunk-RNPGFQ33.js +0 -10
  263. package/dist/chunk-RNPGFQ33.js.map +0 -1
  264. package/dist/chunk-VPCTCUED.js +0 -10
  265. package/dist/chunk-VPCTCUED.js.map +0 -1
  266. package/dist/chunk-WRTAQ7BZ.js +0 -23
  267. package/dist/chunk-WRTAQ7BZ.js.map +0 -1
  268. package/dist/chunk-WVPYVDXY.js +0 -15
  269. package/dist/chunk-WVPYVDXY.js.map +0 -1
  270. package/dist/chunk-WXMGNX2Y.js.map +0 -1
  271. package/dist/chunk-XXMOARTH.js.map +0 -1
  272. package/dist/chunk-YGN7OMLT.js.map +0 -1
  273. package/dist/chunk-ZQQ6P4SV.js +0 -20
  274. package/dist/chunk-ZQQ6P4SV.js.map +0 -1
@@ -0,0 +1,326 @@
1
+ {
2
+ "@kerfjs/ui:toolbar": {
3
+ "_source": "docs/component-selection.md#toolbar-composition",
4
+ "contexts": ["application-chrome", "panel-header"],
5
+ "zones": [
6
+ {
7
+ "id": "leading",
8
+ "accepts": ["toolbar-text", "toolbar-control-group"],
9
+ "cardinality": { "min": 0, "max": "unbounded" },
10
+ "exclusiveWith": []
11
+ },
12
+ {
13
+ "id": "center",
14
+ "accepts": ["toolbar-text", "toolbar-control-group"],
15
+ "cardinality": { "min": 0, "max": "unbounded" },
16
+ "exclusiveWith": []
17
+ },
18
+ {
19
+ "id": "trailing",
20
+ "accepts": ["toolbar-text", "toolbar-control-group"],
21
+ "cardinality": { "min": 0, "max": "unbounded" },
22
+ "exclusiveWith": []
23
+ }
24
+ ],
25
+ "children": {
26
+ "mode": "listed",
27
+ "concepts": ["toolbar-text", "toolbar-control-group"],
28
+ "requiredConcepts": []
29
+ },
30
+ "diagnostics": [
31
+ {
32
+ "id": "KUI-C101",
33
+ "severity": "error",
34
+ "when": "a direct zone child is neither ToolbarText nor ToolbarControlGroup",
35
+ "message": "Wrap toolbar controls in ToolbarControlGroup; only ToolbarText and ToolbarControlGroup are direct zone children."
36
+ }
37
+ ]
38
+ },
39
+ "@kerfjs/ui:toolbar-control-group": {
40
+ "_source": "docs/component-selection.md#toolbar-composition",
41
+ "parents": {
42
+ "mode": "listed",
43
+ "entries": ["@kerfjs/ui:toolbar", "@kerfjs/ui:panel-header"]
44
+ },
45
+ "contexts": ["toolbar-zone"],
46
+ "zones": [
47
+ {
48
+ "id": "controls",
49
+ "accepts": ["control"],
50
+ "cardinality": { "min": 1, "max": "unbounded" },
51
+ "exclusiveWith": []
52
+ }
53
+ ],
54
+ "children": {
55
+ "mode": "listed",
56
+ "concepts": ["control"],
57
+ "requiredConcepts": ["control"]
58
+ }
59
+ },
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
+ "@kerfjs/ui:list": {
96
+ "_source": "docs/component-selection.md#correct-composition-and-duplicated-markup-trap",
97
+ "contexts": ["navigation-list"],
98
+ "children": {
99
+ "mode": "listed",
100
+ "concepts": ["list-header", "list-item", "list-action-row"],
101
+ "requiredConcepts": []
102
+ },
103
+ "zones": [
104
+ {
105
+ "id": "rows",
106
+ "accepts": ["list-header", "list-item", "list-action-row"],
107
+ "cardinality": { "min": 1, "max": "unbounded" },
108
+ "exclusiveWith": []
109
+ }
110
+ ]
111
+ },
112
+ "@kerfjs/ui:list-header": {
113
+ "_source": "docs/accessibility.md#shared-rules",
114
+ "contexts": ["navigation-list"],
115
+ "state": [{ "id": "expanded", "owner": "controlled", "required": false }],
116
+ "accessibility": {
117
+ "obligations": [
118
+ "When toggle mode is used, the application reveals matching content and keeps expanded state synchronized.",
119
+ "The owning control retains a stable accessible name."
120
+ ]
121
+ },
122
+ "diagnostics": [
123
+ {
124
+ "id": "KUI-C103",
125
+ "severity": "error",
126
+ "when": "toggle mode does not reveal matching controlled content",
127
+ "message": "ListHeader expanded state must match real revealed content."
128
+ }
129
+ ]
130
+ },
131
+ "@kerfjs/ui:tab-bar": {
132
+ "_source": "docs/accessibility.md#tabs",
133
+ "contexts": ["tabpanel-navigation"],
134
+ "children": {
135
+ "mode": "listed",
136
+ "concepts": ["app-tab"],
137
+ "requiredConcepts": ["app-tab"]
138
+ },
139
+ "zones": [
140
+ {
141
+ "id": "tabs",
142
+ "accepts": ["app-tab"],
143
+ "cardinality": { "min": 1, "max": "unbounded" },
144
+ "exclusiveWith": []
145
+ }
146
+ ],
147
+ "state": [
148
+ { "id": "selected-tab", "owner": "controlled", "required": true }
149
+ ],
150
+ "wiring": {
151
+ "required": true,
152
+ "helpers": ["wireTabBars"],
153
+ "obligations": [
154
+ "Retain and invoke the disposer.",
155
+ "Apply onReorder to application-owned order."
156
+ ]
157
+ },
158
+ "accessibility": {
159
+ "obligations": [
160
+ "Each tab controls a matching tabpanel.",
161
+ "Selection and focus behavior follow the configured activation mode."
162
+ ]
163
+ },
164
+ "diagnostics": [
165
+ {
166
+ "id": "KUI-C104",
167
+ "severity": "error",
168
+ "when": "wireTabBars is absent",
169
+ "message": "TabBar requires wireTabBars for keyboard and reorder behavior."
170
+ }
171
+ ]
172
+ },
173
+ "@kerfjs/ui:segmented-control": {
174
+ "_source": "docs/accessibility.md#segmentedcontrol",
175
+ "contexts": ["compact-exclusive-choice"],
176
+ "state": [{ "id": "value", "owner": "controlled", "required": true }],
177
+ "accessibility": {
178
+ "obligations": [
179
+ "Every enabled choice remains in sequential tab order.",
180
+ "Every choice has a meaningful label."
181
+ ]
182
+ }
183
+ },
184
+ "@kerfjs/ui:token-search-field": {
185
+ "_source": "docs/accessibility.md#tokensearchfield",
186
+ "contexts": ["structured-search-editor"],
187
+ "state": [
188
+ { "id": "tokens", "owner": "controlled", "required": true },
189
+ { "id": "text", "owner": "component", "required": true },
190
+ { "id": "expanded", "owner": "controlled", "required": false }
191
+ ],
192
+ "wiring": {
193
+ "required": true,
194
+ "helpers": ["wireTokenSearchFields"],
195
+ "obligations": [
196
+ "Retain and invoke the disposer.",
197
+ "Use readTokenSearchField for DOM-owned text."
198
+ ]
199
+ },
200
+ "diagnostics": [
201
+ {
202
+ "id": "KUI-C105",
203
+ "severity": "error",
204
+ "when": "wireTokenSearchFields is absent",
205
+ "message": "TokenSearchField requires its public wiring helper for keyboard and collapsible behavior."
206
+ }
207
+ ]
208
+ },
209
+ "@kerfjs/ui:resize": {
210
+ "_source": "docs/accessibility.md#resizableregion",
211
+ "contexts": ["adjustable-pane-boundary"],
212
+ "state": [{ "id": "size", "owner": "controlled", "required": true }],
213
+ "wiring": {
214
+ "required": true,
215
+ "helpers": ["wireResizableRegions"],
216
+ "obligations": [
217
+ "Retain and invoke the disposer.",
218
+ "Persist committed size in the application when persistence is required."
219
+ ]
220
+ },
221
+ "diagnostics": [
222
+ {
223
+ "id": "KUI-C106",
224
+ "severity": "error",
225
+ "when": "wireResizableRegions is absent",
226
+ "message": "ResizableRegion requires wireResizableRegions for pointer and keyboard operation."
227
+ }
228
+ ]
229
+ },
230
+ "@kerfjs/ui:select": {
231
+ "_source": "README.md#web-awesome-theme",
232
+ "contexts": ["controlled-value-selection"],
233
+ "state": [{ "id": "value", "owner": "controlled", "required": true }],
234
+ "wiring": {
235
+ "required": true,
236
+ "helpers": ["@kerfjs/ui/select/register"],
237
+ "obligations": ["Import the registration module once in the application."]
238
+ },
239
+ "diagnostics": [
240
+ {
241
+ "id": "KUI-C107",
242
+ "severity": "error",
243
+ "when": "the registration import is absent",
244
+ "message": "Select requires @kerfjs/ui/select/register once per application."
245
+ }
246
+ ]
247
+ },
248
+ "@kerfjs/ui:wa-accordion": {
249
+ "_source": "docs/webawesome-theme.md#coverage",
250
+ "children": {
251
+ "mode": "listed",
252
+ "concepts": ["wa-accordion-item"],
253
+ "requiredConcepts": ["wa-accordion-item"]
254
+ },
255
+ "zones": [
256
+ {
257
+ "id": "items",
258
+ "accepts": ["wa-accordion-item"],
259
+ "cardinality": { "min": 1, "max": "unbounded" },
260
+ "exclusiveWith": []
261
+ }
262
+ ]
263
+ },
264
+ "@kerfjs/ui:wa-radio-group": {
265
+ "_source": "docs/webawesome-theme.md#coverage",
266
+ "children": {
267
+ "mode": "listed",
268
+ "concepts": ["wa-radio"],
269
+ "requiredConcepts": ["wa-radio"]
270
+ },
271
+ "zones": [
272
+ {
273
+ "id": "options",
274
+ "accepts": ["wa-radio"],
275
+ "cardinality": { "min": 1, "max": "unbounded" },
276
+ "exclusiveWith": []
277
+ }
278
+ ]
279
+ },
280
+ "@kerfjs/ui:wa-select": {
281
+ "_source": "docs/webawesome-theme.md#coverage",
282
+ "children": {
283
+ "mode": "listed",
284
+ "concepts": ["wa-option"],
285
+ "requiredConcepts": ["wa-option"]
286
+ },
287
+ "zones": [
288
+ {
289
+ "id": "options",
290
+ "accepts": ["wa-option"],
291
+ "cardinality": { "min": 1, "max": "unbounded" },
292
+ "exclusiveWith": []
293
+ }
294
+ ]
295
+ },
296
+ "@kerfjs/ui:wa-tab-group": {
297
+ "_source": "docs/webawesome-theme.md#coverage",
298
+ "children": {
299
+ "mode": "listed",
300
+ "concepts": ["wa-tab", "wa-tab-panel"],
301
+ "requiredConcepts": ["wa-tab", "wa-tab-panel"]
302
+ },
303
+ "zones": [
304
+ {
305
+ "id": "tabs",
306
+ "accepts": ["wa-tab"],
307
+ "cardinality": { "min": 1, "max": "unbounded" },
308
+ "exclusiveWith": []
309
+ },
310
+ {
311
+ "id": "panels",
312
+ "accepts": ["wa-tab-panel"],
313
+ "cardinality": { "min": 1, "max": "unbounded" },
314
+ "exclusiveWith": []
315
+ }
316
+ ],
317
+ "diagnostics": [
318
+ {
319
+ "id": "KUI-C108",
320
+ "severity": "error",
321
+ "when": "tab and panel name sets differ",
322
+ "message": "Every wa-tab must identify a matching wa-tab-panel and vice versa."
323
+ }
324
+ ]
325
+ }
326
+ }
@@ -0,0 +1,67 @@
1
+ export type CatalogQualifiedKey = `${string}:${string}`;
2
+ export type CatalogCardinality = {
3
+ min: number;
4
+ max: number | 'unbounded';
5
+ };
6
+ export type CatalogDiagnostic = {
7
+ id: `KUI-C${number}`;
8
+ severity: 'error' | 'warning';
9
+ when: string;
10
+ message: string;
11
+ };
12
+ export interface CatalogCompositionEntryV2 {
13
+ key: CatalogQualifiedKey;
14
+ package: string;
15
+ id: string;
16
+ name: string;
17
+ kind: 'component' | 'composition' | 'recipe';
18
+ purpose?: string;
19
+ publicExports?: Array<{ name: string; subpath: string }>;
20
+ sourceLinks?: string[];
21
+ source: string;
22
+ parents: { mode: 'any' | 'root' | 'listed'; entries: CatalogQualifiedKey[] };
23
+ contexts: string[];
24
+ zones: Array<{
25
+ id: string;
26
+ accepts: string[];
27
+ cardinality: CatalogCardinality;
28
+ exclusiveWith: string[];
29
+ }>;
30
+ children: {
31
+ mode: 'any' | 'none' | 'listed';
32
+ concepts: string[];
33
+ requiredConcepts: string[];
34
+ };
35
+ state: Array<{
36
+ id: string;
37
+ owner: 'application' | 'controlled' | 'component';
38
+ required: boolean;
39
+ }>;
40
+ wiring: { required: boolean; helpers: string[]; obligations: string[] };
41
+ responsive: {
42
+ owner: 'application' | 'component' | 'shared' | 'not-applicable';
43
+ behaviors: string[];
44
+ };
45
+ layout: {
46
+ roles: string[];
47
+ geometry: Record<
48
+ 'margin' | 'border' | 'padding',
49
+ 'self' | 'parent' | 'child' | 'none' | 'conditional' | 'composed'
50
+ > & { notes?: string[] };
51
+ };
52
+ accessibility: { obligations: string[] };
53
+ boundaries: {
54
+ rootClass: string | null;
55
+ publicClasses: string[];
56
+ publicTokens: string[];
57
+ };
58
+ diagnostics: CatalogDiagnostic[];
59
+ provenance: { selection: string; composition: string };
60
+ }
61
+ export interface ComponentCatalogV2 {
62
+ $schema?: string;
63
+ schemaVersion: 2;
64
+ package: string;
65
+ compatibility: { v1Catalog: string; identity: 'package:id' };
66
+ entries: CatalogCompositionEntryV2[];
67
+ }