@kerfjs/ui 5.0.0-beta.94 → 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 (388) hide show
  1. package/README.md +99 -57
  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 +57 -53
  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/catalog.md +41 -0
  334. package/docs/component-contract.md +26 -6
  335. package/docs/component-selection.md +149 -13
  336. package/docs/design/templates/choice-chips/color-palette-dark.svg +1 -0
  337. package/docs/design/templates/choice-chips/color-palette.svg +1 -0
  338. package/docs/design/templates/choice-chips/compact-icons-dark.svg +1 -0
  339. package/docs/design/templates/choice-chips/compact-icons.svg +1 -0
  340. package/docs/design/templates/choice-chips-dark.svg +1 -0
  341. package/docs/design/templates/choice-chips.svg +1 -0
  342. package/docs/design/templates/list-action-row/trailing-menu-dark.svg +1 -0
  343. package/docs/design/templates/list-action-row/trailing-menu.svg +1 -0
  344. package/docs/design/templates/list-action-row-dark.svg +1 -1
  345. package/docs/design/templates/list-action-row.svg +1 -1
  346. package/docs/design/templates/state-banner/strip-dark.svg +1 -0
  347. package/docs/design/templates/state-banner/strip.svg +1 -0
  348. package/docs/design/templates/state-banner-dark.svg +1 -1
  349. package/docs/design/templates/state-banner.svg +1 -1
  350. package/docs/design/templates.md +1 -1
  351. package/docs/document-baseline.md +51 -0
  352. package/docs/layout.md +52 -1
  353. package/docs/split-view.md +20 -2
  354. package/docs/sunken-panel.md +13 -0
  355. package/docs/surface-scaffold.md +66 -1
  356. package/docs/ux-demo.md +1 -0
  357. package/docs/webawesome-theme.md +6 -2
  358. package/llms.txt +125 -16
  359. package/package.json +89 -1
  360. package/vite-ux-review.d.mts +39 -0
  361. package/vite-ux-review.mjs +75 -20
  362. package/dist/chunk-3DXHNLME.js.map +0 -1
  363. package/dist/chunk-3PO7JEK7.js.map +0 -1
  364. package/dist/chunk-3XPGJUUQ.js.map +0 -1
  365. package/dist/chunk-4Y4L5YEI.js +0 -66
  366. package/dist/chunk-4Y4L5YEI.js.map +0 -1
  367. package/dist/chunk-75YOTZ25.js.map +0 -1
  368. package/dist/chunk-7QQ3HE47.js.map +0 -1
  369. package/dist/chunk-A7DYEERU.js +0 -59
  370. package/dist/chunk-A7DYEERU.js.map +0 -1
  371. package/dist/chunk-B3TROLC2.js.map +0 -1
  372. package/dist/chunk-BYHGRKC3.js.map +0 -1
  373. package/dist/chunk-DL55BSQX.js.map +0 -1
  374. package/dist/chunk-FL6J644M.js.map +0 -1
  375. package/dist/chunk-GIUOXAVL.js.map +0 -1
  376. package/dist/chunk-IOS2NXW7.js.map +0 -1
  377. package/dist/chunk-J3AWE5I4.js +0 -50
  378. package/dist/chunk-J3AWE5I4.js.map +0 -1
  379. package/dist/chunk-LAZLBC2Q.js.map +0 -1
  380. package/dist/chunk-MORVLMDG.js.map +0 -1
  381. package/dist/chunk-MTCTX25G.js.map +0 -1
  382. package/dist/chunk-O27D24CA.js.map +0 -1
  383. package/dist/chunk-PGL6TXFW.js.map +0 -1
  384. package/dist/chunk-QCLLBMLA.js.map +0 -1
  385. package/dist/chunk-QQICWWNX.js.map +0 -1
  386. package/dist/chunk-TKDDTLG5.js.map +0 -1
  387. package/dist/chunk-TNG3XKHB.js.map +0 -1
  388. package/dist/chunk-XKZPBRU7.js.map +0 -1
package/llms.txt CHANGED
@@ -27,6 +27,8 @@ twice. Check contrast in both color schemes over the actual backdrop. See
27
27
  For arbitrary interactive help or popup content, use `openAnchoredSurface` or
28
28
  `openAnchoredSurfaceAt` from `@kerfjs/ui/anchored-surface`; see
29
29
  [AnchoredSurface](./docs/anchored-surface.md). The app owns content and actions.
30
+ Inside a native `<dialog>`, `wa-dialog`, or `wa-drawer`, the surface stays
31
+ interactive and closes with the dialog.
30
32
  For a public subpath containing several visual components, use a folder with one
31
33
  component per source file and one owned stylesheet per visual component. Keep its
32
34
  compatibility entrypoints implementation-free: JavaScript/TypeScript only re-exports
@@ -201,17 +203,24 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
201
203
  own the geometry (8px inline margin + 1px border + 8px padding). Render an
202
204
  ordinary surface-like child as `ContentItem` (`@kerfjs/ui/content-item`) with
203
205
  typed `frame` (`none`/`framed`) and `shape` (`rounded`/`pill`) props instead
