@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 @@
1
+ {"version":3,"sources":["../src/components/layout/row/row.tsx"],"names":[],"mappings":";;;;;AAmBA,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;AA+CM,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,WACJ,OAAO,GAAA,KAAQ,WACX,CAAA,eAAA,EAAkB,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA,GAChC,CAAA,sBAAA,EAAyB,SAAA,CAAU,IAAI,MAAM,CAAC,uBAAuB,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA;AAC7F,EAAA,MAAM,SAAA,GAAY,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,IAAA,IAAQ,MAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,EAAU,SAAA,GAAY,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,CACrE,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-44A6LP54.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport {\n filterRootAttributes,\n type StructuralRootAttributes,\n} from '../../../shared/dom/extension-attributes.js';\nimport {\n type HorizontalAlignment,\n horizontalAlignment,\n type VerticalAlignment,\n verticalAlignment,\n} from '../../../shared/layout/flex-alignment.js';\nimport { gapLength } from '../../../shared/layout/gap.js';\nimport type { Sides } from '../../../shared/layout/sides.js';\nimport {\n type CssFlex,\n type CssFlexKeyword,\n type UiGap,\n} from '../../../shared/styles/css-values.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 = StructuralRootAttributes &\n Readonly<{\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\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 /** One spacing value or separate column and row values. Defaults to xs. */\n gap?: UiGap;\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 /**\n * Safe `data-*`, `aria-*`, and structural `role` metadata (a named\n * `region`, a `group`); Row-owned structural attributes remain protected.\n */\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 = filterRootAttributes(\n rootAttributes,\n rowProtectedAttributes,\n );\n const gapStyle =\n typeof gap === 'string'\n ? `--_kui-row-gap:${gapLength(gap)}`\n : `--_kui-row-column-gap:${gapLength(gap.column)};--_kui-row-row-gap:${gapLength(gap.row)}`;\n const flexValue = flex === true ? '1 1 auto' : flex || undefined;\n const style = [gapStyle, flexValue ? `--_kui-row-flex:${flexValue}` : '']\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 HorizontalAlignment,\n VerticalAlignment,\n} from '../../../shared/layout/flex-alignment.js';\nexport type { Sides } from '../../../shared/layout/sides.js';\nexport type {\n CssFlex,\n CssFlexKeyword,\n CssLength,\n UiGap,\n UiGapValue,\n UiSpaceName,\n} from '../../../shared/styles/css-values.js';\n"]}
@@ -1,6 +1,10 @@
1
1
  import { jsx, Fragment, jsxs } from 'kerfjs/jsx-runtime';
2
2
 
3
- // src/shared/text/word-breaks.tsx
3
+ // src/shared/dom/draggable.ts
4
+ function nativeDraggable(draggable, placeholder) {
5
+ if (draggable === void 0) return void 0;
6
+ return draggable && !placeholder ? "true" : "false";
7
+ }
4
8
  var CAMEL_BOUNDARY = /(?<=[\p{Ll}\p{N}])(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}\p{Ll})/u;
5
9
  function withWordBreaks(label) {
6
10
  if (typeof label !== "string") return label;
@@ -12,6 +16,6 @@ function withWordBreaks(label) {
12
16
  ] })) });
13
17
  }
14
18
 
15
- export { withWordBreaks };
19
+ export { nativeDraggable, withWordBreaks };
16
20
 
17
- //# sourceMappingURL=chunk-7QQ3HE47.js.map
21
+ //# sourceMappingURL=chunk-4LOK4634.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/dom/draggable.ts","../src/shared/text/word-breaks.tsx"],"names":[],"mappings":";;;AAIO,SAAS,eAAA,CACd,WACA,WAAA,EAC8B;AAC9B,EAAA,IAAI,SAAA,KAAc,QAAW,OAAO,MAAA;AACpC,EAAA,OAAO,SAAA,IAAa,CAAC,WAAA,GAAc,MAAA,GAAS,OAAA;AAC9C;ACNA,IAAM,cAAA,GACJ,2DAAA;AAQK,SAAS,eAAe,KAAA,EAA6C;AAC1E,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,uCAEK,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,0BAChB,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,KAAA,GAAQ,CAAA,mBAAI,GAAA,CAAC,KAAA,EAAA,EAAI,CAAA,GAAK,IAAA;AAAA,IACtB;AAAA,GAAA,EACH,CACD,CAAA,EACH,CAAA;AAEJ","file":"chunk-4LOK4634.js","sourcesContent":["/**\n * The native `draggable` attribute value for a component root: omitted unless\n * the author set it, and never `\"true\"` on an inert loading placeholder.\n */\nexport function nativeDraggable(\n draggable: boolean | undefined,\n placeholder: boolean,\n): 'true' | 'false' | undefined {\n if (draggable === undefined) return undefined;\n return draggable && !placeholder ? 'true' : 'false';\n}\n","import type { SafeHtml } from 'kerfjs';\n\n// A lowercase letter or digit followed by an uppercase letter (\"ticketBoard\"),\n// or an acronym followed by a capitalized word (\"HTMLParser\" → \"HTML|Parser\").\nconst CAMEL_BOUNDARY =\n /(?<=[\\p{Ll}\\p{N}])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}\\p{Ll})/u;\n\n/**\n * A label with line-break opportunities (`<wbr>`) at camelCase boundaries, so a\n * wrapping row breaks a long identifier-like name (`QuickTicketComposer`) at a\n * word boundary instead of mid-word. The text, and so the accessible name, is\n * unchanged; a `SafeHtml` label is returned as given.\n */\nexport function withWordBreaks(label: string | SafeHtml): string | SafeHtml {\n if (typeof label !== 'string') return label;\n const parts = label.split(CAMEL_BOUNDARY);\n if (parts.length < 2) return label;\n return (\n <>\n {parts.map((part, index) => (\n <>\n {index > 0 ? <wbr /> : null}\n {part}\n </>\n ))}\n </>\n );\n}\n"]}
@@ -0,0 +1,68 @@
1
+ import { filterDataAttributes } from './chunk-KH4KEMSP.js';
2
+ import { jsxs, jsx } from 'kerfjs/jsx-runtime';
3
+
4
+ var summaryRowProtected = /* @__PURE__ */ new Set([
5
+ "data-component",
6
+ "data-presentation",
7
+ "data-list-edge",
8
+ "data-rail",
9
+ "data-selected",
10
+ "data-dimmed"
11
+ ]);
12
+ function SummaryRow({
13
+ title,
14
+ leading,
15
+ trailingMeta,
16
+ metadata,
17
+ presentation = "row",
18
+ titleLines,
19
+ rail,
20
+ selected = false,
21
+ dimmed = false,
22
+ listEdge,
23
+ deferRendering = false,
24
+ ariaLabel,
25
+ id,
26
+ className = "",
27
+ rootAttributes = {}
28
+ }) {
29
+ if (titleLines !== void 0 && (!Number.isInteger(titleLines) || titleLines < 1))
30
+ throw new RangeError("SummaryRow titleLines must be a positive integer");
31
+ return /* @__PURE__ */ jsxs(
32
+ "div",
33
+ {
34
+ ...filterDataAttributes(rootAttributes, summaryRowProtected),
35
+ id,
36
+ class: `kui-summary-row ${className}`.trim(),
37
+ "data-component": "summary-row",
38
+ "data-presentation": presentation,
39
+ "data-list-edge": listEdge,
40
+ "data-rail": rail,
41
+ "data-selected": selected ? "true" : void 0,
42
+ "data-dimmed": dimmed ? "true" : void 0,
43
+ "data-defer": deferRendering ? "true" : void 0,
44
+ role: "option",
45
+ tabindex: "0",
46
+ "aria-selected": selected ? "true" : "false",
47
+ "aria-label": ariaLabel,
48
+ style: titleLines === void 0 ? void 0 : `--_kui-summary-row-title-lines:${titleLines}`,
49
+ children: [
50
+ rail && /* @__PURE__ */ jsx("span", { class: "kui-summary-row__rail", "aria-hidden": "true" }),
51
+ /* @__PURE__ */ jsxs("div", { class: "kui-summary-row__body", children: [
52
+ leading && /* @__PURE__ */ jsx("span", { class: "kui-summary-row__leading", children: leading }),
53
+ /* @__PURE__ */ jsxs("div", { class: "kui-summary-row__content", children: [
54
+ /* @__PURE__ */ jsxs("div", { class: "kui-summary-row__title", children: [
55
+ trailingMeta !== void 0 && /* @__PURE__ */ jsx("span", { class: "kui-summary-row__trailing", children: trailingMeta }),
56
+ title
57
+ ] }),
58
+ metadata && /* @__PURE__ */ jsx("div", { class: "kui-summary-row__metadata", children: metadata })
59
+ ] })
60
+ ] })
61
+ ]
62
+ }
63
+ );
64
+ }
65
+
66
+ export { SummaryRow };
67
+
68
+ //# sourceMappingURL=chunk-4UB5Z3ZZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/collections/summary-row/summary-row.tsx"],"names":[],"mappings":";;;AAWA,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAmDM,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,UAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA,GAAS,KAAA;AAAA,EACT,QAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,SAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,iBAAiB;AACnB,CAAA,EAAoB;AAClB,EAAA,IACE,eAAe,MAAA,KACd,CAAC,OAAO,SAAA,CAAU,UAAU,KAAK,UAAA,GAAa,CAAA,CAAA;AAE/C,IAAA,MAAM,IAAI,WAAW,kDAAkD,CAAA;AACzE,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,oBAAA,CAAqB,cAAA,EAAgB,mBAAmB,CAAA;AAAA,MAC5D,EAAA;AAAA,MACA,KAAA,EAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC3C,gBAAA,EAAe,aAAA;AAAA,MACf,mBAAA,EAAmB,YAAA;AAAA,MACnB,gBAAA,EAAgB,QAAA;AAAA,MAChB,WAAA,EAAW,IAAA;AAAA,MACX,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MACnC,aAAA,EAAa,SAAS,MAAA,GAAS,MAAA;AAAA,MAC/B,YAAA,EAAY,iBAAiB,MAAA,GAAS,MAAA;AAAA,MACtC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAS,GAAA;AAAA,MACT,eAAA,EAAe,WAAW,MAAA,GAAS,OAAA;AAAA,MACnC,YAAA,EAAY,SAAA;AAAA,MACZ,KAAA,EACE,UAAA,KAAe,MAAA,GACX,MAAA,GACA,kCAAkC,UAAU,CAAA,CAAA;AAAA,MAGjD,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,uBAAA,EAAwB,eAAY,MAAA,EAAO,CAAA;AAAA,wBAChE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,uBAAA,EACR,QAAA,EAAA;AAAA,UAAA,OAAA,oBAAW,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,0BAAA,EAA4B,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BAC5D,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,0BAAA,EACT,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAM,wBAAA,EACR,QAAA,EAAA;AAAA,cAAA,YAAA,KAAiB,MAAA,oBAChB,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,6BAA6B,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,cAEvD;AAAA,aAAA,EACH,CAAA;AAAA,YACC,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,6BAA6B,QAAA,EAAA,QAAA,EAAS;AAAA,WAAA,EAChE;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-4UB5Z3ZZ.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\n\n/** `row` for a list section; `card` for a board column. */\nexport type SummaryRowPresentation = 'row' | 'card';\n/** A row's place in a rounded list section, so its corners match. */\nexport type SummaryRowListEdge = 'start' | 'end' | 'only';\n\nconst summaryRowProtected = new Set([\n 'data-component',\n 'data-presentation',\n 'data-list-edge',\n 'data-rail',\n 'data-selected',\n 'data-dimmed',\n]);\n\ntype SummaryRowRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-presentation'?: never;\n 'data-list-edge'?: never;\n 'data-rail'?: never;\n 'data-selected'?: never;\n 'data-dimmed'?: never;\n }\n>;\n\nexport interface SummaryRowProps {\n /** The identity line: an identifier, inline status glyphs, and the title. */\n title: KerfUiContent;\n /** Optional leading glyph, such as a category icon. */\n leading?: SafeHtml;\n /** Quiet text at the end of the title line, such as a relative time. */\n trailingMeta?: string | SafeHtml;\n /** A wrapping line of badges, chips, and quiet text below the title. */\n metadata?: KerfUiContent;\n /** `row` (default) or `card`. */\n presentation?: SummaryRowPresentation;\n /** Title lines before clipping; default 2 for a row and 4 for a card. */\n titleLines?: number;\n /** A leading state rail in a semantic tone (Up Next, blocked, …). */\n rail?: SemanticTone;\n /** Selected state, exposed as `aria-selected`. */\n selected?: boolean;\n /** Dim a finished or cut item; hover and selection restore it. */\n dimmed?: boolean;\n /** Round the corners that meet a rounded list section's edge. */\n listEdge?: SummaryRowListEdge;\n /** Skip rendering while off screen in long lists (`content-visibility`). */\n deferRendering?: boolean;\n /** Accessible name when the visible content is not a good one. */\n ariaLabel?: string;\n id?: string;\n className?: string;\n /** Safe `data-*` identity (an item id or delegated action) on the option. */\n rootAttributes?: SummaryRowRootAttributes;\n}\n\n/**\n * A selectable, keyboard-focusable summary of one item, as a list row or a\n * board card: an optional leading glyph and state rail, a clamped identity line\n * with trailing quiet metadata, and a wrapping metadata line. It is a\n * `role=\"option\"`; place rows in a labeled `role=\"listbox\"` and own selection\n * and keyboard movement in the application.\n */\nexport function SummaryRow({\n title,\n leading,\n trailingMeta,\n metadata,\n presentation = 'row',\n titleLines,\n rail,\n selected = false,\n dimmed = false,\n listEdge,\n deferRendering = false,\n ariaLabel,\n id,\n className = '',\n rootAttributes = {},\n}: SummaryRowProps) {\n if (\n titleLines !== undefined &&\n (!Number.isInteger(titleLines) || titleLines < 1)\n )\n throw new RangeError('SummaryRow titleLines must be a positive integer');\n return (\n <div\n {...filterDataAttributes(rootAttributes, summaryRowProtected)}\n id={id}\n class={`kui-summary-row ${className}`.trim()}\n data-component=\"summary-row\"\n data-presentation={presentation}\n data-list-edge={listEdge}\n data-rail={rail}\n data-selected={selected ? 'true' : undefined}\n data-dimmed={dimmed ? 'true' : undefined}\n data-defer={deferRendering ? 'true' : undefined}\n role=\"option\"\n tabindex=\"0\"\n aria-selected={selected ? 'true' : 'false'}\n aria-label={ariaLabel}\n style={\n titleLines === undefined\n ? undefined\n : `--_kui-summary-row-title-lines:${titleLines}`\n }\n >\n {rail && <span class=\"kui-summary-row__rail\" aria-hidden=\"true\" />}\n <div class=\"kui-summary-row__body\">\n {leading && <span class=\"kui-summary-row__leading\">{leading}</span>}\n <div class=\"kui-summary-row__content\">\n <div class=\"kui-summary-row__title\">\n {trailingMeta !== undefined && (\n <span class=\"kui-summary-row__trailing\">{trailingMeta}</span>\n )}\n {title}\n </div>\n {metadata && <div class=\"kui-summary-row__metadata\">{metadata}</div>}\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Skeleton } from './chunk-Y43B6DS3.js';
2
- import { Badge } from './chunk-J3AWE5I4.js';
2
+ import { Badge } from './chunk-U6QYTMDB.js';
3
3
  import { em } from './chunk-U657IHFB.js';
