@kerfjs/ui 5.0.0-beta.7 → 5.0.0-beta.71

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 (723) hide show
  1. package/README.md +501 -139
  2. package/ai/application-ui-diagnostic-ids-v1.json +109 -0
  3. package/ai/application-ui-profile-sync.cjs +548 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +106 -0
  6. package/ai/application-ui-profile.defaults.json +96 -0
  7. package/ai/application-ui-profile.mjs +653 -0
  8. package/ai/application-ui-profile.schema.json +140 -0
  9. package/ai/catalog-authoring.json +36 -0
  10. package/ai/catalog-authoring.schema.json +109 -0
  11. package/ai/compile-time-contracts-v1.json +149 -0
  12. package/ai/compile-time-contracts-v1.schema.json +52 -0
  13. package/ai/component-catalog-extension.schema.json +104 -0
  14. package/ai/component-catalog.json +3905 -446
  15. package/ai/component-catalog.schema.json +94 -1
  16. package/ai/component-class-owners.cjs +83 -0
  17. package/ai/component-composition-extension.d.ts +7 -0
  18. package/ai/component-composition-extension.schema.json +7 -0
  19. package/ai/component-composition-rules.json +524 -0
  20. package/ai/component-composition.d.ts +129 -0
  21. package/ai/component-composition.json +7140 -0
  22. package/ai/component-composition.schema.json +408 -0
  23. package/ai/components/README.md +171 -0
  24. package/ai/components/application-tabs.md +65 -0
  25. package/ai/components/badge.md +72 -0
  26. package/ai/components/chip.md +72 -0
  27. package/ai/components/collapsible-panel.md +102 -0
  28. package/ai/components/content-item.md +93 -0
  29. package/ai/components/disclosure-arrow.md +77 -0
  30. package/ai/components/document-baseline.md +75 -0
  31. package/ai/components/empty-state.md +80 -0
  32. package/ai/components/feedback.md +71 -0
  33. package/ai/components/floating-toolbar.md +82 -0
  34. package/ai/components/foundation.md +65 -0
  35. package/ai/components/grid.md +98 -0
  36. package/ai/components/headers.md +63 -0
  37. package/ai/components/layout.md +75 -0
  38. package/ai/components/list-action-row.md +91 -0
  39. package/ai/components/list-header.md +89 -0
  40. package/ai/components/list-inset-control.md +74 -0
  41. package/ai/components/list-inset-text.md +72 -0
  42. package/ai/components/list-item.md +94 -0
  43. package/ai/components/list.md +105 -0
  44. package/ai/components/loading-spinner.md +73 -0
  45. package/ai/components/lucide-icon.md +78 -0
  46. package/ai/components/nav-stack.md +104 -0
  47. package/ai/components/pane.md +101 -0
  48. package/ai/components/popup-menu.md +171 -0
  49. package/ai/components/recipe-app-shell.md +57 -0
  50. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  51. package/ai/components/recipe-compact-toolbar.md +57 -0
  52. package/ai/components/recipe-composer-form.md +57 -0
  53. package/ai/components/recipe-list-detail-dialog.md +57 -0
  54. package/ai/components/recipe-list-workspace-states.md +57 -0
  55. package/ai/components/recipe-loading-inspector.md +57 -0
  56. package/ai/components/recipe-navigation-sidebar.md +57 -0
  57. package/ai/components/recipe-navigation-stack.md +57 -0
  58. package/ai/components/recipe-workspace-header.md +57 -0
  59. package/ai/components/resize.md +106 -0
  60. package/ai/components/row.md +96 -0
  61. package/ai/components/segmented-control.md +82 -0
  62. package/ai/components/select.md +113 -0
  63. package/ai/components/skeleton.md +84 -0
  64. package/ai/components/spacer.md +86 -0
  65. package/ai/components/split-view.md +102 -0
  66. package/ai/components/state-banner.md +94 -0
  67. package/ai/components/sunken-panel.md +79 -0
  68. package/ai/components/surface-scaffold.md +78 -0
  69. package/ai/components/tab-bar.md +113 -0
  70. package/ai/components/tab-scaffold.md +94 -0
  71. package/ai/components/tabs.md +95 -0
  72. package/ai/components/text.md +85 -0
  73. package/ai/components/token-search-field.md +106 -0
  74. package/ai/components/toolbar-control-group.md +102 -0
  75. package/ai/components/toolbar-text.md +79 -0
  76. package/ai/components/toolbar.md +97 -0
  77. package/ai/components/value-table.md +73 -0
  78. package/ai/components/wa-accordion-item.md +55 -0
  79. package/ai/components/wa-accordion.md +65 -0
  80. package/ai/components/wa-animated-image.md +55 -0
  81. package/ai/components/wa-animation.md +55 -0
  82. package/ai/components/wa-avatar.md +55 -0
  83. package/ai/components/wa-badge.md +55 -0
  84. package/ai/components/wa-breadcrumb-item.md +53 -0
  85. package/ai/components/wa-breadcrumb.md +55 -0
  86. package/ai/components/wa-button-group.md +59 -0
  87. package/ai/components/wa-button.md +55 -0
  88. package/ai/components/wa-callout.md +58 -0
  89. package/ai/components/wa-card.md +59 -0
  90. package/ai/components/wa-carousel-item.md +53 -0
  91. package/ai/components/wa-carousel.md +55 -0
  92. package/ai/components/wa-checkbox-group.md +55 -0
  93. package/ai/components/wa-checkbox.md +55 -0
  94. package/ai/components/wa-color-picker.md +55 -0
  95. package/ai/components/wa-comparison.md +55 -0
  96. package/ai/components/wa-copy-button.md +55 -0
  97. package/ai/components/wa-details.md +61 -0
  98. package/ai/components/wa-dialog.md +59 -0
  99. package/ai/components/wa-divider.md +53 -0
  100. package/ai/components/wa-drawer.md +55 -0
  101. package/ai/components/wa-dropdown-item.md +60 -0
  102. package/ai/components/wa-dropdown.md +60 -0
  103. package/ai/components/wa-format-bytes.md +53 -0
  104. package/ai/components/wa-format-date.md +53 -0
  105. package/ai/components/wa-format-number.md +53 -0
  106. package/ai/components/wa-icon.md +58 -0
  107. package/ai/components/wa-include.md +53 -0
  108. package/ai/components/wa-input.md +59 -0
  109. package/ai/components/wa-intersection-observer.md +53 -0
  110. package/ai/components/wa-known-date.md +53 -0
  111. package/ai/components/wa-markdown.md +53 -0
  112. package/ai/components/wa-mutation-observer.md +53 -0
  113. package/ai/components/wa-number-input.md +55 -0
  114. package/ai/components/wa-option.md +59 -0
  115. package/ai/components/wa-otp-input.md +53 -0
  116. package/ai/components/wa-page.md +53 -0
  117. package/ai/components/wa-pagination.md +55 -0
  118. package/ai/components/wa-popover.md +55 -0
  119. package/ai/components/wa-popup.md +53 -0
  120. package/ai/components/wa-progress-bar.md +53 -0
  121. package/ai/components/wa-progress-ring.md +53 -0
  122. package/ai/components/wa-qr-code.md +53 -0
  123. package/ai/components/wa-radio-group.md +59 -0
  124. package/ai/components/wa-radio.md +55 -0
  125. package/ai/components/wa-random-content.md +53 -0
  126. package/ai/components/wa-rating.md +55 -0
  127. package/ai/components/wa-relative-time.md +53 -0
  128. package/ai/components/wa-resize-observer.md +53 -0
  129. package/ai/components/wa-scroller.md +53 -0
  130. package/ai/components/wa-select.md +63 -0
  131. package/ai/components/wa-skeleton.md +53 -0
  132. package/ai/components/wa-slider.md +55 -0
  133. package/ai/components/wa-spinner.md +58 -0
  134. package/ai/components/wa-split-panel.md +58 -0
  135. package/ai/components/wa-switch.md +53 -0
  136. package/ai/components/wa-tab-group.md +69 -0
  137. package/ai/components/wa-tab-panel.md +60 -0
  138. package/ai/components/wa-tab.md +59 -0
  139. package/ai/components/wa-tag.md +59 -0
  140. package/ai/components/wa-textarea.md +53 -0
  141. package/ai/components/wa-time-input.md +55 -0
  142. package/ai/components/wa-toast-item.md +60 -0
  143. package/ai/components/wa-toast.md +60 -0
  144. package/ai/components/wa-tooltip.md +55 -0
  145. package/ai/components/wa-tree-item.md +55 -0
  146. package/ai/components/wa-tree.md +55 -0
  147. package/ai/components/wa-zoomable-frame.md +55 -0
  148. package/ai/components/workbench.md +118 -0
  149. package/ai/public-api-signatures-v1.md +2748 -210
  150. package/ai/skill.md +286 -66
  151. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  152. package/analyzer/cli.mjs +49 -0
  153. package/analyzer/component-ownership.d.mts +72 -0
  154. package/analyzer/component-ownership.mjs +401 -0
  155. package/analyzer/index.d.mts +53 -0
  156. package/analyzer/index.mjs +2307 -0
  157. package/analyzer/loud-pairs.d.mts +49 -0
  158. package/analyzer/loud-pairs.mjs +357 -0
  159. package/analyzer/report.schema.json +66 -0
  160. package/analyzer/selectors.d.mts +21 -0
  161. package/analyzer/selectors.mjs +212 -0
  162. package/catalog-projection-cli.mjs +96 -0
  163. package/catalog-projection.d.mts +55 -0
  164. package/catalog-projection.mjs +62 -0
  165. package/dist/app-tab.d.ts +39 -4
  166. package/dist/app-tab.js +2 -1
  167. package/dist/badge.d.ts +52 -0
  168. package/dist/badge.js +3 -0
  169. package/dist/badge.js.map +1 -0
  170. package/dist/browser/badge.js +3 -0
  171. package/dist/browser/catalog.js +26 -0
  172. package/dist/browser/chip.js +3 -0
  173. package/dist/browser/collapsible-panel.js +9 -0
  174. package/dist/browser/content-item.js +3 -0
  175. package/dist/browser/floating-toolbar.js +3 -0
  176. package/dist/browser/grid.js +3 -0
  177. package/dist/browser/list-action-row.js +5 -0
  178. package/dist/browser/{menu-header.js → list-header.js} +4 -2
  179. package/dist/browser/list-inset-control.js +3 -0
  180. package/dist/browser/list-inset-text.js +3 -0
  181. package/dist/browser/list-item.js +5 -0
  182. package/dist/browser/list.js +3 -0
  183. package/dist/browser/{panel-header.js → nav-stack.js} +5 -3
  184. package/dist/browser/pane.js +3 -0
  185. package/dist/browser/popup-menu.js +3 -0
  186. package/dist/browser/row.js +3 -0
  187. package/dist/browser/segmented-control.js +0 -1
  188. package/dist/browser/select.js +1 -0
  189. package/dist/browser/spacer.js +3 -0
  190. package/dist/browser/split-view.js +11 -0
  191. package/dist/browser/state-banner.js +1 -0
  192. package/dist/browser/sunken-panel.js +3 -0
  193. package/dist/browser/surface-scaffold.js +3 -0
  194. package/dist/browser/tab-scaffold.js +4 -0
  195. package/dist/browser/text.js +3 -0
  196. package/dist/browser/toolbar-control-group.js +1 -0
  197. package/dist/browser/workbench.js +14 -0
  198. package/dist/catalog-resources.d.ts +48 -0
  199. package/dist/catalog-resources.js +22 -0
  200. package/dist/catalog-resources.js.map +1 -0
  201. package/dist/catalog.d.ts +92 -0
  202. package/dist/catalog.js +503 -0
  203. package/dist/catalog.js.map +1 -0
  204. package/dist/chip.d.ts +35 -0
  205. package/dist/chip.js +3 -0
  206. package/dist/chip.js.map +1 -0
  207. package/dist/chunk-2G2ZJQYK.js +152 -0
  208. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  209. package/dist/chunk-3BYFWTP3.js +108 -0
  210. package/dist/chunk-3BYFWTP3.js.map +1 -0
  211. package/dist/chunk-47CKKLBE.js +34 -0
  212. package/dist/chunk-47CKKLBE.js.map +1 -0
  213. package/dist/chunk-4SQK27MR.js +202 -0
  214. package/dist/chunk-4SQK27MR.js.map +1 -0
  215. package/dist/chunk-5I7QGQVT.js +24 -0
  216. package/dist/chunk-5I7QGQVT.js.map +1 -0
  217. package/dist/chunk-6DFDTWGG.js +288 -0
  218. package/dist/chunk-6DFDTWGG.js.map +1 -0
  219. package/dist/chunk-7OKX3EF6.js +135 -0
  220. package/dist/chunk-7OKX3EF6.js.map +1 -0
  221. package/dist/chunk-AHEG27M7.js +66 -0
  222. package/dist/chunk-AHEG27M7.js.map +1 -0
  223. package/dist/chunk-AYUHMAI6.js +48 -0
  224. package/dist/chunk-AYUHMAI6.js.map +1 -0
  225. package/dist/chunk-B2ZMR7NY.js +85 -0
  226. package/dist/chunk-B2ZMR7NY.js.map +1 -0
  227. package/dist/chunk-BFPBS5Y4.js +250 -0
  228. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  229. package/dist/chunk-DB5ADJKF.js +775 -0
  230. package/dist/chunk-DB5ADJKF.js.map +1 -0
  231. package/dist/chunk-DC6CN2DS.js +123 -0
  232. package/dist/chunk-DC6CN2DS.js.map +1 -0
  233. package/dist/chunk-DG6G5EPF.js +35 -0
  234. package/dist/chunk-DG6G5EPF.js.map +1 -0
  235. package/dist/{chunk-56RJXPHG.js → chunk-G4S2QU6V.js} +7 -4
  236. package/dist/chunk-G4S2QU6V.js.map +1 -0
  237. package/dist/chunk-GLDWRCAM.js +49 -0
  238. package/dist/chunk-GLDWRCAM.js.map +1 -0
  239. package/dist/chunk-I3Q7KKYM.js +33 -0
  240. package/dist/chunk-I3Q7KKYM.js.map +1 -0
  241. package/dist/chunk-IA7TMD4Y.js +288 -0
  242. package/dist/chunk-IA7TMD4Y.js.map +1 -0
  243. package/dist/chunk-J3KGJ6P6.js +135 -0
  244. package/dist/chunk-J3KGJ6P6.js.map +1 -0
  245. package/dist/chunk-K47P7QZC.js +17 -0
  246. package/dist/chunk-K47P7QZC.js.map +1 -0
  247. package/dist/chunk-K67Y2JNF.js +222 -0
  248. package/dist/chunk-K67Y2JNF.js.map +1 -0
  249. package/dist/chunk-KCCEH7RF.js +492 -0
  250. package/dist/chunk-KCCEH7RF.js.map +1 -0
  251. package/dist/chunk-KLJKU6ZL.js +109 -0
  252. package/dist/chunk-KLJKU6ZL.js.map +1 -0
  253. package/dist/chunk-KVBRMEPM.js +44 -0
  254. package/dist/chunk-KVBRMEPM.js.map +1 -0
  255. package/dist/chunk-M6DEEBEF.js +156 -0
  256. package/dist/chunk-M6DEEBEF.js.map +1 -0
  257. package/dist/chunk-MEY33VWB.js +44 -0
  258. package/dist/chunk-MEY33VWB.js.map +1 -0
  259. package/dist/chunk-MP2GDBQZ.js +50 -0
  260. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  261. package/dist/chunk-NC4CFOID.js +188 -0
  262. package/dist/chunk-NC4CFOID.js.map +1 -0
  263. package/dist/chunk-NCSWXG7G.js +80 -0
  264. package/dist/chunk-NCSWXG7G.js.map +1 -0
  265. package/dist/chunk-NN6GYOA2.js +47 -0
  266. package/dist/chunk-NN6GYOA2.js.map +1 -0
  267. package/dist/chunk-OXO2QJWV.js +55 -0
  268. package/dist/chunk-OXO2QJWV.js.map +1 -0
  269. package/dist/chunk-P7D3EMXM.js +52 -0
  270. package/dist/chunk-P7D3EMXM.js.map +1 -0
  271. package/dist/chunk-PSHUSWQH.js +18 -0
  272. package/dist/chunk-PSHUSWQH.js.map +1 -0
  273. package/dist/chunk-Q6YU3BT7.js +138 -0
  274. package/dist/chunk-Q6YU3BT7.js.map +1 -0
  275. package/dist/chunk-QJ5VFCW3.js +131 -0
  276. package/dist/chunk-QJ5VFCW3.js.map +1 -0
  277. package/dist/chunk-RGS4WX2M.js +44 -0
  278. package/dist/chunk-RGS4WX2M.js.map +1 -0
  279. package/dist/chunk-RNQNEENY.js +146 -0
  280. package/dist/chunk-RNQNEENY.js.map +1 -0
  281. package/dist/chunk-RVERAFFY.js +291 -0
  282. package/dist/chunk-RVERAFFY.js.map +1 -0
  283. package/dist/chunk-SLWCCHNP.js +491 -0
  284. package/dist/chunk-SLWCCHNP.js.map +1 -0
  285. package/dist/chunk-SMZGAPCU.js +70 -0
  286. package/dist/chunk-SMZGAPCU.js.map +1 -0
  287. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  288. package/dist/chunk-SRSJO5QE.js.map +1 -0
  289. package/dist/chunk-TJK44RQC.js +452 -0
  290. package/dist/chunk-TJK44RQC.js.map +1 -0
  291. package/dist/chunk-UIDKY4UB.js +14 -0
  292. package/dist/chunk-UIDKY4UB.js.map +1 -0
  293. package/dist/chunk-V3DX3K65.js +43 -0
  294. package/dist/chunk-V3DX3K65.js.map +1 -0
  295. package/dist/chunk-VZOFZPSO.js +71 -0
  296. package/dist/chunk-VZOFZPSO.js.map +1 -0
  297. package/dist/chunk-W2AC6Q2A.js +83 -0
  298. package/dist/chunk-W2AC6Q2A.js.map +1 -0
  299. package/dist/chunk-WF75U3V4.js +33 -0
  300. package/dist/chunk-WF75U3V4.js.map +1 -0
  301. package/dist/chunk-WTSNV5RG.js +52 -0
  302. package/dist/chunk-WTSNV5RG.js.map +1 -0
  303. package/dist/{chunk-YGN7OMLT.js → chunk-X5QSICJ3.js} +8 -5
  304. package/dist/chunk-X5QSICJ3.js.map +1 -0
  305. package/dist/chunk-YDGNU2OD.js +61 -0
  306. package/dist/chunk-YDGNU2OD.js.map +1 -0
  307. package/dist/collapsible-panel.d.ts +133 -0
  308. package/dist/collapsible-panel.js +131 -0
  309. package/dist/collapsible-panel.js.map +1 -0
  310. package/dist/content-item.d.ts +81 -0
  311. package/dist/content-item.js +4 -0
  312. package/dist/content-item.js.map +1 -0
  313. package/dist/css-values.d.ts +107 -0
  314. package/dist/css-values.js +3 -0
  315. package/dist/css-values.js.map +1 -0
  316. package/dist/device-class.js +33 -5
  317. package/dist/device-class.js.map +1 -1
  318. package/dist/disclosure-arrow.d.ts +6 -1
  319. package/dist/disclosure-arrow.js +2 -1
  320. package/dist/empty-state.d.ts +5 -2
  321. package/dist/empty-state.js +2 -1
  322. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  323. package/dist/floating-toolbar.d.ts +51 -0
  324. package/dist/floating-toolbar.js +3 -0
  325. package/dist/floating-toolbar.js.map +1 -0
  326. package/dist/grid.d.ts +50 -0
  327. package/dist/grid.js +5 -0
  328. package/dist/grid.js.map +1 -0
  329. package/dist/help-tags-register.d.ts +13 -0
  330. package/dist/help-tags-register.js +9 -0
  331. package/dist/help-tags-register.js.map +1 -0
  332. package/dist/index.d.ts +34 -14
  333. package/dist/index.js +43 -23
  334. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +21 -9
  335. package/dist/list-action-row.js +8 -0
  336. package/dist/list-action-row.js.map +1 -0
  337. package/dist/list-header.d.ts +99 -0
  338. package/dist/list-header.js +10 -0
  339. package/dist/list-header.js.map +1 -0
  340. package/dist/list-inset-control.d.ts +22 -0
  341. package/dist/list-inset-control.js +3 -0
  342. package/dist/list-inset-control.js.map +1 -0
  343. package/dist/list-inset-text.d.ts +30 -0
  344. package/dist/list-inset-text.js +4 -0
  345. package/dist/list-inset-text.js.map +1 -0
  346. package/dist/list-item.d.ts +62 -0
  347. package/dist/list-item.js +8 -0
  348. package/dist/list-item.js.map +1 -0
  349. package/dist/list.d.ts +63 -0
  350. package/dist/list.js +6 -0
  351. package/dist/list.js.map +1 -0
  352. package/dist/loading-spinner.d.ts +9 -2
  353. package/dist/loading-spinner.js +2 -1
  354. package/dist/lucide-icon.d.ts +9 -2
  355. package/dist/lucide-icon.js +2 -1
  356. package/dist/nav-stack.d.ts +66 -10
  357. package/dist/nav-stack.js +6 -1
  358. package/dist/pane.d.ts +108 -0
  359. package/dist/pane.js +4 -0
  360. package/dist/pane.js.map +1 -0
  361. package/dist/panel-toolbar-DDKh4uKd.d.ts +72 -0
  362. package/dist/popup-menu-register.d.ts +9 -0
  363. package/dist/popup-menu-register.js +244 -0
  364. package/dist/popup-menu-register.js.map +1 -0
  365. package/dist/popup-menu.d.ts +100 -0
  366. package/dist/popup-menu.js +3 -0
  367. package/dist/popup-menu.js.map +1 -0
  368. package/dist/resizable-region.d.ts +32 -3
  369. package/dist/resizable-region.js +1 -1
  370. package/dist/row.d.ts +48 -0
  371. package/dist/row.js +6 -0
  372. package/dist/row.js.map +1 -0
  373. package/dist/segmented-control.d.ts +12 -9
  374. package/dist/segmented-control.js +1 -2
  375. package/dist/select-register.d.ts +5 -1
  376. package/dist/select-register.js +243 -2
  377. package/dist/select-register.js.map +1 -1
  378. package/dist/select.d.ts +102 -8
  379. package/dist/select.js +3 -1
  380. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  381. package/dist/sides-BPSWde0A.d.ts +4 -0
  382. package/dist/skeleton.d.ts +14 -7
  383. package/dist/skeleton.js +2 -1
  384. package/dist/spacer.d.ts +18 -0
  385. package/dist/spacer.js +4 -0
  386. package/dist/spacer.js.map +1 -0
  387. package/dist/split-view.d.ts +39 -7
  388. package/dist/split-view.js +120 -10
  389. package/dist/split-view.js.map +1 -1
  390. package/dist/state-banner.d.ts +18 -6
  391. package/dist/state-banner.js +3 -1
  392. package/dist/styles/app-tab.css +224 -0
  393. package/dist/styles/badge.css +118 -0
  394. package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
  395. package/dist/styles/catalog/components/catalog-example.css +168 -0
  396. package/dist/styles/catalog/components/catalog-stage.css +55 -0
  397. package/dist/styles/catalog/components/catalog.css +12 -0
  398. package/dist/styles/catalog.css +5 -0
  399. package/dist/styles/chip.css +132 -0
  400. package/dist/styles/collapsible-panel.css +575 -0
  401. package/dist/styles/content-item.css +75 -0
  402. package/dist/styles/document.css +23 -0
  403. package/dist/styles/floating-toolbar.css +119 -0
  404. package/dist/styles/foundation.css +178 -40
  405. package/dist/styles/grid.css +35 -0
  406. package/dist/styles/layout.css +3 -41
  407. package/dist/styles/list-action-row.css +258 -0
  408. package/dist/styles/list-header.css +229 -0
  409. package/dist/styles/list-inset-control.css +30 -0
  410. package/dist/styles/list-inset-text.css +29 -0
  411. package/dist/styles/list-item.css +255 -0
  412. package/dist/styles/list.css +133 -0
  413. package/dist/styles/loading-spinner.css +4 -0
  414. package/dist/styles/lucide-icon.css +5 -0
  415. package/dist/styles/nav-stack.css +172 -47
  416. package/dist/styles/pane.css +263 -0
  417. package/dist/styles/popup-menu.css +285 -0
  418. package/dist/styles/resizable-region.css +438 -4
  419. package/dist/styles/row.css +111 -0
  420. package/dist/styles/segmented-control.css +36 -9
  421. package/dist/styles/select.css +337 -21
  422. package/dist/styles/skeleton.css +64 -3
  423. package/dist/styles/spacer.css +11 -0
  424. package/dist/styles/split-view.css +114 -3
  425. package/dist/styles/state-banner.css +94 -19
  426. package/dist/styles/styles.css +13 -4
  427. package/dist/styles/sunken-panel.css +29 -0
  428. package/dist/styles/surface-scaffold.css +56 -0
  429. package/dist/styles/tab-bar.css +147 -9
  430. package/dist/styles/tab-scaffold.css +126 -3
  431. package/dist/styles/text.css +112 -0
  432. package/dist/styles/token-search-field.css +155 -55
  433. package/dist/styles/toolbar-control-group.css +608 -29
  434. package/dist/styles/toolbar-text.css +101 -8
  435. package/dist/styles/toolbar.css +343 -12
  436. package/dist/styles/value-table.css +34 -4
  437. package/dist/styles/webawesome.css +365 -10
  438. package/dist/styles/workbench.css +980 -7
  439. package/dist/sunken-panel.d.ts +27 -0
  440. package/dist/sunken-panel.js +3 -0
  441. package/dist/sunken-panel.js.map +1 -0
  442. package/dist/surface-scaffold.d.ts +30 -0
  443. package/dist/surface-scaffold.js +3 -0
  444. package/dist/surface-scaffold.js.map +1 -0
  445. package/dist/tab-bar.d.ts +39 -6
  446. package/dist/tab-bar.js +1 -1
  447. package/dist/tab-scaffold.d.ts +57 -7
  448. package/dist/tab-scaffold.js +83 -9
  449. package/dist/tab-scaffold.js.map +1 -1
  450. package/dist/text.d.ts +56 -0
  451. package/dist/text.js +3 -0
  452. package/dist/text.js.map +1 -0
  453. package/dist/token-search-field-CVGwDn2y.d.ts +154 -0
  454. package/dist/token-search-field.d.ts +3 -43
  455. package/dist/token-search-field.js +2 -1
  456. package/dist/token-search-model.d.ts +3 -0
  457. package/dist/token-search-model.js +3 -0
  458. package/dist/token-search-model.js.map +1 -0
  459. package/dist/toolbar-control-group.d.ts +77 -7
  460. package/dist/toolbar-control-group.js +3 -1
  461. package/dist/toolbar-text.d.ts +35 -4
  462. package/dist/toolbar-text.js +2 -1
  463. package/dist/toolbar.d.ts +59 -7
  464. package/dist/toolbar.js +1 -1
  465. package/dist/types-BuHELdXR.d.ts +117 -0
  466. package/dist/value-table.d.ts +11 -3
  467. package/dist/value-table.js +2 -1
  468. package/dist/webawesome.d.ts +8 -1
  469. package/dist/wire-catalog.d.ts +82 -0
  470. package/dist/wire-catalog.js +327 -0
  471. package/dist/wire-catalog.js.map +1 -0
  472. package/dist/wire-content-items.d.ts +11 -0
  473. package/dist/wire-content-items.js +114 -0
  474. package/dist/wire-content-items.js.map +1 -0
  475. package/dist/wire-nav-stack.d.ts +4 -1
  476. package/dist/wire-nav-stack.js +147 -7
  477. package/dist/wire-nav-stack.js.map +1 -1
  478. package/dist/wire-resizable-regions.d.ts +2 -1
  479. package/dist/wire-resizable-regions.js +2 -1
  480. package/dist/wire-scroll-dividers.d.ts +72 -0
  481. package/dist/wire-scroll-dividers.js +3 -0
  482. package/dist/wire-scroll-dividers.js.map +1 -0
  483. package/dist/wire-sidebar.d.ts +63 -0
  484. package/dist/wire-sidebar.js +231 -0
  485. package/dist/wire-sidebar.js.map +1 -0
  486. package/dist/wire-tab-bars.d.ts +19 -2
  487. package/dist/wire-tab-bars.js +1 -1
  488. package/dist/wire-tab-scaffold.js +9 -4
  489. package/dist/wire-tab-scaffold.js.map +1 -1
  490. package/dist/wire-token-search-fields.d.ts +65 -3
  491. package/dist/wire-token-search-fields.js +2 -1
  492. package/dist/wire-workbench.d.ts +116 -0
  493. package/dist/wire-workbench.js +6 -0
  494. package/dist/wire-workbench.js.map +1 -0
  495. package/dist/workbench.d.ts +244 -9
  496. package/dist/workbench.js +17 -15
  497. package/dist/workbench.js.map +1 -1
  498. package/docs/accessibility.md +476 -24
  499. package/docs/app-layouts.md +106 -8
  500. package/docs/apple-hig.md +1 -0
  501. package/docs/catalog.md +483 -0
  502. package/docs/collapsible-panel.md +371 -0
  503. package/docs/component-contract.md +667 -56
  504. package/docs/component-integration.md +75 -0
  505. package/docs/component-selection.md +540 -95
  506. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  507. package/docs/design/templates/empty-state/filtered.svg +1 -0
  508. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  509. package/docs/design/templates/empty-state/with-action.svg +1 -0
  510. package/docs/design/templates/empty-state-dark.svg +1 -0
  511. package/docs/design/templates/empty-state.svg +1 -0
  512. package/docs/design/templates/list/compact-dark.svg +1 -0
  513. package/docs/design/templates/list/compact.svg +1 -0
  514. package/docs/design/templates/list/stack-dark.svg +1 -0
  515. package/docs/design/templates/list/stack.svg +1 -0
  516. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  517. package/docs/design/templates/list-action-row/default.svg +1 -0
  518. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  519. package/docs/design/templates/list-action-row/selected.svg +1 -0
  520. package/docs/design/templates/list-action-row-dark.svg +1 -0
  521. package/docs/design/templates/list-action-row.svg +1 -0
  522. package/docs/design/templates/list-dark.svg +1 -0
  523. package/docs/design/templates/list-header/action-dark.svg +1 -0
  524. package/docs/design/templates/list-header/action.svg +1 -0
  525. package/docs/design/templates/list-header/count-dark.svg +1 -0
  526. package/docs/design/templates/list-header/count.svg +1 -0
  527. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  528. package/docs/design/templates/list-header/inline-action.svg +1 -0
  529. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  530. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  531. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  532. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  533. package/docs/design/templates/list-header-dark.svg +1 -0
  534. package/docs/design/templates/list-header.svg +1 -0
  535. package/docs/design/templates/list-item/default-dark.svg +1 -0
  536. package/docs/design/templates/list-item/default.svg +1 -0
  537. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  538. package/docs/design/templates/list-item/multiline.svg +1 -0
  539. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  540. package/docs/design/templates/list-item/selected.svg +1 -0
  541. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  542. package/docs/design/templates/list-item/trailing.svg +1 -0
  543. package/docs/design/templates/list-item-dark.svg +1 -0
  544. package/docs/design/templates/list-item.svg +1 -0
  545. package/docs/design/templates/list.svg +1 -0
  546. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  547. package/docs/design/templates/segmented-control/equal.svg +1 -0
  548. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  549. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  550. package/docs/design/templates/segmented-control-dark.svg +1 -0
  551. package/docs/design/templates/segmented-control.svg +1 -0
  552. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  553. package/docs/design/templates/skeleton/avatar.svg +1 -0
  554. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  555. package/docs/design/templates/skeleton/block.svg +1 -0
  556. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  557. package/docs/design/templates/skeleton/lines.svg +1 -0
  558. package/docs/design/templates/skeleton-dark.svg +1 -0
  559. package/docs/design/templates/skeleton.svg +1 -0
  560. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  561. package/docs/design/templates/state-banner/danger.svg +1 -0
  562. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  563. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  564. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  565. package/docs/design/templates/state-banner/info.svg +1 -0
  566. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  567. package/docs/design/templates/state-banner/success.svg +1 -0
  568. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  569. package/docs/design/templates/state-banner/warning.svg +1 -0
  570. package/docs/design/templates/state-banner-dark.svg +1 -0
  571. package/docs/design/templates/state-banner.svg +1 -0
  572. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  573. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  574. package/docs/design/templates/tab-bar-dark.svg +1 -0
  575. package/docs/design/templates/tab-bar.svg +1 -0
  576. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  577. package/docs/design/templates/token-search-field/empty.svg +1 -0
  578. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  579. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  580. package/docs/design/templates/token-search-field-dark.svg +1 -0
  581. package/docs/design/templates/token-search-field.svg +1 -0
  582. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  583. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  584. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  585. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  586. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  587. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  588. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  589. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  590. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  591. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  592. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  593. package/docs/design/templates/toolbar-control-group.svg +1 -0
  594. package/docs/design/templates/toolbar-dark.svg +1 -0
  595. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  596. package/docs/design/templates/toolbar-text/default.svg +1 -0
  597. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  598. package/docs/design/templates/toolbar-text/large.svg +1 -0
  599. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  600. package/docs/design/templates/toolbar-text/small.svg +1 -0
  601. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  602. package/docs/design/templates/toolbar-text.svg +1 -0
  603. package/docs/design/templates/toolbar.svg +1 -0
  604. package/docs/design/templates/value-table/details-dark.svg +1 -0
  605. package/docs/design/templates/value-table/details.svg +1 -0
  606. package/docs/design/templates/value-table-dark.svg +1 -0
  607. package/docs/design/templates/value-table.svg +1 -0
  608. package/docs/design/templates.md +138 -0
  609. package/docs/design-philosophy.md +48 -20
  610. package/docs/device-class.md +10 -9
  611. package/docs/document-baseline.md +38 -0
  612. package/docs/examples/application-ui-profile.json +60 -0
  613. package/docs/examples/command-palette-adapter.tsx +69 -17
  614. package/docs/examples/component-catalog-extension.json +52 -0
  615. package/docs/examples/component-composition-extension.json +80 -0
  616. package/docs/layout.md +534 -59
  617. package/docs/nav-stack.md +138 -14
  618. package/docs/recipes.md +137 -54
  619. package/docs/split-view.md +74 -6
  620. package/docs/sunken-panel.md +87 -0
  621. package/docs/surface-scaffold.md +28 -0
  622. package/docs/tab-scaffold.md +99 -10
  623. package/docs/type-contracts.md +134 -0
  624. package/docs/ui-analyzer.md +384 -0
  625. package/docs/ui-doctor.md +153 -0
  626. package/docs/ui-evaluator.md +139 -0
  627. package/docs/ux-demo.md +41 -16
  628. package/docs/webawesome-theme.md +218 -16
  629. package/docs/workbench.md +608 -12
  630. package/doctor/cli.mjs +120 -0
  631. package/doctor/config.schema.json +94 -0
  632. package/doctor/eslint-diagnostics.d.mts +24 -0
  633. package/doctor/eslint-diagnostics.mjs +24 -0
  634. package/doctor/index.d.mts +122 -0
  635. package/doctor/index.mjs +1364 -0
  636. package/doctor/report.schema.json +118 -0
  637. package/evaluator/cli.mjs +89 -0
  638. package/evaluator/index.d.mts +90 -0
  639. package/evaluator/index.mjs +1203 -0
  640. package/evaluator/report.schema.json +152 -0
  641. package/llms.txt +445 -48
  642. package/package.json +249 -37
  643. package/scripts/component-catalog-extension-validation.mjs +28 -0
  644. package/traversal-exclusions.mjs +27 -0
  645. package/ux-demo/recipes/app-shell.tsx +205 -17
  646. package/ux-demo/recipes/collapsible-sidebar.tsx +260 -0
  647. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  648. package/ux-demo/recipes/composer-form.tsx +133 -21
  649. package/ux-demo/recipes/list-detail-dialog.tsx +282 -0
  650. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  651. package/ux-demo/recipes/loaders.ts +15 -5
  652. package/ux-demo/recipes/loading-inspector.tsx +204 -0
  653. package/ux-demo/recipes/mount-recipe.ts +28 -10
  654. package/ux-demo/recipes/navigation-sidebar.tsx +139 -13
  655. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  656. package/ux-demo/recipes/types.ts +23 -2
  657. package/ux-demo/recipes/workspace-header.tsx +86 -5
  658. package/dist/browser/menu-action-row.js +0 -4
  659. package/dist/browser/menu-item.js +0 -4
  660. package/dist/chunk-2RJBFNB6.js +0 -172
  661. package/dist/chunk-2RJBFNB6.js.map +0 -1
  662. package/dist/chunk-2Z5TWHKQ.js +0 -34
  663. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  664. package/dist/chunk-3YD6ZNRA.js +0 -34
  665. package/dist/chunk-3YD6ZNRA.js.map +0 -1
  666. package/dist/chunk-55DATV3A.js +0 -10
  667. package/dist/chunk-55DATV3A.js.map +0 -1
  668. package/dist/chunk-56RJXPHG.js.map +0 -1
  669. package/dist/chunk-7BR3DO2A.js.map +0 -1
  670. package/dist/chunk-7LDCTU7D.js +0 -134
  671. package/dist/chunk-7LDCTU7D.js.map +0 -1
  672. package/dist/chunk-AQNKJRFH.js +0 -79
  673. package/dist/chunk-AQNKJRFH.js.map +0 -1
  674. package/dist/chunk-B24C4A6T.js +0 -22
  675. package/dist/chunk-B24C4A6T.js.map +0 -1
  676. package/dist/chunk-DAFFDO33.js +0 -14
  677. package/dist/chunk-DAFFDO33.js.map +0 -1
  678. package/dist/chunk-H6URQGJI.js +0 -42
  679. package/dist/chunk-H6URQGJI.js.map +0 -1
  680. package/dist/chunk-I7INRJO4.js +0 -17
  681. package/dist/chunk-I7INRJO4.js.map +0 -1
  682. package/dist/chunk-KJYXOTG3.js +0 -10
  683. package/dist/chunk-KJYXOTG3.js.map +0 -1
  684. package/dist/chunk-LC3YSAZC.js +0 -39
  685. package/dist/chunk-LC3YSAZC.js.map +0 -1
  686. package/dist/chunk-M5JRI6MN.js +0 -27
  687. package/dist/chunk-M5JRI6MN.js.map +0 -1
  688. package/dist/chunk-MBR3TYNL.js +0 -14
  689. package/dist/chunk-MBR3TYNL.js.map +0 -1
  690. package/dist/chunk-MFKMHK5W.js +0 -10
  691. package/dist/chunk-MFKMHK5W.js.map +0 -1
  692. package/dist/chunk-MQIZAD4A.js +0 -227
  693. package/dist/chunk-MQIZAD4A.js.map +0 -1
  694. package/dist/chunk-N3SUXLLS.js +0 -23
  695. package/dist/chunk-N3SUXLLS.js.map +0 -1
  696. package/dist/chunk-PONXLV5U.js +0 -19
  697. package/dist/chunk-PONXLV5U.js.map +0 -1
  698. package/dist/chunk-TZNCCM5H.js +0 -20
  699. package/dist/chunk-TZNCCM5H.js.map +0 -1
  700. package/dist/chunk-W2FK7ZNY.js +0 -26
  701. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  702. package/dist/chunk-WVPYVDXY.js +0 -15
  703. package/dist/chunk-WVPYVDXY.js.map +0 -1
  704. package/dist/chunk-YGN7OMLT.js.map +0 -1
  705. package/dist/chunk-YKUUZPED.js +0 -24
  706. package/dist/chunk-YKUUZPED.js.map +0 -1
  707. package/dist/menu-action-row.js +0 -5
  708. package/dist/menu-action-row.js.map +0 -1
  709. package/dist/menu-header.d.ts +0 -43
  710. package/dist/menu-header.js +0 -7
  711. package/dist/menu-header.js.map +0 -1
  712. package/dist/menu-item.d.ts +0 -33
  713. package/dist/menu-item.js +0 -5
  714. package/dist/menu-item.js.map +0 -1
  715. package/dist/panel-header.d.ts +0 -28
  716. package/dist/panel-header.js +0 -7
  717. package/dist/panel-header.js.map +0 -1
  718. package/dist/styles/menu-action-row.css +0 -160
  719. package/dist/styles/menu-header.css +0 -160
  720. package/dist/styles/menu-item.css +0 -123
  721. package/dist/styles/panel-header.css +0 -64
  722. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
  723. package/ux-demo/recipes/recipes.css +0 -355
