@kerfjs/ui 5.0.0-beta.95 → 5.0.0-beta.96

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 (385) hide show
  1. package/README.md +95 -55
  2. package/ai/component-catalog.json +1328 -94
  3. package/ai/component-composition-rules.json +11 -0
  4. package/ai/component-composition.d.ts +3 -0
  5. package/ai/component-composition.json +955 -23
  6. package/ai/component-composition.schema.json +4 -0
  7. package/ai/components/README.md +12 -0
  8. package/ai/components/badge.md +6 -2
  9. package/ai/components/choice-chips.md +80 -0
  10. package/ai/components/column-track.md +78 -0
  11. package/ai/components/combobox.md +88 -0
  12. package/ai/components/content-item.md +2 -0
  13. package/ai/components/content-swap.md +78 -0
  14. package/ai/components/corner-status.md +88 -0
  15. package/ai/components/document-baseline.md +3 -1
  16. package/ai/components/edge-activity-indicator.md +81 -0
  17. package/ai/components/file-picker.md +88 -0
  18. package/ai/components/foundation.md +1 -1
  19. package/ai/components/framed-list.md +80 -0
  20. package/ai/components/grid.md +2 -1
  21. package/ai/components/icon-button.md +82 -0
  22. package/ai/components/icon-toggle-button.md +80 -0
  23. package/ai/components/list-action-row.md +19 -7
  24. package/ai/components/list-item.md +16 -7
  25. package/ai/components/list.md +5 -2
  26. package/ai/components/nav-stack.md +2 -1
  27. package/ai/components/popup-menu.md +2 -2
  28. package/ai/components/row.md +1 -1
  29. package/ai/components/select.md +2 -1
  30. package/ai/components/split-button.md +80 -0
  31. package/ai/components/split-view.md +1 -1
  32. package/ai/components/state-banner.md +4 -2
  33. package/ai/components/summary-row.md +85 -0
  34. package/ai/components/sunken-panel.md +1 -1
  35. package/ai/components/surface-scaffold.md +8 -2
  36. package/ai/components/text.md +3 -0
  37. package/ai/components/toolbar-control-group.md +4 -2
  38. package/ai/components/toolbar-text.md +1 -0
  39. package/ai/components/toolbar.md +1 -0
  40. package/ai/components/value-table.md +9 -2
  41. package/ai/components/wa-button-group.md +2 -1
  42. package/ai/components/wa-button.md +5 -1
  43. package/ai/public-api-signatures-v1.md +1063 -52
  44. package/ai/skill.md +54 -52
  45. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  46. package/dist/anchored-surface.d.ts +13 -2
  47. package/dist/anchored-surface.js +1 -1
  48. package/dist/app-tab.js +1 -1
  49. package/dist/badge.d.ts +31 -2
  50. package/dist/badge.js +2 -1
  51. package/dist/browser/choice-chips.js +3 -0
  52. package/dist/browser/column-track.js +3 -0
  53. package/dist/browser/combobox.js +3 -0
  54. package/dist/browser/content-swap.js +3 -0
  55. package/dist/browser/corner-status.js +3 -0
  56. package/dist/browser/edge-activity-indicator.js +3 -0
  57. package/dist/browser/file-picker.js +3 -0
  58. package/dist/browser/framed-list.js +3 -0
  59. package/dist/browser/icon-button.js +4 -0
  60. package/dist/browser/icon-toggle-button.js +4 -0
  61. package/dist/browser/list-action-row.js +1 -0
  62. package/dist/browser/split-button.js +5 -0
  63. package/dist/browser/summary-row.js +3 -0
  64. package/dist/catalog-resources.d.ts +1 -0
  65. package/dist/catalog.d.ts +1 -0
  66. package/dist/catalog.js +16 -13
  67. package/dist/catalog.js.map +1 -1
  68. package/dist/chip.d.ts +1 -0
  69. package/dist/choice-chips.d.ts +58 -0
  70. package/dist/choice-chips.js +3 -0
  71. package/dist/choice-chips.js.map +1 -0
  72. package/dist/chunk-2MSPNRWJ.js +82 -0
  73. package/dist/chunk-2MSPNRWJ.js.map +1 -0
  74. package/dist/{chunk-3PO7JEK7.js → chunk-36TL6BCR.js} +18 -4
  75. package/dist/chunk-36TL6BCR.js.map +1 -0
  76. package/dist/{chunk-MORVLMDG.js → chunk-44A6LP54.js} +3 -3
  77. package/dist/chunk-44A6LP54.js.map +1 -0
  78. package/dist/{chunk-7QQ3HE47.js → chunk-4LOK4634.js} +7 -3
  79. package/dist/chunk-4LOK4634.js.map +1 -0
  80. package/dist/chunk-4UB5Z3ZZ.js +68 -0
  81. package/dist/chunk-4UB5Z3ZZ.js.map +1 -0
  82. package/dist/{chunk-PGL6TXFW.js → chunk-6BRRUPJY.js} +6 -2
  83. package/dist/chunk-6BRRUPJY.js.map +1 -0
  84. package/dist/{chunk-KAJVVN7Q.js → chunk-6NOLL5KG.js} +2 -2
  85. package/dist/{chunk-KAJVVN7Q.js.map → chunk-6NOLL5KG.js.map} +1 -1
  86. package/dist/{chunk-IOS2NXW7.js → chunk-76PWEN5Y.js} +13 -2
  87. package/dist/chunk-76PWEN5Y.js.map +1 -0
  88. package/dist/{chunk-B3TROLC2.js → chunk-7IUEBNCO.js} +7 -3
  89. package/dist/chunk-7IUEBNCO.js.map +1 -0
  90. package/dist/{chunk-75YOTZ25.js → chunk-AYHC62OZ.js} +10 -6
  91. package/dist/chunk-AYHC62OZ.js.map +1 -0
  92. package/dist/{chunk-RZYQFGMM.js → chunk-BBU2SPRE.js} +4 -4
  93. package/dist/{chunk-RZYQFGMM.js.map → chunk-BBU2SPRE.js.map} +1 -1
  94. package/dist/{chunk-QCLLBMLA.js → chunk-BU23Z5HZ.js} +37 -12
  95. package/dist/chunk-BU23Z5HZ.js.map +1 -0
  96. package/dist/{chunk-BYHGRKC3.js → chunk-CMLPFIC5.js} +3 -1
  97. package/dist/chunk-CMLPFIC5.js.map +1 -0
  98. package/dist/{chunk-3XPGJUUQ.js → chunk-D5RGM3XA.js} +3 -2
  99. package/dist/chunk-D5RGM3XA.js.map +1 -0
  100. package/dist/chunk-EIET4QLK.js +51 -0
  101. package/dist/chunk-EIET4QLK.js.map +1 -0
  102. package/dist/chunk-ETCWQLJV.js +85 -0
  103. package/dist/chunk-ETCWQLJV.js.map +1 -0
  104. package/dist/chunk-FDZNYD4C.js +138 -0
  105. package/dist/chunk-FDZNYD4C.js.map +1 -0
  106. package/dist/{chunk-XKZPBRU7.js → chunk-FOQK4F3L.js} +25 -5
  107. package/dist/chunk-FOQK4F3L.js.map +1 -0
  108. package/dist/{chunk-FL6J644M.js → chunk-GJYQ27C2.js} +4 -2
  109. package/dist/chunk-GJYQ27C2.js.map +1 -0
  110. package/dist/{chunk-DL55BSQX.js → chunk-GZE2XVKC.js} +8 -1
  111. package/dist/chunk-GZE2XVKC.js.map +1 -0
  112. package/dist/{chunk-YP2G67S7.js → chunk-HO6FU3G7.js} +2 -2
  113. package/dist/{chunk-YP2G67S7.js.map → chunk-HO6FU3G7.js.map} +1 -1
  114. package/dist/{chunk-3DXHNLME.js → chunk-IGTWXPTN.js} +25 -8
  115. package/dist/chunk-IGTWXPTN.js.map +1 -0
  116. package/dist/chunk-IKS72C6P.js +53 -0
  117. package/dist/chunk-IKS72C6P.js.map +1 -0
  118. package/dist/chunk-JYD7G4RG.js +130 -0
  119. package/dist/chunk-JYD7G4RG.js.map +1 -0
  120. package/dist/{chunk-LAZLBC2Q.js → chunk-KH4KEMSP.js} +33 -2
  121. package/dist/chunk-KH4KEMSP.js.map +1 -0
  122. package/dist/chunk-LL45C7BB.js +122 -0
  123. package/dist/chunk-LL45C7BB.js.map +1 -0
  124. package/dist/chunk-M2NRCFRO.js +45 -0
  125. package/dist/chunk-M2NRCFRO.js.map +1 -0
  126. package/dist/chunk-MJ5RU6XT.js +173 -0
  127. package/dist/chunk-MJ5RU6XT.js.map +1 -0
  128. package/dist/{chunk-GIUOXAVL.js → chunk-P74VXMB6.js} +39 -19
  129. package/dist/chunk-P74VXMB6.js.map +1 -0
  130. package/dist/{chunk-TKDDTLG5.js → chunk-PBT3CPPY.js} +31 -3
  131. package/dist/chunk-PBT3CPPY.js.map +1 -0
  132. package/dist/chunk-PRG4CL3Q.js +88 -0
  133. package/dist/chunk-PRG4CL3Q.js.map +1 -0
  134. package/dist/chunk-QH5KOFNS.js +39 -0
  135. package/dist/chunk-QH5KOFNS.js.map +1 -0
  136. package/dist/{chunk-CD5TOO22.js → chunk-QIAPOWHH.js} +2 -2
  137. package/dist/{chunk-CD5TOO22.js.map → chunk-QIAPOWHH.js.map} +1 -1
  138. package/dist/chunk-QQ3TTWFH.js +29 -0
  139. package/dist/chunk-QQ3TTWFH.js.map +1 -0
  140. package/dist/chunk-QYMJHS4K.js +36 -0
  141. package/dist/chunk-QYMJHS4K.js.map +1 -0
  142. package/dist/chunk-R42D2BAO.js +44 -0
  143. package/dist/chunk-R42D2BAO.js.map +1 -0
  144. package/dist/chunk-S2XULQEK.js +52 -0
  145. package/dist/chunk-S2XULQEK.js.map +1 -0
  146. package/dist/{chunk-NMWDHZVM.js → chunk-S4Y3YTAI.js} +2 -2
  147. package/dist/{chunk-NMWDHZVM.js.map → chunk-S4Y3YTAI.js.map} +1 -1
  148. package/dist/{chunk-O27D24CA.js → chunk-TDMHA7C3.js} +3 -2
  149. package/dist/chunk-TDMHA7C3.js.map +1 -0
  150. package/dist/chunk-U6QYTMDB.js +85 -0
  151. package/dist/chunk-U6QYTMDB.js.map +1 -0
  152. package/dist/{chunk-QQICWWNX.js → chunk-V6W56V3N.js} +18 -7
  153. package/dist/chunk-V6W56V3N.js.map +1 -0
  154. package/dist/chunk-W4IK7AWD.js +73 -0
  155. package/dist/chunk-W4IK7AWD.js.map +1 -0
  156. package/dist/{chunk-TNG3XKHB.js → chunk-Y3LC7JQO.js} +26 -8
  157. package/dist/chunk-Y3LC7JQO.js.map +1 -0
  158. package/dist/chunk-YWQGSUF2.js +84 -0
  159. package/dist/chunk-YWQGSUF2.js.map +1 -0
  160. package/dist/{chunk-MTCTX25G.js → chunk-YXOMI7ES.js} +1 -1
  161. package/dist/chunk-YXOMI7ES.js.map +1 -0
  162. package/dist/chunk-ZKKO4MHC.js +25 -0
  163. package/dist/chunk-ZKKO4MHC.js.map +1 -0
  164. package/dist/collapsible-panel.d.ts +10 -3
  165. package/dist/collapsible-panel.js +8 -5
  166. package/dist/collapsible-panel.js.map +1 -1
  167. package/dist/column-track.d.ts +41 -0
  168. package/dist/column-track.js +4 -0
  169. package/dist/column-track.js.map +1 -0
  170. package/dist/combobox.d.ts +40 -0
  171. package/dist/combobox.js +3 -0
  172. package/dist/combobox.js.map +1 -0
  173. package/dist/content-item.d.ts +21 -4
  174. package/dist/content-item.js +1 -1
  175. package/dist/content-swap.d.ts +34 -0
  176. package/dist/content-swap.js +3 -0
  177. package/dist/content-swap.js.map +1 -0
  178. package/dist/corner-status.d.ts +36 -0
  179. package/dist/corner-status.js +3 -0
  180. package/dist/corner-status.js.map +1 -0
  181. package/dist/edge-activity-indicator.d.ts +28 -0
  182. package/dist/edge-activity-indicator.js +3 -0
  183. package/dist/edge-activity-indicator.js.map +1 -0
  184. package/dist/extension-attributes-mu8MFUl0.d.ts +13 -0
  185. package/dist/file-picker.d.ts +47 -0
  186. package/dist/file-picker.js +3 -0
  187. package/dist/file-picker.js.map +1 -0
  188. package/dist/framed-list.d.ts +47 -0
  189. package/dist/framed-list.js +4 -0
  190. package/dist/framed-list.js.map +1 -0
  191. package/dist/grid.js +1 -1
  192. package/dist/help-tags-register.js +1 -1
  193. package/dist/icon-button.d.ts +46 -0
  194. package/dist/icon-button.js +6 -0
  195. package/dist/icon-button.js.map +1 -0
  196. package/dist/icon-toggle-button.d.ts +42 -0
  197. package/dist/icon-toggle-button.js +6 -0
  198. package/dist/icon-toggle-button.js.map +1 -0
  199. package/dist/index.d.ts +23 -6
  200. package/dist/index.js +44 -27
  201. package/dist/list-action-row.d.ts +47 -10
  202. package/dist/list-action-row.js +2 -1
  203. package/dist/list-header.js +1 -1
  204. package/dist/list-inset-text.js +1 -1
  205. package/dist/list-item.d.ts +10 -2
  206. package/dist/list-item.js +1 -1
  207. package/dist/list.d.ts +37 -5
  208. package/dist/list.js +1 -1
  209. package/dist/nav-stack.d.ts +1 -0
  210. package/dist/nav-stack.js +2 -1
  211. package/dist/pane.js +2 -1
  212. package/dist/popup-menu-register.js +18 -1
  213. package/dist/popup-menu-register.js.map +1 -1
  214. package/dist/popup-menu.d.ts +28 -3
  215. package/dist/popup-menu.js +1 -1
  216. package/dist/row.d.ts +6 -2
  217. package/dist/row.js +1 -1
  218. package/dist/select-register.js +1 -1
  219. package/dist/select.js +2 -1
  220. package/dist/split-button.d.ts +57 -0
  221. package/dist/split-button.js +7 -0
  222. package/dist/split-button.js.map +1 -0
  223. package/dist/split-view.d.ts +20 -2
  224. package/dist/split-view.js +22 -1
  225. package/dist/split-view.js.map +1 -1
  226. package/dist/state-banner.d.ts +17 -2
  227. package/dist/state-banner.js +2 -1
  228. package/dist/styles/badge.css +27 -0
  229. package/dist/styles/catalog/components/catalog-example.css +7 -3
  230. package/dist/styles/choice-chips.css +154 -0
  231. package/dist/styles/column-track.css +57 -0
  232. package/dist/styles/combobox.css +113 -0
  233. package/dist/styles/components/actions/icon-button/icon-button.css +22 -0
  234. package/dist/styles/components/actions/icon-toggle-button/icon-toggle-button.css +83 -0
  235. package/dist/styles/components/actions/popup-menu/popup-menu.css +69 -1
  236. package/dist/styles/components/actions/split-button/split-button.css +95 -0
  237. package/dist/styles/components/actions/toolbar/toolbar.css +16 -9
  238. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +144 -48
  239. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +23 -0
  240. package/dist/styles/components/collections/framed-list/framed-list.css +47 -0
  241. package/dist/styles/components/collections/list/list.css +44 -0
  242. package/dist/styles/components/collections/list-action-row/list-action-row.css +39 -0
  243. package/dist/styles/components/collections/list-item/list-item.css +45 -0
  244. package/dist/styles/components/collections/summary-row/summary-row.css +161 -0
  245. package/dist/styles/components/data-display/value-table/value-table.css +76 -0
  246. package/dist/styles/components/feedback/badge/badge.css +27 -0
  247. package/dist/styles/components/feedback/corner-status/corner-status.css +60 -0
  248. package/dist/styles/components/feedback/edge-activity-indicator/edge-activity-indicator.css +127 -0
  249. package/dist/styles/components/feedback/state-banner/state-banner.css +38 -0
  250. package/dist/styles/components/forms/choice-chips/choice-chips.css +154 -0
  251. package/dist/styles/components/forms/combobox/combobox.css +113 -0
  252. package/dist/styles/components/forms/file-picker/file-picker.css +81 -0
  253. package/dist/styles/components/forms/token-search-field/token-search-field.css +12 -1
  254. package/dist/styles/components/layout/column-track/column-track.css +57 -0
  255. package/dist/styles/components/layout/content-swap/content-swap.css +154 -0
  256. package/dist/styles/components/layout/pane/pane.css +2 -8
  257. package/dist/styles/components/layout/workbench/workbench.css +2 -8
  258. package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +1 -4
  259. package/dist/styles/components/surfaces/content-item/content-item.css +18 -0
  260. package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +1 -4
  261. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +119 -0
  262. package/dist/styles/components/typography/text/text.css +62 -0
  263. package/dist/styles/content-item.css +18 -0
  264. package/dist/styles/content-swap.css +154 -0
  265. package/dist/styles/corner-status.css +60 -0
  266. package/dist/styles/document.css +65 -0
  267. package/dist/styles/edge-activity-indicator.css +127 -0
  268. package/dist/styles/file-picker.css +81 -0
  269. package/dist/styles/foundation.css +8 -0
  270. package/dist/styles/framed-list.css +47 -0
  271. package/dist/styles/icon-button.css +22 -0
  272. package/dist/styles/icon-toggle-button.css +83 -0
  273. package/dist/styles/list-action-row.css +39 -0
  274. package/dist/styles/list-item.css +45 -0
  275. package/dist/styles/list.css +44 -0
  276. package/dist/styles/pane.css +2 -8
  277. package/dist/styles/popup-menu.css +69 -1
  278. package/dist/styles/split-button.css +95 -0
  279. package/dist/styles/state-banner.css +38 -0
  280. package/dist/styles/styles.css +12 -0
  281. package/dist/styles/summary-row.css +161 -0
  282. package/dist/styles/sunken-panel.css +1 -4
  283. package/dist/styles/surface-scaffold.css +119 -0
  284. package/dist/styles/tab-navigator.css +1 -4
  285. package/dist/styles/text.css +62 -0
  286. package/dist/styles/token-search-field.css +12 -1
  287. package/dist/styles/toolbar-control-group.css +144 -48
  288. package/dist/styles/toolbar-text.css +23 -0
  289. package/dist/styles/toolbar.css +16 -9
  290. package/dist/styles/value-table.css +76 -0
  291. package/dist/styles/webawesome.css +4 -4
  292. package/dist/styles/workbench.css +2 -8
  293. package/dist/summary-row.d.ts +56 -0
  294. package/dist/summary-row.js +4 -0
  295. package/dist/summary-row.js.map +1 -0
  296. package/dist/sunken-panel.d.ts +8 -1
  297. package/dist/sunken-panel.js +2 -1
  298. package/dist/surface-scaffold-register.js +7 -1
  299. package/dist/surface-scaffold-register.js.map +1 -1
  300. package/dist/surface-scaffold.d.ts +75 -2
  301. package/dist/surface-scaffold.js +2 -1
  302. package/dist/tab-navigator.js +4 -1
  303. package/dist/tab-navigator.js.map +1 -1
  304. package/dist/text.d.ts +39 -4
  305. package/dist/text.js +1 -1
  306. package/dist/toolbar-control-group.d.ts +8 -1
  307. package/dist/toolbar-control-group.js +1 -1
  308. package/dist/toolbar-text.d.ts +14 -1
  309. package/dist/toolbar-text.js +1 -1
  310. package/dist/toolbar.d.ts +14 -3
  311. package/dist/toolbar.js +1 -1
  312. package/dist/value-table.d.ts +20 -2
  313. package/dist/value-table.js +1 -1
  314. package/dist/wire-catalog.d.ts +1 -0
  315. package/dist/wire-comboboxes.d.ts +26 -0
  316. package/dist/wire-comboboxes.js +3 -0
  317. package/dist/wire-comboboxes.js.map +1 -0
  318. package/dist/wire-corner-status.d.ts +11 -0
  319. package/dist/wire-corner-status.js +3 -0
  320. package/dist/wire-corner-status.js.map +1 -0
  321. package/dist/wire-file-pickers.d.ts +26 -0
  322. package/dist/wire-file-pickers.js +3 -0
  323. package/dist/wire-file-pickers.js.map +1 -0
  324. package/dist/wire-list-reorder.d.ts +41 -0
  325. package/dist/wire-list-reorder.js +3 -0
  326. package/dist/wire-list-reorder.js.map +1 -0
  327. package/dist/wire-token-search-fields.js +1 -1
  328. package/dist/workbench.d.ts +1 -0
  329. package/dist/workbench.js +2 -1
  330. package/docs/accessibility.md +45 -2
  331. package/docs/anchored-surface.md +15 -7
  332. package/docs/app-layouts.md +2 -1
  333. package/docs/component-contract.md +26 -6
  334. package/docs/component-selection.md +149 -13
  335. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  336. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  337. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  338. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  339. package/docs/design/templates/choice-chips-dark.svg +1 -0
  340. package/docs/design/templates/choice-chips.svg +1 -0
  341. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  342. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  343. package/docs/design/templates/list-action-row-dark.svg +1 -1
  344. package/docs/design/templates/list-action-row.svg +1 -1
  345. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  346. package/docs/design/templates/state-banner/strip.svg +1 -0
  347. package/docs/design/templates/state-banner-dark.svg +1 -1
  348. package/docs/design/templates/state-banner.svg +1 -1
  349. package/docs/design/templates.md +1 -1
  350. package/docs/document-baseline.md +51 -0
  351. package/docs/layout.md +52 -1
  352. package/docs/split-view.md +20 -2
  353. package/docs/sunken-panel.md +13 -0
  354. package/docs/surface-scaffold.md +66 -1
  355. package/docs/ux-demo.md +1 -0
  356. package/docs/webawesome-theme.md +6 -2
  357. package/llms.txt +125 -16
  358. package/package.json +89 -1
  359. package/dist/chunk-3DXHNLME.js.map +0 -1
  360. package/dist/chunk-3PO7JEK7.js.map +0 -1
  361. package/dist/chunk-3XPGJUUQ.js.map +0 -1
  362. package/dist/chunk-4Y4L5YEI.js +0 -66
  363. package/dist/chunk-4Y4L5YEI.js.map +0 -1
  364. package/dist/chunk-75YOTZ25.js.map +0 -1
  365. package/dist/chunk-7QQ3HE47.js.map +0 -1
  366. package/dist/chunk-A7DYEERU.js +0 -59
  367. package/dist/chunk-A7DYEERU.js.map +0 -1
  368. package/dist/chunk-B3TROLC2.js.map +0 -1
  369. package/dist/chunk-BYHGRKC3.js.map +0 -1
  370. package/dist/chunk-DL55BSQX.js.map +0 -1
  371. package/dist/chunk-FL6J644M.js.map +0 -1
  372. package/dist/chunk-GIUOXAVL.js.map +0 -1
  373. package/dist/chunk-IOS2NXW7.js.map +0 -1
  374. package/dist/chunk-J3AWE5I4.js +0 -50
  375. package/dist/chunk-J3AWE5I4.js.map +0 -1
  376. package/dist/chunk-LAZLBC2Q.js.map +0 -1
  377. package/dist/chunk-MORVLMDG.js.map +0 -1
  378. package/dist/chunk-MTCTX25G.js.map +0 -1
  379. package/dist/chunk-O27D24CA.js.map +0 -1
  380. package/dist/chunk-PGL6TXFW.js.map +0 -1
  381. package/dist/chunk-QCLLBMLA.js.map +0 -1
  382. package/dist/chunk-QQICWWNX.js.map +0 -1
  383. package/dist/chunk-TKDDTLG5.js.map +0 -1
  384. package/dist/chunk-TNG3XKHB.js.map +0 -1
  385. package/dist/chunk-XKZPBRU7.js.map +0 -1
