@kerfjs/ui 5.0.0-beta.6 → 5.0.0-beta.60

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 (706) hide show
  1. package/README.md +493 -138
  2. package/ai/application-ui-diagnostic-ids-v1.json +109 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +96 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +36 -0
  10. package/ai/catalog-authoring.schema.json +109 -0
  11. package/ai/compile-time-contracts-v1.json +149 -0
  12. package/ai/compile-time-contracts-v1.schema.json +52 -0
  13. package/ai/component-catalog-extension.schema.json +79 -0
  14. package/ai/component-catalog.json +3947 -607
  15. package/ai/component-catalog.schema.json +78 -1
  16. package/ai/component-class-owners.cjs +83 -0
  17. package/ai/component-composition-extension.d.ts +7 -0
  18. package/ai/component-composition-extension.schema.json +7 -0
  19. package/ai/component-composition-rules.json +516 -0
  20. package/ai/component-composition.d.ts +115 -0
  21. package/ai/component-composition.json +6972 -0
  22. package/ai/component-composition.schema.json +354 -0
  23. package/ai/components/README.md +170 -0
  24. package/ai/components/application-tabs.md +65 -0
  25. package/ai/components/badge.md +72 -0
  26. package/ai/components/collapsible-panel.md +102 -0
  27. package/ai/components/content-item.md +90 -0
  28. package/ai/components/disclosure-arrow.md +77 -0
  29. package/ai/components/document-baseline.md +75 -0
  30. package/ai/components/empty-state.md +80 -0
  31. package/ai/components/feedback.md +71 -0
  32. package/ai/components/floating-toolbar.md +82 -0
  33. package/ai/components/foundation.md +65 -0
  34. package/ai/components/grid.md +93 -0
  35. package/ai/components/headers.md +63 -0
  36. package/ai/components/layout.md +75 -0
  37. package/ai/components/list-action-row.md +91 -0
  38. package/ai/components/list-header.md +89 -0
  39. package/ai/components/list-inset-control.md +74 -0
  40. package/ai/components/list-inset-text.md +72 -0
  41. package/ai/components/list-item.md +91 -0
  42. package/ai/components/list.md +103 -0
  43. package/ai/components/loading-spinner.md +72 -0
  44. package/ai/components/lucide-icon.md +66 -0
  45. package/ai/components/nav-stack.md +103 -0
  46. package/ai/components/pane.md +100 -0
  47. package/ai/components/popup-menu.md +171 -0
  48. package/ai/components/recipe-app-shell.md +57 -0
  49. package/ai/components/recipe-collapsible-sidebar.md +57 -0
  50. package/ai/components/recipe-compact-toolbar.md +57 -0
  51. package/ai/components/recipe-composer-form.md +57 -0
  52. package/ai/components/recipe-list-detail-dialog.md +57 -0
  53. package/ai/components/recipe-list-workspace-states.md +57 -0
  54. package/ai/components/recipe-loading-inspector.md +57 -0
  55. package/ai/components/recipe-navigation-sidebar.md +57 -0
  56. package/ai/components/recipe-navigation-stack.md +57 -0
  57. package/ai/components/recipe-workspace-header.md +57 -0
  58. package/ai/components/resize.md +106 -0
  59. package/ai/components/row.md +96 -0
  60. package/ai/components/segmented-control.md +82 -0
  61. package/ai/components/select.md +109 -0
  62. package/ai/components/skeleton.md +84 -0
  63. package/ai/components/spacer.md +86 -0
  64. package/ai/components/split-view.md +102 -0
  65. package/ai/components/state-banner.md +94 -0
  66. package/ai/components/sunken-panel.md +79 -0
  67. package/ai/components/surface-scaffold.md +78 -0
  68. package/ai/components/tab-bar.md +112 -0
  69. package/ai/components/tab-scaffold.md +94 -0
  70. package/ai/components/tabs.md +91 -0
  71. package/ai/components/text.md +83 -0
  72. package/ai/components/token-search-field.md +103 -0
  73. package/ai/components/toolbar-control-group.md +102 -0
  74. package/ai/components/toolbar-text.md +78 -0
  75. package/ai/components/toolbar.md +96 -0
  76. package/ai/components/value-table.md +73 -0
  77. package/ai/components/wa-accordion-item.md +55 -0
  78. package/ai/components/wa-accordion.md +65 -0
  79. package/ai/components/wa-animated-image.md +55 -0
  80. package/ai/components/wa-animation.md +55 -0
  81. package/ai/components/wa-avatar.md +55 -0
  82. package/ai/components/wa-badge.md +55 -0
  83. package/ai/components/wa-breadcrumb-item.md +53 -0
  84. package/ai/components/wa-breadcrumb.md +55 -0
  85. package/ai/components/wa-button-group.md +59 -0
  86. package/ai/components/wa-button.md +55 -0
  87. package/ai/components/wa-callout.md +58 -0
  88. package/ai/components/wa-card.md +59 -0
  89. package/ai/components/wa-carousel-item.md +53 -0
  90. package/ai/components/wa-carousel.md +55 -0
  91. package/ai/components/wa-checkbox-group.md +55 -0
  92. package/ai/components/wa-checkbox.md +55 -0
  93. package/ai/components/wa-color-picker.md +55 -0
  94. package/ai/components/wa-comparison.md +55 -0
  95. package/ai/components/wa-copy-button.md +55 -0
  96. package/ai/components/wa-details.md +61 -0
  97. package/ai/components/wa-dialog.md +59 -0
  98. package/ai/components/wa-divider.md +53 -0
  99. package/ai/components/wa-drawer.md +55 -0
  100. package/ai/components/wa-dropdown-item.md +60 -0
  101. package/ai/components/wa-dropdown.md +60 -0
  102. package/ai/components/wa-format-bytes.md +53 -0
  103. package/ai/components/wa-format-date.md +53 -0
  104. package/ai/components/wa-format-number.md +53 -0
  105. package/ai/components/wa-icon.md +58 -0
  106. package/ai/components/wa-include.md +53 -0
  107. package/ai/components/wa-input.md +59 -0
  108. package/ai/components/wa-intersection-observer.md +53 -0
  109. package/ai/components/wa-known-date.md +53 -0
  110. package/ai/components/wa-markdown.md +53 -0
  111. package/ai/components/wa-mutation-observer.md +53 -0
  112. package/ai/components/wa-number-input.md +55 -0
  113. package/ai/components/wa-option.md +59 -0
  114. package/ai/components/wa-otp-input.md +53 -0
  115. package/ai/components/wa-page.md +53 -0
  116. package/ai/components/wa-pagination.md +55 -0
  117. package/ai/components/wa-popover.md +55 -0
  118. package/ai/components/wa-popup.md +53 -0
  119. package/ai/components/wa-progress-bar.md +53 -0
  120. package/ai/components/wa-progress-ring.md +53 -0
  121. package/ai/components/wa-qr-code.md +53 -0
  122. package/ai/components/wa-radio-group.md +59 -0
  123. package/ai/components/wa-radio.md +55 -0
  124. package/ai/components/wa-random-content.md +53 -0
  125. package/ai/components/wa-rating.md +55 -0
  126. package/ai/components/wa-relative-time.md +53 -0
  127. package/ai/components/wa-resize-observer.md +53 -0
  128. package/ai/components/wa-scroller.md +53 -0
  129. package/ai/components/wa-select.md +63 -0
  130. package/ai/components/wa-skeleton.md +53 -0
  131. package/ai/components/wa-slider.md +55 -0
  132. package/ai/components/wa-spinner.md +58 -0
  133. package/ai/components/wa-split-panel.md +58 -0
  134. package/ai/components/wa-switch.md +53 -0
  135. package/ai/components/wa-tab-group.md +69 -0
  136. package/ai/components/wa-tab-panel.md +60 -0
  137. package/ai/components/wa-tab.md +59 -0
  138. package/ai/components/wa-tag.md +59 -0
  139. package/ai/components/wa-textarea.md +53 -0
  140. package/ai/components/wa-time-input.md +55 -0
  141. package/ai/components/wa-toast-item.md +60 -0
  142. package/ai/components/wa-toast.md +60 -0
  143. package/ai/components/wa-tooltip.md +55 -0
  144. package/ai/components/wa-tree-item.md +55 -0
  145. package/ai/components/wa-tree.md +55 -0
  146. package/ai/components/wa-zoomable-frame.md +55 -0
  147. package/ai/components/workbench.md +114 -0
  148. package/ai/public-api-signatures-v1.md +2528 -197
  149. package/ai/skill.md +241 -65
  150. package/ai/webawesome-jsx-signatures-v1.md +9 -2
  151. package/analyzer/cli.mjs +49 -0
  152. package/analyzer/component-ownership.d.mts +56 -0
  153. package/analyzer/component-ownership.mjs +184 -0
  154. package/analyzer/index.d.mts +49 -0
  155. package/analyzer/index.mjs +1458 -0
  156. package/analyzer/loud-pairs.d.mts +49 -0
  157. package/analyzer/loud-pairs.mjs +357 -0
  158. package/analyzer/report.schema.json +66 -0
  159. package/analyzer/selectors.d.mts +21 -0
  160. package/analyzer/selectors.mjs +212 -0
  161. package/dist/app-tab.d.ts +31 -4
  162. package/dist/app-tab.js +3 -1
  163. package/dist/badge.d.ts +52 -0
  164. package/dist/badge.js +3 -0
  165. package/dist/badge.js.map +1 -0
  166. package/dist/browser/app-tab.js +1 -0
  167. package/dist/browser/badge.js +3 -0
  168. package/dist/browser/catalog.js +25 -0
  169. package/dist/browser/collapsible-panel.js +7 -0
  170. package/dist/browser/content-item.js +3 -0
  171. package/dist/browser/floating-toolbar.js +3 -0
  172. package/dist/browser/grid.js +3 -0
  173. package/dist/browser/list-action-row.js +5 -0
  174. package/dist/browser/list-header.js +8 -0
  175. package/dist/browser/list-inset-control.js +3 -0
  176. package/dist/browser/list-inset-text.js +3 -0
  177. package/dist/browser/list-item.js +5 -0
  178. package/dist/browser/list.js +3 -0
  179. package/dist/browser/{panel-header.js → nav-stack.js} +4 -2
  180. package/dist/browser/pane.js +3 -0
  181. package/dist/browser/popup-menu.js +3 -0
  182. package/dist/browser/row.js +3 -0
  183. package/dist/browser/select.js +2 -0
  184. package/dist/browser/skeleton.js +3 -0
  185. package/dist/browser/spacer.js +3 -0
  186. package/dist/browser/split-view.js +10 -0
  187. package/dist/browser/state-banner.js +2 -0
  188. package/dist/browser/sunken-panel.js +3 -0
  189. package/dist/browser/surface-scaffold.js +3 -0
  190. package/dist/browser/tab-scaffold.js +4 -0
  191. package/dist/browser/text.js +3 -0
  192. package/dist/browser/toolbar-text.js +1 -0
  193. package/dist/browser/value-table.js +1 -0
  194. package/dist/browser/workbench.js +10 -0
  195. package/dist/catalog-resources.d.ts +46 -0
  196. package/dist/catalog-resources.js +22 -0
  197. package/dist/catalog-resources.js.map +1 -0
  198. package/dist/catalog.d.ts +90 -0
  199. package/dist/catalog.js +501 -0
  200. package/dist/catalog.js.map +1 -0
  201. package/dist/chunk-2G2ZJQYK.js +152 -0
  202. package/dist/chunk-2G2ZJQYK.js.map +1 -0
  203. package/dist/chunk-2OXQHM7I.js +418 -0
  204. package/dist/chunk-2OXQHM7I.js.map +1 -0
  205. package/dist/chunk-3SXMEK3B.js +43 -0
  206. package/dist/chunk-3SXMEK3B.js.map +1 -0
  207. package/dist/{chunk-MQIZAD4A.js → chunk-46263QLK.js} +126 -22
  208. package/dist/chunk-46263QLK.js.map +1 -0
  209. package/dist/{chunk-W2FK7ZNY.js → chunk-4R777DUZ.js} +10 -2
  210. package/dist/chunk-4R777DUZ.js.map +1 -0
  211. package/dist/chunk-5I7OHCIP.js +96 -0
  212. package/dist/chunk-5I7OHCIP.js.map +1 -0
  213. package/dist/chunk-5I7QGQVT.js +24 -0
  214. package/dist/chunk-5I7QGQVT.js.map +1 -0
  215. package/dist/chunk-5PESG2VP.js +115 -0
  216. package/dist/chunk-5PESG2VP.js.map +1 -0
  217. package/dist/chunk-5Q3N6EV7.js +156 -0
  218. package/dist/chunk-5Q3N6EV7.js.map +1 -0
  219. package/dist/chunk-6ZXOQEAN.js +27 -0
  220. package/dist/chunk-6ZXOQEAN.js.map +1 -0
  221. package/dist/chunk-7JUBXOIV.js +103 -0
  222. package/dist/chunk-7JUBXOIV.js.map +1 -0
  223. package/dist/chunk-A3CKOW2R.js +622 -0
  224. package/dist/chunk-A3CKOW2R.js.map +1 -0
  225. package/dist/chunk-AGXQQFKZ.js +62 -0
  226. package/dist/chunk-AGXQQFKZ.js.map +1 -0
  227. package/dist/chunk-AHEG27M7.js +66 -0
  228. package/dist/chunk-AHEG27M7.js.map +1 -0
  229. package/dist/chunk-AUKT3KMG.js +37 -0
  230. package/dist/chunk-AUKT3KMG.js.map +1 -0
  231. package/dist/chunk-AYUHMAI6.js +48 -0
  232. package/dist/chunk-AYUHMAI6.js.map +1 -0
  233. package/dist/chunk-BFPBS5Y4.js +250 -0
  234. package/dist/chunk-BFPBS5Y4.js.map +1 -0
  235. package/dist/chunk-DG6G5EPF.js +35 -0
  236. package/dist/chunk-DG6G5EPF.js.map +1 -0
  237. package/dist/chunk-E36EVCKG.js +34 -0
  238. package/dist/chunk-E36EVCKG.js.map +1 -0
  239. package/dist/chunk-EZVNC4J6.js +104 -0
  240. package/dist/chunk-EZVNC4J6.js.map +1 -0
  241. package/dist/chunk-F4QMLOXJ.js +135 -0
  242. package/dist/chunk-F4QMLOXJ.js.map +1 -0
  243. package/dist/chunk-F7F7KRO2.js +187 -0
  244. package/dist/chunk-F7F7KRO2.js.map +1 -0
  245. package/dist/chunk-GLDWRCAM.js +49 -0
  246. package/dist/chunk-GLDWRCAM.js.map +1 -0
  247. package/dist/chunk-I3Q7KKYM.js +33 -0
  248. package/dist/chunk-I3Q7KKYM.js.map +1 -0
  249. package/dist/chunk-IA7TMD4Y.js +288 -0
  250. package/dist/chunk-IA7TMD4Y.js.map +1 -0
  251. package/dist/chunk-JCV4GXWB.js +249 -0
  252. package/dist/chunk-JCV4GXWB.js.map +1 -0
  253. package/dist/chunk-K47P7QZC.js +17 -0
  254. package/dist/chunk-K47P7QZC.js.map +1 -0
  255. package/dist/chunk-KLJKU6ZL.js +109 -0
  256. package/dist/chunk-KLJKU6ZL.js.map +1 -0
  257. package/dist/{chunk-56RJXPHG.js → chunk-KROD7KZK.js} +7 -4
  258. package/dist/chunk-KROD7KZK.js.map +1 -0
  259. package/dist/chunk-MA73TA6D.js +42 -0
  260. package/dist/chunk-MA73TA6D.js.map +1 -0
  261. package/dist/chunk-MERWRTBG.js +45 -0
  262. package/dist/chunk-MERWRTBG.js.map +1 -0
  263. package/dist/chunk-MEY33VWB.js +44 -0
  264. package/dist/chunk-MEY33VWB.js.map +1 -0
  265. package/dist/chunk-MP2GDBQZ.js +50 -0
  266. package/dist/chunk-MP2GDBQZ.js.map +1 -0
  267. package/dist/chunk-N3GKMPDW.js +51 -0
  268. package/dist/chunk-N3GKMPDW.js.map +1 -0
  269. package/dist/chunk-NAPE7WUS.js +75 -0
  270. package/dist/chunk-NAPE7WUS.js.map +1 -0
  271. package/dist/chunk-NN6GYOA2.js +47 -0
  272. package/dist/chunk-NN6GYOA2.js.map +1 -0
  273. package/dist/chunk-NNMLEDMD.js +399 -0
  274. package/dist/chunk-NNMLEDMD.js.map +1 -0
  275. package/dist/chunk-P7D3EMXM.js +52 -0
  276. package/dist/chunk-P7D3EMXM.js.map +1 -0
  277. package/dist/chunk-PSHUSWQH.js +18 -0
  278. package/dist/chunk-PSHUSWQH.js.map +1 -0
  279. package/dist/chunk-RRB26JRJ.js +247 -0
  280. package/dist/chunk-RRB26JRJ.js.map +1 -0
  281. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  282. package/dist/chunk-SRSJO5QE.js.map +1 -0
  283. package/dist/chunk-T57AXDFM.js +95 -0
  284. package/dist/chunk-T57AXDFM.js.map +1 -0
  285. package/dist/chunk-T66UNBXL.js +129 -0
  286. package/dist/chunk-T66UNBXL.js.map +1 -0
  287. package/dist/chunk-UIDKY4UB.js +14 -0
  288. package/dist/chunk-UIDKY4UB.js.map +1 -0
  289. package/dist/chunk-UWONG4QE.js +127 -0
  290. package/dist/chunk-UWONG4QE.js.map +1 -0
  291. package/dist/chunk-VZOFZPSO.js +71 -0
  292. package/dist/chunk-VZOFZPSO.js.map +1 -0
  293. package/dist/chunk-WPLIO5WJ.js +184 -0
  294. package/dist/chunk-WPLIO5WJ.js.map +1 -0
  295. package/dist/{chunk-TRNBHPNW.js → chunk-X5QSICJ3.js} +13 -7
  296. package/dist/chunk-X5QSICJ3.js.map +1 -0
  297. package/dist/chunk-ZLWQZUGF.js +27 -0
  298. package/dist/chunk-ZLWQZUGF.js.map +1 -0
  299. package/dist/collapsible-panel.d.ts +122 -0
  300. package/dist/collapsible-panel.js +115 -0
  301. package/dist/collapsible-panel.js.map +1 -0
  302. package/dist/content-item.d.ts +46 -0
  303. package/dist/content-item.js +4 -0
  304. package/dist/content-item.js.map +1 -0
  305. package/dist/css-values.d.ts +107 -0
  306. package/dist/css-values.js +3 -0
  307. package/dist/css-values.js.map +1 -0
  308. package/dist/device-class.js +33 -5
  309. package/dist/device-class.js.map +1 -1
  310. package/dist/disclosure-arrow.d.ts +6 -1
  311. package/dist/disclosure-arrow.js +1 -1
  312. package/dist/empty-state.d.ts +5 -2
  313. package/dist/empty-state.js +1 -1
  314. package/dist/flex-alignment-4ms8ZbV8.d.ts +5 -0
  315. package/dist/floating-toolbar.d.ts +51 -0
  316. package/dist/floating-toolbar.js +3 -0
  317. package/dist/floating-toolbar.js.map +1 -0
  318. package/dist/grid.d.ts +34 -0
  319. package/dist/grid.js +5 -0
  320. package/dist/grid.js.map +1 -0
  321. package/dist/help-tags-register.d.ts +13 -0
  322. package/dist/help-tags-register.js +9 -0
  323. package/dist/help-tags-register.js.map +1 -0
  324. package/dist/index.d.ts +34 -14
  325. package/dist/index.js +42 -22
  326. package/dist/list-action-row.d.ts +64 -0
  327. package/dist/list-action-row.js +8 -0
  328. package/dist/list-action-row.js.map +1 -0
  329. package/dist/list-header.d.ts +99 -0
  330. package/dist/list-header.js +10 -0
  331. package/dist/list-header.js.map +1 -0
  332. package/dist/list-inset-control.d.ts +22 -0
  333. package/dist/list-inset-control.js +3 -0
  334. package/dist/list-inset-control.js.map +1 -0
  335. package/dist/list-inset-text.d.ts +30 -0
  336. package/dist/list-inset-text.js +4 -0
  337. package/dist/list-inset-text.js.map +1 -0
  338. package/dist/list-item.d.ts +52 -0
  339. package/dist/list-item.js +8 -0
  340. package/dist/list-item.js.map +1 -0
  341. package/dist/list.d.ts +59 -0
  342. package/dist/list.js +6 -0
  343. package/dist/list.js.map +1 -0
  344. package/dist/loading-spinner.d.ts +3 -1
  345. package/dist/loading-spinner.js +1 -1
  346. package/dist/lucide-icon.d.ts +3 -1
  347. package/dist/lucide-icon.js +1 -1
  348. package/dist/nav-stack.d.ts +60 -10
  349. package/dist/nav-stack.js +6 -1
  350. package/dist/pane.d.ts +102 -0
  351. package/dist/pane.js +4 -0
  352. package/dist/pane.js.map +1 -0
  353. package/dist/panel-toolbar-DqwtBxQL.d.ts +63 -0
  354. package/dist/popup-menu-register.d.ts +9 -0
  355. package/dist/popup-menu-register.js +31 -0
  356. package/dist/popup-menu-register.js.map +1 -0
  357. package/dist/popup-menu.d.ts +99 -0
  358. package/dist/popup-menu.js +3 -0
  359. package/dist/popup-menu.js.map +1 -0
  360. package/dist/resizable-region.d.ts +32 -3
  361. package/dist/resizable-region.js +1 -1
  362. package/dist/row.d.ts +48 -0
  363. package/dist/row.js +6 -0
  364. package/dist/row.js.map +1 -0
  365. package/dist/segmented-control.d.ts +13 -8
  366. package/dist/segmented-control.js +1 -1
  367. package/dist/select-register.d.ts +5 -1
  368. package/dist/select-register.js +197 -2
  369. package/dist/select-register.js.map +1 -1
  370. package/dist/select.d.ts +87 -8
  371. package/dist/select.js +4 -1
  372. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  373. package/dist/sides-BPSWde0A.d.ts +4 -0
  374. package/dist/skeleton.d.ts +31 -0
  375. package/dist/skeleton.js +4 -0
  376. package/dist/skeleton.js.map +1 -0
  377. package/dist/spacer.d.ts +18 -0
  378. package/dist/spacer.js +4 -0
  379. package/dist/spacer.js.map +1 -0
  380. package/dist/split-view.d.ts +39 -7
  381. package/dist/split-view.js +120 -10
  382. package/dist/split-view.js.map +1 -1
  383. package/dist/state-banner.d.ts +19 -5
  384. package/dist/state-banner.js +4 -1
  385. package/dist/styles/app-tab.css +69 -0
  386. package/dist/styles/badge.css +118 -0
  387. package/dist/styles/catalog/components/catalog-example-stack.css +9 -0
  388. package/dist/styles/catalog/components/catalog-example.css +164 -0
  389. package/dist/styles/catalog/components/catalog-stage.css +55 -0
  390. package/dist/styles/catalog/components/catalog.css +12 -0
  391. package/dist/styles/catalog.css +5 -0
  392. package/dist/styles/collapsible-panel.css +575 -0
  393. package/dist/styles/content-item.css +30 -0
  394. package/dist/styles/document.css +23 -0
  395. package/dist/styles/floating-toolbar.css +119 -0
  396. package/dist/styles/foundation.css +178 -40
  397. package/dist/styles/grid.css +21 -0
  398. package/dist/styles/layout.css +3 -41
  399. package/dist/styles/list-action-row.css +257 -0
  400. package/dist/styles/list-header.css +228 -0
  401. package/dist/styles/list-inset-control.css +30 -0
  402. package/dist/styles/list-inset-text.css +29 -0
  403. package/dist/styles/list-item.css +240 -0
  404. package/dist/styles/list.css +133 -0
  405. package/dist/styles/nav-stack.css +158 -50
  406. package/dist/styles/pane.css +229 -0
  407. package/dist/styles/popup-menu.css +270 -0
  408. package/dist/styles/resizable-region.css +429 -4
  409. package/dist/styles/row.css +111 -0
  410. package/dist/styles/segmented-control.css +31 -8
  411. package/dist/styles/select.css +232 -9
  412. package/dist/styles/skeleton.css +92 -0
  413. package/dist/styles/spacer.css +11 -0
  414. package/dist/styles/split-view.css +108 -3
  415. package/dist/styles/state-banner.css +94 -19
  416. package/dist/styles/styles.css +13 -4
  417. package/dist/styles/sunken-panel.css +22 -0
  418. package/dist/styles/surface-scaffold.css +56 -0
  419. package/dist/styles/tab-bar.css +132 -9
  420. package/dist/styles/tab-scaffold.css +113 -3
  421. package/dist/styles/text.css +65 -0
  422. package/dist/styles/token-search-field.css +49 -43
  423. package/dist/styles/toolbar-control-group.css +465 -28
  424. package/dist/styles/toolbar-text.css +88 -4
  425. package/dist/styles/toolbar.css +319 -11
  426. package/dist/styles/value-table.css +34 -4
  427. package/dist/styles/webawesome.css +348 -10
  428. package/dist/styles/workbench.css +828 -7
  429. package/dist/sunken-panel.d.ts +22 -0
  430. package/dist/sunken-panel.js +3 -0
  431. package/dist/sunken-panel.js.map +1 -0
  432. package/dist/surface-scaffold.d.ts +30 -0
  433. package/dist/surface-scaffold.js +3 -0
  434. package/dist/surface-scaffold.js.map +1 -0
  435. package/dist/tab-bar.d.ts +31 -6
  436. package/dist/tab-bar.js +1 -1
  437. package/dist/tab-scaffold.d.ts +54 -7
  438. package/dist/tab-scaffold.js +82 -9
  439. package/dist/tab-scaffold.js.map +1 -1
  440. package/dist/text.d.ts +38 -0
  441. package/dist/text.js +3 -0
  442. package/dist/text.js.map +1 -0
  443. package/dist/token-search-field-CCke1yvQ.d.ts +126 -0
  444. package/dist/token-search-field.d.ts +3 -43
  445. package/dist/token-search-field.js +1 -1
  446. package/dist/token-search-model.d.ts +3 -0
  447. package/dist/token-search-model.js +3 -0
  448. package/dist/token-search-model.js.map +1 -0
  449. package/dist/toolbar-control-group.d.ts +65 -7
  450. package/dist/toolbar-control-group.js +1 -1
  451. package/dist/toolbar-text.d.ts +37 -4
  452. package/dist/toolbar-text.js +3 -1
  453. package/dist/toolbar.d.ts +56 -7
  454. package/dist/toolbar.js +1 -1
  455. package/dist/types-BuHELdXR.d.ts +117 -0
  456. package/dist/value-table.d.ts +13 -3
  457. package/dist/value-table.js +3 -1
  458. package/dist/webawesome.d.ts +8 -1
  459. package/dist/wire-catalog.d.ts +82 -0
  460. package/dist/wire-catalog.js +327 -0
  461. package/dist/wire-catalog.js.map +1 -0
  462. package/dist/wire-nav-stack.d.ts +4 -1
  463. package/dist/wire-nav-stack.js +147 -7
  464. package/dist/wire-nav-stack.js.map +1 -1
  465. package/dist/wire-resizable-regions.d.ts +2 -1
  466. package/dist/wire-resizable-regions.js +2 -1
  467. package/dist/wire-scroll-dividers.d.ts +69 -0
  468. package/dist/wire-scroll-dividers.js +3 -0
  469. package/dist/wire-scroll-dividers.js.map +1 -0
  470. package/dist/wire-sidebar.d.ts +63 -0
  471. package/dist/wire-sidebar.js +231 -0
  472. package/dist/wire-sidebar.js.map +1 -0
  473. package/dist/wire-tab-bars.d.ts +19 -2
  474. package/dist/wire-tab-bars.js +1 -1
  475. package/dist/wire-tab-scaffold.js +9 -4
  476. package/dist/wire-tab-scaffold.js.map +1 -1
  477. package/dist/wire-token-search-fields.d.ts +65 -3
  478. package/dist/wire-token-search-fields.js +1 -1
  479. package/dist/wire-workbench.d.ts +109 -0
  480. package/dist/wire-workbench.js +6 -0
  481. package/dist/wire-workbench.js.map +1 -0
  482. package/dist/workbench.d.ts +218 -7
  483. package/dist/workbench.js +13 -15
  484. package/dist/workbench.js.map +1 -1
  485. package/docs/accessibility.md +386 -22
  486. package/docs/app-layouts.md +106 -8
  487. package/docs/catalog.md +440 -0
  488. package/docs/collapsible-panel.md +363 -0
  489. package/docs/component-contract.md +555 -52
  490. package/docs/component-integration.md +75 -0
  491. package/docs/component-selection.md +359 -89
  492. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  493. package/docs/design/templates/empty-state/filtered.svg +1 -0
  494. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  495. package/docs/design/templates/empty-state/with-action.svg +1 -0
  496. package/docs/design/templates/empty-state-dark.svg +1 -0
  497. package/docs/design/templates/empty-state.svg +1 -0
  498. package/docs/design/templates/list/compact-dark.svg +1 -0
  499. package/docs/design/templates/list/compact.svg +1 -0
  500. package/docs/design/templates/list/stack-dark.svg +1 -0
  501. package/docs/design/templates/list/stack.svg +1 -0
  502. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  503. package/docs/design/templates/list-action-row/default.svg +1 -0
  504. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  505. package/docs/design/templates/list-action-row/selected.svg +1 -0
  506. package/docs/design/templates/list-action-row-dark.svg +1 -0
  507. package/docs/design/templates/list-action-row.svg +1 -0
  508. package/docs/design/templates/list-dark.svg +1 -0
  509. package/docs/design/templates/list-header/action-dark.svg +1 -0
  510. package/docs/design/templates/list-header/action.svg +1 -0
  511. package/docs/design/templates/list-header/count-dark.svg +1 -0
  512. package/docs/design/templates/list-header/count.svg +1 -0
  513. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  514. package/docs/design/templates/list-header/inline-action.svg +1 -0
  515. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  516. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  517. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  518. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  519. package/docs/design/templates/list-header-dark.svg +1 -0
  520. package/docs/design/templates/list-header.svg +1 -0
  521. package/docs/design/templates/list-item/default-dark.svg +1 -0
  522. package/docs/design/templates/list-item/default.svg +1 -0
  523. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  524. package/docs/design/templates/list-item/multiline.svg +1 -0
  525. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  526. package/docs/design/templates/list-item/selected.svg +1 -0
  527. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  528. package/docs/design/templates/list-item/trailing.svg +1 -0
  529. package/docs/design/templates/list-item-dark.svg +1 -0
  530. package/docs/design/templates/list-item.svg +1 -0
  531. package/docs/design/templates/list.svg +1 -0
  532. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  533. package/docs/design/templates/segmented-control/equal.svg +1 -0
  534. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  535. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  536. package/docs/design/templates/segmented-control-dark.svg +1 -0
  537. package/docs/design/templates/segmented-control.svg +1 -0
  538. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  539. package/docs/design/templates/skeleton/avatar.svg +1 -0
  540. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  541. package/docs/design/templates/skeleton/block.svg +1 -0
  542. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  543. package/docs/design/templates/skeleton/lines.svg +1 -0
  544. package/docs/design/templates/skeleton-dark.svg +1 -0
  545. package/docs/design/templates/skeleton.svg +1 -0
  546. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  547. package/docs/design/templates/state-banner/danger.svg +1 -0
  548. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  549. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  550. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  551. package/docs/design/templates/state-banner/info.svg +1 -0
  552. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  553. package/docs/design/templates/state-banner/success.svg +1 -0
  554. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  555. package/docs/design/templates/state-banner/warning.svg +1 -0
  556. package/docs/design/templates/state-banner-dark.svg +1 -0
  557. package/docs/design/templates/state-banner.svg +1 -0
  558. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  559. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  560. package/docs/design/templates/tab-bar-dark.svg +1 -0
  561. package/docs/design/templates/tab-bar.svg +1 -0
  562. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  563. package/docs/design/templates/token-search-field/empty.svg +1 -0
  564. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  565. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  566. package/docs/design/templates/token-search-field-dark.svg +1 -0
  567. package/docs/design/templates/token-search-field.svg +1 -0
  568. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  569. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  570. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  571. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  572. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  573. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  574. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  575. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  576. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  577. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  578. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  579. package/docs/design/templates/toolbar-control-group.svg +1 -0
  580. package/docs/design/templates/toolbar-dark.svg +1 -0
  581. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  582. package/docs/design/templates/toolbar-text/default.svg +1 -0
  583. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  584. package/docs/design/templates/toolbar-text/large.svg +1 -0
  585. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  586. package/docs/design/templates/toolbar-text/small.svg +1 -0
  587. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  588. package/docs/design/templates/toolbar-text.svg +1 -0
  589. package/docs/design/templates/toolbar.svg +1 -0
  590. package/docs/design/templates/value-table/details-dark.svg +1 -0
  591. package/docs/design/templates/value-table/details.svg +1 -0
  592. package/docs/design/templates/value-table-dark.svg +1 -0
  593. package/docs/design/templates/value-table.svg +1 -0
  594. package/docs/design/templates.md +138 -0
  595. package/docs/design-philosophy.md +48 -20
  596. package/docs/device-class.md +10 -9
  597. package/docs/document-baseline.md +38 -0
  598. package/docs/examples/application-ui-profile.json +60 -0
  599. package/docs/examples/command-palette-adapter.tsx +69 -17
  600. package/docs/examples/component-catalog-extension.json +45 -0
  601. package/docs/examples/component-composition-extension.json +80 -0
  602. package/docs/layout.md +398 -59
  603. package/docs/nav-stack.md +126 -14
  604. package/docs/recipes.md +137 -54
  605. package/docs/split-view.md +69 -6
  606. package/docs/sunken-panel.md +53 -0
  607. package/docs/surface-scaffold.md +25 -0
  608. package/docs/tab-scaffold.md +94 -10
  609. package/docs/type-contracts.md +134 -0
  610. package/docs/ui-analyzer.md +306 -0
  611. package/docs/ui-doctor.md +107 -0
  612. package/docs/ui-evaluator.md +139 -0
  613. package/docs/ux-demo.md +40 -16
  614. package/docs/webawesome-theme.md +143 -16
  615. package/docs/workbench.md +534 -12
  616. package/doctor/cli.mjs +115 -0
  617. package/doctor/config.schema.json +68 -0
  618. package/doctor/eslint-diagnostics.d.mts +24 -0
  619. package/doctor/eslint-diagnostics.mjs +24 -0
  620. package/doctor/index.d.mts +116 -0
  621. package/doctor/index.mjs +1277 -0
  622. package/doctor/report.schema.json +118 -0
  623. package/evaluator/cli.mjs +89 -0
  624. package/evaluator/index.d.mts +90 -0
  625. package/evaluator/index.mjs +1203 -0
  626. package/evaluator/report.schema.json +152 -0
  627. package/llms.txt +395 -42
  628. package/package.json +235 -37
  629. package/traversal-exclusions.mjs +27 -0
  630. package/ux-demo/recipes/app-shell.tsx +205 -17
  631. package/ux-demo/recipes/collapsible-sidebar.tsx +260 -0
  632. package/ux-demo/recipes/compact-toolbar.tsx +135 -14
  633. package/ux-demo/recipes/composer-form.tsx +133 -21
  634. package/ux-demo/recipes/list-detail-dialog.tsx +282 -0
  635. package/ux-demo/recipes/list-workspace-states.tsx +183 -11
  636. package/ux-demo/recipes/loaders.ts +15 -5
  637. package/ux-demo/recipes/loading-inspector.tsx +204 -0
  638. package/ux-demo/recipes/mount-recipe.ts +28 -10
  639. package/ux-demo/recipes/navigation-sidebar.tsx +139 -13
  640. package/ux-demo/recipes/navigation-stack.tsx +79 -24
  641. package/ux-demo/recipes/types.ts +23 -2
  642. package/ux-demo/recipes/workspace-header.tsx +86 -5
  643. package/dist/browser/menu-action-row.js +0 -3
  644. package/dist/browser/menu-header.js +0 -5
  645. package/dist/browser/menu-item.js +0 -3
  646. package/dist/chunk-24Z2XE6C.js +0 -10
  647. package/dist/chunk-24Z2XE6C.js.map +0 -1
  648. package/dist/chunk-2RJBFNB6.js +0 -172
  649. package/dist/chunk-2RJBFNB6.js.map +0 -1
  650. package/dist/chunk-55DATV3A.js +0 -10
  651. package/dist/chunk-55DATV3A.js.map +0 -1
  652. package/dist/chunk-56RJXPHG.js.map +0 -1
  653. package/dist/chunk-7BR3DO2A.js.map +0 -1
  654. package/dist/chunk-7LDCTU7D.js +0 -134
  655. package/dist/chunk-7LDCTU7D.js.map +0 -1
  656. package/dist/chunk-AQNKJRFH.js +0 -79
  657. package/dist/chunk-AQNKJRFH.js.map +0 -1
  658. package/dist/chunk-CTQKI2XL.js +0 -28
  659. package/dist/chunk-CTQKI2XL.js.map +0 -1
  660. package/dist/chunk-DAFFDO33.js +0 -14
  661. package/dist/chunk-DAFFDO33.js.map +0 -1
  662. package/dist/chunk-EGHL5S4P.js +0 -33
  663. package/dist/chunk-EGHL5S4P.js.map +0 -1
  664. package/dist/chunk-KZKSBUKC.js +0 -19
  665. package/dist/chunk-KZKSBUKC.js.map +0 -1
  666. package/dist/chunk-M5JRI6MN.js +0 -27
  667. package/dist/chunk-M5JRI6MN.js.map +0 -1
  668. package/dist/chunk-MBR3TYNL.js +0 -14
  669. package/dist/chunk-MBR3TYNL.js.map +0 -1
  670. package/dist/chunk-MFKMHK5W.js +0 -10
  671. package/dist/chunk-MFKMHK5W.js.map +0 -1
  672. package/dist/chunk-MQIZAD4A.js.map +0 -1
  673. package/dist/chunk-NPPD2A6O.js +0 -40
  674. package/dist/chunk-NPPD2A6O.js.map +0 -1
  675. package/dist/chunk-R6JHHBKQ.js +0 -19
  676. package/dist/chunk-R6JHHBKQ.js.map +0 -1
  677. package/dist/chunk-RBTVBGRD.js +0 -23
  678. package/dist/chunk-RBTVBGRD.js.map +0 -1
  679. package/dist/chunk-S3TPM2LP.js +0 -23
  680. package/dist/chunk-S3TPM2LP.js.map +0 -1
  681. package/dist/chunk-TRNBHPNW.js.map +0 -1
  682. package/dist/chunk-VHW5YNIB.js +0 -17
  683. package/dist/chunk-VHW5YNIB.js.map +0 -1
  684. package/dist/chunk-W2FK7ZNY.js.map +0 -1
  685. package/dist/chunk-WVPYVDXY.js +0 -15
  686. package/dist/chunk-WVPYVDXY.js.map +0 -1
  687. package/dist/chunk-XZXRLY5Q.js +0 -33
  688. package/dist/chunk-XZXRLY5Q.js.map +0 -1
  689. package/dist/menu-action-row.d.ts +0 -50
  690. package/dist/menu-action-row.js +0 -4
  691. package/dist/menu-action-row.js.map +0 -1
  692. package/dist/menu-header.d.ts +0 -41
  693. package/dist/menu-header.js +0 -6
  694. package/dist/menu-header.js.map +0 -1
  695. package/dist/menu-item.d.ts +0 -31
  696. package/dist/menu-item.js +0 -4
  697. package/dist/menu-item.js.map +0 -1
  698. package/dist/panel-header.d.ts +0 -26
  699. package/dist/panel-header.js +0 -6
  700. package/dist/panel-header.js.map +0 -1
  701. package/dist/styles/menu-action-row.css +0 -160
  702. package/dist/styles/menu-header.css +0 -160
  703. package/dist/styles/menu-item.css +0 -123
  704. package/dist/styles/panel-header.css +0 -59
  705. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
  706. package/ux-demo/recipes/recipes.css +0 -355
