@kerfjs/ui 5.0.0-beta.11 → 5.0.0-beta.111

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 (1362) hide show
  1. package/README.md +708 -160
  2. package/ai/application-ui-diagnostic-ids-v1.json +115 -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 +222 -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 +34 -0
  10. package/ai/catalog-authoring.schema.json +105 -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 +9118 -1376
  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 +570 -0
  20. package/ai/component-composition.d.ts +143 -0
  21. package/ai/component-composition.json +10444 -0
  22. package/ai/component-composition.schema.json +444 -0
  23. package/ai/components/README.md +206 -0
  24. package/ai/components/anchored-surface.md +99 -0
  25. package/ai/components/application-tabs.md +65 -0
  26. package/ai/components/backdrop-image.md +84 -0
  27. package/ai/components/badge.md +77 -0
  28. package/ai/components/button.md +97 -0
  29. package/ai/components/checkbox-group.md +89 -0
  30. package/ai/components/checkbox.md +90 -0
  31. package/ai/components/chip.md +80 -0
  32. package/ai/components/choice-chips.md +93 -0
  33. package/ai/components/collapsible-panel.md +103 -0
  34. package/ai/components/color-field.md +92 -0
  35. package/ai/components/color-picker.md +93 -0
  36. package/ai/components/color-swatches.md +82 -0
  37. package/ai/components/column-track.md +78 -0
  38. package/ai/components/combobox.md +90 -0
  39. package/ai/components/content-item.md +101 -0
  40. package/ai/components/content-swap.md +78 -0
  41. package/ai/components/corner-status.md +88 -0
  42. package/ai/components/disclosure-arrow.md +77 -0
  43. package/ai/components/disclosure.md +88 -0
  44. package/ai/components/document-baseline.md +77 -0
  45. package/ai/components/edge-activity-indicator.md +81 -0
  46. package/ai/components/empty-state.md +80 -0
  47. package/ai/components/feedback.md +71 -0
  48. package/ai/components/file-picker.md +89 -0
  49. package/ai/components/floating-toolbar.md +82 -0
  50. package/ai/components/foundation.md +65 -0
  51. package/ai/components/framed-list.md +80 -0
  52. package/ai/components/grid.md +101 -0
  53. package/ai/components/headers.md +63 -0
  54. package/ai/components/layout.md +75 -0
  55. package/ai/components/list-action-row.md +108 -0
  56. package/ai/components/list-detail-dialog.md +90 -0
  57. package/ai/components/list-header.md +91 -0
  58. package/ai/components/list-inset-control.md +74 -0
  59. package/ai/components/list-inset-text.md +72 -0
  60. package/ai/components/list-item.md +108 -0
  61. package/ai/components/list.md +127 -0
  62. package/ai/components/loading-spinner.md +73 -0
  63. package/ai/components/lucide-icon.md +99 -0
  64. package/ai/components/message-composer.md +85 -0
  65. package/ai/components/nav-stack.md +120 -0
  66. package/ai/components/pane.md +127 -0
  67. package/ai/components/popup-menu.md +174 -0
  68. package/ai/components/progress-bar.md +82 -0
  69. package/ai/components/progress-ring.md +80 -0
  70. package/ai/components/radio-group.md +89 -0
  71. package/ai/components/recipe-app-shell.md +57 -0
  72. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  73. package/ai/components/recipe-compact-toolbar.md +57 -0
  74. package/ai/components/recipe-composer-form.md +57 -0
  75. package/ai/components/recipe-list-detail-dialog.md +57 -0
  76. package/ai/components/recipe-list-workspace-states.md +57 -0
  77. package/ai/components/recipe-loading-inspector.md +57 -0
  78. package/ai/components/recipe-media-detail.md +57 -0
  79. package/ai/components/recipe-navigation-sidebar.md +57 -0
  80. package/ai/components/recipe-navigation-stack.md +57 -0
  81. package/ai/components/recipe-workspace-header.md +57 -0
  82. package/ai/components/resize.md +106 -0
  83. package/ai/components/row.md +96 -0
  84. package/ai/components/search-field.md +108 -0
  85. package/ai/components/segmented-control.md +83 -0
  86. package/ai/components/select.md +118 -0
  87. package/ai/components/skeleton.md +84 -0
  88. package/ai/components/slider.md +84 -0
  89. package/ai/components/spacer.md +86 -0
  90. package/ai/components/split-button.md +83 -0
  91. package/ai/components/split-view.md +105 -0
  92. package/ai/components/state-banner.md +96 -0
  93. package/ai/components/summary-row.md +85 -0
  94. package/ai/components/sunken-panel.md +79 -0
  95. package/ai/components/surface-scaffold.md +120 -0
  96. package/ai/components/switch.md +81 -0
  97. package/ai/components/tab-bar.md +114 -0
  98. package/ai/components/tab-navigator.md +105 -0
  99. package/ai/components/tabs.md +95 -0
  100. package/ai/components/tag-field.md +86 -0
  101. package/ai/components/text-field.md +102 -0
  102. package/ai/components/text.md +93 -0
  103. package/ai/components/toast.md +85 -0
  104. package/ai/components/toolbar-control-group.md +127 -0
  105. package/ai/components/toolbar-text.md +100 -0
  106. package/ai/components/toolbar.md +103 -0
  107. package/ai/components/tooltip.md +81 -0
  108. package/ai/components/value-table.md +80 -0
  109. package/ai/components/wa-accordion-item.md +61 -0
  110. package/ai/components/wa-accordion.md +71 -0
  111. package/ai/components/wa-animated-image.md +56 -0
  112. package/ai/components/wa-animation.md +56 -0
  113. package/ai/components/wa-avatar.md +56 -0
  114. package/ai/components/wa-badge.md +62 -0
  115. package/ai/components/wa-breadcrumb-item.md +54 -0
  116. package/ai/components/wa-breadcrumb.md +56 -0
  117. package/ai/components/wa-button-group.md +62 -0
  118. package/ai/components/wa-button.md +61 -0
  119. package/ai/components/wa-callout.md +60 -0
  120. package/ai/components/wa-card.md +67 -0
  121. package/ai/components/wa-carousel-item.md +54 -0
  122. package/ai/components/wa-carousel.md +56 -0
  123. package/ai/components/wa-checkbox-group.md +62 -0
  124. package/ai/components/wa-checkbox.md +61 -0
  125. package/ai/components/wa-color-picker.md +63 -0
  126. package/ai/components/wa-comparison.md +56 -0
  127. package/ai/components/wa-copy-button.md +56 -0
  128. package/ai/components/wa-details.md +67 -0
  129. package/ai/components/wa-dialog.md +65 -0
  130. package/ai/components/wa-divider.md +54 -0
  131. package/ai/components/wa-drawer.md +62 -0
  132. package/ai/components/wa-dropdown-item.md +62 -0
  133. package/ai/components/wa-dropdown.md +62 -0
  134. package/ai/components/wa-format-bytes.md +54 -0
  135. package/ai/components/wa-format-date.md +54 -0
  136. package/ai/components/wa-format-number.md +54 -0
  137. package/ai/components/wa-icon.md +59 -0
  138. package/ai/components/wa-include.md +55 -0
  139. package/ai/components/wa-input.md +62 -0
  140. package/ai/components/wa-intersection-observer.md +54 -0
  141. package/ai/components/wa-known-date.md +54 -0
  142. package/ai/components/wa-markdown.md +54 -0
  143. package/ai/components/wa-mutation-observer.md +54 -0
  144. package/ai/components/wa-number-input.md +56 -0
  145. package/ai/components/wa-option.md +61 -0
  146. package/ai/components/wa-otp-input.md +54 -0
  147. package/ai/components/wa-page.md +62 -0
  148. package/ai/components/wa-pagination.md +56 -0
  149. package/ai/components/wa-popover.md +61 -0
  150. package/ai/components/wa-popup.md +60 -0
  151. package/ai/components/wa-progress-bar.md +60 -0
  152. package/ai/components/wa-progress-ring.md +60 -0
  153. package/ai/components/wa-qr-code.md +54 -0
  154. package/ai/components/wa-radio-group.md +67 -0
  155. package/ai/components/wa-radio.md +61 -0
  156. package/ai/components/wa-random-content.md +54 -0
  157. package/ai/components/wa-rating.md +56 -0
  158. package/ai/components/wa-relative-time.md +54 -0
  159. package/ai/components/wa-resize-observer.md +54 -0
  160. package/ai/components/wa-scroller.md +61 -0
  161. package/ai/components/wa-select.md +65 -0
  162. package/ai/components/wa-skeleton.md +60 -0
  163. package/ai/components/wa-slider.md +61 -0
  164. package/ai/components/wa-spinner.md +60 -0
  165. package/ai/components/wa-split-panel.md +60 -0
  166. package/ai/components/wa-step.md +56 -0
  167. package/ai/components/wa-stepper.md +56 -0
  168. package/ai/components/wa-switch.md +60 -0
  169. package/ai/components/wa-tab-group.md +71 -0
  170. package/ai/components/wa-tab-panel.md +62 -0
  171. package/ai/components/wa-tab.md +61 -0
  172. package/ai/components/wa-tag-input.md +62 -0
  173. package/ai/components/wa-tag.md +62 -0
  174. package/ai/components/wa-textarea.md +60 -0
  175. package/ai/components/wa-time-input.md +56 -0
  176. package/ai/components/wa-toast-item.md +62 -0
  177. package/ai/components/wa-toast.md +62 -0
  178. package/ai/components/wa-tooltip.md +61 -0
  179. package/ai/components/wa-tree-item.md +56 -0
  180. package/ai/components/wa-tree.md +56 -0
  181. package/ai/components/wa-zoomable-frame.md +56 -0
  182. package/ai/components/workbench-dialog.md +90 -0
  183. package/ai/components/workbench.md +120 -0
  184. package/ai/public-api-signatures-v1.md +6162 -446
  185. package/ai/skill.md +549 -65
  186. package/ai/webawesome-jsx-signatures-v1.md +12 -2
  187. package/analyzer/cli.mjs +49 -0
  188. package/analyzer/component-ownership.d.mts +72 -0
  189. package/analyzer/component-ownership.mjs +429 -0
  190. package/analyzer/index.d.mts +53 -0
  191. package/analyzer/index.mjs +2375 -0
  192. package/analyzer/loud-pairs.d.mts +49 -0
  193. package/analyzer/loud-pairs.mjs +357 -0
  194. package/analyzer/report.schema.json +66 -0
  195. package/analyzer/selectors.d.mts +21 -0
  196. package/analyzer/selectors.mjs +212 -0
  197. package/catalog-projection-cli.mjs +96 -0
  198. package/catalog-projection.d.mts +55 -0
  199. package/catalog-projection.mjs +62 -0
  200. package/dist/anchored-surface.d.ts +69 -0
  201. package/dist/anchored-surface.js +3 -0
  202. package/dist/anchored-surface.js.map +1 -0
  203. package/dist/backdrop-image.d.ts +140 -0
  204. package/dist/backdrop-image.js +5 -0
  205. package/dist/backdrop-image.js.map +1 -0
  206. package/dist/badge.d.ts +91 -0
  207. package/dist/badge.js +4 -0
  208. package/dist/badge.js.map +1 -0
  209. package/dist/browser/anchored-surface.js +3 -0
  210. package/dist/browser/backdrop-image.js +3 -0
  211. package/dist/browser/badge.js +3 -0
  212. package/dist/browser/button.js +5 -0
  213. package/dist/browser/catalog.js +29 -0
  214. package/dist/browser/checkbox-group.js +5 -0
  215. package/dist/browser/checkbox.js +4 -0
  216. package/dist/browser/chip.js +3 -0
  217. package/dist/browser/choice-chips.js +3 -0
  218. package/dist/browser/collapsible-panel.js +9 -0
  219. package/dist/browser/color-field.js +4 -0
  220. package/dist/browser/color-picker.js +5 -0
  221. package/dist/browser/color-swatches.js +3 -0
  222. package/dist/browser/column-track.js +3 -0
  223. package/dist/browser/combobox.js +3 -0
  224. package/dist/browser/content-item.js +4 -0
  225. package/dist/browser/content-swap.js +3 -0
  226. package/dist/browser/corner-status.js +3 -0
  227. package/dist/browser/disclosure.js +5 -0
  228. package/dist/browser/edge-activity-indicator.js +3 -0
  229. package/dist/browser/file-picker.js +3 -0
  230. package/dist/browser/framed-list.js +3 -0
  231. package/dist/browser/grid.js +3 -0
  232. package/dist/browser/list-action-row.js +3 -0
  233. package/dist/browser/list-detail-dialog.js +14 -0
  234. package/dist/browser/list-header.js +3 -1
  235. package/dist/browser/list-inset-control.js +3 -0
  236. package/dist/browser/list-inset-text.js +3 -0
  237. package/dist/browser/list-item.js +1 -0
  238. package/dist/browser/list.js +3 -0
  239. package/dist/browser/message-composer.js +5 -0
  240. package/dist/browser/nav-stack.js +11 -0
  241. package/dist/browser/pane.js +3 -0
  242. package/dist/browser/popup-menu.js +4 -0
  243. package/dist/browser/progress-bar.js +3 -0
  244. package/dist/browser/progress-ring.js +3 -0
  245. package/dist/browser/radio-group.js +3 -0
  246. package/dist/browser/row.js +3 -0
  247. package/dist/browser/search-field.js +4 -0
  248. package/dist/browser/segmented-control.js +0 -1
  249. package/dist/browser/select.js +2 -1
  250. package/dist/browser/slider.js +3 -0
  251. package/dist/browser/spacer.js +3 -0
  252. package/dist/browser/split-button.js +5 -0
  253. package/dist/browser/split-view.js +13 -0
  254. package/dist/browser/state-banner.js +1 -0
  255. package/dist/browser/summary-row.js +3 -0
  256. package/dist/browser/sunken-panel.js +3 -0
  257. package/dist/browser/surface-scaffold.js +4 -0
  258. package/dist/browser/switch.js +3 -0
  259. package/dist/browser/tab-bar-item.js +4 -0
  260. package/dist/browser/tab-navigator.js +4 -0
  261. package/dist/browser/tag-field.js +5 -0
  262. package/dist/browser/text-field.js +4 -0
  263. package/dist/browser/text.js +3 -0
  264. package/dist/browser/toolbar-control-group.js +1 -0
  265. package/dist/browser/workbench-dialog.js +15 -0
  266. package/dist/browser/workbench.js +14 -0
  267. package/dist/button.d.ts +123 -0
  268. package/dist/button.js +7 -0
  269. package/dist/button.js.map +1 -0
  270. package/dist/catalog-resources.d.ts +51 -0
  271. package/dist/catalog-resources.js +22 -0
  272. package/dist/catalog-resources.js.map +1 -0
  273. package/dist/catalog.d.ts +135 -101
  274. package/dist/catalog.js +701 -108
  275. package/dist/catalog.js.map +1 -1
  276. package/dist/checkbox-group.d.ts +70 -0
  277. package/dist/checkbox-group.js +7 -0
  278. package/dist/checkbox-group.js.map +1 -0
  279. package/dist/checkbox.d.ts +45 -0
  280. package/dist/checkbox.js +6 -0
  281. package/dist/checkbox.js.map +1 -0
  282. package/dist/chip.d.ts +117 -0
  283. package/dist/chip.js +4 -0
  284. package/dist/chip.js.map +1 -0
  285. package/dist/choice-chips.d.ts +116 -0
  286. package/dist/choice-chips.js +3 -0
  287. package/dist/choice-chips.js.map +1 -0
  288. package/dist/chunk-2FW7D4IG.js +52 -0
  289. package/dist/chunk-2FW7D4IG.js.map +1 -0
  290. package/dist/chunk-2GOCOLQL.js +270 -0
  291. package/dist/chunk-2GOCOLQL.js.map +1 -0
  292. package/dist/chunk-2LM3PYHA.js +300 -0
  293. package/dist/chunk-2LM3PYHA.js.map +1 -0
  294. package/dist/chunk-36HVQ72F.js +123 -0
  295. package/dist/chunk-36HVQ72F.js.map +1 -0
  296. package/dist/chunk-3GLYIIFR.js +230 -0
  297. package/dist/chunk-3GLYIIFR.js.map +1 -0
  298. package/dist/chunk-3VZ6SFD4.js +8 -0
  299. package/dist/chunk-3VZ6SFD4.js.map +1 -0
  300. package/dist/chunk-3WYREXW4.js +120 -0
  301. package/dist/chunk-3WYREXW4.js.map +1 -0
  302. package/dist/chunk-3Z7N2NAZ.js +385 -0
  303. package/dist/chunk-3Z7N2NAZ.js.map +1 -0
  304. package/dist/chunk-4OV272LF.js +93 -0
  305. package/dist/chunk-4OV272LF.js.map +1 -0
  306. package/dist/chunk-4RECPEHI.js +67 -0
  307. package/dist/chunk-4RECPEHI.js.map +1 -0
  308. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  309. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  310. package/dist/chunk-5J6Z4BWY.js +141 -0
  311. package/dist/chunk-5J6Z4BWY.js.map +1 -0
  312. package/dist/chunk-6C6DLP3W.js +31 -0
  313. package/dist/chunk-6C6DLP3W.js.map +1 -0
  314. package/dist/chunk-6VVIW7VB.js +69 -0
  315. package/dist/chunk-6VVIW7VB.js.map +1 -0
  316. package/dist/chunk-7AK5I7U7.js +55 -0
  317. package/dist/chunk-7AK5I7U7.js.map +1 -0
  318. package/dist/chunk-7K6U6FCN.js +122 -0
  319. package/dist/chunk-7K6U6FCN.js.map +1 -0
  320. package/dist/chunk-AMIHGFLP.js +59 -0
  321. package/dist/chunk-AMIHGFLP.js.map +1 -0
  322. package/dist/chunk-AN5IWMTM.js +24 -0
  323. package/dist/chunk-AN5IWMTM.js.map +1 -0
  324. package/dist/chunk-ATGAJVZ6.js +268 -0
  325. package/dist/chunk-ATGAJVZ6.js.map +1 -0
  326. package/dist/chunk-AYPGXR2E.js +20 -0
  327. package/dist/chunk-AYPGXR2E.js.map +1 -0
  328. package/dist/chunk-B53PS2LE.js +34 -0
  329. package/dist/chunk-B53PS2LE.js.map +1 -0
  330. package/dist/chunk-BKUMG2KB.js +95 -0
  331. package/dist/chunk-BKUMG2KB.js.map +1 -0
  332. package/dist/chunk-C26Q6P4Q.js +76 -0
  333. package/dist/chunk-C26Q6P4Q.js.map +1 -0
  334. package/dist/chunk-CEJ5FK6G.js +288 -0
  335. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  336. package/dist/chunk-CIAUILRR.js +222 -0
  337. package/dist/chunk-CIAUILRR.js.map +1 -0
  338. package/dist/chunk-CNM6ZWP2.js +38 -0
  339. package/dist/chunk-CNM6ZWP2.js.map +1 -0
  340. package/dist/chunk-CTQUDCY5.js +26 -0
  341. package/dist/chunk-CTQUDCY5.js.map +1 -0
  342. package/dist/chunk-CVD5IZGB.js +66 -0
  343. package/dist/chunk-CVD5IZGB.js.map +1 -0
  344. package/dist/chunk-D4MXSAMI.js +50 -0
  345. package/dist/chunk-D4MXSAMI.js.map +1 -0
  346. package/dist/chunk-D5RGM3XA.js +38 -0
  347. package/dist/chunk-D5RGM3XA.js.map +1 -0
  348. package/dist/chunk-DZJ4GBSP.js +59 -0
  349. package/dist/chunk-DZJ4GBSP.js.map +1 -0
  350. package/dist/chunk-EIET4QLK.js +51 -0
  351. package/dist/chunk-EIET4QLK.js.map +1 -0
  352. package/dist/chunk-EKHDLBRP.js +86 -0
  353. package/dist/chunk-EKHDLBRP.js.map +1 -0
  354. package/dist/chunk-ETFP7HAR.js +147 -0
  355. package/dist/chunk-ETFP7HAR.js.map +1 -0
  356. package/dist/chunk-EYDXFOSH.js +457 -0
  357. package/dist/chunk-EYDXFOSH.js.map +1 -0
  358. package/dist/chunk-G3J7JDP6.js +29 -0
  359. package/dist/chunk-G3J7JDP6.js.map +1 -0
  360. package/dist/chunk-GS2QD3N7.js +14 -0
  361. package/dist/chunk-GS2QD3N7.js.map +1 -0
  362. package/dist/chunk-GXSX6Q6O.js +42 -0
  363. package/dist/chunk-GXSX6Q6O.js.map +1 -0
  364. package/dist/chunk-HDXUHLTQ.js +90 -0
  365. package/dist/chunk-HDXUHLTQ.js.map +1 -0
  366. package/dist/chunk-HJXVVFBT.js +108 -0
  367. package/dist/chunk-HJXVVFBT.js.map +1 -0
  368. package/dist/chunk-HTERKONR.js +49 -0
  369. package/dist/chunk-HTERKONR.js.map +1 -0
  370. package/dist/chunk-HU5IHXCI.js +73 -0
  371. package/dist/chunk-HU5IHXCI.js.map +1 -0
  372. package/dist/chunk-IIQ2XIMU.js +197 -0
  373. package/dist/chunk-IIQ2XIMU.js.map +1 -0
  374. package/dist/chunk-IKS72C6P.js +53 -0
  375. package/dist/chunk-IKS72C6P.js.map +1 -0
  376. package/dist/chunk-IO27YTL3.js +73 -0
  377. package/dist/chunk-IO27YTL3.js.map +1 -0
  378. package/dist/chunk-IQSRHXZR.js +164 -0
  379. package/dist/chunk-IQSRHXZR.js.map +1 -0
  380. package/dist/chunk-IRC5N7FA.js +16 -0
  381. package/dist/chunk-IRC5N7FA.js.map +1 -0
  382. package/dist/chunk-ITENVZ6Q.js +24 -0
  383. package/dist/chunk-ITENVZ6Q.js.map +1 -0
  384. package/dist/chunk-ITUQC4FW.js +163 -0
  385. package/dist/chunk-ITUQC4FW.js.map +1 -0
  386. package/dist/chunk-JCCN3U6X.js +176 -0
  387. package/dist/chunk-JCCN3U6X.js.map +1 -0
  388. package/dist/chunk-K57NINLH.js +137 -0
  389. package/dist/chunk-K57NINLH.js.map +1 -0
  390. package/dist/chunk-KC6WUSNS.js +34 -0
  391. package/dist/chunk-KC6WUSNS.js.map +1 -0
  392. package/dist/chunk-KCS6NJ3O.js +82 -0
  393. package/dist/chunk-KCS6NJ3O.js.map +1 -0
  394. package/dist/chunk-KDQZ3E5C.js +75 -0
  395. package/dist/chunk-KDQZ3E5C.js.map +1 -0
  396. package/dist/chunk-KH4KEMSP.js +71 -0
  397. package/dist/chunk-KH4KEMSP.js.map +1 -0
  398. package/dist/chunk-KK3S5OTW.js +98 -0
  399. package/dist/chunk-KK3S5OTW.js.map +1 -0
  400. package/dist/chunk-LMHN2TJL.js +167 -0
  401. package/dist/chunk-LMHN2TJL.js.map +1 -0
  402. package/dist/chunk-LTBVP6VN.js +59 -0
  403. package/dist/chunk-LTBVP6VN.js.map +1 -0
  404. package/dist/{chunk-YGN7OMLT.js → chunk-LZUUUHNH.js} +13 -6
  405. package/dist/chunk-LZUUUHNH.js.map +1 -0
  406. package/dist/chunk-MHMWQ7RB.js +19 -0
  407. package/dist/chunk-MHMWQ7RB.js.map +1 -0
  408. package/dist/chunk-MJ5RU6XT.js +173 -0
  409. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  410. package/dist/chunk-MVKHSAKE.js +169 -0
  411. package/dist/chunk-MVKHSAKE.js.map +1 -0
  412. package/dist/chunk-NB6POCFH.js +103 -0
  413. package/dist/chunk-NB6POCFH.js.map +1 -0
  414. package/dist/chunk-NR6O74ST.js +169 -0
  415. package/dist/chunk-NR6O74ST.js.map +1 -0
  416. package/dist/chunk-OHPYT2BH.js +82 -0
  417. package/dist/chunk-OHPYT2BH.js.map +1 -0
  418. package/dist/chunk-OQP3PFKQ.js +341 -0
  419. package/dist/chunk-OQP3PFKQ.js.map +1 -0
  420. package/dist/chunk-OUCHU7JB.js +162 -0
  421. package/dist/chunk-OUCHU7JB.js.map +1 -0
  422. package/dist/chunk-OZ6X76G5.js +547 -0
  423. package/dist/chunk-OZ6X76G5.js.map +1 -0
  424. package/dist/chunk-PS24PVR6.js +124 -0
  425. package/dist/chunk-PS24PVR6.js.map +1 -0
  426. package/dist/chunk-QDSZTQXL.js +28 -0
  427. package/dist/chunk-QDSZTQXL.js.map +1 -0
  428. package/dist/chunk-QH5KOFNS.js +39 -0
  429. package/dist/chunk-QH5KOFNS.js.map +1 -0
  430. package/dist/chunk-QPTJ5DOO.js +87 -0
  431. package/dist/chunk-QPTJ5DOO.js.map +1 -0
  432. package/dist/chunk-QYMJHS4K.js +36 -0
  433. package/dist/chunk-QYMJHS4K.js.map +1 -0
  434. package/dist/chunk-RMWNO6BA.js +89 -0
  435. package/dist/chunk-RMWNO6BA.js.map +1 -0
  436. package/dist/chunk-S2XULQEK.js +52 -0
  437. package/dist/chunk-S2XULQEK.js.map +1 -0
  438. package/dist/chunk-S3ECMF23.js +33 -0
  439. package/dist/chunk-S3ECMF23.js.map +1 -0
  440. package/dist/chunk-S4Y3YTAI.js +35 -0
  441. package/dist/chunk-S4Y3YTAI.js.map +1 -0
  442. package/dist/chunk-S4ZGTDSG.js +18 -0
  443. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  444. package/dist/chunk-SOBRGH7T.js +151 -0
  445. package/dist/chunk-SOBRGH7T.js.map +1 -0
  446. package/dist/chunk-T74YB76U.js +547 -0
  447. package/dist/chunk-T74YB76U.js.map +1 -0
  448. package/dist/chunk-TI2GV36S.js +90 -0
  449. package/dist/chunk-TI2GV36S.js.map +1 -0
  450. package/dist/{chunk-56RJXPHG.js → chunk-TKNVL53O.js} +7 -4
  451. package/dist/chunk-TKNVL53O.js.map +1 -0
  452. package/dist/chunk-TNJLNLVE.js +115 -0
  453. package/dist/chunk-TNJLNLVE.js.map +1 -0
  454. package/dist/chunk-TUID42UE.js +15 -0
  455. package/dist/chunk-TUID42UE.js.map +1 -0
  456. package/dist/chunk-UMNHJSIO.js +848 -0
  457. package/dist/chunk-UMNHJSIO.js.map +1 -0
  458. package/dist/chunk-VEME3D7K.js +298 -0
  459. package/dist/chunk-VEME3D7K.js.map +1 -0
  460. package/dist/chunk-VGECEXM6.js +213 -0
  461. package/dist/chunk-VGECEXM6.js.map +1 -0
  462. package/dist/chunk-WD6KABEU.js +200 -0
  463. package/dist/chunk-WD6KABEU.js.map +1 -0
  464. package/dist/chunk-WPNIKZMJ.js +507 -0
  465. package/dist/chunk-WPNIKZMJ.js.map +1 -0
  466. package/dist/chunk-WVS6CUCT.js +48 -0
  467. package/dist/chunk-WVS6CUCT.js.map +1 -0
  468. package/dist/chunk-XRZSK2WC.js +159 -0
  469. package/dist/chunk-XRZSK2WC.js.map +1 -0
  470. package/dist/chunk-XWNXGFX3.js +381 -0
  471. package/dist/chunk-XWNXGFX3.js.map +1 -0
  472. package/dist/chunk-Y6KT7ZTR.js +109 -0
  473. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  474. package/dist/chunk-YMUIQRWK.js +44 -0
  475. package/dist/chunk-YMUIQRWK.js.map +1 -0
  476. package/dist/chunk-YPAQFBMN.js +527 -0
  477. package/dist/chunk-YPAQFBMN.js.map +1 -0
  478. package/dist/chunk-ZCDRLN3B.js +138 -0
  479. package/dist/chunk-ZCDRLN3B.js.map +1 -0
  480. package/dist/chunk-ZKKO4MHC.js +25 -0
  481. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  482. package/dist/chunk-ZN7KUMPY.js +48 -0
  483. package/dist/chunk-ZN7KUMPY.js.map +1 -0
  484. package/dist/chunk-ZNROKDSZ.js +54 -0
  485. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  486. package/dist/chunk-ZX2QQJXD.js +249 -0
  487. package/dist/chunk-ZX2QQJXD.js.map +1 -0
  488. package/dist/collapsible-panel.d.ts +97 -17
  489. package/dist/collapsible-panel.js +134 -14
  490. package/dist/collapsible-panel.js.map +1 -1
  491. package/dist/color-field.d.ts +51 -0
  492. package/dist/color-field.js +92 -0
  493. package/dist/color-field.js.map +1 -0
  494. package/dist/color-picker.d.ts +113 -0
  495. package/dist/color-picker.js +8 -0
  496. package/dist/color-picker.js.map +1 -0
  497. package/dist/color-swatches.d.ts +56 -0
  498. package/dist/color-swatches.js +4 -0
  499. package/dist/color-swatches.js.map +1 -0
  500. package/dist/column-track.d.ts +41 -0
  501. package/dist/column-track.js +4 -0
  502. package/dist/column-track.js.map +1 -0
  503. package/dist/combobox.d.ts +40 -0
  504. package/dist/combobox.js +3 -0
  505. package/dist/combobox.js.map +1 -0
  506. package/dist/content-item.d.ts +170 -0
  507. package/dist/content-item.js +7 -0
  508. package/dist/content-item.js.map +1 -0
  509. package/dist/content-swap.d.ts +34 -0
  510. package/dist/content-swap.js +3 -0
  511. package/dist/content-swap.js.map +1 -0
  512. package/dist/corner-status.d.ts +36 -0
  513. package/dist/corner-status.js +3 -0
  514. package/dist/corner-status.js.map +1 -0
  515. package/dist/css-values.d.ts +127 -0
  516. package/dist/css-values.js +3 -0
  517. package/dist/css-values.js.map +1 -0
  518. package/dist/device-class.js +34 -6
  519. package/dist/device-class.js.map +1 -1
  520. package/dist/disclosure-arrow.d.ts +6 -1
  521. package/dist/disclosure-arrow.js +2 -1
  522. package/dist/disclosure.d.ts +66 -0
  523. package/dist/disclosure.js +51 -0
  524. package/dist/disclosure.js.map +1 -0
  525. package/dist/edge-activity-indicator.d.ts +28 -0
  526. package/dist/edge-activity-indicator.js +3 -0
  527. package/dist/edge-activity-indicator.js.map +1 -0
  528. package/dist/empty-state.d.ts +5 -2
  529. package/dist/empty-state.js +2 -1
  530. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  531. package/dist/file-picker.d.ts +54 -0
  532. package/dist/file-picker.js +3 -0
  533. package/dist/file-picker.js.map +1 -0
  534. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  535. package/dist/floating-toolbar.d.ts +29 -6
  536. package/dist/floating-toolbar.js +1 -1
  537. package/dist/framed-list.d.ts +47 -0
  538. package/dist/framed-list.js +4 -0
  539. package/dist/framed-list.js.map +1 -0
  540. package/dist/grid.d.ts +58 -0
  541. package/dist/grid.js +6 -0
  542. package/dist/grid.js.map +1 -0
  543. package/dist/help-tags-register.d.ts +13 -0
  544. package/dist/help-tags-register.js +10 -0
  545. package/dist/help-tags-register.js.map +1 -0
  546. package/dist/index.d.ts +73 -17
  547. package/dist/index.js +85 -25
  548. package/dist/list-action-row.d.ts +69 -12
  549. package/dist/list-action-row.js +8 -1
  550. package/dist/list-detail-dialog.d.ts +124 -0
  551. package/dist/list-detail-dialog.js +168 -0
  552. package/dist/list-detail-dialog.js.map +1 -0
  553. package/dist/list-header.d.ts +72 -10
  554. package/dist/list-header.js +4 -1
  555. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  556. package/dist/list-inset-control.d.ts +22 -0
  557. package/dist/list-inset-control.js +3 -0
  558. package/dist/list-inset-control.js.map +1 -0
  559. package/dist/list-inset-text.d.ts +30 -0
  560. package/dist/list-inset-text.js +4 -0
  561. package/dist/list-inset-text.js.map +1 -0
  562. package/dist/list-item.d.ts +49 -5
  563. package/dist/list-item.js +4 -1
  564. package/dist/list.d.ts +149 -0
  565. package/dist/list.js +7 -0
  566. package/dist/list.js.map +1 -0
  567. package/dist/loading-spinner.d.ts +12 -2
  568. package/dist/loading-spinner.js +2 -1
  569. package/dist/lucide-icon.d.ts +23 -3
  570. package/dist/lucide-icon.js +2 -1
  571. package/dist/message-composer.d.ts +70 -0
  572. package/dist/message-composer.js +6 -0
  573. package/dist/message-composer.js.map +1 -0
  574. package/dist/nav-stack-CrZF95VO.d.ts +195 -0
  575. package/dist/nav-stack.d.ts +16 -38
  576. package/dist/nav-stack.js +15 -1
  577. package/dist/pane.d.ts +238 -0
  578. package/dist/pane.js +7 -0
  579. package/dist/pane.js.map +1 -0
  580. package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
  581. package/dist/popup-menu-register.d.ts +11 -0
  582. package/dist/popup-menu-register.js +13 -0
  583. package/dist/popup-menu-register.js.map +1 -0
  584. package/dist/popup-menu.d.ts +153 -0
  585. package/dist/popup-menu.js +7 -0
  586. package/dist/popup-menu.js.map +1 -0
  587. package/dist/progress-bar.d.ts +52 -0
  588. package/dist/progress-bar.js +68 -0
  589. package/dist/progress-bar.js.map +1 -0
  590. package/dist/progress-ring.d.ts +44 -0
  591. package/dist/progress-ring.js +73 -0
  592. package/dist/progress-ring.js.map +1 -0
  593. package/dist/radio-group.d.ts +62 -0
  594. package/dist/radio-group.js +4 -0
  595. package/dist/radio-group.js.map +1 -0
  596. package/dist/resizable-region.d.ts +32 -3
  597. package/dist/resizable-region.js +1 -1
  598. package/dist/row.d.ts +53 -0
  599. package/dist/row.js +7 -0
  600. package/dist/row.js.map +1 -0
  601. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  602. package/dist/search-field-CrGTN5sa.d.ts +208 -0
  603. package/dist/search-field-model.d.ts +3 -0
  604. package/dist/search-field-model.js +3 -0
  605. package/dist/search-field-model.js.map +1 -0
  606. package/dist/search-field.d.ts +3 -0
  607. package/dist/search-field.js +5 -0
  608. package/dist/search-field.js.map +1 -0
  609. package/dist/segmented-control.d.ts +14 -9
  610. package/dist/segmented-control.js +1 -2
  611. package/dist/select-register.d.ts +6 -3
  612. package/dist/select-register.js +402 -8
  613. package/dist/select-register.js.map +1 -1
  614. package/dist/select.d.ts +128 -9
  615. package/dist/select.js +6 -1
  616. package/dist/selection.d.ts +54 -0
  617. package/dist/selection.js +3 -0
  618. package/dist/selection.js.map +1 -0
  619. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  620. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  621. package/dist/sides-BPSWde0A.d.ts +4 -0
  622. package/dist/skeleton.d.ts +14 -7
  623. package/dist/skeleton.js +2 -1
  624. package/dist/slider.d.ts +74 -0
  625. package/dist/slider.js +103 -0
  626. package/dist/slider.js.map +1 -0
  627. package/dist/spacer.d.ts +18 -0
  628. package/dist/spacer.js +4 -0
  629. package/dist/spacer.js.map +1 -0
  630. package/dist/split-button.d.ts +69 -0
  631. package/dist/split-button.js +7 -0
  632. package/dist/split-button.js.map +1 -0
  633. package/dist/split-view.d.ts +67 -6
  634. package/dist/split-view.js +15 -15
  635. package/dist/split-view.js.map +1 -1
  636. package/dist/state-banner.d.ts +41 -7
  637. package/dist/state-banner.js +4 -1
  638. package/dist/styles/anchored-surface.css +44 -0
  639. package/dist/styles/backdrop-image.css +258 -0
  640. package/dist/styles/badge.css +157 -0
  641. package/dist/styles/button.css +293 -0
  642. package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
  643. package/dist/styles/catalog/components/catalog-example.css +250 -0
  644. package/dist/styles/catalog/components/catalog-stage.css +61 -0
  645. package/dist/styles/catalog/components/catalog.css +26 -0
  646. package/dist/styles/catalog.css +5 -522
  647. package/dist/styles/checkbox-group.css +63 -0
  648. package/dist/styles/checkbox.css +122 -0
  649. package/dist/styles/chip.css +234 -0
  650. package/dist/styles/choice-chips.css +205 -0
  651. package/dist/styles/collapsible-panel.css +450 -16
  652. package/dist/styles/color-field.css +125 -0
  653. package/dist/styles/color-picker.css +366 -0
  654. package/dist/styles/color-swatches.css +122 -0
  655. package/dist/styles/column-track.css +57 -0
  656. package/dist/styles/combobox.css +115 -0
  657. package/dist/styles/components/actions/button/button.css +293 -0
  658. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  659. package/dist/styles/components/actions/popup-menu/popup-menu.css +498 -0
  660. package/dist/styles/components/actions/split-button/split-button.css +141 -0
  661. package/dist/styles/components/actions/toolbar/toolbar.css +483 -0
  662. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1188 -0
  663. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +256 -0
  664. package/dist/styles/components/collections/framed-list/framed-list.css +53 -0
  665. package/dist/styles/components/collections/list/list.css +293 -0
  666. package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
  667. package/dist/styles/components/collections/list-header/list-header.css +236 -0
  668. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  669. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  670. package/dist/styles/components/collections/list-item/list-item.css +461 -0
  671. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  672. package/dist/styles/components/data-display/value-table/value-table.css +183 -0
  673. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +44 -0
  674. package/dist/styles/components/feedback/badge/badge.css +157 -0
  675. package/dist/styles/components/feedback/chip/chip.css +234 -0
  676. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  677. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  678. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  679. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  680. package/dist/styles/components/feedback/progress-bar/progress-bar.css +168 -0
  681. package/dist/styles/components/feedback/progress-ring/progress-ring.css +91 -0
  682. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  683. package/dist/styles/components/feedback/state-banner/state-banner.css +312 -0
  684. package/dist/styles/components/forms/checkbox/checkbox.css +122 -0
  685. package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
  686. package/dist/styles/components/forms/choice-chips/choice-chips.css +205 -0
  687. package/dist/styles/components/forms/color-field/color-field.css +125 -0
  688. package/dist/styles/components/forms/color-picker/color-picker.css +366 -0
  689. package/dist/styles/components/forms/color-swatches/color-swatches.css +122 -0
  690. package/dist/styles/components/forms/combobox/combobox.css +115 -0
  691. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  692. package/dist/styles/components/forms/message-composer/message-composer.css +84 -0
  693. package/dist/styles/components/forms/radio-group/radio-group.css +158 -0
  694. package/dist/styles/components/forms/search-field/search-field.css +441 -0
  695. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  696. package/dist/styles/components/forms/select/select.css +580 -0
  697. package/dist/styles/components/forms/slider/slider.css +241 -0
  698. package/dist/styles/components/forms/switch/switch.css +132 -0
  699. package/dist/styles/components/forms/tag-field/tag-field.css +8 -0
  700. package/dist/styles/components/forms/text-field/text-field.css +193 -0
  701. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  702. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  703. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  704. package/dist/styles/components/layout/grid/grid.css +88 -0
  705. package/dist/styles/components/layout/pane/pane.css +780 -0
  706. package/dist/styles/components/layout/resizable-region/resizable-region.css +546 -0
  707. package/dist/styles/components/layout/row/row.css +125 -0
  708. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  709. package/dist/styles/components/layout/split-view/split-view.css +171 -0
  710. package/dist/styles/components/layout/workbench/workbench.css +1098 -0
  711. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  712. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +43 -0
  713. package/dist/styles/components/navigation/nav-stack/nav-stack.css +619 -0
  714. package/dist/styles/components/navigation/tab-bar/tab-bar.css +203 -0
  715. package/dist/styles/components/navigation/tab-bar-item/tab-bar-item.css +389 -0
  716. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +460 -0
  717. package/dist/styles/components/surfaces/backdrop-image/backdrop-image.css +258 -0
  718. package/dist/styles/components/surfaces/content-item/content-item.css +220 -0
  719. package/dist/styles/components/surfaces/disclosure/disclosure.css +136 -0
  720. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
  721. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +752 -0
  722. package/dist/styles/components/typography/text/text.css +232 -0
  723. package/dist/styles/content-item.css +3 -0
  724. package/dist/styles/content-swap.css +154 -0
  725. package/dist/styles/corner-status.css +60 -0
  726. package/dist/styles/disclosure-arrow.css +20 -0
  727. package/dist/styles/disclosure.css +136 -0
  728. package/dist/styles/document.css +98 -0
  729. package/dist/styles/edge-activity-indicator.css +127 -0
  730. package/dist/styles/file-picker.css +81 -0
  731. package/dist/styles/floating-toolbar.css +87 -6
  732. package/dist/styles/foundation.css +491 -51
  733. package/dist/styles/framed-list.css +53 -0
  734. package/dist/styles/grid.css +88 -0
  735. package/dist/styles/layout.css +3 -41
  736. package/dist/styles/list-action-row.css +324 -18
  737. package/dist/styles/list-detail-dialog.css +11 -0
  738. package/dist/styles/list-header.css +135 -59
  739. package/dist/styles/list-inset-control.css +30 -0
  740. package/dist/styles/list-inset-text.css +29 -0
  741. package/dist/styles/list-item.css +371 -33
  742. package/dist/styles/list.css +293 -0
  743. package/dist/styles/loading-spinner.css +4 -0
  744. package/dist/styles/lucide-icon.css +9 -0
  745. package/dist/styles/message-composer.css +84 -0
  746. package/dist/styles/nav-stack.css +555 -47
  747. package/dist/styles/overlay-sheet.css +211 -0
  748. package/dist/styles/overlay-toast.css +149 -0
  749. package/dist/styles/overlay-tooltip.css +55 -0
  750. package/dist/styles/pane.css +780 -0
  751. package/dist/styles/popup-menu.css +498 -0
  752. package/dist/styles/progress-bar.css +168 -0
  753. package/dist/styles/progress-ring.css +91 -0
  754. package/dist/styles/radio-group.css +158 -0
  755. package/dist/styles/resizable-region.css +439 -4
  756. package/dist/styles/row.css +125 -0
  757. package/dist/styles/search-field.css +441 -0
  758. package/dist/styles/segmented-control.css +36 -9
  759. package/dist/styles/select.css +516 -74
  760. package/dist/styles/skeleton.css +64 -3
  761. package/dist/styles/slider.css +241 -0
  762. package/dist/styles/spacer.css +11 -0
  763. package/dist/styles/split-button.css +141 -0
  764. package/dist/styles/split-view.css +139 -3
  765. package/dist/styles/state-banner.css +164 -25
  766. package/dist/styles/styles.css +38 -3
  767. package/dist/styles/summary-row.css +161 -0
  768. package/dist/styles/sunken-panel.css +34 -0
  769. package/dist/styles/surface-scaffold.css +752 -0
  770. package/dist/styles/switch.css +132 -0
  771. package/dist/styles/tab-bar-item.css +389 -0
  772. package/dist/styles/tab-bar.css +167 -9
  773. package/dist/styles/tab-navigator.css +460 -0
  774. package/dist/styles/tag-field.css +8 -0
  775. package/dist/styles/text-field.css +193 -0
  776. package/dist/styles/text.css +232 -0
  777. package/dist/styles/toolbar-control-group.css +1000 -37
  778. package/dist/styles/toolbar-text.css +223 -7
  779. package/dist/styles/toolbar.css +433 -11
  780. package/dist/styles/value-table.css +115 -7
  781. package/dist/styles/webawesome.css +476 -20
  782. package/dist/styles/workbench-dialog.css +10 -0
  783. package/dist/styles/workbench.css +1011 -7
  784. package/dist/summary-row.d.ts +56 -0
  785. package/dist/summary-row.js +4 -0
  786. package/dist/summary-row.js.map +1 -0
  787. package/dist/sunken-panel.d.ts +38 -0
  788. package/dist/sunken-panel.js +4 -0
  789. package/dist/sunken-panel.js.map +1 -0
  790. package/dist/surface-scaffold-register.d.ts +12 -0
  791. package/dist/surface-scaffold-register.js +10 -0
  792. package/dist/surface-scaffold-register.js.map +1 -0
  793. package/dist/surface-scaffold.d.ts +284 -0
  794. package/dist/surface-scaffold.js +8 -0
  795. package/dist/surface-scaffold.js.map +1 -0
  796. package/dist/surface-tint-DQgYCaP9.d.ts +25 -0
  797. package/dist/switch.d.ts +38 -0
  798. package/dist/switch.js +4 -0
  799. package/dist/switch.js.map +1 -0
  800. package/dist/tab-bar-item.d.ts +65 -0
  801. package/dist/tab-bar-item.js +6 -0
  802. package/dist/tab-bar-item.js.map +1 -0
  803. package/dist/tab-bar.d.ts +33 -7
  804. package/dist/tab-bar.js +1 -1
  805. package/dist/tab-navigator.d.ts +155 -0
  806. package/dist/tab-navigator.js +132 -0
  807. package/dist/tab-navigator.js.map +1 -0
  808. package/dist/tag-field.d.ts +52 -0
  809. package/dist/tag-field.js +6 -0
  810. package/dist/tag-field.js.map +1 -0
  811. package/dist/text-field.d.ts +91 -0
  812. package/dist/text-field.js +6 -0
  813. package/dist/text-field.js.map +1 -0
  814. package/dist/text.d.ts +103 -0
  815. package/dist/text.js +3 -0
  816. package/dist/text.js.map +1 -0
  817. package/dist/toolbar-control-group.d.ts +112 -8
  818. package/dist/toolbar-control-group.js +3 -1
  819. package/dist/toolbar-text.d.ts +63 -9
  820. package/dist/toolbar-text.js +2 -1
  821. package/dist/toolbar.d.ts +78 -7
  822. package/dist/toolbar.js +1 -1
  823. package/dist/types-DmHWkSd6.d.ts +207 -0
  824. package/dist/value-table.d.ts +30 -4
  825. package/dist/value-table.js +2 -1
  826. package/dist/webawesome.d.ts +11 -1
  827. package/dist/wire-catalog.d.ts +118 -5
  828. package/dist/wire-catalog.js +314 -14
  829. package/dist/wire-catalog.js.map +1 -1
  830. package/dist/wire-checkboxes.d.ts +10 -0
  831. package/dist/wire-checkboxes.js +3 -0
  832. package/dist/{wire-token-search-fields.js.map → wire-checkboxes.js.map} +1 -1
  833. package/dist/wire-choice-chips.d.ts +17 -0
  834. package/dist/wire-choice-chips.js +4 -0
  835. package/dist/wire-choice-chips.js.map +1 -0
  836. package/dist/wire-color-fields.d.ts +33 -0
  837. package/dist/wire-color-fields.js +82 -0
  838. package/dist/wire-color-fields.js.map +1 -0
  839. package/dist/wire-color-pickers.d.ts +35 -0
  840. package/dist/wire-color-pickers.js +9 -0
  841. package/dist/wire-color-pickers.js.map +1 -0
  842. package/dist/wire-comboboxes.d.ts +26 -0
  843. package/dist/wire-comboboxes.js +4 -0
  844. package/dist/wire-comboboxes.js.map +1 -0
  845. package/dist/wire-content-items.d.ts +15 -0
  846. package/dist/wire-content-items.js +270 -0
  847. package/dist/wire-content-items.js.map +1 -0
  848. package/dist/wire-corner-status.d.ts +11 -0
  849. package/dist/wire-corner-status.js +3 -0
  850. package/dist/wire-corner-status.js.map +1 -0
  851. package/dist/wire-file-pickers.d.ts +27 -0
  852. package/dist/wire-file-pickers.js +3 -0
  853. package/dist/wire-file-pickers.js.map +1 -0
  854. package/dist/wire-list-focus-scroll.d.ts +16 -0
  855. package/dist/wire-list-focus-scroll.js +3 -0
  856. package/dist/wire-list-focus-scroll.js.map +1 -0
  857. package/dist/wire-list-reorder.d.ts +41 -0
  858. package/dist/wire-list-reorder.js +3 -0
  859. package/dist/wire-list-reorder.js.map +1 -0
  860. package/dist/wire-message-composers.d.ts +17 -0
  861. package/dist/wire-message-composers.js +3 -0
  862. package/dist/wire-message-composers.js.map +1 -0
  863. package/dist/wire-nav-stack.d.ts +4 -1
  864. package/dist/wire-nav-stack.js +352 -15
  865. package/dist/wire-nav-stack.js.map +1 -1
  866. package/dist/wire-overlay-sheets.d.ts +20 -0
  867. package/dist/wire-overlay-sheets.js +4 -0
  868. package/dist/wire-overlay-sheets.js.map +1 -0
  869. package/dist/wire-pane-chrome.d.ts +21 -0
  870. package/dist/wire-pane-chrome.js +67 -0
  871. package/dist/wire-pane-chrome.js.map +1 -0
  872. package/dist/wire-resizable-regions.d.ts +2 -1
  873. package/dist/wire-resizable-regions.js +2 -1
  874. package/dist/wire-scroll-dividers.d.ts +87 -0
  875. package/dist/wire-scroll-dividers.js +3 -0
  876. package/dist/wire-scroll-dividers.js.map +1 -0
  877. package/dist/{wire-token-search-fields.d.ts → wire-search-fields.d.ts} +34 -25
  878. package/dist/wire-search-fields.js +6 -0
  879. package/dist/wire-search-fields.js.map +1 -0
  880. package/dist/wire-sidebar.d.ts +24 -4
  881. package/dist/wire-sidebar.js +159 -45
  882. package/dist/wire-sidebar.js.map +1 -1
  883. package/dist/wire-sliders.d.ts +12 -0
  884. package/dist/wire-sliders.js +31 -0
  885. package/dist/wire-sliders.js.map +1 -0
  886. package/dist/wire-tab-bars.d.ts +6 -2
  887. package/dist/wire-tab-bars.js +1 -1
  888. package/dist/wire-tab-navigator.d.ts +13 -0
  889. package/dist/wire-tab-navigator.js +153 -0
  890. package/dist/wire-tab-navigator.js.map +1 -0
  891. package/dist/wire-tag-fields.d.ts +41 -0
  892. package/dist/wire-tag-fields.js +258 -0
  893. package/dist/wire-tag-fields.js.map +1 -0
  894. package/dist/wire-text-fields.d.ts +12 -0
  895. package/dist/wire-text-fields.js +3 -0
  896. package/dist/wire-text-fields.js.map +1 -0
  897. package/dist/wire-toolbar-visibility.d.ts +13 -0
  898. package/dist/wire-toolbar-visibility.js +3 -0
  899. package/dist/wire-toolbar-visibility.js.map +1 -0
  900. package/dist/wire-workbench.d.ts +116 -0
  901. package/dist/wire-workbench.js +6 -0
  902. package/dist/wire-workbench.js.map +1 -0
  903. package/dist/workbench-dialog.d.ts +107 -0
  904. package/dist/workbench-dialog.js +128 -0
  905. package/dist/workbench-dialog.js.map +1 -0
  906. package/dist/workbench.d.ts +259 -10
  907. package/dist/workbench.js +22 -15
  908. package/dist/workbench.js.map +1 -1
  909. package/docs/accessibility.md +835 -41
  910. package/docs/anchored-surface.md +107 -0
  911. package/docs/app-layouts.md +200 -10
  912. package/docs/apple-hig.md +2 -0
  913. package/docs/backdrop-image.md +132 -0
  914. package/docs/button.md +15 -0
  915. package/docs/catalog.md +599 -63
  916. package/docs/collapsible-panel.md +308 -25
  917. package/docs/color-field.md +65 -0
  918. package/docs/color-picker.md +102 -0
  919. package/docs/color-swatches.md +46 -0
  920. package/docs/component-contract.md +872 -57
  921. package/docs/component-integration.md +75 -0
  922. package/docs/component-selection.md +1124 -108
  923. package/docs/design/templates/button/emphasis-dark.svg +1 -0
  924. package/docs/design/templates/button/emphasis.svg +1 -0
  925. package/docs/design/templates/button/full-width-dark.svg +1 -0
  926. package/docs/design/templates/button/full-width.svg +1 -0
  927. package/docs/design/templates/button/icons-dark.svg +1 -0
  928. package/docs/design/templates/button/icons.svg +1 -0
  929. package/docs/design/templates/button/pill-dark.svg +1 -0
  930. package/docs/design/templates/button/pill.svg +1 -0
  931. package/docs/design/templates/button/states-dark.svg +1 -0
  932. package/docs/design/templates/button/states.svg +1 -0
  933. package/docs/design/templates/button/toggles-dark.svg +1 -0
  934. package/docs/design/templates/button/toggles.svg +1 -0
  935. package/docs/design/templates/button/tones-dark.svg +1 -0
  936. package/docs/design/templates/button/tones.svg +1 -0
  937. package/docs/design/templates/button-dark.svg +1 -0
  938. package/docs/design/templates/button.svg +1 -0
  939. package/docs/design/templates/checkbox/compact-dark.svg +1 -0
  940. package/docs/design/templates/checkbox/compact.svg +1 -0
  941. package/docs/design/templates/checkbox/error-dark.svg +1 -0
  942. package/docs/design/templates/checkbox/error.svg +1 -0
  943. package/docs/design/templates/checkbox/mixed-dark.svg +1 -0
  944. package/docs/design/templates/checkbox/mixed.svg +1 -0
  945. package/docs/design/templates/checkbox/states-dark.svg +1 -0
  946. package/docs/design/templates/checkbox/states.svg +1 -0
  947. package/docs/design/templates/checkbox-dark.svg +1 -0
  948. package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
  949. package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
  950. package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
  951. package/docs/design/templates/checkbox-group/vertical.svg +1 -0
  952. package/docs/design/templates/checkbox-group-dark.svg +1 -0
  953. package/docs/design/templates/checkbox-group.svg +1 -0
  954. package/docs/design/templates/checkbox.svg +1 -0
  955. package/docs/design/templates/chip/action-filters-dark.svg +1 -0
  956. package/docs/design/templates/chip/action-filters.svg +1 -0
  957. package/docs/design/templates/chip/tags-dark.svg +1 -0
  958. package/docs/design/templates/chip/tags.svg +1 -0
  959. package/docs/design/templates/chip-dark.svg +1 -0
  960. package/docs/design/templates/chip.svg +1 -0
  961. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  962. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  963. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  964. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  965. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  966. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  967. package/docs/design/templates/choice-chips-dark.svg +1 -0
  968. package/docs/design/templates/choice-chips.svg +1 -0
  969. package/docs/design/templates/color-field/compact-dark.svg +1 -0
  970. package/docs/design/templates/color-field/compact.svg +1 -0
  971. package/docs/design/templates/color-field/error-dark.svg +1 -0
  972. package/docs/design/templates/color-field/error.svg +1 -0
  973. package/docs/design/templates/color-field/hint-dark.svg +1 -0
  974. package/docs/design/templates/color-field/hint.svg +1 -0
  975. package/docs/design/templates/color-field-dark.svg +1 -0
  976. package/docs/design/templates/color-field.svg +1 -0
  977. package/docs/design/templates/color-picker/gray-dark.svg +1 -0
  978. package/docs/design/templates/color-picker/gray.svg +1 -0
  979. package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
  980. package/docs/design/templates/color-picker/hsb.svg +1 -0
  981. package/docs/design/templates/color-picker/rgb-dark.svg +1 -0
  982. package/docs/design/templates/color-picker/rgb.svg +1 -0
  983. package/docs/design/templates/color-picker-dark.svg +1 -0
  984. package/docs/design/templates/color-picker.svg +1 -0
  985. package/docs/design/templates/color-swatches/palette-dark.svg +1 -0
  986. package/docs/design/templates/color-swatches/palette.svg +1 -0
  987. package/docs/design/templates/color-swatches-dark.svg +1 -0
  988. package/docs/design/templates/color-swatches.svg +1 -0
  989. package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
  990. package/docs/design/templates/disclosure/embedded.svg +1 -0
  991. package/docs/design/templates/disclosure/framed-sunken-dark.svg +1 -0
  992. package/docs/design/templates/disclosure/framed-sunken.svg +1 -0
  993. package/docs/design/templates/disclosure/plain-dark.svg +1 -0
  994. package/docs/design/templates/disclosure/plain.svg +1 -0
  995. package/docs/design/templates/disclosure-dark.svg +1 -0
  996. package/docs/design/templates/disclosure.svg +1 -0
  997. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  998. package/docs/design/templates/empty-state/filtered.svg +1 -1
  999. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  1000. package/docs/design/templates/empty-state/with-action.svg +1 -1
  1001. package/docs/design/templates/empty-state-dark.svg +1 -7
  1002. package/docs/design/templates/empty-state.svg +1 -7
  1003. package/docs/design/templates/list/compact-dark.svg +1 -0
  1004. package/docs/design/templates/list/compact.svg +1 -0
  1005. package/docs/design/templates/list/stack-dark.svg +1 -0
  1006. package/docs/design/templates/list/stack.svg +1 -0
  1007. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  1008. package/docs/design/templates/list-action-row/default.svg +1 -1
  1009. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  1010. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  1011. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  1012. package/docs/design/templates/list-action-row/selected.svg +1 -1
  1013. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  1014. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  1015. package/docs/design/templates/list-action-row-dark.svg +1 -7
  1016. package/docs/design/templates/list-action-row.svg +1 -7
  1017. package/docs/design/templates/list-dark.svg +1 -0
  1018. package/docs/design/templates/list-header/action-dark.svg +1 -1
  1019. package/docs/design/templates/list-header/action.svg +1 -1
  1020. package/docs/design/templates/list-header/count-dark.svg +1 -1
  1021. package/docs/design/templates/list-header/count.svg +1 -1
  1022. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  1023. package/docs/design/templates/list-header/inline-action.svg +1 -0
  1024. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  1025. package/docs/design/templates/list-header/size-l.svg +1 -0
  1026. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  1027. package/docs/design/templates/list-header/size-m.svg +1 -0
  1028. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  1029. package/docs/design/templates/list-header/size-xl.svg +1 -0
  1030. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  1031. package/docs/design/templates/list-header/size-xs.svg +1 -0
  1032. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  1033. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  1034. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  1035. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  1036. package/docs/design/templates/list-header-dark.svg +1 -11
  1037. package/docs/design/templates/list-header.svg +1 -11
  1038. package/docs/design/templates/list-item/default-dark.svg +1 -1
  1039. package/docs/design/templates/list-item/default.svg +1 -1
  1040. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  1041. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  1042. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  1043. package/docs/design/templates/list-item/multiline.svg +1 -1
  1044. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  1045. package/docs/design/templates/list-item/selected.svg +1 -1
  1046. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  1047. package/docs/design/templates/list-item/trailing.svg +1 -1
  1048. package/docs/design/templates/list-item-dark.svg +1 -11
  1049. package/docs/design/templates/list-item.svg +1 -11
  1050. package/docs/design/templates/list.svg +1 -0
  1051. package/docs/design/templates/message-composer/chat-dark.svg +1 -0
  1052. package/docs/design/templates/message-composer/chat.svg +1 -0
  1053. package/docs/design/templates/message-composer/prompt-dark.svg +1 -0
  1054. package/docs/design/templates/message-composer/prompt.svg +1 -0
  1055. package/docs/design/templates/message-composer-dark.svg +1 -0
  1056. package/docs/design/templates/message-composer.svg +1 -0
  1057. package/docs/design/templates/progress-bar/determinate-dark.svg +1 -0
  1058. package/docs/design/templates/progress-bar/determinate.svg +1 -0
  1059. package/docs/design/templates/progress-bar/tones-dark.svg +1 -0
  1060. package/docs/design/templates/progress-bar/tones.svg +1 -0
  1061. package/docs/design/templates/progress-bar-dark.svg +1 -0
  1062. package/docs/design/templates/progress-bar.svg +1 -0
  1063. package/docs/design/templates/progress-ring/sizes-dark.svg +1 -0
  1064. package/docs/design/templates/progress-ring/sizes.svg +1 -0
  1065. package/docs/design/templates/progress-ring/tones-dark.svg +1 -0
  1066. package/docs/design/templates/progress-ring/tones.svg +1 -0
  1067. package/docs/design/templates/progress-ring-dark.svg +1 -0
  1068. package/docs/design/templates/progress-ring.svg +1 -0
  1069. package/docs/design/templates/radio-group/horizontal-dark.svg +1 -0
  1070. package/docs/design/templates/radio-group/horizontal.svg +1 -0
  1071. package/docs/design/templates/radio-group/vertical-dark.svg +1 -0
  1072. package/docs/design/templates/radio-group/vertical.svg +1 -0
  1073. package/docs/design/templates/radio-group-dark.svg +1 -0
  1074. package/docs/design/templates/radio-group.svg +1 -0
  1075. package/docs/design/templates/search-field/empty-dark.svg +1 -0
  1076. package/docs/design/templates/search-field/empty.svg +1 -0
  1077. package/docs/design/templates/search-field/tokens-dark.svg +1 -0
  1078. package/docs/design/templates/search-field/tokens.svg +1 -0
  1079. package/docs/design/templates/search-field-dark.svg +1 -0
  1080. package/docs/design/templates/search-field.svg +1 -0
  1081. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  1082. package/docs/design/templates/segmented-control/equal.svg +1 -1
  1083. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  1084. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  1085. package/docs/design/templates/segmented-control-dark.svg +1 -7
  1086. package/docs/design/templates/segmented-control.svg +1 -7
  1087. package/docs/design/templates/select/compact-dark.svg +1 -0
  1088. package/docs/design/templates/select/compact.svg +1 -0
  1089. package/docs/design/templates/select/form-dark.svg +1 -0
  1090. package/docs/design/templates/select/form.svg +1 -0
  1091. package/docs/design/templates/select/icons-dark.svg +1 -0
  1092. package/docs/design/templates/select/icons.svg +1 -0
  1093. package/docs/design/templates/select-dark.svg +1 -0
  1094. package/docs/design/templates/select.svg +1 -0
  1095. package/docs/design/templates/skeleton-dark.svg +1 -9
  1096. package/docs/design/templates/skeleton.svg +1 -9
  1097. package/docs/design/templates/slider/compact-dark.svg +1 -0
  1098. package/docs/design/templates/slider/compact.svg +1 -0
  1099. package/docs/design/templates/slider/readout-dark.svg +1 -0
  1100. package/docs/design/templates/slider/readout.svg +1 -0
  1101. package/docs/design/templates/slider/ticks-dark.svg +1 -0
  1102. package/docs/design/templates/slider/ticks.svg +1 -0
  1103. package/docs/design/templates/slider-dark.svg +1 -0
  1104. package/docs/design/templates/slider.svg +1 -0
  1105. package/docs/design/templates/split-button/full-width-dark.svg +1 -0
  1106. package/docs/design/templates/split-button/full-width.svg +1 -0
  1107. package/docs/design/templates/split-button/pill-dark.svg +1 -0
  1108. package/docs/design/templates/split-button/pill.svg +1 -0
  1109. package/docs/design/templates/split-button/states-dark.svg +1 -0
  1110. package/docs/design/templates/split-button/states.svg +1 -0
  1111. package/docs/design/templates/split-button/tones-dark.svg +1 -0
  1112. package/docs/design/templates/split-button/tones.svg +1 -0
  1113. package/docs/design/templates/split-button-dark.svg +1 -0
  1114. package/docs/design/templates/split-button.svg +1 -0
  1115. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  1116. package/docs/design/templates/state-banner/danger.svg +1 -1
  1117. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  1118. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  1119. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  1120. package/docs/design/templates/state-banner/info.svg +1 -1
  1121. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  1122. package/docs/design/templates/state-banner/strip.svg +1 -0
  1123. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  1124. package/docs/design/templates/state-banner/success.svg +1 -1
  1125. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  1126. package/docs/design/templates/state-banner/warning.svg +1 -1
  1127. package/docs/design/templates/state-banner-dark.svg +1 -11
  1128. package/docs/design/templates/state-banner.svg +1 -11
  1129. package/docs/design/templates/switch/compact-dark.svg +1 -0
  1130. package/docs/design/templates/switch/compact.svg +1 -0
  1131. package/docs/design/templates/switch/states-dark.svg +1 -0
  1132. package/docs/design/templates/switch/states.svg +1 -0
  1133. package/docs/design/templates/switch-dark.svg +1 -0
  1134. package/docs/design/templates/switch.svg +1 -0
  1135. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  1136. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  1137. package/docs/design/templates/tab-bar-dark.svg +1 -5
  1138. package/docs/design/templates/tab-bar.svg +1 -5
  1139. package/docs/design/templates/tag-field/error-dark.svg +1 -0
  1140. package/docs/design/templates/tag-field/error.svg +1 -0
  1141. package/docs/design/templates/tag-field/tags-dark.svg +1 -0
  1142. package/docs/design/templates/tag-field/tags.svg +1 -0
  1143. package/docs/design/templates/tag-field-dark.svg +1 -0
  1144. package/docs/design/templates/tag-field.svg +1 -0
  1145. package/docs/design/templates/text-field/compact-dark.svg +1 -0
  1146. package/docs/design/templates/text-field/compact.svg +1 -0
  1147. package/docs/design/templates/text-field/error-dark.svg +1 -0
  1148. package/docs/design/templates/text-field/error.svg +1 -0
  1149. package/docs/design/templates/text-field/labeled-dark.svg +1 -0
  1150. package/docs/design/templates/text-field/labeled.svg +1 -0
  1151. package/docs/design/templates/text-field/multiline-dark.svg +1 -0
  1152. package/docs/design/templates/text-field/multiline.svg +1 -0
  1153. package/docs/design/templates/text-field/number-dark.svg +1 -0
  1154. package/docs/design/templates/text-field/number.svg +1 -0
  1155. package/docs/design/templates/text-field/search-dark.svg +1 -0
  1156. package/docs/design/templates/text-field/search.svg +1 -0
  1157. package/docs/design/templates/text-field-dark.svg +1 -0
  1158. package/docs/design/templates/text-field.svg +1 -0
  1159. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  1160. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  1161. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  1162. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  1163. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  1164. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  1165. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  1166. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  1167. package/docs/design/templates/toolbar-control-group/glass-dark.svg +1 -0
  1168. package/docs/design/templates/toolbar-control-group/glass.svg +1 -0
  1169. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  1170. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  1171. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  1172. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  1173. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  1174. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  1175. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  1176. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  1177. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  1178. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  1179. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  1180. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  1181. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  1182. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  1183. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  1184. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  1185. package/docs/design/templates/toolbar-control-group-dark.svg +1 -11
  1186. package/docs/design/templates/toolbar-control-group.svg +1 -11
  1187. package/docs/design/templates/toolbar-dark.svg +1 -5
  1188. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  1189. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  1190. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  1191. package/docs/design/templates/toolbar-text/default.svg +1 -1
  1192. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  1193. package/docs/design/templates/toolbar-text/large.svg +1 -1
  1194. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  1195. package/docs/design/templates/toolbar-text/small.svg +1 -1
  1196. package/docs/design/templates/toolbar-text-dark.svg +1 -9
  1197. package/docs/design/templates/toolbar-text.svg +1 -9
  1198. package/docs/design/templates/toolbar.svg +1 -5
  1199. package/docs/design/templates/value-table/details-dark.svg +1 -1
  1200. package/docs/design/templates/value-table/details.svg +1 -1
  1201. package/docs/design/templates/value-table-dark.svg +1 -5
  1202. package/docs/design/templates/value-table.svg +1 -5
  1203. package/docs/design/templates.md +89 -33
  1204. package/docs/design-philosophy.md +65 -20
  1205. package/docs/device-class.md +10 -9
  1206. package/docs/disclosure.md +97 -0
  1207. package/docs/document-baseline.md +93 -0
  1208. package/docs/examples/application-ui-profile.json +60 -0
  1209. package/docs/examples/command-palette-adapter.tsx +69 -17
  1210. package/docs/examples/component-catalog-extension.json +52 -0
  1211. package/docs/examples/component-composition-extension.json +80 -0
  1212. package/docs/layout.md +971 -53
  1213. package/docs/list-detail-dialog.md +100 -0
  1214. package/docs/manual-test-plan.md +55 -0
  1215. package/docs/message-composer.md +156 -0
  1216. package/docs/nav-stack.md +327 -14
  1217. package/docs/overlay-toast.md +62 -0
  1218. package/docs/overlay-tooltip.md +53 -0
  1219. package/docs/progress.md +62 -0
  1220. package/docs/recipes.md +156 -73
  1221. package/docs/slider.md +64 -0
  1222. package/docs/split-view.md +96 -7
  1223. package/docs/sunken-panel.md +106 -0
  1224. package/docs/surface-scaffold.md +490 -0
  1225. package/docs/tab-navigator.md +291 -0
  1226. package/docs/tag-field.md +66 -0
  1227. package/docs/type-contracts.md +137 -0
  1228. package/docs/ui-analyzer.md +406 -0
  1229. package/docs/ui-doctor.md +298 -0
  1230. package/docs/ui-evaluator.md +139 -0
  1231. package/docs/ux-demo.md +58 -17
  1232. package/docs/webawesome-migration.md +82 -0
  1233. package/docs/webawesome-theme.md +306 -47
  1234. package/docs/workbench-dialog.md +88 -0
  1235. package/docs/workbench.md +637 -12
  1236. package/docs/writing.md +154 -0
  1237. package/doctor/cli.mjs +120 -0
  1238. package/doctor/component-style-checks.mjs +457 -0
  1239. package/doctor/config.schema.json +94 -0
  1240. package/doctor/copy-capitalization-checks.mjs +603 -0
  1241. package/doctor/eslint-diagnostics.d.mts +24 -0
  1242. package/doctor/eslint-diagnostics.mjs +24 -0
  1243. package/doctor/index.d.mts +122 -0
  1244. package/doctor/index.mjs +1424 -0
  1245. package/doctor/report.schema.json +118 -0
  1246. package/evaluator/cli.mjs +89 -0
  1247. package/evaluator/index.d.mts +90 -0
  1248. package/evaluator/index.mjs +1203 -0
  1249. package/evaluator/report.schema.json +152 -0
  1250. package/llms.txt +943 -54
  1251. package/package.json +488 -43
  1252. package/scripts/component-catalog-extension-validation.mjs +28 -0
  1253. package/traversal-exclusions.mjs +86 -0
  1254. package/ux-demo/recipes/app-shell.tsx +204 -16
  1255. package/ux-demo/recipes/collapsible-sidebar.tsx +206 -45
  1256. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  1257. package/ux-demo/recipes/composer-form.tsx +135 -24
  1258. package/ux-demo/recipes/list-detail-dialog.tsx +155 -21
  1259. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  1260. package/ux-demo/recipes/loaders.ts +11 -3
  1261. package/ux-demo/recipes/loading-inspector.tsx +162 -39
  1262. package/ux-demo/recipes/media-detail.tsx +272 -0
  1263. package/ux-demo/recipes/mount-recipe.ts +28 -11
  1264. package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
  1265. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  1266. package/ux-demo/recipes/types.ts +18 -2
  1267. package/ux-demo/recipes/workspace-header.tsx +86 -5
  1268. package/vite-ux-review.d.mts +83 -0
  1269. package/vite-ux-review.mjs +120 -0
  1270. package/dist/app-tab.d.ts +0 -30
  1271. package/dist/app-tab.js +0 -5
  1272. package/dist/app-tab.js.map +0 -1
  1273. package/dist/browser/app-tab.js +0 -4
  1274. package/dist/browser/panel-header.js +0 -7
  1275. package/dist/browser/token-search-field.js +0 -4
  1276. package/dist/chunk-2Z5TWHKQ.js +0 -34
  1277. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  1278. package/dist/chunk-37T3VNIZ.js +0 -19
  1279. package/dist/chunk-37T3VNIZ.js.map +0 -1
  1280. package/dist/chunk-55DATV3A.js +0 -10
  1281. package/dist/chunk-55DATV3A.js.map +0 -1
  1282. package/dist/chunk-56RJXPHG.js.map +0 -1
  1283. package/dist/chunk-5ATCDSQS.js +0 -42
  1284. package/dist/chunk-5ATCDSQS.js.map +0 -1
  1285. package/dist/chunk-5E2HVJ33.js +0 -10
  1286. package/dist/chunk-5E2HVJ33.js.map +0 -1
  1287. package/dist/chunk-7BR3DO2A.js +0 -31
  1288. package/dist/chunk-7BR3DO2A.js.map +0 -1
  1289. package/dist/chunk-7JB7VPRI.js +0 -34
  1290. package/dist/chunk-7JB7VPRI.js.map +0 -1
  1291. package/dist/chunk-7LDCTU7D.js +0 -134
  1292. package/dist/chunk-7LDCTU7D.js.map +0 -1
  1293. package/dist/chunk-AQNKJRFH.js +0 -79
  1294. package/dist/chunk-AQNKJRFH.js.map +0 -1
  1295. package/dist/chunk-AVZHJN6C.js +0 -14
  1296. package/dist/chunk-AVZHJN6C.js.map +0 -1
  1297. package/dist/chunk-B24C4A6T.js +0 -22
  1298. package/dist/chunk-B24C4A6T.js.map +0 -1
  1299. package/dist/chunk-BLK3UEEI.js +0 -23
  1300. package/dist/chunk-BLK3UEEI.js.map +0 -1
  1301. package/dist/chunk-CH4SQ6H5.js +0 -39
  1302. package/dist/chunk-CH4SQ6H5.js.map +0 -1
  1303. package/dist/chunk-DAFFDO33.js +0 -14
  1304. package/dist/chunk-DAFFDO33.js.map +0 -1
  1305. package/dist/chunk-I7INRJO4.js +0 -17
  1306. package/dist/chunk-I7INRJO4.js.map +0 -1
  1307. package/dist/chunk-L4OKFDJY.js +0 -24
  1308. package/dist/chunk-L4OKFDJY.js.map +0 -1
  1309. package/dist/chunk-LCOBDOCC.js +0 -265
  1310. package/dist/chunk-LCOBDOCC.js.map +0 -1
  1311. package/dist/chunk-M5JRI6MN.js +0 -27
  1312. package/dist/chunk-M5JRI6MN.js.map +0 -1
  1313. package/dist/chunk-RNPGFQ33.js +0 -10
  1314. package/dist/chunk-RNPGFQ33.js.map +0 -1
  1315. package/dist/chunk-RUNWEPR4.js +0 -10
  1316. package/dist/chunk-RUNWEPR4.js.map +0 -1
  1317. package/dist/chunk-W2FK7ZNY.js +0 -26
  1318. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  1319. package/dist/chunk-WVPYVDXY.js +0 -15
  1320. package/dist/chunk-WVPYVDXY.js.map +0 -1
  1321. package/dist/chunk-XE5ZLPCC.js +0 -20
  1322. package/dist/chunk-XE5ZLPCC.js.map +0 -1
  1323. package/dist/chunk-XXMOARTH.js +0 -229
  1324. package/dist/chunk-XXMOARTH.js.map +0 -1
  1325. package/dist/chunk-YGN7OMLT.js.map +0 -1
  1326. package/dist/panel-header.d.ts +0 -36
  1327. package/dist/panel-header.js +0 -7
  1328. package/dist/panel-header.js.map +0 -1
  1329. package/dist/styles/app-tab.css +0 -152
  1330. package/dist/styles/panel-header.css +0 -64
  1331. package/dist/styles/tab-scaffold.css +0 -84
  1332. package/dist/styles/token-search-field.css +0 -289
  1333. package/dist/tab-scaffold.d.ts +0 -30
  1334. package/dist/tab-scaffold.js +0 -16
  1335. package/dist/tab-scaffold.js.map +0 -1
  1336. package/dist/token-search-field.d.ts +0 -43
  1337. package/dist/token-search-field.js +0 -4
  1338. package/dist/token-search-field.js.map +0 -1
  1339. package/dist/wire-tab-scaffold.d.ts +0 -11
  1340. package/dist/wire-tab-scaffold.js +0 -16
  1341. package/dist/wire-tab-scaffold.js.map +0 -1
  1342. package/dist/wire-token-search-fields.js +0 -5
  1343. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  1344. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  1345. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  1346. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  1347. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  1348. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  1349. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  1350. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  1351. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  1352. package/docs/design/templates/panel-header/title-only.svg +0 -1
  1353. package/docs/design/templates/panel-header-dark.svg +0 -13
  1354. package/docs/design/templates/panel-header.svg +0 -13
  1355. package/docs/design/templates/token-search-field/empty-dark.svg +0 -1
  1356. package/docs/design/templates/token-search-field/empty.svg +0 -1
  1357. package/docs/design/templates/token-search-field/tokens-dark.svg +0 -1
  1358. package/docs/design/templates/token-search-field/tokens.svg +0 -1
  1359. package/docs/design/templates/token-search-field-dark.svg +0 -7
  1360. package/docs/design/templates/token-search-field.svg +0 -7
  1361. package/docs/tab-scaffold.md +0 -41
  1362. package/ux-demo/recipes/recipes.css +0 -448