204
- of hand-writing `<div class="kui-content-item">`. Do not add a
206
+ of hand-writing `<div class="kui-content-item">`. For a chat transcript, set
207
+ `bubble="start"` (other participants) or `bubble="end"` with
208
+ `appearance="brand-loud"` (the person's own messages): the item fits its
209
+ message up to 80% of the row. Do not add a
205
210
  container padding on top of a content-item's own margin — pick one owner. Use
206
211
  `.kui-content` for 24px major vertical rhythm.
207
212
  - **Opt into document globals explicitly.** Import `@kerfjs/ui/document.css`
208
213
  once for border-box sizing, token-backed body/link presentation, inherited
209
- native table-cell and form-control font metrics, and zero body
210
- margin. Put `.kui-app-root` on the one direct mount container only when a
214
+ native table-cell and form-control font metrics, zero body margin, and
215
+ zero-specificity semantic cursors for native controls (pointer, not-allowed
216
+ when disabled, text on text inputs). Put `.kui-app-root` on the one direct mount container only when a
211
217
  percentage-height shell needs the provided `html` → `body` → app-root height
212
- chain. The baseline is not part of `styles.css` or component browser imports.
218
+ chain. Add `data-viewport="locked"` to that body-child root for a
219
+ full-viewport shell whose document never scrolls (`100dvh` and
220
+ `overflow: clip` on `html`, `body`, and the root). The baseline is not part of `styles.css` or component browser imports.
213
221
  - **Use compact layout options where needed.** `Text flush lineHeight="tight"`
214
- fits short dialog copy; `ValueTable density="compact"` reduces row spacing,
222
+ fits short dialog copy, and `Text align="center"` centers wrapping status
223
+ copy; `ValueTable density="compact"` reduces row spacing,
215
224
  with public row column, padding, and gap tokens for specific metadata layouts.
216
225
  `ToolbarText size="xsmall"` suits a dense rail heading. The
217
226
  `TokenSearchField` editor shrinks in narrow groups; its minimum width can be
@@ -229,7 +238,13 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
229
238
  full row and a reduced-motion-aware downward entrance.
230
239
  `--kui-toolbar-inset: 0px` removes an embedded Toolbar's outer padding and
231
240
  corresponding minimum-height allowance while preserving its zone gap and
232
- safe-area compensation.
241
+ safe-area compensation. For a shorter header embedded in a panel or card,
242
+ pass `density="compact"` (40px: a 34px control band and 3px block insets)
243
+ and give its groups `size="compact"`; never shrink a Toolbar with CSS.
244
+ Composites forward `density` from their `ToolbarConfig` (Workbench panel,
245
+ main, and bottom toolbars, CollapsiblePanel, NavStack, SplitView) and size
246
+ the groups they compose (panel toggles, the back button) to match; pass
247
+ `density` to `CollapsiblePanelRelocated` when its toolbar is compact.
233
248
  - **Position region restore controls declaratively.** A ResizableRegion has a
234
249
  background token, `contentOverflow="visible"` for an anchored popup,
235
250
  top/bottom `restorePosition`, typed `restoreInset`, and
@@ -239,7 +254,13 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
239
254
  gives option rows more room. `multiline` wraps labels, with
240
255
  `multilineIconAlign="center"` when the icon should center on the whole copy.
241
256
  `divider` owns row separators and `state="drag-target"` paints the drop
242
- target. Public ListItem tokens set row, icon, label, and trailing geometry;
257
+ target. For a reorderable list, set `draggable` + `itemId` on `ListItem`,
258
+ `ListItemLink`, or `ListActionRow` rows and call `wireListReorder` (from
259
+ `@kerfjs/ui/wire-list-reorder`) once; it paints the dimmed dragging rows and
260
+ the before/after insertion line, supports Alt+Shift+ArrowUp/ArrowDown, and
261
+ reports `{ listId, sourceIds, target: { id, position }, source }` for
262
+ `reorderListItems`. The `dragging` / `dropPosition` props render the same
263
+ states from app-owned drag state. Public ListItem tokens set row, icon, label, and trailing geometry;
243
264
  ListHeader `size="xs|sm|m|l|xl"` sets label scale independently of
244
265
  `headingLevel` (`sm` keeps the current FieldLabel-sized uppercase style;
245
266
  `m`/`l`/`xl` match themed h5/h4/h3). Its height, title padding, and border
@@ -362,8 +383,13 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
362
383
  row, as in the catalog resource footer. `PopupMenu` items also support nested `submenu`
363
384
  actions, headings, dividers, checked or trailing choice marks, danger tone,
364
385
  and disabled reasons; nested headings/dividers stay out of keyboard choices;
365
- use `context` with `openPopupMenuAt`/`closePopupMenu` for pointer-anchored row
366
- menus. Do not force a dropdown or button width. Nothing
386
+ use `context` with `anchor` + `openPopupMenu` (or `openPopupMenuAt`) and
387
+ `closePopupMenu` for pointer-anchored row menus; the menu owns its
388
+ zero-footprint anchor host, so add no wrapper or CSS. `openPopupMenuAt`
389
+ also opens a button-triggered menu at the pointer for one opening. A row's
390
+ trailing "…" overflow menu is `ListActionRow`'s `trailingMenu` (`label`,
391
+ `icon`, `items`, optional `placement` and `disabled`), which renders a
392
+ `PopupMenu` as the row's sibling trailing control. Do not force a dropdown or button width. Nothing
367
393
  wraps inside a group: an icon sits beside its label on one row, and a
368
394
  `ToolbarText` is one ellipsized line unless you opt into `wrap`/`maxLines`. A
369
395
  Select or PopupMenu trigger drops its focus ring while its popup is open and
@@ -378,8 +404,11 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
378
404
  divider to make it look right.
379
405
  - **Use one direct toolbar composition for panel/dialog/page headings.** Put an
380
406
  optional icon in a `ToolbarControlGroup`, an extra-large `ToolbarText` directly
381
- in the leading zone, and actions in a trailing group. Supporting copy is
382
- app-owned content below. Do not create a private heading wrapper or restyle the
407
+ in the leading zone, and actions in a trailing group. A short supporting
408
+ line ("Changes save automatically.") is the `ToolbarText` `description`:
409
+ quiet, one truncating line under the title, aligned with its text, with
410
+ `descriptionId` for `aria-describedby`. Longer copy is app-owned content
411
+ below. Do not create a private heading wrapper or restyle the
383
412
  toolbar. A narrow peripheral rail or drawer, where extra-large would truncate
384
413
  at its minimum size, names itself with the default `ToolbarText` size.
385
414
  `ToolbarText size="xlarge-fixed"` keeps the 20px `--kui-font-l` heading step;
@@ -494,6 +523,10 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
494
523
  `onRemoveToken`, ArrowRight moves the caret past a trailing chip), and an
495
524
  `onEdit({id, editor, event})` input callback (the `InputEvent` lets you gate on `inputType`/`data`) — so the app can drop its own keydown/input
496
525
  boilerplate while still owning parsing and controlled token state.
526
+ When `onEdit` or `onRemoveToken` changes tokens and the controlled render
527
+ replaces the focused editor, the helper hands focus and caret to the new
528
+ editor in the same task (end stays at end), so do not add a refocus
529
+ `MutationObserver` or `requestAnimationFrame`.
497
530
  - **Placeholder loading state, don't rebuild it.** For a value or component that is
