@kerfjs/ui 5.0.0-beta.9 → 5.0.0-beta.91

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 (802) hide show
  1. package/README.md +540 -132
  2. package/ai/application-ui-diagnostic-ids-v1.json +113 -0
  3. package/ai/application-ui-profile-sync.cjs +548 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +106 -0
  6. package/ai/application-ui-profile.defaults.json +96 -0
  7. package/ai/application-ui-profile.mjs +653 -0
  8. package/ai/application-ui-profile.schema.json +140 -0
  9. package/ai/catalog-authoring.json +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 +4487 -633
  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 +520 -0
  20. package/ai/component-composition.d.ts +129 -0
  21. package/ai/component-composition.json +7470 -0
  22. package/ai/component-composition.schema.json +408 -0
  23. package/ai/components/README.md +172 -0
  24. package/ai/components/anchored-surface.md +86 -0
  25. package/ai/components/application-tabs.md +65 -0
  26. package/ai/components/badge.md +72 -0
  27. package/ai/components/chip.md +72 -0
  28. package/ai/components/collapsible-panel.md +102 -0
  29. package/ai/components/content-item.md +96 -0
  30. package/ai/components/disclosure-arrow.md +77 -0
  31. package/ai/components/document-baseline.md +75 -0
  32. package/ai/components/empty-state.md +80 -0
  33. package/ai/components/feedback.md +71 -0
  34. package/ai/components/floating-toolbar.md +82 -0
  35. package/ai/components/foundation.md +65 -0
  36. package/ai/components/grid.md +100 -0
  37. package/ai/components/headers.md +63 -0
  38. package/ai/components/layout.md +75 -0
  39. package/ai/components/list-action-row.md +91 -0
  40. package/ai/components/list-header.md +91 -0
  41. package/ai/components/list-inset-control.md +74 -0
  42. package/ai/components/list-inset-text.md +72 -0
  43. package/ai/components/list-item.md +94 -0
  44. package/ai/components/list.md +106 -0
  45. package/ai/components/loading-spinner.md +73 -0
  46. package/ai/components/lucide-icon.md +97 -0
  47. package/ai/components/nav-stack.md +105 -0
  48. package/ai/components/pane.md +106 -0
  49. package/ai/components/popup-menu.md +171 -0
  50. package/ai/components/recipe-app-shell.md +57 -0
  51. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  52. package/ai/components/recipe-compact-toolbar.md +57 -0
  53. package/ai/components/recipe-composer-form.md +57 -0
  54. package/ai/components/recipe-list-detail-dialog.md +57 -0
  55. package/ai/components/recipe-list-workspace-states.md +57 -0
  56. package/ai/components/recipe-loading-inspector.md +57 -0
  57. package/ai/components/recipe-navigation-sidebar.md +57 -0
  58. package/ai/components/recipe-navigation-stack.md +57 -0
  59. package/ai/components/recipe-workspace-header.md +57 -0
  60. package/ai/components/resize.md +106 -0
  61. package/ai/components/row.md +96 -0
  62. package/ai/components/segmented-control.md +82 -0
  63. package/ai/components/select.md +115 -0
  64. package/ai/components/skeleton.md +84 -0
  65. package/ai/components/spacer.md +86 -0
  66. package/ai/components/split-view.md +103 -0
  67. package/ai/components/state-banner.md +94 -0
  68. package/ai/components/sunken-panel.md +79 -0
  69. package/ai/components/surface-scaffold.md +87 -0
  70. package/ai/components/tab-bar.md +113 -0
  71. package/ai/components/tab-navigator.md +96 -0
  72. package/ai/components/tabs.md +95 -0
  73. package/ai/components/text.md +87 -0
  74. package/ai/components/token-search-field.md +107 -0
  75. package/ai/components/toolbar-control-group.md +121 -0
  76. package/ai/components/toolbar-text.md +98 -0
  77. package/ai/components/toolbar.md +101 -0
  78. package/ai/components/value-table.md +73 -0
  79. package/ai/components/wa-accordion-item.md +55 -0
  80. package/ai/components/wa-accordion.md +65 -0
  81. package/ai/components/wa-animated-image.md +55 -0
  82. package/ai/components/wa-animation.md +55 -0
  83. package/ai/components/wa-avatar.md +55 -0
  84. package/ai/components/wa-badge.md +55 -0
  85. package/ai/components/wa-breadcrumb-item.md +53 -0
  86. package/ai/components/wa-breadcrumb.md +55 -0
  87. package/ai/components/wa-button-group.md +59 -0
  88. package/ai/components/wa-button.md +55 -0
  89. package/ai/components/wa-callout.md +58 -0
  90. package/ai/components/wa-card.md +59 -0
  91. package/ai/components/wa-carousel-item.md +53 -0
  92. package/ai/components/wa-carousel.md +55 -0
  93. package/ai/components/wa-checkbox-group.md +55 -0
  94. package/ai/components/wa-checkbox.md +55 -0
  95. package/ai/components/wa-color-picker.md +55 -0
  96. package/ai/components/wa-comparison.md +55 -0
  97. package/ai/components/wa-copy-button.md +55 -0
  98. package/ai/components/wa-details.md +61 -0
  99. package/ai/components/wa-dialog.md +59 -0
  100. package/ai/components/wa-divider.md +53 -0
  101. package/ai/components/wa-drawer.md +55 -0
  102. package/ai/components/wa-dropdown-item.md +60 -0
  103. package/ai/components/wa-dropdown.md +60 -0
  104. package/ai/components/wa-format-bytes.md +53 -0
  105. package/ai/components/wa-format-date.md +53 -0
  106. package/ai/components/wa-format-number.md +53 -0
  107. package/ai/components/wa-icon.md +58 -0
  108. package/ai/components/wa-include.md +53 -0
  109. package/ai/components/wa-input.md +59 -0
  110. package/ai/components/wa-intersection-observer.md +53 -0
  111. package/ai/components/wa-known-date.md +53 -0
  112. package/ai/components/wa-markdown.md +53 -0
  113. package/ai/components/wa-mutation-observer.md +53 -0
  114. package/ai/components/wa-number-input.md +55 -0
  115. package/ai/components/wa-option.md +59 -0
  116. package/ai/components/wa-otp-input.md +53 -0
  117. package/ai/components/wa-page.md +53 -0
  118. package/ai/components/wa-pagination.md +55 -0
  119. package/ai/components/wa-popover.md +55 -0
  120. package/ai/components/wa-popup.md +53 -0
  121. package/ai/components/wa-progress-bar.md +53 -0
  122. package/ai/components/wa-progress-ring.md +53 -0
  123. package/ai/components/wa-qr-code.md +53 -0
  124. package/ai/components/wa-radio-group.md +59 -0
  125. package/ai/components/wa-radio.md +55 -0
  126. package/ai/components/wa-random-content.md +53 -0
  127. package/ai/components/wa-rating.md +55 -0
  128. package/ai/components/wa-relative-time.md +53 -0
  129. package/ai/components/wa-resize-observer.md +53 -0
  130. package/ai/components/wa-scroller.md +53 -0
  131. package/ai/components/wa-select.md +63 -0
  132. package/ai/components/wa-skeleton.md +53 -0
  133. package/ai/components/wa-slider.md +55 -0
  134. package/ai/components/wa-spinner.md +58 -0
  135. package/ai/components/wa-split-panel.md +58 -0
  136. package/ai/components/wa-switch.md +53 -0
  137. package/ai/components/wa-tab-group.md +69 -0
  138. package/ai/components/wa-tab-panel.md +60 -0
  139. package/ai/components/wa-tab.md +59 -0
  140. package/ai/components/wa-tag.md +59 -0
  141. package/ai/components/wa-textarea.md +53 -0
  142. package/ai/components/wa-time-input.md +55 -0
  143. package/ai/components/wa-toast-item.md +60 -0
  144. package/ai/components/wa-toast.md +60 -0
  145. package/ai/components/wa-tooltip.md +55 -0
  146. package/ai/components/wa-tree-item.md +55 -0
  147. package/ai/components/wa-tree.md +55 -0
  148. package/ai/components/wa-zoomable-frame.md +55 -0
  149. package/ai/components/workbench.md +119 -0
  150. package/ai/public-api-signatures-v1.md +2837 -351
  151. package/ai/skill.md +401 -63
  152. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  153. package/analyzer/cli.mjs +49 -0
  154. package/analyzer/component-ownership.d.mts +72 -0
  155. package/analyzer/component-ownership.mjs +429 -0
  156. package/analyzer/index.d.mts +53 -0
  157. package/analyzer/index.mjs +2346 -0
  158. package/analyzer/loud-pairs.d.mts +49 -0
  159. package/analyzer/loud-pairs.mjs +357 -0
  160. package/analyzer/report.schema.json +66 -0
  161. package/analyzer/selectors.d.mts +21 -0
  162. package/analyzer/selectors.mjs +212 -0
  163. package/catalog-projection-cli.mjs +96 -0
  164. package/catalog-projection.d.mts +55 -0
  165. package/catalog-projection.mjs +62 -0
  166. package/dist/anchored-surface.d.ts +30 -0
  167. package/dist/anchored-surface.js +3 -0
  168. package/dist/anchored-surface.js.map +1 -0
  169. package/dist/app-tab.d.ts +39 -4
  170. package/dist/app-tab.js +2 -1
  171. package/dist/badge.d.ts +54 -0
  172. package/dist/badge.js +3 -0
  173. package/dist/badge.js.map +1 -0
  174. package/dist/browser/anchored-surface.js +3 -0
  175. package/dist/browser/badge.js +3 -0
  176. package/dist/browser/catalog.js +28 -0
  177. package/dist/browser/chip.js +3 -0
  178. package/dist/browser/collapsible-panel.js +9 -0
  179. package/dist/browser/content-item.js +3 -0
  180. package/dist/browser/floating-toolbar.js +3 -0
  181. package/dist/browser/grid.js +3 -0
  182. package/dist/browser/list-action-row.js +1 -0
  183. package/dist/browser/list-header.js +3 -1
  184. package/dist/browser/list-inset-control.js +3 -0
  185. package/dist/browser/list-inset-text.js +3 -0
  186. package/dist/browser/list-item.js +1 -0
  187. package/dist/browser/list.js +3 -0
  188. package/dist/browser/nav-stack.js +11 -0
  189. package/dist/browser/pane.js +3 -0
  190. package/dist/browser/popup-menu.js +3 -0
  191. package/dist/browser/row.js +3 -0
  192. package/dist/browser/segmented-control.js +0 -1
  193. package/dist/browser/select.js +2 -1
  194. package/dist/browser/spacer.js +3 -0
  195. package/dist/browser/split-view.js +13 -0
  196. package/dist/browser/state-banner.js +1 -0
  197. package/dist/browser/sunken-panel.js +3 -0
  198. package/dist/browser/surface-scaffold.js +3 -0
  199. package/dist/browser/tab-navigator.js +4 -0
  200. package/dist/browser/text.js +3 -0
  201. package/dist/browser/toolbar-control-group.js +1 -0
  202. package/dist/browser/workbench.js +14 -0
  203. package/dist/catalog-resources.d.ts +48 -0
  204. package/dist/catalog-resources.js +22 -0
  205. package/dist/catalog-resources.js.map +1 -0
  206. package/dist/catalog.d.ts +76 -103
  207. package/dist/catalog.js +566 -87
  208. package/dist/catalog.js.map +1 -1
  209. package/dist/chip.d.ts +36 -0
  210. package/dist/chip.js +3 -0
  211. package/dist/chip.js.map +1 -0
  212. package/dist/chunk-2GOCOLQL.js +270 -0
  213. package/dist/chunk-2GOCOLQL.js.map +1 -0
  214. package/dist/chunk-3DXHNLME.js +69 -0
  215. package/dist/chunk-3DXHNLME.js.map +1 -0
  216. package/dist/chunk-3PO7JEK7.js +188 -0
  217. package/dist/chunk-3PO7JEK7.js.map +1 -0
  218. package/dist/chunk-3VWOVICT.js +375 -0
  219. package/dist/chunk-3VWOVICT.js.map +1 -0
  220. package/dist/chunk-3XPGJUUQ.js +37 -0
  221. package/dist/chunk-3XPGJUUQ.js.map +1 -0
  222. package/dist/chunk-4Y4L5YEI.js +66 -0
  223. package/dist/chunk-4Y4L5YEI.js.map +1 -0
  224. package/dist/chunk-5BZBIRQG.js +452 -0
  225. package/dist/chunk-5BZBIRQG.js.map +1 -0
  226. package/dist/chunk-6IVNMC6R.js +19 -0
  227. package/dist/chunk-6IVNMC6R.js.map +1 -0
  228. package/dist/chunk-6L3WBDNW.js +75 -0
  229. package/dist/chunk-6L3WBDNW.js.map +1 -0
  230. package/dist/chunk-7QQ3HE47.js +17 -0
  231. package/dist/chunk-7QQ3HE47.js.map +1 -0
  232. package/dist/chunk-A7DYEERU.js +59 -0
  233. package/dist/chunk-A7DYEERU.js.map +1 -0
  234. package/dist/chunk-AN5IWMTM.js +24 -0
  235. package/dist/chunk-AN5IWMTM.js.map +1 -0
  236. package/dist/chunk-B3TROLC2.js +104 -0
  237. package/dist/chunk-B3TROLC2.js.map +1 -0
  238. package/dist/chunk-BYHGRKC3.js +44 -0
  239. package/dist/chunk-BYHGRKC3.js.map +1 -0
  240. package/dist/chunk-CD5TOO22.js +82 -0
  241. package/dist/chunk-CD5TOO22.js.map +1 -0
  242. package/dist/chunk-CEJ5FK6G.js +288 -0
  243. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  244. package/dist/chunk-D3ACDORR.js +149 -0
  245. package/dist/chunk-D3ACDORR.js.map +1 -0
  246. package/dist/chunk-DL55BSQX.js +52 -0
  247. package/dist/chunk-DL55BSQX.js.map +1 -0
  248. package/dist/chunk-DQDTZE4W.js +70 -0
  249. package/dist/chunk-DQDTZE4W.js.map +1 -0
  250. package/dist/chunk-FHVGTV4Z.js +789 -0
  251. package/dist/chunk-FHVGTV4Z.js.map +1 -0
  252. package/dist/chunk-FL6J644M.js +116 -0
  253. package/dist/chunk-FL6J644M.js.map +1 -0
  254. package/dist/chunk-GS2QD3N7.js +14 -0
  255. package/dist/chunk-GS2QD3N7.js.map +1 -0
  256. package/dist/chunk-H45DAZBL.js +491 -0
  257. package/dist/chunk-H45DAZBL.js.map +1 -0
  258. package/dist/chunk-IM3GKYOG.js +202 -0
  259. package/dist/chunk-IM3GKYOG.js.map +1 -0
  260. package/dist/chunk-IOS2NXW7.js +53 -0
  261. package/dist/chunk-IOS2NXW7.js.map +1 -0
  262. package/dist/chunk-J3AWE5I4.js +50 -0
  263. package/dist/chunk-J3AWE5I4.js.map +1 -0
  264. package/dist/chunk-JOR5LGYE.js +55 -0
  265. package/dist/chunk-JOR5LGYE.js.map +1 -0
  266. package/dist/chunk-JQ4QGIKS.js +165 -0
  267. package/dist/chunk-JQ4QGIKS.js.map +1 -0
  268. package/dist/chunk-KAJVVN7Q.js +138 -0
  269. package/dist/chunk-KAJVVN7Q.js.map +1 -0
  270. package/dist/{chunk-7BR3DO2A.js → chunk-LAZLBC2Q.js} +14 -5
  271. package/dist/chunk-LAZLBC2Q.js.map +1 -0
  272. package/dist/chunk-MN3POJFN.js +44 -0
  273. package/dist/chunk-MN3POJFN.js.map +1 -0
  274. package/dist/chunk-MORVLMDG.js +59 -0
  275. package/dist/chunk-MORVLMDG.js.map +1 -0
  276. package/dist/chunk-MTCTX25G.js +139 -0
  277. package/dist/chunk-MTCTX25G.js.map +1 -0
  278. package/dist/chunk-MXNIVEVL.js +48 -0
  279. package/dist/chunk-MXNIVEVL.js.map +1 -0
  280. package/dist/chunk-NJZMR7HM.js +135 -0
  281. package/dist/chunk-NJZMR7HM.js.map +1 -0
  282. package/dist/chunk-NMKY3WRM.js +295 -0
  283. package/dist/chunk-NMKY3WRM.js.map +1 -0
  284. package/dist/chunk-NMWDHZVM.js +35 -0
  285. package/dist/chunk-NMWDHZVM.js.map +1 -0
  286. package/dist/{chunk-YGN7OMLT.js → chunk-NS2TBYM4.js} +8 -5
  287. package/dist/chunk-NS2TBYM4.js.map +1 -0
  288. package/dist/chunk-O27D24CA.js +250 -0
  289. package/dist/chunk-O27D24CA.js.map +1 -0
  290. package/dist/chunk-PGL6TXFW.js +48 -0
  291. package/dist/chunk-PGL6TXFW.js.map +1 -0
  292. package/dist/chunk-PYWDDPMJ.js +506 -0
  293. package/dist/chunk-PYWDDPMJ.js.map +1 -0
  294. package/dist/chunk-QQICWWNX.js +71 -0
  295. package/dist/chunk-QQICWWNX.js.map +1 -0
  296. package/dist/chunk-S3ECMF23.js +33 -0
  297. package/dist/chunk-S3ECMF23.js.map +1 -0
  298. package/dist/chunk-S4ZGTDSG.js +18 -0
  299. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  300. package/dist/chunk-SSXEYZQR.js +222 -0
  301. package/dist/chunk-SSXEYZQR.js.map +1 -0
  302. package/dist/chunk-U657IHFB.js +158 -0
  303. package/dist/chunk-U657IHFB.js.map +1 -0
  304. package/dist/{chunk-56RJXPHG.js → chunk-X6PR75UE.js} +7 -4
  305. package/dist/chunk-X6PR75UE.js.map +1 -0
  306. package/dist/chunk-XK4E225T.js +34 -0
  307. package/dist/chunk-XK4E225T.js.map +1 -0
  308. package/dist/chunk-XKZPBRU7.js +135 -0
  309. package/dist/chunk-XKZPBRU7.js.map +1 -0
  310. package/dist/chunk-Y43B6DS3.js +66 -0
  311. package/dist/chunk-Y43B6DS3.js.map +1 -0
  312. package/dist/chunk-Y6KT7ZTR.js +109 -0
  313. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  314. package/dist/chunk-YOKEL75M.js +48 -0
  315. package/dist/chunk-YOKEL75M.js.map +1 -0
  316. package/dist/chunk-ZM3UOGZV.js +174 -0
  317. package/dist/chunk-ZM3UOGZV.js.map +1 -0
  318. package/dist/collapsible-panel.d.ts +137 -0
  319. package/dist/collapsible-panel.js +136 -0
  320. package/dist/collapsible-panel.js.map +1 -0
  321. package/dist/content-item.d.ts +99 -0
  322. package/dist/content-item.js +4 -0
  323. package/dist/content-item.js.map +1 -0
  324. package/dist/css-values.d.ts +119 -0
  325. package/dist/css-values.js +3 -0
  326. package/dist/css-values.js.map +1 -0
  327. package/dist/device-class.js +34 -6
  328. package/dist/device-class.js.map +1 -1
  329. package/dist/disclosure-arrow.d.ts +6 -1
  330. package/dist/disclosure-arrow.js +2 -1
  331. package/dist/empty-state.d.ts +5 -2
  332. package/dist/empty-state.js +2 -1
  333. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  334. package/dist/floating-toolbar.d.ts +51 -0
  335. package/dist/floating-toolbar.js +3 -0
  336. package/dist/floating-toolbar.js.map +1 -0
  337. package/dist/grid.d.ts +58 -0
  338. package/dist/grid.js +6 -0
  339. package/dist/grid.js.map +1 -0
  340. package/dist/help-tags-register.d.ts +13 -0
  341. package/dist/help-tags-register.js +9 -0
  342. package/dist/help-tags-register.js.map +1 -0
  343. package/dist/index.d.ts +41 -17
  344. package/dist/index.js +46 -23
  345. package/dist/list-action-row.d.ts +15 -3
  346. package/dist/list-action-row.js +4 -1
  347. package/dist/list-header.d.ts +65 -10
  348. package/dist/list-header.js +4 -1
  349. package/dist/list-inset-control.d.ts +22 -0
  350. package/dist/list-inset-control.js +3 -0
  351. package/dist/list-inset-control.js.map +1 -0
  352. package/dist/list-inset-text.d.ts +30 -0
  353. package/dist/list-inset-text.js +4 -0
  354. package/dist/list-inset-text.js.map +1 -0
  355. package/dist/list-item.d.ts +34 -5
  356. package/dist/list-item.js +4 -1
  357. package/dist/list.d.ts +64 -0
  358. package/dist/list.js +7 -0
  359. package/dist/list.js.map +1 -0
  360. package/dist/loading-spinner.d.ts +12 -2
  361. package/dist/loading-spinner.js +2 -1
  362. package/dist/lucide-icon.d.ts +15 -3
  363. package/dist/lucide-icon.js +2 -1
  364. package/dist/nav-stack-BvSKY448.d.ts +109 -0
  365. package/dist/nav-stack.d.ts +13 -38
  366. package/dist/nav-stack.js +11 -1
  367. package/dist/pane.d.ts +116 -0
  368. package/dist/pane.js +4 -0
  369. package/dist/pane.js.map +1 -0
  370. package/dist/panel-toolbar-CL9tYOkh.d.ts +72 -0
  371. package/dist/popup-menu-register.d.ts +9 -0
  372. package/dist/popup-menu-register.js +244 -0
  373. package/dist/popup-menu-register.js.map +1 -0
  374. package/dist/popup-menu.d.ts +100 -0
  375. package/dist/popup-menu.js +3 -0
  376. package/dist/popup-menu.js.map +1 -0
  377. package/dist/resizable-region.d.ts +32 -3
  378. package/dist/resizable-region.js +1 -1
  379. package/dist/row.d.ts +49 -0
  380. package/dist/row.js +7 -0
  381. package/dist/row.js.map +1 -0
  382. package/dist/segmented-control.d.ts +12 -9
  383. package/dist/segmented-control.js +1 -2
  384. package/dist/select-register.d.ts +5 -1
  385. package/dist/select-register.js +247 -3
  386. package/dist/select-register.js.map +1 -1
  387. package/dist/select.d.ts +103 -8
  388. package/dist/select.js +3 -1
  389. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  390. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  391. package/dist/sides-BPSWde0A.d.ts +4 -0
  392. package/dist/skeleton.d.ts +14 -7
  393. package/dist/skeleton.js +2 -1
  394. package/dist/spacer.d.ts +18 -0
  395. package/dist/spacer.js +4 -0
  396. package/dist/spacer.js.map +1 -0
  397. package/dist/split-view.d.ts +43 -6
  398. package/dist/split-view.js +125 -10
  399. package/dist/split-view.js.map +1 -1
  400. package/dist/state-banner.d.ts +21 -7
  401. package/dist/state-banner.js +3 -1
  402. package/dist/styles/anchored-surface.css +15 -0
  403. package/dist/styles/app-tab.css +232 -0
  404. package/dist/styles/badge.css +118 -0
  405. package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
  406. package/dist/styles/catalog/components/catalog-example.css +167 -0
  407. package/dist/styles/catalog/components/catalog-stage.css +54 -0
  408. package/dist/styles/catalog/components/catalog.css +26 -0
  409. package/dist/styles/catalog.css +5 -482
  410. package/dist/styles/chip.css +138 -0
  411. package/dist/styles/collapsible-panel.css +580 -0
  412. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  413. package/dist/styles/components/actions/popup-menu/popup-menu.css +285 -0
  414. package/dist/styles/components/actions/toolbar/toolbar.css +417 -0
  415. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +891 -0
  416. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +171 -0
  417. package/dist/styles/components/collections/list/list.css +136 -0
  418. package/dist/styles/components/collections/list-action-row/list-action-row.css +258 -0
  419. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  420. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  421. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  422. package/dist/styles/components/collections/list-item/list-item.css +255 -0
  423. package/dist/styles/components/data-display/value-table/value-table.css +107 -0
  424. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +15 -0
  425. package/dist/styles/components/feedback/badge/badge.css +118 -0
  426. package/dist/styles/components/feedback/chip/chip.css +138 -0
  427. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  428. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  429. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  430. package/dist/styles/components/feedback/state-banner/state-banner.css +248 -0
  431. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  432. package/dist/styles/components/forms/select/select.css +454 -0
  433. package/dist/styles/components/forms/token-search-field/token-search-field.css +392 -0
  434. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  435. package/dist/styles/components/layout/grid/grid.css +88 -0
  436. package/dist/styles/components/layout/pane/pane.css +309 -0
  437. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  438. package/dist/styles/components/layout/row/row.css +114 -0
  439. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  440. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  441. package/dist/styles/components/layout/workbench/workbench.css +1092 -0
  442. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  443. package/dist/styles/components/navigation/app-tab/app-tab.css +384 -0
  444. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  445. package/dist/styles/components/navigation/nav-stack/nav-stack.css +258 -0
  446. package/dist/styles/components/navigation/tab-bar/tab-bar.css +186 -0
  447. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +253 -0
  448. package/dist/styles/components/surfaces/content-item/content-item.css +120 -0
  449. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +34 -0
  450. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +111 -0
  451. package/dist/styles/components/typography/text/text.css +158 -0
  452. package/dist/styles/content-item.css +120 -0
  453. package/dist/styles/document.css +33 -0
  454. package/dist/styles/floating-toolbar.css +119 -0
  455. package/dist/styles/foundation.css +187 -45
  456. package/dist/styles/grid.css +88 -0
  457. package/dist/styles/layout.css +3 -41
  458. package/dist/styles/list-action-row.css +104 -6
  459. package/dist/styles/list-header.css +128 -59
  460. package/dist/styles/list-inset-control.css +30 -0
  461. package/dist/styles/list-inset-text.css +29 -0
  462. package/dist/styles/list-item.css +165 -33
  463. package/dist/styles/list.css +136 -0
  464. package/dist/styles/loading-spinner.css +4 -0
  465. package/dist/styles/lucide-icon.css +9 -0
  466. package/dist/styles/nav-stack.css +196 -50
  467. package/dist/styles/pane.css +309 -0
  468. package/dist/styles/popup-menu.css +285 -0
  469. package/dist/styles/resizable-region.css +438 -4
  470. package/dist/styles/row.css +114 -0
  471. package/dist/styles/segmented-control.css +36 -9
  472. package/dist/styles/select.css +337 -21
  473. package/dist/styles/skeleton.css +64 -3
  474. package/dist/styles/spacer.css +11 -0
  475. package/dist/styles/split-view.css +114 -3
  476. package/dist/styles/state-banner.css +94 -19
  477. package/dist/styles/styles.css +10 -1
  478. package/dist/styles/sunken-panel.css +34 -0
  479. package/dist/styles/surface-scaffold.css +111 -0
  480. package/dist/styles/tab-bar.css +150 -9
  481. package/dist/styles/tab-navigator.css +253 -0
  482. package/dist/styles/text.css +158 -0
  483. package/dist/styles/token-search-field.css +167 -56
  484. package/dist/styles/toolbar-control-group.css +710 -30
  485. package/dist/styles/toolbar-text.css +139 -8
  486. package/dist/styles/toolbar.css +367 -11
  487. package/dist/styles/value-table.css +39 -7
  488. package/dist/styles/webawesome.css +392 -17
  489. package/dist/styles/workbench.css +1005 -7
  490. package/dist/sunken-panel.d.ts +31 -0
  491. package/dist/sunken-panel.js +3 -0
  492. package/dist/sunken-panel.js.map +1 -0
  493. package/dist/surface-scaffold-register.d.ts +4 -0
  494. package/dist/surface-scaffold-register.js +59 -0
  495. package/dist/surface-scaffold-register.js.map +1 -0
  496. package/dist/surface-scaffold.d.ts +38 -0
  497. package/dist/surface-scaffold.js +3 -0
  498. package/dist/surface-scaffold.js.map +1 -0
  499. package/dist/tab-bar.d.ts +39 -6
  500. package/dist/tab-bar.js +1 -1
  501. package/dist/tab-navigator.d.ts +93 -0
  502. package/dist/tab-navigator.js +97 -0
  503. package/dist/tab-navigator.js.map +1 -0
  504. package/dist/text.d.ts +63 -0
  505. package/dist/text.js +3 -0
  506. package/dist/text.js.map +1 -0
  507. package/dist/token-search-field.d.ts +3 -43
  508. package/dist/token-search-field.js +2 -1
  509. package/dist/token-search-model-DTcTXWMS.d.ts +154 -0
  510. package/dist/token-search-model.d.ts +3 -0
  511. package/dist/token-search-model.js +3 -0
  512. package/dist/token-search-model.js.map +1 -0
  513. package/dist/toolbar-control-group.d.ts +89 -7
  514. package/dist/toolbar-control-group.js +3 -1
  515. package/dist/toolbar-text.d.ts +45 -9
  516. package/dist/toolbar-text.js +2 -1
  517. package/dist/toolbar.d.ts +59 -7
  518. package/dist/toolbar.js +1 -1
  519. package/dist/types-oLe_N1w0.d.ts +130 -0
  520. package/dist/value-table.d.ts +11 -3
  521. package/dist/value-table.js +2 -1
  522. package/dist/webawesome.d.ts +8 -1
  523. package/dist/wire-catalog.d.ts +76 -4
  524. package/dist/wire-catalog.js +250 -14
  525. package/dist/wire-catalog.js.map +1 -1
  526. package/dist/wire-content-items.d.ts +11 -0
  527. package/dist/wire-content-items.js +139 -0
  528. package/dist/wire-content-items.js.map +1 -0
  529. package/dist/wire-nav-stack.d.ts +4 -1
  530. package/dist/wire-nav-stack.js +191 -15
  531. package/dist/wire-nav-stack.js.map +1 -1
  532. package/dist/wire-resizable-regions.d.ts +2 -1
  533. package/dist/wire-resizable-regions.js +2 -1
  534. package/dist/wire-scroll-dividers.d.ts +74 -0
  535. package/dist/wire-scroll-dividers.js +3 -0
  536. package/dist/wire-scroll-dividers.js.map +1 -0
  537. package/dist/wire-sidebar.d.ts +63 -0
  538. package/dist/wire-sidebar.js +231 -0
  539. package/dist/wire-sidebar.js.map +1 -0
  540. package/dist/wire-tab-bars.d.ts +19 -2
  541. package/dist/wire-tab-bars.js +1 -1
  542. package/dist/wire-tab-navigator.d.ts +11 -0
  543. package/dist/wire-tab-navigator.js +21 -0
  544. package/dist/wire-tab-navigator.js.map +1 -0
  545. package/dist/wire-token-search-fields.d.ts +65 -3
  546. package/dist/wire-token-search-fields.js +2 -1
  547. package/dist/wire-toolbar-visibility.d.ts +13 -0
  548. package/dist/wire-toolbar-visibility.js +3 -0
  549. package/dist/wire-toolbar-visibility.js.map +1 -0
  550. package/dist/wire-workbench.d.ts +116 -0
  551. package/dist/wire-workbench.js +6 -0
  552. package/dist/wire-workbench.js.map +1 -0
  553. package/dist/workbench.d.ts +246 -9
  554. package/dist/workbench.js +18 -15
  555. package/dist/workbench.js.map +1 -1
  556. package/docs/accessibility.md +495 -24
  557. package/docs/anchored-surface.md +51 -0
  558. package/docs/app-layouts.md +141 -10
  559. package/docs/apple-hig.md +1 -0
  560. package/docs/catalog.md +395 -62
  561. package/docs/collapsible-panel.md +382 -0
  562. package/docs/component-contract.md +750 -53
  563. package/docs/component-integration.md +75 -0
  564. package/docs/component-selection.md +682 -97
  565. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  566. package/docs/design/templates/empty-state/filtered.svg +1 -0
  567. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  568. package/docs/design/templates/empty-state/with-action.svg +1 -0
  569. package/docs/design/templates/empty-state-dark.svg +1 -0
  570. package/docs/design/templates/empty-state.svg +1 -0
  571. package/docs/design/templates/list/compact-dark.svg +1 -0
  572. package/docs/design/templates/list/compact.svg +1 -0
  573. package/docs/design/templates/list/stack-dark.svg +1 -0
  574. package/docs/design/templates/list/stack.svg +1 -0
  575. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  576. package/docs/design/templates/list-action-row/default.svg +1 -0
  577. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  578. package/docs/design/templates/list-action-row/selected.svg +1 -0
  579. package/docs/design/templates/list-action-row-dark.svg +1 -0
  580. package/docs/design/templates/list-action-row.svg +1 -0
  581. package/docs/design/templates/list-dark.svg +1 -0
  582. package/docs/design/templates/list-header/action-dark.svg +1 -0
  583. package/docs/design/templates/list-header/action.svg +1 -0
  584. package/docs/design/templates/list-header/count-dark.svg +1 -0
  585. package/docs/design/templates/list-header/count.svg +1 -0
  586. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  587. package/docs/design/templates/list-header/inline-action.svg +1 -0
  588. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  589. package/docs/design/templates/list-header/size-l.svg +1 -0
  590. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  591. package/docs/design/templates/list-header/size-m.svg +1 -0
  592. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  593. package/docs/design/templates/list-header/size-xl.svg +1 -0
  594. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  595. package/docs/design/templates/list-header/size-xs.svg +1 -0
  596. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  597. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  598. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  599. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  600. package/docs/design/templates/list-header-dark.svg +1 -0
  601. package/docs/design/templates/list-header.svg +1 -0
  602. package/docs/design/templates/list-item/default-dark.svg +1 -0
  603. package/docs/design/templates/list-item/default.svg +1 -0
  604. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  605. package/docs/design/templates/list-item/multiline.svg +1 -0
  606. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  607. package/docs/design/templates/list-item/selected.svg +1 -0
  608. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  609. package/docs/design/templates/list-item/trailing.svg +1 -0
  610. package/docs/design/templates/list-item-dark.svg +1 -0
  611. package/docs/design/templates/list-item.svg +1 -0
  612. package/docs/design/templates/list.svg +1 -0
  613. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  614. package/docs/design/templates/segmented-control/equal.svg +1 -0
  615. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  616. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  617. package/docs/design/templates/segmented-control-dark.svg +1 -0
  618. package/docs/design/templates/segmented-control.svg +1 -0
  619. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  620. package/docs/design/templates/skeleton/avatar.svg +1 -0
  621. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  622. package/docs/design/templates/skeleton/block.svg +1 -0
  623. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  624. package/docs/design/templates/skeleton/lines.svg +1 -0
  625. package/docs/design/templates/skeleton-dark.svg +1 -0
  626. package/docs/design/templates/skeleton.svg +1 -0
  627. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  628. package/docs/design/templates/state-banner/danger.svg +1 -0
  629. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  630. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  631. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  632. package/docs/design/templates/state-banner/info.svg +1 -0
  633. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  634. package/docs/design/templates/state-banner/success.svg +1 -0
  635. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  636. package/docs/design/templates/state-banner/warning.svg +1 -0
  637. package/docs/design/templates/state-banner-dark.svg +1 -0
  638. package/docs/design/templates/state-banner.svg +1 -0
  639. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  640. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  641. package/docs/design/templates/tab-bar-dark.svg +1 -0
  642. package/docs/design/templates/tab-bar.svg +1 -0
  643. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  644. package/docs/design/templates/token-search-field/empty.svg +1 -0
  645. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  646. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  647. package/docs/design/templates/token-search-field-dark.svg +1 -0
  648. package/docs/design/templates/token-search-field.svg +1 -0
  649. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  650. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  651. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  652. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  653. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  654. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  655. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  656. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  657. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  658. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  659. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  660. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  661. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  662. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  663. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  664. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  665. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  666. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  667. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  668. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  669. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  670. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  671. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  672. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  673. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  674. package/docs/design/templates/toolbar-control-group.svg +1 -0
  675. package/docs/design/templates/toolbar-dark.svg +1 -0
  676. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  677. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  678. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  679. package/docs/design/templates/toolbar-text/default.svg +1 -0
  680. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  681. package/docs/design/templates/toolbar-text/large.svg +1 -0
  682. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  683. package/docs/design/templates/toolbar-text/small.svg +1 -0
  684. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  685. package/docs/design/templates/toolbar-text.svg +1 -0
  686. package/docs/design/templates/toolbar.svg +1 -0
  687. package/docs/design/templates/value-table/details-dark.svg +1 -0
  688. package/docs/design/templates/value-table/details.svg +1 -0
  689. package/docs/design/templates/value-table-dark.svg +1 -0
  690. package/docs/design/templates/value-table.svg +1 -0
  691. package/docs/design/templates.md +140 -0
  692. package/docs/design-philosophy.md +56 -19
  693. package/docs/device-class.md +10 -9
  694. package/docs/document-baseline.md +42 -0
  695. package/docs/examples/application-ui-profile.json +60 -0
  696. package/docs/examples/command-palette-adapter.tsx +69 -17
  697. package/docs/examples/component-catalog-extension.json +52 -0
  698. package/docs/examples/component-composition-extension.json +80 -0
  699. package/docs/layout.md +612 -53
  700. package/docs/nav-stack.md +163 -14
  701. package/docs/recipes.md +127 -52
  702. package/docs/split-view.md +76 -5
  703. package/docs/sunken-panel.md +93 -0
  704. package/docs/surface-scaffold.md +74 -0
  705. package/docs/tab-navigator.md +218 -0
  706. package/docs/type-contracts.md +137 -0
  707. package/docs/ui-analyzer.md +404 -0
  708. package/docs/ui-doctor.md +202 -0
  709. package/docs/ui-evaluator.md +139 -0
  710. package/docs/ux-demo.md +45 -15
  711. package/docs/webawesome-theme.md +204 -16
  712. package/docs/workbench.md +623 -12
  713. package/doctor/cli.mjs +120 -0
  714. package/doctor/component-style-checks.mjs +457 -0
  715. package/doctor/config.schema.json +94 -0
  716. package/doctor/eslint-diagnostics.d.mts +24 -0
  717. package/doctor/eslint-diagnostics.mjs +24 -0
  718. package/doctor/index.d.mts +122 -0
  719. package/doctor/index.mjs +1403 -0
  720. package/doctor/report.schema.json +118 -0
  721. package/evaluator/cli.mjs +89 -0
  722. package/evaluator/index.d.mts +90 -0
  723. package/evaluator/index.mjs +1203 -0
  724. package/evaluator/report.schema.json +152 -0
  725. package/llms.txt +562 -49
  726. package/package.json +247 -27
  727. package/scripts/component-catalog-extension-validation.mjs +28 -0
  728. package/traversal-exclusions.mjs +27 -0
  729. package/ux-demo/recipes/app-shell.tsx +204 -16
  730. package/ux-demo/recipes/collapsible-sidebar.tsx +260 -0
  731. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  732. package/ux-demo/recipes/composer-form.tsx +133 -21
  733. package/ux-demo/recipes/list-detail-dialog.tsx +255 -14
  734. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  735. package/ux-demo/recipes/loaders.ts +11 -3
  736. package/ux-demo/recipes/loading-inspector.tsx +161 -36
  737. package/ux-demo/recipes/mount-recipe.ts +28 -10
  738. package/ux-demo/recipes/navigation-sidebar.tsx +137 -11
  739. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  740. package/ux-demo/recipes/types.ts +23 -2
  741. package/ux-demo/recipes/workspace-header.tsx +86 -5
  742. package/dist/browser/panel-header.js +0 -7
  743. package/dist/chunk-2RJBFNB6.js +0 -172
  744. package/dist/chunk-2RJBFNB6.js.map +0 -1
  745. package/dist/chunk-2TS7ZSYX.js +0 -20
  746. package/dist/chunk-2TS7ZSYX.js.map +0 -1
  747. package/dist/chunk-2Z5TWHKQ.js +0 -34
  748. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  749. package/dist/chunk-37T3VNIZ.js +0 -19
  750. package/dist/chunk-37T3VNIZ.js.map +0 -1
  751. package/dist/chunk-55DATV3A.js +0 -10
  752. package/dist/chunk-55DATV3A.js.map +0 -1
  753. package/dist/chunk-56RJXPHG.js.map +0 -1
  754. package/dist/chunk-7BR3DO2A.js.map +0 -1
  755. package/dist/chunk-7JB7VPRI.js +0 -34
  756. package/dist/chunk-7JB7VPRI.js.map +0 -1
  757. package/dist/chunk-7LDCTU7D.js +0 -134
  758. package/dist/chunk-7LDCTU7D.js.map +0 -1
  759. package/dist/chunk-AQNKJRFH.js +0 -79
  760. package/dist/chunk-AQNKJRFH.js.map +0 -1
  761. package/dist/chunk-B24C4A6T.js +0 -22
  762. package/dist/chunk-B24C4A6T.js.map +0 -1
  763. package/dist/chunk-BLK3UEEI.js +0 -23
  764. package/dist/chunk-BLK3UEEI.js.map +0 -1
  765. package/dist/chunk-DAFFDO33.js +0 -14
  766. package/dist/chunk-DAFFDO33.js.map +0 -1
  767. package/dist/chunk-I7INRJO4.js +0 -17
  768. package/dist/chunk-I7INRJO4.js.map +0 -1
  769. package/dist/chunk-L4OKFDJY.js +0 -24
  770. package/dist/chunk-L4OKFDJY.js.map +0 -1
  771. package/dist/chunk-LC3YSAZC.js +0 -39
  772. package/dist/chunk-LC3YSAZC.js.map +0 -1
  773. package/dist/chunk-M5JRI6MN.js +0 -27
  774. package/dist/chunk-M5JRI6MN.js.map +0 -1
  775. package/dist/chunk-MBR3TYNL.js +0 -14
  776. package/dist/chunk-MBR3TYNL.js.map +0 -1
  777. package/dist/chunk-MFKMHK5W.js +0 -10
  778. package/dist/chunk-MFKMHK5W.js.map +0 -1
  779. package/dist/chunk-MQIZAD4A.js +0 -227
  780. package/dist/chunk-MQIZAD4A.js.map +0 -1
  781. package/dist/chunk-RUNWEPR4.js +0 -10
  782. package/dist/chunk-RUNWEPR4.js.map +0 -1
  783. package/dist/chunk-W2FK7ZNY.js +0 -26
  784. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  785. package/dist/chunk-W5EQ3HYQ.js +0 -42
  786. package/dist/chunk-W5EQ3HYQ.js.map +0 -1
  787. package/dist/chunk-WVPYVDXY.js +0 -15
  788. package/dist/chunk-WVPYVDXY.js.map +0 -1
  789. package/dist/chunk-YGN7OMLT.js.map +0 -1
  790. package/dist/panel-header.d.ts +0 -36
  791. package/dist/panel-header.js +0 -7
  792. package/dist/panel-header.js.map +0 -1
  793. package/dist/styles/panel-header.css +0 -64
  794. package/dist/styles/tab-scaffold.css +0 -84
  795. package/dist/tab-scaffold.d.ts +0 -30
  796. package/dist/tab-scaffold.js +0 -16
  797. package/dist/tab-scaffold.js.map +0 -1
  798. package/dist/wire-tab-scaffold.d.ts +0 -11
  799. package/dist/wire-tab-scaffold.js +0 -16
  800. package/dist/wire-tab-scaffold.js.map +0 -1
  801. package/docs/tab-scaffold.md +0 -41
  802. package/ux-demo/recipes/recipes.css +0 -361
