@kerfjs/ui 4.5.0-beta.1 → 5.0.0-beta.100

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 (980) hide show
  1. package/README.md +461 -116
  2. package/ai/application-ui-diagnostic-ids-v1.json +23 -1
  3. package/ai/application-ui-profile-sync.cjs +21 -2
  4. package/ai/application-ui-profile.d.ts +4 -0
  5. package/ai/application-ui-profile.defaults.json +63 -8
  6. package/ai/application-ui-profile.mjs +28 -1
  7. package/ai/application-ui-profile.schema.json +10 -0
  8. package/ai/catalog-authoring.json +13 -4
  9. package/ai/catalog-authoring.schema.json +52 -8
  10. package/ai/compile-time-contracts-v1.json +63 -16
  11. package/ai/compile-time-contracts-v1.schema.json +4 -1
  12. package/ai/component-catalog-extension.schema.json +25 -0
  13. package/ai/component-catalog.json +5585 -1175
  14. package/ai/component-catalog.schema.json +78 -1
  15. package/ai/component-class-owners.cjs +83 -0
  16. package/ai/component-composition-extension.d.ts +7 -0
  17. package/ai/component-composition-extension.schema.json +7 -0
  18. package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +281 -49
  19. package/ai/component-composition.d.ts +132 -0
  20. package/ai/component-composition.json +8729 -0
  21. package/ai/component-composition.schema.json +412 -0
  22. package/ai/components/README.md +185 -0
  23. package/ai/components/anchored-surface.md +99 -0
  24. package/ai/components/application-tabs.md +65 -0
  25. package/ai/components/badge.md +76 -0
  26. package/ai/components/chip.md +76 -0
  27. package/ai/components/choice-chips.md +87 -0
  28. package/ai/components/collapsible-panel.md +103 -0
  29. package/ai/components/column-track.md +78 -0
  30. package/ai/components/combobox.md +88 -0
  31. package/ai/components/composer.md +83 -0
  32. package/ai/components/content-item.md +98 -0
  33. package/ai/components/content-swap.md +78 -0
  34. package/ai/components/corner-status.md +88 -0
  35. package/ai/components/disclosure-arrow.md +77 -0
  36. package/ai/components/document-baseline.md +77 -0
  37. package/ai/components/edge-activity-indicator.md +81 -0
  38. package/ai/components/empty-state.md +80 -0
  39. package/ai/components/feedback.md +71 -0
  40. package/ai/components/file-picker.md +88 -0
  41. package/ai/components/floating-toolbar.md +82 -0
  42. package/ai/components/foundation.md +65 -0
  43. package/ai/components/framed-list.md +80 -0
  44. package/ai/components/grid.md +101 -0
  45. package/ai/components/headers.md +63 -0
  46. package/ai/components/icon-button.md +82 -0
  47. package/ai/components/icon-toggle-button.md +80 -0
  48. package/ai/components/layout.md +75 -0
  49. package/ai/components/list-action-row.md +108 -0
  50. package/ai/components/list-header.md +91 -0
  51. package/ai/components/list-inset-control.md +74 -0
  52. package/ai/components/list-inset-text.md +72 -0
  53. package/ai/components/list-item.md +108 -0
  54. package/ai/components/list.md +125 -0
  55. package/ai/components/loading-spinner.md +73 -0
  56. package/ai/components/lucide-icon.md +97 -0
  57. package/ai/components/nav-stack.md +115 -0
  58. package/ai/components/pane.md +115 -0
  59. package/ai/components/popup-menu.md +171 -0
  60. package/ai/components/recipe-app-shell.md +57 -0
  61. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  62. package/ai/components/recipe-compact-toolbar.md +57 -0
  63. package/ai/components/recipe-composer-form.md +57 -0
  64. package/ai/components/recipe-list-detail-dialog.md +57 -0
  65. package/ai/components/recipe-list-workspace-states.md +57 -0
  66. package/ai/components/recipe-loading-inspector.md +57 -0
  67. package/ai/components/recipe-navigation-sidebar.md +57 -0
  68. package/ai/components/recipe-navigation-stack.md +57 -0
  69. package/ai/components/recipe-workspace-header.md +57 -0
  70. package/ai/components/resize.md +106 -0
  71. package/ai/components/row.md +96 -0
  72. package/ai/components/segmented-control.md +82 -0
  73. package/ai/components/select.md +116 -0
  74. package/ai/components/skeleton.md +84 -0
  75. package/ai/components/spacer.md +86 -0
  76. package/ai/components/split-button.md +80 -0
  77. package/ai/components/split-view.md +105 -0
  78. package/ai/components/state-banner.md +96 -0
  79. package/ai/components/summary-row.md +85 -0
  80. package/ai/components/sunken-panel.md +79 -0
  81. package/ai/components/surface-scaffold.md +105 -0
  82. package/ai/components/tab-bar.md +114 -0
  83. package/ai/components/tab-navigator.md +100 -0
  84. package/ai/components/tabs.md +95 -0
  85. package/ai/components/text.md +90 -0
  86. package/ai/components/token-search-field.md +107 -0
  87. package/ai/components/toolbar-control-group.md +125 -0
  88. package/ai/components/toolbar-text.md +100 -0
  89. package/ai/components/toolbar.md +103 -0
  90. package/ai/components/value-table.md +80 -0
  91. package/ai/components/wa-accordion-item.md +55 -0
  92. package/ai/components/wa-accordion.md +65 -0
  93. package/ai/components/wa-animated-image.md +55 -0
  94. package/ai/components/wa-animation.md +55 -0
  95. package/ai/components/wa-avatar.md +55 -0
  96. package/ai/components/wa-badge.md +55 -0
  97. package/ai/components/wa-breadcrumb-item.md +53 -0
  98. package/ai/components/wa-breadcrumb.md +55 -0
  99. package/ai/components/wa-button-group.md +60 -0
  100. package/ai/components/wa-button.md +59 -0
  101. package/ai/components/wa-callout.md +58 -0
  102. package/ai/components/wa-card.md +59 -0
  103. package/ai/components/wa-carousel-item.md +53 -0
  104. package/ai/components/wa-carousel.md +55 -0
  105. package/ai/components/wa-checkbox-group.md +55 -0
  106. package/ai/components/wa-checkbox.md +55 -0
  107. package/ai/components/wa-color-picker.md +55 -0
  108. package/ai/components/wa-comparison.md +55 -0
  109. package/ai/components/wa-copy-button.md +55 -0
  110. package/ai/components/wa-details.md +61 -0
  111. package/ai/components/wa-dialog.md +59 -0
  112. package/ai/components/wa-divider.md +53 -0
  113. package/ai/components/wa-drawer.md +55 -0
  114. package/ai/components/wa-dropdown-item.md +60 -0
  115. package/ai/components/wa-dropdown.md +60 -0
  116. package/ai/components/wa-format-bytes.md +53 -0
  117. package/ai/components/wa-format-date.md +53 -0
  118. package/ai/components/wa-format-number.md +53 -0
  119. package/ai/components/wa-icon.md +58 -0
  120. package/ai/components/wa-include.md +53 -0
  121. package/ai/components/wa-input.md +59 -0
  122. package/ai/components/wa-intersection-observer.md +53 -0
  123. package/ai/components/wa-known-date.md +53 -0
  124. package/ai/components/wa-markdown.md +53 -0
  125. package/ai/components/wa-mutation-observer.md +53 -0
  126. package/ai/components/wa-number-input.md +55 -0
  127. package/ai/components/wa-option.md +59 -0
  128. package/ai/components/wa-otp-input.md +53 -0
  129. package/ai/components/wa-page.md +53 -0
  130. package/ai/components/wa-pagination.md +55 -0
  131. package/ai/components/wa-popover.md +55 -0
  132. package/ai/components/wa-popup.md +53 -0
  133. package/ai/components/wa-progress-bar.md +53 -0
  134. package/ai/components/wa-progress-ring.md +53 -0
  135. package/ai/components/wa-qr-code.md +53 -0
  136. package/ai/components/wa-radio-group.md +59 -0
  137. package/ai/components/wa-radio.md +55 -0
  138. package/ai/components/wa-random-content.md +53 -0
  139. package/ai/components/wa-rating.md +55 -0
  140. package/ai/components/wa-relative-time.md +53 -0
  141. package/ai/components/wa-resize-observer.md +53 -0
  142. package/ai/components/wa-scroller.md +53 -0
  143. package/ai/components/wa-select.md +63 -0
  144. package/ai/components/wa-skeleton.md +53 -0
  145. package/ai/components/wa-slider.md +55 -0
  146. package/ai/components/wa-spinner.md +58 -0
  147. package/ai/components/wa-split-panel.md +58 -0
  148. package/ai/components/wa-switch.md +53 -0
  149. package/ai/components/wa-tab-group.md +69 -0
  150. package/ai/components/wa-tab-panel.md +60 -0
  151. package/ai/components/wa-tab.md +59 -0
  152. package/ai/components/wa-tag.md +59 -0
  153. package/ai/components/wa-textarea.md +53 -0
  154. package/ai/components/wa-time-input.md +55 -0
  155. package/ai/components/wa-toast-item.md +60 -0
  156. package/ai/components/wa-toast.md +60 -0
  157. package/ai/components/wa-tooltip.md +55 -0
  158. package/ai/components/wa-tree-item.md +55 -0
  159. package/ai/components/wa-tree.md +55 -0
  160. package/ai/components/wa-zoomable-frame.md +55 -0
  161. package/ai/components/workbench.md +120 -0
  162. package/ai/public-api-signatures-v1.md +3851 -441
  163. package/ai/skill.md +402 -70
  164. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  165. package/analyzer/cli.mjs +5 -2
  166. package/analyzer/component-ownership.d.mts +72 -0
  167. package/analyzer/component-ownership.mjs +429 -0
  168. package/analyzer/index.d.mts +8 -0
  169. package/analyzer/index.mjs +1687 -49
  170. package/analyzer/loud-pairs.d.mts +49 -0
  171. package/analyzer/loud-pairs.mjs +357 -0
  172. package/analyzer/selectors.d.mts +21 -0
  173. package/analyzer/selectors.mjs +212 -0
  174. package/catalog-projection-cli.mjs +96 -0
  175. package/catalog-projection.d.mts +55 -0
  176. package/catalog-projection.mjs +62 -0
  177. package/dist/anchored-surface.d.ts +69 -0
  178. package/dist/anchored-surface.js +3 -0
  179. package/dist/anchored-surface.js.map +1 -0
  180. package/dist/app-tab.d.ts +39 -4
  181. package/dist/app-tab.js +2 -1
  182. package/dist/badge.d.ts +83 -0
  183. package/dist/badge.js +4 -0
  184. package/dist/badge.js.map +1 -0
  185. package/dist/browser/anchored-surface.js +3 -0
  186. package/dist/browser/badge.js +3 -0
  187. package/dist/browser/catalog.js +28 -0
  188. package/dist/browser/chip.js +3 -0
  189. package/dist/browser/choice-chips.js +3 -0
  190. package/dist/browser/collapsible-panel.js +9 -0
  191. package/dist/browser/column-track.js +3 -0
  192. package/dist/browser/combobox.js +3 -0
  193. package/dist/browser/composer.js +4 -0
  194. package/dist/browser/content-item.js +3 -0
  195. package/dist/browser/content-swap.js +3 -0
  196. package/dist/browser/corner-status.js +3 -0
  197. package/dist/browser/edge-activity-indicator.js +3 -0
  198. package/dist/browser/file-picker.js +3 -0
  199. package/dist/browser/framed-list.js +3 -0
  200. package/dist/browser/grid.js +3 -0
  201. package/dist/browser/icon-button.js +4 -0
  202. package/dist/browser/icon-toggle-button.js +4 -0
  203. package/dist/browser/list-action-row.js +2 -0
  204. package/dist/browser/list-header.js +3 -1
  205. package/dist/browser/list-item.js +1 -0
  206. package/dist/browser/nav-stack.js +11 -0
  207. package/dist/browser/popup-menu.js +3 -0
  208. package/dist/browser/row.js +3 -0
  209. package/dist/browser/segmented-control.js +0 -1
  210. package/dist/browser/select.js +2 -1
  211. package/dist/browser/spacer.js +3 -0
  212. package/dist/browser/split-button.js +5 -0
  213. package/dist/browser/split-view.js +13 -0
  214. package/dist/browser/state-banner.js +1 -0
  215. package/dist/browser/summary-row.js +3 -0
  216. package/dist/browser/surface-scaffold.js +3 -0
  217. package/dist/browser/tab-navigator.js +4 -0
  218. package/dist/browser/text.js +3 -0
  219. package/dist/browser/toolbar-control-group.js +1 -0
  220. package/dist/browser/workbench.js +14 -0
  221. package/dist/catalog-resources.d.ts +17 -1
  222. package/dist/catalog-resources.js +5 -5
  223. package/dist/catalog-resources.js.map +1 -1
  224. package/dist/catalog.d.ts +123 -121
  225. package/dist/catalog.js +598 -269
  226. package/dist/catalog.js.map +1 -1
  227. package/dist/chip.d.ts +69 -0
  228. package/dist/chip.js +3 -0
  229. package/dist/chip.js.map +1 -0
  230. package/dist/choice-chips.d.ts +82 -0
  231. package/dist/choice-chips.js +3 -0
  232. package/dist/choice-chips.js.map +1 -0
  233. package/dist/chunk-2GOCOLQL.js +270 -0
  234. package/dist/chunk-2GOCOLQL.js.map +1 -0
  235. package/dist/chunk-2MSPNRWJ.js +82 -0
  236. package/dist/chunk-2MSPNRWJ.js.map +1 -0
  237. package/dist/chunk-34U4ANDJ.js +119 -0
  238. package/dist/chunk-34U4ANDJ.js.map +1 -0
  239. package/dist/chunk-3GLYIIFR.js +230 -0
  240. package/dist/chunk-3GLYIIFR.js.map +1 -0
  241. package/dist/{chunk-Y6LYKFXY.js → chunk-3VXDSIBJ.js} +7 -4
  242. package/dist/chunk-3VXDSIBJ.js.map +1 -0
  243. package/dist/chunk-3WYREXW4.js +120 -0
  244. package/dist/chunk-3WYREXW4.js.map +1 -0
  245. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  246. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  247. package/dist/chunk-6C6DLP3W.js +31 -0
  248. package/dist/chunk-6C6DLP3W.js.map +1 -0
  249. package/dist/chunk-7IUEBNCO.js +108 -0
  250. package/dist/chunk-7IUEBNCO.js.map +1 -0
  251. package/dist/{chunk-QO55FN2Y.js → chunk-AN5IWMTM.js} +7 -3
  252. package/dist/chunk-AN5IWMTM.js.map +1 -0
  253. package/dist/chunk-AV7CPAPT.js +82 -0
  254. package/dist/chunk-AV7CPAPT.js.map +1 -0
  255. package/dist/{chunk-PX3YSS5C.js → chunk-B53PS2LE.js} +5 -3
  256. package/dist/chunk-B53PS2LE.js.map +1 -0
  257. package/dist/chunk-CA7LNX3J.js +44 -0
  258. package/dist/chunk-CA7LNX3J.js.map +1 -0
  259. package/dist/chunk-CEJ5FK6G.js +288 -0
  260. package/dist/chunk-CEJ5FK6G.js.map +1 -0
  261. package/dist/chunk-CMETHPKR.js +175 -0
  262. package/dist/chunk-CMETHPKR.js.map +1 -0
  263. package/dist/chunk-CMLPFIC5.js +46 -0
  264. package/dist/chunk-CMLPFIC5.js.map +1 -0
  265. package/dist/{chunk-RKVQEH4J.js → chunk-CVD5IZGB.js} +10 -5
  266. package/dist/chunk-CVD5IZGB.js.map +1 -0
  267. package/dist/chunk-CXZXHZTR.js +514 -0
  268. package/dist/chunk-CXZXHZTR.js.map +1 -0
  269. package/dist/chunk-D5RGM3XA.js +38 -0
  270. package/dist/chunk-D5RGM3XA.js.map +1 -0
  271. package/dist/{chunk-KWWR5VMS.js → chunk-DZJ4GBSP.js} +19 -5
  272. package/dist/chunk-DZJ4GBSP.js.map +1 -0
  273. package/dist/chunk-EIET4QLK.js +51 -0
  274. package/dist/chunk-EIET4QLK.js.map +1 -0
  275. package/dist/chunk-ELCMSQNJ.js +49 -0
  276. package/dist/chunk-ELCMSQNJ.js.map +1 -0
  277. package/dist/chunk-EOO6PYGF.js +162 -0
  278. package/dist/chunk-EOO6PYGF.js.map +1 -0
  279. package/dist/chunk-ETCWQLJV.js +85 -0
  280. package/dist/chunk-ETCWQLJV.js.map +1 -0
  281. package/dist/chunk-FDZNYD4C.js +138 -0
  282. package/dist/chunk-FDZNYD4C.js.map +1 -0
  283. package/dist/chunk-FR76ZJQC.js +90 -0
  284. package/dist/chunk-FR76ZJQC.js.map +1 -0
  285. package/dist/chunk-G3J7JDP6.js +29 -0
  286. package/dist/chunk-G3J7JDP6.js.map +1 -0
  287. package/dist/chunk-GS2QD3N7.js +14 -0
  288. package/dist/chunk-GS2QD3N7.js.map +1 -0
  289. package/dist/chunk-HGV7J4T6.js +86 -0
  290. package/dist/chunk-HGV7J4T6.js.map +1 -0
  291. package/dist/chunk-HLDRH23D.js +84 -0
  292. package/dist/chunk-HLDRH23D.js.map +1 -0
  293. package/dist/chunk-HQZYKJ56.js +302 -0
  294. package/dist/chunk-HQZYKJ56.js.map +1 -0
  295. package/dist/chunk-HZPHCSCS.js +95 -0
  296. package/dist/chunk-HZPHCSCS.js.map +1 -0
  297. package/dist/chunk-IKS72C6P.js +53 -0
  298. package/dist/chunk-IKS72C6P.js.map +1 -0
  299. package/dist/chunk-IM3GKYOG.js +202 -0
  300. package/dist/chunk-IM3GKYOG.js.map +1 -0
  301. package/dist/{chunk-JRKSK2HX.js → chunk-INI4WDWC.js} +53 -7
  302. package/dist/chunk-INI4WDWC.js.map +1 -0
  303. package/dist/chunk-IQSRHXZR.js +164 -0
  304. package/dist/chunk-IQSRHXZR.js.map +1 -0
  305. package/dist/{chunk-M7JBER5U.js → chunk-JOR5LGYE.js} +18 -4
  306. package/dist/chunk-JOR5LGYE.js.map +1 -0
  307. package/dist/chunk-K4AT3V3J.js +545 -0
  308. package/dist/chunk-K4AT3V3J.js.map +1 -0
  309. package/dist/chunk-KCS6NJ3O.js +82 -0
  310. package/dist/chunk-KCS6NJ3O.js.map +1 -0
  311. package/dist/{chunk-SRSJO5QE.js → chunk-KH4KEMSP.js} +34 -3
  312. package/dist/chunk-KH4KEMSP.js.map +1 -0
  313. package/dist/chunk-LL45C7BB.js +122 -0
  314. package/dist/chunk-LL45C7BB.js.map +1 -0
  315. package/dist/chunk-LOSRXZAH.js +100 -0
  316. package/dist/chunk-LOSRXZAH.js.map +1 -0
  317. package/dist/{chunk-7KEUJIIC.js → chunk-MF6ZUUJZ.js} +93 -11
  318. package/dist/chunk-MF6ZUUJZ.js.map +1 -0
  319. package/dist/chunk-MHMWQ7RB.js +19 -0
  320. package/dist/chunk-MHMWQ7RB.js.map +1 -0
  321. package/dist/chunk-MJ5RU6XT.js +173 -0
  322. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  323. package/dist/chunk-MXNIVEVL.js +48 -0
  324. package/dist/chunk-MXNIVEVL.js.map +1 -0
  325. package/dist/{chunk-IJBSZ4NX.js → chunk-NS2TBYM4.js} +8 -5
  326. package/dist/chunk-NS2TBYM4.js.map +1 -0
  327. package/dist/chunk-PIVY32AE.js +140 -0
  328. package/dist/chunk-PIVY32AE.js.map +1 -0
  329. package/dist/chunk-PYBBYSZ3.js +526 -0
  330. package/dist/chunk-PYBBYSZ3.js.map +1 -0
  331. package/dist/chunk-QDSZTQXL.js +28 -0
  332. package/dist/chunk-QDSZTQXL.js.map +1 -0
  333. package/dist/chunk-QH5KOFNS.js +39 -0
  334. package/dist/chunk-QH5KOFNS.js.map +1 -0
  335. package/dist/chunk-QIG4IGUP.js +139 -0
  336. package/dist/chunk-QIG4IGUP.js.map +1 -0
  337. package/dist/chunk-QLA25V2K.js +493 -0
  338. package/dist/chunk-QLA25V2K.js.map +1 -0
  339. package/dist/chunk-QROYYGWU.js +52 -0
  340. package/dist/chunk-QROYYGWU.js.map +1 -0
  341. package/dist/chunk-QYMJHS4K.js +36 -0
  342. package/dist/chunk-QYMJHS4K.js.map +1 -0
  343. package/dist/chunk-RHD7RKGI.js +176 -0
  344. package/dist/chunk-RHD7RKGI.js.map +1 -0
  345. package/dist/chunk-S2XULQEK.js +52 -0
  346. package/dist/chunk-S2XULQEK.js.map +1 -0
  347. package/dist/{chunk-LPOMRC4C.js → chunk-S3ECMF23.js} +11 -3
  348. package/dist/chunk-S3ECMF23.js.map +1 -0
  349. package/dist/chunk-S4Y3YTAI.js +35 -0
  350. package/dist/chunk-S4Y3YTAI.js.map +1 -0
  351. package/dist/chunk-S4ZGTDSG.js +18 -0
  352. package/dist/chunk-S4ZGTDSG.js.map +1 -0
  353. package/dist/{chunk-PSKN344N.js → chunk-T4WJ5VGP.js} +63 -12
  354. package/dist/chunk-T4WJ5VGP.js.map +1 -0
  355. package/dist/chunk-TDMHA7C3.js +251 -0
  356. package/dist/chunk-TDMHA7C3.js.map +1 -0
  357. package/dist/{chunk-Y45PPBDV.js → chunk-TGLUDQP2.js} +47 -14
  358. package/dist/chunk-TGLUDQP2.js.map +1 -0
  359. package/dist/chunk-TLMMFQWM.js +222 -0
  360. package/dist/chunk-TLMMFQWM.js.map +1 -0
  361. package/dist/chunk-U6QYTMDB.js +85 -0
  362. package/dist/chunk-U6QYTMDB.js.map +1 -0
  363. package/dist/chunk-UMKV7YVQ.js +20 -0
  364. package/dist/chunk-UMKV7YVQ.js.map +1 -0
  365. package/dist/chunk-VFYO3UGZ.js +45 -0
  366. package/dist/chunk-VFYO3UGZ.js.map +1 -0
  367. package/dist/chunk-W4IK7AWD.js +73 -0
  368. package/dist/chunk-W4IK7AWD.js.map +1 -0
  369. package/dist/chunk-WVS6CUCT.js +48 -0
  370. package/dist/chunk-WVS6CUCT.js.map +1 -0
  371. package/dist/chunk-Y6KT7ZTR.js +109 -0
  372. package/dist/chunk-Y6KT7ZTR.js.map +1 -0
  373. package/dist/chunk-YMUIQRWK.js +44 -0
  374. package/dist/chunk-YMUIQRWK.js.map +1 -0
  375. package/dist/chunk-YOA5W5ZH.js +807 -0
  376. package/dist/chunk-YOA5W5ZH.js.map +1 -0
  377. package/dist/chunk-YQ2AC4E2.js +59 -0
  378. package/dist/chunk-YQ2AC4E2.js.map +1 -0
  379. package/dist/chunk-ZKKO4MHC.js +25 -0
  380. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  381. package/dist/chunk-ZNROKDSZ.js +54 -0
  382. package/dist/chunk-ZNROKDSZ.js.map +1 -0
  383. package/dist/collapsible-panel.d.ts +96 -17
  384. package/dist/collapsible-panel.js +104 -27
  385. package/dist/collapsible-panel.js.map +1 -1
  386. package/dist/column-track.d.ts +41 -0
  387. package/dist/column-track.js +4 -0
  388. package/dist/column-track.js.map +1 -0
  389. package/dist/combobox.d.ts +40 -0
  390. package/dist/combobox.js +3 -0
  391. package/dist/combobox.js.map +1 -0
  392. package/dist/composer.d.ts +62 -0
  393. package/dist/composer.js +5 -0
  394. package/dist/composer.js.map +1 -0
  395. package/dist/content-item.d.ts +116 -0
  396. package/dist/content-item.js +4 -0
  397. package/dist/content-item.js.map +1 -0
  398. package/dist/content-swap.d.ts +34 -0
  399. package/dist/content-swap.js +3 -0
  400. package/dist/content-swap.js.map +1 -0
  401. package/dist/corner-status.d.ts +36 -0
  402. package/dist/corner-status.js +3 -0
  403. package/dist/corner-status.js.map +1 -0
  404. package/dist/css-values.d.ts +127 -0
  405. package/dist/css-values.js +3 -0
  406. package/dist/css-values.js.map +1 -0
  407. package/dist/device-class.js +1 -1
  408. package/dist/device-class.js.map +1 -1
  409. package/dist/disclosure-arrow.d.ts +6 -1
  410. package/dist/disclosure-arrow.js +2 -1
  411. package/dist/edge-activity-indicator.d.ts +28 -0
  412. package/dist/edge-activity-indicator.js +3 -0
  413. package/dist/edge-activity-indicator.js.map +1 -0
  414. package/dist/empty-state.d.ts +5 -2
  415. package/dist/empty-state.js +2 -1
  416. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  417. package/dist/file-picker.d.ts +47 -0
  418. package/dist/file-picker.js +3 -0
  419. package/dist/file-picker.js.map +1 -0
  420. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  421. package/dist/floating-toolbar.d.ts +29 -6
  422. package/dist/floating-toolbar.js +1 -1
  423. package/dist/framed-list.d.ts +47 -0
  424. package/dist/framed-list.js +4 -0
  425. package/dist/framed-list.js.map +1 -0
  426. package/dist/grid.d.ts +58 -0
  427. package/dist/grid.js +6 -0
  428. package/dist/grid.js.map +1 -0
  429. package/dist/help-tags-register.d.ts +13 -0
  430. package/dist/help-tags-register.js +9 -0
  431. package/dist/help-tags-register.js.map +1 -0
  432. package/dist/icon-button.d.ts +46 -0
  433. package/dist/icon-button.js +6 -0
  434. package/dist/icon-button.js.map +1 -0
  435. package/dist/icon-toggle-button.d.ts +42 -0
  436. package/dist/icon-toggle-button.js +6 -0
  437. package/dist/icon-toggle-button.js.map +1 -0
  438. package/dist/index.d.ts +59 -20
  439. package/dist/index.js +66 -29
  440. package/dist/list-action-row.d.ts +69 -12
  441. package/dist/list-action-row.js +5 -1
  442. package/dist/list-header.d.ts +36 -2
  443. package/dist/list-header.js +4 -1
  444. package/dist/list-icon-tile-B8dr97OW.d.ts +18 -0
  445. package/dist/list-inset-control.d.ts +10 -4
  446. package/dist/list-inset-control.js +1 -1
  447. package/dist/list-inset-text.d.ts +17 -12
  448. package/dist/list-inset-text.js +2 -1
  449. package/dist/list-item.d.ts +49 -5
  450. package/dist/list-item.js +4 -1
  451. package/dist/list.d.ts +121 -12
  452. package/dist/list.js +5 -1
  453. package/dist/loading-spinner.d.ts +12 -2
  454. package/dist/loading-spinner.js +2 -1
  455. package/dist/lucide-icon.d.ts +15 -3
  456. package/dist/lucide-icon.js +2 -1
  457. package/dist/nav-stack-VXTumzKa.d.ts +158 -0
  458. package/dist/nav-stack.d.ts +15 -38
  459. package/dist/nav-stack.js +13 -1
  460. package/dist/pane.d.ts +111 -7
  461. package/dist/pane.js +2 -1
  462. package/dist/panel-toolbar-vg6Ir5Dy.d.ts +77 -0
  463. package/dist/popup-menu-register.d.ts +10 -0
  464. package/dist/popup-menu-register.js +336 -0
  465. package/dist/popup-menu-register.js.map +1 -0
  466. package/dist/popup-menu.d.ts +125 -0
  467. package/dist/popup-menu.js +3 -0
  468. package/dist/popup-menu.js.map +1 -0
  469. package/dist/resizable-region.d.ts +32 -3
  470. package/dist/resizable-region.js +1 -1
  471. package/dist/row.d.ts +53 -0
  472. package/dist/row.js +7 -0
  473. package/dist/row.js.map +1 -0
  474. package/dist/scroll-clearance-BikHljTc.d.ts +14 -0
  475. package/dist/segmented-control.d.ts +7 -4
  476. package/dist/segmented-control.js +1 -2
  477. package/dist/select-register.js +255 -3
  478. package/dist/select-register.js.map +1 -1
  479. package/dist/select.d.ts +95 -6
  480. package/dist/select.js +4 -1
  481. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  482. package/dist/semantic-tone-CdW013KF.d.ts +4 -0
  483. package/dist/sides-BPSWde0A.d.ts +4 -0
  484. package/dist/skeleton.d.ts +14 -7
  485. package/dist/skeleton.js +2 -1
  486. package/dist/spacer.d.ts +18 -0
  487. package/dist/spacer.js +4 -0
  488. package/dist/spacer.js.map +1 -0
  489. package/dist/split-button.d.ts +57 -0
  490. package/dist/split-button.js +7 -0
  491. package/dist/split-button.js.map +1 -0
  492. package/dist/split-view.d.ts +63 -6
  493. package/dist/split-view.js +88 -9
  494. package/dist/split-view.js.map +1 -1
  495. package/dist/state-banner.d.ts +37 -6
  496. package/dist/state-banner.js +4 -1
  497. package/dist/styles/anchored-surface.css +41 -0
  498. package/dist/styles/app-tab.css +232 -0
  499. package/dist/styles/badge.css +145 -0
  500. package/dist/styles/catalog/components/catalog-example-stack.css +14 -0
  501. package/dist/styles/catalog/components/catalog-example.css +204 -0
  502. package/dist/styles/catalog/components/catalog-stage.css +61 -0
  503. package/dist/styles/catalog/components/catalog.css +26 -0
  504. package/dist/styles/catalog.css +5 -575
  505. package/dist/styles/chip.css +208 -0
  506. package/dist/styles/choice-chips.css +154 -0
  507. package/dist/styles/collapsible-panel.css +450 -16
  508. package/dist/styles/column-track.css +57 -0
  509. package/dist/styles/combobox.css +113 -0
  510. package/dist/styles/components/actions/floating-toolbar/floating-toolbar.css +119 -0
  511. package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
  512. package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
  513. package/dist/styles/components/actions/popup-menu/popup-menu.css +370 -0
  514. package/dist/styles/components/actions/split-button/split-button.css +95 -0
  515. package/dist/styles/components/actions/toolbar/toolbar.css +443 -0
  516. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +1069 -0
  517. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +269 -0
  518. package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
  519. package/dist/styles/components/collections/list/list.css +250 -0
  520. package/dist/styles/components/collections/list-action-row/list-action-row.css +466 -0
  521. package/dist/styles/components/collections/list-header/list-header.css +229 -0
  522. package/dist/styles/components/collections/list-inset-control/list-inset-control.css +30 -0
  523. package/dist/styles/components/collections/list-inset-text/list-inset-text.css +29 -0
  524. package/dist/styles/components/collections/list-item/list-item.css +461 -0
  525. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  526. package/dist/styles/components/data-display/value-table/value-table.css +183 -0
  527. package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +41 -0
  528. package/dist/styles/components/feedback/badge/badge.css +145 -0
  529. package/dist/styles/components/feedback/chip/chip.css +208 -0
  530. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  531. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  532. package/dist/styles/components/feedback/empty-state/empty-state.css +47 -0
  533. package/dist/styles/components/feedback/loading-spinner/loading-spinner.css +25 -0
  534. package/dist/styles/components/feedback/skeleton/skeleton.css +92 -0
  535. package/dist/styles/components/feedback/state-banner/state-banner.css +297 -0
  536. package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
  537. package/dist/styles/components/forms/combobox/combobox.css +113 -0
  538. package/dist/styles/components/forms/composer/composer.css +100 -0
  539. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  540. package/dist/styles/components/forms/segmented-control/segmented-control.css +196 -0
  541. package/dist/styles/components/forms/select/select.css +455 -0
  542. package/dist/styles/components/forms/token-search-field/token-search-field.css +432 -0
  543. package/dist/styles/components/layout/collapsible-panel/collapsible-panel.css +580 -0
  544. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  545. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  546. package/dist/styles/components/layout/grid/grid.css +88 -0
  547. package/dist/styles/components/layout/pane/pane.css +382 -0
  548. package/dist/styles/components/layout/resizable-region/resizable-region.css +545 -0
  549. package/dist/styles/components/layout/row/row.css +114 -0
  550. package/dist/styles/components/layout/spacer/spacer.css +11 -0
  551. package/dist/styles/components/layout/split-view/split-view.css +146 -0
  552. package/dist/styles/components/layout/workbench/workbench.css +1086 -0
  553. package/dist/styles/components/media/lucide-icon/lucide-icon.css +15 -0
  554. package/dist/styles/components/navigation/app-tab/app-tab.css +384 -0
  555. package/dist/styles/components/navigation/disclosure-arrow/disclosure-arrow.css +23 -0
  556. package/dist/styles/components/navigation/nav-stack/nav-stack.css +342 -0
  557. package/dist/styles/components/navigation/tab-bar/tab-bar.css +197 -0
  558. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +325 -0
  559. package/dist/styles/components/surfaces/content-item/content-item.css +138 -0
  560. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +31 -0
  561. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +425 -0
  562. package/dist/styles/components/typography/text/text.css +220 -0
  563. package/dist/styles/composer.css +100 -0
  564. package/dist/styles/content-item.css +138 -0
  565. package/dist/styles/content-swap.css +154 -0
  566. package/dist/styles/corner-status.css +60 -0
  567. package/dist/styles/document.css +98 -0
  568. package/dist/styles/edge-activity-indicator.css +127 -0
  569. package/dist/styles/file-picker.css +81 -0
  570. package/dist/styles/floating-toolbar.css +87 -6
  571. package/dist/styles/foundation.css +254 -53
  572. package/dist/styles/framed-list.css +47 -0
  573. package/dist/styles/grid.css +88 -0
  574. package/dist/styles/icon-button.css +22 -0
  575. package/dist/styles/icon-toggle-button.css +83 -0
  576. package/dist/styles/layout.css +1 -21
  577. package/dist/styles/list-action-row.css +323 -17
  578. package/dist/styles/list-header.css +128 -59
  579. package/dist/styles/list-inset-control.css +25 -2
  580. package/dist/styles/list-inset-text.css +27 -12
  581. package/dist/styles/list-item.css +371 -33
  582. package/dist/styles/list.css +214 -7
  583. package/dist/styles/loading-spinner.css +4 -0
  584. package/dist/styles/lucide-icon.css +9 -0
  585. package/dist/styles/nav-stack.css +280 -49
  586. package/dist/styles/pane.css +322 -2
  587. package/dist/styles/popup-menu.css +370 -0
  588. package/dist/styles/resizable-region.css +438 -4
  589. package/dist/styles/row.css +114 -0
  590. package/dist/styles/segmented-control.css +34 -3
  591. package/dist/styles/select.css +338 -23
  592. package/dist/styles/skeleton.css +64 -3
  593. package/dist/styles/spacer.css +11 -0
  594. package/dist/styles/split-button.css +95 -0
  595. package/dist/styles/split-view.css +114 -3
  596. package/dist/styles/state-banner.css +141 -42
  597. package/dist/styles/styles.css +22 -1
  598. package/dist/styles/summary-row.css +161 -0
  599. package/dist/styles/sunken-panel.css +13 -4
  600. package/dist/styles/surface-scaffold.css +425 -0
  601. package/dist/styles/tab-bar.css +161 -9
  602. package/dist/styles/tab-navigator.css +325 -0
  603. package/dist/styles/text.css +220 -0
  604. package/dist/styles/token-search-field.css +202 -59
  605. package/dist/styles/toolbar-control-group.css +886 -42
  606. package/dist/styles/toolbar-text.css +184 -7
  607. package/dist/styles/toolbar.css +363 -17
  608. package/dist/styles/value-table.css +115 -7
  609. package/dist/styles/webawesome.css +282 -20
  610. package/dist/styles/workbench.css +999 -7
  611. package/dist/summary-row.d.ts +56 -0
  612. package/dist/summary-row.js +4 -0
  613. package/dist/summary-row.js.map +1 -0
  614. package/dist/sunken-panel.d.ts +23 -4
  615. package/dist/sunken-panel.js +2 -1
  616. package/dist/surface-scaffold-register.d.ts +9 -0
  617. package/dist/surface-scaffold-register.js +151 -0
  618. package/dist/surface-scaffold-register.js.map +1 -0
  619. package/dist/surface-scaffold.d.ts +170 -0
  620. package/dist/surface-scaffold.js +4 -0
  621. package/dist/surface-scaffold.js.map +1 -0
  622. package/dist/tab-bar.d.ts +31 -6
  623. package/dist/tab-bar.js +1 -1
  624. package/dist/tab-navigator.d.ts +114 -0
  625. package/dist/tab-navigator.js +102 -0
  626. package/dist/tab-navigator.js.map +1 -0
  627. package/dist/text.d.ts +98 -0
  628. package/dist/text.js +3 -0
  629. package/dist/text.js.map +1 -0
  630. package/dist/token-search-field.d.ts +3 -59
  631. package/dist/token-search-field.js +2 -1
  632. package/dist/token-search-model-aYR0YAei.d.ts +184 -0
  633. package/dist/token-search-model.d.ts +3 -0
  634. package/dist/token-search-model.js +3 -0
  635. package/dist/token-search-model.js.map +1 -0
  636. package/dist/toolbar-control-group.d.ts +87 -4
  637. package/dist/toolbar-control-group.js +3 -1
  638. package/dist/toolbar-text.d.ts +46 -12
  639. package/dist/toolbar-text.js +2 -1
  640. package/dist/toolbar.d.ts +71 -9
  641. package/dist/toolbar.js +1 -1
  642. package/dist/types-CVgIwSdq.d.ts +189 -0
  643. package/dist/value-table.d.ts +30 -4
  644. package/dist/value-table.js +2 -1
  645. package/dist/webawesome.d.ts +8 -1
  646. package/dist/wire-catalog.d.ts +88 -13
  647. package/dist/wire-catalog.js +240 -206
  648. package/dist/wire-catalog.js.map +1 -1
  649. package/dist/wire-comboboxes.d.ts +26 -0
  650. package/dist/wire-comboboxes.js +3 -0
  651. package/dist/wire-comboboxes.js.map +1 -0
  652. package/dist/wire-composers.d.ts +16 -0
  653. package/dist/wire-composers.js +3 -0
  654. package/dist/wire-composers.js.map +1 -0
  655. package/dist/wire-content-items.d.ts +11 -0
  656. package/dist/wire-content-items.js +139 -0
  657. package/dist/wire-content-items.js.map +1 -0
  658. package/dist/wire-corner-status.d.ts +11 -0
  659. package/dist/wire-corner-status.js +3 -0
  660. package/dist/wire-corner-status.js.map +1 -0
  661. package/dist/wire-file-pickers.d.ts +26 -0
  662. package/dist/wire-file-pickers.js +3 -0
  663. package/dist/wire-file-pickers.js.map +1 -0
  664. package/dist/wire-list-focus-scroll.d.ts +16 -0
  665. package/dist/wire-list-focus-scroll.js +3 -0
  666. package/dist/wire-list-focus-scroll.js.map +1 -0
  667. package/dist/wire-list-reorder.d.ts +41 -0
  668. package/dist/wire-list-reorder.js +3 -0
  669. package/dist/wire-list-reorder.js.map +1 -0
  670. package/dist/wire-nav-stack.d.ts +4 -1
  671. package/dist/wire-nav-stack.js +312 -16
  672. package/dist/wire-nav-stack.js.map +1 -1
  673. package/dist/wire-resizable-regions.d.ts +2 -1
  674. package/dist/wire-resizable-regions.js +2 -1
  675. package/dist/wire-scroll-dividers.d.ts +87 -0
  676. package/dist/wire-scroll-dividers.js +3 -0
  677. package/dist/wire-scroll-dividers.js.map +1 -0
  678. package/dist/wire-sidebar.d.ts +24 -4
  679. package/dist/wire-sidebar.js +122 -19
  680. package/dist/wire-sidebar.js.map +1 -1
  681. package/dist/wire-tab-bars.d.ts +1 -0
  682. package/dist/wire-tab-bars.js +1 -1
  683. package/dist/wire-tab-navigator.d.ts +13 -0
  684. package/dist/wire-tab-navigator.js +153 -0
  685. package/dist/wire-tab-navigator.js.map +1 -0
  686. package/dist/wire-token-search-fields.d.ts +5 -1
  687. package/dist/wire-token-search-fields.js +2 -1
  688. package/dist/wire-toolbar-visibility.d.ts +13 -0
  689. package/dist/wire-toolbar-visibility.js +3 -0
  690. package/dist/wire-toolbar-visibility.js.map +1 -0
  691. package/dist/wire-workbench.d.ts +116 -0
  692. package/dist/wire-workbench.js +6 -0
  693. package/dist/wire-workbench.js.map +1 -0
  694. package/dist/workbench.d.ts +253 -10
  695. package/dist/workbench.js +20 -62
  696. package/dist/workbench.js.map +1 -1
  697. package/docs/accessibility.md +617 -32
  698. package/docs/anchored-surface.md +101 -0
  699. package/docs/app-layouts.md +159 -10
  700. package/docs/apple-hig.md +2 -0
  701. package/docs/catalog.md +403 -110
  702. package/docs/collapsible-panel.md +272 -16
  703. package/docs/component-contract.md +700 -79
  704. package/docs/component-integration.md +75 -0
  705. package/docs/component-selection.md +908 -79
  706. package/docs/composer.md +143 -0
  707. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  708. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  709. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  710. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  711. package/docs/design/templates/choice-chips/multiple-dark.svg +1 -0
  712. package/docs/design/templates/choice-chips/multiple.svg +1 -0
  713. package/docs/design/templates/choice-chips-dark.svg +1 -0
  714. package/docs/design/templates/choice-chips.svg +1 -0
  715. package/docs/design/templates/composer/chat-dark.svg +1 -0
  716. package/docs/design/templates/composer/chat.svg +1 -0
  717. package/docs/design/templates/composer/prompt-dark.svg +1 -0
  718. package/docs/design/templates/composer/prompt.svg +1 -0
  719. package/docs/design/templates/composer-dark.svg +1 -0
  720. package/docs/design/templates/composer.svg +1 -0
  721. package/docs/design/templates/empty-state/filtered-dark.svg +1 -1
  722. package/docs/design/templates/empty-state/filtered.svg +1 -1
  723. package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
  724. package/docs/design/templates/empty-state/with-action.svg +1 -1
  725. package/docs/design/templates/empty-state-dark.svg +1 -1
  726. package/docs/design/templates/empty-state.svg +1 -1
  727. package/docs/design/templates/list/compact-dark.svg +1 -1
  728. package/docs/design/templates/list/compact.svg +1 -1
  729. package/docs/design/templates/list/stack-dark.svg +1 -1
  730. package/docs/design/templates/list/stack.svg +1 -1
  731. package/docs/design/templates/list-action-row/default-dark.svg +1 -1
  732. package/docs/design/templates/list-action-row/default.svg +1 -1
  733. package/docs/design/templates/list-action-row/icon-tile-dark.svg +1 -0
  734. package/docs/design/templates/list-action-row/icon-tile.svg +1 -0
  735. package/docs/design/templates/list-action-row/selected-dark.svg +1 -1
  736. package/docs/design/templates/list-action-row/selected.svg +1 -1
  737. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  738. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  739. package/docs/design/templates/list-action-row-dark.svg +1 -1
  740. package/docs/design/templates/list-action-row.svg +1 -1
  741. package/docs/design/templates/list-dark.svg +1 -1
  742. package/docs/design/templates/list-header/action-dark.svg +1 -1
  743. package/docs/design/templates/list-header/action.svg +1 -1
  744. package/docs/design/templates/list-header/count-dark.svg +1 -1
  745. package/docs/design/templates/list-header/count.svg +1 -1
  746. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  747. package/docs/design/templates/list-header/inline-action.svg +1 -0
  748. package/docs/design/templates/list-header/size-l-dark.svg +1 -0
  749. package/docs/design/templates/list-header/size-l.svg +1 -0
  750. package/docs/design/templates/list-header/size-m-dark.svg +1 -0
  751. package/docs/design/templates/list-header/size-m.svg +1 -0
  752. package/docs/design/templates/list-header/size-xl-dark.svg +1 -0
  753. package/docs/design/templates/list-header/size-xl.svg +1 -0
  754. package/docs/design/templates/list-header/size-xs-dark.svg +1 -0
  755. package/docs/design/templates/list-header/size-xs.svg +1 -0
  756. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -1
  757. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -1
  758. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
  759. package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
  760. package/docs/design/templates/list-header-dark.svg +1 -1
  761. package/docs/design/templates/list-header.svg +1 -1
  762. package/docs/design/templates/list-item/default-dark.svg +1 -1
  763. package/docs/design/templates/list-item/default.svg +1 -1
  764. package/docs/design/templates/list-item/icon-tile-dark.svg +1 -0
  765. package/docs/design/templates/list-item/icon-tile.svg +1 -0
  766. package/docs/design/templates/list-item/multiline-dark.svg +1 -1
  767. package/docs/design/templates/list-item/multiline.svg +1 -1
  768. package/docs/design/templates/list-item/selected-dark.svg +1 -1
  769. package/docs/design/templates/list-item/selected.svg +1 -1
  770. package/docs/design/templates/list-item/trailing-dark.svg +1 -1
  771. package/docs/design/templates/list-item/trailing.svg +1 -1
  772. package/docs/design/templates/list-item-dark.svg +1 -1
  773. package/docs/design/templates/list-item.svg +1 -1
  774. package/docs/design/templates/list.svg +1 -1
  775. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  776. package/docs/design/templates/segmented-control/equal.svg +1 -1
  777. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
  778. package/docs/design/templates/segmented-control/pill-small.svg +1 -1
  779. package/docs/design/templates/segmented-control-dark.svg +1 -1
  780. package/docs/design/templates/segmented-control.svg +1 -1
  781. package/docs/design/templates/skeleton-dark.svg +1 -1
  782. package/docs/design/templates/skeleton.svg +1 -1
  783. package/docs/design/templates/state-banner/danger-dark.svg +1 -1
  784. package/docs/design/templates/state-banner/danger.svg +1 -1
  785. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
  786. package/docs/design/templates/state-banner/info-badge.svg +1 -1
  787. package/docs/design/templates/state-banner/info-dark.svg +1 -1
  788. package/docs/design/templates/state-banner/info.svg +1 -1
  789. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  790. package/docs/design/templates/state-banner/strip.svg +1 -0
  791. package/docs/design/templates/state-banner/success-dark.svg +1 -1
  792. package/docs/design/templates/state-banner/success.svg +1 -1
  793. package/docs/design/templates/state-banner/warning-dark.svg +1 -1
  794. package/docs/design/templates/state-banner/warning.svg +1 -1
  795. package/docs/design/templates/state-banner-dark.svg +1 -1
  796. package/docs/design/templates/state-banner.svg +1 -1
  797. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
  798. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
  799. package/docs/design/templates/tab-bar-dark.svg +1 -1
  800. package/docs/design/templates/tab-bar.svg +1 -1
  801. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  802. package/docs/design/templates/token-search-field/empty.svg +1 -1
  803. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -1
  804. package/docs/design/templates/token-search-field/tokens.svg +1 -1
  805. package/docs/design/templates/token-search-field-dark.svg +1 -1
  806. package/docs/design/templates/token-search-field.svg +1 -1
  807. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  808. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  809. package/docs/design/templates/toolbar/width-visibility-320-dark.svg +1 -0
  810. package/docs/design/templates/toolbar/width-visibility-320.svg +1 -0
  811. package/docs/design/templates/toolbar/width-visibility-600-dark.svg +1 -0
  812. package/docs/design/templates/toolbar/width-visibility-600.svg +1 -0
  813. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -1
  814. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -1
  815. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -1
  816. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -1
  817. package/docs/design/templates/toolbar-control-group/icon-tile-brand-dark.svg +1 -0
  818. package/docs/design/templates/toolbar-control-group/icon-tile-brand.svg +1 -0
  819. package/docs/design/templates/toolbar-control-group/icon-tile-danger-dark.svg +1 -0
  820. package/docs/design/templates/toolbar-control-group/icon-tile-danger.svg +1 -0
  821. package/docs/design/templates/toolbar-control-group/icon-tile-neutral-dark.svg +1 -0
  822. package/docs/design/templates/toolbar-control-group/icon-tile-neutral.svg +1 -0
  823. package/docs/design/templates/toolbar-control-group/icon-tile-success-dark.svg +1 -0
  824. package/docs/design/templates/toolbar-control-group/icon-tile-success.svg +1 -0
  825. package/docs/design/templates/toolbar-control-group/icon-tile-warning-dark.svg +1 -0
  826. package/docs/design/templates/toolbar-control-group/icon-tile-warning.svg +1 -0
  827. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -1
  828. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -1
  829. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  830. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  831. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  832. package/docs/design/templates/toolbar-control-group.svg +1 -1
  833. package/docs/design/templates/toolbar-dark.svg +1 -1
  834. package/docs/design/templates/toolbar-text/dark-tone-dark.svg +1 -0
  835. package/docs/design/templates/toolbar-text/dark-tone.svg +1 -0
  836. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  837. package/docs/design/templates/toolbar-text/default.svg +1 -1
  838. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  839. package/docs/design/templates/toolbar-text/large.svg +1 -1
  840. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  841. package/docs/design/templates/toolbar-text/small.svg +1 -1
  842. package/docs/design/templates/toolbar-text-dark.svg +1 -1
  843. package/docs/design/templates/toolbar-text.svg +1 -1
  844. package/docs/design/templates/toolbar.svg +1 -1
  845. package/docs/design/templates/value-table/details-dark.svg +1 -1
  846. package/docs/design/templates/value-table/details.svg +1 -1
  847. package/docs/design/templates/value-table-dark.svg +1 -1
  848. package/docs/design/templates/value-table.svg +1 -1
  849. package/docs/design/templates.md +19 -9
  850. package/docs/design-philosophy.md +58 -11
  851. package/docs/device-class.md +2 -1
  852. package/docs/document-baseline.md +93 -0
  853. package/docs/examples/application-ui-profile.json +8 -8
  854. package/docs/examples/command-palette-adapter.tsx +9 -7
  855. package/docs/examples/component-catalog-extension.json +8 -1
  856. package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +8 -9
  857. package/docs/layout.md +764 -40
  858. package/docs/nav-stack.md +275 -11
  859. package/docs/recipes.md +125 -69
  860. package/docs/split-view.md +94 -5
  861. package/docs/sunken-panel.md +54 -1
  862. package/docs/surface-scaffold.md +270 -0
  863. package/docs/tab-navigator.md +255 -0
  864. package/docs/type-contracts.md +57 -22
  865. package/docs/ui-analyzer.md +334 -14
  866. package/docs/ui-doctor.md +207 -10
  867. package/docs/ui-evaluator.md +17 -0
  868. package/docs/ux-demo.md +47 -16
  869. package/docs/webawesome-theme.md +148 -14
  870. package/docs/workbench.md +600 -11
  871. package/docs/writing.md +152 -0
  872. package/doctor/cli.mjs +5 -0
  873. package/doctor/component-style-checks.mjs +457 -0
  874. package/doctor/config.schema.json +26 -0
  875. package/doctor/copy-capitalization-checks.mjs +591 -0
  876. package/doctor/eslint-diagnostics.d.mts +16 -0
  877. package/doctor/eslint-diagnostics.mjs +17 -0
  878. package/doctor/index.d.mts +6 -0
  879. package/doctor/index.mjs +214 -47
  880. package/evaluator/index.mjs +73 -8
  881. package/llms.txt +702 -56
  882. package/package.json +256 -25
  883. package/scripts/component-catalog-extension-validation.mjs +28 -0
  884. package/traversal-exclusions.mjs +60 -1
  885. package/ux-demo/recipes/app-shell.tsx +181 -189
  886. package/ux-demo/recipes/collapsible-sidebar.tsx +177 -139
  887. package/ux-demo/recipes/compact-toolbar.tsx +120 -101
  888. package/ux-demo/recipes/composer-form.tsx +86 -62
  889. package/ux-demo/recipes/list-detail-dialog.tsx +219 -114
  890. package/ux-demo/recipes/list-workspace-states.tsx +95 -80
  891. package/ux-demo/recipes/loaders.ts +5 -2
  892. package/ux-demo/recipes/loading-inspector.tsx +157 -117
  893. package/ux-demo/recipes/mount-recipe.ts +0 -5
  894. package/ux-demo/recipes/navigation-sidebar.tsx +98 -83
  895. package/ux-demo/recipes/navigation-stack.tsx +42 -29
  896. package/ux-demo/recipes/types.ts +14 -1
  897. package/ux-demo/recipes/workspace-header.tsx +77 -51
  898. package/vite-ux-review.d.mts +83 -0
  899. package/vite-ux-review.mjs +120 -0
  900. package/ai/component-catalog-extension-v2.d.ts +0 -7
  901. package/ai/component-catalog-extension-v2.schema.json +0 -7
  902. package/ai/component-catalog-v2.d.ts +0 -67
  903. package/ai/component-catalog-v2.json +0 -4675
  904. package/ai/component-catalog-v2.schema.json +0 -246
  905. package/dist/browser/panel-header.js +0 -7
  906. package/dist/chunk-5VTB2BKP.js +0 -35
  907. package/dist/chunk-5VTB2BKP.js.map +0 -1
  908. package/dist/chunk-6WTETUZ6.js +0 -21
  909. package/dist/chunk-6WTETUZ6.js.map +0 -1
  910. package/dist/chunk-7KEUJIIC.js.map +0 -1
  911. package/dist/chunk-7XRDUG4Y.js +0 -58
  912. package/dist/chunk-7XRDUG4Y.js.map +0 -1
  913. package/dist/chunk-B3A3IVO5.js +0 -83
  914. package/dist/chunk-B3A3IVO5.js.map +0 -1
  915. package/dist/chunk-DPDBVKNA.js +0 -113
  916. package/dist/chunk-DPDBVKNA.js.map +0 -1
  917. package/dist/chunk-FEAMR7S4.js +0 -68
  918. package/dist/chunk-FEAMR7S4.js.map +0 -1
  919. package/dist/chunk-FEY65TBV.js +0 -15
  920. package/dist/chunk-FEY65TBV.js.map +0 -1
  921. package/dist/chunk-IJBSZ4NX.js.map +0 -1
  922. package/dist/chunk-J5BFYY7Q.js +0 -35
  923. package/dist/chunk-J5BFYY7Q.js.map +0 -1
  924. package/dist/chunk-JRKSK2HX.js.map +0 -1
  925. package/dist/chunk-KWWR5VMS.js.map +0 -1
  926. package/dist/chunk-LPOMRC4C.js.map +0 -1
  927. package/dist/chunk-M7JBER5U.js.map +0 -1
  928. package/dist/chunk-NENBUYX5.js +0 -79
  929. package/dist/chunk-NENBUYX5.js.map +0 -1
  930. package/dist/chunk-NWSEP5RT.js +0 -117
  931. package/dist/chunk-NWSEP5RT.js.map +0 -1
  932. package/dist/chunk-OJWWHFH3.js +0 -426
  933. package/dist/chunk-OJWWHFH3.js.map +0 -1
  934. package/dist/chunk-PSKN344N.js.map +0 -1
  935. package/dist/chunk-PX3YSS5C.js.map +0 -1
  936. package/dist/chunk-QO55FN2Y.js.map +0 -1
  937. package/dist/chunk-R7ZWUN64.js +0 -38
  938. package/dist/chunk-R7ZWUN64.js.map +0 -1
  939. package/dist/chunk-RKVQEH4J.js.map +0 -1
  940. package/dist/chunk-SRSJO5QE.js.map +0 -1
  941. package/dist/chunk-SYDMYBPG.js +0 -31
  942. package/dist/chunk-SYDMYBPG.js.map +0 -1
  943. package/dist/chunk-TB6DY7H5.js +0 -25
  944. package/dist/chunk-TB6DY7H5.js.map +0 -1
  945. package/dist/chunk-UFZKLBCF.js +0 -108
  946. package/dist/chunk-UFZKLBCF.js.map +0 -1
  947. package/dist/chunk-UKKSMZYT.js +0 -281
  948. package/dist/chunk-UKKSMZYT.js.map +0 -1
  949. package/dist/chunk-W2FK7ZNY.js +0 -26
  950. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  951. package/dist/chunk-W5L2JSBY.js +0 -40
  952. package/dist/chunk-W5L2JSBY.js.map +0 -1
  953. package/dist/chunk-Y45PPBDV.js.map +0 -1
  954. package/dist/chunk-Y6LYKFXY.js.map +0 -1
  955. package/dist/divider-sides-267FA7sY.d.ts +0 -4
  956. package/dist/panel-header.d.ts +0 -42
  957. package/dist/panel-header.js +0 -7
  958. package/dist/panel-header.js.map +0 -1
  959. package/dist/styles/panel-header.css +0 -64
  960. package/dist/styles/tab-scaffold.css +0 -84
  961. package/dist/tab-scaffold.d.ts +0 -30
  962. package/dist/tab-scaffold.js +0 -51
  963. package/dist/tab-scaffold.js.map +0 -1
  964. package/dist/wire-tab-scaffold.d.ts +0 -11
  965. package/dist/wire-tab-scaffold.js +0 -21
  966. package/dist/wire-tab-scaffold.js.map +0 -1
  967. package/docs/design/templates/panel-header/icon-actions-dark.svg +0 -1
  968. package/docs/design/templates/panel-header/icon-actions.svg +0 -1
  969. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +0 -1
  970. package/docs/design/templates/panel-header/icon-summary-actions.svg +0 -1
  971. package/docs/design/templates/panel-header/no-icon-dark.svg +0 -1
  972. package/docs/design/templates/panel-header/no-icon.svg +0 -1
  973. package/docs/design/templates/panel-header/page-heading-dark.svg +0 -1
  974. package/docs/design/templates/panel-header/page-heading.svg +0 -1
  975. package/docs/design/templates/panel-header/title-only-dark.svg +0 -1
  976. package/docs/design/templates/panel-header/title-only.svg +0 -1
  977. package/docs/design/templates/panel-header-dark.svg +0 -1
  978. package/docs/design/templates/panel-header.svg +0 -1
  979. package/docs/tab-scaffold.md +0 -50
  980. package/ux-demo/recipes/recipes.css +0 -448
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/actions/split-button/split-button.tsx"],"names":[],"mappings":";;;;;;AAWA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAwDM,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,YAAA,GAAe,MAAA;AAAA,EACf,eAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,eAAA,GAAkB,KAAA;AAAA,EAClB,KAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,OAAA,GAAU,IAAA,mBAAO,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA,GAAK,IAAA;AAC5C,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,oBAAoB,CAAA;AAAA,MAC7D,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,IAAA,EAAK,OAAA;AAAA,MACL,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,2BAAA;AAAA,YACN,aAAA,EAAa,MAAA;AAAA,YACb,YAAA,EAAY,eAAA;AAAA,YACZ,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,YAC3B,KAAA;AAAA,YACA,QAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,OAAA,wBACE,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAAyB,aAAA,EAAY,QAC9C,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,8BAEF,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EAA2B,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,SAC/C;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,2BAAA;AAAA,YACN,aAAA,EAAa,aAAA;AAAA,YACb,YAAA,EAAY,YAAA;AAAA,YACZ,eAAA,EAAe,YAAA;AAAA,YACf,eAAA,EAAe,kBAAkB,MAAA,GAAS,OAAA;AAAA,YAC1C,eAAA,EAAe,eAAA;AAAA,YACf,KAAA,EAAO,YAAA;AAAA,YACP,QAAA,EAAU,eAAA;AAAA,YAEV,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,WAAA,EAAa,MAAK,cAAA,EAAe;AAAA;AAAA;AACrD;AAAA;AAAA,GACF;AAEJ","file":"chunk-HLDRH23D.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\nimport { ChevronDown } from 'lucide';\n\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport { LoadingSpinner } from '../../feedback/loading-spinner/loading-spinner.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\n\n/** The loud fill the whole split button paints. */\nexport type SplitButtonTone =\n 'brand' | 'neutral' | 'success' | 'warning' | 'danger';\n\nconst splitButtonProtected = new Set([\n 'data-component',\n 'data-tone',\n 'data-fill',\n 'data-busy',\n]);\n\ntype SplitButtonRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-tone'?: never;\n 'data-fill'?: never;\n 'data-busy'?: never;\n }\n>;\n\nexport interface SplitButtonProps {\n /** Visible primary label. */\n label: string;\n /** Delegated `data-action` of the primary half. */\n action: string;\n /** Optional decorative leading icon of the primary half. */\n icon?: SafeHtml;\n /** Primary accessible name when it should say more than `label`. */\n accessibleLabel?: string;\n /** Accessible name (and tooltip) of the options trigger. */\n optionsLabel: string;\n /** Delegated `data-action` of the options trigger, which opens the app's menu. */\n optionsAction: string;\n /** Whether the options menu is open, exposed as `aria-expanded`. */\n optionsExpanded?: boolean;\n /** What the options trigger opens, exposed as `aria-haspopup`; defaults to `menu`. */\n optionsPopup?: 'menu' | 'dialog' | 'listbox';\n /** Element id the options trigger controls, exposed as `aria-controls`. */\n optionsControls?: string;\n /** The loud fill; defaults to `brand`. Switch it (for example to `neutral`) while running. */\n tone?: SplitButtonTone;\n /** Span the full width of the parent instead of sizing to the label. */\n fill?: boolean;\n /** Show work in progress: a spinner replaces the icon and the primary is `aria-busy`. */\n busy?: boolean;\n /** Disable the primary half. */\n disabled?: boolean;\n /** Disable the options trigger. */\n optionsDisabled?: boolean;\n /** Native tooltip of the primary half, for example why it is disabled. */\n title?: string;\n className?: string;\n /** Safe `data-*` metadata; SplitButton-owned markers stay protected. */\n rootAttributes?: SplitButtonRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A primary action with an attached options trigger on one loud, semantic\n * fill (a \"Drive\" button with a provider menu). Both halves are native\n * buttons, so `aria-expanded` and the accessible names reach assistive\n * technology directly; the application opens its own menu from the options\n * action and owns the running state.\n */\nexport function SplitButton({\n label,\n action,\n icon,\n accessibleLabel,\n optionsLabel,\n optionsAction,\n optionsExpanded = false,\n optionsPopup = 'menu',\n optionsControls,\n tone = 'brand',\n fill = false,\n busy = false,\n disabled = false,\n optionsDisabled = false,\n title,\n className = '',\n rootAttributes = {},\n slot,\n}: SplitButtonProps) {\n const leading = busy ? <LoadingSpinner /> : icon;\n return (\n <div\n {...filterDataAttributes(rootAttributes, splitButtonProtected)}\n class={`kui-split-button ${className}`.trim()}\n data-component=\"split-button\"\n data-tone={tone}\n data-fill={fill ? 'true' : undefined}\n data-busy={busy ? 'true' : undefined}\n role=\"group\"\n slot={slot}\n >\n <button\n type=\"button\"\n class=\"kui-split-button__primary\"\n data-action={action}\n aria-label={accessibleLabel}\n aria-busy={busy ? 'true' : undefined}\n title={title}\n disabled={disabled}\n >\n {leading && (\n <span class=\"kui-split-button__icon\" aria-hidden=\"true\">\n {leading}\n </span>\n )}\n <span class=\"kui-split-button__label\">{label}</span>\n </button>\n <button\n type=\"button\"\n class=\"kui-split-button__options\"\n data-action={optionsAction}\n aria-label={optionsLabel}\n aria-haspopup={optionsPopup}\n aria-expanded={optionsExpanded ? 'true' : 'false'}\n aria-controls={optionsControls}\n title={optionsLabel}\n disabled={optionsDisabled}\n >\n <LucideIcon icon={ChevronDown} name=\"chevron-down\" />\n </button>\n </div>\n );\n}\n"]}
@@ -0,0 +1,302 @@
1
+ import { jsx, jsxs, Fragment } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/components/actions/popup-menu/internal/popup-menu-content-cache.ts
4
+ var hashState = new Int32Array(2);
5
+ function hashCode(code) {
6
+ hashState[0] = Math.imul(hashState[0] ^ code, 16777619);
7
+ hashState[1] = Math.imul(hashState[1], 31) + code | 0;
8
+ }
9
+ function hashText(text) {
10
+ let digest = hashState[0];
11
+ let check = hashState[1];
12
+ const length = text.length;
13
+ for (let index = 0; index < length; index++) {
14
+ let code = text.charCodeAt(index);
15
+ if ((code & 64512) === 55296 && index + 1 < length) {
16
+ const low = text.charCodeAt(index + 1);
17
+ if ((low & 64512) === 56320) {
18
+ code = (code - 55296 << 10) + (low - 56320) + 65536;
19
+ index++;
20
+ }
21
+ }
22
+ digest = Math.imul(digest ^ code, 16777619);
23
+ check = Math.imul(check, 31) + code | 0;
24
+ }
25
+ hashState[0] = digest;
26
+ hashState[1] = check;
27
+ }
28
+ var LONG_PART_LENGTH = 64;
29
+ var PART_DIGEST_LIMIT = 4096;
30
+ var partDigests = /* @__PURE__ */ new Map();
31
+ function hashLongText(text) {
32
+ let pair = partDigests.get(text);
33
+ if (!pair) {
34
+ const digest = hashState[0];
35
+ const check = hashState[1];
36
+ hashState[0] = 2166136261;
37
+ hashState[1] = 2538058380;
38
+ hashText(text);
39
+ pair = [hashState[0], hashState[1]];
40
+ hashState[0] = digest;
41
+ hashState[1] = check;
42
+ if (partDigests.size >= PART_DIGEST_LIMIT)
43
+ partDigests.delete(partDigests.keys().next().value);
44
+ partDigests.set(text, pair);
45
+ }
46
+ hashCode(pair[0]);
47
+ hashCode(pair[1]);
48
+ }
49
+ function hashPart(text) {
50
+ if (text.length >= LONG_PART_LENGTH) hashLongText(text);
51
+ else hashText(text);
52
+ }
53
+ var PART_SEPARATOR = 0;
54
+ var FIELD_SEPARATOR = 1;
55
+ function hashEntry(entry) {
56
+ if (entry.kind === "divider") {
57
+ hashCode(45);
58
+ return;
59
+ }
60
+ if (entry.kind === "heading") {
61
+ hashCode(35);
62
+ hashText(entry.label);
63
+ return;
64
+ }
65
+ hashText(entry.label);
66
+ hashCode(FIELD_SEPARATOR);
67
+ hashText(entry.action ?? "");
68
+ hashCode(FIELD_SEPARATOR);
69
+ hashText(entry.value ?? "");
70
+ hashCode(FIELD_SEPARATOR);
71
+ hashCode(entry.disabled ? 49 : 48);
72
+ hashCode(FIELD_SEPARATOR);
73
+ hashCode(entry.checked === void 0 ? 45 : entry.checked ? 49 : 48);
74
+ hashCode(FIELD_SEPARATOR);
75
+ hashText(entry.tone ?? "");
76
+ hashCode(FIELD_SEPARATOR);
77
+ hashText(entry.disabledReason ?? "");
78
+ hashCode(FIELD_SEPARATOR);
79
+ hashPart(String(entry.icon ?? ""));
80
+ hashCode(FIELD_SEPARATOR);
81
+ hashPart(String(entry.details ?? ""));
82
+ hashCode(FIELD_SEPARATOR);
83
+ hashText(entry.attributes ? JSON.stringify(entry.attributes) : "{}");
84
+ for (const child of entry.submenu ?? []) {
85
+ hashCode(FIELD_SEPARATOR);
86
+ hashEntry(child);
87
+ }
88
+ }
89
+ var MARKUP_CACHE_LIMIT = 1024;
90
+ var markupCache = /* @__PURE__ */ new Map();
91
+ function popupMenuContentKey(triggerParts, items) {
92
+ hashState[0] = 2166136261;
93
+ hashState[1] = 2538058380;
94
+ for (let index = 0; index < triggerParts.length; index++) {
95
+ if (index > 0) hashCode(PART_SEPARATOR);
96
+ hashPart(triggerParts[index]);
97
+ }
98
+ for (const entry of items) {
99
+ hashCode(PART_SEPARATOR);
100
+ hashEntry(entry);
101
+ }
102
+ const digest = (hashState[0] >>> 0).toString(36);
103
+ return {
104
+ key: `kui-popup-menu-${digest}`,
105
+ cacheKey: `${digest}:${(hashState[1] >>> 0).toString(36)}`
106
+ };
107
+ }
108
+ function cachedPopupMenuContent(cacheKey) {
109
+ const content = markupCache.get(cacheKey);
110
+ if (content) {
111
+ markupCache.delete(cacheKey);
112
+ markupCache.set(cacheKey, content);
113
+ }
114
+ return content;
115
+ }
116
+ function cachePopupMenuContent(cacheKey, content) {
117
+ if (content.__segment.kind !== "static") return;
118
+ if (markupCache.size >= MARKUP_CACHE_LIMIT)
119
+ markupCache.delete(markupCache.keys().next().value);
120
+ markupCache.set(cacheKey, content);
121
+ }
122
+ function hasChoice(entries) {
123
+ return entries.some(
124
+ (entry) => entry.kind !== "heading" && entry.kind !== "divider" && entry.checked !== void 0
125
+ );
126
+ }
127
+ function renderEntry(entry, nested = false, levelHasChoice = false) {
128
+ if (entry.kind === "divider")
129
+ return /* @__PURE__ */ jsx("wa-divider", { slot: nested ? "submenu" : void 0 });
130
+ if (entry.kind === "heading")
131
+ return /* @__PURE__ */ jsx(
132
+ "div",
133
+ {
134
+ class: "kui-popup-menu__heading",
135
+ slot: nested ? "submenu" : void 0,
136
+ children: entry.label
137
+ }
138
+ );
139
+ const reserveCheck = levelHasChoice && entry.checked === void 0;
140
+ const submenuHasChoice = entry.submenu ? hasChoice(entry.submenu) : false;
141
+ return /* @__PURE__ */ jsxs(
142
+ "wa-dropdown-item",
143
+ {
144
+ ...entry.attributes ?? {},
145
+ slot: nested ? "submenu" : void 0,
146
+ "data-check-space": reserveCheck ? "reserved" : void 0,
147
+ "data-action": entry.action,
148
+ value: entry.value,
149
+ type: entry.checked === void 0 ? void 0 : "checkbox",
150
+ checked: entry.checked,
151
+ variant: entry.tone === "danger" ? "danger" : void 0,
152
+ disabled: entry.disabled,
153
+ title: entry.disabled ? entry.disabledReason : void 0,
154
+ children: [
155
+ reserveCheck ? /* @__PURE__ */ jsx(
156
+ "span",
157
+ {
158
+ slot: "icon",
159
+ class: "kui-popup-menu__check-space",
160
+ "aria-hidden": "true"
161
+ }
162
+ ) : null,
163
+ entry.icon ? /* @__PURE__ */ jsx("span", { slot: "icon", class: "kui-popup-menu__icon", children: entry.icon }) : null,
164
+ entry.label,
165
+ entry.details ? /* @__PURE__ */ jsx("span", { slot: "details", class: "kui-popup-menu__details", children: entry.details }) : entry.submenu ? /* @__PURE__ */ jsx("span", { slot: "details" }) : null,
166
+ entry.submenu?.map(
167
+ (child) => renderEntry(child, true, submenuHasChoice)
168
+ )
169
+ ]
170
+ }
171
+ );
172
+ }
173
+ var pointerRestores = /* @__PURE__ */ new WeakMap();
174
+ function openPopupMenuAt(menu, x, y) {
175
+ menu.style.setProperty("--kui-popup-menu-context-x", `${x}px`);
176
+ menu.style.setProperty("--kui-popup-menu-context-y", `${y}px`);
177
+ const popup = menu.getAttribute("data-trigger") === "context" ? null : menu.shadowRoot?.querySelector("wa-popup");
178
+ if (popup) {
179
+ popup.anchor = {
180
+ getBoundingClientRect: () => new DOMRect(x, y, 0, 0)
181
+ };
182
+ popup.placement = "bottom-start";
183
+ const previous = pointerRestores.get(menu);
184
+ if (previous) menu.removeEventListener("wa-after-hide", previous);
185
+ const restore = (event) => {
186
+ if (event.target !== menu) return;
187
+ menu.removeEventListener("wa-after-hide", restore);
188
+ pointerRestores.delete(menu);
189
+ popup.anchor = void 0;
190
+ popup.placement = menu.getAttribute("placement") ?? "bottom-start";
191
+ };
192
+ pointerRestores.set(menu, restore);
193
+ menu.addEventListener("wa-after-hide", restore);
194
+ }
195
+ menu.open = true;
196
+ }
197
+ function openPopupMenu(menu) {
198
+ menu.open = true;
199
+ }
200
+ function closePopupMenu(menu) {
201
+ menu.open = false;
202
+ }
203
+ function renderContent({
204
+ context,
205
+ label,
206
+ icon,
207
+ text,
208
+ caret,
209
+ disabled,
210
+ items
211
+ }) {
212
+ const levelHasChoice = hasChoice(items);
213
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
214
+ context ? /* @__PURE__ */ jsx(
215
+ "button",
216
+ {
217
+ type: "button",
218
+ slot: "trigger",
219
+ class: "kui-popup-menu__context-anchor",
220
+ "aria-label": label,
221
+ "aria-hidden": "true",
222
+ tabindex: -1
223
+ }
224
+ ) : /* @__PURE__ */ jsxs(
225
+ "wa-button",
226
+ {
227
+ slot: "trigger",
228
+ appearance: "plain",
229
+ "with-caret": caret,
230
+ disabled,
231
+ children: [
232
+ icon,
233
+ text ? /* @__PURE__ */ jsx("span", { children: text }) : /* @__PURE__ */ jsx("span", { class: "kui-popup-menu__label", children: label })
234
+ ]
235
+ }
236
+ ),
237
+ items.map((entry) => renderEntry(entry, false, levelHasChoice))
238
+ ] });
239
+ }
240
+ function PopupMenu({
241
+ text,
242
+ label,
243
+ icon,
244
+ items,
245
+ placement = "bottom-start",
246
+ caret = true,
247
+ disabled = false,
248
+ rootAttributes = {},
249
+ slot,
250
+ context = false,
251
+ anchor
252
+ }) {
253
+ if (anchor !== void 0 && (!context || !Number.isFinite(anchor.x) || !Number.isFinite(anchor.y)))
254
+ throw new RangeError(
255
+ "PopupMenu anchor requires context mode and finite x and y coordinates"
256
+ );
257
+ const { key, cacheKey } = popupMenuContentKey(
258
+ [
259
+ text ?? "",
260
+ label ?? "",
261
+ String(icon ?? ""),
262
+ String(caret),
263
+ String(disabled),
264
+ String(context)
265
+ ],
266
+ items
267
+ );
268
+ let content = cachedPopupMenuContent(cacheKey);
269
+ if (!content) {
270
+ content = renderContent({
271
+ context,
272
+ label,
273
+ icon,
274
+ text,
275
+ caret,
276
+ disabled,
277
+ items
278
+ });
279
+ cachePopupMenuContent(cacheKey, content);
280
+ }
281
+ return /* @__PURE__ */ jsx(
282
+ "wa-dropdown",
283
+ {
284
+ size: "m",
285
+ ...rootAttributes,
286
+ class: "kui-popup-menu",
287
+ "data-component": "popup-menu",
288
+ "data-key": key,
289
+ "data-morph-skip-children": true,
290
+ "data-trigger": context ? "context" : "button",
291
+ "data-menu-label": text ?? label,
292
+ style: anchor ? `--kui-popup-menu-context-x:${anchor.x}px;--kui-popup-menu-context-y:${anchor.y}px` : void 0,
293
+ placement,
294
+ slot,
295
+ children: content
296
+ }
297
+ );
298
+ }
299
+
300
+ export { PopupMenu, closePopupMenu, openPopupMenu, openPopupMenuAt };
301
+
302
+ //# sourceMappingURL=chunk-HQZYKJ56.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/actions/popup-menu/internal/popup-menu-content-cache.ts","../src/components/actions/popup-menu/popup-menu.tsx"],"names":[],"mappings":"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","file":"chunk-HQZYKJ56.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { PopupMenuEntry } from '../popup-menu.js';\n\n/**\n * Streaming content hash: slot 0 is the FNV-1a digest that names\n * the menu's `data-key`; slot 1 is an independent check hash (a 31-multiplier\n * polynomial whose dependency chain runs in parallel with the digest's), so\n * the markup cache is keyed by about 64 bits and a digest collision cannot\n * serve another menu's markup. An `Int32Array` keeps both accumulators unboxed\n * between calls.\n */\nconst hashState = new Int32Array(2);\n\nfunction hashCode(code: number): void {\n hashState[0] = Math.imul(hashState[0]! ^ code, 0x01000193);\n hashState[1] = (Math.imul(hashState[1]!, 31) + code) | 0;\n}\n\n/**\n * Hash a string's code points. A surrogate pair is combined into one code\n * point, matching the former `for…of` iteration over the joined key, so the\n * digest, and with it the rendered `data-key`, is unchanged.\n */\nfunction hashText(text: string): void {\n let digest = hashState[0]!;\n let check = hashState[1]!;\n const length = text.length;\n for (let index = 0; index < length; index++) {\n let code = text.charCodeAt(index);\n if ((code & 0xfc00) === 0xd800 && index + 1 < length) {\n const low = text.charCodeAt(index + 1);\n if ((low & 0xfc00) === 0xdc00) {\n code = ((code - 0xd800) << 10) + (low - 0xdc00) + 0x10000;\n index++;\n }\n }\n digest = Math.imul(digest ^ code, 0x01000193);\n check = (Math.imul(check, 31) + code) | 0;\n }\n hashState[0] = digest;\n hashState[1] = check;\n}\n\n/**\n * Parts at least this long (icon and details markup) are hashed through\n * {@link hashLongText}: by a memoized digest of the whole string instead of\n * character by character, so a glyph repeated on every row costs a map lookup.\n */\nexport const LONG_PART_LENGTH = 64;\n\n/** Bound on memoized long-part digests; past it the oldest is evicted. */\nexport const PART_DIGEST_LIMIT = 4096;\nconst partDigests = new Map<string, readonly [number, number]>();\n\n/**\n * Feed a long part as its own two hashes. A Lucide SVG is a few hundred\n * characters and repeats across every row's menu, so hashing its characters\n * dominated an unchanged menu's cost; V8 hashes a string key natively (once\n * per string object) and compares equal strings quickly.\n */\nfunction hashLongText(text: string): void {\n let pair = partDigests.get(text);\n if (!pair) {\n const digest = hashState[0]!;\n const check = hashState[1]!;\n hashState[0] = 0x811c9dc5;\n hashState[1] = 0x9747b28c;\n hashText(text);\n pair = [hashState[0], hashState[1]];\n hashState[0] = digest;\n hashState[1] = check;\n if (partDigests.size >= PART_DIGEST_LIMIT)\n partDigests.delete(partDigests.keys().next().value!);\n partDigests.set(text, pair);\n }\n hashCode(pair[0]);\n hashCode(pair[1]);\n}\n\n/** Hash a part, through its memoized digest when it is long. */\nfunction hashPart(text: string): void {\n if (text.length >= LONG_PART_LENGTH) hashLongText(text);\n else hashText(text);\n}\n\nconst PART_SEPARATOR = 0x00;\nconst FIELD_SEPARATOR = 0x01;\n\n/**\n * Feed one entry's structure: the fields, in order, separated by U+0001, with\n * each submenu entry appended the same way.\n */\nfunction hashEntry(entry: PopupMenuEntry): void {\n if (entry.kind === 'divider') {\n hashCode(0x2d); // '-'\n return;\n }\n if (entry.kind === 'heading') {\n hashCode(0x23); // '#'\n hashText(entry.label);\n return;\n }\n hashText(entry.label);\n hashCode(FIELD_SEPARATOR);\n hashText(entry.action ?? '');\n hashCode(FIELD_SEPARATOR);\n hashText(entry.value ?? '');\n hashCode(FIELD_SEPARATOR);\n hashCode(entry.disabled ? 0x31 : 0x30);\n hashCode(FIELD_SEPARATOR);\n hashCode(entry.checked === undefined ? 0x2d : entry.checked ? 0x31 : 0x30);\n hashCode(FIELD_SEPARATOR);\n hashText(entry.tone ?? '');\n hashCode(FIELD_SEPARATOR);\n hashText(entry.disabledReason ?? '');\n hashCode(FIELD_SEPARATOR);\n // SafeHtml stringifies to its stored markup without copying, and the key\n // must change when an icon or details change.\n hashPart(String(entry.icon ?? ''));\n hashCode(FIELD_SEPARATOR);\n hashPart(String(entry.details ?? ''));\n hashCode(FIELD_SEPARATOR);\n hashText(entry.attributes ? JSON.stringify(entry.attributes) : '{}');\n for (const child of entry.submenu ?? []) {\n hashCode(FIELD_SEPARATOR);\n hashEntry(child);\n }\n}\n\n/**\n * Bounded, least-recently-used cache of each menu's trigger and entry markup,\n * keyed by its content hashes. A list that re-renders unchanged menus then\n * pays one hash pass per menu instead of rendering every entry again, which\n * the morph would discard under `data-morph-skip-children` anyway. Sized above\n * a large list's distinct menus; past it, renders fall back to fresh markup.\n */\nexport const MARKUP_CACHE_LIMIT = 1024;\nconst markupCache = new Map<string, SafeHtml>();\n\n/**\n * The menu's `data-key` and its cache key. The digest covers, in order and\n * separated by U+0000, the trigger parts and then each entry, whose fields are\n * separated by U+0001; it is the FNV-1a hash of that joined text, except that\n * a part of {@link LONG_PART_LENGTH} or more characters contributes its own\n * two hashes in place of its characters.\n */\nexport function popupMenuContentKey(\n triggerParts: readonly string[],\n items: readonly PopupMenuEntry[],\n): { key: string; cacheKey: string } {\n hashState[0] = 0x811c9dc5;\n hashState[1] = 0x9747b28c;\n for (let index = 0; index < triggerParts.length; index++) {\n if (index > 0) hashCode(PART_SEPARATOR);\n hashPart(triggerParts[index]!);\n }\n for (const entry of items) {\n hashCode(PART_SEPARATOR);\n hashEntry(entry);\n }\n const digest = (hashState[0]! >>> 0).toString(36);\n return {\n key: `kui-popup-menu-${digest}`,\n cacheKey: `${digest}:${(hashState[1]! >>> 0).toString(36)}`,\n };\n}\n\n/** Cached markup for a cache key, refreshed as most recently used. */\nexport function cachedPopupMenuContent(cacheKey: string): SafeHtml | undefined {\n const content = markupCache.get(cacheKey);\n if (content) {\n markupCache.delete(cacheKey);\n markupCache.set(cacheKey, content);\n }\n return content;\n}\n\n/**\n * Remember rendered markup, evicting the least recently used entry when full.\n * Only static markup is reusable: content that holds a keyed list must be\n * rendered in each pass for the list reconciler.\n */\nexport function cachePopupMenuContent(\n cacheKey: string,\n content: SafeHtml,\n): void {\n if (content.__segment.kind !== 'static') return;\n if (markupCache.size >= MARKUP_CACHE_LIMIT)\n markupCache.delete(markupCache.keys().next().value!);\n markupCache.set(cacheKey, content);\n}\n\n/** Test hook: drop cached menu markup and memoized part digests. */\nexport function _clearPopupMenuMarkupCache(): void {\n markupCache.clear();\n partDigests.clear();\n}\n\n/** Test hook: the number of memoized long-part digests. */\nexport function _popupMenuPartDigestCount(): number {\n return partDigests.size;\n}\n\n/** Test hook: the number of cached menu markups. */\nexport function _popupMenuMarkupCacheSize(): number {\n return markupCache.size;\n}\n","import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport {\n cachedPopupMenuContent,\n cachePopupMenuContent,\n popupMenuContentKey,\n} from './internal/popup-menu-content-cache.js';\n\nexport type PopupMenuPlacement =\n 'bottom-start' | 'bottom' | 'bottom-end' | 'top-start' | 'top' | 'top-end';\n\ntype PopupMenuDataAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-action'?: never;\n 'data-component'?: never;\n 'data-key'?: never;\n 'data-morph-skip-children'?: never;\n }\n>;\n\n/** One command in the menu. */\nexport interface PopupMenuItem {\n kind?: 'item';\n label: string;\n /** Delegated `data-action` the app handles when the item is chosen. */\n action?: string;\n /** Native `wa-dropdown-item` value, reported by its `wa-select` event. */\n value?: string;\n /** Leading icon, typically a `LucideIcon`; it is placed in the item's icon slot. */\n icon?: SafeHtml;\n /** A checkbox choice, including nested choices; omit for a plain command. */\n checked?: boolean;\n /** Trailing safe content, such as secondary status. */\n details?: SafeHtml;\n /** Destructive command styling. */\n tone?: 'default' | 'danger';\n disabled?: boolean;\n /** Native tooltip text for a disabled command. */\n disabledReason?: string;\n /** Application `data-*` metadata such as a record id. */\n attributes?: PopupMenuDataAttributes;\n /** Child commands, headings, and dividers opened by hover or keyboard navigation. */\n submenu?: readonly PopupMenuEntry[];\n}\n\n/** A labeled group heading; items that follow it belong to the group. */\nexport interface PopupMenuHeading {\n kind: 'heading';\n label: string;\n}\n\n/** A separator between groups of items. */\nexport interface PopupMenuDivider {\n kind: 'divider';\n}\n\nexport type PopupMenuEntry =\n PopupMenuItem | PopupMenuHeading | PopupMenuDivider;\n\ntype PopupMenuTriggerName =\n | {\n /** Visible trigger text, which is also its accessible name. */\n text: string;\n label?: never;\n }\n | {\n text?: never;\n /**\n * Accessible name of an icon-only trigger, rendered as visually hidden\n * slotted text (a Web Awesome button takes its name from its content).\n */\n label: string;\n };\n\n/** A context PopupMenu's viewport anchor point. */\nexport interface PopupMenuAnchor {\n x: number;\n y: number;\n}\n\ntype PopupMenuTrigger =\n | (PopupMenuTriggerName & { context?: false; anchor?: never })\n | {\n context: true;\n label: string;\n /**\n * The viewport point (CSS pixels, as in `MouseEvent.clientX/Y`) the\n * menu opens from. Rendered into the menu itself, so it survives\n * re-renders and replacement; open it with `openPopupMenu`.\n */\n anchor?: PopupMenuAnchor;\n text?: never;\n icon?: never;\n caret?: never;\n disabled?: never;\n };\n\nexport type PopupMenuProps = PopupMenuTrigger & {\n /** Trigger icon, typically a `LucideIcon`, before any visible text. */\n icon?: KerfUiContent;\n items: readonly PopupMenuEntry[];\n /** Where the menu opens relative to its trigger. Defaults to `bottom-start`. */\n placement?: PopupMenuPlacement;\n /** Show the disclosure caret after the trigger content. Defaults to true. */\n caret?: boolean;\n disabled?: boolean;\n /** Application `data-*` metadata on the menu root. */\n rootAttributes?: PopupMenuDataAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n};\n\n/** Whether a menu level holds a checkbox choice, so its plain items reserve the check column. */\nfunction hasChoice(entries: readonly PopupMenuEntry[]): boolean {\n return entries.some(\n (entry) =>\n entry.kind !== 'heading' &&\n entry.kind !== 'divider' &&\n entry.checked !== undefined,\n );\n}\n\nfunction renderEntry(\n entry: PopupMenuEntry,\n nested = false,\n levelHasChoice = false,\n) {\n if (entry.kind === 'divider')\n return <wa-divider slot={nested ? 'submenu' : undefined} />;\n // A group title styled like the Select's group title. It is not a slotted\n // h1-h6, whose Web Awesome group-label metrics are !important.\n if (entry.kind === 'heading')\n return (\n <div\n class=\"kui-popup-menu__heading\"\n slot={nested ? 'submenu' : undefined}\n >\n {entry.label}\n </div>\n );\n // A plain command beside checkbox choices keeps their check column, so its\n // icon and label line up with theirs.\n const reserveCheck = levelHasChoice && entry.checked === undefined;\n const submenuHasChoice = entry.submenu ? hasChoice(entry.submenu) : false;\n return (\n <wa-dropdown-item\n {...(entry.attributes ?? {})}\n slot={nested ? 'submenu' : undefined}\n data-check-space={reserveCheck ? 'reserved' : undefined}\n data-action={entry.action}\n value={entry.value}\n type={entry.checked === undefined ? undefined : 'checkbox'}\n checked={entry.checked}\n variant={entry.tone === 'danger' ? 'danger' : undefined}\n disabled={entry.disabled}\n title={entry.disabled ? entry.disabledReason : undefined}\n >\n {reserveCheck ? (\n <span\n slot=\"icon\"\n class=\"kui-popup-menu__check-space\"\n aria-hidden=\"true\"\n />\n ) : null}\n {entry.icon ? (\n <span slot=\"icon\" class=\"kui-popup-menu__icon\">\n {entry.icon}\n </span>\n ) : null}\n {entry.label}\n {entry.details ? (\n <span slot=\"details\" class=\"kui-popup-menu__details\">\n {entry.details}\n </span>\n ) : entry.submenu ? (\n <span slot=\"details\" />\n ) : null}\n {entry.submenu?.map((child) =>\n renderEntry(child, true, submenuHasChoice),\n )}\n </wa-dropdown-item>\n );\n}\n\n/** A rendered context PopupMenu with Web Awesome's controlled open state. */\nexport type PopupMenuElement = HTMLElement & { open: boolean };\n\n/** The Web Awesome popup inside an upgraded `wa-dropdown`, which accepts a virtual anchor. */\ntype PopupMenuPopup = HTMLElement & { anchor?: unknown; placement: string };\n\n/** Pending trigger-anchor restorations of pointer-opened button menus. */\nconst pointerRestores = new WeakMap<HTMLElement, (event: Event) => void>();\n\n/**\n * Open a PopupMenu at viewport pointer coordinates. A `context` menu rendered\n * without `anchor` moves its invisible anchor there (a menu rendered with\n * `anchor` opens with `openPopupMenu` instead). A button-triggered menu (such as a `ListActionRow`\n * trailing menu) anchors its popup at the point, opening `bottom-start` like a\n * context menu, for this opening only; once the menu has closed it returns to\n * its trigger and placement. Before Web Awesome upgrades it, the menu opens at\n * its trigger.\n */\nexport function openPopupMenuAt(\n menu: PopupMenuElement,\n x: number,\n y: number,\n): void {\n menu.style.setProperty('--kui-popup-menu-context-x', `${x}px`);\n menu.style.setProperty('--kui-popup-menu-context-y', `${y}px`);\n const popup =\n menu.getAttribute('data-trigger') === 'context'\n ? null\n : menu.shadowRoot?.querySelector<PopupMenuPopup>('wa-popup');\n if (popup) {\n popup.anchor = {\n getBoundingClientRect: () => new DOMRect(x, y, 0, 0),\n };\n popup.placement = 'bottom-start';\n const previous = pointerRestores.get(menu);\n if (previous) menu.removeEventListener('wa-after-hide', previous);\n const restore = (event: Event) => {\n if (event.target !== menu) return;\n menu.removeEventListener('wa-after-hide', restore);\n pointerRestores.delete(menu);\n popup.anchor = undefined;\n popup.placement = menu.getAttribute('placement') ?? 'bottom-start';\n };\n pointerRestores.set(menu, restore);\n menu.addEventListener('wa-after-hide', restore);\n }\n menu.open = true;\n}\n\n/**\n * Open a context PopupMenu at the `anchor` it was rendered with (or the\n * point a previous `openPopupMenuAt` set).\n */\nexport function openPopupMenu(menu: PopupMenuElement): void {\n menu.open = true;\n}\n\n/** Close a programmatically opened PopupMenu. */\nexport function closePopupMenu(menu: PopupMenuElement): void {\n menu.open = false;\n}\n\ninterface PopupMenuContentProps {\n context: boolean;\n label: string | undefined;\n icon: KerfUiContent;\n text: string | undefined;\n caret: boolean;\n disabled: boolean;\n items: readonly PopupMenuEntry[];\n}\n\n/** The trigger and entries: everything inside the `wa-dropdown` root. */\nfunction renderContent({\n context,\n label,\n icon,\n text,\n caret,\n disabled,\n items,\n}: PopupMenuContentProps): SafeHtml {\n const levelHasChoice = hasChoice(items);\n return (\n <>\n {context ? (\n <button\n type=\"button\"\n slot=\"trigger\"\n class=\"kui-popup-menu__context-anchor\"\n aria-label={label}\n aria-hidden=\"true\"\n tabindex={-1}\n />\n ) : (\n <wa-button\n slot=\"trigger\"\n appearance=\"plain\"\n with-caret={caret}\n disabled={disabled}\n >\n {icon}\n {text ? (\n <span>{text}</span>\n ) : (\n <span class=\"kui-popup-menu__label\">{label}</span>\n )}\n </wa-button>\n )}\n {items.map((entry) => renderEntry(entry, false, levelHasChoice))}\n </>\n );\n}\n\n/**\n * An action menu: a trigger button that opens a list of commands. Renders the\n * `wa-dropdown` root directly, so a `single` `ToolbarControlGroup` (with\n * `nestedDropdown`) or a `PopupSurface` sizes and insets it as usual. Items\n * dispatch through delegated `data-action`s; the app owns the commands and any\n * open-state reaction. Import `@kerfjs/ui/popup-menu/register` once to register\n * the Web Awesome elements. At viewport widths up to 480px, submenus appear\n * above or below their parent menu so their rows do not cover the parent list.\n */\nexport function PopupMenu({\n text,\n label,\n icon,\n items,\n placement = 'bottom-start',\n caret = true,\n disabled = false,\n rootAttributes = {},\n slot,\n context = false,\n anchor,\n}: PopupMenuProps) {\n if (\n anchor !== undefined &&\n (!context || !Number.isFinite(anchor.x) || !Number.isFinite(anchor.y))\n )\n throw new RangeError(\n 'PopupMenu anchor requires context mode and finite x and y coordinates',\n );\n // Web Awesome owns the trigger and item DOM once upgraded, so the morph\n // skips the children; the content key rebuilds the menu when they change.\n // An unchanged menu reuses its cached markup and costs one hash pass.\n const { key, cacheKey } = popupMenuContentKey(\n [\n text ?? '',\n label ?? '',\n String(icon ?? ''),\n String(caret),\n String(disabled),\n String(context),\n ],\n items,\n );\n let content = cachedPopupMenuContent(cacheKey);\n if (!content) {\n content = renderContent({\n context,\n label,\n icon,\n text,\n caret,\n disabled,\n items,\n });\n cachePopupMenuContent(cacheKey, content);\n }\n // data-menu-label names the shadow role=\"menu\" panel (the register copies\n // it there), since no ID reference reaches the trigger across shadow roots.\n // size=\"m\" is Web Awesome's reflected default; rendering it keeps a\n // re-render's morph from stripping it and forcing a Lit update.\n return (\n <wa-dropdown\n size=\"m\"\n {...rootAttributes}\n class=\"kui-popup-menu\"\n data-component=\"popup-menu\"\n data-key={key}\n data-morph-skip-children\n data-trigger={context ? 'context' : 'button'}\n data-menu-label={text ?? label}\n style={\n anchor\n ? `--kui-popup-menu-context-x:${anchor.x}px;--kui-popup-menu-context-y:${anchor.y}px`\n : undefined\n }\n placement={placement}\n slot={slot}\n >\n {content}\n </wa-dropdown>\n );\n}\n"]}
@@ -0,0 +1,95 @@
1
+ import { verticalAlignment, horizontalAlignment } from './chunk-MXNIVEVL.js';
2
+ import { gapLength } from './chunk-MHMWQ7RB.js';
3
+ import { filterRootAttributes } from './chunk-KH4KEMSP.js';
4
+ import { jsx } from 'kerfjs/jsx-runtime';
5
+
6
+ var listGridAttributes = ["role", "aria-label", "aria-multiselectable"];
7
+ var listProtectedAttributes = /* @__PURE__ */ new Set([
8
+ "data-component",
9
+ "data-gap",
10
+ "data-flex",
11
+ "data-fill",
12
+ "data-h-align",
13
+ "data-v-align",
14
+ "data-scrollable",
15
+ "data-scroll-clearance",
16
+ "data-frame",
17
+ "data-surface",
18
+ "data-inset",
19
+ "data-text-insets",
20
+ "data-control-insets"
21
+ ]);
22
+ function List({
23
+ children,
24
+ selectionMode,
25
+ ariaLabel,
26
+ gap = false,
27
+ flex = false,
28
+ fill = false,
29
+ hAlign = "full",
30
+ vAlign = "top",
31
+ scrollable = false,
32
+ scrollClearance,
33
+ frame = false,
34
+ maxHeight,
35
+ minHeight,
36
+ surface,
37
+ inset,
38
+ dividerSides = "",
39
+ textInsets = "",
40
+ controlInsets = "",
41
+ className = "",
42
+ rootAttributes = {},
43
+ slot
44
+ }) {
45
+ if (selectionMode === "multiple" && !ariaLabel) {
46
+ throw new Error("Multi-select List requires an ariaLabel");
47
+ }
48
+ const multiple = selectionMode === "multiple";
49
+ const safeRootAttributes = filterRootAttributes(
50
+ rootAttributes,
51
+ multiple ? /* @__PURE__ */ new Set([...listProtectedAttributes, ...listGridAttributes]) : listProtectedAttributes
52
+ );
53
+ const gridAttributes = multiple ? {
54
+ role: "grid",
55
+ "aria-label": ariaLabel,
56
+ "aria-multiselectable": "true"
57
+ } : {};
58
+ const gapStyle = gap === true ? "--_kui-list-gap:var(--kui-list-gap)" : gap === false ? "" : typeof gap === "string" ? `--_kui-list-gap:${gapLength(gap)}` : `--_kui-list-column-gap:${gapLength(gap.column)};--_kui-list-row-gap:${gapLength(gap.row)}`;
59
+ const flexValue = flex === true ? "1 1 auto" : flex || void 0;
60
+ const style = [
61
+ gapStyle,
62
+ flexValue ? `--_kui-list-flex:${flexValue}` : "",
63
+ maxHeight === void 0 ? "" : `--_kui-list-max-height:${maxHeight}`,
64
+ minHeight === void 0 ? "" : `--_kui-list-min-height:${minHeight}`
65
+ ].filter(Boolean).join(";");
66
+ return /* @__PURE__ */ jsx(
67
+ "div",
68
+ {
69
+ ...safeRootAttributes,
70
+ ...gridAttributes,
71
+ class: `kui-list ${className}`.trim(),
72
+ "data-component": "list",
73
+ "data-gap": String(Boolean(gap)),
74
+ "data-flex": String(Boolean(flex)),
75
+ "data-fill": fill ? "true" : void 0,
76
+ "data-h-align": horizontalAlignment(hAlign),
77
+ "data-v-align": verticalAlignment(vAlign),
78
+ "data-scrollable": String(scrollable),
79
+ "data-scroll-clearance": scrollClearance,
80
+ "data-frame": frame ? "true" : void 0,
81
+ "data-surface": surface,
82
+ "data-inset": inset,
83
+ "divider-sides": dividerSides || void 0,
84
+ "data-text-insets": textInsets || void 0,
85
+ "data-control-insets": controlInsets || void 0,
86
+ style: style || void 0,
87
+ slot,
88
+ children
89
+ }
90
+ );
91
+ }
92
+
93
+ export { List };
94
+
95
+ //# sourceMappingURL=chunk-HZPHCSCS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/collections/list/list.tsx"],"names":[],"mappings":"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","file":"chunk-HZPHCSCS.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport {\n filterRootAttributes,\n type StructuralRootAttributes,\n} from '../../../shared/dom/extension-attributes.js';\nimport {\n type HorizontalAlignment,\n horizontalAlignment,\n type ListVerticalAlignment,\n verticalAlignment,\n} from '../../../shared/layout/flex-alignment.js';\nimport { gapLength } from '../../../shared/layout/gap.js';\nimport type { ScrollClearance } from '../../../shared/layout/scroll-clearance.js';\nimport type { Sides } from '../../../shared/layout/sides.js';\nimport {\n type CssFlex,\n type CssFlexKeyword,\n type CssLength,\n type UiGap,\n} from '../../../shared/styles/css-values.js';\n\n/** Attributes a multi-select List owns as an ARIA grid. */\nconst listGridAttributes = ['role', 'aria-label', 'aria-multiselectable'];\n\nconst listProtectedAttributes = new Set([\n 'data-component',\n 'data-gap',\n 'data-flex',\n 'data-fill',\n 'data-h-align',\n 'data-v-align',\n 'data-scrollable',\n 'data-scroll-clearance',\n 'data-frame',\n 'data-surface',\n 'data-inset',\n 'data-text-insets',\n 'data-control-insets',\n]);\n\ntype ListRootAttributes = StructuralRootAttributes &\n Readonly<{\n 'data-component'?: never;\n 'data-gap'?: never;\n 'data-flex'?: never;\n 'data-fill'?: never;\n 'data-h-align'?: never;\n 'data-v-align'?: never;\n 'data-scrollable'?: never;\n 'data-scroll-clearance'?: never;\n 'data-frame'?: never;\n 'data-surface'?: never;\n 'data-inset'?: never;\n 'data-text-insets'?: never;\n 'data-control-insets'?: never;\n }>;\n\n/**\n * A solid surface painted behind a List: `base` is the page surface\n * (`--kui-color-surface`), `raised` the raised surface\n * (`--kui-color-surface-raised`). A lowered region is a `SunkenPanel`.\n */\nexport type ListSurface = 'base' | 'raised';\n\n/**\n * A preset inset on all four sides. `document` is the reading inset for long\n * content such as a reader view: 24px block and 32px inline, narrowing to\n * 16px inline below 576px. It replaces any `textInsets`/`controlInsets`.\n */\nexport type ListInset = 'document';\n\nexport interface ListProps {\n children?: KerfUiContent;\n /** Make this list a labeled multi-select grid for `ContentItem selectionMode=\"multiple\"` rows. */\n selectionMode?: 'multiple';\n /** Accessible name for the multi-select grid. */\n ariaLabel?: string;\n /** Standard gap (`true`), one spacing value, or separate column and row values. Defaults to no gap. */\n gap?: boolean | UiGap;\n /** Allow this list to grow/shrink, use a keyword, or supply a typed CSS flex shorthand. */\n flex?: boolean | CssFlexKeyword | CssFlex;\n /**\n * Fill the height of a parent with a definite height, such as an app root or\n * a fixed-height frame, when this list is that parent's layout root. Inside a\n * flex layout use `flex` instead. Defaults to false.\n */\n fill?: boolean;\n /** Horizontal alignment. Defaults to full to preserve stretch-aligned list children. */\n hAlign?: HorizontalAlignment;\n /** Vertical distribution. Defaults to top. */\n vAlign?: ListVerticalAlignment;\n /**\n * Own vertical scrolling and overscroll containment. Children keep their\n * natural height and scroll instead of shrinking. To bound the list by a\n * `max-height` ancestor (no definite height), give that ancestor a flex\n * column and use `flex`; `fill` needs a definite-height parent.\n */\n scrollable?: boolean;\n /**\n * Clear chrome that lies over this scrollable List's block-start and/or\n * block-end edge, such as a `DialogSurface` floating footer. The List adds\n * the inherited `--kui-scroll-clearance-block-*` context that chrome\n * publishes to its own block padding and `scroll-padding`, so its rows\n * scroll visibly beneath the chrome while the first and last rows (and any\n * row focused or scrolled into view) can still rest clear of it. Opt in only\n * the one scroller that reaches the covered edge. Defaults to none.\n */\n scrollClearance?: ScrollClearance;\n /**\n * Draw a bordered, rounded frame around the stack: a 1px neutral border,\n * the standard control radius, and a 4px inset on every side that keeps the\n * first and last rows' focus rings inside a scrolling frame's clip. It\n * replaces any `inset`/`textInsets`/`controlInsets`. With `scrollable` and\n * `maxHeight` it is a bounded result picker of `ListItem` rows.\n */\n frame?: boolean;\n /**\n * The List's maximum block size, a typed `CssLength` from\n * `@kerfjs/ui/css-values` (such as `rem(14)`). Pair it with `scrollable` so\n * rows beyond it scroll; it bounds the List without a flex-column ancestor.\n */\n maxHeight?: CssLength;\n /**\n * The List's minimum block size, a typed `CssLength` (such as `rem(4.25)`),\n * so a short or empty result set keeps a stable box. Defaults to no minimum.\n */\n minHeight?: CssLength;\n /**\n * Paint a solid surface behind the stack, including its insets: for a strip\n * of chrome (a banner above a sunken work area) that must not show the\n * lowered tint around its content. Omitted, the List is transparent.\n */\n surface?: ListSurface;\n /** Physical divider edges in canonical top/right/bottom/left order. */\n dividerSides?: Sides;\n /** A preset four-sided inset; see `ListInset`. */\n inset?: ListInset;\n /** Physical sides that receive the standard 17px text inset. */\n textInsets?: Sides;\n /** Physical sides that receive the standard 8px control inset. Text insets win on overlap. */\n controlInsets?: Sides;\n className?: string;\n /**\n * Safe `data-*`, `aria-*`, and structural `role` metadata (a named drop\n * `region`, `aria-busy`); List-owned structural attributes remain\n * protected, and a multi-select List owns its grid role and name.\n */\n rootAttributes?: ListRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * A list's configuration, apart from its content and styling hooks: the props a\n * composite that renders a `List` for the app (the Workbench's `mainHeader` /\n * `mainFooter` chrome) forwards, so the app configures that list instead of\n * styling it. An omitted or `undefined` field keeps the composite's default.\n */\nexport type ListConfig = Pick<\n ListProps,\n 'gap' | 'hAlign' | 'vAlign' | 'dividerSides' | 'textInsets' | 'controlInsets'\n>;\n\n/** A stretch-aligned vertical stack with optional gap, flex, fill, scroll, and dividers. */\nexport function List({\n children,\n selectionMode,\n ariaLabel,\n gap = false,\n flex = false,\n fill = false,\n hAlign = 'full',\n vAlign = 'top',\n scrollable = false,\n scrollClearance,\n frame = false,\n maxHeight,\n minHeight,\n surface,\n inset,\n dividerSides = '',\n textInsets = '',\n controlInsets = '',\n className = '',\n rootAttributes = {},\n slot,\n}: ListProps) {\n if (selectionMode === 'multiple' && !ariaLabel) {\n throw new Error('Multi-select List requires an ariaLabel');\n }\n const multiple = selectionMode === 'multiple';\n const safeRootAttributes = filterRootAttributes(\n rootAttributes,\n multiple\n ? new Set([...listProtectedAttributes, ...listGridAttributes])\n : listProtectedAttributes,\n );\n const gridAttributes = multiple\n ? {\n role: 'grid',\n 'aria-label': ariaLabel,\n 'aria-multiselectable': 'true',\n }\n : {};\n const gapStyle =\n gap === true\n ? '--_kui-list-gap:var(--kui-list-gap)'\n : gap === false\n ? ''\n : typeof gap === 'string'\n ? `--_kui-list-gap:${gapLength(gap)}`\n : `--_kui-list-column-gap:${gapLength(gap.column)};--_kui-list-row-gap:${gapLength(gap.row)}`;\n const flexValue = flex === true ? '1 1 auto' : flex || undefined;\n const style = [\n gapStyle,\n flexValue ? `--_kui-list-flex:${flexValue}` : '',\n maxHeight === undefined ? '' : `--_kui-list-max-height:${maxHeight}`,\n minHeight === undefined ? '' : `--_kui-list-min-height:${minHeight}`,\n ]\n .filter(Boolean)\n .join(';');\n\n return (\n <div\n {...safeRootAttributes}\n {...gridAttributes}\n class={`kui-list ${className}`.trim()}\n data-component=\"list\"\n data-gap={String(Boolean(gap))}\n data-flex={String(Boolean(flex))}\n data-fill={fill ? 'true' : undefined}\n data-h-align={horizontalAlignment(hAlign)}\n data-v-align={verticalAlignment(vAlign)}\n data-scrollable={String(scrollable)}\n data-scroll-clearance={scrollClearance}\n data-frame={frame ? 'true' : undefined}\n data-surface={surface}\n data-inset={inset}\n divider-sides={dividerSides || undefined}\n data-text-insets={textInsets || undefined}\n data-control-insets={controlInsets || undefined}\n style={style || undefined}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n\nexport type {\n HorizontalAlignment,\n ListVerticalAlignment,\n VerticalAlignment,\n} from '../../../shared/layout/flex-alignment.js';\nexport type { ScrollClearance } from '../../../shared/layout/scroll-clearance.js';\nexport type { Sides } from '../../../shared/layout/sides.js';\nexport type {\n CssFlex,\n CssFlexKeyword,\n CssLength,\n UiGap,\n UiGapValue,\n UiSpaceName,\n} from '../../../shared/styles/css-values.js';\n"]}
@@ -0,0 +1,53 @@
1
+ // src/shared/styles/sunken-texture.ts
2
+ var SUNKEN_TEXTURE_PROPERTY = "--_kui-sunken-texture-generated";
3
+ var TILE = 100;
4
+ var MAX_OPACITY = 0.04;
5
+ var SEED = 7;
6
+ function random(seed) {
7
+ let state = seed >>> 0;
8
+ return () => {
9
+ state = state + 1831565813 >>> 0;
10
+ let value = state;
11
+ value = Math.imul(value ^ value >>> 15, value | 1);
12
+ value ^= value + Math.imul(value ^ value >>> 7, value | 61);
13
+ return ((value ^ value >>> 14) >>> 0) / 4294967296;
14
+ };
15
+ }
16
+ function sunkenTexturePixels() {
17
+ const next = random(SEED);
18
+ const pixels = new Uint8ClampedArray(TILE * TILE * 4);
19
+ for (let index = 0; index < TILE * TILE; index += 1) {
20
+ const u = 1 - next();
21
+ const v = next();
22
+ const gaussian = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);
23
+ const strength = Math.max(-1, Math.min(1, gaussian / 2.5));
24
+ const channel = strength < 0 ? 0 : 255;
25
+ const offset = index * 4;
26
+ pixels[offset] = channel;
27
+ pixels[offset + 1] = channel;
28
+ pixels[offset + 2] = channel;
29
+ pixels[offset + 3] = Math.round(Math.abs(strength) * MAX_OPACITY * 255);
30
+ }
31
+ return pixels;
32
+ }
33
+ function sunkenTextureDataUrl(doc = globalThis.document) {
34
+ const canvas = doc?.createElement("canvas");
35
+ const context = canvas?.getContext("2d");
36
+ if (!canvas || !context) return void 0;
37
+ canvas.width = TILE;
38
+ canvas.height = TILE;
39
+ const image = context.createImageData(TILE, TILE);
40
+ image.data.set(sunkenTexturePixels());
41
+ context.putImageData(image, 0, 0);
42
+ return canvas.toDataURL("image/png");
43
+ }
44
+ function ensureSunkenTexture(doc = globalThis.document) {
45
+ const root = doc?.documentElement;
46
+ if (!root || root.style.getPropertyValue(SUNKEN_TEXTURE_PROPERTY)) return;
47
+ const url = sunkenTextureDataUrl(doc);
48
+ if (url) root.style.setProperty(SUNKEN_TEXTURE_PROPERTY, `url("${url}")`);
49
+ }
50
+
51
+ export { ensureSunkenTexture };
52
+
53
+ //# sourceMappingURL=chunk-IKS72C6P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/styles/sunken-texture.ts"],"names":[],"mappings":"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","file":"chunk-IKS72C6P.js","sourcesContent":["/**\n * The sunken-surface noise texture: a seeded 100×100 Gaussian grain tile,\n * drawn once per document at runtime and layered over the lowered surface by\n * `--kui-sunken-surface` (foundation.css). Nothing ships as an asset.\n */\n\n/** The private property the generated tile is stored in on `<html>`. */\nexport const SUNKEN_TEXTURE_PROPERTY = '--_kui-sunken-texture-generated';\n\n/** Tile edge in pixels; foundation.css repeats it at the same CSS size. */\nconst TILE = 100;\n/** Strongest grain opacity: the reviewed \"Gaussian 4%\" treatment. */\nconst MAX_OPACITY = 0.04;\nconst SEED = 7;\n\n/** A small deterministic PRNG (mulberry32), so every page draws the same tile. */\nfunction random(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state + 0x6d2b79f5) >>> 0;\n let value = state;\n value = Math.imul(value ^ (value >>> 15), value | 1);\n value ^= value + Math.imul(value ^ (value >>> 7), value | 61);\n return ((value ^ (value >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * The tile's RGBA pixels: monochrome grains, darker below and lighter above\n * the surface, with Gaussian strength clipped at 2.5σ.\n */\nexport function sunkenTexturePixels(): Uint8ClampedArray {\n const next = random(SEED);\n const pixels = new Uint8ClampedArray(TILE * TILE * 4);\n for (let index = 0; index < TILE * TILE; index += 1) {\n // Box-Muller; the first uniform is kept off zero for the logarithm.\n const u = 1 - next();\n const v = next();\n const gaussian = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);\n const strength = Math.max(-1, Math.min(1, gaussian / 2.5));\n const channel = strength < 0 ? 0 : 255;\n const offset = index * 4;\n pixels[offset] = channel;\n pixels[offset + 1] = channel;\n pixels[offset + 2] = channel;\n pixels[offset + 3] = Math.round(Math.abs(strength) * MAX_OPACITY * 255);\n }\n return pixels;\n}\n\n/** Draw the tile and return it as a PNG data URL, or undefined without a 2D canvas. */\nexport function sunkenTextureDataUrl(\n doc: Document = globalThis.document,\n): string | undefined {\n const canvas = doc?.createElement('canvas');\n const context = canvas?.getContext('2d');\n if (!canvas || !context) return undefined;\n canvas.width = TILE;\n canvas.height = TILE;\n const image = context.createImageData(TILE, TILE);\n image.data.set(sunkenTexturePixels());\n context.putImageData(image, 0, 0);\n return canvas.toDataURL('image/png');\n}\n\n/**\n * Generate the sunken texture once for a document. Sunken surfaces call this\n * as they render; it is idempotent, and on a server (no document) or without\n * a 2D canvas it does nothing, leaving the flat lowered surface.\n */\nexport function ensureSunkenTexture(\n doc: Document | undefined = globalThis.document,\n): void {\n const root = doc?.documentElement;\n if (!root || root.style.getPropertyValue(SUNKEN_TEXTURE_PROPERTY)) return;\n const url = sunkenTextureDataUrl(doc);\n if (url) root.style.setProperty(SUNKEN_TEXTURE_PROPERTY, `url(\"${url}\")`);\n}\n"]}