4
4
  import { jsxs, jsx } from 'kerfjs/jsx-runtime';
5
5
 
@@ -13,6 +13,8 @@ function StateBanner({
13
13
  urgency = "status",
14
14
  copyLayout = "inline",
15
15
  actionPlacement = "trailing",
16
+ presentation = "card",
17
+ dividerSides = "b",
16
18
  className = "",
17
19
  placeholder = false,
18
20
  slot
@@ -25,6 +27,8 @@ function StateBanner({
25
27
  "data-tone": tone,
26
28
  "data-copy-layout": copyLayout,
27
29
  "data-action-placement": actionPlacement,
30
+ "data-presentation": presentation,
31
+ "divider-sides": presentation === "strip" ? dividerSides || void 0 : void 0,
28
32
  "data-placeholder": placeholder ? "true" : void 0,
29
33
  role: urgency,
30
34
  "aria-live": urgency === "alert" ? "assertive" : "polite",
@@ -45,4 +49,4 @@ function StateBanner({
45
49
 
46
50
  export { StateBanner };
47
51
 
48
- //# sourceMappingURL=chunk-PGL6TXFW.js.map
52
+ //# sourceMappingURL=chunk-6BRRUPJY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/feedback/state-banner/state-banner.tsx"],"names":[],"mappings":";;;;;AAkDO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,OAAA,GAAU,QAAA;AAAA,EACV,UAAA,GAAa,QAAA;AAAA,EACb,eAAA,GAAkB,UAAA;AAAA,EAClB,YAAA,GAAe,MAAA;AAAA,EACf,YAAA,GAAe,GAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,EAAqB;AACnB,EAAA,uBACE,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAW,IAAA;AAAA,MACX,kBAAA,EAAkB,UAAA;AAAA,MAClB,uBAAA,EAAuB,eAAA;AAAA,MACvB,mBAAA,EAAmB,YAAA;AAAA,MACnB,eAAA,EACE,YAAA,KAAiB,OAAA,GAAU,YAAA,IAAgB,MAAA,GAAY,MAAA;AAAA,MAEzD,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,IAAA,EAAM,OAAA;AAAA,MACN,WAAA,EAAW,OAAA,KAAY,OAAA,GAAU,WAAA,GAAc,QAAA;AAAA,MAC/C,WAAA,EAAW,cAAc,MAAA,GAAS,MAAA;AAAA,MAClC,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBACpD,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,wBAAA,EACT,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAQ,wCAAc,GAAA,CAAC,QAAA,EAAA,EAAS,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,GAAK,KAAA,EAAM,CAAA;AAAA,UAC1D,yBACC,GAAA,CAAC,KAAA,EAAA,EAAM,UAAA,EAAW,OAAA,EAAQ,MAAK,SAAA,EAAU,IAAA,EACtC,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,YAAS,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA,EAAG,IAAK,KAAA,EACjD,CAAA;AAAA,UAED,0BACC,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,0BAAA,EACV,8BAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,QAAA,EAAA,EAAS,OAAO,EAAA,CAAG,EAAE,CAAA,EAAG,CAAA,GAAK,QAAO,CAAA,EAC5D;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,MAAA,oBAAU,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,4BAA4B,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,GAC3D;AAEJ","file":"chunk-6BRRUPJY.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport type { Sides } from '../../../shared/layout/sides.js';\nimport { em } from '../../../shared/styles/css-values.js';\nimport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\nimport { Badge } from '../badge/badge.js';\nimport { Skeleton } from '../skeleton/skeleton.js';\n\nexport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\n/** @deprecated Use SemanticTone. */\nexport type StateBannerTone = SemanticTone;\nexport type StateBannerUrgency = 'status' | 'alert';\nexport type StateBannerCopyLayout = 'inline' | 'stacked';\nexport type StateBannerActionPlacement = 'trailing' | 'below';\nexport type StateBannerPresentation = 'card' | 'strip';\n\nexport interface StateBannerProps {\n title: string;\n detail?: string;\n /** Optional compact status or count shown beside the title. */\n badge?: string;\n icon?: SafeHtml;\n action?: KerfUiContent;\n tone?: SemanticTone;\n urgency?: StateBannerUrgency;\n /** Keep the detail beside the title, or give it its own line. */\n copyLayout?: StateBannerCopyLayout;\n /** Place the action beside the copy or on a separate trailing row. */\n actionPlacement?: StateBannerActionPlacement;\n /**\n * `card` (the default) is an inset, rounded, fully bordered banner beside\n * the affected work. `strip` is a full-width band at a layout edge, such as\n * above a workspace: square corners, no inline margin, inline padding on the\n * shared content-text column, and only the tone-colored `dividerSides` edges.\n */\n presentation?: StateBannerPresentation;\n /**\n * Physical tone-colored divider edges of a `strip`, in canonical\n * top/right/bottom/left order. Defaults to the bottom edge; `''` draws none.\n * A `card` keeps its full border and ignores this.\n */\n dividerSides?: Sides;\n className?: string;\n /** Render the title, badge, and detail as unanimated loading skeletons, keeping the icon and tone. The detail line appears only when `detail` is set, as in the live banner. */\n placeholder?: boolean;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport function StateBanner({\n title,\n detail,\n badge,\n icon,\n action,\n tone = 'info',\n urgency = 'status',\n copyLayout = 'inline',\n actionPlacement = 'trailing',\n presentation = 'card',\n dividerSides = 'b',\n className = '',\n placeholder = false,\n slot,\n}: StateBannerProps) {\n return (\n <section\n class={`kui-state-banner ${className}`.trim()}\n data-component=\"state-banner\"\n data-tone={tone}\n data-copy-layout={copyLayout}\n data-action-placement={actionPlacement}\n data-presentation={presentation}\n divider-sides={\n presentation === 'strip' ? dividerSides || undefined : undefined\n }\n data-placeholder={placeholder ? 'true' : undefined}\n role={urgency}\n aria-live={urgency === 'alert' ? 'assertive' : 'polite'}\n aria-busy={placeholder ? 'true' : undefined}\n slot={slot}\n >\n {icon && <span class=\"kui-state-banner__icon\">{icon}</span>}\n <div class=\"kui-state-banner__copy\">\n <strong>{placeholder ? <Skeleton width={em(10)} /> : title}</strong>\n {badge && (\n <Badge appearance=\"solid\" size=\"compact\" tone={tone}>\n {placeholder ? <Skeleton width={em(1.75)} /> : badge}\n </Badge>\n )}\n {detail && (\n <span class=\"kui-state-banner__detail\">\n <span>{placeholder ? <Skeleton width={em(16)} /> : detail}</span>\n </span>\n )}\n </div>\n {action && <div class=\"kui-state-banner__action\">{action}</div>}\n </section>\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Skeleton } from './chunk-Y43B6DS3.js';
2
2
  import { em } from './chunk-U657IHFB.js';
3
- import { filterDataAttributes } from './chunk-LAZLBC2Q.js';
3
+ import { filterDataAttributes } from './chunk-KH4KEMSP.js';
4
4
  import { jsxs, jsx } from 'kerfjs/jsx-runtime';
5
5
 
6
6
  var PROTECTED_ROOT_DATA_ATTRIBUTES = /* @__PURE__ */ new Set([
@@ -135,4 +135,4 @@ function AppTab({
135
135
 
136
136
  export { AppTab };
137
137
 
138
- //# sourceMappingURL=chunk-KAJVVN7Q.js.map
138
+ //# sourceMappingURL=chunk-6NOLL5KG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/navigation/app-tab/app-tab.tsx"],"names":[],"mappings":";;;;;AAOA,IAAM,8BAAA,uBAAqC,GAAA,CAAI;AAAA,EAC7C,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,wBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAkED,SAAS,SAAA,GAAY;AACnB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACZ,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,cAAA,EAAa,MAAA;AAAA,MACb,gBAAA,EAAe,OAAA;AAAA,MAEf,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,YAAA,EAAa,CAAA;AAAA,wBACrB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA;AAAA;AAAA,GACvB;AAEJ;AAEO,SAAS,MAAA,CAAO;AAAA,EACrB,EAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,MAAA,GAAS,KAAA;AAAA,EACT,QAAA,GAAW,IAAA;AAAA,EACX,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,GAAe,MAAA;AAAA,EACf,IAAA,GAAO,SAAA;AAAA,EACP,aAAA;AAAA,EACA,YAAA,GAAe,UAAA;AAAA,EACf,SAAA;AAAA,EACA,YAAA,GAAe,YAAA;AAAA,EACf,WAAA,GAAc,WAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd,OAAA,GAAU,KAAA;AAAA,EACV,iBAAiB,EAAC;AAAA,EAClB;AACF,CAAA,EAAgB;AAId,EAAA,MAAM,UAAU,WAAA,IAAe,OAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,WAAA;AAC1B,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,QAAA,IAAY,CAAC,OAAA,GAAU,kBAAA,GAAqB,EAAA;AAAA,IAC5C,SAAA,IAAa,CAAC,OAAA,GAAU,0CAAA,GAA6C;AAAA,GACvE,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,EAAA,MAAM,mBAAA,GAAsB,oBAAA;AAAA,IAC1B,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,mBAAA;AAAA,MACJ,KAAA,EAAO,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACvC,gBAAA,EAAe,SAAA;AAAA,MACf,aAAA,EAAa,EAAA;AAAA,MACb,eAAA,EAAe,OAAO,QAAQ,CAAA;AAAA,MAC9B,gBAAA,EAAgB,YAAY,MAAA,GAAS,MAAA;AAAA,MACrC,kBAAA,EAAkB,aAAa,MAAA,GAAS,MAAA;AAAA,MACxC,aAAA,EAAa,SAAS,MAAA,GAAS,MAAA;AAAA,MAC/B,oBAAA,EAAoB,YAAA;AAAA,MACpB,mBAAA,EAAmB,YAAA;AAAA,MACnB,WAAA,EAAW,IAAA;AAAA,MACX,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,cAAA,EAAc,QAAQ,MAAA,GAAS,MAAA;AAAA,MAC/B,SAAA,EAAW,OAAA,GAAU,OAAA,GAAU,SAAA,GAAY,MAAA,GAAS,OAAA;AAAA,MACpD,WAAA,EAAW,UAAU,MAAA,GAAS,MAAA;AAAA,MAC9B,KAAA,EACE,aAAA,KAAkB,MAAA,GACd,MAAA,GACA,iCAAiC,aAAa,CAAA,EAAA,CAAA;AAAA,MAEpD,IAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA,oBACC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAS,IAAA;AAAA,YACT,KAAA,EAAM,oBAAA;AAAA,YACN,aAAA,EAAa,UAAU,MAAA,GAAY,WAAA;AAAA,YACnC,aAAA,EAAa,EAAA;AAAA,YACb,UAAU,OAAA,IAAW,MAAA;AAAA,YACrB,YAAA,EAAY,SAAS,IAAI,CAAA,CAAA;AAAA,YACzB,KAAA,EAAO,SAAS,IAAI,CAAA,CAAA;AAAA,YAEpB,QAAA,kBAAA,GAAA,CAAC,UAAK,KAAA,EAAM,yBAAA,EAA0B,eAAY,MAAA,EAC/C,QAAA,EAAA,SAAA,oBAAa,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EAC3B;AAAA;AAAA,SACF;AAAA,wBAEF,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,qBAAA;AAAA,YACN,IAAA,EAAK,KAAA;AAAA,YACL,eAAA,EAAe,OAAO,QAAQ,CAAA;AAAA,YAC9B,YAAA,EAAY,YAAA,KAAiB,WAAA,IAAe,KAAA,GAAQ,IAAA,GAAO,MAAA;AAAA,YAC3D,qBAAmB,YAAA,IAAgB,MAAA;AAAA,YACnC,aAAA,EAAa,cAAc,MAAA,GAAY,YAAA;AAAA,YACvC,aAAA,EAAa,EAAA;AAAA,YACb,UAAU,WAAA,IAAe,MAAA;AAAA,YACzB,QAAA,EAAU,CAAC,WAAA,IAAe,QAAA,GAAW,GAAA,GAAM,IAAA;AAAA,YAE1C,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,8BACD,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,mBAAA;AAAA,kBACN,aAAA,EAAa,YAAA,KAAiB,WAAA,GAAc,MAAA,GAAS,MAAA;AAAA,kBAEpD,wCAAc,GAAA,CAAC,QAAA,EAAA,EAAS,OAAO,EAAA,CAAG,CAAC,GAAG,CAAA,GAAK;AAAA;AAAA,eAC9C;AAAA,cACC,YAAY,QAAA,mBACX,GAAA,CAAC,UAAK,KAAA,EAAM,uBAAA,EAAyB,oBAAS,CAAA,GAC5C;AAAA;AAAA;AAAA;AACN;AAAA;AAAA,GACF;AAEJ","file":"chunk-KAJVVN7Q.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport { em } from '../../../shared/styles/css-values.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-tab-id',\n 'data-selected',\n 'data-tab-dragging',\n 'data-tab-drop-position',\n 'data-attention',\n 'data-drop-target',\n 'data-name-overflow',\n 'data-pinned',\n]);\n\ntype AppTabRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-tab-id'?: never;\n 'data-selected'?: never;\n 'data-tab-dragging'?: never;\n 'data-tab-drop-position'?: never;\n 'data-attention'?: never;\n 'data-drop-target'?: never;\n 'data-name-overflow'?: never;\n 'data-pinned'?: never;\n }\n>;\n\nexport type AppTabPresentation = 'pill' | 'segmented' | 'icon-only';\nexport type AppTabSize = 'default' | 'compact';\nexport type AppTabNameOverflow = 'ellipsis' | 'visible';\n\nexport interface AppTabProps {\n id: string;\n name: string;\n selected?: boolean;\n /** Emphasize the visible tab name with the attention color token. */\n attention?: boolean;\n /** Highlight this tab as the target of a drag over its content. */\n dropTarget?: boolean;\n /** Keep the leading tab visible within its TabBar tablist while peers scroll. */\n pinned?: boolean;\n closable?: boolean;\n draggable?: boolean;\n leading?: KerfUiContent;\n trailing?: KerfUiContent;\n /** Visual treatment within a TabBar. Icon-only tabs retain `name` as their accessible name. */\n presentation?: AppTabPresentation;\n /** Compact tabs use the 32px application-rail height. */\n size?: AppTabSize;\n /** Maximum visible label width in CSS pixels before ellipsis. */\n labelMaxWidth?: number;\n /** Keep the full name visible for an inline loading treatment. */\n nameOverflow?: AppTabNameOverflow;\n /** Decorative dormant content for the close button. Must not contain interactive descendants. */\n closeIcon?: SafeHtml;\n selectAction?: string;\n closeAction?: string;\n className?: string;\n /** Render as an unanimated loading skeleton, disabling select/close and dragging. */\n placeholder?: boolean;\n /**\n * Named and still opening: the tab is known but its content is loading.\n * Keeps `name` visible in the quiet text color and as the tab's accessible\n * name, shows `trailing` (for example a `LoadingSpinner`), and marks the\n * tab `aria-busy`. Unlike `placeholder` it stays selectable — the\n * application shows placeholder content in its panel until loading\n * completes — while close and dragging stay disabled. Same pill geometry\n * as the live tab, so swapping it in place does not shift the bar.\n * `placeholder` wins when both are set.\n */\n pending?: boolean;\n rootAttributes?: AppTabRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nfunction CloseIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.25\"\n stroke-linecap=\"round\"\n >\n <path d=\"m7 7 10 10\" />\n <path d=\"M17 7 7 17\" />\n </svg>\n );\n}\n\nexport function AppTab({\n id,\n name,\n selected = false,\n attention = false,\n dropTarget = false,\n pinned = false,\n closable = true,\n draggable = false,\n leading,\n trailing,\n presentation = 'pill',\n size = 'default',\n labelMaxWidth,\n nameOverflow = 'ellipsis',\n closeIcon,\n selectAction = 'select-tab',\n closeAction = 'close-tab',\n className = '',\n placeholder = false,\n pending = false,\n rootAttributes = {},\n slot,\n}: AppTabProps) {\n // Both loading states disable close and dragging; a `placeholder` (unknown\n // tab) is also unselectable and hides its name, while a `pending` (known,\n // still opening) tab stays selectable so its panel can show placeholders.\n const dormant = placeholder || pending;\n const named = pending && !placeholder;\n const keyshortcuts = [\n closable && !dormant ? 'Delete Backspace' : '',\n draggable && !dormant ? 'Alt+Shift+ArrowLeft Alt+Shift+ArrowRight' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const extensionAttributes = filterDataAttributes(\n rootAttributes,\n PROTECTED_ROOT_DATA_ATTRIBUTES,\n );\n return (\n <div\n {...extensionAttributes}\n class={`kui-app-tab ${className}`.trim()}\n data-component=\"app-tab\"\n data-tab-id={id}\n data-selected={String(selected)}\n data-attention={attention ? 'true' : undefined}\n data-drop-target={dropTarget ? 'true' : undefined}\n data-pinned={pinned ? 'true' : undefined}\n data-name-overflow={nameOverflow}\n data-presentation={presentation}\n data-size={size}\n data-placeholder={placeholder ? 'true' : undefined}\n data-pending={named ? 'true' : undefined}\n draggable={dormant ? 'false' : draggable ? 'true' : 'false'}\n aria-busy={dormant ? 'true' : undefined}\n style={\n labelMaxWidth === undefined\n ? undefined\n : `--kui-app-tab-label-max-width:${labelMaxWidth}px`\n }\n slot={slot}\n >\n {closable && (\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"kui-app-tab__close\"\n data-action={dormant ? undefined : closeAction}\n data-tab-id={id}\n disabled={dormant || undefined}\n aria-label={`Close ${name}`}\n title={`Close ${name}`}\n >\n <span class=\"kui-app-tab__close-icon\" aria-hidden=\"true\">\n {closeIcon ?? <CloseIcon />}\n </span>\n </button>\n )}\n <button\n type=\"button\"\n class=\"kui-app-tab__select\"\n role=\"tab\"\n aria-selected={String(selected)}\n aria-label={presentation === 'icon-only' || named ? name : undefined}\n aria-keyshortcuts={keyshortcuts || undefined}\n data-action={placeholder ? undefined : selectAction}\n data-tab-id={id}\n disabled={placeholder || undefined}\n tabindex={!placeholder && selected ? '0' : '-1'}\n >\n {leading}\n <span\n class=\"kui-app-tab__name\"\n aria-hidden={presentation === 'icon-only' ? 'true' : undefined}\n >\n {placeholder ? <Skeleton width={em(7)} /> : name}\n </span>\n {closable || trailing ? (\n <span class=\"kui-app-tab__trailing\">{trailing}</span>\n ) : undefined}\n </button>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/navigation/app-tab/app-tab.tsx"],"names":[],"mappings":"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","file":"chunk-6NOLL5KG.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport { em } from '../../../shared/styles/css-values.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-tab-id',\n 'data-selected',\n 'data-tab-dragging',\n 'data-tab-drop-position',\n 'data-attention',\n 'data-drop-target',\n 'data-name-overflow',\n 'data-pinned',\n]);\n\ntype AppTabRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-tab-id'?: never;\n 'data-selected'?: never;\n 'data-tab-dragging'?: never;\n 'data-tab-drop-position'?: never;\n 'data-attention'?: never;\n 'data-drop-target'?: never;\n 'data-name-overflow'?: never;\n 'data-pinned'?: never;\n }\n>;\n\nexport type AppTabPresentation = 'pill' | 'segmented' | 'icon-only';\nexport type AppTabSize = 'default' | 'compact';\nexport type AppTabNameOverflow = 'ellipsis' | 'visible';\n\nexport interface AppTabProps {\n id: string;\n name: string;\n selected?: boolean;\n /** Emphasize the visible tab name with the attention color token. */\n attention?: boolean;\n /** Highlight this tab as the target of a drag over its content. */\n dropTarget?: boolean;\n /** Keep the leading tab visible within its TabBar tablist while peers scroll. */\n pinned?: boolean;\n closable?: boolean;\n draggable?: boolean;\n leading?: KerfUiContent;\n trailing?: KerfUiContent;\n /** Visual treatment within a TabBar. Icon-only tabs retain `name` as their accessible name. */\n presentation?: AppTabPresentation;\n /** Compact tabs use the 32px application-rail height. */\n size?: AppTabSize;\n /** Maximum visible label width in CSS pixels before ellipsis. */\n labelMaxWidth?: number;\n /** Keep the full name visible for an inline loading treatment. */\n nameOverflow?: AppTabNameOverflow;\n /** Decorative dormant content for the close button. Must not contain interactive descendants. */\n closeIcon?: SafeHtml;\n selectAction?: string;\n closeAction?: string;\n className?: string;\n /** Render as an unanimated loading skeleton, disabling select/close and dragging. */\n placeholder?: boolean;\n /**\n * Named and still opening: the tab is known but its content is loading.\n * Keeps `name` visible in the quiet text color and as the tab's accessible\n * name, shows `trailing` (for example a `LoadingSpinner`), and marks the\n * tab `aria-busy`. Unlike `placeholder` it stays selectable — the\n * application shows placeholder content in its panel until loading\n * completes — while close and dragging stay disabled. Same pill geometry\n * as the live tab, so swapping it in place does not shift the bar.\n * `placeholder` wins when both are set.\n */\n pending?: boolean;\n rootAttributes?: AppTabRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nfunction CloseIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2.25\"\n stroke-linecap=\"round\"\n >\n <path d=\"m7 7 10 10\" />\n <path d=\"M17 7 7 17\" />\n </svg>\n );\n}\n\nexport function AppTab({\n id,\n name,\n selected = false,\n attention = false,\n dropTarget = false,\n pinned = false,\n closable = true,\n draggable = false,\n leading,\n trailing,\n presentation = 'pill',\n size = 'default',\n labelMaxWidth,\n nameOverflow = 'ellipsis',\n closeIcon,\n selectAction = 'select-tab',\n closeAction = 'close-tab',\n className = '',\n placeholder = false,\n pending = false,\n rootAttributes = {},\n slot,\n}: AppTabProps) {\n // Both loading states disable close and dragging; a `placeholder` (unknown\n // tab) is also unselectable and hides its name, while a `pending` (known,\n // still opening) tab stays selectable so its panel can show placeholders.\n const dormant = placeholder || pending;\n const named = pending && !placeholder;\n const keyshortcuts = [\n closable && !dormant ? 'Delete Backspace' : '',\n draggable && !dormant ? 'Alt+Shift+ArrowLeft Alt+Shift+ArrowRight' : '',\n ]\n .filter(Boolean)\n .join(' ');\n const extensionAttributes = filterDataAttributes(\n rootAttributes,\n PROTECTED_ROOT_DATA_ATTRIBUTES,\n );\n return (\n <div\n {...extensionAttributes}\n class={`kui-app-tab ${className}`.trim()}\n data-component=\"app-tab\"\n data-tab-id={id}\n data-selected={String(selected)}\n data-attention={attention ? 'true' : undefined}\n data-drop-target={dropTarget ? 'true' : undefined}\n data-pinned={pinned ? 'true' : undefined}\n data-name-overflow={nameOverflow}\n data-presentation={presentation}\n data-size={size}\n data-placeholder={placeholder ? 'true' : undefined}\n data-pending={named ? 'true' : undefined}\n draggable={dormant ? 'false' : draggable ? 'true' : 'false'}\n aria-busy={dormant ? 'true' : undefined}\n style={\n labelMaxWidth === undefined\n ? undefined\n : `--kui-app-tab-label-max-width:${labelMaxWidth}px`\n }\n slot={slot}\n >\n {closable && (\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"kui-app-tab__close\"\n data-action={dormant ? undefined : closeAction}\n data-tab-id={id}\n disabled={dormant || undefined}\n aria-label={`Close ${name}`}\n title={`Close ${name}`}\n >\n <span class=\"kui-app-tab__close-icon\" aria-hidden=\"true\">\n {closeIcon ?? <CloseIcon />}\n </span>\n </button>\n )}\n <button\n type=\"button\"\n class=\"kui-app-tab__select\"\n role=\"tab\"\n aria-selected={String(selected)}\n aria-label={presentation === 'icon-only' || named ? name : undefined}\n aria-keyshortcuts={keyshortcuts || undefined}\n data-action={placeholder ? undefined : selectAction}\n data-tab-id={id}\n disabled={placeholder || undefined}\n tabindex={!placeholder && selected ? '0' : '-1'}\n >\n {leading}\n <span\n class=\"kui-app-tab__name\"\n aria-hidden={presentation === 'icon-only' ? 'true' : undefined}\n >\n {placeholder ? <Skeleton width={em(7)} /> : name}\n </span>\n {closable || trailing ? (\n <span class=\"kui-app-tab__trailing\">{trailing}</span>\n ) : undefined}\n </button>\n </div>\n );\n}\n"]}
@@ -1,6 +1,17 @@
1
1
  import { popover } from 'kerfjs/overlay';
2
2
 
3
3
  // src/components/feedback/anchored-surface/anchored-surface.tsx
4
+ function modalScope(context) {
5
+ let child;
6
+ for (let node = context ?? null; node !== null; ) {
7
+ if (node.localName === "dialog") return node;
8
+ if (child?.assignedSlot?.closest("dialog")) return node;
9
+ child = node;
10
+ const root = node.getRootNode();
11
+ node = node.parentElement ?? (root instanceof ShadowRoot ? root.host : null);
12
+ }
13
+ return document.body;
14
+ }
4
15
  function openAnchoredSurface(anchor, content, options) {
5
16
  const {
6
17
  label,
@@ -37,7 +48,7 @@ function openAnchoredSurfaceAt(point, content, options) {
37
48
  anchor.setAttribute("aria-hidden", "true");
38
49
  anchor.style.cssText = "position:fixed;width:0;height:0;pointer-events:none;visibility:hidden";
39
50
  anchor.getBoundingClientRect = () => new DOMRect(x, y, 0, 0);
40
- (context?.closest("dialog") ?? document.body).append(anchor);
51
+ modalScope(context).append(anchor);
41
52
  try {
42
53
  const handle = openAnchoredSurface(anchor, content, options);
43
54
  void handle.result.then(() => anchor.remove());
@@ -50,4 +61,4 @@ function openAnchoredSurfaceAt(point, content, options) {
50
61
 
51
62
  export { openAnchoredSurface, openAnchoredSurfaceAt };
52
63
 
53
- //# sourceMappingURL=chunk-IOS2NXW7.js.map
64
+ //# sourceMappingURL=chunk-76PWEN5Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/feedback/anchored-surface/anchored-surface.tsx"],"names":[],"mappings":"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","file":"chunk-76PWEN5Y.js","sourcesContent":["import type { OverlayContent, OverlayHandle } from 'kerfjs/overlay';\nimport { popover, type PopoverOptions } from 'kerfjs/overlay';\n\n/** App-facing options for a non-modal, arbitrary-content help surface. */\nexport interface AnchoredSurfaceOptions extends Pick<\n PopoverOptions,\n | 'placement'\n | 'align'\n | 'gap'\n | 'dismiss'\n | 'initialFocus'\n | 'onDismiss'\n | 'outsideIgnore'\n | 'container'\n> {\n /** Accessible name for the non-modal dialog. */\n label: string;\n /**\n * Where to append the surface. Default: inside the anchor's open modal\n * dialog — a native `<dialog>`'s host slot, or a slot kerf creates in a\n * `wa-dialog` / `wa-drawer` — so the surface stays interactive there;\n * otherwise `document.body`. Pass an element only for a modal context kerf\n * cannot resolve; an element inside an open modal closes the surface with it.\n */\n container?: Element;\n}\n\n/** A viewport pointer location; `context` is the element under the pointer. */\nexport interface AnchoredSurfacePoint {\n x: number;\n y: number;\n /**\n * Pass the event target when opening from inside a modal dialog, native or\n * Web Awesome (`wa-dialog`, `wa-drawer`).\n */\n context?: Element;\n}\n\n// The element a temporary pointer anchor joins so the overlay core resolves\n// the same modal context as `context`: the nearest `<dialog>`, or a shadow host\n// (`wa-dialog`, `wa-drawer`) whose slot renders `context` inside a `<dialog>`\n// in its shadow root. Light-DOM children of that host are slotted inside it.\nfunction modalScope(context: Element | undefined): Element {\n let child: Element | undefined;\n for (let node = context ?? null; node !== null;) {\n if (node.localName === 'dialog') return node;\n if (child?.assignedSlot?.closest('dialog')) return node;\n child = node;\n const root = node.getRootNode();\n node =\n node.parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n return document.body;\n}\n\n/**\n * Open app-owned content beside an element. The surface owns its Kerf UI chrome;\n * kerfjs/overlay owns positioning, top-layer/modal hosting, focus, and dismissal.\n * The caller owns content, action policy, and calling `close()` when an action\n * completes. `initialFocus` defaults to the first focusable descendant; set it\n * to `false` for read-only help that should leave focus on its trigger.\n */\nexport function openAnchoredSurface(\n anchor: Element,\n content: OverlayContent,\n options: AnchoredSurfaceOptions,\n): OverlayHandle {\n const {\n label,\n initialFocus = true,\n dismiss = ['escape', 'outside'],\n ...rest\n } = options;\n if (!label.trim())\n throw new TypeError('openAnchoredSurface() requires a nonempty label');\n // Safari does not focus buttons on pointer press. Make a focusable trigger\n // the overlay's restore target consistently, including that engine.\n if (anchor instanceof HTMLElement && anchor.tabIndex >= 0) anchor.focus();\n const handle = popover(anchor, content, {\n ...rest,\n className: 'kui-anchored-surface',\n native: true,\n initialFocus,\n dismiss,\n });\n handle.el.setAttribute('role', 'dialog');\n handle.el.setAttribute('aria-label', label);\n handle.el.dataset.component = 'anchored-surface';\n const dialog = anchor.closest('dialog');\n if (dialog?.open) {\n const onClose = () => handle.close();\n dialog.addEventListener('close', onClose);\n void handle.result.then(() => dialog.removeEventListener('close', onClose));\n }\n return handle;\n}\n\n/**\n * Open the same surface at pointer coordinates. The temporary anchor has no\n * layout or hit target. `context` keeps a surface opened inside a modal dialog\n * in that dialog's interactive host slot; it is removed on close or failure.\n */\nexport function openAnchoredSurfaceAt(\n point: AnchoredSurfacePoint,\n content: OverlayContent,\n options: AnchoredSurfaceOptions,\n): OverlayHandle {\n const { x, y, context } = point;\n if (!Number.isFinite(x) || !Number.isFinite(y))\n throw new TypeError('openAnchoredSurfaceAt() requires finite coordinates');\n const anchor = document.createElement('span');\n anchor.setAttribute('aria-hidden', 'true');\n anchor.style.cssText =\n 'position:fixed;width:0;height:0;pointer-events:none;visibility:hidden';\n // The positioning core reads the anchor's viewport rect. A virtual rect\n // avoids coordinate conversion when `context` sits in a transformed dialog.\n anchor.getBoundingClientRect = () => new DOMRect(x, y, 0, 0);\n // Only modal membership matters for host selection. Keep the temporary node\n // out of the event target itself (which may be an input or a custom element).\n modalScope(context).append(anchor);\n try {\n const handle = openAnchoredSurface(anchor, content, options);\n void handle.result.then(() => anchor.remove());\n return handle;\n } catch (error) {\n anchor.remove();\n throw error;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { filterDataAttributes } from './chunk-LAZLBC2Q.js';
1
+ import { filterDataAttributes } from './chunk-KH4KEMSP.js';
2
2
  import { jsx } from 'kerfjs/jsx-runtime';
3
3
 
4
4
  function roleForSelectionMode(mode) {
@@ -15,12 +15,14 @@ function roleForSelectionMode(mode) {
15
15
  var contentItemProtectedAttributes = /* @__PURE__ */ new Set([
16
16
  "data-component",
17
17
  "data-appearance",
18
- "data-outlined"
18
+ "data-outlined",
19
+ "data-bubble"
19
20
  ]);
20
21
  var interactiveProtectedAttributes = /* @__PURE__ */ new Set([
21
22
  "data-component",
22
23
  "data-appearance",
23
24
  "data-outlined",
25
+ "data-bubble",
24
26
  "data-action",
25
27
  "data-item-id",
26
28
  "data-interactive",
@@ -35,6 +37,7 @@ function ContentItem({
35
37
  frame = "none",
36
38
  flush = false,
37
39
  shape = "rounded",
40
+ bubble,
38
41
  title,
39
42
  ariaLabel,
40
43
  focusTarget = false,
@@ -87,6 +90,7 @@ function ContentItem({
87
90
  "data-component": "content-item",
88
91
  "data-appearance": appearance,
89
92
  "data-outlined": outlined ? "true" : void 0,
93
+ "data-bubble": bubble,
90
94
  role,
91
95
  "aria-label": ariaLabel,
92
96
  "aria-selected": interactive && (selectionMode === "single" || selectionMode === "multiple") ? String(selected) : void 0,
@@ -101,4 +105,4 @@ function ContentItem({
101
105
 
102
106
  export { ContentItem };
103
107
 
104
- //# sourceMappingURL=chunk-B3TROLC2.js.map
108
+ //# sourceMappingURL=chunk-7IUEBNCO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/surfaces/content-item/content-item.tsx"],"names":[],"mappings":"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","file":"chunk-7IUEBNCO.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\n\nexport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\n\n/**\n * Base surface treatment, semantic status colors, or `brand-loud`: the solid\n * brand fill with its on-loud foreground (a transcript's own messages).\n */\nexport type ContentItemAppearance =\n 'transparent' | 'surface' | 'brand-loud' | SemanticTone;\n\n/**\n * A chat-bubble layout for transcripts: the item fits its content up to 80%\n * of the row and sits at the `start` (other participants) or `end` (the\n * person's own messages) of the line.\n */\nexport type ContentItemBubble = 'start' | 'end';\n\n/** Whether the item's always-reserved 1px border is transparent or visible. */\nexport type ContentItemFrame = 'none' | 'framed';\n\n/** Corner shape: the 12px rounded rectangle or the 22px pill. */\nexport type ContentItemShape = 'rounded' | 'pill';\n/** `single` uses an option; `multiple` uses a grid row; `toggle` uses a pressed button. */\nexport type ContentItemSelectionMode =\n 'none' | 'single' | 'multiple' | 'toggle';\n\nfunction roleForSelectionMode(\n mode: ContentItemSelectionMode,\n): 'option' | 'row' | 'button' {\n switch (mode) {\n case 'single':\n return 'option';\n case 'multiple':\n return 'row';\n case 'none':\n case 'toggle':\n return 'button';\n }\n}\n\nconst contentItemProtectedAttributes = new Set([\n 'data-component',\n 'data-appearance',\n 'data-outlined',\n 'data-bubble',\n]);\nconst interactiveProtectedAttributes = new Set([\n 'data-component',\n 'data-appearance',\n 'data-outlined',\n 'data-bubble',\n 'data-action',\n 'data-item-id',\n 'data-interactive',\n 'data-selected',\n 'data-disabled',\n 'data-selection-mode',\n 'data-kui-pressed',\n]);\n\ntype ContentItemRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-appearance'?: never;\n 'data-outlined'?: never;\n 'data-bubble'?: never;\n }\n>;\n\ntype ContentItemInteractiveRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-appearance'?: never;\n 'data-outlined'?: never;\n 'data-bubble'?: never;\n 'data-action'?: never;\n 'data-item-id'?: never;\n 'data-interactive'?: never;\n 'data-selected'?: never;\n 'data-disabled'?: never;\n 'data-selection-mode'?: never;\n 'data-kui-pressed'?: never;\n }\n>;\n\ninterface ContentItemBaseProps {\n /**\n * Coordinated background, border, and foreground colors. `transparent`\n * preserves the surrounding surface; `surface` paints the base surface;\n * semantic values match StateBanner. Defaults to `transparent`.\n */\n appearance?: ContentItemAppearance;\n /** Item content; a plain string is allowed for bare copy. */\n children?: KerfUiContent | string;\n /**\n * `framed` paints the standard neutral border in the 1px the item always\n * reserves, so framing never changes geometry. Frame only an item that\n * marks a real distinction. Defaults to `none` (transparent border).\n */\n frame?: ContentItemFrame;\n /** Remove block padding and block borders while retaining inline geometry. */\n flush?: boolean;\n /** Corner shape. Defaults to `rounded`. */\n shape?: ContentItemShape;\n /**\n * Lay the item out as a chat bubble: content width up to 80% of the row,\n * at the `start` or `end` of the line. Pair `end` with `brand-loud` for the\n * person's own messages. Omit for an ordinary full-width item.\n */\n bubble?: ContentItemBubble;\n /** Native hover tooltip. */\n title?: string;\n /**\n * Names the item as a distinct region (`role=\"region\"`). Omit it for an\n * ordinary item, which stays a non-landmark grouping.\n */\n ariaLabel?: string;\n /**\n * Makes the item a programmatic focus target (`tabindex=\"-1\"`, never a tab\n * stop), for example the preferred initial focus of a NavStack view when\n * combined with `data-nav-focus` in `rootAttributes`.\n */\n focusTarget?: boolean;\n /** Keep the standard focus outline visible, such as for a drop target. */\n outlined?: boolean;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport type ContentItemProps = ContentItemBaseProps &\n (\n | {\n interactive?: false;\n action?: never;\n itemId?: never;\n selectionMode?: never;\n selected?: never;\n disabled?: never;\n /** Opt into keyboard (`0`) or programmatic (`-1`) focus. */\n tabIndex?: 0 | -1;\n /** Existing static `data-*` metadata remains available. */\n rootAttributes?: ContentItemRootAttributes;\n }\n | {\n /** Enable a keyboard reachable card; wire `wireContentItems` once on its containing root. */\n interactive: true;\n /** Delegated action dispatched by pointer, Enter, or Space. */\n action: string;\n itemId?: string;\n selectionMode?: ContentItemSelectionMode;\n selected?: boolean;\n disabled?: boolean;\n tabIndex?: never;\n /** Safe app metadata; interaction attributes are component-owned. */\n rootAttributes?: ContentItemInteractiveRootAttributes;\n }\n );\n\n/**\n * One self-contained `.kui-content` child: an 8px inline margin, a real 1px\n * border (transparent unless `framed`), 8px padding, and a rounded or pill\n * radius. It owns that whole geometry, so wrappers must not add more.\n */\nexport function ContentItem({\n appearance = 'transparent',\n children,\n frame = 'none',\n flush = false,\n shape = 'rounded',\n bubble,\n title,\n ariaLabel,\n focusTarget = false,\n outlined = false,\n tabIndex,\n interactive = false,\n action,\n itemId,\n selectionMode = 'none',\n selected = false,\n disabled = false,\n className = '',\n rootAttributes = {},\n slot,\n}: ContentItemProps) {\n const safeRootAttributes = filterDataAttributes(\n rootAttributes,\n interactive\n ? interactiveProtectedAttributes\n : contentItemProtectedAttributes,\n );\n if (interactive && !action) {\n throw new Error('Interactive ContentItem requires an action');\n }\n if (interactive && selected && selectionMode === 'none') {\n throw new Error('Selected ContentItem requires a selectionMode');\n }\n const cls = [\n 'kui-content-item',\n shape === 'pill' ? 'kui-content-item--pill' : '',\n frame === 'framed' ? 'kui-content-item--framed' : '',\n flush ? 'kui-content-item--flush' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n const interactiveAttributes = interactive\n ? {\n 'data-interactive': 'true',\n 'data-action': disabled ? undefined : action,\n 'data-item-id': itemId,\n 'data-selection-mode': selectionMode,\n 'data-selected':\n selectionMode === 'none' ? undefined : String(selected),\n 'data-disabled': disabled ? 'true' : undefined,\n }\n : {};\n let role: 'option' | 'row' | 'button' | 'region' | undefined = ariaLabel\n ? 'region'\n : undefined;\n if (interactive) role = roleForSelectionMode(selectionMode);\n return (\n <div\n {...safeRootAttributes}\n {...interactiveAttributes}\n class={cls}\n title={title}\n data-component=\"content-item\"\n data-appearance={appearance}\n data-outlined={outlined ? 'true' : undefined}\n data-bubble={bubble}\n role={role}\n aria-label={ariaLabel}\n aria-selected={\n interactive &&\n (selectionMode === 'single' || selectionMode === 'multiple')\n ? String(selected)\n : undefined\n }\n aria-pressed={\n interactive && selectionMode === 'toggle' ? String(selected) : undefined\n }\n aria-disabled={interactive && disabled ? 'true' : undefined}\n tabindex={\n interactive\n ? disabled\n ? '-1'\n : '0'\n : (tabIndex ?? (focusTarget ? '-1' : undefined))\n }\n slot={slot}\n >\n {interactive && selectionMode === 'multiple' ? (\n <div role=\"gridcell\">{children}</div>\n ) : (\n children\n )}\n </div>\n );\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { ToolbarText } from './chunk-3DXHNLME.js';
2
- import { ToolbarControlGroup } from './chunk-MTCTX25G.js';
3
- import { Toolbar } from './chunk-BYHGRKC3.js';
4
- import { Pane } from './chunk-FL6J644M.js';
5
- import { List } from './chunk-QQICWWNX.js';
1
+ import { ToolbarText } from './chunk-IGTWXPTN.js';
2
+ import { ToolbarControlGroup } from './chunk-YXOMI7ES.js';
3
+ import { Toolbar } from './chunk-CMLPFIC5.js';
4
+ import { Pane } from './chunk-GJYQ27C2.js';
5
+ import { List } from './chunk-V6W56V3N.js';
6
6
  import { LucideIcon } from './chunk-UKKRPP56.js';
7
7
  import { ChevronLeft } from 'lucide';
8
8
  import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
@@ -52,6 +52,7 @@ function NavStack({
52
52
  const topToolbar = top?.toolbar;
53
53
  const bottom = top?.bottomToolbar ?? bottomToolbar;
54
54
  const canPop = views.length > 1;
55
+ const topDensity = topToolbar?.density ?? toolbarConfig.density;
55
56
  return /* @__PURE__ */ jsxs(
56
57
  "section",
57
58
  {
@@ -69,6 +70,7 @@ function NavStack({
69
70
  Toolbar,
70
71
  {
71
72
  label: topToolbar?.label ?? toolbarConfig.label,
73
+ density: topDensity,
72
74
  dividerSides: topToolbar?.dividerSides ?? toolbarConfig.dividerSides,
73
75
  centerAlign: topToolbar?.centerAlign ?? toolbarConfig.centerAlign,
74
76
  responsive: topToolbar?.responsive ?? toolbarConfig.responsive,
@@ -81,6 +83,7 @@ function NavStack({
81
83
  appearance: "borderless",
82
84
  shape: "rounded",
83
85
  content: backText ? "mixed" : "icon",
86
+ size: topDensity === "compact" ? "compact" : "default",
84
87
  single: true,
85
88
  children: /* @__PURE__ */ jsxs(
86
89
  "button",
@@ -154,6 +157,7 @@ function NavStack({
154
157
  {
155
158
  position: "footer",
156
159
  label: bottom.label,
160
+ density: bottom.density,
157
161
  dividerSides: bottom.dividerSides,
158
162
  centerAlign: bottom.centerAlign,
159
163
  responsive: bottom.responsive,
@@ -171,4 +175,4 @@ function NavStack({
171
175
 
172
176
  export { NavStack };
173
177
 
174
- //# sourceMappingURL=chunk-75YOTZ25.js.map
178
+ //# sourceMappingURL=chunk-AYHC62OZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/navigation/nav-stack/nav-stack.tsx"],"names":[],"mappings":"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","file":"chunk-AYHC62OZ.js","sourcesContent":["import { ChevronLeft } from 'lucide';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport type { NavPane } from '../../../shared/panels/nav-pane.js';\nimport type { PanelBottomToolbar } from '../../../shared/panels/panel-toolbar.js';\nimport { Toolbar, type ToolbarConfig } from '../../actions/toolbar/toolbar.js';\nimport { ToolbarControlGroup } from '../../actions/toolbar-control-group/toolbar-control-group.js';\nimport {\n type HeadingLevel,\n ToolbarText,\n type ToolbarTextSize,\n} from '../../actions/toolbar-text/toolbar-text.js';\nimport { List, type ListConfig } from '../../collections/list/list.js';\nimport { Pane } from '../../layout/pane/pane.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\n\n/**\n * One entry in a {@link NavStack}. The app owns the stack as an array (usually a\n * signal); `NavStack` renders it and `wireNavStack` animates the transitions.\n */\nexport interface NavStackView extends NavPane<\n NavStackViewToolbar,\n PanelBottomToolbar\n> {\n /** Stable identity for keyed reconcile and transition direction. */\n key: string;\n}\n\n/** Per-view top toolbar. The stack supplies its back control before `leading`. */\nexport interface NavStackViewToolbar extends NavStackToolbarConfig {\n title?: string;\n leading?: KerfUiContent;\n center?: KerfUiContent;\n trailing?: KerfUiContent;\n}\n\n/** A view's structured bottom toolbar; it cross-fades on navigation. */\nexport type NavStackViewBottomToolbar = PanelBottomToolbar;\n\n/**\n * The top toolbar's configuration. Its `ToolbarConfig` forwards to the real\n * `Toolbar` the stack renders; by default that toolbar draws no divider and\n * claims the top and side safe-area edges the stack still touches.\n */\nexport interface NavStackToolbarConfig extends ToolbarConfig {\n /** Accessible name of the top toolbar (default: none). */\n label?: string;\n /** Size of the view title's `ToolbarText` (default `large`). */\n titleSize?: ToolbarTextSize;\n /** Expose the view title as a heading at this level (default: a plain span). */\n headingLevel?: HeadingLevel;\n}\n\nexport interface NavStackProps {\n id: string;\n /** Accessible name for the stack region. */\n label: string;\n /** The stack, root first; the last entry is the active top view. */\n views: NavStackView[];\n /** Accessible label for the icon-only back control (default \"Back\"). */\n backLabel?: string;\n /** The back control's icon (default a chevron-left `LucideIcon`). */\n backIcon?: KerfUiContent;\n /**\n * Visible text beside the back icon, such as the previous view's title\n * (default: icon only). When set, the text names the control and\n * `backLabel` is not used.\n */\n backText?: string;\n /** The top toolbar's configuration, forwarded to its `Toolbar`. */\n toolbarConfig?: NavStackToolbarConfig;\n /** Persistent last group in every view's top toolbar, supplied by a hosting panel. */\n panelToggle?: KerfUiContent;\n /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */\n hideToolbar?: boolean;\n /** Optional persistent bottom toolbar used when the active view does not provide one. */\n bottomToolbar?: NavStackViewBottomToolbar;\n /**\n * Stack chrome separator. `auto` (default) draws both available edges\n * against a sunken active Pane and otherwise follows `chromeDividers`;\n * `hidden` suppresses the stack-owned edges.\n */\n separator?: 'auto' | 'hidden';\n /**\n * The line under the top chrome and over the bottom toolbar, where they\n * meet the active view. `scroll` (default) shows the chrome's line only\n * while the view's content is scrolled beneath it, and the bottom\n * toolbar's only while more content lies below — never when the content\n * fits — once `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is\n * wired above the stack; unwired, neither shows. `always` shows both\n * without the wiring; `none` neither, even when wired. The line is drawn\n * inside the chrome, so no state moves the chrome or the content. A\n * A sunken active Pane still draws the separator unless\n * `separator=\"hidden\"`. A `toolbarConfig.dividerSides` edge is the Toolbar's\n * own and is unaffected.\n */\n chromeDividers?: 'scroll' | 'always' | 'none';\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nconst DEFAULT_SAFE_AREA_EDGES = [\n 'block-start',\n 'inline-start',\n 'inline-end',\n] as const;\n\nconst DEFAULT_BOTTOM_SAFE_AREA_EDGES = [\n 'block-end',\n 'inline-start',\n 'inline-end',\n] as const;\n\nfunction chromeList(content: KerfUiContent, config?: ListConfig) {\n return (\n <List\n dividerSides={config?.dividerSides}\n gap={config?.gap}\n hAlign={config?.hAlign}\n vAlign={config?.vAlign}\n textInsets={config?.textInsets}\n controlInsets={config?.controlInsets}\n >\n {content}\n </List>\n );\n}\n\n/**\n * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last\n * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and\n * cross-fades the chrome across a change. Its top chrome is a real `Toolbar`: the\n * back control and title lead, the active view's `toolbar` fills the zones,\n * and `toolbarConfig` supplies defaults. A single-pane\n * layout is a `NavStack` with one entry. See `docs/23-app-layouts.md` §3.1.\n */\nexport function NavStack({\n id,\n label,\n views,\n backLabel = 'Back',\n backIcon,\n backText,\n toolbarConfig = {},\n panelToggle,\n hideToolbar = false,\n bottomToolbar,\n separator = 'auto',\n chromeDividers = 'scroll',\n className = '',\n slot,\n}: NavStackProps) {\n const topIndex = views.length - 1;\n const top = views[topIndex];\n const topToolbar = top?.toolbar;\n const bottom = top?.bottomToolbar ?? bottomToolbar;\n const canPop = views.length > 1;\n const topDensity = topToolbar?.density ?? toolbarConfig.density;\n return (\n <section\n class={`kui-nav-stack ${className}`.trim()}\n id={id}\n data-component=\"nav-stack\"\n data-nav-stack-id={id}\n data-depth={String(views.length)}\n data-separator={separator}\n data-chrome-dividers={\n chromeDividers === 'always' || chromeDividers === 'none'\n ? chromeDividers\n : undefined\n }\n aria-label={label}\n slot={slot}\n >\n {!hideToolbar && (\n <div class=\"kui-nav-stack__chrome\" data-nav-stack-chrome>\n <Toolbar\n label={topToolbar?.label ?? toolbarConfig.label}\n density={topDensity}\n dividerSides={\n topToolbar?.dividerSides ?? toolbarConfig.dividerSides\n }\n centerAlign={topToolbar?.centerAlign ?? toolbarConfig.centerAlign}\n responsive={topToolbar?.responsive ?? toolbarConfig.responsive}\n responsiveAt={\n topToolbar?.responsiveAt ?? toolbarConfig.responsiveAt\n }\n safeAreaEdges={\n topToolbar?.safeAreaEdges ??\n toolbarConfig.safeAreaEdges ??\n DEFAULT_SAFE_AREA_EDGES\n }\n leading={\n <>\n {canPop && (\n <ToolbarControlGroup\n appearance=\"borderless\"\n shape=\"rounded\"\n content={backText ? 'mixed' : 'icon'}\n size={topDensity === 'compact' ? 'compact' : 'default'}\n single\n >\n <button\n type=\"button\"\n class=\"kui-nav-stack__back\"\n data-nav-back\n aria-label={backText ? undefined : backLabel}\n >\n {backIcon ?? (\n <LucideIcon\n icon={ChevronLeft}\n name=\"chevron-left\"\n className=\"kui-nav-stack__back-icon\"\n />\n )}\n {backText ? <span>{backText}</span> : null}\n </button>\n </ToolbarControlGroup>\n )}\n {topToolbar?.leading}\n <ToolbarText\n text={topToolbar?.title ?? ''}\n size={\n topToolbar?.titleSize ?? toolbarConfig.titleSize ?? 'large'\n }\n headingLevel={\n topToolbar?.headingLevel ?? toolbarConfig.headingLevel\n }\n fill\n />\n </>\n }\n center={topToolbar?.center}\n trailing={\n <>\n {topToolbar?.trailing}\n {panelToggle}\n </>\n }\n />\n </div>\n )}\n <div class=\"kui-nav-stack__viewport\" data-nav-stack-viewport>\n {views.map((view, index) => (\n <article\n class=\"kui-nav-stack__view\"\n data-key={view.key}\n data-nav-key={view.key}\n data-nav-active={String(index === topIndex)}\n aria-hidden={String(index !== topIndex)}\n >\n {view.pane ||\n view.header !== undefined ||\n view.footer !== undefined ? (\n <Pane\n appearance={view.pane?.appearance}\n deepInset={view.pane?.deepInset}\n tabIndex={view.pane?.tabIndex}\n outlined={view.pane?.outlined}\n contentElement={view.pane?.contentElement}\n contentLabel={view.pane?.contentLabel}\n separators={view.pane?.separators}\n safeAreaEdges={view.pane?.safeAreaEdges}\n chromeDividers={view.pane?.chromeDividers}\n header={\n view.header === undefined ? undefined : (\n <div data-nav-stack-header>\n {chromeList(view.header, view.headerList)}\n </div>\n )\n }\n footer={\n view.footer === undefined ? undefined : (\n <div data-nav-stack-footer>\n {chromeList(view.footer, view.footerList)}\n </div>\n )\n }\n >\n {view.content}\n </Pane>\n ) : (\n view.content\n )}\n </article>\n ))}\n </div>\n {bottom && (\n <footer class=\"kui-nav-stack__bottom\" data-nav-stack-bottom>\n <Toolbar\n position=\"footer\"\n label={bottom.label}\n density={bottom.density}\n dividerSides={bottom.dividerSides}\n centerAlign={bottom.centerAlign}\n responsive={bottom.responsive}\n responsiveAt={bottom.responsiveAt}\n safeAreaEdges={\n bottom.safeAreaEdges ?? DEFAULT_BOTTOM_SAFE_AREA_EDGES\n }\n leading={bottom.leading}\n center={bottom.center}\n trailing={bottom.trailing}\n />\n </footer>\n )}\n </section>\n );\n}\n"]}
@@ -1,9 +1,9 @@
1
- import { Text } from './chunk-4Y4L5YEI.js';
1
+ import { Text } from './chunk-LL45C7BB.js';
2
2
  import { DisclosureArrow } from './chunk-HWY4BSLS.js';
3
3
  import { Skeleton } from './chunk-Y43B6DS3.js';
4
- import { Badge } from './chunk-J3AWE5I4.js';
4
+ import { Badge } from './chunk-U6QYTMDB.js';
5
5
  import { em } from './chunk-U657IHFB.js';
6
- import { filterDataAttributes, filterControlAttributes } from './chunk-LAZLBC2Q.js';
6
+ import { filterDataAttributes, filterControlAttributes } from './chunk-KH4KEMSP.js';
7
7
  import { jsx, jsxs, Fragment } from 'kerfjs/jsx-runtime';
8
8
 
9
9
  var PROTECTED_ROOT_DATA_ATTRIBUTES = /* @__PURE__ */ new Set([
@@ -162,4 +162,4 @@ function ListHeader({
162
162
 
163
163
  export { ListHeader };
164
164
 
165
- //# sourceMappingURL=chunk-RZYQFGMM.js.map
165
+ //# sourceMappingURL=chunk-BBU2SPRE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/collections/list-header/list-header.tsx"],"names":[],"mappings":";;;;;;;;AAcA,IAAM,8BAAA,uBAAqC,GAAA,CAAI;AAAA,EAC7C,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,iCAAA,uBAAwC,GAAA,CAAI;AAAA,EAChD,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAyGM,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,CAAA;AAAA,EACf,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,UAAA;AAAA,EACV,OAAA,GAAU,MAAA;AAAA,EACV,MAAA,GAAS,KAAA;AAAA,EACT,KAAA,GAAQ,MAAA;AAAA,EACR,aAAA,GAAgB,SAAA;AAAA,EAChB,MAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,cAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,KAAA;AAAA,EACd,iBAAiB,EAAC;AAAA,EAClB,oBAAoB,EAAC;AAAA,EACrB;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,uBAAA,GAA0B,oBAAA;AAAA,IAC9B,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,0BAAA,GAA6B,uBAAA;AAAA,IACjC,iBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,eAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,cAAc,KAAK,CAAA,IAAK,KAAA,IAAS,CAAA,GACjE,KAAA,GACA,MAAA;AACN,EAAA,MAAM,oBAAA,GACJ,eAAA,KAAoB,MAAA,GAChB,MAAA,GACA,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,CAAW,IAAA,EAAK,GAChD,UAAA,GACA,MAAA,CAAO,eAAe,CAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,eAAA,KAAoB,MAAA,GAAY,KAAA,GAAQ,MAAA;AAC9D,EAAA,MAAM,cAAA,GAAiB,eAAA,KAAoB,MAAA,GAAY,MAAA,GAAS,MAAA;AAChE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,aAAA,IAAiB,cAAc,CAAA;AACxD,EAAA,MAAM,kBAAA,GACJ,eACC,MAAA,mBAAS,GAAA,CAAC,mBAAgB,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA,GAAK,MAAA,CAAA;AAC3D,EAAA,MAAM,kBACJ,eAAA,KAAoB,MAAA,GAChB,SACA,CAAA,EAAG,KAAK,KAAK,oBAAoB,CAAA,CAAA;AACvC,EAAA,MAAM,SAAA,GACJ,aAAA,KAAkB,QAAA,GAAW,MAAA,GAAS,aAAA;AACxC,EAAA,MAAM,SAAA,GACJ,oBAAoB,MAAA,mBAClB,GAAA,CAAC,SAAM,IAAA,EAAK,SAAA,EAAU,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,CAAC,aACjD,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,YAAS,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA,EAAG,CAAA,GAAK,eAAA,EACjD,CAAA,mBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,aAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAK,SAAA,EAAU,MAAM,SAAA,EACzB,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA,EAAG,IAAK,aAAA,EACjD,CAAA;AAAA,IAED,cAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAK,WAAU,IAAA,EAAM,SAAA,EACzB,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,YAAS,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA,EAAG,IAAK,cAAA,EACjD;AAAA,GAAA,EAEJ,CAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,cAAe,MAAA,GAAmB,MAAA;AAC/C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAG,uBAAA;AAAA,QACJ,KAAA,EAAM,iBAAA;AAAA,QACN,gBAAA,EAAe,aAAA;AAAA,QACf,gBAAA,EAAgB,OAAO,QAAQ,CAAA;AAAA,QAC/B,gBAAA,EAAgB,MAAA,CAAO,eAAA,KAAoB,MAAS,CAAA;AAAA,QACpD,cAAA,EAAc,OAAA;AAAA,QACd,WAAA,EAAW,IAAA;AAAA,QACX,cAAA,EAAc,OAAA;AAAA,QACd,aAAA,EAAa,OAAO,MAAM,CAAA;AAAA,QAC1B,YAAA,EAAY,KAAA;AAAA,QACZ,qBAAA,EAAqB,aAAA;AAAA,QACrB,aAAA,EAAY,MAAA;AAAA,QACZ,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,QACzC,WAAA,EAAW,IAAA;AAAA,QACX,IAAA;AAAA,QAEA,QAAA,kBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACE,GAAG,0BAAA;AAAA,YACJ,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,gDAAA;AAAA,YACN,aAAA,EAAa,cAAc,MAAA,GAAY,MAAA;AAAA,YACvC,KAAA,EAAO,iBAAiB,cAAA,GAAiB,MAAA;AAAA,YACzC,QAAA,EAAU,kBAAkB,WAAA,IAAe,MAAA;AAAA,YAC3C,mBAAA,EAAmB,iBAAiB,MAAA,GAAS,MAAA;AAAA,YAC7C,YAAA,EAAY,eAAA;AAAA,YACZ,eAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,YAEvC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EAAQ,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,cAC3B,SAAA;AAAA,cACA,kBAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,iCACT,QAAA,EAAA,kBAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAG,uBAAA;AAAA,MACJ,KAAA,EAAM,iBAAA;AAAA,MACN,gBAAA,EAAe,aAAA;AAAA,MACf,gBAAA,EAAgB,OAAO,QAAQ,CAAA;AAAA,MAC/B,gBAAA,EAAgB,MAAA,CAAO,eAAA,KAAoB,MAAS,CAAA;AAAA,MACpD,cAAA,EAAc,OAAA;AAAA,MACd,WAAA,EAAW,IAAA;AAAA,MACX,cAAA,EAAc,OAAA;AAAA,MACd,aAAA,EAAa,OAAO,MAAM,CAAA;AAAA,MAC1B,YAAA,EAAY,KAAA;AAAA,MACZ,qBAAA,EAAqB,aAAA;AAAA,MACrB,aAAA,EAAY,OAAA;AAAA,MACZ,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,WAAA,EAAW,IAAA;AAAA,MACX,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAM,wBAAA,EACT,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,IAAI,YAAY,CAAA,CAAA;AAAA,cACzB,MAAA,EAAO,MAAA;AAAA,cACP,YAAA,EAAY,eAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC;AAAA,SAAA,EACH,CAAA;AAAA,QACC,MAAA,oBACC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACE,GAAG,0BAAA;AAAA,YACJ,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,yBAAA;AAAA,YACN,aAAA,EAAa,cAAc,MAAA,GAAY,MAAA;AAAA,YACvC,YAAA,EAAY,WAAA;AAAA,YACZ,KAAA,EAAO,iBAAiB,cAAA,GAAiB,WAAA;AAAA,YACzC,QAAA,EAAU,kBAAkB,WAAA,IAAe,MAAA;AAAA,YAC3C,mBAAA,EAAmB,iBAAiB,MAAA,GAAS,MAAA;AAAA,YAE5C,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-RZYQFGMM.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport {\n filterControlAttributes,\n filterDataAttributes,\n} from '../../../shared/dom/extension-attributes.js';\nimport { em } from '../../../shared/styles/css-values.js';\nimport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\nimport type { HeadingLevel } from '../../actions/toolbar-text/toolbar-text.js';\nimport { Badge } from '../../feedback/badge/badge.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\nimport { DisclosureArrow } from '../../navigation/disclosure-arrow/disclosure-arrow.js';\nimport { Text } from '../../typography/text/text.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-has-badge',\n 'data-has-count',\n 'data-density',\n 'data-size',\n 'data-divider',\n 'data-inline',\n 'data-width',\n 'data-indicator-tone',\n 'data-toggle',\n]);\nconst PROTECTED_TRIGGER_DATA_ATTRIBUTES = new Set([\n 'data-action',\n 'data-kui-disabled',\n]);\n\ntype ListHeaderRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-has-badge'?: never;\n 'data-has-count'?: never;\n 'data-density'?: never;\n 'data-size'?: never;\n 'data-divider'?: never;\n 'data-inline'?: never;\n 'data-width'?: never;\n 'data-indicator-tone'?: never;\n 'data-toggle'?: never;\n }\n>;\n\ntype ListHeaderTriggerAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-action'?: never;\n 'data-kui-disabled'?: never;\n popoverTarget?: string;\n popoverTargetAction?: 'toggle' | 'show' | 'hide';\n 'aria-controls'?: string;\n 'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | 'tree' | 'grid' | 'true';\n }\n>;\n\ninterface ListHeaderBaseProps {\n label: string;\n /** Visual label size, independent of the native heading level. Default `sm`. */\n size?: 'xs' | 'sm' | 'm' | 'l' | 'xl';\n density?: 'standard' | 'compact';\n divider?: 'none' | 'before' | 'after' | 'both';\n /** Shrink-wrap the header without its default outer margin, border, or padding. */\n inline?: boolean;\n /** Fill the available row or shrink-wrap while retaining normal header geometry. */\n width?: 'fill' | 'content';\n indicatorTone?: 'neutral' | 'accent' | 'pop' | 'danger';\n /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */\n placeholder?: boolean;\n rootAttributes?: ListHeaderRootAttributes;\n triggerAttributes?: ListHeaderTriggerAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\ntype ListHeaderModeProps =\n | {\n /** Render the title as a controlled disclosure trigger. */\n toggle: true;\n /** A toggle's label is its button text, not a heading. */\n headingLevel?: never;\n action: string;\n expanded: boolean;\n actionIcon?: SafeHtml;\n actionLabel?: never;\n actionDisabled?: boolean;\n disabledReason?: string;\n }\n | {\n /** Render a separately named trailing action. */\n toggle?: false;\n /**\n * Native heading level (`h1`–`h6`) of the label. Default `2`. Match the\n * document outline; the visual treatment does not change.\n */\n headingLevel?: HeadingLevel;\n action: string;\n actionLabel: string;\n actionIcon: SafeHtml;\n expanded?: never;\n actionDisabled?: boolean;\n disabledReason?: string;\n }\n | {\n /** Render a passive section heading. */\n toggle?: false;\n /**\n * Native heading level (`h1`–`h6`) of the label. Default `2`. Match the\n * document outline; the visual treatment does not change.\n */\n headingLevel?: HeadingLevel;\n action?: never;\n actionLabel?: never;\n actionIcon?: never;\n expanded?: never;\n actionDisabled?: never;\n disabledReason?: never;\n };\n\ntype ListHeaderIndicatorProps =\n | { count: number; countLabel: string; badge?: never; status?: never }\n | {\n count?: never;\n countLabel?: never;\n badge?: SafeHtml | undefined;\n status?: SafeHtml | undefined;\n };\n\nexport type ListHeaderProps = ListHeaderBaseProps &\n ListHeaderIndicatorProps &\n ListHeaderModeProps;\n\nexport function ListHeader({\n label,\n size = 'sm',\n headingLevel = 2,\n count,\n countLabel,\n badge,\n status,\n density = 'standard',\n divider = 'none',\n inline = false,\n width = 'fill',\n indicatorTone = 'neutral',\n action,\n actionLabel,\n actionIcon,\n actionDisabled = false,\n disabledReason,\n expanded,\n toggle = false,\n placeholder = false,\n rootAttributes = {},\n triggerAttributes = {},\n slot,\n}: ListHeaderProps) {\n const extensionRootAttributes = filterDataAttributes(\n rootAttributes,\n PROTECTED_ROOT_DATA_ATTRIBUTES,\n );\n const extensionTriggerAttributes = filterControlAttributes(\n triggerAttributes,\n PROTECTED_TRIGGER_DATA_ATTRIBUTES,\n );\n const normalizedCount =\n typeof count === 'number' && Number.isSafeInteger(count) && count >= 0\n ? count\n : undefined;\n const normalizedCountLabel =\n normalizedCount === undefined\n ? undefined\n : typeof countLabel === 'string' && countLabel.trim()\n ? countLabel\n : String(normalizedCount);\n const renderedBadge = normalizedCount === undefined ? badge : undefined;\n const renderedStatus = normalizedCount === undefined ? status : undefined;\n const hasBadge = Boolean(renderedBadge || renderedStatus);\n const renderedActionIcon =\n actionIcon ??\n (toggle ? <DisclosureArrow open={Boolean(expanded)} /> : undefined);\n const accessibleLabel =\n normalizedCount === undefined\n ? undefined\n : `${label}, ${normalizedCountLabel}`;\n const badgeTone: SemanticTone =\n indicatorTone === 'accent' ? 'info' : indicatorTone;\n const indicator =\n normalizedCount !== undefined ? (\n <Badge size=\"compact\" tone={badgeTone} ariaHidden={!placeholder}>\n {placeholder ? <Skeleton width={em(1.75)} /> : normalizedCount}\n </Badge>\n ) : (\n <>\n {renderedBadge && (\n <Badge size=\"compact\" tone={badgeTone}>\n {placeholder ? <Skeleton width={em(1.75)} /> : renderedBadge}\n </Badge>\n )}\n {renderedStatus && (\n <Badge size=\"compact\" tone={badgeTone}>\n {placeholder ? <Skeleton width={em(1.75)} /> : renderedStatus}\n </Badge>\n )}\n </>\n );\n const busy = placeholder ? ('true' as const) : undefined;\n if (toggle) {\n return (\n <header\n {...extensionRootAttributes}\n class=\"kui-list-header\"\n data-component=\"list-header\"\n data-has-badge={String(hasBadge)}\n data-has-count={String(normalizedCount !== undefined)}\n data-density={density}\n data-size={size}\n data-divider={divider}\n data-inline={String(inline)}\n data-width={width}\n data-indicator-tone={indicatorTone}\n data-toggle=\"true\"\n data-placeholder={placeholder ? 'true' : undefined}\n aria-busy={busy}\n slot={slot}\n >\n <button\n {...extensionTriggerAttributes}\n type=\"button\"\n class=\"kui-list-header__title kui-list-header__toggle\"\n data-action={placeholder ? undefined : action}\n title={actionDisabled ? disabledReason : undefined}\n disabled={actionDisabled || placeholder || undefined}\n data-kui-disabled={actionDisabled ? 'true' : undefined}\n aria-label={accessibleLabel}\n aria-expanded={String(Boolean(expanded))}\n >\n <Text variant=\"span\">{label}</Text>\n {indicator}\n {renderedActionIcon && (\n <span class=\"kui-list-header__action-layer\">\n {renderedActionIcon}\n </span>\n )}\n </button>\n </header>\n );\n }\n return (\n <header\n {...extensionRootAttributes}\n class=\"kui-list-header\"\n data-component=\"list-header\"\n data-has-badge={String(hasBadge)}\n data-has-count={String(normalizedCount !== undefined)}\n data-density={density}\n data-size={size}\n data-divider={divider}\n data-inline={String(inline)}\n data-width={width}\n data-indicator-tone={indicatorTone}\n data-toggle=\"false\"\n data-placeholder={placeholder ? 'true' : undefined}\n aria-busy={busy}\n slot={slot}\n >\n <div class=\"kui-list-header__title\">\n <Text\n variant={`h${headingLevel}`}\n border=\"none\"\n aria-label={accessibleLabel}\n >\n {label}\n </Text>\n {indicator}\n </div>\n {action && (\n <button\n {...extensionTriggerAttributes}\n type=\"button\"\n class=\"kui-list-header__action\"\n data-action={placeholder ? undefined : action}\n aria-label={actionLabel}\n title={actionDisabled ? disabledReason : actionLabel}\n disabled={actionDisabled || placeholder || undefined}\n data-kui-disabled={actionDisabled ? 'true' : undefined}\n >\n {renderedActionIcon}\n </button>\n )}\n </header>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/collections/list-header/list-header.tsx"],"names":[],"mappings":"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","file":"chunk-BBU2SPRE.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport {\n filterControlAttributes,\n filterDataAttributes,\n} from '../../../shared/dom/extension-attributes.js';\nimport { em } from '../../../shared/styles/css-values.js';\nimport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\nimport type { HeadingLevel } from '../../actions/toolbar-text/toolbar-text.js';\nimport { Badge } from '../../feedback/badge/badge.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\nimport { DisclosureArrow } from '../../navigation/disclosure-arrow/disclosure-arrow.js';\nimport { Text } from '../../typography/text/text.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-has-badge',\n 'data-has-count',\n 'data-density',\n 'data-size',\n 'data-divider',\n 'data-inline',\n 'data-width',\n 'data-indicator-tone',\n 'data-toggle',\n]);\nconst PROTECTED_TRIGGER_DATA_ATTRIBUTES = new Set([\n 'data-action',\n 'data-kui-disabled',\n]);\n\ntype ListHeaderRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-has-badge'?: never;\n 'data-has-count'?: never;\n 'data-density'?: never;\n 'data-size'?: never;\n 'data-divider'?: never;\n 'data-inline'?: never;\n 'data-width'?: never;\n 'data-indicator-tone'?: never;\n 'data-toggle'?: never;\n }\n>;\n\ntype ListHeaderTriggerAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-action'?: never;\n 'data-kui-disabled'?: never;\n popoverTarget?: string;\n popoverTargetAction?: 'toggle' | 'show' | 'hide';\n 'aria-controls'?: string;\n 'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | 'tree' | 'grid' | 'true';\n }\n>;\n\ninterface ListHeaderBaseProps {\n label: string;\n /** Visual label size, independent of the native heading level. Default `sm`. */\n size?: 'xs' | 'sm' | 'm' | 'l' | 'xl';\n density?: 'standard' | 'compact';\n divider?: 'none' | 'before' | 'after' | 'both';\n /** Shrink-wrap the header without its default outer margin, border, or padding. */\n inline?: boolean;\n /** Fill the available row or shrink-wrap while retaining normal header geometry. */\n width?: 'fill' | 'content';\n indicatorTone?: 'neutral' | 'accent' | 'pop' | 'danger';\n /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */\n placeholder?: boolean;\n rootAttributes?: ListHeaderRootAttributes;\n triggerAttributes?: ListHeaderTriggerAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\ntype ListHeaderModeProps =\n | {\n /** Render the title as a controlled disclosure trigger. */\n toggle: true;\n /** A toggle's label is its button text, not a heading. */\n headingLevel?: never;\n action: string;\n expanded: boolean;\n actionIcon?: SafeHtml;\n actionLabel?: never;\n actionDisabled?: boolean;\n disabledReason?: string;\n }\n | {\n /** Render a separately named trailing action. */\n toggle?: false;\n /**\n * Native heading level (`h1`–`h6`) of the label. Default `2`. Match the\n * document outline; the visual treatment does not change.\n */\n headingLevel?: HeadingLevel;\n action: string;\n actionLabel: string;\n actionIcon: SafeHtml;\n expanded?: never;\n actionDisabled?: boolean;\n disabledReason?: string;\n }\n | {\n /** Render a passive section heading. */\n toggle?: false;\n /**\n * Native heading level (`h1`–`h6`) of the label. Default `2`. Match the\n * document outline; the visual treatment does not change.\n */\n headingLevel?: HeadingLevel;\n action?: never;\n actionLabel?: never;\n actionIcon?: never;\n expanded?: never;\n actionDisabled?: never;\n disabledReason?: never;\n };\n\ntype ListHeaderIndicatorProps =\n | { count: number; countLabel: string; badge?: never; status?: never }\n | {\n count?: never;\n countLabel?: never;\n badge?: SafeHtml | undefined;\n status?: SafeHtml | undefined;\n };\n\nexport type ListHeaderProps = ListHeaderBaseProps &\n ListHeaderIndicatorProps &\n ListHeaderModeProps;\n\nexport function ListHeader({\n label,\n size = 'sm',\n headingLevel = 2,\n count,\n countLabel,\n badge,\n status,\n density = 'standard',\n divider = 'none',\n inline = false,\n width = 'fill',\n indicatorTone = 'neutral',\n action,\n actionLabel,\n actionIcon,\n actionDisabled = false,\n disabledReason,\n expanded,\n toggle = false,\n placeholder = false,\n rootAttributes = {},\n triggerAttributes = {},\n slot,\n}: ListHeaderProps) {\n const extensionRootAttributes = filterDataAttributes(\n rootAttributes,\n PROTECTED_ROOT_DATA_ATTRIBUTES,\n );\n const extensionTriggerAttributes = filterControlAttributes(\n triggerAttributes,\n PROTECTED_TRIGGER_DATA_ATTRIBUTES,\n );\n const normalizedCount =\n typeof count === 'number' && Number.isSafeInteger(count) && count >= 0\n ? count\n : undefined;\n const normalizedCountLabel =\n normalizedCount === undefined\n ? undefined\n : typeof countLabel === 'string' && countLabel.trim()\n ? countLabel\n : String(normalizedCount);\n const renderedBadge = normalizedCount === undefined ? badge : undefined;\n const renderedStatus = normalizedCount === undefined ? status : undefined;\n const hasBadge = Boolean(renderedBadge || renderedStatus);\n const renderedActionIcon =\n actionIcon ??\n (toggle ? <DisclosureArrow open={Boolean(expanded)} /> : undefined);\n const accessibleLabel =\n normalizedCount === undefined\n ? undefined\n : `${label}, ${normalizedCountLabel}`;\n const badgeTone: SemanticTone =\n indicatorTone === 'accent' ? 'info' : indicatorTone;\n const indicator =\n normalizedCount !== undefined ? (\n <Badge size=\"compact\" tone={badgeTone} ariaHidden={!placeholder}>\n {placeholder ? <Skeleton width={em(1.75)} /> : normalizedCount}\n </Badge>\n ) : (\n <>\n {renderedBadge && (\n <Badge size=\"compact\" tone={badgeTone}>\n {placeholder ? <Skeleton width={em(1.75)} /> : renderedBadge}\n </Badge>\n )}\n {renderedStatus && (\n <Badge size=\"compact\" tone={badgeTone}>\n {placeholder ? <Skeleton width={em(1.75)} /> : renderedStatus}\n </Badge>\n )}\n </>\n );\n const busy = placeholder ? ('true' as const) : undefined;\n if (toggle) {\n return (\n <header\n {...extensionRootAttributes}\n class=\"kui-list-header\"\n data-component=\"list-header\"\n data-has-badge={String(hasBadge)}\n data-has-count={String(normalizedCount !== undefined)}\n data-density={density}\n data-size={size}\n data-divider={divider}\n data-inline={String(inline)}\n data-width={width}\n data-indicator-tone={indicatorTone}\n data-toggle=\"true\"\n data-placeholder={placeholder ? 'true' : undefined}\n aria-busy={busy}\n slot={slot}\n >\n <button\n {...extensionTriggerAttributes}\n type=\"button\"\n class=\"kui-list-header__title kui-list-header__toggle\"\n data-action={placeholder ? undefined : action}\n title={actionDisabled ? disabledReason : undefined}\n disabled={actionDisabled || placeholder || undefined}\n data-kui-disabled={actionDisabled ? 'true' : undefined}\n aria-label={accessibleLabel}\n aria-expanded={String(Boolean(expanded))}\n >\n <Text variant=\"span\">{label}</Text>\n {indicator}\n {renderedActionIcon && (\n <span class=\"kui-list-header__action-layer\">\n {renderedActionIcon}\n </span>\n )}\n </button>\n </header>\n );\n }\n return (\n <header\n {...extensionRootAttributes}\n class=\"kui-list-header\"\n data-component=\"list-header\"\n data-has-badge={String(hasBadge)}\n data-has-count={String(normalizedCount !== undefined)}\n data-density={density}\n data-size={size}\n data-divider={divider}\n data-inline={String(inline)}\n data-width={width}\n data-indicator-tone={indicatorTone}\n data-toggle=\"false\"\n data-placeholder={placeholder ? 'true' : undefined}\n aria-busy={busy}\n slot={slot}\n >\n <div class=\"kui-list-header__title\">\n <Text\n variant={`h${headingLevel}`}\n border=\"none\"\n aria-label={accessibleLabel}\n >\n {label}\n </Text>\n {indicator}\n </div>\n {action && (\n <button\n {...extensionTriggerAttributes}\n type=\"button\"\n class=\"kui-list-header__action\"\n data-action={placeholder ? undefined : action}\n aria-label={actionLabel}\n title={actionDisabled ? disabledReason : actionLabel}\n disabled={actionDisabled || placeholder || undefined}\n data-kui-disabled={actionDisabled ? 'true' : undefined}\n >\n {renderedActionIcon}\n </button>\n )}\n </header>\n );\n}\n"]}