package/dist/nav-stack.js CHANGED
@@ -1,4 +1,14 @@
1
- export { NavStack } from './chunk-BLK3UEEI.js';
1
+ export { NavStack } from './chunk-ZM3UOGZV.js';
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
2
12
 
3
13
 
4
14
 
package/dist/pane.d.ts ADDED
@@ -0,0 +1,116 @@
1
+ import * as kerfjs from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+
4
+ /**
5
+ * Logical pane sides: where a {@link Pane} can show a separator and where it can
6
+ * compensate for a device safe-area inset.
7
+ */
8
+ type PaneSeparatorSide = 'block-start' | 'block-end' | 'inline-start' | 'inline-end';
9
+ /** Semantic root elements supported by {@link Pane}. */
10
+ type PaneElement = 'article' | 'aside' | 'div' | 'main' | 'section';
11
+ /** Semantic elements supported by the scrolling content slot. */
12
+ type PaneContentElement = 'div' | 'main' | 'nav' | 'section';
13
+ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
14
+ 'data-component'?: never;
15
+ 'data-separator-block-start'?: never;
16
+ 'data-separator-block-end'?: never;
17
+ 'data-separator-inline-start'?: never;
18
+ 'data-separator-inline-end'?: never;
19
+ 'data-safe-area-block-start'?: never;
20
+ 'data-safe-area-block-end'?: never;
21
+ 'data-safe-area-inline-start'?: never;
22
+ 'data-safe-area-inline-end'?: never;
23
+ 'data-chrome-placement'?: never;
24
+ 'data-chrome-dividers'?: never;
25
+ 'data-appearance'?: never;
26
+ 'data-deep-inset'?: never;
27
+ 'data-outlined'?: never;
28
+ }>;
29
+ /** How a Pane's header and footer relate to its scrolling content. */
30
+ type PaneChromePlacement = 'fixed' | 'auto';
31
+ /**
32
+ * When a Pane draws the divider between its pinned header or footer and its
33
+ * scrolling content: `scroll` while content is scrolled away beneath that
34
+ * chrome, as `wireScrollDividers` reports; `always`; or `none`.
35
+ */
36
+ type PaneChromeDividers = 'scroll' | 'always' | 'none';
37
+ /** Background treatment of the Pane's scrolling work surface. */
38
+ type PaneAppearance = 'default' | 'sunken';
39
+ interface PaneProps {
40
+ /** Optional fixed chrome above the scrolling content, arranged vertically. */
41
+ header?: KerfUiContent;
42
+ /** The pane's primary vertical, scrolling content stack. */
43
+ children?: KerfUiContent;
44
+ /** Optional fixed chrome below the scrolling content. */
45
+ footer?: KerfUiContent;
46
+ /**
47
+ * Whether the header and footer stay pinned around the scrolling content.
48
+ * `fixed` (default) always pins them. `auto` pins them while the pane is
49
+ * tall enough, and below 480px of height (30rem, so it scales with the text
50
+ * size) lets the whole pane scroll as one column, so tall chrome can never
51
+ * squeeze the content to nothing.
52
+ */
53
+ chromePlacement?: PaneChromePlacement;
54
+ /**
55
+ * The divider under the header and over the footer, where they meet the
56
+ * scrolling content. Omitted defaults to `scroll` for a plain pane and
57
+ * `always` for `appearance="sunken"`. `scroll` shows the header's divider only
58
+ * while the content is scrolled down, and the footer's only while more
59
+ * content lies below — never when the content fits — once
60
+ * `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is wired above
61
+ * the pane; unwired, neither shows. `always` shows both; `none` neither.
62
+ * The line is drawn inside the chrome, so no state moves the content.
63
+ */
64
+ chromeDividers?: PaneChromeDividers;
65
+ /** Paint the scrolling work surface with the shared lowered-surface color. */
66
+ appearance?: PaneAppearance;
67
+ /** Add 8px to every side of scrolling content (default: false). */
68
+ deepInset?: boolean;
69
+ /** Opt into keyboard (`0`) or programmatic (`-1`) focus on the Pane root. */
70
+ tabIndex?: 0 | -1;
71
+ /** Keep the standard focus outline visible, such as for a drop target. */
72
+ outlined?: boolean;
73
+ /** Root semantics. Defaults to `div`. */
74
+ element?: PaneElement;
75
+ /** Scrolling content semantics. Defaults to `div`. */
76
+ contentElement?: PaneContentElement;
77
+ /** Independent logical-edge separator lines. Defaults to none. */
78
+ separators?: readonly PaneSeparatorSide[];
79
+ /**
80
+ * Sides on which the pane may compensate for a device safe-area inset.
81
+ * Defaults to every side: the pane pads its slots for each side that still
82
+ * reaches an unsafe screen edge, as its surrounding layout reports, while its
83
+ * background and separators paint through. List only the sides an app-owned
84
+ * layout places at a screen edge, or pass `[]` to opt out.
85
+ */
86
+ safeAreaEdges?: readonly PaneSeparatorSide[];
87
+ id?: string;
88
+ /** Accessible name for a landmark root such as `aside` or `main`. */
89
+ label?: string;
90
+ /** Accessible name for a landmark scrolling slot such as `nav`. */
91
+ contentLabel?: string;
92
+ className?: string;
93
+ headerClassName?: string;
94
+ contentClassName?: string;
95
+ footerClassName?: string;
96
+ /** Safe `data-*` metadata; Pane-owned structural attributes remain protected. */
97
+ rootAttributes?: PaneRootAttributes;
98
+ /** Native named-slot assignment when composed inside a web component. */
99
+ slot?: string;
100
+ }
101
+ /**
102
+ * A pane's configuration, apart from its content and styling hooks: the props a
103
+ * composite that renders a `Pane` for the app (a Workbench panel or work area,
104
+ * or a CollapsiblePanel) forwards, so the app configures that pane instead of
105
+ * styling it. An omitted or `undefined` field keeps the composite's default.
106
+ */
107
+ type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'appearance' | 'deepInset' | 'tabIndex' | 'outlined'>;
108
+ /**
109
+ * An unpadded application column with optional fixed header/footer slots and one
110
+ * scrolling vertical content owner. Separator lines are independently opt-in on
111
+ * each logical edge, so the same component works as a sidebar, main area,
112
+ * inspector, or dialog column.
113
+ */
114
+ declare function Pane({ header, children, footer, chromePlacement, chromeDividers, appearance, deepInset, tabIndex, outlined, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
115
+
116
+ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
package/dist/pane.js ADDED
@@ -0,0 +1,4 @@
1
+ export { Pane } from './chunk-FL6J644M.js';
2
+
3
+
4
+ //# sourceMappingURL=pane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"pane.js"}
@@ -0,0 +1,72 @@
1
+ import { ToolbarConfig } from './toolbar.js';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+ import { LucideIcon } from './lucide-icon.js';
4
+
5
+ /** Which edge a collapsible panel docks to. */
6
+ type PanelSide = 'left' | 'right' | 'bottom';
7
+ /**
8
+ * The standard collapse/expand icon for a panel `side` and `collapsed` state,
9
+ * so every app's sidebars and drawers use one recognizable convention:
10
+ * `PanelLeft*` for a left rail, `PanelRight*` for a right rail, `PanelBottom*`
11
+ * for a bottom drawer — the `Close` glyph while open, the `Open` glyph while
12
+ * collapsed. Exposed so an app can render its own toggle affordance.
13
+ */
14
+ declare function collapsiblePanelToggleIcon(side: PanelSide, collapsed: boolean): {
15
+ icon: Parameters<typeof LucideIcon>[0]['icon'];
16
+ name: string;
17
+ };
18
+ /**
19
+ * The standard collapse toggle a panel toolbar renders. The app handles the
20
+ * button's `data-action` and flips its own `collapsed` flag.
21
+ */
22
+ interface PanelToggle {
23
+ /** The `data-action` the toggle button carries. */
24
+ action: string;
25
+ /** The panel's short name, for the accessible "Show …" / "Hide …" label. */
26
+ name: string;
27
+ /** Accessible label while the panel is collapsed. Defaults to `Show {name}`. */
28
+ showLabel?: string;
29
+ /** Accessible label while the panel is open. Defaults to `Hide {name}`. */
30
+ hideLabel?: string;
31
+ }
32
+ /**
33
+ * A collapsible panel's top toolbar, composed so its groups follow the
34
+ * panel's open state.
35
+ *
36
+ * - `title` precedes the `leading` zone. Groups may appear in any of the
37
+ * `leading`, `center`, and `trailing` zones while the panel is open.
38
+ * - Groups marked `relocateOnCollapse` move to the work area's toolbar while
39
+ * the panel is collapsed, preserving their order across the three zones.
40
+ * - `toggle` is always the last group: in the panel's toolbar while it is
41
+ * open, and right after the relocated groups in the work area's toolbar
42
+ * while it is collapsed.
43
+ *
44
+ * Relocated content renders in both places while the panel is collapsed (the
45
+ * panel's copy is inert), so give it no `id`s. Pass groups directly or in
46
+ * arrays so their render-time annotation remains available to the panel.
47
+ *
48
+ * The toolbar's configuration (`dividerSides`, `centerAlign`, `responsive`,
49
+ * `responsiveAt`, `safeAreaEdges`) forwards to its `Toolbar`. It draws no
50
+ * divider of its own: the panel's `Pane` draws the line under it while the
51
+ * content is scrolled (its `chromeDividers`, wired by `wireScrollDividers`).
52
+ */
53
+ interface PanelToolbar extends ToolbarConfig {
54
+ /** Accessible name of the panel's toolbar. */
55
+ label: string;
56
+ title?: KerfUiContent;
57
+ leading?: KerfUiContent;
58
+ center?: KerfUiContent;
59
+ trailing?: KerfUiContent;
60
+ toggle?: PanelToggle;
61
+ }
62
+ /** A panel's fixed bottom toolbar, below its optional footer content. */
63
+ interface PanelBottomToolbar extends ToolbarConfig {
64
+ label: string;
65
+ leading?: KerfUiContent;
66
+ center?: KerfUiContent;
67
+ trailing?: KerfUiContent;
68
+ }
69
+ /** Whether panel chrome stays fixed, scrolls, or follows Pane's auto rule. */
70
+ type PanelChromePlacement = 'fixed' | 'scroll' | 'auto';
71
+
72
+ export { type PanelSide as P, type PanelToolbar as a, type PanelChromePlacement as b, type PanelBottomToolbar as c, type PanelToggle as d, collapsiblePanelToggleIcon as e };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Marker export for tests and tooling; importing this module registers the
3
+ * Web Awesome elements a `PopupMenu` renders (`wa-dropdown`,
4
+ * `wa-dropdown-item`, `wa-button`, and `wa-divider`) and routes a keyboard
5
+ * choice through the item's click so delegated `data-action`s run.
6
+ */
7
+ declare const popupMenuElementsRegistered = true;
8
+
9
+ export { popupMenuElementsRegistered };
@@ -0,0 +1,244 @@
1
+ import { installHelpTags } from './chunk-O27D24CA.js';
2
+ import '@awesome.me/webawesome/dist/components/button/button.js';
3
+ import '@awesome.me/webawesome/dist/components/divider/divider.js';
4
+ import WaDropdownItem from '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';
5
+ import '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';
6
+ import WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';
7
+
8
+ // src/components/actions/popup-menu/internal/install-dropdown-show-focus.ts
9
+ var installed = /* @__PURE__ */ new WeakSet();
10
+ var showEpoch = /* @__PURE__ */ new WeakMap();
11
+ function installDropdownShowFocus(prototype) {
12
+ if (installed.has(prototype)) return;
13
+ installed.add(prototype);
14
+ const target = prototype;
15
+ const showMenu = target.showMenu;
16
+ target.showMenu = async function() {
17
+ const scoped = this.classList.contains("kui-popup-menu") || this.closest(".kui-popup-surface") !== null;
18
+ if (!scoped) return showMenu.call(this);
19
+ const epoch = (showEpoch.get(this) ?? 0) + 1;
20
+ showEpoch.set(this, epoch);
21
+ let navigatedItem;
22
+ const rememberFocus = (event) => {
23
+ const item = event.target;
24
+ if (this.menu?.classList.contains("show") && item instanceof HTMLElement && item.localName === "wa-dropdown-item" && this.contains(item)) {
25
+ navigatedItem = item;
26
+ }
27
+ };
28
+ this.addEventListener("focusin", rememberFocus);
29
+ try {
30
+ await showMenu.call(this);
31
+ } finally {
32
+ this.removeEventListener("focusin", rememberFocus);
33
+ }
34
+ if (showEpoch.get(this) !== epoch || !this.open || !this.popup?.active || !navigatedItem?.isConnected || !this.contains(navigatedItem))
35
+ return;
36
+ const siblings = navigatedItem.slot === "submenu" ? Array.from(navigatedItem.parentElement?.children ?? []).filter(
37
+ (item) => item.localName === "wa-dropdown-item"
38
+ ) : this.getItems();
39
+ siblings.forEach((item) => {
40
+ item.active = item === navigatedItem;
41
+ });
42
+ navigatedItem.focus({ preventScroll: true });
43
+ };
44
+ }
45
+
46
+ // src/components/actions/popup-menu/internal/install-popup-menu-keyboard.ts
47
+ var installed2 = /* @__PURE__ */ new WeakSet();
48
+ function installPopupMenuKeyboard(prototype) {
49
+ if (installed2.has(prototype)) return;
50
+ installed2.add(prototype);
51
+ const target = prototype;
52
+ const makeSelection = target.makeSelection;
53
+ target.makeSelection = function(item, event) {
54
+ if (event instanceof KeyboardEvent && this.classList.contains("kui-popup-menu") && !item.disabled) {
55
+ item.click();
56
+ return;
57
+ }
58
+ makeSelection.call(this, item, event);
59
+ };
60
+ }
61
+
62
+ // src/components/actions/popup-menu/internal/install-popup-menu-lifecycle.ts
63
+ var installed3 = /* @__PURE__ */ new WeakSet();
64
+ function installPopupMenuLifecycle(prototype) {
65
+ if (installed3.has(prototype)) return;
66
+ installed3.add(prototype);
67
+ const target = prototype;
68
+ const showMenu = target.showMenu;
69
+ const hideMenu = target.hideMenu;
70
+ const hiding = /* @__PURE__ */ new WeakMap();
71
+ target.showMenu = function() {
72
+ const transition = hiding.get(this);
73
+ if (transition && this.open && this.popup?.active && this.classList.contains("kui-popup-menu")) {
74
+ this.popup.active = false;
75
+ transition.reopened = true;
76
+ }
77
+ return showMenu.call(this);
78
+ };
79
+ target.hideMenu = async function() {
80
+ const scoped = this.classList.contains("kui-popup-menu");
81
+ const transition = { reopened: false };
82
+ if (scoped) hiding.set(this, transition);
83
+ await hideMenu.call(this);
84
+ if (scoped && hiding.get(this) === transition && this.open && this.isConnected && this.popup?.active && !transition.reopened) {
85
+ this.popup.active = false;
86
+ void this.showMenu();
87
+ }
88
+ if (hiding.get(this) === transition) hiding.delete(this);
89
+ };
90
+ }
91
+
92
+ // src/components/actions/popup-menu/internal/install-popup-menu-submenu-focus.ts
93
+ var installed4 = /* @__PURE__ */ new WeakSet();
94
+ function installPopupMenuSubmenuFocus(prototype) {
95
+ if (installed4.has(prototype)) return;
96
+ installed4.add(prototype);
97
+ const target = prototype;
98
+ const openSubmenu = target.openSubmenu;
99
+ const closeSubmenu = target.closeSubmenu;
100
+ const submenuOpen = Object.getOwnPropertyDescriptor(prototype, "submenuOpen");
101
+ if (submenuOpen?.set) {
102
+ Object.defineProperty(prototype, "submenuOpen", {
103
+ ...submenuOpen,
104
+ set(value) {
105
+ const wasOpen = this.submenuOpen;
106
+ submenuOpen.set.call(this, value);
107
+ if (value && wasOpen && this.submenuElement?.hidden && this.closest("wa-dropdown.kui-popup-menu"))
108
+ void this.openSubmenu();
109
+ }
110
+ });
111
+ }
112
+ target.closeSubmenu = async function() {
113
+ const submenu = this.submenuElement;
114
+ await closeSubmenu.call(this);
115
+ if (this.submenuOpen && submenu?.hidden && this.isConnected && this.closest("wa-dropdown.kui-popup-menu"))
116
+ void this.openSubmenu();
117
+ };
118
+ target.openSubmenu = async function() {
119
+ const submenu = this.submenuElement;
120
+ if (!this.closest("wa-dropdown.kui-popup-menu") || !submenu)
121
+ return openSubmenu.call(this);
122
+ if (submenu.classList.contains("show")) {
123
+ if (!submenu.hidden) return;
124
+ submenu.classList.remove("show");
125
+ }
126
+ let desired;
127
+ const trackFocus = (event) => {
128
+ const item = event.composedPath().find(
129
+ (node) => node instanceof HTMLElement && node.localName === "wa-dropdown-item" && node.getAttribute("slot") === "submenu"
130
+ );
131
+ if (item && this.getSubmenuItems().includes(item)) desired = item;
132
+ };
133
+ submenu.addEventListener("focusin", trackFocus);
134
+ try {
135
+ await openSubmenu.call(this);
136
+ } finally {
137
+ submenu.removeEventListener("focusin", trackFocus);
138
+ }
139
+ const items = this.getSubmenuItems();
140
+ if (!desired || desired === items[0]) return;
141
+ const selected = desired;
142
+ window.setTimeout(() => {
143
+ if (!this.isConnected || !this.submenuOpen || submenu.hidden || document.activeElement !== items[0])
144
+ return;
145
+ items.forEach((item) => item.active = item === selected);
146
+ selected.focus({ preventScroll: true });
147
+ }, 0);
148
+ };
149
+ }
150
+
151
+ // src/components/actions/popup-menu/internal/install-popup-menu-submenu-placement.ts
152
+ var installed5 = /* @__PURE__ */ new WeakSet();
153
+ var phoneWidth = "(max-width: 480px)";
154
+ var viewportInset = 8;
155
+ var menuGap = 4;
156
+ function phoneSubmenuPosition(parent, submenu, viewport, rtl) {
157
+ const width = Math.min(submenu.width, viewport.width - 2 * viewportInset);
158
+ const height = submenu.height;
159
+ const below = Math.max(
160
+ 0,
161
+ viewport.height - parent.bottom - menuGap - viewportInset
162
+ );
163
+ const above = Math.max(0, parent.top - menuGap - viewportInset);
164
+ const useBelow = height <= below || height > above && below >= above;
165
+ const availableHeight = useBelow ? below : above;
166
+ const left = rtl ? parent.right - width : parent.left;
167
+ return {
168
+ left: Math.max(
169
+ viewportInset,
170
+ Math.min(left, viewport.width - viewportInset - width)
171
+ ),
172
+ top: useBelow ? parent.bottom + menuGap : parent.top - menuGap - Math.min(height, availableHeight),
173
+ maxHeight: availableHeight,
174
+ maxWidth: viewport.width - 2 * viewportInset
175
+ };
176
+ }
177
+ function clearPhoneStyles(submenu) {
178
+ for (const property of [
179
+ "position",
180
+ "left",
181
+ "top",
182
+ "max-width",
183
+ "max-height",
184
+ "box-sizing",
185
+ "overflow-y"
186
+ ])
187
+ submenu.style.removeProperty(property);
188
+ }
189
+ function installPopupMenuSubmenuPlacement(prototype) {
190
+ if (installed5.has(prototype)) return;
191
+ installed5.add(prototype);
192
+ const target = prototype;
193
+ const positionSubmenu = target.positionSubmenu;
194
+ target.positionSubmenu = function(item) {
195
+ if (!this.classList.contains("kui-popup-menu")) {
196
+ positionSubmenu.call(this, item);
197
+ return;
198
+ }
199
+ const submenu = item.submenuElement;
200
+ if (!window.matchMedia(phoneWidth).matches || !submenu || !this.menu) {
201
+ if (submenu) clearPhoneStyles(submenu);
202
+ positionSubmenu.call(this, item);
203
+ return;
204
+ }
205
+ window.queueMicrotask(() => {
206
+ if (!this.isConnected || !item.submenuOpen || !window.matchMedia(phoneWidth).matches || !this.menu || !submenu.isConnected)
207
+ return;
208
+ const parentItem = item.parentElement?.localName === "wa-dropdown-item" ? item.parentElement : void 0;
209
+ const parentMenu = parentItem?.submenuElement ?? this.menu;
210
+ submenu.style.position = "fixed";
211
+ submenu.style.maxWidth = `calc(100vw - ${2 * viewportInset}px)`;
212
+ submenu.style.maxHeight = "none";
213
+ submenu.style.boxSizing = "border-box";
214
+ submenu.style.overflowY = "auto";
215
+ const placement = phoneSubmenuPosition(
216
+ parentMenu.getBoundingClientRect(),
217
+ submenu.getBoundingClientRect(),
218
+ { width: window.innerWidth, height: window.innerHeight },
219
+ window.getComputedStyle(this).direction === "rtl"
220
+ );
221
+ submenu.style.left = `${placement.left}px`;
222
+ submenu.style.top = `${placement.top}px`;
223
+ submenu.style.maxHeight = `${placement.maxHeight}px`;
224
+ submenu.style.maxWidth = `${placement.maxWidth}px`;
225
+ submenu.setAttribute(
226
+ "data-placement",
227
+ placement.top >= parentMenu.getBoundingClientRect().bottom ? "bottom-start" : "top-start"
228
+ );
229
+ });
230
+ };
231
+ }
232
+
233
+ // src/components/actions/popup-menu/register/popup-menu-register.ts
234
+ installPopupMenuKeyboard(WaDropdown.prototype);
235
+ installPopupMenuLifecycle(WaDropdown.prototype);
236
+ installDropdownShowFocus(WaDropdown.prototype);
237
+ installPopupMenuSubmenuFocus(WaDropdownItem.prototype);
238
+ installPopupMenuSubmenuPlacement(WaDropdown.prototype);
239
+ installHelpTags();
240
+ var popupMenuElementsRegistered = true;
241
+
242
+ export { popupMenuElementsRegistered };
243
+
244
+ //# sourceMappingURL=popup-menu-register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/actions/popup-menu/internal/install-dropdown-show-focus.ts","../src/components/actions/popup-menu/internal/install-popup-menu-keyboard.ts","../src/components/actions/popup-menu/internal/install-popup-menu-lifecycle.ts","../src/components/actions/popup-menu/internal/install-popup-menu-submenu-focus.ts","../src/components/actions/popup-menu/internal/install-popup-menu-submenu-placement.ts","../src/components/actions/popup-menu/register/popup-menu-register.ts"],"names":["installed"],"mappings":"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","file":"popup-menu-register.js","sourcesContent":["interface FocusableDropdownItem extends HTMLElement {\n active: boolean;\n}\n\ninterface FocusableDropdown extends HTMLElement {\n open: boolean;\n popup?: { active: boolean };\n menu?: HTMLElement;\n getItems(): FocusableDropdownItem[];\n showMenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\nconst showEpoch = new WeakMap<FocusableDropdown, number>();\n\n/** Preserve item navigation that Web Awesome receives during its show animation. */\nexport function installDropdownShowFocus(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as FocusableDropdown;\n const showMenu = target.showMenu;\n target.showMenu = async function (this: FocusableDropdown): Promise<void> {\n const scoped =\n this.classList.contains('kui-popup-menu') ||\n this.closest('.kui-popup-surface') !== null;\n if (!scoped) return showMenu.call(this);\n\n const epoch = (showEpoch.get(this) ?? 0) + 1;\n showEpoch.set(this, epoch);\n let navigatedItem: FocusableDropdownItem | undefined;\n const rememberFocus = (event: FocusEvent) => {\n const item = event.target;\n if (\n this.menu?.classList.contains('show') &&\n item instanceof HTMLElement &&\n item.localName === 'wa-dropdown-item' &&\n this.contains(item)\n ) {\n navigatedItem = item as FocusableDropdownItem;\n }\n };\n this.addEventListener('focusin', rememberFocus);\n try {\n await showMenu.call(this);\n } finally {\n this.removeEventListener('focusin', rememberFocus);\n }\n if (\n showEpoch.get(this) !== epoch ||\n !this.open ||\n !this.popup?.active ||\n !navigatedItem?.isConnected ||\n !this.contains(navigatedItem)\n )\n return;\n\n const siblings =\n navigatedItem.slot === 'submenu'\n ? Array.from(navigatedItem.parentElement?.children ?? []).filter(\n (item): item is FocusableDropdownItem =>\n item.localName === 'wa-dropdown-item',\n )\n : this.getItems();\n siblings.forEach((item) => {\n item.active = item === navigatedItem;\n });\n navigatedItem.focus({ preventScroll: true });\n };\n}\n","interface PopupMenuDropdown extends HTMLElement {\n makeSelection(\n item: HTMLElement & { disabled?: boolean },\n event?: Event,\n ): void;\n}\n\nconst installed = new WeakSet<object>();\n\n/**\n * Route a keyboard choice in a `PopupMenu` through the item's click. Web Awesome\n * selects a pointer choice from the item's click event but a keyboard choice\n * (Enter or Space) directly, so delegated `data-action` click handlers would\n * never run for keyboard users. Clicking the item makes Web Awesome select it\n * exactly as it does for a pointer — one `wa-select`, then close and focus\n * return — while the click reaches the application's delegation. Raw\n * `wa-dropdown`s outside `PopupMenu` are unaffected.\n */\nexport function installPopupMenuKeyboard(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const makeSelection = target.makeSelection;\n target.makeSelection = function (this: PopupMenuDropdown, item, event): void {\n if (\n event instanceof KeyboardEvent &&\n this.classList.contains('kui-popup-menu') &&\n !item.disabled\n ) {\n item.click();\n return;\n }\n makeSelection.call(this, item, event);\n };\n}\n","interface PopupMenuDropdown extends HTMLElement {\n open: boolean;\n popup?: { active: boolean };\n showMenu(): Promise<void>;\n hideMenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\n\n/** Restore Web Awesome dismissal listeners after a rapid close/reopen. */\nexport function installPopupMenuLifecycle(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const showMenu = target.showMenu;\n const hideMenu = target.hideMenu;\n const hiding = new WeakMap<PopupMenuDropdown, { reopened: boolean }>();\n target.showMenu = function (this: PopupMenuDropdown): Promise<void> {\n const transition = hiding.get(this);\n if (\n transition &&\n this.open &&\n this.popup?.active &&\n this.classList.contains('kui-popup-menu')\n ) {\n // Native showMenu would return early while the old popup is active,\n // leaving its document pointer listener absent during the hide.\n this.popup.active = false;\n transition.reopened = true;\n }\n return showMenu.call(this);\n };\n target.hideMenu = async function (this: PopupMenuDropdown): Promise<void> {\n const scoped = this.classList.contains('kui-popup-menu');\n const transition = { reopened: false };\n if (scoped) hiding.set(this, transition);\n await hideMenu.call(this);\n // WA removes its document listeners before awaiting the hide animation.\n // If Lit coalesces the intervening open request, restore the listeners\n // after hide; an explicit showMenu above has already done so immediately.\n if (\n scoped &&\n hiding.get(this) === transition &&\n this.open &&\n this.isConnected &&\n this.popup?.active &&\n !transition.reopened\n ) {\n this.popup.active = false;\n void this.showMenu();\n }\n if (hiding.get(this) === transition) hiding.delete(this);\n };\n}\n","interface SubmenuItem extends HTMLElement {\n active: boolean;\n}\n\ninterface PopupMenuParentItem extends HTMLElement {\n submenuElement?: HTMLElement;\n submenuOpen: boolean;\n getSubmenuItems(): SubmenuItem[];\n openSubmenu(): Promise<void>;\n closeSubmenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\n\n/** Preserve a rapid keyboard move past Web Awesome's late first-item focus. */\nexport function installPopupMenuSubmenuFocus(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuParentItem;\n const openSubmenu = target.openSubmenu;\n const closeSubmenu = target.closeSubmenu;\n const submenuOpen = Object.getOwnPropertyDescriptor(prototype, 'submenuOpen');\n if (submenuOpen?.set) {\n Object.defineProperty(prototype, 'submenuOpen', {\n ...submenuOpen,\n set(this: PopupMenuParentItem, value: boolean) {\n const wasOpen = this.submenuOpen;\n submenuOpen.set!.call(this, value);\n // Web Awesome's pointer, click, and ArrowRight paths assign true. A\n // repeated assignment does not schedule updated(), so repair a stale\n // open flag over a hidden submenu at the point of that user action.\n if (\n value &&\n wasOpen &&\n this.submenuElement?.hidden &&\n this.closest('wa-dropdown.kui-popup-menu')\n )\n void this.openSubmenu();\n },\n });\n }\n target.closeSubmenu = async function (\n this: PopupMenuParentItem,\n ): Promise<void> {\n const submenu = this.submenuElement;\n await closeSubmenu.call(this);\n // A new open can start while Web Awesome awaits its hide animation. Its\n // late completion must not leave submenuOpen=true over a hidden submenu.\n if (\n this.submenuOpen &&\n submenu?.hidden &&\n this.isConnected &&\n this.closest('wa-dropdown.kui-popup-menu')\n )\n void this.openSubmenu();\n };\n target.openSubmenu = async function (\n this: PopupMenuParentItem,\n ): Promise<void> {\n const submenu = this.submenuElement;\n if (!this.closest('wa-dropdown.kui-popup-menu') || !submenu)\n return openSubmenu.call(this);\n\n // WA's animation helper never resolves if asked to add an animation class\n // already on the element. A second open while showing needs no new show;\n // a stale hidden popup needs the old show canceled before reopening.\n if (submenu.classList.contains('show')) {\n if (!submenu.hidden) return;\n submenu.classList.remove('show');\n }\n\n let desired: SubmenuItem | undefined;\n const trackFocus = (event: FocusEvent) => {\n const item = event\n .composedPath()\n .find(\n (node): node is SubmenuItem =>\n node instanceof HTMLElement &&\n node.localName === 'wa-dropdown-item' &&\n node.getAttribute('slot') === 'submenu',\n );\n if (item && this.getSubmenuItems().includes(item)) desired = item;\n };\n submenu.addEventListener('focusin', trackFocus);\n try {\n await openSubmenu.call(this);\n } finally {\n submenu.removeEventListener('focusin', trackFocus);\n }\n\n const items = this.getSubmenuItems();\n if (!desired || desired === items[0]) return;\n const selected = desired;\n // Web Awesome queues its first-item focus after the show animation. This\n // timer follows that one, restoring a user's later arrow choice only if\n // the queued focus actually reset it. Pointer/blur/close paths are left alone.\n window.setTimeout(() => {\n if (\n !this.isConnected ||\n !this.submenuOpen ||\n submenu.hidden ||\n document.activeElement !== items[0]\n )\n return;\n items.forEach((item) => (item.active = item === selected));\n selected.focus({ preventScroll: true });\n }, 0);\n };\n}\n","interface SubmenuItem extends HTMLElement {\n submenuElement?: HTMLElement;\n submenuOpen: boolean;\n}\n\ninterface PopupMenuDropdown extends HTMLElement {\n menu?: HTMLElement;\n positionSubmenu(item: SubmenuItem): void;\n}\n\nconst installed = new WeakSet<object>();\nconst phoneWidth = '(max-width: 480px)';\nconst viewportInset = 8;\nconst menuGap = 4;\n\n/** Place a phone-width submenu beside its parent menu in the vertical axis. */\nexport function phoneSubmenuPosition(\n parent: DOMRect,\n submenu: DOMRect,\n viewport: { width: number; height: number },\n rtl: boolean,\n) {\n const width = Math.min(submenu.width, viewport.width - 2 * viewportInset);\n const height = submenu.height;\n const below = Math.max(\n 0,\n viewport.height - parent.bottom - menuGap - viewportInset,\n );\n const above = Math.max(0, parent.top - menuGap - viewportInset);\n const useBelow = height <= below || (height > above && below >= above);\n const availableHeight = useBelow ? below : above;\n const left = rtl ? parent.right - width : parent.left;\n return {\n left: Math.max(\n viewportInset,\n Math.min(left, viewport.width - viewportInset - width),\n ),\n top: useBelow\n ? parent.bottom + menuGap\n : parent.top - menuGap - Math.min(height, availableHeight),\n maxHeight: availableHeight,\n maxWidth: viewport.width - 2 * viewportInset,\n };\n}\n\nfunction clearPhoneStyles(submenu: HTMLElement) {\n for (const property of [\n 'position',\n 'left',\n 'top',\n 'max-width',\n 'max-height',\n 'box-sizing',\n 'overflow-y',\n ])\n submenu.style.removeProperty(property);\n}\n\n/**\n * Web Awesome's horizontal flip can place a submenu over the parent menu on a\n * phone. Its own auto-update loop calls this method on scroll and resize, so\n * override only PopupMenu's narrow placement and leave native menu navigation\n * and selection intact.\n */\nexport function installPopupMenuSubmenuPlacement(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const positionSubmenu = target.positionSubmenu;\n target.positionSubmenu = function (this: PopupMenuDropdown, item): void {\n if (!this.classList.contains('kui-popup-menu')) {\n positionSubmenu.call(this, item);\n return;\n }\n const submenu = item.submenuElement;\n if (!window.matchMedia(phoneWidth).matches || !submenu || !this.menu) {\n if (submenu) clearPhoneStyles(submenu);\n positionSubmenu.call(this, item);\n return;\n }\n\n // The opening event starts positioning before Web Awesome unhides the\n // submenu. Measure in the next microtask, after showPopover has run.\n window.queueMicrotask(() => {\n if (\n !this.isConnected ||\n !item.submenuOpen ||\n !window.matchMedia(phoneWidth).matches ||\n !this.menu ||\n !submenu.isConnected\n )\n return;\n const parentItem =\n item.parentElement?.localName === 'wa-dropdown-item'\n ? (item.parentElement as SubmenuItem)\n : undefined;\n const parentMenu = parentItem?.submenuElement ?? this.menu;\n submenu.style.position = 'fixed';\n submenu.style.maxWidth = `calc(100vw - ${2 * viewportInset}px)`;\n submenu.style.maxHeight = 'none';\n submenu.style.boxSizing = 'border-box';\n submenu.style.overflowY = 'auto';\n const placement = phoneSubmenuPosition(\n parentMenu.getBoundingClientRect(),\n submenu.getBoundingClientRect(),\n { width: window.innerWidth, height: window.innerHeight },\n window.getComputedStyle(this).direction === 'rtl',\n );\n submenu.style.left = `${placement.left}px`;\n submenu.style.top = `${placement.top}px`;\n submenu.style.maxHeight = `${placement.maxHeight}px`;\n submenu.style.maxWidth = `${placement.maxWidth}px`;\n submenu.setAttribute(\n 'data-placement',\n placement.top >= parentMenu.getBoundingClientRect().bottom\n ? 'bottom-start'\n : 'top-start',\n );\n });\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport WaDropdownItem from '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\n\nimport { installHelpTags } from '../../../../integrations/webawesome/help-tags/install-help-tag.js';\nimport { installDropdownShowFocus } from '../internal/install-dropdown-show-focus.js';\nimport { installPopupMenuKeyboard } from '../internal/install-popup-menu-keyboard.js';\nimport { installPopupMenuLifecycle } from '../internal/install-popup-menu-lifecycle.js';\nimport { installPopupMenuSubmenuFocus } from '../internal/install-popup-menu-submenu-focus.js';\nimport { installPopupMenuSubmenuPlacement } from '../internal/install-popup-menu-submenu-placement.js';\n\ninstallPopupMenuKeyboard(WaDropdown.prototype);\ninstallPopupMenuLifecycle(WaDropdown.prototype);\ninstallDropdownShowFocus(WaDropdown.prototype);\ninstallPopupMenuSubmenuFocus(WaDropdownItem.prototype);\ninstallPopupMenuSubmenuPlacement(WaDropdown.prototype);\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module registers the\n * Web Awesome elements a `PopupMenu` renders (`wa-dropdown`,\n * `wa-dropdown-item`, `wa-button`, and `wa-divider`) and routes a keyboard\n * choice through the item's click so delegated `data-action`s run.\n */\nexport const popupMenuElementsRegistered = true;\n"]}
@@ -0,0 +1,100 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+
4
+ type PopupMenuPlacement = 'bottom-start' | 'bottom' | 'bottom-end' | 'top-start' | 'top' | 'top-end';
5
+ type PopupMenuDataAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
6
+ 'data-action'?: never;
7
+ 'data-component'?: never;
8
+ 'data-key'?: never;
9
+ 'data-morph-skip-children'?: never;
10
+ }>;
11
+ /** One command in the menu. */
12
+ interface PopupMenuItem {
13
+ kind?: 'item';
14
+ label: string;
15
+ /** Delegated `data-action` the app handles when the item is chosen. */
16
+ action?: string;
17
+ /** Native `wa-dropdown-item` value, reported by its `wa-select` event. */
18
+ value?: string;
19
+ /** Leading icon, typically a `LucideIcon`; it is placed in the item's icon slot. */
20
+ icon?: SafeHtml;
21
+ /** A checkbox choice, including nested choices; omit for a plain command. */
22
+ checked?: boolean;
23
+ /** Trailing safe content, such as secondary status. */
24
+ details?: SafeHtml;
25
+ /** Destructive command styling. */
26
+ tone?: 'default' | 'danger';
27
+ disabled?: boolean;
28
+ /** Native tooltip text for a disabled command. */
29
+ disabledReason?: string;
30
+ /** Application `data-*` metadata such as a record id. */
31
+ attributes?: PopupMenuDataAttributes;
32
+ /** Child commands, headings, and dividers opened by hover or keyboard navigation. */
33
+ submenu?: readonly PopupMenuEntry[];
34
+ }
35
+ /** A labeled group heading; items that follow it belong to the group. */
36
+ interface PopupMenuHeading {
37
+ kind: 'heading';
38
+ label: string;
39
+ }
40
+ /** A separator between groups of items. */
41
+ interface PopupMenuDivider {
42
+ kind: 'divider';
43
+ }
44
+ type PopupMenuEntry = PopupMenuItem | PopupMenuHeading | PopupMenuDivider;
45
+ type PopupMenuTriggerName = {
46
+ /** Visible trigger text, which is also its accessible name. */
47
+ text: string;
48
+ label?: never;
49
+ } | {
50
+ text?: never;
51
+ /**
52
+ * Accessible name of an icon-only trigger, rendered as visually hidden
53
+ * slotted text (a Web Awesome button takes its name from its content).
54
+ */
55
+ label: string;
56
+ };
57
+ type PopupMenuTrigger = (PopupMenuTriggerName & {
58
+ context?: false;
59
+ }) | {
60
+ context: true;
61
+ label: string;
62
+ text?: never;
63
+ icon?: never;
64
+ caret?: never;
65
+ disabled?: never;
66
+ };
67
+ type PopupMenuProps = PopupMenuTrigger & {
68
+ /** Trigger icon, typically a `LucideIcon`, before any visible text. */
69
+ icon?: KerfUiContent;
70
+ items: readonly PopupMenuEntry[];
71
+ /** Where the menu opens relative to its trigger. Defaults to `bottom-start`. */
72
+ placement?: PopupMenuPlacement;
73
+ /** Show the disclosure caret after the trigger content. Defaults to true. */
74
+ caret?: boolean;
75
+ disabled?: boolean;
76
+ /** Application `data-*` metadata on the menu root. */
77
+ rootAttributes?: PopupMenuDataAttributes;
78
+ /** Native named-slot assignment when composed inside a web component. */
79
+ slot?: string;
80
+ };
81
+ /** A rendered context PopupMenu with Web Awesome's controlled open state. */
82
+ type PopupMenuElement = HTMLElement & {
83
+ open: boolean;
84
+ };
85
+ /** Open a context PopupMenu at viewport pointer coordinates. */
86
+ declare function openPopupMenuAt(menu: PopupMenuElement, x: number, y: number): void;
87
+ /** Close a programmatically opened PopupMenu. */
88
+ declare function closePopupMenu(menu: PopupMenuElement): void;
89
+ /**
90
+ * An action menu: a trigger button that opens a list of commands. Renders the
91
+ * `wa-dropdown` root directly, so a `single` `ToolbarControlGroup` (with
92
+ * `nestedDropdown`) or a `PopupSurface` sizes and insets it as usual. Items
93
+ * dispatch through delegated `data-action`s; the app owns the commands and any
94
+ * open-state reaction. Import `@kerfjs/ui/popup-menu/register` once to register
95
+ * the Web Awesome elements. At viewport widths up to 480px, submenus appear
96
+ * above or below their parent menu so their rows do not cover the parent list.
97
+ */
98
+ declare function PopupMenu({ text, label, icon, items, placement, caret, disabled, rootAttributes, slot, context, }: PopupMenuProps): SafeHtml;
99
+
100
+ export { PopupMenu, type PopupMenuDivider, type PopupMenuElement, type PopupMenuEntry, type PopupMenuHeading, type PopupMenuItem, type PopupMenuPlacement, type PopupMenuProps, closePopupMenu, openPopupMenuAt };
@@ -0,0 +1,3 @@
1
+ export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-NJZMR7HM.js';
2
+
3
+ //# sourceMappingURL=popup-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"popup-menu.js"}