@@ -0,0 +1,1424 @@
1
+ import { createHash } from 'node:crypto';
2
+ import {
3
+ access,
4
+ mkdir,
5
+ readFile,
6
+ readdir,
7
+ rename,
8
+ stat,
9
+ writeFile,
10
+ } from 'node:fs/promises';
11
+ import {
12
+ basename,
13
+ dirname,
14
+ extname,
15
+ isAbsolute,
16
+ relative,
17
+ resolve,
18
+ } from 'node:path';
19
+ import process from 'node:process';
20
+ import { fileURLToPath, pathToFileURL } from 'node:url';
21
+ import { createRequire } from 'node:module';
22
+
23
+ import { loadApplicationUiProfile } from '../ai/application-ui-profile.mjs';
24
+ import {
25
+ analyzeUiProject,
26
+ UI_ANALYSIS_ACTIONS,
27
+ UI_ANALYSIS_RULES,
28
+ } from '../analyzer/index.mjs';
29
+ import { evaluateUi, UI_EVALUATION_RULES } from '../evaluator/index.mjs';
30
+ import { checkComponentStyles } from './component-style-checks.mjs';
31
+ import { checkCopyCapitalization } from './copy-capitalization-checks.mjs';
32
+ import {
33
+ isForeignRuleDefinitionDiagnostic,
34
+ projectConsumerCoreConfig,
35
+ } from './eslint-diagnostics.mjs';
36
+ import { createUiTraversalFilter } from '../traversal-exclusions.mjs';
37
+
38
+ export const UI_DOCTOR_SCHEMA_VERSION = 1;
39
+ export const UI_DOCTOR_EXIT = Object.freeze({
40
+ clean: 0,
41
+ findings: 1,
42
+ configuration: 2,
43
+ cancelled: 130,
44
+ });
45
+ export const UI_DOCTOR_RULES = Object.freeze({
46
+ 'KUI-D001': { severity: 'error', title: 'Doctor configuration is invalid' },
47
+ 'KUI-D002': { severity: 'error', title: 'Doctor run was cancelled' },
48
+ 'KUI-D003': { severity: 'warning', title: 'Diagnostic identifier conflict' },
49
+ 'KUI-D010': { severity: 'error', title: 'Required tool is unavailable' },
50
+ 'KUI-D011': { severity: 'error', title: 'Tool execution failed' },
51
+ 'KUI-D020': {
52
+ severity: 'error',
53
+ title: 'Local component catalog is stale or invalid',
54
+ },
55
+ 'KUI-D030': {
56
+ severity: 'error',
57
+ title: 'Component root class does not match its name',
58
+ },
59
+ 'KUI-D031': {
60
+ severity: 'error',
61
+ title: 'Component stylesheet does not match its name',
62
+ },
63
+ 'KUI-D032': {
64
+ severity: 'error',
65
+ title: 'Stylesheet selects another component class',
66
+ },
67
+ 'KUI-D040': {
68
+ severity: 'warning',
69
+ title: 'Visible label is not title-style capitalized',
70
+ },
71
+ });
72
+
73
+ const sourceExtensions = new Set([
74
+ '.js',
75
+ '.jsx',
76
+ '.mjs',
77
+ '.cjs',
78
+ '.ts',
79
+ '.tsx',
80
+ '.mts',
81
+ '.cts',
82
+ '.css',
83
+ ]);
84
+ const defaultStages = Object.freeze({
85
+ catalog: true,
86
+ typescript: true,
87
+ eslint: true,
88
+ analyzer: true,
89
+ browser: false,
90
+ });
91
+ const exists = async (path) => {
92
+ try {
93
+ await access(path);
94
+ return true;
95
+ } catch {
96
+ return false;
97
+ }
98
+ };
99
+
100
+ function portablePath(root, value) {
101
+ if (!value || !isAbsolute(value)) return value;
102
+ const path = relative(root, value).replaceAll('\\', '/');
103
+ return path === '..' || path.startsWith('../')
104
+ ? `<external>/${basename(value)}`
105
+ : path || '.';
106
+ }
107
+
108
+ function redact(root, value) {
109
+ if (typeof value === 'string') return value.replaceAll(root, '<repo-root>');
110
+ if (Array.isArray(value)) return value.map((item) => redact(root, item));
111
+ if (value && typeof value === 'object')
112
+ return Object.fromEntries(
113
+ Object.entries(value).map(([key, item]) => [key, redact(root, item)]),
114
+ );
115
+ return value;
116
+ }
117
+
118
+ function configDiagnostic(message, location = {}) {
119
+ return {
120
+ id: 'KUI-D001',
121
+ severity: 'error',
122
+ stage: 'doctor',
123
+ message,
124
+ location: {
125
+ file: location.file ?? '.kerf-ui-doctor.json',
126
+ line: location.line ?? 1,
127
+ column: location.column ?? 1,
128
+ path: location.path ?? '$',
129
+ },
130
+ action: 'Correct the doctor configuration and run kerf-ui-doctor again.',
131
+ meaning: UI_DOCTOR_RULES['KUI-D001'].title,
132
+ };
133
+ }
134
+
135
+ export function validateUiDoctorConfig(
136
+ config,
137
+ source = '.kerf-ui-doctor.json',
138
+ ) {
139
+ const diagnostics = [];
140
+ const add = (path, message) =>
141
+ diagnostics.push(configDiagnostic(message, { file: source, path }));
142
+ if (!config || typeof config !== 'object' || Array.isArray(config))
143
+ return [configDiagnostic('Expected a JSON object.', { file: source })];
144
+ const allowed = new Set([
145
+ '$schema',
146
+ 'schemaVersion',
147
+ 'mode',
148
+ 'package',
149
+ 'ownership',
150
+ 'ownershipContext',
151
+ 'implicitComponentOwnership',
152
+ 'ownershipGroups',
153
+ 'stages',
154
+ 'browser',
155
+ 'cache',
156
+ 'failOn',
157
+ 'suppressions',
158
+ ]);
159
+ for (const key of Object.keys(config))
160
+ if (!allowed.has(key)) add(`$.${key}`, 'Unknown configuration property.');
161
+ if (config.$schema !== undefined && typeof config.$schema !== 'string')
162
+ add('$.$schema', '$schema must be a string.');
163
+ if (config.schemaVersion !== 1)
164
+ add('$.schemaVersion', 'schemaVersion must be 1.');
165
+ if (config.mode !== undefined && !['full', 'changed'].includes(config.mode))
166
+ add('$.mode', 'mode must be full or changed.');
167
+ if (
168
+ config.package !== undefined &&
169
+ (typeof config.package !== 'string' || !config.package)
170
+ )
171
+ add(
172
+ '$.package',
173
+ 'package must be a non-empty workspace package name or path.',
174
+ );
175
+ if (
176
+ config.ownership !== undefined &&
177
+ !['package', 'component'].includes(config.ownership)
178
+ )
179
+ add('$.ownership', 'ownership must be package or component.');
180
+ if (
181
+ config.ownershipContext !== undefined &&
182
+ !['subject', 'any', 'any-package'].includes(config.ownershipContext)
183
+ )
184
+ add(
185
+ '$.ownershipContext',
186
+ 'ownershipContext must be subject, any, or any-package.',
187
+ );
188
+ if (
189
+ config.implicitComponentOwnership !== undefined &&
190
+ typeof config.implicitComponentOwnership !== 'boolean'
191
+ )
192
+ add(
193
+ '$.implicitComponentOwnership',
194
+ 'implicitComponentOwnership must be a boolean.',
195
+ );
196
+ if (config.ownershipGroups !== undefined) {
197
+ if (!Array.isArray(config.ownershipGroups))
198
+ add('$.ownershipGroups', 'ownershipGroups must be an array.');
199
+ else
200
+ config.ownershipGroups.forEach((group, index) => {
201
+ const path = `$.ownershipGroups[${index}]`;
202
+ if (!group || typeof group !== 'object' || Array.isArray(group)) {
203
+ add(path, 'Ownership group must be an object.');
204
+ return;
205
+ }
206
+ for (const key of Object.keys(group))
207
+ if (!['styleSources', 'sources'].includes(key))
208
+ add(`${path}.${key}`, 'Unknown ownership group property.');
209
+ for (const key of ['styleSources', 'sources']) {
210
+ const paths = group[key];
211
+ if (
212
+ !Array.isArray(paths) ||
213
+ !paths.length ||
214
+ paths.some(
215
+ (item) =>
216
+ typeof item !== 'string' ||
217
+ !item ||
218
+ item.startsWith('/') ||
219
+ /(^|\/)\.\.(\/|$)|[?*]/.test(item),
220
+ ) ||
221
+ new Set(paths).size !== paths.length
222
+ )
223
+ add(
224
+ `${path}.${key}`,
225
+ `${key} must be a non-empty array of unique, relative paths without traversal or globs.`,
226
+ );
227
+ }
228
+ });
229
+ }
230
+ if (config.stages !== undefined) {
231
+ if (
232
+ !config.stages ||
233
+ typeof config.stages !== 'object' ||
234
+ Array.isArray(config.stages)
235
+ )
236
+ add('$.stages', 'stages must be an object.');
237
+ else
238
+ for (const [name, enabled] of Object.entries(config.stages)) {
239
+ if (!(name in defaultStages)) add(`$.stages.${name}`, 'Unknown stage.');
240
+ else if (typeof enabled !== 'boolean')
241
+ add(`$.stages.${name}`, 'Stage values must be boolean.');
242
+ }
243
+ }
244
+ if (config.browser !== undefined) {
245
+ if (
246
+ !config.browser ||
247
+ typeof config.browser !== 'object' ||
248
+ Array.isArray(config.browser)
249
+ )
250
+ add('$.browser', 'browser must be an object.');
251
+ else {
252
+ const browserKeys = new Set([
253
+ 'url',
254
+ 'browsers',
255
+ 'retention',
256
+ 'outputDirectory',
257
+ 'reportPath',
258
+ ]);
259
+ for (const key of Object.keys(config.browser))
260
+ if (!browserKeys.has(key))
261
+ add(`$.browser.${key}`, 'Unknown browser property.');
262
+ if (
263
+ typeof config.browser.url !== 'string' ||
264
+ !/^https?:\/\//.test(config.browser.url)
265
+ )
266
+ add('$.browser.url', 'browser.url must be an explicit http(s) URL.');
267
+ if (
268
+ config.browser.browsers !== undefined &&
269
+ (!Array.isArray(config.browser.browsers) ||
270
+ config.browser.browsers.some(
271
+ (item) => !['chromium', 'firefox', 'webkit'].includes(item),
272
+ ))
273
+ )
274
+ add(
275
+ '$.browser.browsers',
276
+ 'browser.browsers must contain only chromium, firefox, or webkit.',
277
+ );
278
+ if (
279
+ config.browser.retention !== undefined &&
280
+ !['always', 'on-failure', 'never'].includes(config.browser.retention)
281
+ )
282
+ add(
283
+ '$.browser.retention',
284
+ 'browser.retention must be always, on-failure, or never.',
285
+ );
286
+ for (const key of ['outputDirectory', 'reportPath'])
287
+ if (
288
+ config.browser[key] !== undefined &&
289
+ (typeof config.browser[key] !== 'string' ||
290
+ !config.browser[key] ||
291
+ isAbsolute(config.browser[key]) ||
292
+ config.browser[key].split(/[\\/]/).includes('..'))
293
+ )
294
+ add(
295
+ `$.browser.${key}`,
296
+ `${key} must be a portable workspace-relative path.`,
297
+ );
298
+ }
299
+ }
300
+ if (config.cache !== undefined && typeof config.cache !== 'boolean')
301
+ add('$.cache', 'cache must be boolean.');
302
+ if (
303
+ config.failOn !== undefined &&
304
+ !['error', 'review', 'warning'].includes(config.failOn)
305
+ )
306
+ add('$.failOn', 'failOn must be error, review, or warning.');
307
+ if (config.suppressions !== undefined) {
308
+ if (!Array.isArray(config.suppressions))
309
+ add('$.suppressions', 'suppressions must be an array.');
310
+ else {
311
+ const ids = new Set();
312
+ config.suppressions.forEach((item, index) => {
313
+ const at = `$.suppressions[${index}]`;
314
+ if (!item || typeof item !== 'object' || Array.isArray(item))
315
+ return add(at, 'Suppression must be an object.');
316
+ if (typeof item.id !== 'string' || !/^[a-z][a-z0-9-]*$/.test(item.id))
317
+ add(
318
+ `${at}.id`,
319
+ 'Suppression id must be a stable lowercase identifier.',
320
+ );
321
+ else if (ids.has(item.id))
322
+ add(`${at}.id`, 'Suppression ids must be unique.');
323
+ else ids.add(item.id);
324
+ if (
325
+ !Array.isArray(item.rules) ||
326
+ !item.rules.length ||
327
+ item.rules.some((rule) => typeof rule !== 'string')
328
+ )
329
+ add(
330
+ `${at}.rules`,
331
+ 'Suppression rules must be a non-empty string array.',
332
+ );
333
+ else if (new Set(item.rules).size !== item.rules.length)
334
+ add(`${at}.rules`, 'Suppression rules must be unique.');
335
+ if (
336
+ typeof item.target !== 'string' ||
337
+ !item.target ||
338
+ isAbsolute(item.target) ||
339
+ item.target.includes('..') ||
340
+ /[*?]/.test(item.target)
341
+ )
342
+ add(
343
+ `${at}.target`,
344
+ 'Suppression target must be an exact portable relative path or browser selector.',
345
+ );
346
+ if (
347
+ typeof item.rationale !== 'string' ||
348
+ item.rationale.trim().length < 12
349
+ )
350
+ add(
351
+ `${at}.rationale`,
352
+ 'Suppression rationale must contain at least 12 characters.',
353
+ );
354
+ });
355
+ }
356
+ }
357
+ return diagnostics;
358
+ }
359
+
360
+ export async function readUiDoctorConfig(
361
+ root,
362
+ path = resolve(root, '.kerf-ui-doctor.json'),
363
+ ) {
364
+ if (!(await exists(path)))
365
+ return { path, config: { schemaVersion: 1 }, diagnostics: [] };
366
+ try {
367
+ const config = JSON.parse(await readFile(path, 'utf8'));
368
+ return {
369
+ path,
370
+ config,
371
+ diagnostics: validateUiDoctorConfig(config, portablePath(root, path)),
372
+ };
373
+ } catch (error) {
374
+ return {
375
+ path,
376
+ config: {},
377
+ diagnostics: [
378
+ configDiagnostic(`Invalid JSON: ${error.message}`, {
379
+ file: portablePath(root, path),
380
+ }),
381
+ ],
382
+ };
383
+ }
384
+ }
385
+
386
+ async function workspacePackages(root) {
387
+ let manifest;
388
+ try {
389
+ manifest = JSON.parse(
390
+ await readFile(resolve(root, 'package.json'), 'utf8'),
391
+ );
392
+ } catch {
393
+ return [];
394
+ }
395
+ const patterns = Array.isArray(manifest.workspaces)
396
+ ? manifest.workspaces
397
+ : (manifest.workspaces?.packages ?? []);
398
+ const directories = [];
399
+ for (const pattern of patterns) {
400
+ if (typeof pattern !== 'string') continue;
401
+ if (!pattern.includes('*')) directories.push(resolve(root, pattern));
402
+ else {
403
+ const [prefix, suffix = ''] = pattern.split('*');
404
+ const parent = resolve(root, prefix);
405
+ try {
406
+ for (const entry of await readdir(parent, { withFileTypes: true }))
407
+ if (entry.isDirectory())
408
+ directories.push(resolve(parent, entry.name, suffix));
409
+ } catch {
410
+ /* A declared workspace glob may currently be empty. */
411
+ }
412
+ }
413
+ }
414
+ return Promise.all(
415
+ directories.map(async (directory) => {
416
+ try {
417
+ return {
418
+ directory,
419
+ manifest: JSON.parse(
420
+ await readFile(resolve(directory, 'package.json'), 'utf8'),
421
+ ),
422
+ };
423
+ } catch {
424
+ return null;
425
+ }
426
+ }),
427
+ ).then((items) => items.filter(Boolean));
428
+ }
429
+
430
+ export async function resolveUiDoctorPackage(root, selector) {
431
+ if (!selector) return root;
432
+ const direct = resolve(root, selector);
433
+ if (
434
+ (await exists(resolve(direct, 'package.json'))) &&
435
+ !relative(root, direct).startsWith('..')
436
+ )
437
+ return direct;
438
+ const match = (await workspacePackages(root)).find(
439
+ ({ manifest }) => manifest.name === selector,
440
+ );
441
+ if (!match) throw new Error(`Workspace package ${selector} was not found.`);
442
+ return match.directory;
443
+ }
444
+
445
+ async function collectInputs(root, paths) {
446
+ const result = [];
447
+ const excluded = await createUiTraversalFilter(root);
448
+ const visit = async (path) => {
449
+ if (excluded(path)) return;
450
+ let details;
451
+ try {
452
+ details = await stat(path);
453
+ } catch {
454
+ return;
455
+ }
456
+ if (details.isFile()) {
457
+ if (
458
+ sourceExtensions.has(extname(path)) ||
459
+ extname(path) === '.json' ||
460
+ basename(path).startsWith('.kerf-ui-') ||
461
+ ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock'].includes(
462
+ basename(path),
463
+ ) ||
464
+ basename(path).startsWith('tsconfig')
465
+ )
466
+ result.push(path);
467
+ return;
468
+ }
469
+ for (const entry of await readdir(path, { withFileTypes: true })) {
470
+ await visit(resolve(path, entry.name));
471
+ }
472
+ };
473
+ for (const path of paths?.length ? paths : [root])
474
+ await visit(resolve(root, path));
475
+ return result.sort();
476
+ }
477
+
478
+ async function installedPackageVersion(root, name) {
479
+ try {
480
+ const require = createRequire(resolve(root, 'package.json'));
481
+ let directory = dirname(require.resolve(name));
482
+ while (true) {
483
+ const manifestPath = resolve(directory, 'package.json');
484
+ if (await exists(manifestPath)) {
485
+ const manifest = JSON.parse(await readFile(manifestPath, 'utf8'));
486
+ if (manifest.name === name) return manifest.version ?? 'unknown';
487
+ }
488
+ const parent = dirname(directory);
489
+ if (parent === directory) break;
490
+ directory = parent;
491
+ }
492
+ } catch {
493
+ return 'unavailable';
494
+ }
495
+ return 'unavailable';
496
+ }
497
+
498
+ async function cacheKey(root, packageRoot, mode, paths, config) {
499
+ const files = await collectInputs(packageRoot);
500
+ for (const directory of new Set([root, packageRoot])) {
501
+ for (const name of [
502
+ 'package.json',
503
+ 'package-lock.json',
504
+ 'pnpm-lock.yaml',
505
+ 'yarn.lock',
506
+ 'tsconfig.json',
507
+ '.kerf-ui-profile.json',
508
+ '.kerf-ui-doctor.json',
509
+ '.gitignore',
510
+ ]) {
511
+ const path = resolve(directory, name);
512
+ if (!files.includes(path) && (await exists(path))) files.push(path);
513
+ }
514
+ }
515
+ files.sort();
516
+ const toolVersions = Object.fromEntries(
517
+ await Promise.all(
518
+ [
519
+ 'typescript',
520
+ 'eslint',
521
+ 'eslint-plugin-kerfjs',
522
+ 'create-kerf-component',
523
+ ].map(async (name) => [
524
+ name,
525
+ await installedPackageVersion(packageRoot, name),
526
+ ]),
527
+ ),
528
+ );
529
+ const hash = createHash('sha256')
530
+ .update(
531
+ JSON.stringify({
532
+ schema: 1,
533
+ package: portablePath(root, packageRoot),
534
+ mode,
535
+ paths,
536
+ config,
537
+ toolVersions,
538
+ }),
539
+ )
540
+ .update(await readFile(fileURLToPath(import.meta.url)));
541
+ for (const module of [
542
+ 'component-style-checks.mjs',
543
+ 'copy-capitalization-checks.mjs',
544
+ ])
545
+ hash.update(
546
+ await readFile(resolve(dirname(fileURLToPath(import.meta.url)), module)),
547
+ );
548
+ for (const file of files)
549
+ hash.update(portablePath(root, file)).update(await readFile(file));
550
+ return hash.digest('hex');
551
+ }
552
+
553
+ async function readCache(path, key) {
554
+ try {
555
+ const value = JSON.parse(await readFile(path, 'utf8'));
556
+ return value.key === key ? value.report : undefined;
557
+ } catch {
558
+ return undefined;
559
+ }
560
+ }
561
+
562
+ async function writeCache(path, key, report) {
563
+ await mkdir(dirname(path), { recursive: true });
564
+ const temporary = `${path}.${process.pid}.tmp`;
565
+ await writeFile(temporary, `${JSON.stringify({ key, report }, null, 2)}\n`);
566
+ await rename(temporary, path);
567
+ }
568
+
569
+ function normalizedDiagnostic(item) {
570
+ const diagnostic = {
571
+ id: item.id,
572
+ severity: item.severity,
573
+ stage: item.stage,
574
+ message: item.message,
575
+ };
576
+ for (const key of [
577
+ 'location',
578
+ 'dom',
579
+ 'evidence',
580
+ 'catalogFacts',
581
+ 'documentation',
582
+ 'action',
583
+ 'sources',
584
+ 'meaning',
585
+ ])
586
+ if (item[key] !== undefined) diagnostic[key] = item[key];
587
+ if (!diagnostic.documentation) {
588
+ const guides = {
589
+ catalog: '@kerfjs/ui/ai/application-ui-profile.schema.json',
590
+ typescript: 'https://www.typescriptlang.org/tsconfig/',
591
+ eslint: 'eslint-plugin-kerfjs/README.md',
592
+ analyzer: '@kerfjs/ui/docs/ui-analyzer.md',
593
+ browser: '@kerfjs/ui/docs/ui-evaluator.md',
594
+ doctor: '@kerfjs/ui/docs/ui-doctor.md',
595
+ merged: '@kerfjs/ui/docs/ui-doctor.md#report-and-exit-contract',
596
+ };
597
+ diagnostic.documentation = guides[item.stage];
598
+ }
599
+ return diagnostic;
600
+ }
601
+
602
+ function normalizeProfile(item, root) {
603
+ return normalizedDiagnostic({
604
+ id: item.code,
605
+ severity: 'error',
606
+ stage: 'catalog',
607
+ message: item.message,
608
+ location: {
609
+ file: portablePath(root, item.source),
610
+ line: 1,
611
+ column: 1,
612
+ path: item.path,
613
+ },
614
+ action:
615
+ 'Repair the source-located application UI profile or catalog artifact.',
616
+ meaning: item.code,
617
+ });
618
+ }
619
+
620
+ function normalizeAnalyzer(report) {
621
+ return [
622
+ ...report.profile.diagnostics.map((item) =>
623
+ normalizedDiagnostic({
624
+ id: item.code,
625
+ severity: 'error',
626
+ stage: 'analyzer',
627
+ message: item.message,
628
+ location: { file: item.source, line: 1, column: 1, path: item.path },
629
+ action: 'Repair the application UI profile before layout analysis.',
630
+ meaning: item.code,
631
+ }),
632
+ ),
633
+ ...report.diagnostics.map((item) =>
634
+ normalizedDiagnostic({
635
+ id: item.ruleId,
636
+ severity: item.severity,
637
+ stage: 'analyzer',
638
+ message: item.message,
639
+ location: item.location,
640
+ evidence: item.evidence,
641
+ catalogFacts: item.chain,
642
+ action:
643
+ UI_ANALYSIS_ACTIONS[item.ruleId] ??
644
+ 'Apply the catalog-declared composition or geometry boundary at this source location.',
645
+ meaning: UI_ANALYSIS_RULES[item.ruleId]?.title ?? item.ruleId,
646
+ }),
647
+ ),
648
+ ];
649
+ }
650
+
651
+ function normalizeEvaluator(report) {
652
+ return report.diagnostics.map((item) =>
653
+ normalizedDiagnostic({
654
+ id: item.code,
655
+ severity: item.severity,
656
+ stage: 'browser',
657
+ message: item.message,
658
+ dom: { context: item.context, selector: item.selector ?? '<page>' },
659
+ evidence: item.evidence,
660
+ action: item.repair,
661
+ meaning: UI_EVALUATION_RULES[item.code]?.title ?? item.code,
662
+ }),
663
+ );
664
+ }
665
+
666
+ function mergeDiagnostics(items) {
667
+ const merged = [];
668
+ const exact = new Map();
669
+ const meanings = new Map();
670
+ for (const raw of items) {
671
+ const item = normalizedDiagnostic(raw);
672
+ const location = item.location
673
+ ? JSON.stringify(item.location)
674
+ : JSON.stringify(item.dom ?? {});
675
+ const key = JSON.stringify([
676
+ item.id,
677
+ item.severity,
678
+ item.message,
679
+ location,
680
+ ]);
681
+ if (exact.has(key)) {
682
+ const previous = exact.get(key);
683
+ previous.sources = [
684
+ ...new Set([...(previous.sources ?? [previous.stage]), item.stage]),
685
+ ].sort();
686
+ previous.stage = 'merged';
687
+ continue;
688
+ }
689
+ exact.set(key, item);
690
+ merged.push(item);
691
+ const signature = JSON.stringify([
692
+ item.severity,
693
+ item.meaning ?? item.message,
694
+ ]);
695
+ const previous = meanings.get(item.id);
696
+ if (previous && previous !== signature)
697
+ merged.push(
698
+ normalizedDiagnostic({
699
+ id: 'KUI-D003',
700
+ severity: 'warning',
701
+ stage: 'doctor',
702
+ message: `${item.id} was emitted with conflicting severity or meaning; both findings were retained.`,
703
+ evidence: { diagnosticId: item.id },
704
+ action:
705
+ 'Upgrade the conflicting tool versions so diagnostic identifiers have one stable meaning.',
706
+ }),
707
+ );
708
+ else meanings.set(item.id, signature);
709
+ }
710
+ for (const item of merged) delete item.meaning;
711
+ return merged.sort(
712
+ (left, right) =>
713
+ (left.location?.file ?? left.dom?.selector ?? '').localeCompare(
714
+ right.location?.file ?? right.dom?.selector ?? '',
715
+ ) ||
716
+ (left.location?.line ?? 0) - (right.location?.line ?? 0) ||
717
+ left.id.localeCompare(right.id) ||
718
+ left.message.localeCompare(right.message),
719
+ );
720
+ }
721
+
722
+ function applySuppressions(diagnostics, suppressions) {
723
+ const active = [],
724
+ suppressed = [];
725
+ for (const item of diagnostics) {
726
+ const target = item.location?.file ?? item.dom?.selector;
727
+ const suppression = suppressions.find(
728
+ (candidate) =>
729
+ candidate.rules.includes(item.id) && candidate.target === target,
730
+ );
731
+ if (suppression)
732
+ suppressed.push({
733
+ ...item,
734
+ suppression: { id: suppression.id, rationale: suppression.rationale },
735
+ });
736
+ else active.push(item);
737
+ }
738
+ return { active, suppressed };
739
+ }
740
+
741
+ function unavailable(stage, error) {
742
+ return normalizedDiagnostic({
743
+ id: 'KUI-D010',
744
+ severity: 'error',
745
+ stage,
746
+ message: `${stage} is unavailable: ${error.message}`,
747
+ action: `Install and configure the ${stage} tool in the selected workspace package.`,
748
+ meaning: UI_DOCTOR_RULES['KUI-D010'].title,
749
+ });
750
+ }
751
+
752
+ async function importFrom(root, specifier) {
753
+ const require = createRequire(resolve(root, 'package.json'));
754
+ return import(pathToFileURL(require.resolve(specifier)).href);
755
+ }
756
+
757
+ async function installedEslintRuleIds(packageRoot) {
758
+ try {
759
+ const module = await importFrom(packageRoot, 'eslint-plugin-kerfjs');
760
+ const plugin = module.default ?? module;
761
+ const ids = new Set();
762
+ for (const rule of Object.values(plugin.rules ?? {}))
763
+ for (const template of Object.values(rule.meta?.messages ?? {}))
764
+ for (const match of String(template).matchAll(/\bKUI-[A-Z]\d{3}\b/g))
765
+ ids.add(match[0]);
766
+ return [...ids];
767
+ } catch {
768
+ return [];
769
+ }
770
+ }
771
+
772
+ async function sharedDiagnosticRuleIds() {
773
+ const registry = JSON.parse(
774
+ await readFile(
775
+ resolve(
776
+ import.meta.dirname,
777
+ '../ai/application-ui-diagnostic-ids-v1.json',
778
+ ),
779
+ 'utf8',
780
+ ),
781
+ );
782
+ if (registry.schemaVersion !== 1 || !Array.isArray(registry.ids))
783
+ throw new Error(
784
+ 'The packaged application UI diagnostic registry must have schemaVersion 1 and an ids array.',
785
+ );
786
+ return registry.ids;
787
+ }
788
+
789
+ async function hasLocalCatalogConfiguration(root) {
790
+ const manifests = [
791
+ root,
792
+ ...(await workspacePackages(root)).map((item) => item.directory),
793
+ ];
794
+ for (const directory of manifests) {
795
+ try {
796
+ const manifest = JSON.parse(
797
+ await readFile(resolve(directory, 'package.json'), 'utf8'),
798
+ );
799
+ if (manifest.kerfComponentCatalog) return true;
800
+ } catch {
801
+ /* Profile validation reports other JSON failures. */
802
+ }
803
+ }
804
+ return false;
805
+ }
806
+
807
+ async function validateLocalCatalogs(root) {
808
+ if (!(await hasLocalCatalogConfiguration(root)))
809
+ return {
810
+ diagnostics: [],
811
+ detail:
812
+ 'No local component metadata; declared profile catalogs were validated.',
813
+ };
814
+ try {
815
+ const module = await importFrom(root, 'create-kerf-component/catalog.js');
816
+ module.runCatalogCommand({ root, check: true });
817
+ return { diagnostics: [] };
818
+ } catch (error) {
819
+ if (
820
+ ['ERR_MODULE_NOT_FOUND', 'MODULE_NOT_FOUND'].includes(error?.code) ||
821
+ /Cannot find (?:module|package)/.test(error?.message ?? '')
822
+ )
823
+ throw error;
824
+ const messages = error.diagnostics ?? [error.message];
825
+ return {
826
+ diagnostics: messages.map((message) =>
827
+ normalizedDiagnostic({
828
+ id: 'KUI-D020',
829
+ severity: 'error',
830
+ stage: 'catalog',
831
+ message,
832
+ documentation:
833
+ 'create-kerf-component/README.md#machine-readable-component-metadata',
834
+ action:
835
+ 'Repair local kerf.components.json metadata or run kerf-component-catalog --write, then review the generated catalog.',
836
+ meaning: UI_DOCTOR_RULES['KUI-D020'].title,
837
+ }),
838
+ ),
839
+ };
840
+ }
841
+ }
842
+
843
+ function normalizeChangedPaths(root, packageRoot, paths) {
844
+ if (!paths) return undefined;
845
+ const normalized = [];
846
+ for (const input of paths) {
847
+ const fromRoot = resolve(root, input);
848
+ const fromPackage = resolve(packageRoot, input);
849
+ const candidate =
850
+ packageRoot === root || !relative(packageRoot, fromRoot).startsWith('..')
851
+ ? fromRoot
852
+ : fromPackage;
853
+ const path = relative(packageRoot, candidate).replaceAll('\\', '/');
854
+ if (path && path !== '..' && !path.startsWith('../')) normalized.push(path);
855
+ }
856
+ return [...new Set(normalized)].sort();
857
+ }
858
+
859
+ async function runTypeScript({ packageRoot, paths }) {
860
+ const ts = await importFrom(packageRoot, 'typescript');
861
+ const configPath = ts.default.findConfigFile(
862
+ packageRoot,
863
+ ts.default.sys.fileExists,
864
+ 'tsconfig.json',
865
+ );
866
+ if (!configPath)
867
+ return { diagnostics: [], detail: 'No tsconfig.json; skipped.' };
868
+ const parsed = ts.default.getParsedCommandLineOfConfigFile(
869
+ configPath,
870
+ {},
871
+ { ...ts.default.sys, onUnRecoverableConfigFileDiagnostic: () => {} },
872
+ );
873
+ if (!parsed) throw new Error('TypeScript could not parse tsconfig.json.');
874
+ const selected = paths?.length
875
+ ? new Set(paths.map((path) => resolve(packageRoot, path)))
876
+ : undefined;
877
+ const excluded = await createUiTraversalFilter(packageRoot);
878
+ parsed.fileNames = parsed.fileNames.filter((file) => {
879
+ if (excluded(file)) return false;
880
+ if (!selected || selected.has(file)) return true;
881
+ return /\.d\.(?:ts|mts|cts)$/.test(file);
882
+ });
883
+ const program = ts.default.createProgram(
884
+ parsed.fileNames,
885
+ { ...parsed.options, noEmit: true },
886
+ undefined,
887
+ undefined,
888
+ parsed.projectReferences,
889
+ );
890
+ const diagnostics = [
891
+ ...parsed.errors,
892
+ ...ts.default.getPreEmitDiagnostics(program),
893
+ ]
894
+ .filter(
895
+ (item) =>
896
+ !selected || !item.file || selected.has(resolve(item.file.fileName)),
897
+ )
898
+ .map((item) => {
899
+ const point =
900
+ item.file && item.start !== undefined
901
+ ? item.file.getLineAndCharacterOfPosition(item.start)
902
+ : undefined;
903
+ return normalizedDiagnostic({
904
+ id: `TS${item.code}`,
905
+ severity:
906
+ item.category === ts.default.DiagnosticCategory.Error
907
+ ? 'error'
908
+ : 'warning',
909
+ stage: 'typescript',
910
+ message: ts.default.flattenDiagnosticMessageText(
911
+ item.messageText,
912
+ '\n',
913
+ ),
914
+ location: item.file
915
+ ? {
916
+ file: portablePath(packageRoot, item.file.fileName),
917
+ line: (point?.line ?? 0) + 1,
918
+ column: (point?.character ?? 0) + 1,
919
+ }
920
+ : undefined,
921
+ action: 'Repair the TypeScript diagnostic at this source location.',
922
+ meaning: `TypeScript diagnostic TS${item.code}`,
923
+ });
924
+ });
925
+ return { diagnostics };
926
+ }
927
+
928
+ // ESLint has two severities; the analyzer has a third, `review`. The presets
929
+ // configure every rule whose KUI code the analyzer classifies as `review`
930
+ // (`KUI-L017`) as `warn`, so a warning for such a code is that review finding
931
+ // and merges with the analyzer's report instead of conflicting with it.
932
+ function eslintSeverity(severity, code) {
933
+ if (severity === 2) return 'error';
934
+ return UI_ANALYSIS_RULES[code]?.severity === 'review' ? 'review' : 'warning';
935
+ }
936
+
937
+ async function runEslint({
938
+ packageRoot,
939
+ paths,
940
+ eslintConfig = 'recommended-ui',
941
+ }) {
942
+ const [{ ESLint }, pluginModule] = await Promise.all([
943
+ importFrom(packageRoot, 'eslint'),
944
+ importFrom(packageRoot, 'eslint-plugin-kerfjs'),
945
+ ]);
946
+ const plugin = pluginModule.default ?? pluginModule;
947
+ const meanings = new Map();
948
+ for (const rule of Object.values(plugin.rules ?? {}))
949
+ for (const template of Object.values(rule.meta?.messages ?? {}))
950
+ for (const match of String(template).matchAll(/\bKUI-[A-Z]\d{3}\b/g))
951
+ meanings.set(match[0], String(template));
952
+ const preset = plugin.configs?.[eslintConfig];
953
+ if (!preset)
954
+ throw new Error(`eslint-plugin-kerfjs does not export ${eslintConfig}.`);
955
+ const inputs = await collectInputs(packageRoot, paths);
956
+ const usesTypeScript = inputs.some((file) =>
957
+ /\.(?:ts|tsx|mts|cts)$/.test(file),
958
+ );
959
+ const base = {
960
+ files: ['**/*.{js,jsx,mjs,cjs}'],
961
+ languageOptions: {
962
+ parserOptions: {
963
+ ecmaVersion: 'latest',
964
+ sourceType: 'module',
965
+ ecmaFeatures: { jsx: true },
966
+ },
967
+ },
968
+ };
969
+ const configs = [
970
+ { ignores: (await createUiTraversalFilter(packageRoot)).eslintIgnores },
971
+ base,
972
+ ];
973
+ if (usesTypeScript) {
974
+ const parserModule = await importFrom(
975
+ packageRoot,
976
+ '@typescript-eslint/parser',
977
+ );
978
+ configs.push({
979
+ files: ['**/*.{ts,tsx,mts,cts}'],
980
+ languageOptions: {
981
+ parser: parserModule.default ?? parserModule,
982
+ parserOptions: {
983
+ ecmaVersion: 'latest',
984
+ sourceType: 'module',
985
+ ecmaFeatures: { jsx: true },
986
+ },
987
+ },
988
+ });
989
+ }
990
+ configs.push(preset);
991
+ const consumerEslint = new ESLint({ cwd: packageRoot });
992
+ if (await consumerEslint.findConfigFile()) {
993
+ const consumerCoreConfigs = await Promise.all(
994
+ inputs.map(async (file) =>
995
+ projectConsumerCoreConfig(
996
+ await consumerEslint.calculateConfigForFile(file),
997
+ portablePath(packageRoot, file),
998
+ ),
999
+ ),
1000
+ );
1001
+ configs.push(...consumerCoreConfigs.filter(Boolean));
1002
+ }
1003
+ const eslint = new ESLint({
1004
+ cwd: packageRoot,
1005
+ overrideConfigFile: true,
1006
+ overrideConfig: configs,
1007
+ });
1008
+ const targets = paths?.length ? paths : ['.'];
1009
+ const results = await eslint.lintFiles(targets);
1010
+ const diagnostics = [];
1011
+ for (const result of results)
1012
+ for (const item of result.messages) {
1013
+ if (isForeignRuleDefinitionDiagnostic(item)) continue;
1014
+ const code = item.message.match(/\bKUI-[A-Z]\d{3}\b/)?.[0];
1015
+ diagnostics.push(
1016
+ normalizedDiagnostic({
1017
+ id: code ?? `eslint:${item.ruleId ?? 'parse-error'}`,
1018
+ severity: eslintSeverity(item.severity, code),
1019
+ stage: 'eslint',
1020
+ message: item.message.replace(/^KUI-[A-Z]\d{3}:\s*/, ''),
1021
+ location: {
1022
+ file: portablePath(packageRoot, result.filePath),
1023
+ line: item.line ?? 1,
1024
+ column: item.column ?? 1,
1025
+ },
1026
+ documentation: item.ruleId
1027
+ ? `eslint-plugin-kerfjs/docs/rules/${item.ruleId.replace(/^kerfjs\//, '')}.md`
1028
+ : 'https://eslint.org/docs/latest/use/troubleshooting',
1029
+ action: item.suggestions?.length
1030
+ ? 'Apply one of ESLint’s safe suggestions after reviewing its edit.'
1031
+ : 'Repair the ESLint diagnostic at this source location.',
1032
+ meaning: meanings.get(code) ?? item.ruleId ?? 'ESLint parse error',
1033
+ }),
1034
+ );
1035
+ }
1036
+ return { diagnostics };
1037
+ }
1038
+
1039
+ async function stage(name, runner, signal) {
1040
+ if (signal?.aborted)
1041
+ return { id: name, status: 'cancelled', diagnostics: [] };
1042
+ try {
1043
+ const value = await runner();
1044
+ if (signal?.aborted)
1045
+ return { id: name, status: 'cancelled', diagnostics: [] };
1046
+ return {
1047
+ id: name,
1048
+ status: value.detail?.includes('skipped') ? 'skipped' : 'ran',
1049
+ detail: value.detail,
1050
+ diagnostics: value.diagnostics ?? [],
1051
+ };
1052
+ } catch (error) {
1053
+ if (signal?.aborted || error?.name === 'AbortError')
1054
+ return { id: name, status: 'cancelled', diagnostics: [] };
1055
+ if (
1056
+ ['ERR_MODULE_NOT_FOUND', 'MODULE_NOT_FOUND'].includes(error?.code) ||
1057
+ /Cannot find (?:module|package)/.test(error?.message ?? '')
1058
+ )
1059
+ return {
1060
+ id: name,
1061
+ status: 'unavailable',
1062
+ diagnostics: [unavailable(name, error)],
1063
+ };
1064
+ return {
1065
+ id: name,
1066
+ status: 'failed',
1067
+ diagnostics: [
1068
+ normalizedDiagnostic({
1069
+ id: 'KUI-D011',
1070
+ severity: 'error',
1071
+ stage: name,
1072
+ message: error.message,
1073
+ action: `Repair the ${name} configuration and rerun the doctor.`,
1074
+ meaning: UI_DOCTOR_RULES['KUI-D011'].title,
1075
+ }),
1076
+ ],
1077
+ };
1078
+ }
1079
+ }
1080
+
1081
+ export async function runUiDoctor({
1082
+ root: requestedRoot = process.cwd(),
1083
+ package: packageSelector,
1084
+ mode,
1085
+ paths,
1086
+ config: suppliedConfig,
1087
+ configPath,
1088
+ cache,
1089
+ failOn,
1090
+ signal,
1091
+ browser,
1092
+ runners = {},
1093
+ eslintConfig = 'recommended-ui',
1094
+ } = {}) {
1095
+ const root = resolve(requestedRoot);
1096
+ const configResult = suppliedConfig
1097
+ ? {
1098
+ path: configPath ?? '<options>',
1099
+ config: suppliedConfig,
1100
+ diagnostics: validateUiDoctorConfig(
1101
+ suppliedConfig,
1102
+ configPath ?? '<options>',
1103
+ ),
1104
+ }
1105
+ : await readUiDoctorConfig(root, configPath && resolve(root, configPath));
1106
+ const config = configResult.config;
1107
+ let packageRoot = root;
1108
+ const initialDiagnostics = [...configResult.diagnostics];
1109
+ try {
1110
+ packageRoot = await resolveUiDoctorPackage(
1111
+ root,
1112
+ packageSelector ?? config.package,
1113
+ );
1114
+ } catch (error) {
1115
+ initialDiagnostics.push(
1116
+ configDiagnostic(error.message, {
1117
+ file: 'package.json',
1118
+ path: '$.workspaces',
1119
+ }),
1120
+ );
1121
+ }
1122
+ const selectedMode = mode ?? config.mode ?? 'full';
1123
+ const selectedFailOn = failOn ?? config.failOn ?? 'error';
1124
+ if (failOn !== undefined && !['error', 'review', 'warning'].includes(failOn))
1125
+ initialDiagnostics.push(
1126
+ configDiagnostic('failOn must be error, review, or warning.', {
1127
+ file: '<options>',
1128
+ path: '$.failOn',
1129
+ }),
1130
+ );
1131
+ const stages = { ...defaultStages, ...config.stages };
1132
+ if (browser?.url || config.browser?.url) stages.browser = true;
1133
+ const selectedPaths =
1134
+ selectedMode === 'changed'
1135
+ ? normalizeChangedPaths(root, packageRoot, paths ?? [])
1136
+ : undefined;
1137
+ if (selectedMode === 'changed' && !selectedPaths?.length)
1138
+ initialDiagnostics.push(
1139
+ configDiagnostic(
1140
+ 'Changed mode requires at least one explicit --path. This prevents a false-clean report.',
1141
+ {
1142
+ file:
1143
+ configResult.path === '<options>'
1144
+ ? '<options>'
1145
+ : portablePath(root, configResult.path),
1146
+ path: '$.mode',
1147
+ },
1148
+ ),
1149
+ );
1150
+ const cacheEnabled = cache ?? config.cache ?? true;
1151
+ const [eslintRuleIds, registeredRuleIds] = await Promise.all([
1152
+ installedEslintRuleIds(packageRoot),
1153
+ sharedDiagnosticRuleIds(),
1154
+ ]);
1155
+ const cachePath = resolve(root, '.kerf-cache/ui-doctor-v1.json');
1156
+ const key = await cacheKey(root, packageRoot, selectedMode, selectedPaths, {
1157
+ ...config,
1158
+ failOn: selectedFailOn,
1159
+ browser: config.browser
1160
+ ? { ...config.browser, url: '<redacted-url>' }
1161
+ : undefined,
1162
+ });
1163
+ if (cacheEnabled && !initialDiagnostics.length && !stages.browser) {
1164
+ const cached = await readCache(cachePath, key);
1165
+ if (cached)
1166
+ return {
1167
+ ...cached,
1168
+ stages: cached.stages.map((item) =>
1169
+ item.status === 'ran' ? { ...item, status: 'cached' } : item,
1170
+ ),
1171
+ cache: { hit: true, key },
1172
+ };
1173
+ }
1174
+ const results = [];
1175
+ if (stages.catalog)
1176
+ results.push(
1177
+ await stage(
1178
+ 'catalog',
1179
+ async () =>
1180
+ runners.catalog
1181
+ ? runners.catalog({
1182
+ root,
1183
+ packageRoot,
1184
+ paths: selectedPaths,
1185
+ signal,
1186
+ })
1187
+ : (async () => {
1188
+ const knownRules = [...registeredRuleIds, ...eslintRuleIds];
1189
+ const result = await loadApplicationUiProfile({
1190
+ workspaceRoot: root,
1191
+ startDirectory: packageRoot,
1192
+ knownRules,
1193
+ });
1194
+ const local = await validateLocalCatalogs(packageRoot);
1195
+ return {
1196
+ diagnostics: [
1197
+ ...result.diagnostics.map((item) =>
1198
+ normalizeProfile(item, root),
1199
+ ),
1200
+ ...local.diagnostics,
1201
+ ],
1202
+ detail: local.detail,
1203
+ };
1204
+ })(),
1205
+ signal,
1206
+ ),
1207
+ );
1208
+ if (stages.typescript)
1209
+ results.push(
1210
+ await stage(
1211
+ 'typescript',
1212
+ () =>
1213
+ (runners.typescript ?? runTypeScript)({
1214
+ root,
1215
+ packageRoot,
1216
+ paths: selectedPaths,
1217
+ signal,
1218
+ }),
1219
+ signal,
1220
+ ),
1221
+ );
1222
+ if (stages.eslint)
1223
+ results.push(
1224
+ await stage(
1225
+ 'eslint',
1226
+ () =>
1227
+ (runners.eslint ?? runEslint)({
1228
+ root,
1229
+ packageRoot,
1230
+ paths: selectedPaths,
1231
+ signal,
1232
+ eslintConfig,
1233
+ }),
1234
+ signal,
1235
+ ),
1236
+ );
1237
+ if (stages.analyzer)
1238
+ results.push(
1239
+ await stage(
1240
+ 'analyzer',
1241
+ () =>
1242
+ runners.analyzer
1243
+ ? runners.analyzer({
1244
+ root,
1245
+ packageRoot,
1246
+ paths: selectedPaths,
1247
+ ownership: config.ownership ?? 'package',
1248
+ ownershipContext: config.ownershipContext ?? 'subject',
1249
+ implicitComponentOwnership:
1250
+ config.implicitComponentOwnership ?? false,
1251
+ ownershipGroups: config.ownershipGroups ?? [],
1252
+ signal,
1253
+ })
1254
+ : (async () => ({
1255
+ diagnostics: [
1256
+ ...normalizeAnalyzer(
1257
+ await analyzeUiProject({
1258
+ root: packageRoot,
1259
+ paths: selectedPaths,
1260
+ ownership: config.ownership ?? 'package',
1261
+ ownershipContext: config.ownershipContext ?? 'subject',
1262
+ implicitComponentOwnership:
1263
+ config.implicitComponentOwnership ?? false,
1264
+ ownershipGroups: config.ownershipGroups ?? [],
1265
+ knownRules: [...registeredRuleIds, ...eslintRuleIds],
1266
+ }),
1267
+ ),
1268
+ ...(await checkComponentStyles(
1269
+ packageRoot,
1270
+ await collectInputs(packageRoot),
1271
+ config.ownershipGroups ?? [],
1272
+ selectedPaths,
1273
+ root,
1274
+ )),
1275
+ ...(await checkCopyCapitalization(
1276
+ packageRoot,
1277
+ await collectInputs(packageRoot),
1278
+ selectedPaths,
1279
+ )),
1280
+ ],
1281
+ }))(),
1282
+ signal,
1283
+ ),
1284
+ );
1285
+ if (stages.browser)
1286
+ results.push(
1287
+ await stage(
1288
+ 'browser',
1289
+ async () =>
1290
+ runners.browser
1291
+ ? runners.browser({
1292
+ root,
1293
+ packageRoot,
1294
+ paths: selectedPaths,
1295
+ signal,
1296
+ browser: { ...config.browser, ...browser },
1297
+ })
1298
+ : (async () => {
1299
+ const options = { ...config.browser, ...browser };
1300
+ if (!options.url)
1301
+ throw new Error(
1302
+ 'The browser stage requires an explicit URL.',
1303
+ );
1304
+ const report = await evaluateUi({
1305
+ url: options.url,
1306
+ workspaceRoot: root,
1307
+ startDirectory: packageRoot,
1308
+ browsers: options.browsers,
1309
+ retention: options.retention ?? 'on-failure',
1310
+ outputDirectory: resolve(
1311
+ root,
1312
+ options.outputDirectory ?? 'kerf-ui-evidence',
1313
+ ),
1314
+ reportPath: resolve(
1315
+ root,
1316
+ options.reportPath ?? 'kerf-ui-evidence/report.json',
1317
+ ),
1318
+ signal,
1319
+ });
1320
+ return { diagnostics: normalizeEvaluator(report) };
1321
+ })(),
1322
+ signal,
1323
+ ),
1324
+ );
1325
+ for (const name of Object.keys(stages))
1326
+ if (!stages[name])
1327
+ results.push({
1328
+ id: name,
1329
+ status: 'skipped',
1330
+ detail: 'Disabled by configuration.',
1331
+ diagnostics: [],
1332
+ });
1333
+ const cancelled =
1334
+ signal?.aborted || results.some((item) => item.status === 'cancelled');
1335
+ const suppressionSource = [...(config.suppressions ?? [])];
1336
+ const emitted = results.flatMap((item) => item.diagnostics);
1337
+ const knownSuppressionRules = new Set([
1338
+ ...registeredRuleIds,
1339
+ ...eslintRuleIds,
1340
+ ...emitted.map((item) => item.id),
1341
+ ]);
1342
+ suppressionSource.forEach((suppression, index) => {
1343
+ for (const rule of suppression.rules ?? [])
1344
+ if (
1345
+ !knownSuppressionRules.has(rule) &&
1346
+ !/^TS\d+$/.test(rule) &&
1347
+ !/^eslint:[a-z0-9@/_-]+$/i.test(rule)
1348
+ )
1349
+ initialDiagnostics.push(
1350
+ configDiagnostic(`Unknown or stale suppression rule id ${rule}.`, {
1351
+ file:
1352
+ configResult.path === '<options>'
1353
+ ? '<options>'
1354
+ : portablePath(root, configResult.path),
1355
+ path: `$.suppressions[${index}].rules`,
1356
+ }),
1357
+ );
1358
+ });
1359
+ const merged = mergeDiagnostics(
1360
+ redact(root, [...initialDiagnostics, ...emitted]),
1361
+ );
1362
+ const { active, suppressed } = applySuppressions(merged, suppressionSource);
1363
+ const infrastructureFailure =
1364
+ initialDiagnostics.length ||
1365
+ results.some((item) => ['failed', 'unavailable'].includes(item.status));
1366
+ const summary = {
1367
+ errors: active.filter((item) => item.severity === 'error').length,
1368
+ warnings: active.filter((item) => item.severity === 'warning').length,
1369
+ review: active.filter((item) => item.severity === 'review').length,
1370
+ suppressed: suppressed.length,
1371
+ };
1372
+ const exitCode = cancelled
1373
+ ? UI_DOCTOR_EXIT.cancelled
1374
+ : infrastructureFailure
1375
+ ? UI_DOCTOR_EXIT.configuration
1376
+ : summary.errors ||
1377
+ (selectedFailOn !== 'error' && summary.review) ||
1378
+ (selectedFailOn === 'warning' && summary.warnings)
1379
+ ? UI_DOCTOR_EXIT.findings
1380
+ : UI_DOCTOR_EXIT.clean;
1381
+ const report = redact(root, {
1382
+ schemaVersion: UI_DOCTOR_SCHEMA_VERSION,
1383
+ tool: { name: '@kerfjs/ui/doctor', reportVersion: 1 },
1384
+ mode: selectedMode,
1385
+ root: '.',
1386
+ package: portablePath(root, packageRoot),
1387
+ paths: selectedPaths ?? [],
1388
+ stages: results
1389
+ .map((item) => {
1390
+ const stageResult = { ...item };
1391
+ delete stageResult.diagnostics;
1392
+ return stageResult;
1393
+ })
1394
+ .sort((a, b) => a.id.localeCompare(b.id)),
1395
+ diagnostics: active,
1396
+ suppressions: suppressed,
1397
+ summary,
1398
+ exitCode,
1399
+ cache: { hit: false, key },
1400
+ });
1401
+ if (cacheEnabled && !cancelled && !infrastructureFailure && !stages.browser)
1402
+ await writeCache(cachePath, key, report);
1403
+ return report;
1404
+ }
1405
+
1406
+ export function formatUiDoctorText(report) {
1407
+ const lines = [];
1408
+ for (const item of report.diagnostics) {
1409
+ const place = item.location
1410
+ ? `${item.location.file}:${item.location.line}:${item.location.column}`
1411
+ : item.dom
1412
+ ? `[${item.dom.context ?? 'browser'} ${item.dom.selector}]`
1413
+ : '<doctor>';
1414
+ lines.push(`${place} ${item.severity} ${item.id} ${item.message}`);
1415
+ if (item.action) lines.push(` Next: ${item.action}`);
1416
+ }
1417
+ lines.push(
1418
+ `Kerf UI doctor: ${report.summary.errors} error(s), ${report.summary.warnings} warning(s), ${report.summary.review} review finding(s), ${report.summary.suppressed} suppressed; exit ${report.exitCode}.`,
1419
+ );
1420
+ lines.push(
1421
+ `Stages: ${report.stages.map((item) => `${item.id}=${item.status}`).join(', ')}${report.cache.hit ? ' (cache hit)' : ''}`,
1422
+ );
1423
+ return lines.join('\n');
1424
+ }