@@ -1,6 +1,6 @@
1
1
  # Web Awesome JSX signatures for the UI authoring corpus
2
2
 
3
- Generated from the emitted `@kerfjs/ui@5.0.0-beta.7` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
3
+ Generated from the emitted `@kerfjs/ui@5.0.0-beta.71` declaration boundary. Import `@kerfjs/ui/webawesome` for type effects when authoring direct `wa-*` JSX. The module emits no runtime behavior and does not register custom elements.
4
4
 
5
5
  ```ts
6
6
  import { KerfCustomElement } from 'kerfjs/jsx-runtime';
@@ -28,7 +28,11 @@ declare module 'kerfjs/jsx-runtime' {
28
28
  'aria-label'?: string;
29
29
  value?: string;
30
30
  placeholder?: string;
31
+ hint?: string;
31
32
  disabled?: boolean;
33
+ size?: 'xs' | 's' | 'm' | 'l' | 'xl';
34
+ appearance?: 'filled' | 'outlined' | 'filled-outlined';
35
+ placement?: 'top' | 'bottom';
32
36
  };
33
37
  'wa-option': KerfCustomElement & {
34
38
  value?: string;
@@ -44,7 +48,9 @@ declare module 'kerfjs/jsx-runtime' {
44
48
  'wa-comparison': KerfCustomElement;
45
49
  'wa-copy-button': KerfCustomElement;
46
50
  'wa-details': KerfCustomElement;
47
- 'wa-divider': KerfCustomElement;
51
+ 'wa-divider': KerfCustomElement & {
52
+ orientation?: 'horizontal' | 'vertical';
53
+ };
48
54
  'wa-dialog': KerfCustomElement;
49
55
  'wa-drawer': KerfCustomElement;
50
56
  'wa-button': KerfCustomElement & {
@@ -55,6 +61,7 @@ declare module 'kerfjs/jsx-runtime' {
55
61
  };
56
62
  'wa-dropdown': KerfCustomElement & {
57
63
  placement?: string;
64
+ size?: 'xs' | 's' | 'm' | 'l' | 'xl';
58
65
  };
59
66
  'wa-dropdown-item': KerfCustomElement;
60
67
  'wa-format-bytes': KerfCustomElement;
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+
3
+ import console from 'node:console';
4
+ import { writeFile } from 'node:fs/promises';
5
+ import { resolve } from 'node:path';
6
+ import process from 'node:process';
7
+
8
+ import {
9
+ analyzeUiProject,
10
+ formatUiAnalysisSarif,
11
+ formatUiAnalysisText,
12
+ } from './index.mjs';
13
+
14
+ const args = process.argv.slice(2);
15
+ const take = (name) => {
16
+ const index = args.indexOf(name);
17
+ if (index < 0) return undefined;
18
+ const value = args[index + 1];
19
+ args.splice(index, 2);
20
+ return value;
21
+ };
22
+ const root = resolve(take('--root') ?? process.cwd());
23
+ const format = take('--format') ?? 'text';
24
+ const output = take('--output');
25
+ const profile = take('--profile');
26
+ const failOnReview = args.includes('--fail-on-review');
27
+ const adoption = args.includes('--adoption');
28
+ const paths = args.filter(
29
+ (argument) => !argument.startsWith('--') && argument !== '--adoption',
30
+ );
31
+
32
+ if (!['text', 'json', 'sarif'].includes(format)) {
33
+ console.error(`Unknown --format ${format}; expected text, json, or sarif.`);
34
+ process.exitCode = 2;
35
+ } else {
36
+ const report = await analyzeUiProject({ root, paths, profile, adoption });
37
+ const rendered =
38
+ format === 'text'
39
+ ? formatUiAnalysisText(report)
40
+ : JSON.stringify(
41
+ format === 'sarif' ? formatUiAnalysisSarif(report) : report,
42
+ null,
43
+ 2,
44
+ );
45
+ if (output) await writeFile(resolve(root, output), `${rendered}\n`);
46
+ else console.log(rendered);
47
+ if (report.summary.errors || (failOnReview && report.summary.review))
48
+ process.exitCode = 1;
49
+ }
@@ -0,0 +1,72 @@
1
+ export interface OwnershipCatalogEntry {
2
+ key: string;
3
+ package: string;
4
+ id: string;
5
+ name: string;
6
+ source?: string;
7
+ boundaries?: {
8
+ rootClass?: string | null;
9
+ publicClasses?: string[];
10
+ publicTokens?: string[];
11
+ };
12
+ cssValueProps?: Array<{ path: string; examples?: string[] }>;
13
+ }
14
+
15
+ export interface ComponentOwnershipFacts {
16
+ classOwners: Map<string, OwnershipCatalogEntry>;
17
+ dataComponentOwners: Map<string, OwnershipCatalogEntry>;
18
+ tagOwners: Map<string, OwnershipCatalogEntry>;
19
+ privatePrefixes: Array<{ prefix: string; entry: OwnershipCatalogEntry }>;
20
+ typedTokens: Map<string, { entry: OwnershipCatalogEntry; path: string }>;
21
+ }
22
+
23
+ export interface RestyledComponent {
24
+ entry: OwnershipCatalogEntry;
25
+ via: 'class' | 'data-component' | 'tag' | 'descendant';
26
+ name: string;
27
+ }
28
+
29
+ export function componentOwnershipFacts(
30
+ entries: Iterable<OwnershipCatalogEntry>,
31
+ ): ComponentOwnershipFacts;
32
+ export function restyledComponents(
33
+ selectorList: string,
34
+ facts: ComponentOwnershipFacts,
35
+ isForeign: (entry: OwnershipCatalogEntry) => boolean,
36
+ options?: {
37
+ componentMode?: boolean;
38
+ ownPackage?: string;
39
+ hooks?: Map<string, OwnershipCatalogEntry>;
40
+ composedChildren?: Map<string, OwnershipCatalogEntry>;
41
+ },
42
+ ): RestyledComponent[];
43
+ export function contextualComponents(
44
+ selectorList: string,
45
+ facts: ComponentOwnershipFacts,
46
+ isForeign: (entry: OwnershipCatalogEntry) => boolean,
47
+ ownPackage: string | undefined,
48
+ ): Array<{
49
+ entry: OwnershipCatalogEntry;
50
+ name: string;
51
+ position: 'subject' | 'ancestor' | 'sibling' | 'has' | 'is' | 'where' | 'not';
52
+ }>;
53
+ export function privateVariableOwner(
54
+ property: string,
55
+ facts: ComponentOwnershipFacts,
56
+ ): OwnershipCatalogEntry | null | undefined;
57
+ export function typedPropForToken(
58
+ token: string,
59
+ facts: ComponentOwnershipFacts,
60
+ ): { entry: OwnershipCatalogEntry; path: string } | undefined;
61
+ export function configurationFor(
62
+ entry: OwnershipCatalogEntry | null | undefined,
63
+ ): string;
64
+ export function reportGap(
65
+ entry: OwnershipCatalogEntry | null | undefined,
66
+ ): string;
67
+ export function componentName(
68
+ entry: OwnershipCatalogEntry | null | undefined,
69
+ ): string;
70
+ export function componentLabel(
71
+ entry: OwnershipCatalogEntry | null | undefined,
72
+ ): string;
@@ -0,0 +1,401 @@
1
+ /**
2
+ * Downstream component-ownership facts for `kerf-ui-analyze` (`KUI-L019` –
3
+ * `KUI-L023`): the consumer-side form of the package's own
4
+ * `check:css-ownership` rules.
5
+ *
6
+ * Components own their styles and are configured, never overridden. An
7
+ * application or component package may style its own elements, including in a
8
+ * cataloged component's context (`.kui-toolbar > .my-widget` lives in the
9
+ * application's stylesheet), but it never makes another package's component
10
+ * the subject of a rule, writes that component's private variables, overrides
11
+ * a token its typed prop configures, or restyles it through a hook class on
12
+ * its root. Facts come from composition and selection catalogs, plus optional
13
+ * source inference, so third-party packages get the same protection as
14
+ * `@kerfjs/ui`.
15
+ */
16
+ import {
17
+ classNames,
18
+ complexSelectorParts,
19
+ dataComponents,
20
+ pseudoArguments,
21
+ subjectTypes,
22
+ withoutRelationalArguments,
23
+ } from './selectors.mjs';
24
+ import { resolve } from 'node:path';
25
+
26
+ const kebab = (value) =>
27
+ value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
28
+ const bemBlock = (name) => name.split(/__|--/, 1)[0];
29
+
30
+ export function classOwnerFor(facts, className, componentMode = false) {
31
+ if (facts.classOwners.has(className)) return facts.classOwners.get(className);
32
+ if (!componentMode || bemBlock(className) === className) return undefined;
33
+ return facts.blockOwners.get(bemBlock(className));
34
+ }
35
+
36
+ export function ownsClassBlock(facts, className, componentMode = false) {
37
+ return (
38
+ facts.classOwners.has(className) ||
39
+ (componentMode &&
40
+ bemBlock(className) !== className &&
41
+ facts.blockOwners.has(bemBlock(className)))
42
+ );
43
+ }
44
+
45
+ function isWebAwesomeTagEntry(entry) {
46
+ return entry.source === 'webawesome' && /^wa-[a-z0-9-]+$/.test(entry.id);
47
+ }
48
+
49
+ /**
50
+ * Index the loaded catalog entries by every handle a stylesheet can use to
51
+ * reach them: public classes, `data-component` values, Web Awesome tags the
52
+ * package themes, private-variable prefixes, and component tokens a typed
53
+ * prop configures.
54
+ */
55
+ export function componentOwnershipFacts(entries) {
56
+ const classOwners = new Map();
57
+ const blockOwners = new Map();
58
+ const dataComponentOwners = new Map();
59
+ const tagOwners = new Map();
60
+ const descendantRootAttributeOwners = [];
61
+ const privatePrefixes = [];
62
+ const typedTokens = new Map();
63
+ const setOnce = (map, key, entry) => {
64
+ if (!map.has(key)) map.set(key, entry);
65
+ };
66
+ const sharesStylesheet = (left, right) => {
67
+ if (
68
+ left.package !== right.package ||
69
+ !left.catalogDirectory ||
70
+ !right.catalogDirectory
71
+ )
72
+ return false;
73
+ const styles = new Set(
74
+ (left.styleSources ?? []).map((path) =>
75
+ resolve(left.catalogDirectory, path),
76
+ ),
77
+ );
78
+ return (right.styleSources ?? []).some((path) =>
79
+ styles.has(resolve(right.catalogDirectory, path)),
80
+ );
81
+ };
82
+ for (const entry of entries) {
83
+ const boundaries = entry.boundaries ?? {};
84
+ if (boundaries.rootElement && boundaries.descendantRootAttribute)
85
+ descendantRootAttributeOwners.push(entry);
86
+ for (const className of new Set(
87
+ [boundaries.rootClass, ...(boundaries.publicClasses ?? [])].filter(
88
+ Boolean,
89
+ ),
90
+ )) {
91
+ const previous = classOwners.get(className);
92
+ if (!classOwners.has(className)) classOwners.set(className, entry);
93
+ else if (previous && sharesStylesheet(previous, entry))
94
+ // The class is co-owned. A selector cannot attribute it to one
95
+ // component without depending on catalog order.
96
+ classOwners.set(className, null);
97
+ const block = bemBlock(className);
98
+ const previousBlock = blockOwners.get(block);
99
+ if (!blockOwners.has(block)) blockOwners.set(block, entry);
100
+ else if (previousBlock && sharesStylesheet(previousBlock, entry))
101
+ blockOwners.set(block, null);
102
+ if (
103
+ className.startsWith('kui-') &&
104
+ !className.includes('__') &&
105
+ !className.includes('--')
106
+ )
107
+ setOnce(dataComponentOwners, className.slice('kui-'.length), entry);
108
+ }
109
+ if (entry.id && !isWebAwesomeTagEntry(entry))
110
+ setOnce(dataComponentOwners, entry.id, entry);
111
+ if (isWebAwesomeTagEntry(entry)) setOnce(tagOwners, entry.id, entry);
112
+ // Every root-like public class names the component (Toolbar Control
113
+ // Group's first class is its action link, not the group).
114
+ const roots = [
115
+ ...new Set(
116
+ [boundaries.rootClass, ...(boundaries.publicClasses ?? [])].filter(
117
+ (name) => name && !name.includes('__') && !name.includes('--'),
118
+ ),
119
+ ),
120
+ ];
121
+ const tokens = new Set(boundaries.publicTokens ?? []);
122
+ for (const root of roots) {
123
+ privatePrefixes.push({ prefix: `--_${root}`, entry });
124
+ for (const contract of entry.cssValueProps ?? []) {
125
+ const [head] = contract.path.split('[].');
126
+ const token = `--${root}-${kebab(head)}`;
127
+ if (tokens.has(token))
128
+ setOnce(typedTokens, token, { entry, path: contract.path });
129
+ }
130
+ }
131
+ }
132
+ privatePrefixes.sort((a, b) => b.prefix.length - a.prefix.length);
133
+ return {
134
+ classOwners,
135
+ blockOwners,
136
+ dataComponentOwners,
137
+ tagOwners,
138
+ descendantRootAttributeOwners,
139
+ privatePrefixes,
140
+ typedTokens,
141
+ };
142
+ }
143
+
144
+ /**
145
+ * The cataloged components a selector list restyles: the rightmost compound
146
+ * of each complex selector, or an unclassed descendant reached through a
147
+ * cataloged anatomy class. `:has()` / `:not()` arguments are removed because
148
+ * keying on or excluding a component does not style it. A subject that is a
149
+ * `::part()` is left to the shadow-part rule (`KUI-L011`).
150
+ * Returns `{ entry, via, name }` records; `isForeign(entry)` decides which
151
+ * entries the stylesheet does not own.
152
+ */
153
+ export function restyledComponents(
154
+ selectorList,
155
+ facts,
156
+ isForeign,
157
+ {
158
+ componentMode = false,
159
+ ownPackage,
160
+ hooks = new Map(),
161
+ composedChildren = new Map(),
162
+ composedDescendants = new Map(),
163
+ } = {},
164
+ ) {
165
+ const found = [];
166
+ const seen = new Set();
167
+ const add = (entry, via, name) => {
168
+ if (!entry || !isForeign(entry)) return;
169
+ const key = `${entry.key}|${via}|${name}`;
170
+ if (seen.has(key)) return;
171
+ seen.add(key);
172
+ found.push({ entry, via, name });
173
+ };
174
+ for (const parts of complexSelectorParts(selectorList)) {
175
+ const subject = parts.at(-1)?.compound;
176
+ if (!subject || /::part\(/i.test(subject)) continue;
177
+ const bare = withoutRelationalArguments(subject);
178
+ const subjectClasses = classNames(bare);
179
+ for (const className of classNames(bare))
180
+ add(
181
+ classOwnerFor(facts, className, componentMode),
182
+ 'class',
183
+ `.${className}`,
184
+ );
185
+ for (const value of dataComponents(bare))
186
+ add(
187
+ facts.dataComponentOwners.get(value),
188
+ 'data-component',
189
+ `[data-component="${value}"]`,
190
+ );
191
+ // An application class on the subject scopes a Web Awesome tag to the
192
+ // application's own element; a component package never places one there.
193
+ if (
194
+ subjectClasses.some((name) => !ownsClassBlock(facts, name, componentMode))
195
+ )
196
+ continue;
197
+ for (const type of subjectTypes(subject) ?? [])
198
+ add(facts.tagOwners.get(type), 'tag', type);
199
+ // A raw descendant of a component's cataloged anatomy is still inside
200
+ // that component. Do not infer ownership through its root, where an app
201
+ // may place its own children, or through an app-named intermediate node.
202
+ if (subjectClasses.length || parts.length < 2) continue;
203
+ if (componentMode)
204
+ for (const ancestor of parts.slice(0, -1))
205
+ for (const entry of facts.descendantRootAttributeOwners) {
206
+ const { rootElement, descendantRootAttribute } = entry.boundaries;
207
+ if (
208
+ (subjectTypes(subject) ?? []).some((type) =>
209
+ entry.boundaries.descendantElements?.includes(type),
210
+ )
211
+ )
212
+ continue;
213
+ if (
214
+ subjectTypes(ancestor.compound)?.includes(rootElement) &&
215
+ new RegExp(
216
+ `\\[\\s*${descendantRootAttribute}(?=\\s|\\]|[~|^$*]?=)`,
217
+ ).test(withoutRelationalArguments(ancestor.compound))
218
+ )
219
+ add(
220
+ entry,
221
+ 'descendant',
222
+ `${rootElement}[${descendantRootAttribute}]`,
223
+ );
224
+ }
225
+ if (componentMode && parts.at(-1).combinator === '>') {
226
+ const types = subjectTypes(subject) ?? [];
227
+ for (const name of classNames(
228
+ withoutRelationalArguments(parts.at(-2).compound),
229
+ ))
230
+ for (const type of types)
231
+ add(
232
+ composedChildren.get(`${name}|${type}`),
233
+ 'descendant',
234
+ `.${name}`,
235
+ );
236
+ }
237
+ for (let index = parts.length - 2; index >= 0; index -= 1) {
238
+ const classes = classNames(
239
+ withoutRelationalArguments(parts[index].compound),
240
+ );
241
+ if (componentMode && parts.at(-1).combinator !== '>')
242
+ for (const name of classes)
243
+ for (const type of subjectTypes(subject) ?? [])
244
+ add(
245
+ composedDescendants.get(`${name}|${type}`),
246
+ 'descendant',
247
+ `.${name}`,
248
+ );
249
+ const hook = componentMode
250
+ ? classes.find((name) => hooks.has(name))
251
+ : undefined;
252
+ if (hook) {
253
+ add(hooks.get(hook), 'descendant', `.${hook}`);
254
+ break;
255
+ }
256
+ if (classes.some((name) => !ownsClassBlock(facts, name, componentMode)))
257
+ break;
258
+ const anatomy = classes.find(
259
+ (name) =>
260
+ name.includes('__') && ownsClassBlock(facts, name, componentMode),
261
+ );
262
+ if (anatomy) {
263
+ add(
264
+ classOwnerFor(facts, anatomy, componentMode),
265
+ 'descendant',
266
+ `.${anatomy}`,
267
+ );
268
+ break;
269
+ }
270
+ if (componentMode) {
271
+ const root = classes.find((name) =>
272
+ ownsClassBlock(facts, name, componentMode),
273
+ );
274
+ if (root) {
275
+ const entry = classOwnerFor(facts, root, componentMode);
276
+ if (entry?.package === ownPackage)
277
+ add(entry, 'descendant', `.${root}`);
278
+ break;
279
+ }
280
+ }
281
+ }
282
+ }
283
+ return found;
284
+ }
285
+
286
+ /** Foreign component handles used to key another component's selector. */
287
+ export function contextualComponents(
288
+ selectorList,
289
+ facts,
290
+ isForeign,
291
+ ownPackage,
292
+ anyPackage = false,
293
+ ) {
294
+ const found = [];
295
+ const seen = new Set();
296
+ const selectorClasses = (text) => classNames(text.replace(/\[[^\]]*\]/g, ''));
297
+ for (const parts of complexSelectorParts(selectorList)) {
298
+ for (const [index, part] of parts.entries()) {
299
+ const compound = part.compound;
300
+ const handles = [
301
+ ...selectorClasses(compound).map((name) => ({
302
+ entry: classOwnerFor(facts, name, true),
303
+ name: `.${name}`,
304
+ inArgument: (argument) => selectorClasses(argument).includes(name),
305
+ })),
306
+ ...(anyPackage ? dataComponents(compound) : []).map((value) => ({
307
+ entry: facts.dataComponentOwners.get(value),
308
+ name: `[data-component="${value}"]`,
309
+ inArgument: (argument) => dataComponents(argument).includes(value),
310
+ })),
311
+ ];
312
+ for (const { entry, name, inArgument } of handles) {
313
+ if (
314
+ !entry ||
315
+ (!anyPackage && entry.package !== ownPackage) ||
316
+ !isForeign(entry)
317
+ )
318
+ continue;
319
+ const pseudo = ['has', 'is', 'where', 'not'].find((candidate) =>
320
+ pseudoArguments(compound, candidate).some((argument) =>
321
+ inArgument(argument),
322
+ ),
323
+ );
324
+ const position = pseudo
325
+ ? pseudo
326
+ : index === parts.length - 1
327
+ ? 'subject'
328
+ : ['+', '~'].includes(parts[index + 1].combinator)
329
+ ? 'sibling'
330
+ : 'ancestor';
331
+ const key = `${entry.key}|${name}|${position}`;
332
+ if (seen.has(key)) continue;
333
+ seen.add(key);
334
+ found.push({
335
+ entry,
336
+ name,
337
+ position,
338
+ });
339
+ }
340
+ }
341
+ }
342
+ return found;
343
+ }
344
+
345
+ /** The catalog entry whose private `--_<root>-*` variable `property` is. */
346
+ export function privateVariableOwner(property, facts) {
347
+ if (!property.startsWith('--_')) return undefined;
348
+ const owner = facts.privatePrefixes.find(
349
+ ({ prefix }) => property === prefix || property.startsWith(`${prefix}-`),
350
+ );
351
+ if (owner) return owner.entry;
352
+ return property.startsWith('--_kui-') ? null : undefined;
353
+ }
354
+
355
+ /** The typed prop that configures a component token, if one does. */
356
+ export function typedPropForToken(token, facts) {
357
+ return facts.typedTokens.get(token);
358
+ }
359
+
360
+ /** Every configuration seam an entry publishes, as prose. */
361
+ export function configurationFor(entry) {
362
+ if (!entry) return 'its documented props and variants';
363
+ if (isWebAwesomeTagEntry(entry))
364
+ return `<${entry.id}>'s documented attributes and ${entry.package}'s Web Awesome theme tokens`;
365
+ const props = (entry.cssValueProps ?? []).map(({ path }) => `\`${path}\``);
366
+ const rootClass = entry.boundaries?.rootClass;
367
+ const tokens = (entry.boundaries?.publicTokens ?? []).filter(
368
+ (token) => rootClass && token.startsWith(`--${rootClass}-`),
369
+ );
370
+ const seams = [
371
+ ...(props.length ? [`its props (${props.join(', ')})`] : []),
372
+ ...(tokens.length
373
+ ? [
374
+ `its public tokens (${tokens.map((item) => `\`${item}\``).join(', ')})`,
375
+ ]
376
+ : []),
377
+ ];
378
+ return seams.length
379
+ ? `${seams.join(' or ')}, or its documented variants`
380
+ : 'its documented props and variants';
381
+ }
382
+
383
+ /** The shared closing guidance: a missing seam is a component gap. */
384
+ export function reportGap(entry) {
385
+ const owner = entry?.package ?? '@kerfjs/ui';
386
+ return `If no configuration covers this need, report the component gap to ${owner} (open a feature request) instead of overriding it.`;
387
+ }
388
+
389
+ /** A component's short name: its export, or its Web Awesome tag. */
390
+ export function componentName(entry) {
391
+ if (!entry) return 'a Kerf component';
392
+ return isWebAwesomeTagEntry(entry) ? `<${entry.id}>` : entry.name;
393
+ }
394
+
395
+ /** A component's name with its catalog key. */
396
+ export function componentLabel(entry) {
397
+ if (!entry) return 'a Kerf component';
398
+ return isWebAwesomeTagEntry(entry)
399
+ ? `<${entry.id}>`
400
+ : `${entry.name} (${entry.key})`;
401
+ }
@@ -0,0 +1,53 @@
1
+ export type UiAnalysisSeverity = 'error' | 'review';
2
+
3
+ export interface UiAnalysisDiagnostic {
4
+ ruleId: `KUI-L${string}`;
5
+ severity: UiAnalysisSeverity;
6
+ message: string;
7
+ location: { file: string; line: number; column: number };
8
+ evidence?: unknown;
9
+ chain?: unknown;
10
+ }
11
+
12
+ export interface UiAnalysisProfileDiagnostic {
13
+ code: `KUI-P${string}`;
14
+ source?: string;
15
+ path: string;
16
+ message: string;
17
+ }
18
+
19
+ export interface UiAnalysisReport {
20
+ schemaVersion: 1;
21
+ tool: { name: string; version: 1 };
22
+ root: '.';
23
+ files: string[];
24
+ profile: {
25
+ files?: string[];
26
+ diagnostics: UiAnalysisProfileDiagnostic[];
27
+ };
28
+ diagnostics: UiAnalysisDiagnostic[];
29
+ summary: { errors: number; review: number; suppressed: number };
30
+ }
31
+
32
+ export const UI_ANALYSIS_SCHEMA_VERSION: 1;
33
+ export const UI_ANALYSIS_RULES: Readonly<
34
+ Record<`KUI-L${string}`, { severity: UiAnalysisSeverity; title: string }>
35
+ >;
36
+
37
+ /** The doctor's repair action for rules whose fix is more specific than the default. */
38
+ export const UI_ANALYSIS_ACTIONS: Readonly<Record<`KUI-L${string}`, string>>;
39
+
40
+ export function analyzeUiProject(options?: {
41
+ root?: string;
42
+ paths?: string[];
43
+ profile?: string;
44
+ knownRules?: Iterable<string>;
45
+ adoption?: boolean;
46
+ ownership?: 'package' | 'component';
47
+ ownershipContext?: 'subject' | 'any' | 'any-package';
48
+ implicitComponentOwnership?: boolean;
49
+ ownershipGroups?: Array<{ styleSources: string[]; sources: string[] }>;
50
+ }): Promise<UiAnalysisReport>;
51
+
52
+ export function formatUiAnalysisText(report: UiAnalysisReport): string;
53
+ export function formatUiAnalysisSarif(report: UiAnalysisReport): object;