@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
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 592 786" width="592" height="786"><defs><clipPath id="cp0"><rect x="16" y="38" width="560" height="116"/></clipPath><clipPath id="cp1"><rect x="16" y="192" width="560" height="116"/></clipPath><clipPath id="cp2"><rect x="16" y="346" width="560" height="116"/></clipPath><clipPath id="cp3"><rect x="16" y="500" width="560" height="116"/></clipPath><clipPath id="cp4"><rect x="16" y="654" width="560" height="116"/></clipPath><clipPath id="ct5"><rect x="16" y="16" width="560" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="38" width="560" height="116" rx="0"/></clipPath><clipPath id="ct8"><rect x="16" y="170" width="560" height="22"/></clipPath><clipPath id="irc9"><rect x="16" y="192" width="560" height="116" rx="0"/></clipPath><clipPath id="ct11"><rect x="16" y="324" width="560" height="22"/></clipPath><clipPath id="irc12"><rect x="16" y="346" width="560" height="116" rx="0"/></clipPath><clipPath id="ct14"><rect x="16" y="478" width="560" height="22"/></clipPath><clipPath id="irc15"><rect x="16" y="500" width="560" height="116" rx="0"/></clipPath><clipPath id="ct17"><rect x="16" y="632" width="560" height="22"/></clipPath><clipPath id="irc18"><rect x="16" y="654" width="560" height="116" rx="0"/></clipPath></defs><rect x="0" y="0" width="592" height="786" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info</text><g clip-path="url(#cp0)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="38" width="560" height="116"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg7cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg7ct2"><rect x="61" y="29.4" width="116.7" height="15"/></clipPath><clipPath id="svgimg7cp3"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg7ct4"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg7ct5"><rect x="437.6" y="29" width="65.4" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg7cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg7svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg7svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Draft not published</text><g clip-path="url(#svgimg7cp3)"><g clip-path="url(#svgimg7ct4)"><text x="61" y="55.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(26,93,207)">Changes are saved but only visible to your team.</text></g></g><rect x="437.6" y="29" width="65.4" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="438.5" y="29.5" width="64" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.83" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Publish</text></g></g></g></g><text x="16" y="182" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info with badge</text><g clip-path="url(#cp1)"><g clip-path="url(#irc9)"><clipPath id="svgimg10vclip"><rect x="16" y="192" width="560" height="116"/></clipPath><g clip-path="url(#svgimg10vclip)"><g transform="translate(16 192)"><defs><clipPath id="svgimg10cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg10ct2"><rect x="61" y="35.9" width="137.6" height="15"/></clipPath><clipPath id="svgimg10ct3"><rect x="206.6" y="33.4" width="20" height="20"/></clipPath><clipPath id="svgimg10ct4"><rect x="437.3" y="29" width="65.7" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg10cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg10svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg10svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Unanswered questions</text><rect x="206.6" y="33.4" width="20" height="20" rx="10" fill="rgb(26,93,207)"/><rect x="207.5" y="33.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="213.83" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(255,255,255)">1</text><rect x="437.3" y="29" width="65.7" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="437.5" y="29.5" width="65" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.47" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Answer</text></g></g></g></g><text x="16" y="336" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Success</text><g clip-path="url(#cp2)"><g clip-path="url(#irc12)"><clipPath id="svgimg13vclip"><rect x="16" y="346" width="560" height="116"/></clipPath><g clip-path="url(#svgimg13vclip)"><g transform="translate(16 346)"><defs><clipPath id="svgimg13cp0"><rect x="37" y="35" width="16" height="16"/></clipPath><clipPath id="svgimg13ct2"><rect x="61" y="29" width="132.1" height="15"/></clipPath><clipPath id="svgimg13cp3"><rect x="61" y="44" width="259.7" height="13"/></clipPath><clipPath id="svgimg13ct4"><rect x="61" y="44" width="259.7" height="13"/></clipPath></defs><rect x="28" y="20" width="484" height="46" rx="12" fill="rgb(227,247,232)"/><rect x="28.5" y="20.5" width="483" height="45" rx="11.5" fill="none" stroke="rgb(154,227,172)" stroke-width="1"/><g clip-path="url(#svgimg13cp0)"><g color="rgb(0, 121, 44)"><clipPath id="svgimg13svgic1"><rect x="37" y="35" width="16" height="16"/></clipPath><g clip-path="url(#svgimg13svgic1)"><g transform="translate(37 35)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="m16 9-5.5 5.5L8 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(0,121,44)">Deployment complete</text><g clip-path="url(#svgimg13cp3)"><g clip-path="url(#svgimg13ct4)"><text x="61" y="55" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(0,121,44)">production.example.com is serving the new build.</text></g></g></g></g></g></g><text x="16" y="490" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Warning</text><g clip-path="url(#cp3)"><g clip-path="url(#irc15)"><clipPath id="svgimg16vclip"><rect x="16" y="500" width="560" height="116"/></clipPath><g clip-path="url(#svgimg16vclip)"><g transform="translate(16 500)"><defs><clipPath id="svgimg16cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg16ct2"><rect x="61" y="29.4" width="166.1" height="15"/></clipPath><clipPath id="svgimg16cp3"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg16ct4"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg16ct5"><rect x="431.1" y="29" width="71.9" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(255,250,232)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(160,131,13)" stroke-width="1"/><g clip-path="url(#svgimg16cp0)"><g color="rgb(143, 94, 0)"><clipPath id="svgimg16svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg16svgic1)"><g transform="translate(37 35.39)scale(.66667)"><path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 9v4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 17z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(143,94,0)">Approaching your plan limit</text><g clip-path="url(#svgimg16cp3)"><g clip-path="url(#svgimg16ct4)"><text x="61" y="55.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(143,94,0)">You have used 92% of this month’s build minutes.</text></g></g><rect x="431.1" y="29" width="71.9" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="431.5" y="29.5" width="71" height="28" rx="13.9" fill="none" stroke="rgb(143,94,0)" stroke-width="1"/><text x="443.28" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(143,94,0)">Upgrade</text></g></g></g></g><text x="16" y="644" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Danger (alert)</text><g clip-path="url(#cp4)"><g clip-path="url(#irc18)"><clipPath id="svgimg19vclip"><rect x="16" y="654" width="560" height="116"/></clipPath><g clip-path="url(#svgimg19vclip)"><g transform="translate(16 654)"><defs><clipPath id="svgimg19cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg19ct2"><rect x="61" y="29.4" width="67.5" height="15"/></clipPath><clipPath id="svgimg19cp3"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg19ct4"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg19ct5"><rect x="431.7" y="29" width="71.3" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(254,237,238)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(249,173,175)" stroke-width="1"/><g clip-path="url(#svgimg19cp0)"><g color="rgb(194, 11, 32)"><clipPath id="svgimg19svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg19svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(194,11,32)">Build failed</text><g clip-path="url(#svgimg19cp3)"><g clip-path="url(#svgimg19ct4)"><text x="61" y="55.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(194,11,32)">Step “test” exited with code 1.</text></g></g><rect x="431.7" y="29" width="71.3" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="432.5" y="29.5" width="70" height="28" rx="13.9" fill="none" stroke="rgb(194,11,32)" stroke-width="1"/><text x="443.88" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(194,11,32)">View log</text></g></g></g></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 592 940" width="592" height="940"><defs><clipPath id="cp0"><rect x="16" y="38" width="560" height="116"/></clipPath><clipPath id="cp1"><rect x="16" y="192" width="560" height="116"/></clipPath><clipPath id="cp2"><rect x="16" y="346" width="560" height="116"/></clipPath><clipPath id="cp3"><rect x="16" y="500" width="560" height="116"/></clipPath><clipPath id="cp4"><rect x="16" y="654" width="560" height="116"/></clipPath><clipPath id="cp5"><rect x="16" y="808" width="560" height="116"/></clipPath><clipPath id="ct6"><rect x="16" y="16" width="560" height="22"/></clipPath><clipPath id="irc7"><rect x="16" y="38" width="560" height="116" rx="0"/></clipPath><clipPath id="ct9"><rect x="16" y="170" width="560" height="22"/></clipPath><clipPath id="irc10"><rect x="16" y="192" width="560" height="116" rx="0"/></clipPath><clipPath id="ct12"><rect x="16" y="324" width="560" height="22"/></clipPath><clipPath id="irc13"><rect x="16" y="346" width="560" height="116" rx="0"/></clipPath><clipPath id="ct15"><rect x="16" y="478" width="560" height="22"/></clipPath><clipPath id="irc16"><rect x="16" y="500" width="560" height="116" rx="0"/></clipPath><clipPath id="ct18"><rect x="16" y="632" width="560" height="22"/></clipPath><clipPath id="irc19"><rect x="16" y="654" width="560" height="116" rx="0"/></clipPath><clipPath id="ct21"><rect x="16" y="786" width="560" height="22"/></clipPath><clipPath id="irc22"><rect x="16" y="808" width="560" height="116" rx="0"/></clipPath></defs><rect x="0" y="0" width="592" height="940" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info</text><g clip-path="url(#cp0)"><g clip-path="url(#irc7)"><clipPath id="svgimg8vclip"><rect x="16" y="38" width="560" height="116"/></clipPath><g clip-path="url(#svgimg8vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg8cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg8ct2"><rect x="61" y="29.4" width="116.7" height="15"/></clipPath><clipPath id="svgimg8cp3"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg8ct4"><rect x="61" y="44.4" width="254.4" height="13"/></clipPath><clipPath id="svgimg8ct5"><rect x="437.6" y="29" width="65.4" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg8cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg8svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg8svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Draft not published</text><g clip-path="url(#svgimg8cp3)"><g clip-path="url(#svgimg8ct4)"><text x="61" y="55.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(26,93,207)">Changes are saved but only visible to your team.</text></g></g><rect x="437.6" y="29" width="65.4" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="438.5" y="29.5" width="64" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.83" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Publish</text></g></g></g></g><text x="16" y="182" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Info with badge</text><g clip-path="url(#cp1)"><g clip-path="url(#irc10)"><clipPath id="svgimg11vclip"><rect x="16" y="192" width="560" height="116"/></clipPath><g clip-path="url(#svgimg11vclip)"><g transform="translate(16 192)"><defs><clipPath id="svgimg11cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg11ct2"><rect x="61" y="35.9" width="137.6" height="15"/></clipPath><clipPath id="svgimg11ct3"><rect x="206.6" y="33.4" width="20" height="20"/></clipPath><clipPath id="svgimg11ct4"><rect x="437.3" y="29" width="65.7" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(235,244,252)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#svgimg11cp0)"><g color="rgb(26, 93, 207)"><clipPath id="svgimg11svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg11svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(26, 93, 207)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(26,93,207)">Unanswered questions</text><rect x="206.6" y="33.4" width="20" height="20" rx="10" fill="rgb(26,93,207)"/><rect x="207.5" y="33.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="213.83" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(255,255,255)">1</text><rect x="437.3" y="29" width="65.7" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="437.5" y="29.5" width="65" height="28" rx="13.9" fill="none" stroke="rgb(26,93,207)" stroke-width="1"/><text x="449.47" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(26,93,207)">Answer</text></g></g></g></g><text x="16" y="336" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Success</text><g clip-path="url(#cp2)"><g clip-path="url(#irc13)"><clipPath id="svgimg14vclip"><rect x="16" y="346" width="560" height="116"/></clipPath><g clip-path="url(#svgimg14vclip)"><g transform="translate(16 346)"><defs><clipPath id="svgimg14cp0"><rect x="37" y="35" width="16" height="16"/></clipPath><clipPath id="svgimg14ct2"><rect x="61" y="29" width="132.1" height="15"/></clipPath><clipPath id="svgimg14cp3"><rect x="61" y="44" width="259.7" height="13"/></clipPath><clipPath id="svgimg14ct4"><rect x="61" y="44" width="259.7" height="13"/></clipPath></defs><rect x="28" y="20" width="484" height="46" rx="12" fill="rgb(227,247,232)"/><rect x="28.5" y="20.5" width="483" height="45" rx="11.5" fill="none" stroke="rgb(154,227,172)" stroke-width="1"/><g clip-path="url(#svgimg14cp0)"><g color="rgb(0, 121, 44)"><clipPath id="svgimg14svgic1"><rect x="37" y="35" width="16" height="16"/></clipPath><g clip-path="url(#svgimg14svgic1)"><g transform="translate(37 35)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="m16 9-5.5 5.5L8 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(0, 121, 44)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(0,121,44)">Deployment complete</text><g clip-path="url(#svgimg14cp3)"><g clip-path="url(#svgimg14ct4)"><text x="61" y="55" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(0,121,44)">production.example.com is serving the new build.</text></g></g></g></g></g></g><text x="16" y="490" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Warning</text><g clip-path="url(#cp3)"><g clip-path="url(#irc16)"><clipPath id="svgimg17vclip"><rect x="16" y="500" width="560" height="116"/></clipPath><g clip-path="url(#svgimg17vclip)"><g transform="translate(16 500)"><defs><clipPath id="svgimg17cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg17ct2"><rect x="61" y="29.4" width="166.1" height="15"/></clipPath><clipPath id="svgimg17cp3"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg17ct4"><rect x="61" y="44.4" width="261" height="13"/></clipPath><clipPath id="svgimg17ct5"><rect x="431.1" y="29" width="71.9" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(255,250,232)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(160,131,13)" stroke-width="1"/><g clip-path="url(#svgimg17cp0)"><g color="rgb(143, 94, 0)"><clipPath id="svgimg17svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg17svgic1)"><g transform="translate(37 35.39)scale(.66667)"><path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 9v4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 17z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(143,94,0)">Approaching your plan limit</text><g clip-path="url(#svgimg17cp3)"><g clip-path="url(#svgimg17ct4)"><text x="61" y="55.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(143,94,0)">You have used 92% of this month’s build minutes.</text></g></g><rect x="431.1" y="29" width="71.9" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="431.5" y="29.5" width="71" height="28" rx="13.9" fill="none" stroke="rgb(143,94,0)" stroke-width="1"/><text x="443.28" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(143,94,0)">Upgrade</text></g></g></g></g><text x="16" y="644" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Danger (alert)</text><g clip-path="url(#cp4)"><g clip-path="url(#irc19)"><clipPath id="svgimg20vclip"><rect x="16" y="654" width="560" height="116"/></clipPath><g clip-path="url(#svgimg20vclip)"><g transform="translate(16 654)"><defs><clipPath id="svgimg20cp0"><rect x="37" y="35" width="16" height="16.4"/></clipPath><clipPath id="svgimg20ct2"><rect x="61" y="29.4" width="67.5" height="15"/></clipPath><clipPath id="svgimg20cp3"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg20ct4"><rect x="61" y="44.4" width="158.6" height="13"/></clipPath><clipPath id="svgimg20ct5"><rect x="431.7" y="29" width="71.3" height="28.8"/></clipPath></defs><rect x="28" y="20" width="484" height="46.8" rx="12" fill="rgb(254,237,238)"/><rect x="28.5" y="20.5" width="483" height="46" rx="11.5" fill="none" stroke="rgb(249,173,175)" stroke-width="1"/><g clip-path="url(#svgimg20cp0)"><g color="rgb(194, 11, 32)"><clipPath id="svgimg20svgic1"><rect x="37" y="35.4" width="16" height="16"/></clipPath><g clip-path="url(#svgimg20svgic1)"><g transform="translate(37 35.39)scale(.66667)"><circle cx="12" cy="12" r="10" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12" y1="8" y2="12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><line x1="12" x2="12.01" y1="16" y2="16" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(194, 11, 32)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="41.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(194,11,32)">Build failed</text><g clip-path="url(#svgimg20cp3)"><g clip-path="url(#svgimg20ct4)"><text x="61" y="55.39" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(194,11,32)">Step “test” exited with code 1.</text></g></g><rect x="431.7" y="29" width="71.3" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="432.5" y="29.5" width="70" height="28" rx="13.9" fill="none" stroke="rgb(194,11,32)" stroke-width="1"/><text x="443.88" y="47.89" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(194,11,32)">View log</text></g></g></g></g><text x="16" y="798" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Strip (full-width band)</text><g clip-path="url(#cp5)"><g clip-path="url(#irc22)"><clipPath id="svgimg23vclip"><rect x="16" y="808" width="560" height="116"/></clipPath><g clip-path="url(#svgimg23vclip)"><g transform="translate(16 808)"><defs><clipPath id="svgimg23cp0"><rect x="37" y="36" width="16" height="16"/></clipPath><clipPath id="svgimg23ct2"><rect x="61" y="28" width="125" height="15"/></clipPath><clipPath id="svgimg23ct3"><rect x="61" y="47" width="230.7" height="13"/></clipPath><clipPath id="svgimg23ct4"><rect x="434.6" y="29.6" width="68.4" height="28.8"/></clipPath></defs><rect x="20" y="20" width="500" height="49" rx="0" fill="rgb(255,250,232)"/><polygon points="520,69 20,69 20,68 520,68" fill="rgb(160,131,13)"/><g clip-path="url(#svgimg23cp0)"><g color="rgb(143, 94, 0)"><clipPath id="svgimg23svgic1"><rect x="37" y="36" width="16" height="16"/></clipPath><g clip-path="url(#svgimg23svgic1)"><g transform="translate(37 36)scale(.66667)"><path d="m21.7 18-8-14a2 2 0 0 0-3.4 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 9v4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M12 17z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(143, 94, 0)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="61" y="40" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="12" font-weight="700" fill="rgb(143,94,0)">Notifications paused</text><text x="61" y="58" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" fill="rgb(143,94,0)">Desktop alerts resume when you reconnect.</text><rect x="434.6" y="29.6" width="68.4" height="28.8" rx="14.4" fill="rgba(255,255,255,0.52)"/><rect x="435.5" y="30.5" width="67" height="27" rx="13.5" fill="none" stroke="rgb(143,94,0)" stroke-width="1"/><text x="446.83" y="48.48" font-family="system-ui, &quot;-apple-system&quot;, sans-serif" font-size="11" font-weight="650" fill="rgb(143,94,0)">Resume</text></g></g></g></g></svg>
@@ -137,4 +137,4 @@ regenerate both themes and library sheets when that geometry changes. The browse
137
137
  pane/sidebar geometry checks cover the resulting 43px icon-label offset from the
138
138
  section edge (17px content inset + 18px icon + 8px gap).
139
139
 
140
- For a focused update, pass component names: `npm run design-templates:build -- toolbar`. Omit them to capture all components. Toolbar width variants use the real `wireToolbarVisibility` helper after rendering typed props.
140
+ For a focused update, pass component names: `npm run design-templates:build -- toolbar`. Omit them to capture all components. Toolbar width variants use the real `wireToolbarVisibility` helper after rendering typed props. The `ListActionRow` "Trailing overflow menu" variant renders a real `trailingMenu` `PopupMenu`. Its trigger is a native button inside Web Awesome's shadow root, and domotion cannot read that button's author styles. A registered trigger would therefore be captured as a raster image, which also stops the library sheet from flattening. The capture instead leaves the PopupMenu unregistered. The template-only `staticPopupMenuTriggerCss` gives the trigger host the geometry `popup-menu.css` gives its `::part(base)` in a row: a 44px-wide box, as tall as the row, with the 16px icon centered. It also hides the closed menu's items. The icon lands at the same position as in a registered capture.
@@ -22,6 +22,22 @@ Native table cells (`th`, `td`) and form controls (`button`, `input`, `select`,
22
22
  zero-specificity selectors. Table headers keep their native bold weight and
23
23
  alignment, and application styles can override the baseline.
24
24
 
25
+ Native controls also get semantic cursors, again at zero specificity so a
26
+ component's or application's own cursor wins:
27
+
28
+ - `pointer` on enabled `button`, `a[href]`, `[role="button"]` (unless
29
+ `aria-disabled="true"`), `summary`, `select`, checkbox / radio / color /
30
+ file / button / reset / submit inputs, and a `label` wrapping an enabled
31
+ checkbox or radio;
32
+ - `not-allowed` on disabled `button`, `input`, `select`, and `textarea`, on
33
+ `[role="button"][aria-disabled="true"]`, and on a disabled `wa-button`'s
34
+ `base` part (Web Awesome leaves a pointer there);
35
+ - `text` on enabled `textarea` and text-like inputs (`text`, `search`,
36
+ `email`, `url`, `tel`, `password`, `number`, and untyped).
37
+
38
+ Applications no longer need their own global cursor policy for native
39
+ controls.
40
+
25
41
  `html`, `body`, and `.kui-app-root` form a definite `height: 100%` chain. Add
26
42
  `.kui-app-root` to the one direct mount container of a full-height application
27
43
  whose child is a `Workbench`, `SplitView`, `NavStack`, or another percentage-
@@ -32,6 +48,41 @@ The class sets `height: 100%`, not a viewport minimum; the direct child shell
32
48
  must also fill its parent (for example with its `fill` prop). If the host page
33
49
  already supplies a definite height, use that host geometry instead.
34
50
 
51
+ ### Viewport-locked application shell
52
+
53
+ A shell that fills the whole window (a `Workbench` app such as Hot Sheet) can
54
+ also lock the document to the viewport:
55
+
56
+ ```html
57
+ <body>
58
+ <div id="app" class="kui-app-root" data-viewport="locked"></div>
59
+ </body>
60
+ ```
61
+
62
+ With `data-viewport="locked"` on a `.kui-app-root` that is a direct child of
63
+ `body`, `html`, `body`, and the root take `height: 100dvh` and
64
+ `overflow: clip`:
65
+
66
+ - The **dynamic** viewport height tracks the visible area as mobile browser
67
+ toolbars show and hide (iOS Safari, WKWebView), so the root is never taller
68
+ than what the person can see.
69
+ - `overflow: clip` (rather than `hidden`) leaves the document with no scroll
70
+ container at all. Neither the person, nor `scrollIntoView()`, nor focus can
71
+ leave the page scrolled: only the shell's `Pane`s scroll.
72
+
73
+ **On-screen keyboard.** `100dvh` does not shrink for the on-screen keyboard.
74
+ When a field near the bottom takes focus, iOS pans the _visual_ viewport to
75
+ reveal it and pans back when the keyboard closes; because the document itself
76
+ cannot scroll, there is no leftover document offset to restore. A field
77
+ inside a scrolling `Pane` is revealed by that Pane's own scroll. If the
78
+ layout should instead shrink above the keyboard, add
79
+ `interactive-widget=resizes-content` to the viewport meta tag on engines
80
+ that support it. Do not add scroll-restoration handlers for the document:
81
+ the locked document has no scroll position.
82
+
83
+ Leave the attribute off for document-flow pages and embedded shells; the
84
+ default `height: 100%` chain keeps those scrolling normally.
85
+
35
86
  `kui-app-root` is the public class of the component catalog's
36
87
  `document-baseline` entry, so `kerf-ui-doctor` and the
37
88
  `kerfjs/ui-public-boundaries` ESLint rule accept it (no KUI-L101 finding).
package/docs/layout.md CHANGED
@@ -473,6 +473,17 @@ width. On `normal` or `anywhere`, set a positive integer `maxLines` to clamp
473
473
  wrapped text with an ellipsis. Omit `maxLines` for unlimited lines. The cap is
474
474
  incompatible with `nowrap` and `truncate`.
475
475
 
476
+ With `wrap="truncate"`, `truncate` chooses where the ellipsis goes: `end`
477
+ (default) keeps the start; `start` keeps the tail, for a branch name or the
478
+ end of an identifier; and `middle` keeps the start and a suffix, for a file
479
+ path. `truncateKeep` sets that suffix: `segment` (default) keeps the last path
480
+ segment with its `/` or `\` separator (the last 10 characters when there is
481
+ none), or a number keeps that many trailing characters. `middle` needs string
482
+ or number children so it can split them. Both positions are for left-to-right
483
+ identifiers and paths, keep the whole value in the DOM in order for assistive
484
+ technology, and show it as the element's `title` unless you pass your own.
485
+ Never hand-roll these with `direction: rtl` or split spans in app CSS.
486
+
476
487
  ```tsx
477
488
  import { Text } from "@kerfjs/ui/text";
478
489
 
@@ -486,6 +497,8 @@ import { Text } from "@kerfjs/ui/text";
486
497
  <Text tone="danger" font="monospace">ERR_INVALID_ID</Text>;
487
498
  <Text wrap="anywhere">A-very-long-unbroken-identifier</Text>;
488
499
  <Text wrap="truncate" variant="span">Long vendor name</Text>;
500
+ <Text wrap="truncate" truncate="middle" font="monospace">{path}</Text>;
501
+ <Text wrap="truncate" truncate="start" variant="span">{branchName}</Text>;
489
502
  <Text wrap="normal" maxLines={2}>A long summary capped at two lines.</Text>;
490
503
  ```
491
504
 
@@ -572,6 +585,17 @@ semantics.
572
585
  Use application-owned CSS grid for intrinsic, asymmetric, spanning, or masonry
573
586
  tracks, and use `ResizableRegion` when people must adjust a boundary.
574
587
 
588
+ ## Column tracks
589
+
590
+ A board of parallel columns (kanban lanes) is a `ColumnTrack`: one horizontal
591
+ scroll owner that fills its parent's height, with columns that sit flush and
592
+ own their insets and vertical scrolling. By default columns share the width
593
+ equally but never narrow below `minColumnWidth` (250px), so a narrow board
594
+ scrolls sideways instead of crushing them. `layout="paged"` gives each column
595
+ nearly the visible width, lets the next one `peek` in (24px), snaps to column
596
+ starts, hides the scrollbar, and scrolls smoothly unless reduced motion is
597
+ preferred. Choose the layout per device class in the app.
598
+
575
599
  ## Row and List alignment
576
600
 
577
601
  Use `Row` for a horizontal flex layout and `List` for a vertical one. `Row`
@@ -610,10 +634,37 @@ frame), pass `fill` instead: the root takes the parent's full height
610
634
  (`height: 100%`), so its `flex` children can grow into it. Use `fill` only on
611
635
  that sole layout root; a sibling inside a flex layout keeps using `flex`.
612
636
 
637
+ A `scrollable` List owns its overflow: its rows keep their natural height and
638
+ scroll rather than shrink. To bound one by an ancestor's `max-height` instead
639
+ of a definite height, make that ancestor a flex column and pass `flex` (not
640
+ `fill`): `<List flex scrollable>` takes at most the remaining height and
641
+ scrolls the rest, with no app-owned scrolling wrapper.
642
+
643
+ A scrollable List is also a keyboard-focusable scroller: Chromium gives it a
644
+ Tab stop when it holds no focusable rows, and a dialog may focus it first.
645
+ When it has focus it draws the theme focus ring inset by the ring width and
646
+ rounded with `--kui-radius-m`, so a rounded or `overflow: hidden` parent
647
+ never clips it. Do not style `.kui-list` focus yourself.
648
+
649
+ For long reading content, such as a reader view, pass `inset="document"`: 24px
650
+ block and 32px inline on all four sides, narrowing to 16px inline below 576px.
651
+ It replaces any `textInsets`/`controlInsets` on that List.
652
+
653
+ A List is transparent by default. Pass `surface="base"` (the page surface) or
654
+ `surface="raised"` to paint a solid background behind the stack and its
655
+ insets — for example a banner strip above a sunken work area, which otherwise
656
+ shows the lowered tint around the banner. Give that strip `controlInsets="tb"`
657
+ so the banner's own inline margin, not a second List inset, sets its edges. A
658
+ lowered region is a `SunkenPanel`, not a List surface.
659
+
613
660
  Put route, test, or recipe metadata on the same root with `rootAttributes`,
614
661
  which accepts safe `data-*` pairs and keeps each component's structural
615
662
  attributes (`data-component`, `data-flex`, `data-fill`, alignment, inset, and
616
- column markers) protected:
663
+ column markers) protected. A `List` or `Row` root also takes `aria-*`
664
+ attributes and a structural `role` (`region`, `group`, `list`, `status`, a
665
+ landmark, …), so a labeled drop-target region or an `aria-busy` stack needs no
666
+ wrapper; widget roles are dropped, and a multi-select `List` keeps its own
667
+ grid role and name:
617
668
 
618
669
  ```tsx
619
670
  <Row gap="none" fill rootAttributes={{ "data-recipe": "sidebar" }}>
@@ -55,14 +55,32 @@ const selected = signal<string | null>(null);
55
55
 
56
56
  - **Roomy** (`compact: false`): both panes show. With `resizable`, the list sits
57
57
  in a `ResizableRegion` (wire it with `wireResizableRegions`); without it the
58
- list takes a fixed `--kui-split-view-list-width` (default 320px) and the detail
59
- fills the rest.
58
+ list takes a fixed width and the detail fills the rest. Set it with
59
+ `listWidth`: a number of CSS pixels (default 320), or `{ size, maxFraction }`
60
+ to cap the preferred size at that share of the SplitView's own width, so a
61
+ narrow container (a dialog, a small window) always leaves the detail in view —
62
+ `listWidth={{ size: 432, maxFraction: 0.5 }}` is 432px until the split is
63
+ narrower than 864px, then half of it. `listWidth` is for the fixed split; a
64
+ resizable list is sized by `resizable` (combining them throws). The
65
+ `--kui-split-view-list-width` token remains for theme-level defaults; the
66
+ prop wins over it.
60
67
  - **Compact** (`compact: true`): the split collapses to a `NavStack`. The list is
61
68
  the root; when `detailActive` is true the detail is pushed over it with an
62
69
  automatic back control (wire it with `wireNavStack`, whose `onBack` clears the
63
70
  app's selection). This is the portrait-tablet / handset presentation; as a
64
71
  dialog the compact form is a full-screen or large partial-cover modal.
65
72
 
73
+ ## Filling its container
74
+
75
+ A SplitView fills its container's block size: give the container a definite
76
+ height (a fixed or viewport-bounded `height`, a flex item that grows, a grid
77
+ row) and the split stretches to it, with each `Pane` owning its own scrolling.
78
+ That holds in a block box, a fixed-size native popover or dialog, a flex column
79
+ below a header, and a grid; no app-side `display: grid` /
80
+ `grid-template-rows: minmax(0, 1fr)` wrapper is needed. A container sized only
81
+ by `max-height` has no height to fill, so the split takes its content height;
82
+ give such a container a `height` instead.
83
+
66
84
  ## Configuring the list region and the compact stack
67
85
 
68
86
  `resizable` forwards the list's `ResizableRegion` configuration alongside
@@ -88,6 +88,19 @@ See [Contextual transparency](./webawesome-theme.md#contextual-transparency).
88
88
  Keep ordinary composition on these defaults; public properties are theming
89
89
  escape hatches, not a reason to restyle each demo or nesting level.
90
90
 
91
+ Every sunken surface — SunkenPanel, `Pane appearance="sunken"`, sunken
92
+ Workbench regions and TabNavigator scenes, and Web Awesome
93
+ `appearance="sunken"` — paints `--kui-sunken-surface`: a fine, monochrome
94
+ grain (a seeded 100px tile at 4% maximum opacity) over the lowered color. The
95
+ tile is drawn once per page, at runtime, by the first sunken surface that
96
+ renders (nothing ships as an asset; server rendering paints the flat color
97
+ until the browser renders one). Translucent children such as a `ValueTable`
98
+ let the grain show through rather than adding their own. Set
99
+ `--kui-sunken-texture: none` at `:root` for a flat lowered surface, or to
100
+ another image; call `ensureSunkenTexture()` (exported from
101
+ `@kerfjs/ui/sunken-panel`) on a page whose only sunken surfaces are Web Awesome
102
+ elements.
103
+
91
104
  The public root class is `.kui-sunken-panel`. Prefer the properties above over
92
105
  styling descendants. The `square` shape deliberately overrides the radius
93
106
  property with zero; use `rounded` when customizing the radius token.
@@ -19,6 +19,24 @@ respectively, before the viewport width cap. Set `preferredWidth` to a branded
19
19
  desktop preferences can share the same responsive dialog without changing its
20
20
  resource tracks or preview aspect sizing.
21
21
 
22
+ ### Sibling dialogs keep their identity
23
+
24
+ Every `DialogSurface` root has the same structure, so two sibling dialogs that
25
+ are rendered conditionally are matched by position when the page re-renders:
26
+ one open dialog's element (with its accessible name and open state) can be
27
+ reused for another, and Web Awesome events such as `wa-after-hide` fire on the
28
+ wrong dialog or not at all. Give each sibling a stable key on its root with
29
+ `rootAttributes`, instead of wrapping it in an app `div`:
30
+
31
+ ```tsx
32
+ <DialogSurface rootAttributes={{ "data-key": "project-setup" }}>
33
+ <wa-dialog label="Set up project">…</wa-dialog>
34
+ </DialogSurface>
35
+ ```
36
+
37
+ `rootAttributes` takes `data-*` identity only; the surface's own configuration
38
+ attributes (`data-size`, `data-presentation`, …) stay protected.
39
+
22
40
  ### Modal viewport bounds
23
41
 
24
42
  `viewportGutter` accepts a branded `CssLength` from `@kerfjs/ui/css-values`.
@@ -56,6 +74,24 @@ An application can configure device-class breakpoints when its phone policy
56
74
  differs from the default. Prefer a typed cap such as `maxHeight={remify(640)}`
57
75
  when the modal should stop growing before the viewport bound.
58
76
 
77
+ ### Filling the dialog
78
+
79
+ `maxHeight` caps a modal that sizes to its content. A layout that fills the
80
+ dialog (a list-detail `SplitView`, a `Pane` with its own chrome and scroller)
81
+ needs a height to fill instead: set `height` to a branded length or
82
+ `"viewport"`. It is bounded exactly like `maxHeight` (the dynamic viewport minus
83
+ both gutters) and takes precedence over it. `bodyLayout="fill"` then gives the
84
+ body's whole height to its one child, which owns its own scrolling; the body
85
+ itself stops scrolling. Combine it with `bodyInset="none"`.
86
+
87
+ ```tsx
88
+ <DialogSurface size="large" height={remify(640)} viewportGutter={remify(8)} bodyInset="none" bodyLayout="fill">
89
+ <wa-dialog label="Repository status">
90
+ <SplitView id="repo-split" label="Changes" listWidth={{ size: 432, maxFraction: 0.5 }} list={list} detail={detail} />
91
+ </wa-dialog>
92
+ </DialogSurface>;
93
+ ```
94
+
59
95
  Treat a dialog body as a `List` by default. When its rows or sections own their
60
96
  standard list geometry, set `bodyInset="none"` so the dialog does not add a
61
97
  second inset. Bare prose is still a list child: wrap it in `ListInsetText` so its
@@ -64,6 +100,35 @@ padding and aligns with bordered siblings. Reserve `compact` or `comfortable`
64
100
  body insets for exceptional content that does not already have list/content-item
65
101
  geometry.
66
102
 
103
+ ## Non-modal dialogs: `PopoverDialogSurface`
104
+
105
+ `wa-dialog` is modal: it makes the page inert until it closes. When a dialog
106
+ should leave the page interactive and close on Escape or a press outside (a
107
+ status panel, a quick inspector), render `PopoverDialogSurface` instead of a
108
+ hand-built popover with application chrome CSS. It is a native
109
+ `popover="auto"` section with `role="dialog"` that owns Kerf's dialog chrome
110
+ (raised surface, border, large radius and shadow, and a backdrop) and the
111
+ same geometry props as a modal `DialogSurface`: `size`, `preferredWidth`,
112
+ `viewportGutter` (16px by default), `height` / `maxHeight`, and `bodyLayout`.
113
+ Name it with `label` or `labelledBy`.
114
+
115
+ Open it with a control's `popoverTarget` (or `showPopover()`); the browser
116
+ places it centered in the top layer, light-dismisses it, and restores nothing
117
+ else, so move focus into it with `autofocus` on its first control when that
118
+ matters. A closed surface stays hidden; only the open one lays out.
119
+ `presentation="embedded"` renders the same surface in flow, with no top
120
+ layer and never wider than its container, for a catalog specimen or an inline
121
+ preview.
122
+
123
+ ```tsx
124
+ <button type="button" popoverTarget="repository-status">Repository status</button>
125
+ <PopoverDialogSurface id="repository-status" label="Repository status" preferredWidth={remify(1024)} height={remify(640)} viewportGutter={remify(8)} bodyLayout="fill">
126
+ <SplitView id="repo-split" label="Changes" list={list} detail={detail} />
127
+ </PopoverDialogSurface>;
128
+ ```
129
+
130
+ Use `DialogSurface` with `wa-dialog` whenever the task must block the page.
131
+
67
132
  Wrap one `PopupMenu` (or another single `wa-dropdown`) with `PopupSurface`. `inset="list-zero"` removes menu
68
133
  padding for a child that already owns row insets, `compact` uses 4px, and
69
134
  `standard` uses the shared 8px surface inset. Keep the dropdown trigger named and
@@ -71,4 +136,4 @@ preserve `data-morph-skip-children` when its upgraded light-DOM items must retai
71
136
  identity across Kerf rerenders. Import `@kerfjs/ui/popup-menu/register` once for
72
137
  the focus handoff fix when wrapping a raw `wa-dropdown`.
73
138
 
74
- 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.
139
+ 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.
package/docs/ux-demo.md CHANGED
@@ -21,6 +21,7 @@ Each `?component=recipe-*` route uses public package primitives, real wiring,
21
21
  deterministic state, and semantic layout owners from the [recipe guide](./recipes.md).
22
22
 
23
23
  - It imports public component subpaths, exercising their browser-selected reachable CSS rather than a catalog-only style path.
24
+ - The `ListActionRow` route's Run tests row composes a trailing `PopupMenu` (`trailingMenu`) with Edit and Delete commands, revealed on interaction, that also opens at the pointer when the row's primary button is right-clicked.
24
25
  - The `ListActionRow` route demonstrates sibling primary/trailing native controls, independent disabled states, controlled selection, first-line leading-icon alignment for wrapped labels, and an application-owned native popover relationship without nesting controls. The `ListItem` route demonstrates the same multiline leading-icon anchor alongside its single-control navigation contract.
25
26
  - The `PopupMenu` route's context example opens one app-owned menu either at the row's right-click point or below its adjacent, keyboard-operable Demand actions button. The Nested decisions example shows the automatic phone-width submenu placement above or below its parent list, with native ArrowLeft return, Escape dismissal, and child selection.
26
27
  - The `AppTab` and `TabBar` routes are focused component specimens: AppTab shows its selected, compact, segmented, icon-only, truncation, placeholder, pending, metadata, and close-icon axes inside the required tablist context; TabBar shows its rail, segmented, inspector, allocation, placement, and accessory-zone axes, including an adjacent action plus a separately pinned end action whose tabs overflow at narrow widths, without application readouts. The pinned leading-tab specimen uses native strip scrolling so momentum and the final tab's end position remain natural; `snapTabs` stays an opt-in for applications that want whole-tab settling. The separate `Application tabs` composition route demonstrates controlled selection, matching panel content, overflow, adding (a new tab opens `pending` with a spinner and stays selectable while its panel shows a `Skeleton` heading until a simulated load completes), closing, keyboard/pointer reordering, and application-owned ordering. The `ResizableRegion` route likewise replaces only the decorative handle glyph while retaining separator semantics and shared wiring.
@@ -131,8 +131,12 @@ tiers:
131
131
  trigger and the 8px surface inset on the body, while framed Accordion items
132
132
  use the 16px container inset for both regions.
133
133
  - `appearance="sunken"` is a Kerf theme extension for Accordion, Card, and
134
- Details. It removes raised chrome, paints the lowered semantic surface, and
135
- uses the shared rounded-rectangle radius. Override
134
+ Details. It removes raised chrome, paints the shared sunken surface
135
+ (`--kui-sunken-surface`: the lowered semantic color with the same fine grain
136
+ texture as every Kerf sunken surface), and uses the shared rounded-rectangle
137
+ radius. The texture is generated by the first Kerf sunken component that
138
+ renders; a page with only Web Awesome sunken surfaces calls
139
+ `ensureSunkenTexture()` once. Override
136
140
  `--kui-wa-sunken-background` or `--kui-wa-sunken-radius` on an instance or
137
141
  containing scope when that surface needs different tokens.
138
142
  - `--kui-wa-container-inset` defaults to the 16px homogeneous-group step. Tab