@@ -0,0 +1,130 @@
1
+ import { filterDataAttributes } from './chunk-KH4KEMSP.js';
2
+ import { jsx } from 'kerfjs/jsx-runtime';
3
+
4
+ var DIALOG_SURFACE_PROTECTED = /* @__PURE__ */ new Set([
5
+ "data-component",
6
+ "data-size",
7
+ "data-presentation",
8
+ "data-preferred-width",
9
+ "data-body-inset",
10
+ "data-footer-inset",
11
+ "data-viewport-gutter",
12
+ "data-max-height",
13
+ "data-height",
14
+ "data-body-layout"
15
+ ]);
16
+ function DialogSurface({
17
+ children,
18
+ size = "medium",
19
+ presentation = "modal",
20
+ preferredWidth,
21
+ bodyInset = "compact",
22
+ footerInset = "comfortable",
23
+ viewportGutter,
24
+ maxHeight,
25
+ height,
26
+ bodyLayout = "flow",
27
+ rootAttributes = {},
28
+ className = "",
29
+ slot
30
+ }) {
31
+ const style = [
32
+ preferredWidth === void 0 ? "" : `--_kui-dialog-surface-preferred-width:${preferredWidth}`,
33
+ viewportGutter === void 0 ? "" : `--_kui-dialog-surface-gutter:${viewportGutter}`,
34
+ maxHeight === void 0 || maxHeight === "viewport" ? "" : `--_kui-dialog-surface-max-height:${maxHeight}`,
35
+ height === void 0 || height === "viewport" ? "" : `--_kui-dialog-surface-height:${height}`
36
+ ].filter(Boolean).join(";");
37
+ return /* @__PURE__ */ jsx(
38
+ "div",
39
+ {
40
+ ...filterDataAttributes(rootAttributes, DIALOG_SURFACE_PROTECTED),
41
+ class: `kui-dialog-surface ${className}`.trim(),
42
+ "data-component": "dialog-surface",
43
+ "data-size": size,
44
+ "data-presentation": presentation,
45
+ "data-preferred-width": preferredWidth === void 0 ? void 0 : "",
46
+ "data-body-inset": bodyInset,
47
+ "data-footer-inset": footerInset,
48
+ "data-viewport-gutter": viewportGutter === void 0 ? void 0 : "",
49
+ "data-max-height": maxHeight === void 0 ? void 0 : "",
50
+ "data-height": height === void 0 ? void 0 : "",
51
+ "data-body-layout": bodyLayout === "fill" ? "fill" : void 0,
52
+ style: style || void 0,
53
+ slot,
54
+ children
55
+ }
56
+ );
57
+ }
58
+ var POPOVER_DIALOG_PROTECTED = /* @__PURE__ */ new Set([
59
+ "data-component",
60
+ "data-presentation",
61
+ "data-size",
62
+ "data-height",
63
+ "data-max-height",
64
+ "data-body-layout"
65
+ ]);
66
+ function PopoverDialogSurface({
67
+ id,
68
+ children,
69
+ label,
70
+ labelledBy,
71
+ presentation = "overlay",
72
+ size = "medium",
73
+ preferredWidth,
74
+ height,
75
+ maxHeight,
76
+ viewportGutter,
77
+ bodyLayout = "flow",
78
+ rootAttributes = {},
79
+ className = "",
80
+ slot
81
+ }) {
82
+ const style = [
83
+ preferredWidth === void 0 ? "" : `--_kui-popover-dialog-surface-preferred-width:${preferredWidth}`,
84
+ viewportGutter === void 0 ? "" : `--_kui-popover-dialog-surface-gutter:${viewportGutter}`,
85
+ height === void 0 || height === "viewport" ? "" : `--_kui-popover-dialog-surface-height:${height}`,
86
+ maxHeight === void 0 || maxHeight === "viewport" ? "" : `--_kui-popover-dialog-surface-max-height:${maxHeight}`
87
+ ].filter(Boolean).join(";");
88
+ return /* @__PURE__ */ jsx(
89
+ "section",
90
+ {
91
+ ...filterDataAttributes(rootAttributes, POPOVER_DIALOG_PROTECTED),
92
+ id,
93
+ class: `kui-popover-dialog-surface ${className}`.trim(),
94
+ "data-component": "popover-dialog-surface",
95
+ "data-presentation": presentation,
96
+ "data-size": size,
97
+ "data-height": height === void 0 ? void 0 : "",
98
+ "data-max-height": maxHeight === void 0 ? void 0 : "",
99
+ "data-body-layout": bodyLayout === "fill" ? "fill" : void 0,
100
+ popover: presentation === "overlay" ? "auto" : void 0,
101
+ role: "dialog",
102
+ "aria-label": label,
103
+ "aria-labelledby": labelledBy,
104
+ style: style || void 0,
105
+ slot,
106
+ children
107
+ }
108
+ );
109
+ }
110
+ function PopupSurface({
111
+ children,
112
+ inset = "standard",
113
+ className = "",
114
+ slot
115
+ }) {
116
+ return /* @__PURE__ */ jsx(
117
+ "span",
118
+ {
119
+ class: `kui-popup-surface ${className}`.trim(),
120
+ "data-component": "popup-surface",
121
+ "data-inset": inset,
122
+ slot,
123
+ children
124
+ }
125
+ );
126
+ }
127
+
128
+ export { DialogSurface, PopoverDialogSurface, PopupSurface };
129
+
130
+ //# sourceMappingURL=chunk-JYD7G4RG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/surfaces/surface-scaffold/surface-scaffold.tsx"],"names":[],"mappings":"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","file":"chunk-JYD7G4RG.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport type { CssLength } from '../../../shared/styles/css-values.js';\n\nexport type DialogSurfaceSize = 'small' | 'medium' | 'large';\nexport type DialogSurfacePresentation = 'modal' | 'side-sheet' | 'fullscreen';\nexport type SurfaceInset = 'none' | 'compact' | 'comfortable';\nexport type DialogSurfaceMaxHeight = CssLength | 'viewport';\n/** A definite modal height: a length or the full viewport, minus both gutters. */\nexport type DialogSurfaceHeight = CssLength | 'viewport';\n/**\n * How the dialog body lays out its children: `flow` (default) scrolls ordinary\n * content in the body; `fill` gives one child the body's whole height and\n * lets it own scrolling (a SplitView, a Pane, an editor).\n */\nexport type DialogSurfaceBodyLayout = 'flow' | 'fill';\n\n/**\n * Application `data-*` identity on the DialogSurface root, such as\n * `data-key`; the surface's own configuration attributes stay protected.\n */\nexport type DialogSurfaceRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined>\n>;\n\nconst DIALOG_SURFACE_PROTECTED = new Set([\n 'data-component',\n 'data-size',\n 'data-presentation',\n 'data-preferred-width',\n 'data-body-inset',\n 'data-footer-inset',\n 'data-viewport-gutter',\n 'data-max-height',\n 'data-height',\n 'data-body-layout',\n]);\n\nexport interface DialogSurfaceProps {\n children: KerfUiContent;\n size?: DialogSurfaceSize;\n presentation?: DialogSurfacePresentation;\n /** Modal preferred width. Takes precedence over size, within the viewport cap. */\n preferredWidth?: CssLength;\n bodyInset?: SurfaceInset;\n footerInset?: SurfaceInset;\n /** Modal edge clearance. Omit to retain Web Awesome's default viewport cap. */\n viewportGutter?: CssLength;\n /** Modal height cap, bounded by the dynamic viewport minus both gutters. */\n maxHeight?: DialogSurfaceMaxHeight;\n /**\n * Modal definite height, bounded the same way, so a filling child has a\n * height to fill. Takes precedence over `maxHeight`.\n */\n height?: DialogSurfaceHeight;\n /** Body layout (default `flow`); `fill` lets one child own the body. */\n bodyLayout?: DialogSurfaceBodyLayout;\n /**\n * Safe `data-*` identity on the root. Give sibling dialogs distinct\n * `data-key`s so a re-render morphs each surface into itself instead of\n * reusing one dialog's element for another (structurally identical roots\n * are otherwise matched by position).\n */\n rootAttributes?: DialogSurfaceRootAttributes;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** Configure recurring Web Awesome dialog geometry without consumer ::part() CSS. */\nexport function DialogSurface({\n children,\n size = 'medium',\n presentation = 'modal',\n preferredWidth,\n bodyInset = 'compact',\n footerInset = 'comfortable',\n viewportGutter,\n maxHeight,\n height,\n bodyLayout = 'flow',\n rootAttributes = {},\n className = '',\n slot,\n}: DialogSurfaceProps) {\n const style = [\n preferredWidth === undefined\n ? ''\n : `--_kui-dialog-surface-preferred-width:${preferredWidth}`,\n viewportGutter === undefined\n ? ''\n : `--_kui-dialog-surface-gutter:${viewportGutter}`,\n maxHeight === undefined || maxHeight === 'viewport'\n ? ''\n : `--_kui-dialog-surface-max-height:${maxHeight}`,\n height === undefined || height === 'viewport'\n ? ''\n : `--_kui-dialog-surface-height:${height}`,\n ]\n .filter(Boolean)\n .join(';');\n return (\n <div\n {...filterDataAttributes(rootAttributes, DIALOG_SURFACE_PROTECTED)}\n class={`kui-dialog-surface ${className}`.trim()}\n data-component=\"dialog-surface\"\n data-size={size}\n data-presentation={presentation}\n data-preferred-width={preferredWidth === undefined ? undefined : ''}\n data-body-inset={bodyInset}\n data-footer-inset={footerInset}\n data-viewport-gutter={viewportGutter === undefined ? undefined : ''}\n data-max-height={maxHeight === undefined ? undefined : ''}\n data-height={height === undefined ? undefined : ''}\n data-body-layout={bodyLayout === 'fill' ? 'fill' : undefined}\n style={style || undefined}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n\n/** Where a PopoverDialogSurface appears: the top layer, or in flow. */\nexport type PopoverDialogSurfacePresentation = 'overlay' | 'embedded';\n\n/** Application `data-*` metadata on the surface root. */\nexport type PopoverDialogSurfaceDataAttributes = Readonly<\n Record<`data-${string}`, string>\n>;\n\ntype PopoverDialogSurfaceName =\n { label: string; labelledBy?: never } | { label?: never; labelledBy: string };\n\nexport type PopoverDialogSurfaceProps = PopoverDialogSurfaceName & {\n /** The root id: what an opening control's `popovertarget` names. */\n id?: string;\n children: KerfUiContent;\n /**\n * `overlay` (default) is a native `popover=\"auto\"` in the top layer:\n * non-modal, light dismiss (Escape or a press outside), nothing inert.\n * `embedded` renders the same surface in flow for a catalog or inline use.\n */\n presentation?: PopoverDialogSurfacePresentation;\n /** Preferred width preset: 400px, 560px (default), or 800px. */\n size?: DialogSurfaceSize;\n /** Preferred width; takes precedence over `size`, within the viewport cap. */\n preferredWidth?: CssLength;\n /** Definite height, bounded by the dynamic viewport minus both gutters. */\n height?: DialogSurfaceHeight;\n /** Height cap, bounded the same way, for a surface that sizes to content. */\n maxHeight?: DialogSurfaceMaxHeight;\n /** Edge clearance on each side of the viewport (default 16px). */\n viewportGutter?: CssLength;\n /** Body layout (default `flow`); `fill` lets one child own the surface. */\n bodyLayout?: DialogSurfaceBodyLayout;\n rootAttributes?: PopoverDialogSurfaceDataAttributes;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n};\n\nconst POPOVER_DIALOG_PROTECTED = new Set([\n 'data-component',\n 'data-presentation',\n 'data-size',\n 'data-height',\n 'data-max-height',\n 'data-body-layout',\n]);\n\n/**\n * A non-modal dialog surface on the native Popover API: Kerf's dialog chrome,\n * viewport-bounded size, and single-child fill without application CSS.\n * Open it with a `popovertarget` control or `showPopover()`; it light\n * dismisses and leaves the page interactive. Use `DialogSurface` with\n * `wa-dialog` when the task must block the page.\n */\nexport function PopoverDialogSurface({\n id,\n children,\n label,\n labelledBy,\n presentation = 'overlay',\n size = 'medium',\n preferredWidth,\n height,\n maxHeight,\n viewportGutter,\n bodyLayout = 'flow',\n rootAttributes = {},\n className = '',\n slot,\n}: PopoverDialogSurfaceProps) {\n const style = [\n preferredWidth === undefined\n ? ''\n : `--_kui-popover-dialog-surface-preferred-width:${preferredWidth}`,\n viewportGutter === undefined\n ? ''\n : `--_kui-popover-dialog-surface-gutter:${viewportGutter}`,\n height === undefined || height === 'viewport'\n ? ''\n : `--_kui-popover-dialog-surface-height:${height}`,\n maxHeight === undefined || maxHeight === 'viewport'\n ? ''\n : `--_kui-popover-dialog-surface-max-height:${maxHeight}`,\n ]\n .filter(Boolean)\n .join(';');\n return (\n <section\n {...filterDataAttributes(rootAttributes, POPOVER_DIALOG_PROTECTED)}\n id={id}\n class={`kui-popover-dialog-surface ${className}`.trim()}\n data-component=\"popover-dialog-surface\"\n data-presentation={presentation}\n data-size={size}\n data-height={height === undefined ? undefined : ''}\n data-max-height={maxHeight === undefined ? undefined : ''}\n data-body-layout={bodyLayout === 'fill' ? 'fill' : undefined}\n popover={presentation === 'overlay' ? 'auto' : undefined}\n role=\"dialog\"\n aria-label={label}\n aria-labelledby={labelledBy}\n style={style || undefined}\n slot={slot}\n >\n {children}\n </section>\n );\n}\n\nexport type PopupSurfaceInset = 'standard' | 'compact' | 'list-zero';\n\nexport interface PopupSurfaceProps {\n children: KerfUiContent;\n inset?: PopupSurfaceInset;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** Configure recurring Web Awesome dropdown-menu geometry without consumer ::part() CSS. */\nexport function PopupSurface({\n children,\n inset = 'standard',\n className = '',\n slot,\n}: PopupSurfaceProps) {\n return (\n <span\n class={`kui-popup-surface ${className}`.trim()}\n data-component=\"popup-surface\"\n data-inset={inset}\n slot={slot}\n >\n {children}\n </span>\n );\n}\n"]}
@@ -19,6 +19,37 @@ function filterDataAttributes(attributes, protectedNames) {
19
19
  }