498
531
  still loading, set `placeholder` on the component (`Select`, `ListHeader`,
499
532
  `ListItem`, `ValueTableRow`, `SegmentedControl`, `StateBanner`,
@@ -523,6 +556,69 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
523
556
  - **Configure StateBanner copy and action placement.** `copyLayout="stacked"`
524
557
  puts detail below the title and badge; `actionPlacement="below"` gives the
525
558
  action a separate trailing row. The inline defaults remain compact.
559
+ `presentation="strip"` renders a flush, square, full-width band for a
560
+ layout edge with tone-colored `dividerSides` (bottom by default) instead of
561
+ the inset rounded card; never restyle a card into a strip.
562
+ - **Use `SplitButton` for a primary action with options.** One loud semantic
563
+ fill with a native primary button and an options trigger (`aria-expanded`,
564
+ `aria-haspopup`); `tone`, `fill`, `busy`, and `disabled` are props. Never
565
+ build one from `wa-button-group` or app CSS on native buttons.
566
+ - **Use `IconToggleButton` for an icon toggle outside a Toolbar.** In content or a
567
+ pane footer, `IconToggleButton({ icon, iconName, label, pressed, action })`
568
+ gives a native `aria-pressed` button the single contained toolbar group's
569
+ geometry; never wrap a `ToolbarControlGroup` outside a toolbar or restyle a
570
+ button to match it.
571
+ - **Let an icon-state toggle skip selected chrome.** When a pressed toggle's
572
+ glyph already shows its state (an empty or filled star), set
573
+ `data-selected-chrome="none"` on that button, or `selectedChrome="none"` on
574
+ its `ToolbarControlGroup`; never override the group's pressed-button styles.
575
+ - **Lay out a `ValueTable` through its props.** `labelWidth` sets a minimum
576
+ label column, `presentation="stacked"` puts values under labels, and
577
+ `stackBelow="compact" | "narrow"` stacks only while the table is narrower
578
+ than 512px/576px; do not override `--kui-value-table-row-columns`.
579
+ - **Show selectable item summaries with `SummaryRow`.** One `role="option"`
580
+ per item as a list `row` or board `card`, with a state `rail`, a clamped
581
+ `title`, `trailingMeta`, a `metadata` line, `selected`, `dimmed`, and
582
+ `listEdge` rounding; the app owns the listbox and keyboard movement. Never
583
+ hand-roll ticket-row chrome.
584
+ - **Group settings rows in `FramedList`.** For rows of arbitrary content in
585
+ one rounded frame with dividers between them (settings, account cards,
586
+ shortcut lists), compose `FramedListRow`s; `ValueTable` is the same frame for
587
+ label/value facts. Never hand-roll a `ul` with borders and row padding.
588
+ - **Square an icon-only button with `IconButton`.** Web Awesome squares a
589
+ `wa-button` only for a lone `wa-icon`; with a `LucideIcon` use
590
+ `IconButton({ icon, iconName, label })` (label required) instead of
591
+ overriding `wa-button::part(base)`. Inside a `ToolbarControlGroup` keep a
592
+ native `button`; the group owns its geometry.
593
+ - **Paint a strip's surface with `List surface`.** `surface="base"` or
594
+ `"raised"` fills a List and its insets with a solid surface (a banner strip
595
+ above a sunken work area); never wrap it in app CSS that sets a background.
596
+ - **Use `Combobox` to pick or create a value by typing.** A themed native
597
+ input on the ARIA combobox pattern with filtered suggestions and an optional
598
+ create option; `wireComboboxes(root, { onCommit })` reports `{ id, value,
599
+ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
600
+ - **Pick or drop files with `FilePickerTrigger` / `FileDropZone`.** Both wrap
601
+ a real, visually hidden file input; `wireFilePickers(root, { onFiles })`
602
+ reports browsed and dropped files and highlights the zone while dragging.
603
+ Never hand-style a file input, its label, or a dashed drop target.
604
+ - **Swap content in place with `ContentSwap`.** Two sides share one cell;
605
+ `active`, `transition` (`push`, `crossfade`, `none`), and `direction` drive
606
+ Kerf-owned motion with an inert, hidden inactive side and reduced-motion
607
+ fallback. Use `NavStack` for full views with toolbars.
608
+ - **Lay out a kanban board with `ColumnTrack`.** Equal columns that never
609
+ narrow below `minColumnWidth` scroll sideways; `layout="paged"` pages one
610
+ column at a time with a peek and snapping. Never re-track a `Grid` or
611
+ hand-roll scroll-snap CSS.
612
+ - **Show ambient activity with `EdgeActivityIndicator`.** A layout-free,
613
+ pointer-inert top-edge strip whose bars ripple while `busy`, with an optional
614
+ polite `message` pill; Kerf owns the wave and reduced motion. Never hand-roll
615
+ fixed bars, keyframes, or a hanging pill in app CSS.
616
+ - **Host app-level progress in `CornerStatus`.** For a non-dismissible
617
+ "Loading…" or "Updating… N of M" with no home beside the affected work, put
618
+ a `StateBanner` (`urgency="status"`) inside `CornerStatus` and call
619
+ `wireCornerStatus` once: a top-layer manual popover at a safe-area-aware
620
+ corner, with no close button, light dismiss, Escape, or focus change. Never
621
+ position a banner with fixed-position CSS or hide a toast's close part.
526
622
  - **Size a Select through its API.** `triggerWidth` chooses `fit-content`,
527
623
  `max-content`, or `fill`; `--kui-select-trigger-max-width` caps it. For custom
528
624
  selected text, use the public color, font-size, and font-weight tokens; the
@@ -548,17 +644,30 @@ headingLevel`, `TokenSearchField clearIcon`, `ContentItem frame="framed"` for a
548
644
  For new content without a count, use the text-free `size="dot"` form: it
549
645
  takes no children, and needs a `label` (announced as an image) or
550
646
  `ariaHidden` when its owner announces it. A `TabNavigator` tab shows the dot
551
- with `badge: true` plus its required `badgeLabel`.
647
+ with `badge: true` plus its required `badgeLabel`. A text badge takes a
648
+ decorative leading `icon`, a `title` tooltip, and `data-*` `rootAttributes`
649
+ for app identity; never wrap a Badge or nest a `Row` in it for those.
650
+ For app-supplied text that can run long (a tag or category name), set
651
+ `maxWidth` (a `CssLength`, such as `px(160)`): the label truncates with an
652
+ ellipsis and string or number content becomes the hover `title`.
552
653
  - **Use `Chip` for removable tags.** Give the native remove button a delegated
553
654
  `removeAction` and a specific `removeLabel`; the application updates the tag
554
655
  list. `itemId` identifies the chip to the action handler. `size="compact"`
555
656
  gives a 20px chip and 16px remove button; `disabled` disables removal.
657
+ - **Use `ChoiceChips` for a wrapping exclusive choice.** When one value comes
658
+ from a visible set too large for a `SegmentedControl` track (a nine-color
659
+ palette in a 560px dialog), render separate pills backed by native radios:
660
+ one Tab stop, arrow-key selection, and a real form value under `name`. Name
661
+ the group with `label` or `labelledBy`, lead choices with a `swatch`
662
+ (`CssColor`, or `'transparent'` for the struck-through no-color dot) or an
663
+ `icon`, and handle the delegated `action` on `change`. Never wrap a
664
+ `SegmentedControl` or button-appearance `wa-radio` set instead.
556
665
 
557
666
  ## Public exports
558
667
 
559
668
  `Badge`, `LucideIcon`, `DisclosureArrow`, `Toolbar`, `ToolbarControlGroup`, `ToolbarActionLink`, `FloatingToolbar`, `ToolbarText`, `Text`,
560
- `ListItem`, `ListActionRow`, `ListHeader`, `ListInsetControl`,
561
- `ListInsetText`, `SegmentedControl`,
669
+ `ListItem`, `ListActionRow` (+ `wireListReorder`, `reorderListItems`), `ListHeader`, `ListInsetControl`,
670
+ `ListInsetText`, `SegmentedControl`, `ChoiceChips`,
562
671
  `Select`, `TokenSearchField` (+ `readTokenSearchField`, `placeTokenSearchCaret`,
563
672
  `wireTokenSearchFields`), `AppTab`, `TabBar` (+ `wireTabBars`, `reorderTabs`),
564
673
  `wireScrollDividers` (scroll-state dividers for every `Pane`, `NavStack`,
@@ -628,8 +737,8 @@ details.
628
737
 
629
738
  Select menus use native viewport shifting with 10px gutters: default menus grow to content (up to 20rem), while `fitMenu` matches trigger width and long labels wrap. Keep popup sizing and position repairs out of consumer CSS.
630
739
 
631
- Modal `DialogSurface` bounds use typed `viewportGutter` and `maxHeight` (`CssLength` or `"viewport"`); explicit caps stay within the dynamic viewport minus both gutters. Omitted props preserve Web Awesome defaults. Application render state chooses responsive values, and preview layout remains application-owned.
740
+ Key sibling `DialogSurface`s that render conditionally with `rootAttributes={{ "data-key": "…" }}` so a re-render morphs each dialog into itself; never wrap one in a keyed app `div`. Modal `DialogSurface` bounds use typed `viewportGutter` and `maxHeight` (`CssLength` or `"viewport"`); explicit caps stay within the dynamic viewport minus both gutters. Omitted props preserve Web Awesome defaults. Application render state chooses responsive values, and preview layout remains application-owned. `height` sets a definite bounded modal size and `bodyLayout="fill"` lets one child fill the body. `PopoverDialogSurface` is the non-modal, light-dismiss counterpart on the native Popover API, with the same size props and an `embedded` in-flow presentation.
632
741
 
633
- Import `@kerfjs/ui/surface-scaffold/register` once when using `DialogSurface`: it registers `wa-dialog` and repairs Web Awesome 3.12 native dialog names before the first modal opening. Headed dialogs reference the rendered title, including live slotted labels; headerless dialogs use the public `label`. Explicit host `aria-label` and pre-existing native names are preserved. Geometry-only markup stays CSS-free and does not register Web Awesome implicitly.
742
+ Import `@kerfjs/ui/surface-scaffold/register` once when using `DialogSurface`: it registers `wa-dialog` and repairs Web Awesome 3.12 native dialog names before the first modal opening. Headed dialogs reference the rendered title, including live slotted labels; headerless dialogs use the public `label`. Explicit host `aria-label` and pre-existing native names are preserved. A host that is itself an explicit dialog (`role="dialog"` or `"alertdialog"` with its own name) keeps that name alone: the native panel is left unnamed, so one dialog carries the name. Geometry-only markup stays CSS-free and does not register Web Awesome implicitly.
634
743
 
635
744
  Toolbar visibility measurement probes and invisible state children are helper-owned and survive Kerf rerenders through `data-morph-preserve`. Actual CSS visibility stays stable while rendering removes transient parent markers, preventing geometry-driven render feedback and repeated probe recreation. Toolbar replacement, explicit internal-node removal and disposal retain their existing behavior.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerfjs/ui",
3
- "version": "5.0.0-beta.94",
3
+ "version": "5.0.0-beta.96",
4
4
  "description": "Accessible, composable UI primitives for kerf applications.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -224,6 +224,10 @@
224
224
  "types": "./dist/wire-scroll-dividers.d.ts",
225
225
  "import": "./dist/wire-scroll-dividers.js"
226
226
  },
227
+ "./wire-list-reorder": {
228
+ "types": "./dist/wire-list-reorder.d.ts",
229
+ "import": "./dist/wire-list-reorder.js"
230
+ },
227
231
  "./wire-toolbar-visibility": {
228
232
  "types": "./dist/wire-toolbar-visibility.d.ts",
229
233
  "import": "./dist/wire-toolbar-visibility.js"
@@ -303,6 +307,11 @@
303
307
  "browser": "./dist/browser/segmented-control.js",
304
308
  "import": "./dist/segmented-control.js"
305
309
  },
310
+ "./choice-chips": {
311
+ "types": "./dist/choice-chips.d.ts",
312
+ "browser": "./dist/browser/choice-chips.js",
313
+ "import": "./dist/choice-chips.js"
314
+ },
306
315
  "./token-search-field": {
307
316
  "types": "./dist/token-search-field.d.ts",
308
317
  "browser": "./dist/browser/token-search-field.js",
@@ -342,6 +351,73 @@
342
351
  "types": "./dist/webawesome.d.ts",
343
352
  "import": "./dist/webawesome.js"
344
353
  },
354
+ "./summary-row": {
355
+ "types": "./dist/summary-row.d.ts",
356
+ "browser": "./dist/browser/summary-row.js",
357
+ "import": "./dist/summary-row.js"
358
+ },
359
+ "./framed-list": {
360
+ "types": "./dist/framed-list.d.ts",
361
+ "browser": "./dist/browser/framed-list.js",
362
+ "import": "./dist/framed-list.js"
363
+ },
364
+ "./split-button": {
365
+ "types": "./dist/split-button.d.ts",
366
+ "browser": "./dist/browser/split-button.js",
367
+ "import": "./dist/split-button.js"
368
+ },
369
+ "./icon-toggle-button": {
370
+ "types": "./dist/icon-toggle-button.d.ts",
371
+ "browser": "./dist/browser/icon-toggle-button.js",
372
+ "import": "./dist/icon-toggle-button.js"
373
+ },
374
+ "./icon-button": {
375
+ "types": "./dist/icon-button.d.ts",
376
+ "browser": "./dist/browser/icon-button.js",
377
+ "import": "./dist/icon-button.js"
378
+ },
379
+ "./edge-activity-indicator": {
380
+ "types": "./dist/edge-activity-indicator.d.ts",
381
+ "browser": "./dist/browser/edge-activity-indicator.js",
382
+ "import": "./dist/edge-activity-indicator.js"
383
+ },
384
+ "./combobox": {
385
+ "types": "./dist/combobox.d.ts",
386
+ "browser": "./dist/browser/combobox.js",
387
+ "import": "./dist/combobox.js"
388
+ },
389
+ "./wire-comboboxes": {
390
+ "types": "./dist/wire-comboboxes.d.ts",
391
+ "import": "./dist/wire-comboboxes.js"
392
+ },
393
+ "./file-picker": {
394
+ "types": "./dist/file-picker.d.ts",
395
+ "browser": "./dist/browser/file-picker.js",
396
+ "import": "./dist/file-picker.js"
397
+ },
398
+ "./wire-file-pickers": {
399
+ "types": "./dist/wire-file-pickers.d.ts",
400
+ "import": "./dist/wire-file-pickers.js"
401
+ },
402
+ "./content-swap": {
403
+ "types": "./dist/content-swap.d.ts",
404
+ "browser": "./dist/browser/content-swap.js",
405
+ "import": "./dist/content-swap.js"
406
+ },
407
+ "./column-track": {
408
+ "types": "./dist/column-track.d.ts",
409
+ "browser": "./dist/browser/column-track.js",
410
+ "import": "./dist/column-track.js"
411
+ },
412
+ "./corner-status": {
413
+ "types": "./dist/corner-status.d.ts",
414
+ "browser": "./dist/browser/corner-status.js",
415
+ "import": "./dist/corner-status.js"
416
+ },
417
+ "./wire-corner-status": {
418
+ "types": "./dist/wire-corner-status.d.ts",
419
+ "import": "./dist/wire-corner-status.js"
420
+ },
345
421
  "./state-banner": {
346
422
  "types": "./dist/state-banner.d.ts",
347
423
  "browser": "./dist/browser/state-banner.js",
@@ -403,8 +479,20 @@
403
479
  "./skeleton.css": "./dist/styles/skeleton.css",
404
480
  "./sunken-panel.css": "./dist/styles/sunken-panel.css",
405
481
  "./segmented-control.css": "./dist/styles/segmented-control.css",
482
+ "./choice-chips.css": "./dist/styles/choice-chips.css",
406
483
  "./token-search-field.css": "./dist/styles/token-search-field.css",
407
484
  "./state-banner.css": "./dist/styles/state-banner.css",
485
+ "./corner-status.css": "./dist/styles/corner-status.css",
486
+ "./column-track.css": "./dist/styles/column-track.css",
487
+ "./content-swap.css": "./dist/styles/content-swap.css",
488
+ "./file-picker.css": "./dist/styles/file-picker.css",
489
+ "./combobox.css": "./dist/styles/combobox.css",
490
+ "./edge-activity-indicator.css": "./dist/styles/edge-activity-indicator.css",
491
+ "./icon-button.css": "./dist/styles/icon-button.css",
492
+ "./icon-toggle-button.css": "./dist/styles/icon-toggle-button.css",
493
+ "./split-button.css": "./dist/styles/split-button.css",
494
+ "./framed-list.css": "./dist/styles/framed-list.css",
495
+ "./summary-row.css": "./dist/styles/summary-row.css",
408
496
  "./empty-state.css": "./dist/styles/empty-state.css",
409
497
  "./value-table.css": "./dist/styles/value-table.css",
410
498
  "./ai/*": "./ai/*",
@@ -38,6 +38,45 @@ export interface UxReviewPlugin {
38
38
  /** The nearest directory at or above `start` that holds `.git`, else `start`. */
39
39
  export declare function findProjectDirectory(start: string): string;
40
40
 
41
+ export interface ResolveUxReviewProjectOptions {
42
+ /** The directory to start from. Default: `process.cwd()`. */
43
+ root?: string;
44
+ /**
45
+ * An explicit project directory, resolved against `root`. Default: the
46
+ * nearest ancestor of `root` holding `.git`, or `root` itself.
47
+ */
48
+ projectDirectory?: string;
49
+ }
50
+
51
+ /** The real path of the UX Review project directory for a server. */
52
+ export declare function resolveUxReviewProject(
53
+ options?: ResolveUxReviewProjectOptions,
54
+ ): string;
55
+
56
+ /**
57
+ * Answer a Fetch API request for `…/__ux-review/project.json` at any base
58
+ * path: the project JSON for a GET, 405 for another method, or `null` for any
59
+ * other path so the server handles it as usual. Mount it on a development
60
+ * server only.
61
+ */
62
+ export declare function uxReviewProjectResponse(
63
+ request: Request,
64
+ projectDirectory: string,
65
+ ): Response | null;
66
+
67
+ /** A Node / connect `(request, response, next)` handler for a server's middleware stack. */
68
+ export type UxReviewMiddleware = Parameters<
69
+ UxReviewMiddlewareServer['middlewares']['use']
70
+ >[0];
71
+
72
+ /**
73
+ * A Node / connect-style handler for `…/__ux-review/project.json` at any base
74
+ * path; other requests go to `next`. Mount it on a development server only.
75
+ */
76
+ export declare function uxReviewMiddleware(
77
+ projectDirectory: string,
78
+ ): UxReviewMiddleware;
79
+
41
80
  /** Serve the UX Review project directory to catalog pages on dev and preview servers. */
42
81
  export declare function uxReviewPlugin(
43
82
  options?: UxReviewPluginOptions,
@@ -1,15 +1,21 @@
1
1
  /**
2
- * `@kerfjs/ui/vite-ux-review` — a Node-only Vite plugin that tells a local
3
- * catalog page which project it belongs to, so the catalog can offer a UX
4
- * Review "Capture region" link (see `wireCatalog`'s `onUxReviewProject` and
5
- * the Catalog's `uxReview` prop in `@kerfjs/ui/catalog`).
2
+ * `@kerfjs/ui/vite-ux-review` — Node-only helpers that tell a local catalog
3
+ * page which project it belongs to, so the catalog can offer a UX Review
4
+ * "Capture region" link (see `wireCatalog`'s `onUxReviewProject` and the
5
+ * Catalog's `uxReview` prop in `@kerfjs/ui/catalog`).
6
6
  *
7
- * It answers `GET …/__ux-review/project.json` with `{ projectDirectory }` on
8
- * the dev and preview servers. It imports nothing from Vite and never reaches
9
- * a browser bundle; a static build has no endpoint, so the link stays hidden.
7
+ * The endpoint answers `GET …/__ux-review/project.json` with
8
+ * `{ projectDirectory }`. `uxReviewPlugin()` mounts it on Vite's dev and
9
+ * preview servers; an app that serves its catalog from its own backend mounts
10
+ * `uxReviewProjectResponse()` (Fetch API servers) or `uxReviewMiddleware()`
11
+ * (Node / connect servers) instead, on its development server only. Nothing
12
+ * here imports Vite or reaches a browser bundle; a static build has no
13
+ * endpoint, so the link stays hidden.
10
14
  */
11
15
  import { existsSync, realpathSync } from 'node:fs';
12
16
  import { dirname, join, resolve } from 'node:path';
17
+ import process from 'node:process';
18
+ import { URL } from 'node:url';
13
19
 
14
20
  /** Where the endpoint lives, relative to the catalog page. */
15
21
  export const UX_REVIEW_PROJECT_PATH = '__ux-review/project.json';
@@ -24,15 +30,53 @@ export function findProjectDirectory(start) {
24
30
  }
25
31
 
26
32
  /**
27
- * Serve the UX Review project directory to catalog pages. By default it is
28
- * the repository holding Vite's `root` (the nearest ancestor with `.git`, or
29
- * `root` itself); `projectDirectory` overrides it, resolved against `root`.
33
+ * The real path of the UX Review project directory: `projectDirectory`
34
+ * resolved against `root` when given, otherwise the repository holding `root`
35
+ * (the nearest ancestor with `.git`, or `root` itself). `root` defaults to the
36
+ * current working directory.
30
37
  */
31
- export function uxReviewPlugin(options = {}) {
32
- let projectDirectory = '';
33
- const serve = (request, response, next) => {
38
+ export function resolveUxReviewProject({
39
+ root = process.cwd(),
40
+ projectDirectory,
41
+ } = {}) {
42
+ return realpathSync(
43
+ projectDirectory
44
+ ? resolve(root, projectDirectory)
45
+ : findProjectDirectory(root),
46
+ );
47
+ }
48
+
49
+ const isEndpoint = (path) => path.endsWith(`/${UX_REVIEW_PROJECT_PATH}`);
50
+ const JSON_HEADERS = {
51
+ 'Content-Type': 'application/json; charset=utf-8',
52
+ 'Cache-Control': 'no-store',
53
+ };
54
+
55
+ /**
56
+ * Answer a Fetch API request for the endpoint, at any base path: the project
57
+ * JSON for a GET, 405 for another method, or `null` when the request is for
58
+ * some other path so the server handles it as usual.
59
+ */
60
+ export function uxReviewProjectResponse(request, projectDirectory) {
61
+ if (!isEndpoint(new URL(request.url).pathname)) return null;
62
+ if (request.method !== 'GET')
63
+ return new globalThis.Response(null, {
64
+ status: 405,
65
+ headers: { Allow: 'GET' },
66
+ });
67
+ return new globalThis.Response(JSON.stringify({ projectDirectory }), {
68
+ headers: JSON_HEADERS,
69
+ });
70
+ }
71
+
72
+ /**
73
+ * A Node / connect-style `(request, response, next)` handler for the
74
+ * endpoint, at any base path; other requests go to `next`.
75
+ */
76
+ export function uxReviewMiddleware(projectDirectory) {
77
+ return (request, response, next) => {
34
78
  const path = (request.url ?? '').split(/[?#]/)[0];
35
- if (!path.endsWith(`/${UX_REVIEW_PROJECT_PATH}`)) {
79
+ if (!isEndpoint(path)) {
36
80
  next();
37
81
  return;
38
82
  }
@@ -42,17 +86,28 @@ export function uxReviewPlugin(options = {}) {
42
86
  response.end();
43
87
  return;
44
88
  }
45
- response.setHeader('Content-Type', 'application/json; charset=utf-8');
46
- response.setHeader('Cache-Control', 'no-store');
89
+ for (const [name, value] of Object.entries(JSON_HEADERS))
90
+ response.setHeader(name, value);
47
91
  response.end(JSON.stringify({ projectDirectory }));
48
92
  };
93
+ }
94
+
95
+ /**
96
+ * Serve the UX Review project directory to catalog pages on Vite's dev and
97
+ * preview servers. By default it is the repository holding Vite's `root`;
98
+ * `projectDirectory` overrides it, resolved against `root`.
99
+ */
100
+ export function uxReviewPlugin(options = {}) {
101
+ let handler = uxReviewMiddleware('');
102
+ const serve = (request, response, next) => handler(request, response, next);
49
103
  return {
50
104
  name: 'kerf-ux-review',
51
105
  configResolved(config) {
52
- projectDirectory = realpathSync(
53
- options.projectDirectory
54
- ? resolve(config.root, options.projectDirectory)
55
- : findProjectDirectory(config.root),
106
+ handler = uxReviewMiddleware(
107
+ resolveUxReviewProject({
108
+ root: config.root,
109
+ projectDirectory: options.projectDirectory,
110
+ }),
56
111
  );
57
112
  },
58
113
  configureServer(server) {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/actions/toolbar-text/toolbar-text.tsx"],"names":[],"mappings":";;;;AAsEO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,IAAA,GAAO,SAAA;AAAA,EACP,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,EAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,IAAA,GAAO,KAAA;AAAA,EACP,QAAA,GAAW,IAAA;AAAA,EACX,QAAA,GAAW,IAAA;AAAA,EACX,IAAA,GAAO,KAAA;AAAA,EACP,IAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,QAAA,IAAY,IAAA,IAAQ,QAAA,GAAW,CAAA;AACtD,EAAA,IAAI,MAAA,KAAW,MAAA;AACb,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,QAC5C,gBAAA,EAAe,cAAA;AAAA,QACf,WAAA,EAAW,IAAA;AAAA,QACX,iBAAA,EAAiB,SAAA;AAAA,QACjB,iBAAA,EAAiB,SAAA;AAAA,QACjB,WAAA,EAAW,IAAA,KAAS,SAAA,GAAY,MAAA,GAAY,IAAA;AAAA,QAC5C,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,QAC3B,eAAA,EAAe,WAAW,MAAA,GAAY,OAAA;AAAA,QACtC,aAAA,EAAa,MAAA;AAAA,QACb,EAAA;AAAA,QACA,IAAA;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,KAC7C;AAEJ,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;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,iBAAA,EAAiB,SAAA;AAAA,MACjB,iBAAA,EAAiB,SAAA;AAAA,MACjB,WAAA,EAAW,IAAA,KAAS,SAAA,GAAY,MAAA,GAAY,IAAA;AAAA,MAC5C,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,eAAA,EAAe,WAAW,MAAA,GAAY,OAAA;AAAA,MACtC,gBAAA,EAAgB,MAAA,GAAS,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAAA,MAC5C,KAAA,EAAO,MAAA,GAAS,CAAA,6BAAA,EAAgC,QAAQ,CAAA,CAAA,GAAK,MAAA;AAAA,MAC7D,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,EAAA;AAAA,MACA,IAAA,EAAM,eAAe,SAAA,GAAY,MAAA;AAAA,MACjC,YAAA,EAAY,YAAA,GAAe,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA;AAAA,MAClD,WAAA,EAAW,cAAc,MAAA,GAAS,MAAA;AAAA,MAClC,IAAA;AAAA,MAEC,QAAA,EAAA,WAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,CAAG,CAAC,CAAA,EAAG,CAAA,mBAExB,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,wBAAA,EAA0B,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,GAE/C;AAEJ","file":"chunk-3DXHNLME.js","sourcesContent":["import { type CssLength, em } from '../../../shared/styles/css-values.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\n\nexport type ToolbarTextSize =\n 'xlarge' | 'xlarge-fixed' | 'large' | 'default' | 'small' | 'xsmall';\n\nexport type ToolbarTextTone = 'default' | 'dark';\n\n/** ARIA heading level for a title exposed as a heading landmark. */\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\ninterface ToolbarTextBaseProps {\n text: string;\n size?: ToolbarTextSize;\n /** Use dark-toolbar foregrounds on a dark or photo-backed toolbar. */\n tone?: ToolbarTextTone;\n /** Hide below this Toolbar content width; requires wireToolbarVisibility. */\n hideBelow?: CssLength;\n /** Show only below this Toolbar content width; requires wireToolbarVisibility. */\n showBelow?: CssLength;\n className?: string;\n /** Optional id, e.g. so a dialog can reference the title via aria-labelledby. */\n id?: string;\n /**\n * Show a trailing ellipsis (…) where the text is truncated — on the single line\n * (default), or at the `maxLines` boundary when wrapping. Set false to hard-clip\n * instead. Default true.\n */\n ellipsis?: boolean;\n /**\n * Grow to fill the free space of the flex row it sits in (a Toolbar zone),\n * truncating at the space left by its siblings instead of taking only its\n * text's width. Default false.\n */\n fill?: boolean;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n /**\n * Cap wrapped text to this many lines, truncating past it. Only takes effect with\n * `wrap`; ignored on a single line. `null`/omitted wraps without a line cap. Default null.\n */\n}\n\ntype ToolbarTextWrappingProps =\n | {\n /** Wrap onto multiple lines; combine with `maxLines` to cap them. */\n wrap: true;\n maxLines?: number | null;\n }\n | { wrap?: false; maxLines?: never };\n\nexport type ToolbarTextProps = ToolbarTextBaseProps &\n (\n | ({\n action?: never;\n /** Expose `role=\"heading\"` and `aria-level` on read-only text. */\n headingLevel?: HeadingLevel;\n /** Render an unanimated loading skeleton instead of the text. */\n placeholder?: boolean;\n } & ToolbarTextWrappingProps)\n | {\n /** Render a native button with this delegated action; the app owns editing. */\n action: string;\n headingLevel?: never;\n placeholder?: never;\n wrap?: never;\n maxLines?: never;\n }\n );\n\nexport function ToolbarText({\n text,\n size = 'default',\n tone = 'default',\n hideBelow,\n showBelow,\n className = '',\n id,\n headingLevel,\n placeholder = false,\n wrap = false,\n ellipsis = true,\n maxLines = null,\n fill = false,\n slot,\n action,\n}: ToolbarTextProps) {\n const capped = wrap && maxLines != null && maxLines > 0;\n if (action !== undefined)\n return (\n <button\n type=\"button\"\n class={`kui-toolbar-text ${className}`.trim()}\n data-component=\"toolbar-text\"\n data-size={size}\n data-hide-below={hideBelow}\n data-show-below={showBelow}\n data-tone={tone === 'default' ? undefined : tone}\n data-fill={fill ? 'true' : undefined}\n data-ellipsis={ellipsis ? undefined : 'false'}\n data-action={action}\n id={id}\n slot={slot}\n >\n <span class=\"kui-toolbar-text__text\">{text}</span>\n </button>\n );\n return (\n <span\n class={`kui-toolbar-text ${className}`.trim()}\n data-component=\"toolbar-text\"\n data-size={size}\n data-hide-below={hideBelow}\n data-show-below={showBelow}\n data-tone={tone === 'default' ? undefined : tone}\n data-fill={fill ? 'true' : undefined}\n data-wrap={wrap ? 'true' : undefined}\n data-ellipsis={ellipsis ? undefined : 'false'}\n data-max-lines={capped ? String(maxLines) : undefined}\n style={capped ? `--kui-toolbar-text-max-lines:${maxLines}` : undefined}\n data-placeholder={placeholder ? 'true' : undefined}\n id={id}\n role={headingLevel ? 'heading' : undefined}\n aria-level={headingLevel ? String(headingLevel) : undefined}\n aria-busy={placeholder ? 'true' : undefined}\n slot={slot}\n >\n {placeholder ? (\n <Skeleton width={em(8)} />\n ) : (\n <span class=\"kui-toolbar-text__text\">{text}</span>\n )}\n </span>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/collections/list-item/list-item.tsx"],"names":[],"mappings":"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","file":"chunk-3PO7JEK7.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, remify } from '../../../shared/styles/css-values.js';\nimport { withWordBreaks } from '../../../shared/text/word-breaks.js';\nimport { LoadingSpinner } from '../../feedback/loading-spinner/loading-spinner.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-item-id',\n 'data-has-icon',\n 'data-has-description',\n 'data-multiline',\n 'data-density',\n 'data-divider',\n 'data-busy',\n 'data-state',\n 'data-kui-disabled',\n 'data-icon-align',\n]);\n\ntype ListItemRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-item-id'?: never;\n 'data-has-icon'?: never;\n 'data-has-description'?: never;\n 'data-multiline'?: never;\n 'data-density'?: never;\n 'data-divider'?: never;\n 'data-busy'?: never;\n 'data-state'?: never;\n 'data-kui-disabled'?: never;\n 'data-icon-align'?: never;\n }\n>;\n\nexport interface ListItemProps {\n label: string | SafeHtml;\n /** App-owned supporting text rendered in the component's stable label stack. */\n description?: string | SafeHtml;\n icon?: SafeHtml;\n /** Dormant author content at the row's end; a placeholder renders it as a skeleton. */\n trailing?: KerfUiContent;\n /** Dormant status metadata rendered before trailing content; a placeholder renders it as a skeleton. */\n status?: string | SafeHtml;\n /** Show a progress indicator and expose the row as busy without replacing its content; a placeholder keeps the indicator. */\n busy?: boolean;\n density?: 'standard' | 'compact' | 'spacious';\n divider?: 'none' | 'before' | 'after' | 'both';\n selected?: boolean;\n action: string;\n itemId?: string;\n className?: string;\n pressed?: boolean;\n accessibleLabel?: string;\n title?: string;\n multiline?: boolean;\n /** Alignment of an icon beside a wrapped label. Defaults to its first line. */\n multilineIconAlign?: 'first-line' | 'center';\n state?: string;\n disabled?: boolean;\n tabIndex?: number;\n /** Render the row as an unanimated loading skeleton, disabling its action: label, description, icon, status, and trailing content become skeletons; the `busy` indicator stays live. */\n placeholder?: boolean;\n rootAttributes?: ListItemRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport interface ListItemLinkProps extends Omit<\n ListItemProps,\n 'action' | 'pressed'\n> {\n /** Native destination for this navigation row. */\n href: string;\n /** Open in a new tab with a safe rel and announce that behavior. */\n external?: boolean;\n action?: never;\n pressed?: never;\n}\n\nfunction listItemContent({\n label,\n description,\n icon,\n trailing,\n status,\n busy = false,\n multiline = false,\n placeholder = false,\n}: Pick<\n ListItemProps,\n | 'label'\n | 'description'\n | 'icon'\n | 'trailing'\n | 'status'\n | 'busy'\n | 'multiline'\n | 'placeholder'\n>) {\n return (\n <>\n {icon && (\n <span class=\"kui-list-item__icon\">\n {placeholder ? (\n <Skeleton block width={remify(18)} height={remify(18)} />\n ) : (\n icon\n )}\n </span>\n )}\n <span class=\"kui-list-item__label\">\n <span class=\"kui-list-item__primary-label\">\n {placeholder ? (\n <Skeleton width={em(9)} />\n ) : multiline ? (\n withWordBreaks(label)\n ) : (\n label\n )}\n </span>\n {description && (\n <span class=\"kui-list-item__description\">\n {placeholder ? <Skeleton width={em(11)} /> : description}\n </span>\n )}\n </span>\n {(busy || status || trailing) && (\n <span class=\"kui-list-item__trailing\">\n {/* The busy spinner is component-owned chrome drawn from a known\n prop, so a placeholder keeps it live. Status text and\n author-supplied trailing content are values: skeletons. */}\n {busy && <LoadingSpinner />}\n {status && (\n <span class=\"kui-list-item__status\">\n {placeholder ? <Skeleton width={em(3.5)} /> : status}\n </span>\n )}\n {trailing && (placeholder ? <Skeleton width={em(1.5)} /> : trailing)}\n </span>\n )}\n </>\n );\n}\n\nexport function ListItem({\n label,\n description,\n icon,\n trailing,\n status,\n busy = false,\n density = 'standard',\n divider = 'none',\n selected = false,\n action,\n itemId,\n className = '',\n pressed,\n accessibleLabel,\n title,\n multiline = false,\n multilineIconAlign = 'first-line',\n state,\n disabled = false,\n tabIndex,\n placeholder = false,\n rootAttributes = {},\n slot,\n}: ListItemProps) {\n const extensionAttributes = filterDataAttributes(\n rootAttributes,\n PROTECTED_ROOT_DATA_ATTRIBUTES,\n );\n return (\n <button\n {...extensionAttributes}\n type=\"button\"\n class={`kui-list-item ${className}`.trim()}\n title={placeholder ? undefined : title}\n disabled={disabled || placeholder}\n tabindex={placeholder ? -1 : tabIndex}\n data-component=\"list-item\"\n data-action={placeholder ? undefined : action}\n data-item-id={itemId}\n data-has-icon={String(Boolean(icon))}\n data-has-description={String(Boolean(description))}\n data-multiline={multiline ? 'true' : undefined}\n data-icon-align={multiline ? multilineIconAlign : undefined}\n data-density={density}\n data-divider={divider}\n data-busy={busy ? 'true' : undefined}\n data-state={state}\n data-kui-disabled={disabled ? 'true' : undefined}\n data-placeholder={placeholder ? 'true' : undefined}\n aria-label={accessibleLabel}\n aria-current={selected ? 'page' : undefined}\n aria-pressed={pressed === undefined ? undefined : String(pressed)}\n aria-busy={placeholder || busy ? 'true' : undefined}\n slot={slot}\n >\n {listItemContent({\n label,\n description,\n icon,\n trailing,\n status,\n busy,\n multiline,\n placeholder,\n })}\n </button>\n );\n}\n\n/** A navigation row with native link activation and ListItem geometry. */\nexport function ListItemLink({\n href,\n external = false,\n label,\n description,\n icon,\n trailing,\n status,\n busy = false,\n density = 'standard',\n divider = 'none',\n selected = false,\n itemId,\n className = '',\n accessibleLabel,\n title,\n multiline = false,\n multilineIconAlign = 'first-line',\n state,\n disabled = false,\n tabIndex,\n placeholder = false,\n rootAttributes = {},\n slot,\n}: ListItemLinkProps) {\n const extensionAttributes = filterDataAttributes(\n rootAttributes,\n PROTECTED_ROOT_DATA_ATTRIBUTES,\n );\n const inactive = disabled || placeholder;\n const linkLabel =\n accessibleLabel ??\n (external && typeof label === 'string'\n ? `${label} (opens in new tab)`\n : undefined);\n return (\n <a\n {...extensionAttributes}\n class={`kui-list-item ${className}`.trim()}\n href={inactive ? undefined : href}\n target={inactive || !external ? undefined : '_blank'}\n rel={inactive || !external ? undefined : 'noopener noreferrer'}\n title={placeholder ? undefined : title}\n tabindex={inactive ? -1 : tabIndex}\n data-component=\"list-item-link\"\n data-item-id={itemId}\n data-has-icon={String(Boolean(icon))}\n data-has-description={String(Boolean(description))}\n data-multiline={multiline ? 'true' : undefined}\n data-icon-align={multiline ? multilineIconAlign : undefined}\n data-density={density}\n data-divider={divider}\n data-busy={busy ? 'true' : undefined}\n data-state={state}\n data-kui-disabled={disabled ? 'true' : undefined}\n data-placeholder={placeholder ? 'true' : undefined}\n aria-label={linkLabel}\n aria-current={selected ? 'page' : undefined}\n aria-disabled={inactive ? 'true' : undefined}\n aria-busy={placeholder || busy ? 'true' : undefined}\n slot={slot}\n >\n {listItemContent({\n label,\n description,\n icon,\n trailing,\n status,\n busy,\n multiline,\n placeholder,\n })}\n </a>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/surfaces/sunken-panel/sunken-panel.tsx"],"names":[],"mappings":";;;AAgCO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,GAAQ,SAAA;AAAA,EACR,IAAA,GAAO,KAAA;AAAA,EACP,IAAA,GAAO,KAAA;AAAA,EACP,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,SAAA,GAAY,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,IAAA,IAAQ,MAAA;AACvD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,gBAAA,EAAe,cAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MAC/B,WAAA,EAAW,OAAO,MAAA,GAAS,MAAA;AAAA,MAC3B,eAAA,EAAe,WAAW,MAAA,GAAS,MAAA;AAAA,MACnC,KAAA,EAAO,SAAA,GAAY,CAAA,yBAAA,EAA4B,SAAS,CAAA,CAAA,GAAK,MAAA;AAAA,MAC7D,IAAA,EAAM,YAAY,QAAA,GAAW,MAAA;AAAA,MAC7B,YAAA,EAAY,SAAA;AAAA,MACZ,QAAA,EAAU,QAAA;AAAA,MACV,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-3XPGJUUQ.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport type {\n CssFlex,\n CssFlexKeyword,\n} from '../../../shared/styles/css-values.js';\n\nexport type SunkenPanelShape = 'rounded' | 'square';\n\nexport interface SunkenPanelProps {\n children?: KerfUiContent;\n /** Optional accessible landmark name for a distinct application region. */\n ariaLabel?: string;\n /** Corner shape: a rounded rectangle (default) or square corners. */\n shape?: SunkenPanelShape;\n /** Grow or shrink within a flex parent, using Grid's typed flex contract. */\n flex?: boolean | CssFlexKeyword | CssFlex;\n /** Fill a parent with a definite height; use flex inside a flex layout. */\n fill?: boolean;\n /** Opt into keyboard (`0`) or programmatic (`-1`) focus on the panel. */\n tabIndex?: 0 | -1;\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\n/**\n * A lowered application surface with one compact inset and a vertical content\n * stack. The panel owns its background and padding; children own their own\n * borders and internal geometry.\n */\nexport function SunkenPanel({\n children,\n ariaLabel,\n shape = 'rounded',\n flex = false,\n fill = false,\n tabIndex,\n outlined = false,\n className = '',\n slot,\n}: SunkenPanelProps) {\n const flexValue = flex === true ? '1 1 auto' : flex || undefined;\n return (\n <div\n class={`kui-sunken-panel ${className}`.trim()}\n data-component=\"sunken-panel\"\n data-shape={shape}\n data-flex={String(Boolean(flex))}\n data-fill={fill ? 'true' : undefined}\n data-outlined={outlined ? 'true' : undefined}\n style={flexValue ? `--_kui-sunken-panel-flex:${flexValue}` : undefined}\n role={ariaLabel ? 'region' : undefined}\n aria-label={ariaLabel}\n tabindex={tabIndex}\n slot={slot}\n >\n {children}\n </div>\n );\n}\n"]}