@@ -0,0 +1,127 @@
1
+ import { jsxs, jsx } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/popup-menu.tsx
4
+ function contentKey(parts) {
5
+ let hash = 2166136261;
6
+ for (const character of parts.join("\0")) {
7
+ hash ^= character.codePointAt(0);
8
+ hash = Math.imul(hash, 16777619);
9
+ }
10
+ return (hash >>> 0).toString(36);
11
+ }
12
+ function entryKey(entry) {
13
+ if (entry.kind === "divider") return "-";
14
+ if (entry.kind === "heading") return `#${entry.label}`;
15
+ return [
16
+ entry.label,
17
+ entry.action ?? "",
18
+ entry.value ?? "",
19
+ entry.disabled ? "1" : "0",
20
+ entry.checked ? "1" : "0",
21
+ entry.tone ?? "",
22
+ entry.disabledReason ?? "",
23
+ String(entry.icon ?? ""),
24
+ String(entry.details ?? ""),
25
+ JSON.stringify(entry.attributes ?? {}),
26
+ ...(entry.submenu ?? []).map(entryKey)
27
+ ].join("");
28
+ }
29
+ function renderEntry(entry, nested = false) {
30
+ if (entry.kind === "divider") return /* @__PURE__ */ jsx("wa-divider", {});
31
+ if (entry.kind === "heading")
32
+ return /* @__PURE__ */ jsx("div", { class: "kui-popup-menu__heading", children: entry.label });
33
+ return /* @__PURE__ */ jsxs(
34
+ "wa-dropdown-item",
35
+ {
36
+ ...entry.attributes ?? {},
37
+ slot: nested ? "submenu" : void 0,
38
+ "data-action": entry.action,
39
+ value: entry.value,
40
+ type: entry.checked === void 0 ? void 0 : "checkbox",
41
+ checked: entry.checked,
42
+ variant: entry.tone === "danger" ? "danger" : void 0,
43
+ disabled: entry.disabled,
44
+ title: entry.disabled ? entry.disabledReason : void 0,
45
+ children: [
46
+ entry.icon ? /* @__PURE__ */ jsx("span", { slot: "icon", class: "kui-popup-menu__icon", children: entry.icon }) : null,
47
+ entry.label,
48
+ entry.details ? /* @__PURE__ */ jsx("span", { slot: "details", class: "kui-popup-menu__details", children: entry.details }) : entry.submenu ? /* @__PURE__ */ jsx("span", { slot: "details" }) : null,
49
+ entry.submenu?.map((child) => renderEntry(child, true))
50
+ ]
51
+ }
52
+ );
53
+ }
54
+ function openPopupMenuAt(menu, x, y) {
55
+ menu.style.setProperty("--kui-popup-menu-context-x", `${x}px`);
56
+ menu.style.setProperty("--kui-popup-menu-context-y", `${y}px`);
57
+ menu.open = true;
58
+ }
59
+ function closePopupMenu(menu) {
60
+ menu.open = false;
61
+ }
62
+ function PopupMenu({
63
+ text,
64
+ label,
65
+ icon,
66
+ items,
67
+ placement = "bottom-start",
68
+ caret = true,
69
+ disabled = false,
70
+ rootAttributes = {},
71
+ slot,
72
+ context = false
73
+ }) {
74
+ const key = `kui-popup-menu-${contentKey([
75
+ text ?? "",
76
+ label ?? "",
77
+ String(icon ?? ""),
78
+ String(caret),
79
+ String(disabled),
80
+ String(context),
81
+ ...items.map(entryKey)
82
+ ])}`;
83
+ return /* @__PURE__ */ jsxs(
84
+ "wa-dropdown",
85
+ {
86
+ size: "m",
87
+ ...rootAttributes,
88
+ class: "kui-popup-menu",
89
+ "data-component": "popup-menu",
90
+ "data-key": key,
91
+ "data-morph-skip-children": true,
92
+ "data-trigger": context ? "context" : "button",
93
+ placement,
94
+ slot,
95
+ children: [
96
+ context ? /* @__PURE__ */ jsx(
97
+ "button",
98
+ {
99
+ type: "button",
100
+ slot: "trigger",
101
+ class: "kui-popup-menu__context-anchor",
102
+ "aria-label": label,
103
+ "aria-hidden": "true",
104
+ tabindex: -1
105
+ }
106
+ ) : /* @__PURE__ */ jsxs(
107
+ "wa-button",
108
+ {
109
+ slot: "trigger",
110
+ appearance: "plain",
111
+ "with-caret": caret,
112
+ disabled,
113
+ children: [
114
+ icon,
115
+ text ? /* @__PURE__ */ jsx("span", { children: text }) : /* @__PURE__ */ jsx("span", { class: "kui-popup-menu__label", children: label })
116
+ ]
117
+ }
118
+ ),
119
+ items.map((entry) => renderEntry(entry))
120
+ ]
121
+ }
122
+ );
123
+ }
124
+
125
+ export { PopupMenu, closePopupMenu, openPopupMenuAt };
126
+
127
+ //# sourceMappingURL=chunk-UWONG4QE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/popup-menu.tsx"],"names":[],"mappings":"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","file":"chunk-UWONG4QE.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from './semantic-content.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 checked menu choice, including nested choices. */\n checked?: boolean;\n /** Trailing safe content, such as a selected-choice tick. */\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 opened by hover or keyboard navigation. */\n submenu?: readonly PopupMenuItem[];\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\ntype PopupMenuTrigger =\n | (PopupMenuTriggerName & { context?: false })\n | {\n context: true;\n label: string;\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/** A short, stable FNV-1a digest of the trigger and item structure. */\nfunction contentKey(parts: readonly string[]): string {\n let hash = 0x811c9dc5;\n for (const character of parts.join('\\u0000')) {\n hash ^= character.codePointAt(0)!;\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction entryKey(entry: PopupMenuEntry): string {\n if (entry.kind === 'divider') return '-';\n if (entry.kind === 'heading') return `#${entry.label}`;\n return [\n entry.label,\n entry.action ?? '',\n entry.value ?? '',\n entry.disabled ? '1' : '0',\n entry.checked ? '1' : '0',\n entry.tone ?? '',\n entry.disabledReason ?? '',\n String(entry.icon ?? ''),\n String(entry.details ?? ''),\n JSON.stringify(entry.attributes ?? {}),\n ...(entry.submenu ?? []).map(entryKey),\n ].join('\\u0001');\n}\n\nfunction renderEntry(entry: PopupMenuEntry, nested = false) {\n if (entry.kind === 'divider') return <wa-divider></wa-divider>;\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 <div class=\"kui-popup-menu__heading\">{entry.label}</div>;\n return (\n <wa-dropdown-item\n {...(entry.attributes ?? {})}\n slot={nested ? 'submenu' : 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 {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\"></span>\n ) : null}\n {entry.submenu?.map((child) => renderEntry(child, true))}\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/** Open a context PopupMenu at viewport pointer coordinates. */\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 menu.open = true;\n}\n\n/** Close a programmatically opened PopupMenu. */\nexport function closePopupMenu(menu: PopupMenuElement): void {\n menu.open = false;\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.\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}: PopupMenuProps) {\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 const key = `kui-popup-menu-${contentKey([\n text ?? '',\n label ?? '',\n String(icon ?? ''),\n String(caret),\n String(disabled),\n String(context),\n ...items.map(entryKey),\n ])}`;\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 placement={placement}\n slot={slot}\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 ></button>\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))}\n </wa-dropdown>\n );\n}\n"]}
@@ -0,0 +1,71 @@
1
+ import { verticalAlignment, horizontalAlignment } from './chunk-AYUHMAI6.js';
2
+ import { filterDataAttributes } from './chunk-SRSJO5QE.js';
3
+ import { space } from './chunk-2G2ZJQYK.js';
4
+ import { jsx } from 'kerfjs/jsx-runtime';
5
+
6
+ var rowProtectedAttributes = /* @__PURE__ */ new Set([
7
+ "data-component",
8
+ "data-h-align",
9
+ "data-v-align",
10
+ "data-flex",
11
+ "data-fill",
12
+ "data-wrap",
13
+ "data-text-insets",
14
+ "data-control-insets"
15
+ ]);
16
+ var spaceNames = [
17
+ "none",
18
+ "2xs",
19
+ "xs",
20
+ "s",
21
+ "m",
22
+ "l",
23
+ "xl"
24
+ ];
25
+ function Row({
26
+ children,
27
+ hAlign = "left",
28
+ vAlign = "full",
29
+ gap = "xs",
30
+ flex = false,
31
+ fill = false,
32
+ wrap = false,
33
+ textInsets = "",
34
+ controlInsets = "",
35
+ className = "",
36
+ rootAttributes = {},
37
+ slot
38
+ }) {
39
+ const safeRootAttributes = filterDataAttributes(
40
+ rootAttributes,
41
+ rowProtectedAttributes
42
+ );
43
+ const gapValue = spaceNames.includes(gap) ? space(gap) : gap;
44
+ const flexValue = flex === true ? "1 1 auto" : flex || void 0;
45
+ const style = [
46
+ `--_kui-row-gap:${gapValue}`,
47
+ flexValue ? `--_kui-row-flex:${flexValue}` : ""
48
+ ].filter(Boolean).join(";");
49
+ return /* @__PURE__ */ jsx(
50
+ "div",
51
+ {
52
+ ...safeRootAttributes,
53
+ class: `kui-row ${className}`.trim(),
54
+ "data-component": "row",
55
+ "data-h-align": horizontalAlignment(hAlign),
56
+ "data-v-align": verticalAlignment(vAlign),
57
+ "data-flex": String(Boolean(flex)),
58
+ "data-fill": fill ? "true" : void 0,
59
+ "data-wrap": String(wrap),
60
+ "data-text-insets": textInsets || void 0,
61
+ "data-control-insets": controlInsets || void 0,
62
+ style,
63
+ slot,
64
+ children
65
+ }
66
+ );
67
+ }
68
+
69
+ export { Row };
70
+
71
+ //# sourceMappingURL=chunk-VZOFZPSO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/row.tsx"],"names":[],"mappings":";;;;;AAiBA,IAAM,sBAAA,uBAA6B,GAAA,CAAI;AAAA,EACrC,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAeD,IAAM,UAAA,GAAqC;AAAA,EACzC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA;AAgCO,SAAS,GAAA,CAAI;AAAA,EAClB,QAAA;AAAA,EACA,MAAA,GAAS,MAAA;AAAA,EACT,MAAA,GAAS,MAAA;AAAA,EACT,GAAA,GAAM,IAAA;AAAA,EACN,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,UAAA,GAAa,EAAA;AAAA,EACb,aAAA,GAAgB,EAAA;AAAA,EAChB,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAa;AACX,EAAA,MAAM,kBAAA,GAAqB,oBAAA;AAAA,IACzB,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,WAAW,UAAA,CAAW,QAAA,CAAS,GAAkB,CAAA,GACnD,KAAA,CAAM,GAAkB,CAAA,GACxB,GAAA;AACJ,EAAA,MAAM,SAAA,GAAY,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,IAAA,IAAQ,MAAA;AACvD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,kBAAkB,QAAQ,CAAA,CAAA;AAAA,IAC1B,SAAA,GAAY,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,GAAK;AAAA,GAC/C,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,kBAAA;AAAA,MACJ,KAAA,EAAO,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACnC,gBAAA,EAAe,KAAA;AAAA,MACf,cAAA,EAAc,oBAAoB,MAAM,CAAA;AAAA,MACxC,cAAA,EAAc,kBAAkB,MAAM,CAAA;AAAA,MACtC,WAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MAC/B,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,WAAA,EAAW,OAAO,IAAI,CAAA;AAAA,MACtB,oBAAkB,UAAA,IAAc,MAAA;AAAA,MAChC,uBAAqB,aAAA,IAAiB,MAAA;AAAA,MACtC,KAAA;AAAA,MACA,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-VZOFZPSO.js","sourcesContent":["import {\n type CssFlex,\n type CssFlexKeyword,\n type CssLength,\n space,\n type UiSpaceName,\n} from './css-values.js';\nimport { filterDataAttributes } from './extension-attributes.js';\nimport {\n type HorizontalAlignment,\n horizontalAlignment,\n type VerticalAlignment,\n verticalAlignment,\n} from './flex-alignment.js';\nimport type { KerfUiContent } from './semantic-content.js';\nimport type { Sides } from './sides.js';\n\nconst rowProtectedAttributes = new Set([\n 'data-component',\n 'data-h-align',\n 'data-v-align',\n 'data-flex',\n 'data-fill',\n 'data-wrap',\n 'data-text-insets',\n 'data-control-insets',\n]);\n\ntype RowRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-h-align'?: never;\n 'data-v-align'?: never;\n 'data-flex'?: never;\n 'data-fill'?: never;\n 'data-wrap'?: never;\n 'data-text-insets'?: never;\n 'data-control-insets'?: never;\n }\n>;\n\nconst spaceNames: readonly UiSpaceName[] = [\n 'none',\n '2xs',\n 'xs',\n 's',\n 'm',\n 'l',\n 'xl',\n];\n\nexport interface RowProps {\n children?: KerfUiContent;\n /** Horizontal distribution. Defaults to left. */\n hAlign?: HorizontalAlignment;\n /** Vertical alignment and wrapped-line distribution. Defaults to full. */\n vAlign?: VerticalAlignment;\n /** A named UI spacing token or typed CSS length. Defaults to xs. */\n gap?: UiSpaceName | CssLength;\n /** Allow this row 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 row is that parent's layout root. Inside a\n * flex layout use `flex` instead. Defaults to false.\n */\n fill?: boolean;\n /** Allow children to wrap onto additional lines. */\n wrap?: boolean;\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 /** Safe `data-*` metadata; Row-owned structural attributes remain protected. */\n rootAttributes?: RowRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** A horizontal flex row with explicit physical-axis alignment and spacing. */\nexport function Row({\n children,\n hAlign = 'left',\n vAlign = 'full',\n gap = 'xs',\n flex = false,\n fill = false,\n wrap = false,\n textInsets = '',\n controlInsets = '',\n className = '',\n rootAttributes = {},\n slot,\n}: RowProps) {\n const safeRootAttributes = filterDataAttributes(\n rootAttributes,\n rowProtectedAttributes,\n );\n const gapValue = spaceNames.includes(gap as UiSpaceName)\n ? space(gap as UiSpaceName)\n : gap;\n const flexValue = flex === true ? '1 1 auto' : flex || undefined;\n const style = [\n `--_kui-row-gap:${gapValue}`,\n flexValue ? `--_kui-row-flex:${flexValue}` : '',\n ]\n .filter(Boolean)\n .join(';');\n\n return (\n <div\n {...safeRootAttributes}\n class={`kui-row ${className}`.trim()}\n data-component=\"row\"\n data-h-align={horizontalAlignment(hAlign)}\n data-v-align={verticalAlignment(vAlign)}\n data-flex={String(Boolean(flex))}\n data-fill={fill ? 'true' : undefined}\n data-wrap={String(wrap)}\n data-text-insets={textInsets || undefined}\n data-control-insets={controlInsets || undefined}\n style={style}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n\nexport type {\n CssFlex,\n CssFlexKeyword,\n CssLength,\n UiSpaceName,\n} from './css-values.js';\nexport type {\n HorizontalAlignment,\n VerticalAlignment,\n} from './flex-alignment.js';\nexport type { Sides } from './sides.js';\n"]}
@@ -0,0 +1,184 @@
1
+ import { Skeleton } from './chunk-AHEG27M7.js';
2
+ import { Badge } from './chunk-MP2GDBQZ.js';
3
+ import { LucideIcon } from './chunk-4R777DUZ.js';
4
+ import { em } from './chunk-2G2ZJQYK.js';
5
+ import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
6
+
7
+ function SelectChevron() {
8
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 448 512", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z" }) });
9
+ }
10
+ function Select(props) {
11
+ const {
12
+ name,
13
+ label,
14
+ ariaLabel,
15
+ choices,
16
+ className = "",
17
+ placeholderText,
18
+ hint,
19
+ disabled = false,
20
+ fitMenu = false,
21
+ placeholder = false,
22
+ presentation = "form",
23
+ size = "default",
24
+ triggerWidth,
25
+ focusRingOwner = "select",
26
+ labelMaxWidth,
27
+ slot
28
+ } = props;
29
+ const multiple = props.multiple === true;
30
+ const values = props.multiple ? props.value : [props.value];
31
+ const renderSelected = props.multiple ? void 0 : props.renderSelected;
32
+ const selectedPresentation = props.selectedPresentation ?? "label";
33
+ const iconTrigger = props.multiple && props.selectedPresentation === "icon-only";
34
+ const triggerIcon = iconTrigger ? props.triggerIcon : void 0;
35
+ if (placeholder) {
36
+ return /* @__PURE__ */ jsxs(
37
+ "div",
38
+ {
39
+ class: `kui-select kui-select--placeholder ${className}`.trim(),
40
+ "data-component": "select",
41
+ "data-placeholder": "true",
42
+ "data-presentation": presentation,
43
+ "data-size": size,
44
+ "data-trigger-width": triggerWidth,
45
+ "data-selected-presentation": selectedPresentation,
46
+ "data-focus-ring-owner": focusRingOwner,
47
+ "aria-busy": "true",
48
+ style: labelMaxWidth === void 0 ? void 0 : `--kui-select-label-max-width:${labelMaxWidth}px`,
49
+ slot,
50
+ children: [
51
+ label && /* @__PURE__ */ jsx("span", { class: "kui-select__placeholder-label", children: label }),
52
+ /* @__PURE__ */ jsxs(
53
+ "span",
54
+ {
55
+ class: "kui-select__placeholder-box",
56
+ "aria-label": ariaLabel,
57
+ role: "img",
58
+ children: [
59
+ /* @__PURE__ */ jsx(Skeleton, { width: em(10) }),
60
+ /* @__PURE__ */ jsx("span", { class: "kui-select__placeholder-chevron", "aria-hidden": "true", children: /* @__PURE__ */ jsx(SelectChevron, {}) })
61
+ ]
62
+ }
63
+ ),
64
+ hint && /* @__PURE__ */ jsx("span", { class: "kui-select__placeholder-hint", children: hint })
65
+ ]
66
+ }
67
+ );
68
+ }
69
+ const selected = multiple ? void 0 : choices.find((choice) => choice.value === values[0]);
70
+ const chosenCount = iconTrigger ? choices.filter((choice) => values.includes(choice.value)).length : 0;
71
+ const icon = (choice, selectedIcon = false) => /* @__PURE__ */ jsx(
72
+ "span",
73
+ {
74
+ "data-key": `${name}:${choice.value}:${selectedIcon ? "selected" : "option"}`,
75
+ "data-morph-skip": true,
76
+ slot: "start",
77
+ class: `kui-select__icon${selectedIcon ? " kui-select__icon--selected" : ""}`,
78
+ style: choice.color ? `color:${choice.color}` : void 0,
79
+ children: choice.icon ? /* @__PURE__ */ jsx(
80
+ LucideIcon,
81
+ {
82
+ icon: choice.icon,
83
+ name: choice.iconName ?? choice.label.toLowerCase().replaceAll(" ", "-")
84
+ }
85
+ ) : null
86
+ }
87
+ );
88
+ const option = (choice, index) => /* @__PURE__ */ jsxs(Fragment, { children: [
89
+ choice.separatorBefore && index > 0 && /* @__PURE__ */ jsx(
90
+ "wa-divider",
91
+ {
92
+ orientation: "horizontal",
93
+ role: "separator",
94
+ "aria-orientation": "horizontal"
95
+ }
96
+ ),
97
+ /* @__PURE__ */ jsxs(
98
+ "wa-option",
99
+ {
100
+ value: choice.value,
101
+ selected: multiple && values.includes(choice.value),
102
+ children: [
103
+ choice.icon ? icon(choice) : null,
104
+ choice.label
105
+ ]
106
+ }
107
+ )
108
+ ] });
109
+ const groups = [
110
+ ...new Set(
111
+ choices.map((choice) => choice.group).filter((group) => Boolean(group))
112
+ )
113
+ ];
114
+ const ungrouped = choices.filter((choice) => !choice.group);
115
+ return /* @__PURE__ */ jsxs(
116
+ "wa-select",
117
+ {
118
+ size: "m",
119
+ appearance: "outlined",
120
+ placement: "bottom",
121
+ class: `kui-select${renderSelected ? " kui-select--custom-selected" : ""}${fitMenu ? " kui-select--fit-menu" : ""}${!label ? " kui-select--label-hidden" : ""} ${className}`.trim(),
122
+ "data-component": "select",
123
+ "data-presentation": presentation,
124
+ "data-size": size,
125
+ "data-trigger-width": triggerWidth,
126
+ "data-selected-presentation": selectedPresentation,
127
+ "data-focus-ring-owner": focusRingOwner,
128
+ name,
129
+ label: label || ariaLabel,
130
+ "aria-label": ariaLabel,
131
+ multiple,
132
+ value: multiple ? void 0 : values[0],
133
+ placeholder: placeholderText,
134
+ hint,
135
+ disabled,
136
+ style: labelMaxWidth === void 0 ? void 0 : `--kui-select-label-max-width:${labelMaxWidth}px`,
137
+ slot,
138
+ children: [
139
+ iconTrigger && /* @__PURE__ */ jsxs(Fragment, { children: [
140
+ /* @__PURE__ */ jsxs("span", { slot: "label", "data-key": `${name}:trigger-label`, children: [
141
+ label || ariaLabel,
142
+ /* @__PURE__ */ jsx("span", { class: "kui-select__name-summary", "data-morph-skip": true })
143
+ ] }),
144
+ /* @__PURE__ */ jsx(
145
+ "span",
146
+ {
147
+ "data-key": `${name}:trigger-icon`,
148
+ slot: "start",
149
+ class: "kui-select__icon kui-select__icon--selected kui-select__trigger-icon",
150
+ children: triggerIcon
151
+ }
152
+ ),
153
+ chosenCount > 0 && /* @__PURE__ */ jsx(Badge, { slot: "end", tone: "brand", size: "compact", ariaHidden: true, children: chosenCount })
154
+ ] }),
155
+ selected && (renderSelected ? /* @__PURE__ */ jsx(
156
+ "span",
157
+ {
158
+ "data-key": `${name}:${values[0]}:custom-selected`,
159
+ slot: "start",
160
+ class: "kui-select__custom-selected",
161
+ children: /* @__PURE__ */ jsx("span", { class: "kui-select__custom-selected-content", children: renderSelected(selected) })
162
+ }
163
+ ) : selected.icon ? icon(selected, true) : null),
164
+ ungrouped.map(option),
165
+ groups.map((group, index) => /* @__PURE__ */ jsxs(
166
+ "div",
167
+ {
168
+ class: `kui-select__group${index > 0 || ungrouped.length > 0 ? " kui-select__group--separated" : ""}`,
169
+ role: "group",
170
+ "aria-label": group,
171
+ children: [
172
+ /* @__PURE__ */ jsx("span", { class: "kui-select__group-title", children: group }),
173
+ choices.filter((choice) => choice.group === group).map(option)
174
+ ]
175
+ }
176
+ ))
177
+ ]
178
+ }
179
+ );
180
+ }
181
+
182
+ export { Select };
183
+
184
+ //# sourceMappingURL=chunk-WPLIO5WJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/select.tsx"],"names":[],"mappings":";;;;;;AAuHA,SAAS,aAAA,GAAgB;AACvB,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAA,EAAc,aAAA,EAAY,QACrC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0KAAA,EAA2K,CAAA,EACrL,CAAA;AAEJ;AAEO,SAAS,OAA6B,KAAA,EAA2B;AACtE,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,eAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,OAAA,GAAU,KAAA;AAAA,IACV,WAAA,GAAc,KAAA;AAAA,IACd,YAAA,GAAe,MAAA;AAAA,IACf,IAAA,GAAO,SAAA;AAAA,IACP,YAAA;AAAA,IACA,cAAA,GAAiB,QAAA;AAAA,IACjB,aAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,KAAa,IAAA;AACpC,EAAA,MAAM,SAA2B,KAAA,CAAM,QAAA,GAAW,MAAM,KAAA,GAAQ,CAAC,MAAM,KAAK,CAAA;AAC5E,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,QAAA,GAAW,MAAA,GAAY,KAAA,CAAM,cAAA;AAC1D,EAAA,MAAM,oBAAA,GACJ,MAAM,oBAAA,IAAwB,OAAA;AAGhC,EAAA,MAAM,WAAA,GACJ,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,oBAAA,KAAyB,WAAA;AACnD,EAAA,MAAM,WAAA,GAAc,WAAA,GAAc,KAAA,CAAM,WAAA,GAAc,MAAA;AACtD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,QAC9D,gBAAA,EAAe,QAAA;AAAA,QACf,kBAAA,EAAiB,MAAA;AAAA,QACjB,mBAAA,EAAmB,YAAA;AAAA,QACnB,WAAA,EAAW,IAAA;AAAA,QACX,oBAAA,EAAoB,YAAA;AAAA,QACpB,4BAAA,EAA4B,oBAAA;AAAA,QAC5B,uBAAA,EAAuB,cAAA;AAAA,QACvB,WAAA,EAAU,MAAA;AAAA,QACV,KAAA,EACE,aAAA,KAAkB,MAAA,GACd,MAAA,GACA,gCAAgC,aAAa,CAAA,EAAA,CAAA;AAAA,QAEnD,IAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAC7D,IAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,6BAAA;AAAA,cACN,YAAA,EAAY,SAAA;AAAA,cACZ,IAAA,EAAK,KAAA;AAAA,cAEL,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA;AAAA,gCACzB,GAAA,CAAC,UAAK,KAAA,EAAM,iCAAA,EAAkC,eAAY,MAAA,EACxD,QAAA,kBAAA,GAAA,CAAC,iBAAc,CAAA,EACjB;AAAA;AAAA;AAAA,WACF;AAAA,UACC,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,gCAAgC,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA;AAAA,KAC5D;AAAA,EAEJ;AAGA,EAAA,MAAM,QAAA,GAAW,QAAA,GACb,MAAA,GACA,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,KAAA,KAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,WAAA,GAChB,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,MAAA,GAC1D,CAAA;AACJ,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAA6B,YAAA,GAAe,KAAA,qBACxD,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAU,GAAG,IAAI,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA,CAAA,EAAI,YAAA,GAAe,UAAA,GAAa,QAAQ,CAAA,CAAA;AAAA,MACzE,iBAAA,EAAe,IAAA;AAAA,MACf,IAAA,EAAK,OAAA;AAAA,MACL,KAAA,EAAO,CAAA,gBAAA,EAAmB,YAAA,GAAe,6BAAA,GAAgC,EAAE,CAAA,CAAA;AAAA,MAC3E,OAAO,MAAA,CAAO,KAAA,GAAQ,CAAA,MAAA,EAAS,MAAA,CAAO,KAAK,CAAA,CAAA,GAAK,MAAA;AAAA,MAE/C,iBAAO,IAAA,mBACN,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,IAAA,EACE,OAAO,QAAA,IAAY,MAAA,CAAO,MAAM,WAAA,EAAY,CAAE,UAAA,CAAW,GAAA,EAAK,GAAG;AAAA;AAAA,OAErE,GACE;AAAA;AAAA,GACN;AAEF,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,EAA6B,KAAA,qBAC3C,IAAA,CAAA,QAAA,EAAA,EAKG,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,eAAA,IAAmB,QAAQ,CAAA,oBACjC,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAY,YAAA;AAAA,QACZ,IAAA,EAAK,WAAA;AAAA,QACL,kBAAA,EAAiB;AAAA;AAAA,KAClB;AAAA,oBAEH,IAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAA,EAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,QAEjD,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,IAAA,GAAO,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAAA,UAC7B,MAAA,CAAO;AAAA;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEF,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,IAAI,GAAA;AAAA,MACL,OAAA,CACG,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,KAAK,CAAA,CAC5B,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAA,CAAQ,KAAK,CAAC;AAAA;AACtD,GACF;AACA,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,OAAO,KAAK,CAAA;AAQ1D,EAAA,uBACE,IAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,GAAA;AAAA,MACL,UAAA,EAAW,UAAA;AAAA,MACX,SAAA,EAAU,QAAA;AAAA,MACV,OAAO,CAAA,UAAA,EAAa,cAAA,GAAiB,8BAAA,GAAiC,EAAE,GAAG,OAAA,GAAU,uBAAA,GAA0B,EAAE,CAAA,EAAG,CAAC,KAAA,GAAQ,2BAAA,GAA8B,EAAE,CAAA,CAAA,EAAI,SAAS,GAAG,IAAA,EAAK;AAAA,MAClL,gBAAA,EAAe,QAAA;AAAA,MACf,mBAAA,EAAmB,YAAA;AAAA,MACnB,WAAA,EAAW,IAAA;AAAA,MACX,oBAAA,EAAoB,YAAA;AAAA,MACpB,4BAAA,EAA4B,oBAAA;AAAA,MAC5B,uBAAA,EAAuB,cAAA;AAAA,MACvB,IAAA;AAAA,MACA,OAAO,KAAA,IAAS,SAAA;AAAA,MAChB,YAAA,EAAY,SAAA;AAAA,MACZ,QAAA;AAAA,MACA,KAAA,EAAO,QAAA,GAAW,MAAA,GAAY,MAAA,CAAO,CAAC,CAAA;AAAA,MACtC,WAAA,EAAa,eAAA;AAAA,MACb,IAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EACE,aAAA,KAAkB,MAAA,GACd,MAAA,GACA,gCAAgC,aAAa,CAAA,EAAA,CAAA;AAAA,MAEnD,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,WAAA,oBACC,IAAA,CAAA,QAAA,EAAA,EAGE,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,UAAK,IAAA,EAAK,OAAA,EAAQ,UAAA,EAAU,CAAA,EAAG,IAAI,CAAA,cAAA,CAAA,EACjC,QAAA,EAAA;AAAA,YAAA,KAAA,IAAS,SAAA;AAAA,4BACV,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,0BAAA,EAA2B,mBAAe,IAAA,EAAC;AAAA,WAAA,EACzD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,UAAA,EAAU,GAAG,IAAI,CAAA,aAAA,CAAA;AAAA,cACjB,IAAA,EAAK,OAAA;AAAA,cACL,KAAA,EAAM,sEAAA;AAAA,cAEL,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC,WAAA,GAAc,CAAA,oBACb,GAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAK,KAAA,EAAM,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,UAAA,EAAU,IAAA,EACrD,QAAA,EAAA,WAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,QAED,aACE,cAAA,mBACC,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,YAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA,gBAAA,CAAA;AAAA,YAC9B,IAAA,EAAK,OAAA;AAAA,YACL,KAAA,EAAM,6BAAA;AAAA,YAEN,8BAAC,MAAA,EAAA,EAAK,KAAA,EAAM,qCAAA,EACT,QAAA,EAAA,cAAA,CAAe,QAAQ,CAAA,EAC1B;AAAA;AAAA,YAEA,QAAA,CAAS,IAAA,GACX,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA,GACjB,IAAA,CAAA;AAAA,QACL,SAAA,CAAU,IAAI,MAAM,CAAA;AAAA,QACpB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClB,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,oBAAoB,KAAA,GAAQ,CAAA,IAAK,UAAU,MAAA,GAAS,CAAA,GAAI,kCAAkC,EAAE,CAAA,CAAA;AAAA,YACnG,IAAA,EAAK,OAAA;AAAA,YACL,YAAA,EAAY,KAAA;AAAA,YAEZ,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,yBAAA,EAA2B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,cAC5C,OAAA,CAAQ,OAAO,CAAC,MAAA,KAAW,OAAO,KAAA,KAAU,KAAK,CAAA,CAAE,GAAA,CAAI,MAAM;AAAA;AAAA;AAAA,SAEjE;AAAA;AAAA;AAAA,GACH;AAEJ","file":"chunk-WPLIO5WJ.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { Badge } from './badge.js';\nimport { type CssForegroundColor, em } from './css-values.js';\nimport { LucideIcon, type LucideNode } from './lucide-icon.js';\nimport type { KerfUiContent } from './semantic-content.js';\nimport { Skeleton } from './skeleton.js';\n\nexport interface SelectChoice<Value extends string = string> {\n value: Value;\n label: string;\n icon?: LucideNode;\n iconName?: string;\n /**\n * Foreground color for the optional icon: a semantic foreground token such\n * as `uiColor('success-on-quiet')`, or an application-owned\n * `foregroundColorVar('--app-icon-color')`. Fill tokens such as\n * `uiColor('success-fill-quiet')` are pale background tints and do not\n * type-check.\n */\n color?: CssForegroundColor;\n group?: string;\n /**\n * Draw a divider between this choice and the previous choice in the same\n * list. A group boundary is already a separator, so the first choice of a\n * group (or of the whole menu) never draws a second one.\n */\n separatorBefore?: boolean;\n}\n\ntype SelectAccessibleName =\n { label: string; ariaLabel?: string } | { label?: never; ariaLabel: string };\n\nexport type SelectPresentation = 'form' | 'toolbar-borderless' | 'navigation';\nexport type SelectSize = 'default' | 'compact';\nexport type SelectSelectedPresentation = 'label' | 'icon-only';\nexport type SelectFocusRingOwner = 'select' | 'group';\nexport type SelectTriggerWidth = 'fit-content' | 'max-content' | 'fill';\n\ninterface SelectBaseProps<Value extends string = string> {\n name: string;\n choices: readonly SelectChoice<Value>[];\n className?: string;\n /** Empty-value hint text shown in the closed control (the native select placeholder). */\n placeholderText?: string;\n /** Supporting text shown below the control and associated with its combobox. */\n hint?: string;\n disabled?: boolean;\n fitMenu?: boolean;\n /** Render as an unanimated loading skeleton: the label above a static, empty control box. */\n placeholder?: boolean;\n /** Form (default), borderless toolbar, or intrinsic navigation chrome. */\n presentation?: SelectPresentation;\n size?: SelectSize;\n /** Closed trigger width; omit to keep the presentation's default. */\n triggerWidth?: SelectTriggerWidth;\n /** Let an enclosing ToolbarControlGroup paint the composed focus ring. */\n focusRingOwner?: SelectFocusRingOwner;\n /** Maximum closed-control label width in CSS pixels before ellipsis. */\n labelMaxWidth?: number;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** One chosen value (the default). */\nexport interface SelectSingleValueProps<Value extends string = string> {\n multiple?: false;\n value: NoInfer<Value>;\n renderSelected?: (choice: SelectChoice<Value>) => SafeHtml;\n /** Show only the selected choice icon while retaining the Select's accessible name. */\n selectedPresentation?: SelectSelectedPresentation;\n triggerIcon?: never;\n}\n\n/**\n * Any number of chosen values. The popup stays open while the person toggles\n * choices and closes on an outside click, Escape, or focus leaving; the closed\n * control summarizes the chosen labels in choice order.\n */\nexport interface SelectMultipleLabelProps<Value extends string = string> {\n multiple: true;\n value: readonly NoInfer<Value>[];\n renderSelected?: never;\n selectedPresentation?: 'label';\n triggerIcon?: never;\n}\n\n/**\n * A multiple Select drawn as an icon-only toolbar trigger, such as a\n * \"Filter by label\" funnel. No single choice is selected, so the trigger shows\n * a fixed `triggerIcon` naming the menu's purpose; while any choice is chosen\n * a count badge sits beside it, and the combobox's accessible name ends with\n * the chosen labels in choice order.\n */\nexport interface SelectMultipleIconProps<Value extends string = string> {\n multiple: true;\n value: readonly NoInfer<Value>[];\n renderSelected?: never;\n selectedPresentation: 'icon-only';\n /**\n * The trigger's fixed icon, typically a `LucideIcon` naming the menu's\n * purpose (a funnel for a filter), independent of the selection.\n */\n triggerIcon: KerfUiContent;\n}\n\nexport type SelectMultipleValueProps<Value extends string = string> =\n SelectMultipleLabelProps<Value> | SelectMultipleIconProps<Value>;\n\nexport type SelectProps<Value extends string = string> =\n SelectBaseProps<Value> &\n SelectAccessibleName &\n (SelectSingleValueProps<Value> | SelectMultipleValueProps<Value>);\n\n// The closed wa-select's disclosure glyph: Web Awesome's system `chevron-down`,\n// Font Awesome Free 7.0.0 by @fontawesome (https://fontawesome.com), licensed\n// CC BY 4.0 (https://fontawesome.com/license/free). The placeholder draws the\n// same path so the loading box matches the live control without registering\n// Web Awesome.\nfunction SelectChevron() {\n return (\n <svg viewBox=\"0 0 448 512\" aria-hidden=\"true\">\n <path d=\"M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"></path>\n </svg>\n );\n}\n\nexport function Select<Value extends string>(props: SelectProps<Value>) {\n const {\n name,\n label,\n ariaLabel,\n choices,\n className = '',\n placeholderText,\n hint,\n disabled = false,\n fitMenu = false,\n placeholder = false,\n presentation = 'form',\n size = 'default',\n triggerWidth,\n focusRingOwner = 'select',\n labelMaxWidth,\n slot,\n } = props;\n const multiple = props.multiple === true;\n const values: readonly Value[] = props.multiple ? props.value : [props.value];\n const renderSelected = props.multiple ? undefined : props.renderSelected;\n const selectedPresentation: SelectSelectedPresentation =\n props.selectedPresentation ?? 'label';\n // A multiple icon-only trigger shows a fixed icon naming the menu's\n // purpose instead of a selected choice's icon.\n const iconTrigger =\n props.multiple && props.selectedPresentation === 'icon-only';\n const triggerIcon = iconTrigger ? props.triggerIcon : undefined;\n if (placeholder) {\n return (\n <div\n class={`kui-select kui-select--placeholder ${className}`.trim()}\n data-component=\"select\"\n data-placeholder=\"true\"\n data-presentation={presentation}\n data-size={size}\n data-trigger-width={triggerWidth}\n data-selected-presentation={selectedPresentation}\n data-focus-ring-owner={focusRingOwner}\n aria-busy=\"true\"\n style={\n labelMaxWidth === undefined\n ? undefined\n : `--kui-select-label-max-width:${labelMaxWidth}px`\n }\n slot={slot}\n >\n {label && <span class=\"kui-select__placeholder-label\">{label}</span>}\n <span\n class=\"kui-select__placeholder-box\"\n aria-label={ariaLabel}\n role=\"img\"\n >\n <Skeleton width={em(10)} />\n <span class=\"kui-select__placeholder-chevron\" aria-hidden=\"true\">\n <SelectChevron />\n </span>\n </span>\n {hint && <span class=\"kui-select__placeholder-hint\">{hint}</span>}\n </div>\n );\n }\n // A multiple Select summarizes its choices in the display text instead of\n // leading with one selected icon.\n const selected = multiple\n ? undefined\n : choices.find((choice) => choice.value === values[0]);\n const chosenCount = iconTrigger\n ? choices.filter((choice) => values.includes(choice.value)).length\n : 0;\n const icon = (choice: SelectChoice<Value>, selectedIcon = false) => (\n <span\n data-key={`${name}:${choice.value}:${selectedIcon ? 'selected' : 'option'}`}\n data-morph-skip\n slot=\"start\"\n class={`kui-select__icon${selectedIcon ? ' kui-select__icon--selected' : ''}`}\n style={choice.color ? `color:${choice.color}` : undefined}\n >\n {choice.icon ? (\n <LucideIcon\n icon={choice.icon}\n name={\n choice.iconName ?? choice.label.toLowerCase().replaceAll(' ', '-')\n }\n />\n ) : null}\n </span>\n );\n const option = (choice: SelectChoice<Value>, index: number) => (\n <>\n {/* Web Awesome sets the divider's role and aria-orientation on its\n host once, so a template that omits them would lose them to the\n next kerf re-render's morph for good. Render them explicitly, with\n the orientation it reflects (see the wa-select note below). */}\n {choice.separatorBefore && index > 0 && (\n <wa-divider\n orientation=\"horizontal\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n ></wa-divider>\n )}\n <wa-option\n value={choice.value}\n selected={multiple && values.includes(choice.value)}\n >\n {choice.icon ? icon(choice) : null}\n {choice.label}\n </wa-option>\n </>\n );\n const groups = [\n ...new Set(\n choices\n .map((choice) => choice.group)\n .filter((group): group is string => Boolean(group)),\n ),\n ];\n const ungrouped = choices.filter((choice) => !choice.group);\n // Web Awesome names its shadow combobox from the label, not the host's\n // aria-label. Keep ariaLabel-only names available without visible chrome.\n // A multiple Select's value is its selected options (the value attribute\n // holds only one string), kept in sync by @kerfjs/ui/select/register.\n // size/appearance/placement are Web Awesome's defaults, which it reflects\n // onto the host; rendering them keeps a re-render's morph from stripping\n // them and forcing a Lit update to put them back.\n return (\n <wa-select\n size=\"m\"\n appearance=\"outlined\"\n placement=\"bottom\"\n class={`kui-select${renderSelected ? ' kui-select--custom-selected' : ''}${fitMenu ? ' kui-select--fit-menu' : ''}${!label ? ' kui-select--label-hidden' : ''} ${className}`.trim()}\n data-component=\"select\"\n data-presentation={presentation}\n data-size={size}\n data-trigger-width={triggerWidth}\n data-selected-presentation={selectedPresentation}\n data-focus-ring-owner={focusRingOwner}\n name={name}\n label={label || ariaLabel}\n aria-label={ariaLabel}\n multiple={multiple}\n value={multiple ? undefined : values[0]}\n placeholder={placeholderText}\n hint={hint}\n disabled={disabled}\n style={\n labelMaxWidth === undefined\n ? undefined\n : `--kui-select-label-max-width:${labelMaxWidth}px`\n }\n slot={slot}\n >\n {iconTrigger && (\n <>\n {/* The accessible name ends with the chosen labels, which\n @kerfjs/ui/select/register writes into the summary. */}\n <span slot=\"label\" data-key={`${name}:trigger-label`}>\n {label || ariaLabel}\n <span class=\"kui-select__name-summary\" data-morph-skip></span>\n </span>\n <span\n data-key={`${name}:trigger-icon`}\n slot=\"start\"\n class=\"kui-select__icon kui-select__icon--selected kui-select__trigger-icon\"\n >\n {triggerIcon}\n </span>\n {chosenCount > 0 && (\n <Badge slot=\"end\" tone=\"brand\" size=\"compact\" ariaHidden>\n {chosenCount}\n </Badge>\n )}\n </>\n )}\n {selected &&\n (renderSelected ? (\n <span\n data-key={`${name}:${values[0]}:custom-selected`}\n slot=\"start\"\n class=\"kui-select__custom-selected\"\n >\n <span class=\"kui-select__custom-selected-content\">\n {renderSelected(selected)}\n </span>\n </span>\n ) : selected.icon ? (\n icon(selected, true)\n ) : null)}\n {ungrouped.map(option)}\n {groups.map((group, index) => (\n <div\n class={`kui-select__group${index > 0 || ungrouped.length > 0 ? ' kui-select__group--separated' : ''}`}\n role=\"group\"\n aria-label={group}\n >\n <span class=\"kui-select__group-title\">{group}</span>\n {choices.filter((choice) => choice.group === group).map(option)}\n </div>\n ))}\n </wa-select>\n );\n}\n"]}
@@ -11,7 +11,9 @@ function SegmentedControl({
11
11
  shape = "rounded",
12
12
  size = "default",
13
13
  layout = "content",
14
- className = ""
14
+ className = "",
15
+ placeholder = false,
16
+ slot
15
17
  }) {
16
18
  return /* @__PURE__ */ jsx(
17
19
  "div",
@@ -24,23 +26,27 @@ function SegmentedControl({
24
26
  "data-shape": shape,
25
27
  "data-size": size,
26
28
  "data-layout": layout,
29
+ "data-placeholder": placeholder ? "true" : void 0,
27
30
  role: "group",
28
31
  "aria-label": label,
32
+ "aria-busy": placeholder ? "true" : void 0,
33
+ slot,
29
34
  children: choices.map((choice) => {
30
- const selected = choice.value === value;
35
+ const selected = !placeholder && choice.value === value;
31
36
  return /* @__PURE__ */ jsx(
32
37
  "button",
33
38
  {
34
39
  type: "button",
35
40
  class: "kui-segmented-control__item",
36
- "data-action": action,
41
+ "data-action": placeholder ? void 0 : action,
37
42
  "data-segment-value": choice.value,
38
43
  "data-selected": String(selected),
39
44
  "aria-label": choice.label,
40
45
  "aria-pressed": String(selected),
41
- title: choice.title,
42
- disabled: choice.disabled,
43
- tabindex: "0",
46
+ title: placeholder ? void 0 : choice.title,
47
+ disabled: choice.disabled || placeholder,
48
+ tabindex: placeholder ? "-1" : "0",
49
+ "data-kui-disabled": choice.disabled ? "true" : void 0,
44
50
  children: choice.content ?? /* @__PURE__ */ jsx("span", { children: choice.label })
45
51
  }
46
52
  );
@@ -51,4 +57,4 @@ function SegmentedControl({
51
57
 
52
58
  export { SegmentedControl };
53
59
 
54
- //# sourceMappingURL=chunk-TRNBHPNW.js.map
60
+ //# sourceMappingURL=chunk-X5QSICJ3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/segmented-control.tsx"],"names":[],"mappings":";;;AAgCO,SAAS,gBAAA,CAAuC;AAAA,EACrD,EAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,gBAAA;AAAA,EACT,UAAA,GAAa,QAAA;AAAA,EACb,KAAA,GAAQ,SAAA;AAAA,EACR,IAAA,GAAO,SAAA;AAAA,EACP,MAAA,GAAS,SAAA;AAAA,EACT,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,EAAiC;AAC/B,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACjD,gBAAA,EAAe,mBAAA;AAAA,MACf,2BAAA,EAA2B,EAAA;AAAA,MAC3B,YAAA,EAAY,KAAA;AAAA,MACZ,iBAAA,EAAiB,UAAA;AAAA,MACjB,YAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAa,MAAA;AAAA,MACb,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,IAAA,EAAK,OAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAW,cAAc,MAAA,GAAS,MAAA;AAAA,MAClC,IAAA;AAAA,MAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAGvB,QAAA,MAAM,QAAA,GAAW,CAAC,WAAA,IAAe,MAAA,CAAO,KAAA,KAAU,KAAA;AAClD,QAAA,uBACE,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,6BAAA;AAAA,YACN,aAAA,EAAa,cAAc,MAAA,GAAY,MAAA;AAAA,YACvC,sBAAoB,MAAA,CAAO,KAAA;AAAA,YAC3B,eAAA,EAAe,OAAO,QAAQ,CAAA;AAAA,YAC9B,cAAY,MAAA,CAAO,KAAA;AAAA,YACnB,cAAA,EAAc,OAAO,QAAQ,CAAA;AAAA,YAC7B,KAAA,EAAO,WAAA,GAAc,MAAA,GAAY,MAAA,CAAO,KAAA;AAAA,YACxC,QAAA,EAAU,OAAO,QAAA,IAAY,WAAA;AAAA,YAC7B,QAAA,EAAU,cAAc,IAAA,GAAO,GAAA;AAAA,YAC/B,mBAAA,EAAmB,MAAA,CAAO,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,YAE7C,QAAA,EAAA,MAAA,CAAO,OAAA,oBAAW,GAAA,CAAC,MAAA,EAAA,EAAM,iBAAO,KAAA,EAAM;AAAA;AAAA,SACzC;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ","file":"chunk-X5QSICJ3.js","sourcesContent":["import type { KerfUiContent } from './semantic-content.js';\n\nexport type SegmentedControlAppearance = 'filled' | 'outlined' | 'toolbar';\nexport type SegmentedControlShape = 'rounded' | 'pill';\nexport type SegmentedControlSize = 'small' | 'default';\nexport type SegmentedControlLayout = 'content' | 'equal';\n\nexport interface SegmentedControlChoice<Value extends string = string> {\n value: Value;\n label: string;\n content?: KerfUiContent;\n title?: string;\n disabled?: boolean;\n}\n\nexport interface SegmentedControlProps<Value extends string = string> {\n id: string;\n label: string;\n value: NoInfer<Value>;\n choices: readonly SegmentedControlChoice<Value>[];\n action?: string;\n appearance?: SegmentedControlAppearance;\n shape?: SegmentedControlShape;\n size?: SegmentedControlSize;\n layout?: SegmentedControlLayout;\n className?: string;\n /** Render as a loading placeholder: every choice keeps its live label or icon, none is selected, and every segment is disabled. */\n placeholder?: boolean;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport function SegmentedControl<Value extends string>({\n id,\n label,\n value,\n choices,\n action = 'select-segment',\n appearance = 'filled',\n shape = 'rounded',\n size = 'default',\n layout = 'content',\n className = '',\n placeholder = false,\n slot,\n}: SegmentedControlProps<Value>) {\n return (\n <div\n class={`kui-segmented-control ${className}`.trim()}\n data-component=\"segmented-control\"\n data-segmented-control-id={id}\n data-value={value}\n data-appearance={appearance}\n data-shape={shape}\n data-size={size}\n data-layout={layout}\n data-placeholder={placeholder ? 'true' : undefined}\n role=\"group\"\n aria-label={label}\n aria-busy={placeholder ? 'true' : undefined}\n slot={slot}\n >\n {choices.map((choice) => {\n // The choices are known chrome; only the selection is unknown while\n // loading, so a placeholder shows every choice and selects none.\n const selected = !placeholder && choice.value === value;\n return (\n <button\n type=\"button\"\n class=\"kui-segmented-control__item\"\n data-action={placeholder ? undefined : action}\n data-segment-value={choice.value}\n data-selected={String(selected)}\n aria-label={choice.label}\n aria-pressed={String(selected)}\n title={placeholder ? undefined : choice.title}\n disabled={choice.disabled || placeholder}\n tabindex={placeholder ? '-1' : '0'}\n data-kui-disabled={choice.disabled ? 'true' : undefined}\n >\n {choice.content ?? <span>{choice.label}</span>}\n </button>\n );\n })}\n </div>\n );\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import { jsx } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/loading-spinner.tsx
4
+ function LoadingSpinner({
5
+ className = "",
6
+ label,
7
+ slot
8
+ }) {
9
+ const slotAttribute = { slot };
10
+ return /* @__PURE__ */ jsx(
11
+ "svg",
12
+ {
13
+ ...slotAttribute,
14
+ class: `kui-loading-spinner ${className}`.trim(),
15
+ "data-component": "loading-spinner",
16
+ viewBox: "0 0 24 24",
17
+ role: label ? "img" : void 0,
18
+ "aria-label": label,
19
+ "aria-hidden": label ? void 0 : "true",
20
+ children: /* @__PURE__ */ jsx("path", { d: "M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z" })
21
+ }
22
+ );
23
+ }
24
+
25
+ export { LoadingSpinner };
26
+
27
+ //# sourceMappingURL=chunk-ZLWQZUGF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/loading-spinner.tsx"],"names":[],"mappings":";;;AAQO,SAAS,cAAA,CAAe;AAAA,EAC7B,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,aAAA,GAAgB,EAAE,IAAA,EAAK;AAC7B,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,aAAA;AAAA,MACJ,KAAA,EAAO,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC/C,gBAAA,EAAe,iBAAA;AAAA,MACf,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,QAAQ,KAAA,GAAQ,MAAA;AAAA,MACtB,YAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAa,QAAQ,MAAA,GAAY,MAAA;AAAA,MAEjC,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kKAAA,EAAmK;AAAA;AAAA,GAC7K;AAEJ","file":"chunk-ZLWQZUGF.js","sourcesContent":["export interface LoadingSpinnerProps {\n className?: string;\n label?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** Stable viewBox-centered progress ring based on svg-spinners' MIT-licensed 180-ring. */\nexport function LoadingSpinner({\n className = '',\n label,\n slot,\n}: LoadingSpinnerProps) {\n const slotAttribute = { slot };\n return (\n <svg\n {...slotAttribute}\n class={`kui-loading-spinner ${className}`.trim()}\n data-component=\"loading-spinner\"\n viewBox=\"0 0 24 24\"\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : 'true'}\n >\n <path d=\"M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z\"></path>\n </svg>\n );\n}\n"]}