20
20
  return filtered;
21
21
  }
22
+ var ARIA_ATTRIBUTE_NAME = /^aria-[a-z]+$/;
23
+ var STRUCTURAL_ROOT_ROLES = [
24
+ "region",
25
+ "group",
26
+ "list",
27
+ "feed",
28
+ "log",
29
+ "status",
30
+ "note",
31
+ "article",
32
+ "navigation",
33
+ "complementary",
34
+ "search",
35
+ "form",
36
+ "presentation",
37
+ "none"
38
+ ];
39
+ var STRUCTURAL_ROLES = new Set(STRUCTURAL_ROOT_ROLES);
40
+ function filterRootAttributes(attributes, protectedNames) {
41
+ const filtered = filterDataAttributes(attributes, protectedNames);
42
+ for (const [name, value] of Object.entries(attributes)) {
43
+ const normalizedName = name.toLowerCase();
44
+ if (typeof value !== "string" || protectedNames.has(normalizedName))
45
+ continue;
46
+ if (ARIA_ATTRIBUTE_NAME.test(normalizedName))
47
+ filtered[normalizedName] = value;
48
+ else if (normalizedName === "role" && STRUCTURAL_ROLES.has(value))
49
+ filtered.role = value;
50
+ }
51
+ return filtered;
52
+ }
22
53
  function filterControlAttributes(attributes, protectedDataNames) {
23
54
  const source = attributes;
24
55
  const filtered = filterDataAttributes(attributes, protectedDataNames);
@@ -35,6 +66,6 @@ function filterControlAttributes(attributes, protectedDataNames) {
35
66
  return filtered;
36
67
  }
37
68
 
38
- export { filterControlAttributes, filterDataAttributes };
69
+ export { filterControlAttributes, filterDataAttributes, filterRootAttributes };
39
70
 
40
- //# sourceMappingURL=chunk-LAZLBC2Q.js.map
71
+ //# sourceMappingURL=chunk-KH4KEMSP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/dom/extension-attributes.ts"],"names":[],"mappings":";AAEA,IAAM,mBAAA,GAAsB,sBAAA;AAC5B,IAAM,yCAAyB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AACjE,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,oBAAA,CACd,YACA,cAAA,EACwB;AACxB,EAAA,MAAM,WAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAA0B,CAAA,EAAG;AACtE,IAAA,MAAM,cAAA,GAAiB,KAAK,WAAA,EAAY;AACxC,IAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,mBAAA,CAAoB,IAAA,CAAK,cAAc,CAAA,IACvC,CAAC,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA,EAClC;AACA,MAAA,QAAA,CAAS,cAAc,CAAA,GAAI,KAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,IAAM,mBAAA,GAAsB,eAAA;AAOrB,IAAM,qBAAA,GAAwB;AAAA,EACnC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,gBAAA,GAAmB,IAAI,GAAA,CAAY,qBAAqB,CAAA;AAavD,SAAS,oBAAA,CACd,YACA,cAAA,EACwB;AACxB,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,UAAA,EAAY,cAAc,CAAA;AAChE,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAA0B,CAAA,EAAG;AACtE,IAAA,MAAM,cAAA,GAAiB,KAAK,WAAA,EAAY;AACxC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,cAAA,CAAe,IAAI,cAAc,CAAA;AAChE,MAAA;AACF,IAAA,IAAI,mBAAA,CAAoB,KAAK,cAAc,CAAA;AACzC,MAAA,QAAA,CAAS,cAAc,CAAA,GAAI,KAAA;AAAA,SAAA,IACpB,cAAA,KAAmB,MAAA,IAAU,gBAAA,CAAiB,GAAA,CAAI,KAAK,CAAA;AAC9D,MAAA,QAAA,CAAS,IAAA,GAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,uBAAA,CACd,YACA,kBAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,UAAA;AACf,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,UAAA,EAAY,kBAAkB,CAAA;AAEpE,EAAA,IAAI,OAAO,OAAO,aAAA,KAAkB,QAAA;AAClC,IAAA,QAAA,CAAS,gBAAgB,MAAA,CAAO,aAAA;AAClC,EAAA,IAAI,sBAAA,CAAuB,GAAA,CAAI,MAAA,CAAO,mBAA6B,CAAA,EAAG;AACpE,IAAA,QAAA,CAAS,sBAAsB,MAAA,CAAO,mBAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAO,MAAA,CAAO,eAAe,CAAA,KAAM,QAAA;AACrC,IAAA,QAAA,CAAS,eAAe,CAAA,GAAI,MAAA,CAAO,eAAe,CAAA;AACpD,EAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,MAAA,CAAO,eAAe,CAAW,CAAA,EAAG;AAC/D,IAAA,QAAA,CAAS,eAAe,CAAA,GAAI,MAAA,CAAO,eAAe,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,QAAA;AACT","file":"chunk-KH4KEMSP.js","sourcesContent":["type AttributeBag = Readonly<Record<string, unknown>>;\n\nconst DATA_ATTRIBUTE_NAME = /^data-[a-z0-9_.:-]+$/;\nconst POPOVER_TARGET_ACTIONS = new Set(['toggle', 'show', 'hide']);\nconst ARIA_HASPOPUP_VALUES = new Set([\n 'dialog',\n 'menu',\n 'listbox',\n 'tree',\n 'grid',\n 'true',\n]);\n\nexport function filterDataAttributes(\n attributes: object,\n protectedNames: ReadonlySet<string>,\n): Record<string, string> {\n const filtered: Record<string, string> = {};\n\n for (const [name, value] of Object.entries(attributes as AttributeBag)) {\n const normalizedName = name.toLowerCase();\n if (\n typeof value === 'string' &&\n DATA_ATTRIBUTE_NAME.test(normalizedName) &&\n !protectedNames.has(normalizedName)\n ) {\n filtered[normalizedName] = value;\n }\n }\n\n return filtered;\n}\n\nconst ARIA_ATTRIBUTE_NAME = /^aria-[a-z]+$/;\n\n/**\n * Non-widget roles an application may give a layout root: landmarks, named\n * regions, groups, and live regions. Widget roles (button, grid, listbox, …)\n * promise keyboard behavior a layout primitive does not provide.\n */\nexport const STRUCTURAL_ROOT_ROLES = [\n 'region',\n 'group',\n 'list',\n 'feed',\n 'log',\n 'status',\n 'note',\n 'article',\n 'navigation',\n 'complementary',\n 'search',\n 'form',\n 'presentation',\n 'none',\n] as const;\nexport type StructuralRootRole = (typeof STRUCTURAL_ROOT_ROLES)[number];\nconst STRUCTURAL_ROLES = new Set<string>(STRUCTURAL_ROOT_ROLES);\n\n/** Safe `data-*`, `aria-*`, and structural `role` metadata on a layout root. */\nexport type StructuralRootAttributes = Readonly<\n Record<`data-${string}` | `aria-${string}`, string | undefined> & {\n role?: StructuralRootRole;\n }\n>;\n\n/**\n * `filterDataAttributes` plus `aria-*` string attributes and a structural\n * `role`, for layout roots an application names or marks as a region.\n */\nexport function filterRootAttributes(\n attributes: object,\n protectedNames: ReadonlySet<string>,\n): Record<string, string> {\n const filtered = filterDataAttributes(attributes, protectedNames);\n for (const [name, value] of Object.entries(attributes as AttributeBag)) {\n const normalizedName = name.toLowerCase();\n if (typeof value !== 'string' || protectedNames.has(normalizedName))\n continue;\n if (ARIA_ATTRIBUTE_NAME.test(normalizedName))\n filtered[normalizedName] = value;\n else if (normalizedName === 'role' && STRUCTURAL_ROLES.has(value))\n filtered.role = value;\n }\n return filtered;\n}\n\nexport function filterControlAttributes(\n attributes: object,\n protectedDataNames: ReadonlySet<string>,\n): Record<string, string> {\n const source = attributes as AttributeBag;\n const filtered = filterDataAttributes(attributes, protectedDataNames);\n\n if (typeof source.popoverTarget === 'string')\n filtered.popoverTarget = source.popoverTarget;\n if (POPOVER_TARGET_ACTIONS.has(source.popoverTargetAction as string)) {\n filtered.popoverTargetAction = source.popoverTargetAction as string;\n }\n if (typeof source['aria-controls'] === 'string')\n filtered['aria-controls'] = source['aria-controls'];\n if (ARIA_HASPOPUP_VALUES.has(source['aria-haspopup'] as string)) {\n filtered['aria-haspopup'] = source['aria-haspopup'] as string;\n }\n\n return filtered;\n}\n"]}
@@ -0,0 +1,122 @@
1
+ import { jsx, jsxs } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/components/forms/field-label/field-label.tsx
4
+ function FieldLabel({
5
+ children,
6
+ class: classValue = "",
7
+ className = "",
8
+ ...attributes
9
+ }) {
10
+ const classes = ["kui-text__field-label", classValue, className].filter(Boolean).join(" ");
11
+ return /* @__PURE__ */ jsx("div", { ...attributes, class: classes, "data-component": "field-label", children });
12
+ }
13
+ var MIDDLE_FALLBACK_KEEP = 10;
14
+ function splitMiddle(text, keep) {
15
+ let tailLength;
16
+ if (keep === "segment") {
17
+ const searchEnd = /[/\\]$/.test(text) ? text.length - 1 : text.length;
18
+ const separator = Math.max(
19
+ text.lastIndexOf("/", searchEnd - 1),
20
+ text.lastIndexOf("\\", searchEnd - 1)
21
+ );
22
+ tailLength = separator > 0 ? text.length - separator : MIDDLE_FALLBACK_KEEP;
23
+ } else tailLength = keep;
24
+ if (tailLength >= text.length) return [text, ""];
25
+ return [text.slice(0, -tailLength), text.slice(-tailLength)];
26
+ }
27
+ function Text({
28
+ variant: Variant = "p",
29
+ tone = "default",
30
+ color,
31
+ size = "default",
32
+ font = "default",
33
+ border = "transparent",
34
+ flush = false,
35
+ controlMargins = "",
36
+ lineHeight = "default",
37
+ align = "start",
38
+ wrap = "normal",
39
+ maxLines,
40
+ truncate,
41
+ truncateKeep,
42
+ children,
43
+ class: classValue = "",
44
+ className = "",
45
+ style,
46
+ ...attributes
47
+ }) {
48
+ if (maxLines !== void 0 && (!Number.isSafeInteger(maxLines) || maxLines < 1 || wrap === "nowrap" || wrap === "truncate"))
49
+ throw new RangeError(
50
+ "Text maxLines requires a positive integer and wrapping"
51
+ );
52
+ const position = truncate ?? "end";
53
+ if (truncate !== void 0 && wrap !== "truncate" || !["end", "middle", "start"].includes(position))
54
+ throw new RangeError(
55
+ 'Text truncate requires wrap="truncate" and one of end, middle, or start'
56
+ );
57
+ if (truncateKeep !== void 0 && (position !== "middle" || truncateKeep !== "segment" && (!Number.isSafeInteger(truncateKeep) || truncateKeep < 1)))
58
+ throw new RangeError(
59
+ 'Text truncateKeep requires truncate="middle" and a positive integer or "segment"'
60
+ );
61
+ const textValue = typeof children === "string" || typeof children === "number" ? String(children) : void 0;
62
+ if (position === "middle" && textValue === void 0)
63
+ throw new TypeError(
64
+ 'Text truncate="middle" requires string or number children'
65
+ );
66
+ const title = attributes.title === void 0 && position !== "end" ? textValue : attributes.title;
67
+ const classes = ["kui-text", classValue, className].filter(Boolean).join(" ");
68
+ return /* @__PURE__ */ jsx(
69
+ Variant,
70
+ {
71
+ ...attributes,
72
+ class: classes,
73
+ "data-component": "text",
74
+ "data-tone": tone,
75
+ "data-size": size,
76
+ "data-font": font,
77
+ "data-border": border,
78
+ "data-control-margins": controlMargins || void 0,
79
+ "data-flush": flush ? "true" : void 0,
80
+ "data-line-height": lineHeight === "tight" ? "tight" : void 0,
81
+ "data-align": align === "start" ? void 0 : align,
82
+ "data-wrap": wrap === "normal" ? void 0 : wrap,
83
+ "data-max-lines": maxLines === void 0 ? void 0 : String(maxLines),
84
+ "data-truncate": position === "end" ? void 0 : position,
85
+ title,
86
+ style: color === void 0 ? style : `${style === void 0 || style === null ? "" : `${style};`}color:${color}`,
87
+ children: textBody(position, children, textValue, truncateKeep, maxLines)
88
+ }
89
+ );
90
+ }
91
+ function textBody(position, children, textValue, truncateKeep, maxLines) {
92
+ switch (position) {
93
+ case "start":
94
+ return /* @__PURE__ */ jsx("span", { class: "kui-text__truncate-start", children: /* @__PURE__ */ jsx("span", { dir: "ltr", children }) });
95
+ case "middle":
96
+ return /* @__PURE__ */ jsx(
97
+ TruncateMiddle,
98
+ {
99
+ parts: splitMiddle(textValue, truncateKeep ?? "segment")
100
+ }
101
+ );
102
+ case "end":
103
+ return maxLines === void 0 ? children : /* @__PURE__ */ jsx(
104
+ "span",
105
+ {
106
+ class: "kui-text__clamp",
107
+ style: `--_kui-text-max-lines:${maxLines}`,
108
+ children
109
+ }
110
+ );
111
+ }
112
+ }
113
+ function TruncateMiddle({ parts: [head, tail] }) {
114
+ return /* @__PURE__ */ jsxs("span", { class: "kui-text__truncate-middle", children: [
115
+ /* @__PURE__ */ jsx("span", { class: "kui-text__truncate-head", children: head }),
116
+ tail ? /* @__PURE__ */ jsx("span", { class: "kui-text__truncate-tail", children: tail }) : ""
117
+ ] });
118
+ }
119
+
120
+ export { FieldLabel, Text };
121
+
122
+ //# sourceMappingURL=chunk-LL45C7BB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/forms/field-label/field-label.tsx","../src/components/typography/text/text.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-LL45C7BB.js","sourcesContent":["import type { KerfBaseAttrs } from 'kerfjs/jsx-runtime';\n\nexport type FieldLabelProps = Omit<\n KerfBaseAttrs,\n 'children' | 'class' | 'className'\n> & {\n children: string;\n class?: string;\n className?: string;\n};\n\n/** Visible field heading for a read-only preview; use its id with aria-labelledby on the preview group. */\nexport function FieldLabel({\n children,\n class: classValue = '',\n className = '',\n ...attributes\n}: FieldLabelProps) {\n const classes = ['kui-text__field-label', classValue, className]\n .filter(Boolean)\n .join(' ');\n return (\n <div {...attributes} class={classes} data-component=\"field-label\">\n {children}\n </div>\n );\n}\n","import type { KerfBaseAttrs } from 'kerfjs/jsx-runtime';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport type { Sides } from '../../../shared/layout/sides.js';\nimport type { CssForegroundColor } from '../../../shared/styles/css-values.js';\n\nexport {\n FieldLabel,\n type FieldLabelProps,\n} from '../../forms/field-label/field-label.js';\n\nexport type TextVariant =\n 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';\nexport type TextTone = 'default' | 'quiet' | 'danger';\nexport type TextSize = 'compact' | 'default' | 'large' | 'xlarge';\nexport type TextFont = 'default' | 'monospace';\nexport type TextBorder = 'transparent' | 'none';\nexport type TextLineHeight = 'default' | 'tight';\nexport type TextWrap = 'normal' | 'anywhere' | 'nowrap' | 'truncate';\n/** Inline alignment of the text's lines, in logical (writing-direction) terms. */\nexport type TextAlign = 'start' | 'center' | 'end';\n/**\n * Where `wrap=\"truncate\"` places its ellipsis: `end` (default) keeps the\n * start, `start` keeps the tail (branch names, the end of an identifier), and\n * `middle` keeps both the start and a suffix (file paths).\n */\nexport type TextTruncate = 'end' | 'middle' | 'start';\n/**\n * The suffix `truncate=\"middle\"` always keeps: a number of trailing\n * characters, or `segment` for the last path segment with its separator.\n */\nexport type TextTruncateKeep = number | 'segment';\n\nexport type TextContent =\n KerfUiContent | string | number | readonly TextContent[];\n\ntype TextCommonProps = Omit<\n KerfBaseAttrs,\n 'children' | 'class' | 'className'\n> & {\n /** Native heading, paragraph, or inline span element to render. Defaults to `p`. */\n variant?: TextVariant;\n /** Semantic foreground treatment. Defaults to the inherited foreground. */\n tone?: TextTone;\n /** Foreground color; overrides tone when supplied, or inherits when omitted. */\n color?: CssForegroundColor;\n /** Text sizing independent of the native semantic element. */\n size?: TextSize;\n /** Font family independent of the native semantic element. */\n font?: TextFont;\n /** Transparent alignment border or no border when embedded in owner chrome. */\n border?: TextBorder;\n /** Add the shared control gutter outside selected physical edges. */\n controlMargins?: Sides;\n /** Remove the block variant's item padding and border in compact content. */\n flush?: boolean;\n /** Use compact leading for short dialog or metadata copy. */\n lineHeight?: TextLineHeight;\n /** Inline alignment of the lines (default `start`), for centered status copy. */\n align?: TextAlign;\n children: TextContent;\n class?: string;\n className?: string;\n};\n\nexport type TextProps = TextCommonProps &\n (\n | {\n /** Wrap normally or break long unbroken strings. Defaults to normal. */\n wrap?: 'normal' | 'anywhere';\n /** Cap wrapped text to this positive number of lines. */\n maxLines?: number;\n truncate?: never;\n truncateKeep?: never;\n }\n | {\n /** Keep one line without an ellipsis. */\n wrap: 'nowrap';\n maxLines?: never;\n truncate?: never;\n truncateKeep?: never;\n }\n | {\n /** Keep one line with an ellipsis. */\n wrap: 'truncate';\n maxLines?: never;\n /**\n * Where the ellipsis goes (default `end`). `start` and `middle` are\n * for left-to-right identifiers and paths, and `middle` requires\n * string or number children so it can split them.\n */\n truncate?: TextTruncate;\n /**\n * The suffix `truncate=\"middle\"` keeps (default `segment`: the last\n * path segment, or the last 10 characters when there is no `/` or\n * `\\\\` separator).\n */\n truncateKeep?: TextTruncateKeep;\n }\n );\n\n/** Characters a middle truncation keeps when the text has no path separator. */\nconst MIDDLE_FALLBACK_KEEP = 10;\n\n/** Split text into the shrinkable head and the always-kept tail. */\nfunction splitMiddle(text: string, keep: TextTruncateKeep): [string, string] {\n let tailLength: number;\n if (keep === 'segment') {\n // Ignore one trailing separator so `src/lib/` keeps `/lib/`.\n const searchEnd = /[/\\\\]$/.test(text) ? text.length - 1 : text.length;\n const separator = Math.max(\n text.lastIndexOf('/', searchEnd - 1),\n text.lastIndexOf('\\\\', searchEnd - 1),\n );\n tailLength = separator > 0 ? text.length - separator : MIDDLE_FALLBACK_KEEP;\n } else tailLength = keep;\n if (tailLength >= text.length) return [text, ''];\n return [text.slice(0, -tailLength), text.slice(-tailLength)];\n}\n\n/**\n * Semantic heading, paragraph, or inline text. Block variants use the standard\n * content-item padding; `span` adds no box geometry.\n * All ordinary native heading/paragraph attributes pass through to the element.\n */\nexport function Text({\n variant: Variant = 'p',\n tone = 'default',\n color,\n size = 'default',\n font = 'default',\n border = 'transparent',\n flush = false,\n controlMargins = '',\n lineHeight = 'default',\n align = 'start',\n wrap = 'normal',\n maxLines,\n truncate,\n truncateKeep,\n children,\n class: classValue = '',\n className = '',\n style,\n ...attributes\n}: TextProps) {\n if (\n maxLines !== undefined &&\n (!Number.isSafeInteger(maxLines) ||\n maxLines < 1 ||\n wrap === 'nowrap' ||\n wrap === 'truncate')\n )\n throw new RangeError(\n 'Text maxLines requires a positive integer and wrapping',\n );\n const position = truncate ?? 'end';\n if (\n (truncate !== undefined && wrap !== 'truncate') ||\n !['end', 'middle', 'start'].includes(position)\n )\n throw new RangeError(\n 'Text truncate requires wrap=\"truncate\" and one of end, middle, or start',\n );\n if (\n truncateKeep !== undefined &&\n (position !== 'middle' ||\n (truncateKeep !== 'segment' &&\n (!Number.isSafeInteger(truncateKeep) || truncateKeep < 1)))\n )\n throw new RangeError(\n 'Text truncateKeep requires truncate=\"middle\" and a positive integer or \"segment\"',\n );\n const textValue =\n typeof children === 'string' || typeof children === 'number'\n ? String(children)\n : undefined;\n if (position === 'middle' && textValue === undefined)\n throw new TypeError(\n 'Text truncate=\"middle\" requires string or number children',\n );\n // Visually clipped start/middle text keeps its full value in the DOM; the\n // title shows it to pointer users unless the app supplied its own.\n const title =\n attributes.title === undefined && position !== 'end'\n ? textValue\n : attributes.title;\n const classes = ['kui-text', classValue, className].filter(Boolean).join(' ');\n return (\n <Variant\n {...attributes}\n class={classes}\n data-component=\"text\"\n data-tone={tone}\n data-size={size}\n data-font={font}\n data-border={border}\n data-control-margins={controlMargins || undefined}\n data-flush={flush ? 'true' : undefined}\n data-line-height={lineHeight === 'tight' ? 'tight' : undefined}\n data-align={align === 'start' ? undefined : align}\n data-wrap={wrap === 'normal' ? undefined : wrap}\n data-max-lines={maxLines === undefined ? undefined : String(maxLines)}\n data-truncate={position === 'end' ? undefined : position}\n title={title}\n style={\n color === undefined\n ? style\n : `${style === undefined || style === null ? '' : `${style};`}color:${color}`\n }\n >\n {textBody(position, children, textValue, truncateKeep, maxLines)}\n </Variant>\n );\n}\n\n/** The element's content for its truncation position or line cap. */\nfunction textBody(\n position: TextTruncate,\n children: TextContent,\n textValue: string | undefined,\n truncateKeep: TextTruncateKeep | undefined,\n maxLines: number | undefined,\n): TextContent {\n switch (position) {\n case 'start':\n return (\n <span class=\"kui-text__truncate-start\">\n <span dir=\"ltr\">{children}</span>\n </span>\n );\n case 'middle':\n return (\n <TruncateMiddle\n parts={splitMiddle(textValue!, truncateKeep ?? 'segment')}\n />\n );\n case 'end':\n return maxLines === undefined ? (\n children\n ) : (\n <span\n class=\"kui-text__clamp\"\n style={`--_kui-text-max-lines:${maxLines}`}\n >\n {children}\n </span>\n );\n }\n}\n\nfunction TruncateMiddle({ parts: [head, tail] }: { parts: [string, string] }) {\n return (\n <span class=\"kui-text__truncate-middle\">\n <span class=\"kui-text__truncate-head\">{head}</span>\n {tail ? <span class=\"kui-text__truncate-tail\">{tail}</span> : ''}\n </span>\n );\n}\n\nexport type { Sides } from '../../../shared/layout/sides.js';\n"]}
@@ -0,0 +1,45 @@
1
+ import { LucideIcon } from './chunk-UKKRPP56.js';
2
+ import { filterDataAttributes } from './chunk-KH4KEMSP.js';
3
+ import { jsx } from 'kerfjs/jsx-runtime';
4
+
5
+ var iconButtonProtectedAttributes = /* @__PURE__ */ new Set([
6
+ "data-component",
7
+ "data-action"
8
+ ]);
9
+ function IconButton({
10
+ icon,
11
+ iconName,
12
+ label,
13
+ action,
14
+ appearance,
15
+ variant,
16
+ size,
17
+ type = "button",
18
+ disabled = false,
19
+ id,
20
+ className = "",
21
+ rootAttributes = {},
22
+ slot
23
+ }) {
24
+ return /* @__PURE__ */ jsx(
25
+ "wa-button",
26
+ {
27
+ ...filterDataAttributes(rootAttributes, iconButtonProtectedAttributes),
28
+ id,
29
+ class: `kui-icon-button ${className}`.trim(),
30
+ "data-component": "icon-button",
31
+ "data-action": action,
32
+ appearance,
33
+ variant,
34
+ size,
35
+ type,
36
+ disabled: disabled || void 0,
37
+ slot,
38
+ children: /* @__PURE__ */ jsx(LucideIcon, { icon, name: iconName, label })
39
+ }
40
+ );
41
+ }
42
+
43
+ export { IconButton };
44
+
45
+ //# sourceMappingURL=chunk-M2NRCFRO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/actions/icon-button/icon-button.tsx"],"names":[],"mappings":";;;;AAYA,IAAM,6BAAA,uBAAoC,GAAA,CAAI;AAAA,EAC5C,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAyCM,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,QAAA,GAAW,KAAA;AAAA,EACX,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAoB;AAClB,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,6BAA6B,CAAA;AAAA,MACtE,EAAA;AAAA,MACA,KAAA,EAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC3C,gBAAA,EAAe,aAAA;AAAA,MACf,aAAA,EAAa,MAAA;AAAA,MACb,UAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAU,QAAA,IAAY,MAAA;AAAA,MACtB,IAAA;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAY,IAAA,EAAM,UAAU,KAAA,EAAc;AAAA;AAAA,GACxD;AAEJ","file":"chunk-M2NRCFRO.js","sourcesContent":["import { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport {\n LucideIcon,\n type LucideNode,\n} from '../../media/lucide-icon/lucide-icon.js';\n\nexport type IconButtonAppearance =\n 'accent' | 'filled' | 'outlined' | 'filled-outlined' | 'plain';\nexport type IconButtonVariant =\n 'neutral' | 'brand' | 'success' | 'warning' | 'danger';\nexport type IconButtonSize = 'xs' | 's' | 'm' | 'l' | 'xl';\n\nconst iconButtonProtectedAttributes = new Set([\n 'data-component',\n 'data-action',\n]);\n\ntype IconButtonRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n }\n>;\n\nexport interface IconButtonProps {\n /** The Lucide-compatible icon node shown alone in the button. */\n icon: LucideNode;\n /** The icon's stable name, as `LucideIcon` takes it. */\n iconName: string;\n /** Accessible name; the button has no visible text, so it is required. */\n label: string;\n /** Delegated `data-action` the application handles. */\n action?: string;\n /** Web Awesome appearance; defaults to Web Awesome's own. */\n appearance?: IconButtonAppearance;\n /** Web Awesome semantic variant; defaults to Web Awesome's own. */\n variant?: IconButtonVariant;\n /** Web Awesome control size; the square follows its control height. */\n size?: IconButtonSize;\n type?: 'button' | 'submit' | 'reset';\n disabled?: boolean;\n id?: string;\n className?: string;\n /** Safe `data-*` metadata; `data-component` and `data-action` stay owned. */\n rootAttributes?: IconButtonRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/**\n * An icon-only Web Awesome button with a `LucideIcon`: square, one form\n * control height on each side, so it matches an adjacent `wa-input` or\n * `Select`. Web Awesome squares a button only for a lone `wa-icon`; this is\n * the Kerf form for Lucide icons. Register `wa-button` once\n * (`@awesome.me/webawesome/dist/components/button/button.js`).\n */\nexport function IconButton({\n icon,\n iconName,\n label,\n action,\n appearance,\n variant,\n size,\n type = 'button',\n disabled = false,\n id,\n className = '',\n rootAttributes = {},\n slot,\n}: IconButtonProps) {\n return (\n <wa-button\n {...filterDataAttributes(rootAttributes, iconButtonProtectedAttributes)}\n id={id}\n class={`kui-icon-button ${className}`.trim()}\n data-component=\"icon-button\"\n data-action={action}\n appearance={appearance}\n variant={variant}\n size={size}\n type={type}\n disabled={disabled || undefined}\n slot={slot}\n >\n <LucideIcon icon={icon} name={iconName} label={label} />\n </wa-button>\n );\n}\n"]}
@@ -0,0 +1,173 @@
1
+ // src/wiring/wire-list-reorder.ts
2
+ var ROW = '[data-component="list-item"], [data-component="list-item-link"], [data-component="list-action-row"]';
3
+ var LIST = '[data-component="list"]';
4
+ var DRAG_TYPE = "application/x-kerf-list-items";
5
+ function reorderListItems(items, getId, sourceIds, target) {
6
+ const moving = new Set(sourceIds);
7
+ if (moving.has(target.id)) return [...items];
8
+ const moved = items.filter((item) => moving.has(getId(item)));
9
+ const remaining = items.filter((item) => !moving.has(getId(item)));
10
+ const index = remaining.findIndex((item) => getId(item) === target.id);
11
+ if (!moved.length || index < 0) return [...items];
12
+ remaining.splice(index + (target.position === "after" ? 1 : 0), 0, ...moved);
13
+ return remaining;
14
+ }
15
+ function rowOf(target) {
16
+ return target instanceof Element ? target.closest(ROW) ?? void 0 : void 0;
17
+ }
18
+ function reorderable(row) {
19
+ return row.getAttribute("draggable") === "true" && Boolean(row.dataset.itemId);
20
+ }
21
+ function scopeOf(row) {
22
+ return row.closest(LIST) ?? row.parentElement ?? void 0;
23
+ }
24
+ function rowsIn(scope) {
25
+ return [...scope.querySelectorAll(ROW)].filter(
26
+ (row) => reorderable(row) && scopeOf(row) === scope
27
+ );
28
+ }
29
+ function selected(row) {
30
+ if (row.dataset.component === "list-action-row")
31
+ return row.dataset.selected === "true" || row.dataset.pressed === "true";
32
+ return row.getAttribute("aria-current") === "page" || row.getAttribute("aria-pressed") === "true";
33
+ }
34
+ function sourcesFor(row, rows) {
35
+ return selected(row) ? rows.filter(selected) : [row];
36
+ }
37
+ function positionFor(event, row) {
38
+ const bounds = row.getBoundingClientRect();
39
+ return event.clientY < bounds.top + bounds.height / 2 ? "before" : "after";
40
+ }
41
+ function focusTarget(row) {
42
+ return row.querySelector(":scope > .kui-list-action-row__primary") ?? row;
43
+ }
44
+ function wireListReorder(root, { onReorder }) {
45
+ let disposed = false;
46
+ let dragged;
47
+ const clearDropPositions = () => root.querySelectorAll(`:is(${ROW})[data-drop-position]`).forEach((row) => delete row.dataset.dropPosition);
48
+ const clear = () => {
49
+ dragged = void 0;
50
+ root.querySelectorAll(
51
+ `:is(${ROW}):is([data-dragging], [data-drop-position])`
52
+ ).forEach((row) => {
53
+ delete row.dataset.dragging;
54
+ delete row.dataset.dropPosition;
55
+ });
56
+ };
57
+ const report = (scope, change) => {
58
+ const listId = scope.dataset.listId;
59
+ onReorder(listId ? { listId, ...change } : change);
60
+ };
61
+ const view = (root.nodeType === 9 ? root : root.ownerDocument).defaultView;
62
+ const refocus = (listId, itemId) => {
63
+ const restore = () => {
64
+ if (disposed) return;
65
+ const row = [...root.querySelectorAll(ROW)].find(
66
+ (candidate) => candidate.dataset.itemId === itemId && scopeOf(candidate)?.dataset.listId === listId
67
+ );
68
+ if (!row) return;
69
+ const target = focusTarget(row);
70
+ if (target.ownerDocument.activeElement === target) return;
71
+ target.focus();
72
+ target.scrollIntoView({ block: "nearest", inline: "nearest" });
73
+ };
74
+ globalThis.queueMicrotask(restore);
75
+ view.requestAnimationFrame(restore);
76
+ };
77
+ const onDragStart = (event) => {
78
+ const dragEvent = event;
79
+ const row = rowOf(event.target);
80
+ const scope = row && scopeOf(row);
81
+ if (!row || !scope || !reorderable(row)) return;
82
+ const sources = sourcesFor(row, rowsIn(scope));
83
+ const sourceIds = sources.map((source) => source.dataset.itemId);
84
+ dragged = { scope, sourceIds };
85
+ for (const source of sources) source.dataset.dragging = "true";
86
+ if (dragEvent.dataTransfer) {
87
+ dragEvent.dataTransfer.effectAllowed = "move";
88
+ dragEvent.dataTransfer.setData(DRAG_TYPE, sourceIds.join("\n"));
89
+ }
90
+ };
91
+ const dropRow = (event) => {
92
+ const row = rowOf(event.target);
93
+ if (!dragged || !row || !reorderable(row) || scopeOf(row) !== dragged.scope || dragged.sourceIds.includes(row.dataset.itemId))
94
+ return void 0;
95
+ return row;
96
+ };
97
+ const onDragOver = (event) => {
98
+ if (!dragged) return;
99
+ const dragEvent = event;
100
+ const row = dropRow(event);
101
+ clearDropPositions();
102
+ if (!row) return;
103
+ dragEvent.preventDefault();
104
+ row.dataset.dropPosition = positionFor(dragEvent, row);
105
+ if (dragEvent.dataTransfer) dragEvent.dataTransfer.dropEffect = "move";
106
+ };
107
+ const onDrop = (event) => {
108
+ const current = dragged;
109
+ const row = dropRow(event);
110
+ if (!current || !row) {
111
+ clear();
112
+ return;
113
+ }
114
+ event.preventDefault();
115
+ const target = {
116
+ id: row.dataset.itemId,
117
+ position: positionFor(event, row)
118
+ };
119
+ clear();
120
+ report(current.scope, {
121
+ sourceIds: current.sourceIds,
122
+ target,
123
+ source: "pointer"
124
+ });
125
+ };
126
+ const onKeyDown = (event) => {
127
+ const keyboardEvent = event;
128
+ if (!keyboardEvent.altKey || !keyboardEvent.shiftKey || keyboardEvent.ctrlKey || keyboardEvent.metaKey || keyboardEvent.key !== "ArrowUp" && keyboardEvent.key !== "ArrowDown")
129
+ return;
130
+ const row = rowOf(event.target);
131
+ const scope = row && scopeOf(row);
132
+ if (!row || !scope || !reorderable(row)) return;
133
+ const rows = rowsIn(scope);
134
+ const sources = sourcesFor(row, rows);
135
+ const up = keyboardEvent.key === "ArrowUp";
136
+ const edge = rows.indexOf(up ? sources[0] : sources.at(-1));
137
+ const neighbors = up ? rows.slice(0, edge).reverse() : rows.slice(edge + 1);
138
+ const neighbor = neighbors.find(
139
+ (candidate) => !sources.includes(candidate)
140
+ );
141
+ if (!neighbor) return;
142
+ keyboardEvent.preventDefault();
143
+ const listId = scope.dataset.listId;
144
+ const focusedId = row.dataset.itemId;
145
+ report(scope, {
146
+ sourceIds: sources.map((source) => source.dataset.itemId),
147
+ target: {
148
+ id: neighbor.dataset.itemId,
149
+ position: up ? "before" : "after"
150
+ },
151
+ source: "keyboard"
152
+ });
153
+ refocus(listId, focusedId);
154
+ };
155
+ root.addEventListener("dragstart", onDragStart);
156
+ root.addEventListener("dragover", onDragOver);
157
+ root.addEventListener("drop", onDrop);
158
+ root.addEventListener("dragend", clear);
159
+ root.addEventListener("keydown", onKeyDown);
160
+ return () => {
161
+ disposed = true;
162
+ clear();
163
+ root.removeEventListener("dragstart", onDragStart);
164
+ root.removeEventListener("dragover", onDragOver);
165
+ root.removeEventListener("drop", onDrop);
166
+ root.removeEventListener("dragend", clear);
167
+ root.removeEventListener("keydown", onKeyDown);
168
+ };
169
+ }
170
+
171
+ export { reorderListItems, wireListReorder };
172
+
173
+ //# sourceMappingURL=chunk-MJ5RU6XT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wiring/wire-list-reorder.ts"],"names":[],"mappings":"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","file":"chunk-MJ5RU6XT.js","sourcesContent":["/** Which edge of the target row the moved rows land beside. */\nexport type ListDropPosition = 'before' | 'after';\n\n/** How the person asked for the move. */\nexport type ListReorderSource = 'pointer' | 'keyboard';\n\n/** The row the moved rows land beside, and on which side of it. */\nexport interface ListReorderTarget {\n id: string;\n position: ListDropPosition;\n}\n\n/** One requested reorder. The application applies it to its own ordered state. */\nexport interface ListReorder {\n /** The containing list's `data-list-id`, when it has one. */\n listId?: string;\n /** The moved rows' `itemId`s, in their current order. */\n sourceIds: string[];\n target: ListReorderTarget;\n source: ListReorderSource;\n}\n\nexport interface WireListReorderOptions {\n /** Apply the change synchronously (for example with `reorderListItems`) and re-render. */\n onReorder: (change: ListReorder) => void;\n}\n\nconst ROW =\n '[data-component=\"list-item\"], [data-component=\"list-item-link\"], [data-component=\"list-action-row\"]';\nconst LIST = '[data-component=\"list\"]';\nconst DRAG_TYPE = 'application/x-kerf-list-items';\n\n/**\n * Move `sourceIds` (kept in their current relative order) to `target`'s side\n * of the target row. Returns a new array; an unknown target, a target that is\n * itself being moved, or no known sources leave the order unchanged.\n */\nexport function reorderListItems<T>(\n items: readonly T[],\n getId: (item: T) => string,\n sourceIds: readonly string[],\n target: ListReorderTarget,\n): T[] {\n const moving = new Set(sourceIds);\n if (moving.has(target.id)) return [...items];\n const moved = items.filter((item) => moving.has(getId(item)));\n const remaining = items.filter((item) => !moving.has(getId(item)));\n const index = remaining.findIndex((item) => getId(item) === target.id);\n if (!moved.length || index < 0) return [...items];\n remaining.splice(index + (target.position === 'after' ? 1 : 0), 0, ...moved);\n return remaining;\n}\n\nfunction rowOf(target: EventTarget | null): HTMLElement | undefined {\n return target instanceof Element\n ? (target.closest<HTMLElement>(ROW) ?? undefined)\n : undefined;\n}\n\nfunction reorderable(row: HTMLElement): boolean {\n return (\n row.getAttribute('draggable') === 'true' && Boolean(row.dataset.itemId)\n );\n}\n\n/** The list a row reorders within: its List, or its parent element. */\nfunction scopeOf(row: HTMLElement): HTMLElement | undefined {\n return row.closest<HTMLElement>(LIST) ?? row.parentElement ?? undefined;\n}\n\nfunction rowsIn(scope: HTMLElement): HTMLElement[] {\n return [...scope.querySelectorAll<HTMLElement>(ROW)].filter(\n (row) => reorderable(row) && scopeOf(row) === scope,\n );\n}\n\nfunction selected(row: HTMLElement): boolean {\n if (row.dataset.component === 'list-action-row')\n return row.dataset.selected === 'true' || row.dataset.pressed === 'true';\n return (\n row.getAttribute('aria-current') === 'page' ||\n row.getAttribute('aria-pressed') === 'true'\n );\n}\n\n/** A selected row carries every selected row of its list; any other row moves alone. */\nfunction sourcesFor(row: HTMLElement, rows: readonly HTMLElement[]) {\n return selected(row) ? rows.filter(selected) : [row];\n}\n\nfunction positionFor(event: DragEvent, row: HTMLElement): ListDropPosition {\n const bounds = row.getBoundingClientRect();\n return event.clientY < bounds.top + bounds.height / 2 ? 'before' : 'after';\n}\n\nfunction focusTarget(row: HTMLElement): HTMLElement {\n return (\n row.querySelector<HTMLElement>(':scope > .kui-list-action-row__primary') ??\n row\n );\n}\n\n/**\n * Wire native drag-and-drop and Alt+Shift+ArrowUp/ArrowDown reordering for\n * draggable `ListItem`, `ListItemLink`, and `ListActionRow` rows below `root`.\n * Rows reorder within their `List` (or parent element) and are identified by\n * `itemId`. Dragging a selected or pressed row moves every selected row of\n * its list. While a pointer drag is in progress the wiring paints the same\n * `data-dragging` / `data-drop-position` attributes the rows' `dragging` and\n * `dropPosition` props render. Order stays application state: `onReorder`\n * reports the change and the application re-renders. Returns a disposer.\n */\nexport function wireListReorder(\n root: HTMLElement | Document,\n { onReorder }: WireListReorderOptions,\n): () => void {\n let disposed = false;\n let dragged: { scope: HTMLElement; sourceIds: string[] } | undefined;\n\n const clearDropPositions = () =>\n root\n .querySelectorAll<HTMLElement>(`:is(${ROW})[data-drop-position]`)\n .forEach((row) => delete row.dataset.dropPosition);\n const clear = () => {\n dragged = undefined;\n root\n .querySelectorAll<HTMLElement>(\n `:is(${ROW}):is([data-dragging], [data-drop-position])`,\n )\n .forEach((row) => {\n delete row.dataset.dragging;\n delete row.dataset.dropPosition;\n });\n };\n const report = (scope: HTMLElement, change: Omit<ListReorder, 'listId'>) => {\n const listId = scope.dataset.listId;\n onReorder(listId ? { listId, ...change } : change);\n };\n const view = (root.nodeType === 9 ? (root as Document) : root.ownerDocument)!\n .defaultView!;\n /**\n * Return focus to the moved row by identity. An unkeyed re-render morphs\n * rows in place, so the focused element can come to hold a different row;\n * a render may also land after a microtask (a scheduled effect). Check once\n * after the synchronous render and again before the next frame.\n */\n const refocus = (listId: string | undefined, itemId: string) => {\n const restore = () => {\n if (disposed) return;\n const row = [...root.querySelectorAll<HTMLElement>(ROW)].find(\n (candidate) =>\n candidate.dataset.itemId === itemId &&\n scopeOf(candidate)?.dataset.listId === listId,\n );\n if (!row) return;\n const target = focusTarget(row);\n if (target.ownerDocument.activeElement === target) return;\n target.focus();\n target.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n };\n globalThis.queueMicrotask(restore);\n view.requestAnimationFrame(restore);\n };\n\n const onDragStart = (event: Event) => {\n const dragEvent = event as DragEvent;\n const row = rowOf(event.target);\n const scope = row && scopeOf(row);\n if (!row || !scope || !reorderable(row)) return;\n const sources = sourcesFor(row, rowsIn(scope));\n const sourceIds = sources.map((source) => source.dataset.itemId!);\n dragged = { scope, sourceIds };\n for (const source of sources) source.dataset.dragging = 'true';\n if (dragEvent.dataTransfer) {\n dragEvent.dataTransfer.effectAllowed = 'move';\n dragEvent.dataTransfer.setData(DRAG_TYPE, sourceIds.join('\\n'));\n }\n };\n /** The row under a drag event that the dragged rows may land beside. */\n const dropRow = (event: Event) => {\n const row = rowOf(event.target);\n if (\n !dragged ||\n !row ||\n !reorderable(row) ||\n scopeOf(row) !== dragged.scope ||\n dragged.sourceIds.includes(row.dataset.itemId!)\n )\n return undefined;\n return row;\n };\n const onDragOver = (event: Event) => {\n if (!dragged) return;\n const dragEvent = event as DragEvent;\n const row = dropRow(event);\n clearDropPositions();\n if (!row) return;\n dragEvent.preventDefault();\n row.dataset.dropPosition = positionFor(dragEvent, row);\n if (dragEvent.dataTransfer) dragEvent.dataTransfer.dropEffect = 'move';\n };\n const onDrop = (event: Event) => {\n const current = dragged;\n const row = dropRow(event);\n if (!current || !row) {\n clear();\n return;\n }\n event.preventDefault();\n const target: ListReorderTarget = {\n id: row.dataset.itemId!,\n position: positionFor(event as DragEvent, row),\n };\n clear();\n report(current.scope, {\n sourceIds: current.sourceIds,\n target,\n source: 'pointer',\n });\n };\n const onKeyDown = (event: Event) => {\n const keyboardEvent = event as KeyboardEvent;\n if (\n !keyboardEvent.altKey ||\n !keyboardEvent.shiftKey ||\n keyboardEvent.ctrlKey ||\n keyboardEvent.metaKey ||\n (keyboardEvent.key !== 'ArrowUp' && keyboardEvent.key !== 'ArrowDown')\n )\n return;\n const row = rowOf(event.target);\n const scope = row && scopeOf(row);\n if (!row || !scope || !reorderable(row)) return;\n const rows = rowsIn(scope);\n const sources = sourcesFor(row, rows);\n const up = keyboardEvent.key === 'ArrowUp';\n const edge = rows.indexOf(up ? sources[0]! : sources.at(-1)!);\n const neighbors = up ? rows.slice(0, edge).reverse() : rows.slice(edge + 1);\n const neighbor = neighbors.find(\n (candidate) => !sources.includes(candidate),\n );\n if (!neighbor) return;\n keyboardEvent.preventDefault();\n // Read identity before reporting: a synchronous controlled render can\n // morph these very elements into other rows.\n const listId = scope.dataset.listId;\n const focusedId = row.dataset.itemId!;\n report(scope, {\n sourceIds: sources.map((source) => source.dataset.itemId!),\n target: {\n id: neighbor.dataset.itemId!,\n position: up ? 'before' : 'after',\n },\n source: 'keyboard',\n });\n refocus(listId, focusedId);\n };\n\n root.addEventListener('dragstart', onDragStart);\n root.addEventListener('dragover', onDragOver);\n root.addEventListener('drop', onDrop);\n root.addEventListener('dragend', clear);\n root.addEventListener('keydown', onKeyDown);\n return () => {\n disposed = true;\n clear();\n root.removeEventListener('dragstart', onDragStart);\n root.removeEventListener('dragover', onDragOver);\n root.removeEventListener('drop', onDrop);\n root.removeEventListener('dragend', clear);\n root.removeEventListener('keydown', onKeyDown);\n };\n}\n"]}