@kerfjs/ui 5.0.0-beta.4 → 5.0.0-beta.40

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 (498) hide show
  1. package/README.md +342 -108
  2. package/ai/application-ui-diagnostic-ids-v1.json +100 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +41 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +25 -0
  10. package/ai/catalog-authoring.schema.json +61 -0
  11. package/ai/compile-time-contracts-v1.json +132 -0
  12. package/ai/compile-time-contracts-v1.schema.json +51 -0
  13. package/ai/component-catalog-extension-v2.d.ts +7 -0
  14. package/ai/component-catalog-extension-v2.schema.json +7 -0
  15. package/ai/component-catalog-extension.schema.json +79 -0
  16. package/ai/component-catalog-v2-overrides.json +496 -0
  17. package/ai/component-catalog-v2.d.ts +90 -0
  18. package/ai/component-catalog-v2.json +5678 -0
  19. package/ai/component-catalog-v2.schema.json +298 -0
  20. package/ai/component-catalog.json +2694 -417
  21. package/ai/component-catalog.schema.json +39 -0
  22. package/ai/public-api-signatures-v1.md +1591 -126
  23. package/ai/skill.md +140 -54
  24. package/ai/webawesome-jsx-signatures-v1.md +2 -1
  25. package/analyzer/cli.mjs +49 -0
  26. package/analyzer/index.d.mts +46 -0
  27. package/analyzer/index.mjs +1086 -0
  28. package/analyzer/report.schema.json +66 -0
  29. package/dist/app-tab.d.ts +15 -4
  30. package/dist/app-tab.js +3 -1
  31. package/dist/browser/app-tab.js +1 -0
  32. package/dist/browser/floating-toolbar.js +3 -0
  33. package/dist/browser/list-action-row.js +5 -0
  34. package/dist/browser/list-header.js +7 -0
  35. package/dist/browser/list-inset-control.js +3 -0
  36. package/dist/browser/list-inset-text.js +3 -0
  37. package/dist/browser/list-item.js +5 -0
  38. package/dist/browser/list.js +3 -0
  39. package/dist/browser/pane.js +3 -0
  40. package/dist/browser/row.js +3 -0
  41. package/dist/browser/segmented-control.js +1 -0
  42. package/dist/browser/select.js +1 -0
  43. package/dist/browser/skeleton.js +3 -0
  44. package/dist/browser/spacer.js +3 -0
  45. package/dist/browser/state-banner.js +1 -0
  46. package/dist/browser/sunken-panel.js +3 -0
  47. package/dist/browser/surface-scaffold.js +3 -0
  48. package/dist/browser/text.js +3 -0
  49. package/dist/browser/toolbar-text.js +1 -0
  50. package/dist/browser/value-table.js +1 -0
  51. package/dist/catalog-resources.d.ts +35 -0
  52. package/dist/catalog-resources.js +22 -0
  53. package/dist/catalog-resources.js.map +1 -0
  54. package/dist/catalog.d.ts +151 -0
  55. package/dist/catalog.js +396 -0
  56. package/dist/catalog.js.map +1 -0
  57. package/dist/chunk-2TYUFZUC.js +22 -0
  58. package/dist/chunk-2TYUFZUC.js.map +1 -0
  59. package/dist/chunk-6NDBE2OK.js +32 -0
  60. package/dist/chunk-6NDBE2OK.js.map +1 -0
  61. package/dist/chunk-6WTETUZ6.js +21 -0
  62. package/dist/chunk-6WTETUZ6.js.map +1 -0
  63. package/dist/chunk-AQFWBG23.js +83 -0
  64. package/dist/chunk-AQFWBG23.js.map +1 -0
  65. package/dist/chunk-B6JYRX3P.js +51 -0
  66. package/dist/chunk-B6JYRX3P.js.map +1 -0
  67. package/dist/chunk-C34NZOLJ.js +53 -0
  68. package/dist/chunk-C34NZOLJ.js.map +1 -0
  69. package/dist/chunk-CAB6NQ2T.js +102 -0
  70. package/dist/chunk-CAB6NQ2T.js.map +1 -0
  71. package/dist/chunk-CK6P5AUK.js +136 -0
  72. package/dist/chunk-CK6P5AUK.js.map +1 -0
  73. package/dist/chunk-DAO2VFTT.js +129 -0
  74. package/dist/chunk-DAO2VFTT.js.map +1 -0
  75. package/dist/chunk-DEYOGDE7.js +141 -0
  76. package/dist/chunk-DEYOGDE7.js.map +1 -0
  77. package/dist/chunk-DYBPI5O2.js +25 -0
  78. package/dist/chunk-DYBPI5O2.js.map +1 -0
  79. package/dist/{chunk-TRNBHPNW.js → chunk-E34TE2ZI.js} +12 -8
  80. package/dist/chunk-E34TE2ZI.js.map +1 -0
  81. package/dist/chunk-EYALJQQD.js +25 -0
  82. package/dist/chunk-EYALJQQD.js.map +1 -0
  83. package/dist/chunk-I45QO2IZ.js +88 -0
  84. package/dist/chunk-I45QO2IZ.js.map +1 -0
  85. package/dist/chunk-I4V3UDSA.js +79 -0
  86. package/dist/chunk-I4V3UDSA.js.map +1 -0
  87. package/dist/chunk-OGTJNHRG.js +42 -0
  88. package/dist/chunk-OGTJNHRG.js.map +1 -0
  89. package/dist/chunk-OL4TC3U2.js +156 -0
  90. package/dist/chunk-OL4TC3U2.js.map +1 -0
  91. package/dist/chunk-OMSRSL3B.js +120 -0
  92. package/dist/chunk-OMSRSL3B.js.map +1 -0
  93. package/dist/chunk-R3EBGEAW.js +46 -0
  94. package/dist/chunk-R3EBGEAW.js.map +1 -0
  95. package/dist/chunk-SOK5EUF7.js +25 -0
  96. package/dist/chunk-SOK5EUF7.js.map +1 -0
  97. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  98. package/dist/chunk-SRSJO5QE.js.map +1 -0
  99. package/dist/chunk-T7DOWS6T.js +61 -0
  100. package/dist/chunk-T7DOWS6T.js.map +1 -0
  101. package/dist/chunk-TIGSG6BX.js +218 -0
  102. package/dist/chunk-TIGSG6BX.js.map +1 -0
  103. package/dist/chunk-UDHHKZWO.js +41 -0
  104. package/dist/chunk-UDHHKZWO.js.map +1 -0
  105. package/dist/{chunk-MQIZAD4A.js → chunk-UKKSMZYT.js} +76 -22
  106. package/dist/chunk-UKKSMZYT.js.map +1 -0
  107. package/dist/chunk-V6GQKOX2.js +39 -0
  108. package/dist/chunk-V6GQKOX2.js.map +1 -0
  109. package/dist/chunk-V6HCTCVD.js +46 -0
  110. package/dist/chunk-V6HCTCVD.js.map +1 -0
  111. package/dist/chunk-VDUJZF5G.js +515 -0
  112. package/dist/chunk-VDUJZF5G.js.map +1 -0
  113. package/dist/chunk-VXFGMDA7.js +31 -0
  114. package/dist/chunk-VXFGMDA7.js.map +1 -0
  115. package/dist/chunk-WN52USHV.js +115 -0
  116. package/dist/chunk-WN52USHV.js.map +1 -0
  117. package/dist/chunk-WSXUPSID.js +43 -0
  118. package/dist/chunk-WSXUPSID.js.map +1 -0
  119. package/dist/chunk-X5GRDQ7V.js +50 -0
  120. package/dist/chunk-X5GRDQ7V.js.map +1 -0
  121. package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
  122. package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
  123. package/dist/chunk-ZASJJMGV.js +17 -0
  124. package/dist/chunk-ZASJJMGV.js.map +1 -0
  125. package/dist/chunk-ZPWZIVI6.js +47 -0
  126. package/dist/chunk-ZPWZIVI6.js.map +1 -0
  127. package/dist/collapsible-panel.d.ts +77 -0
  128. package/dist/collapsible-panel.js +84 -0
  129. package/dist/collapsible-panel.js.map +1 -0
  130. package/dist/css-values.d.ts +75 -0
  131. package/dist/css-values.js +3 -0
  132. package/dist/css-values.js.map +1 -0
  133. package/dist/device-class.d.ts +62 -0
  134. package/dist/device-class.js +103 -0
  135. package/dist/device-class.js.map +1 -0
  136. package/dist/disclosure-arrow.js +1 -1
  137. package/dist/divider-sides-BzB6rphT.d.ts +6 -0
  138. package/dist/empty-state.d.ts +3 -2
  139. package/dist/empty-state.js +1 -1
  140. package/dist/flex-alignment-CF8NLj7i.d.ts +4 -0
  141. package/dist/floating-toolbar.d.ts +29 -0
  142. package/dist/floating-toolbar.js +3 -0
  143. package/dist/floating-toolbar.js.map +1 -0
  144. package/dist/index.d.ts +28 -14
  145. package/dist/index.js +34 -23
  146. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +19 -8
  147. package/dist/list-action-row.js +7 -0
  148. package/dist/list-action-row.js.map +1 -0
  149. package/dist/list-header.d.ts +80 -0
  150. package/dist/list-header.js +9 -0
  151. package/dist/list-header.js.map +1 -0
  152. package/dist/list-inset-control.d.ts +20 -0
  153. package/dist/list-inset-control.js +3 -0
  154. package/dist/list-inset-control.js.map +1 -0
  155. package/dist/list-inset-text.d.ts +29 -0
  156. package/dist/list-inset-text.js +3 -0
  157. package/dist/list-inset-text.js.map +1 -0
  158. package/dist/list-item.d.ts +45 -0
  159. package/dist/list-item.js +7 -0
  160. package/dist/list-item.js.map +1 -0
  161. package/dist/list.d.ts +30 -0
  162. package/dist/list.js +5 -0
  163. package/dist/list.js.map +1 -0
  164. package/dist/loading-spinner.js +1 -1
  165. package/dist/nav-stack.d.ts +41 -0
  166. package/dist/nav-stack.js +6 -0
  167. package/dist/nav-stack.js.map +1 -0
  168. package/dist/pane.d.ts +50 -0
  169. package/dist/pane.js +4 -0
  170. package/dist/pane.js.map +1 -0
  171. package/dist/resizable-region.d.ts +21 -3
  172. package/dist/resizable-region.js +1 -1
  173. package/dist/row.d.ts +28 -0
  174. package/dist/row.js +5 -0
  175. package/dist/row.js.map +1 -0
  176. package/dist/segmented-control.d.ts +11 -8
  177. package/dist/segmented-control.js +3 -1
  178. package/dist/select-register.d.ts +5 -1
  179. package/dist/select-register.js +129 -1
  180. package/dist/select-register.js.map +1 -1
  181. package/dist/select.d.ts +34 -8
  182. package/dist/select.js +3 -1
  183. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  184. package/dist/skeleton.d.ts +25 -0
  185. package/dist/skeleton.js +4 -0
  186. package/dist/skeleton.js.map +1 -0
  187. package/dist/spacer.d.ts +16 -0
  188. package/dist/spacer.js +4 -0
  189. package/dist/spacer.js.map +1 -0
  190. package/dist/split-view.d.ts +43 -0
  191. package/dist/split-view.js +82 -0
  192. package/dist/split-view.js.map +1 -0
  193. package/dist/state-banner.d.ts +11 -5
  194. package/dist/state-banner.js +3 -1
  195. package/dist/styles/app-tab.css +26 -0
  196. package/dist/styles/catalog.css +582 -0
  197. package/dist/styles/collapsible-panel.css +212 -0
  198. package/dist/styles/floating-toolbar.css +38 -0
  199. package/dist/styles/foundation.css +80 -0
  200. package/dist/styles/layout.css +2 -20
  201. package/dist/styles/list-action-row.css +224 -0
  202. package/dist/styles/list-header.css +224 -0
  203. package/dist/styles/list-inset-control.css +23 -0
  204. package/dist/styles/list-inset-text.css +30 -0
  205. package/dist/styles/list-item.css +171 -0
  206. package/dist/styles/list.css +118 -0
  207. package/dist/styles/nav-stack.css +141 -0
  208. package/dist/styles/pane.css +62 -0
  209. package/dist/styles/resizable-region.css +158 -0
  210. package/dist/styles/row.css +92 -0
  211. package/dist/styles/segmented-control.css +10 -7
  212. package/dist/styles/select.css +115 -2
  213. package/dist/styles/skeleton.css +31 -0
  214. package/dist/styles/spacer.css +11 -0
  215. package/dist/styles/split-view.css +35 -0
  216. package/dist/styles/state-banner.css +49 -10
  217. package/dist/styles/styles.css +10 -5
  218. package/dist/styles/sunken-panel.css +22 -0
  219. package/dist/styles/surface-scaffold.css +51 -0
  220. package/dist/styles/tab-bar.css +24 -0
  221. package/dist/styles/tab-scaffold.css +85 -0
  222. package/dist/styles/text.css +5 -0
  223. package/dist/styles/token-search-field.css +14 -2
  224. package/dist/styles/toolbar-control-group.css +235 -8
  225. package/dist/styles/toolbar-text.css +65 -2
  226. package/dist/styles/toolbar.css +47 -2
  227. package/dist/styles/webawesome.css +171 -0
  228. package/dist/styles/workbench.css +187 -0
  229. package/dist/sunken-panel.d.ts +20 -0
  230. package/dist/sunken-panel.js +3 -0
  231. package/dist/sunken-panel.js.map +1 -0
  232. package/dist/surface-scaffold.d.ts +26 -0
  233. package/dist/surface-scaffold.js +3 -0
  234. package/dist/surface-scaffold.js.map +1 -0
  235. package/dist/tab-bar.d.ts +24 -6
  236. package/dist/tab-bar.js +1 -1
  237. package/dist/tab-scaffold.d.ts +31 -0
  238. package/dist/tab-scaffold.js +51 -0
  239. package/dist/tab-scaffold.js.map +1 -0
  240. package/dist/text.d.ts +20 -0
  241. package/dist/text.js +3 -0
  242. package/dist/text.js.map +1 -0
  243. package/dist/token-search-field.d.ts +30 -13
  244. package/dist/token-search-field.js +1 -1
  245. package/dist/toolbar-control-group.d.ts +33 -7
  246. package/dist/toolbar-control-group.js +1 -1
  247. package/dist/toolbar-text.d.ts +31 -4
  248. package/dist/toolbar-text.js +3 -1
  249. package/dist/toolbar.d.ts +10 -7
  250. package/dist/toolbar.js +1 -1
  251. package/dist/value-table.d.ts +7 -3
  252. package/dist/value-table.js +3 -1
  253. package/dist/webawesome.d.ts +1 -0
  254. package/dist/wire-catalog.d.ts +57 -0
  255. package/dist/wire-catalog.js +302 -0
  256. package/dist/wire-catalog.js.map +1 -0
  257. package/dist/wire-nav-stack.d.ts +18 -0
  258. package/dist/wire-nav-stack.js +228 -0
  259. package/dist/wire-nav-stack.js.map +1 -0
  260. package/dist/wire-resizable-regions.d.ts +1 -1
  261. package/dist/wire-resizable-regions.js +1 -1
  262. package/dist/wire-sidebar.d.ts +48 -0
  263. package/dist/wire-sidebar.js +147 -0
  264. package/dist/wire-sidebar.js.map +1 -0
  265. package/dist/wire-tab-bars.d.ts +19 -2
  266. package/dist/wire-tab-bars.js +1 -1
  267. package/dist/wire-tab-scaffold.d.ts +11 -0
  268. package/dist/wire-tab-scaffold.js +21 -0
  269. package/dist/wire-tab-scaffold.js.map +1 -0
  270. package/dist/wire-token-search-fields.d.ts +104 -4
  271. package/dist/wire-token-search-fields.js +1 -1
  272. package/dist/workbench.d.ts +44 -0
  273. package/dist/workbench.js +106 -0
  274. package/dist/workbench.js.map +1 -0
  275. package/docs/accessibility.md +155 -20
  276. package/docs/app-layouts.md +61 -0
  277. package/docs/catalog.md +364 -0
  278. package/docs/collapsible-panel.md +142 -0
  279. package/docs/component-contract.md +258 -28
  280. package/docs/component-integration.md +63 -0
  281. package/docs/component-selection.md +219 -57
  282. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  283. package/docs/design/templates/empty-state/filtered.svg +1 -0
  284. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  285. package/docs/design/templates/empty-state/with-action.svg +1 -0
  286. package/docs/design/templates/empty-state-dark.svg +1 -0
  287. package/docs/design/templates/empty-state.svg +1 -0
  288. package/docs/design/templates/list/compact-dark.svg +1 -0
  289. package/docs/design/templates/list/compact.svg +1 -0
  290. package/docs/design/templates/list/stack-dark.svg +1 -0
  291. package/docs/design/templates/list/stack.svg +1 -0
  292. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  293. package/docs/design/templates/list-action-row/default.svg +1 -0
  294. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  295. package/docs/design/templates/list-action-row/selected.svg +1 -0
  296. package/docs/design/templates/list-action-row-dark.svg +1 -0
  297. package/docs/design/templates/list-action-row.svg +1 -0
  298. package/docs/design/templates/list-dark.svg +1 -0
  299. package/docs/design/templates/list-header/action-dark.svg +1 -0
  300. package/docs/design/templates/list-header/action.svg +1 -0
  301. package/docs/design/templates/list-header/count-dark.svg +1 -0
  302. package/docs/design/templates/list-header/count.svg +1 -0
  303. package/docs/design/templates/list-header/inline-action-dark.svg +1 -0
  304. package/docs/design/templates/list-header/inline-action.svg +1 -0
  305. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  306. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  307. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  308. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  309. package/docs/design/templates/list-header-dark.svg +1 -0
  310. package/docs/design/templates/list-header.svg +1 -0
  311. package/docs/design/templates/list-item/default-dark.svg +1 -0
  312. package/docs/design/templates/list-item/default.svg +1 -0
  313. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  314. package/docs/design/templates/list-item/multiline.svg +1 -0
  315. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  316. package/docs/design/templates/list-item/selected.svg +1 -0
  317. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  318. package/docs/design/templates/list-item/trailing.svg +1 -0
  319. package/docs/design/templates/list-item-dark.svg +1 -0
  320. package/docs/design/templates/list-item.svg +1 -0
  321. package/docs/design/templates/list.svg +1 -0
  322. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  323. package/docs/design/templates/segmented-control/equal.svg +1 -0
  324. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  325. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  326. package/docs/design/templates/segmented-control-dark.svg +1 -0
  327. package/docs/design/templates/segmented-control.svg +1 -0
  328. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  329. package/docs/design/templates/skeleton/avatar.svg +1 -0
  330. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  331. package/docs/design/templates/skeleton/block.svg +1 -0
  332. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  333. package/docs/design/templates/skeleton/lines.svg +1 -0
  334. package/docs/design/templates/skeleton-dark.svg +1 -0
  335. package/docs/design/templates/skeleton.svg +1 -0
  336. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  337. package/docs/design/templates/state-banner/danger.svg +1 -0
  338. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  339. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  340. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  341. package/docs/design/templates/state-banner/info.svg +1 -0
  342. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  343. package/docs/design/templates/state-banner/success.svg +1 -0
  344. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  345. package/docs/design/templates/state-banner/warning.svg +1 -0
  346. package/docs/design/templates/state-banner-dark.svg +1 -0
  347. package/docs/design/templates/state-banner.svg +1 -0
  348. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  349. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  350. package/docs/design/templates/tab-bar-dark.svg +1 -0
  351. package/docs/design/templates/tab-bar.svg +1 -0
  352. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  353. package/docs/design/templates/token-search-field/empty.svg +1 -0
  354. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  355. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  356. package/docs/design/templates/token-search-field-dark.svg +1 -0
  357. package/docs/design/templates/token-search-field.svg +1 -0
  358. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  359. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  360. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  361. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  362. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  363. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  364. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  365. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  366. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  367. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  368. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  369. package/docs/design/templates/toolbar-control-group.svg +1 -0
  370. package/docs/design/templates/toolbar-dark.svg +1 -0
  371. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  372. package/docs/design/templates/toolbar-text/default.svg +1 -0
  373. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  374. package/docs/design/templates/toolbar-text/large.svg +1 -0
  375. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  376. package/docs/design/templates/toolbar-text/small.svg +1 -0
  377. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  378. package/docs/design/templates/toolbar-text.svg +1 -0
  379. package/docs/design/templates/toolbar.svg +1 -0
  380. package/docs/design/templates/value-table/details-dark.svg +1 -0
  381. package/docs/design/templates/value-table/details.svg +1 -0
  382. package/docs/design/templates/value-table-dark.svg +1 -0
  383. package/docs/design/templates/value-table.svg +1 -0
  384. package/docs/design/templates.md +128 -0
  385. package/docs/design-philosophy.md +33 -11
  386. package/docs/device-class.md +54 -0
  387. package/docs/examples/application-ui-profile.json +60 -0
  388. package/docs/examples/command-palette-adapter.tsx +68 -17
  389. package/docs/examples/component-catalog-extension-v2.json +80 -0
  390. package/docs/examples/component-catalog-extension.json +45 -0
  391. package/docs/layout.md +169 -38
  392. package/docs/nav-stack.md +77 -0
  393. package/docs/recipes.md +64 -16
  394. package/docs/split-view.md +55 -0
  395. package/docs/sunken-panel.md +53 -0
  396. package/docs/surface-scaffold.md +25 -0
  397. package/docs/tab-scaffold.md +52 -0
  398. package/docs/type-contracts.md +127 -0
  399. package/docs/ui-analyzer.md +118 -0
  400. package/docs/ui-doctor.md +91 -0
  401. package/docs/ui-evaluator.md +122 -0
  402. package/docs/ux-demo.md +29 -10
  403. package/docs/webawesome-theme.md +82 -8
  404. package/docs/workbench.md +123 -0
  405. package/doctor/cli.mjs +115 -0
  406. package/doctor/config.schema.json +68 -0
  407. package/doctor/eslint-diagnostics.d.mts +24 -0
  408. package/doctor/eslint-diagnostics.mjs +24 -0
  409. package/doctor/index.d.mts +116 -0
  410. package/doctor/index.mjs +1272 -0
  411. package/doctor/report.schema.json +118 -0
  412. package/evaluator/cli.mjs +89 -0
  413. package/evaluator/index.d.mts +90 -0
  414. package/evaluator/index.mjs +1138 -0
  415. package/evaluator/report.schema.json +152 -0
  416. package/llms.txt +260 -32
  417. package/package.json +205 -38
  418. package/traversal-exclusions.mjs +27 -0
  419. package/ux-demo/recipes/app-shell.tsx +223 -13
  420. package/ux-demo/recipes/collapsible-sidebar.tsx +230 -0
  421. package/ux-demo/recipes/compact-toolbar.tsx +116 -12
  422. package/ux-demo/recipes/composer-form.tsx +120 -19
  423. package/ux-demo/recipes/list-detail-dialog.tsx +205 -0
  424. package/ux-demo/recipes/list-workspace-states.tsx +176 -9
  425. package/ux-demo/recipes/loaders.ts +13 -4
  426. package/ux-demo/recipes/loading-inspector.tsx +191 -0
  427. package/ux-demo/recipes/mount-recipe.ts +31 -5
  428. package/ux-demo/recipes/navigation-sidebar.tsx +123 -11
  429. package/ux-demo/recipes/navigation-stack.tsx +121 -0
  430. package/ux-demo/recipes/recipes.css +125 -16
  431. package/ux-demo/recipes/types.ts +9 -1
  432. package/ux-demo/recipes/workspace-header.tsx +72 -3
  433. package/dist/browser/dialog-header.js +0 -5
  434. package/dist/browser/menu-action-row.js +0 -3
  435. package/dist/browser/menu-header.js +0 -5
  436. package/dist/browser/menu-item.js +0 -3
  437. package/dist/browser/page-header.js +0 -3
  438. package/dist/chunk-2PES33HS.js +0 -13
  439. package/dist/chunk-2PES33HS.js.map +0 -1
  440. package/dist/chunk-55DATV3A.js +0 -10
  441. package/dist/chunk-55DATV3A.js.map +0 -1
  442. package/dist/chunk-7BR3DO2A.js.map +0 -1
  443. package/dist/chunk-7LDCTU7D.js +0 -134
  444. package/dist/chunk-7LDCTU7D.js.map +0 -1
  445. package/dist/chunk-AQNKJRFH.js +0 -79
  446. package/dist/chunk-AQNKJRFH.js.map +0 -1
  447. package/dist/chunk-CTQKI2XL.js +0 -28
  448. package/dist/chunk-CTQKI2XL.js.map +0 -1
  449. package/dist/chunk-DAFFDO33.js +0 -14
  450. package/dist/chunk-DAFFDO33.js.map +0 -1
  451. package/dist/chunk-EGHL5S4P.js +0 -33
  452. package/dist/chunk-EGHL5S4P.js.map +0 -1
  453. package/dist/chunk-GY5WH7TO.js +0 -10
  454. package/dist/chunk-GY5WH7TO.js.map +0 -1
  455. package/dist/chunk-H5AGGVU5.js +0 -75
  456. package/dist/chunk-H5AGGVU5.js.map +0 -1
  457. package/dist/chunk-K3G72I6D.js +0 -24
  458. package/dist/chunk-K3G72I6D.js.map +0 -1
  459. package/dist/chunk-M5JRI6MN.js +0 -27
  460. package/dist/chunk-M5JRI6MN.js.map +0 -1
  461. package/dist/chunk-MBR3TYNL.js +0 -14
  462. package/dist/chunk-MBR3TYNL.js.map +0 -1
  463. package/dist/chunk-MFKMHK5W.js +0 -10
  464. package/dist/chunk-MFKMHK5W.js.map +0 -1
  465. package/dist/chunk-MQIZAD4A.js.map +0 -1
  466. package/dist/chunk-NPPD2A6O.js +0 -40
  467. package/dist/chunk-NPPD2A6O.js.map +0 -1
  468. package/dist/chunk-R6JHHBKQ.js +0 -19
  469. package/dist/chunk-R6JHHBKQ.js.map +0 -1
  470. package/dist/chunk-S3TPM2LP.js +0 -23
  471. package/dist/chunk-S3TPM2LP.js.map +0 -1
  472. package/dist/chunk-TRNBHPNW.js.map +0 -1
  473. package/dist/chunk-VHW5YNIB.js +0 -17
  474. package/dist/chunk-VHW5YNIB.js.map +0 -1
  475. package/dist/chunk-WVPYVDXY.js +0 -15
  476. package/dist/chunk-WVPYVDXY.js.map +0 -1
  477. package/dist/chunk-XZXRLY5Q.js +0 -33
  478. package/dist/chunk-XZXRLY5Q.js.map +0 -1
  479. package/dist/dialog-header.d.ts +0 -15
  480. package/dist/dialog-header.js +0 -5
  481. package/dist/dialog-header.js.map +0 -1
  482. package/dist/menu-action-row.js +0 -4
  483. package/dist/menu-action-row.js.map +0 -1
  484. package/dist/menu-header.d.ts +0 -41
  485. package/dist/menu-header.js +0 -6
  486. package/dist/menu-header.js.map +0 -1
  487. package/dist/menu-item.d.ts +0 -31
  488. package/dist/menu-item.js +0 -4
  489. package/dist/menu-item.js.map +0 -1
  490. package/dist/page-header.d.ts +0 -9
  491. package/dist/page-header.js +0 -3
  492. package/dist/page-header.js.map +0 -1
  493. package/dist/styles/dialog-header.css +0 -87
  494. package/dist/styles/menu-action-row.css +0 -160
  495. package/dist/styles/menu-header.css +0 -143
  496. package/dist/styles/menu-item.css +0 -123
  497. package/dist/styles/page-header.css +0 -33
  498. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
@@ -20,8 +20,44 @@
20
20
  grid-template-columns: minmax(0, 1fr) auto;
21
21
  }
22
22
 
23
- .kui-toolbar[data-divider="true"] {
24
- box-shadow: inset 0 -1px var(--kui-color-border);
23
+ .kui-toolbar {
24
+ --_kui-toolbar-divider-top: transparent;
25
+ --_kui-toolbar-divider-right: transparent;
26
+ --_kui-toolbar-divider-bottom: transparent;
27
+ --_kui-toolbar-divider-left: transparent;
28
+ box-shadow:
29
+ inset 0 1px var(--_kui-toolbar-divider-top),
30
+ inset -1px 0 var(--_kui-toolbar-divider-right),
31
+ inset 0 -1px var(--_kui-toolbar-divider-bottom),
32
+ inset 1px 0 var(--_kui-toolbar-divider-left);
33
+ }
34
+
35
+ .kui-toolbar[divider-sides*="t"] {
36
+ --_kui-toolbar-divider-top: var(
37
+ --kui-toolbar-divider-color,
38
+ var(--kui-color-border)
39
+ );
40
+ }
41
+
42
+ .kui-toolbar[divider-sides*="r"] {
43
+ --_kui-toolbar-divider-right: var(
44
+ --kui-toolbar-divider-color,
45
+ var(--kui-color-border)
46
+ );
47
+ }
48
+
49
+ .kui-toolbar[divider-sides*="b"] {
50
+ --_kui-toolbar-divider-bottom: var(
51
+ --kui-toolbar-divider-color,
52
+ var(--kui-color-border)
53
+ );
54
+ }
55
+
56
+ .kui-toolbar[divider-sides*="l"] {
57
+ --_kui-toolbar-divider-left: var(
58
+ --kui-toolbar-divider-color,
59
+ var(--kui-color-border)
60
+ );
25
61
  }
26
62
 
27
63
  .kui-toolbar__leading,
@@ -33,16 +69,25 @@
33
69
  gap: var(--kui-toolbar-gap, 0.5rem);
34
70
  }
35
71
 
72
+ /* Pin each zone to its column so a display:none (empty) leading or center zone
73
+ doesn't let the trailing zone auto-place into the first column — which left an
74
+ extra gap + empty track to the trailing zone's right (KF-5BEF2M). The trailing
75
+ zone anchors to the last column via -2/-1, so it stays flush right for both
76
+ the 3- and 2-column layouts, and still stacks under the leading zone when a
77
+ consumer collapses the toolbar to a single column. */
36
78
  .kui-toolbar__leading {
79
+ grid-column: 1;
37
80
  overflow: hidden;
38
81
  }
39
82
 
40
83
  .kui-toolbar__center {
41
84
  justify-content: center;
85
+ grid-column: 2;
42
86
  }
43
87
 
44
88
  .kui-toolbar__trailing {
45
89
  justify-content: flex-end;
90
+ grid-column: -2 / -1;
46
91
  }
47
92
 
48
93
  .kui-toolbar[data-has-center="false"] .kui-toolbar__center,
@@ -175,6 +175,19 @@
175
175
  --wa-form-control-border-color: var(--wa-color-neutral-border-normal);
176
176
  --wa-form-control-border-radius: var(--wa-border-radius-m);
177
177
  --wa-form-control-activated-color: var(--wa-color-brand-fill-loud);
178
+ /* Field inset: a 1px border with 8px inside it, the same content-item
179
+ geometry the Kerf primitives use (docs/layout.md). WA's defaults are a
180
+ larger 0.75em/1em pad; this brings every form field onto our 8px rhythm
181
+ (and a ~40px single-line control height). */
182
+ --wa-form-control-border-width: var(--kui-layout-item-border-width, 1px);
183
+ --wa-form-control-padding-block: var(
184
+ --kui-layout-item-padding,
185
+ 0.5rem
186
+ );
187
+ --wa-form-control-padding-inline: var(
188
+ --kui-layout-item-padding,
189
+ 0.5rem
190
+ );
178
191
  --wa-panel-border-radius: var(--wa-border-radius-l);
179
192
  --wa-tooltip-background-color: var(--wa-color-neutral-fill-loud);
180
193
  --wa-tooltip-content-color: var(--wa-color-neutral-on-loud);
@@ -184,6 +197,13 @@
184
197
  --kui-wa-carousel-dot-hit-size: 20px;
185
198
  --kui-wa-carousel-control-size: 28px;
186
199
  --kui-wa-carousel-icon-size: 16px;
200
+ /* Non-field chrome uses Kerf's control, surface, and container spacing:
201
+ 8px inside controls/surfaces, 8px around bordered surfaces, and 16px
202
+ inside the remaining content containers. */
203
+ --kui-wa-control-inset: var(--kui-layout-item-padding, 0.5rem);
204
+ --kui-wa-surface-inset: var(--kui-layout-item-padding, 0.5rem);
205
+ --kui-wa-surface-margin: var(--kui-layout-inline-margin, 0.5rem);
206
+ --kui-wa-container-inset: var(--kui-space-m, 1rem);
187
207
  --kui-disclosure-icon-scale: 0.5;
188
208
  --wa-shadow-s: 0 1px 3px rgb(0 0 0 / 0.14);
189
209
  --wa-shadow-m: 0 0.35rem 1rem rgb(0 0 0 / 0.11);
@@ -248,9 +268,160 @@
248
268
  transform: scale(var(--kui-disclosure-icon-scale));
249
269
  }
250
270
 
271
+ /* Bordered/fill surfaces follow the same 8px outer margin + 8px inner
272
+ padding contract as a Kerf content item. Accordion owns one outer margin
273
+ for the group; its items retain connected borders. */
274
+ :is(wa-accordion, wa-card, wa-details, wa-callout, wa-include) {
275
+ margin-inline: var(--kui-wa-surface-margin);
276
+ }
277
+
278
+ wa-card,
279
+ wa-details,
280
+ wa-accordion-item {
281
+ /* WA declares this custom property on :host inside each shadow root. The
282
+ important flag is required for a public host override to cross that
283
+ encapsulation boundary. */
284
+ --spacing: var(--kui-wa-surface-inset) !important;
285
+ }
286
+
287
+ /* Card halves --spacing for its header block padding upstream, so pin the
288
+ public part to the same full surface inset as its body and footer. */
289
+ wa-card::part(header) {
290
+ border-bottom: none;
291
+ padding: var(--kui-wa-surface-inset);
292
+ }
293
+
294
+ wa-card::part(body) {
295
+ padding: var(--kui-wa-surface-inset);
296
+ }
297
+
298
+ wa-card::part(footer) {
299
+ border-top: none;
300
+ padding: var(--kui-wa-container-inset);
301
+ display: flex;
302
+ justify-content: flex-end;
303
+ gap: var(--kui-layout-item-gap, 0.5rem);
304
+ }
305
+
306
+ /* Dialog content follows the compact surface inset, while its action region
307
+ retains the roomier homogeneous-group step. Keep these independent of
308
+ Web Awesome's shared --spacing property so applications can tune the
309
+ header without accidentally moving body or footer content. */
310
+ wa-dialog::part(header) {
311
+ padding: var(--kui-wa-surface-inset);
312
+ }
313
+
314
+ wa-dialog::part(body) {
315
+ padding: var(--kui-wa-surface-inset);
316
+ }
317
+
318
+ wa-dialog::part(footer) {
319
+ padding: var(--kui-wa-container-inset);
320
+ display: flex;
321
+ justify-content: flex-end;
322
+ gap: var(--kui-layout-item-gap, 0.5rem);
323
+ }
324
+
325
+ /* Dialogs that provide their own dismissal affordance can opt out of Web
326
+ Awesome's header action region without reaching through the shadow root.
327
+ `header-actions` is a directly exported part, so it must be targeted from
328
+ the host rather than chained through the `dialog` and `header` parts. */
329
+ wa-dialog.hide-actions::part(header-actions) {
330
+ display: none;
331
+ }
332
+
333
+ wa-callout {
334
+ padding: var(--kui-wa-surface-inset) !important;
335
+ }
336
+
337
+ wa-include {
338
+ padding: var(--kui-wa-surface-inset);
339
+ }
340
+
341
+ /* Interactive and item chrome follows the content-item 8px inset. */
342
+ wa-tab::part(tab) {
343
+ padding: var(--kui-wa-control-inset);
344
+ }
345
+
346
+ wa-tab-panel {
347
+ --padding: var(--kui-wa-container-inset) 0 !important;
348
+ }
349
+
350
+ wa-tree-item::part(item) {
351
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
352
+ padding-inline-end: var(--kui-wa-control-inset);
353
+ border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
354
+ }
355
+
356
+ wa-tag {
357
+ padding-inline: var(--kui-wa-control-inset) !important;
358
+ }
359
+
360
+ wa-dropdown-item {
361
+ padding-inline: var(--kui-wa-control-inset) !important;
362
+ }
363
+
251
364
  wa-popover {
252
365
  --arrow-size: var(--kui-wa-popover-arrow-size);
253
366
  }
367
+
368
+ /* A form field's top label is inset by the field's own border + inline padding
369
+ (1px + 8px = 9px) so the label text lines up with the value inside the field,
370
+ and it is styled exactly like a ListHeader label: uppercase, xs, quiet. */
371
+ :is(
372
+ wa-checkbox-group,
373
+ wa-color-picker,
374
+ wa-input,
375
+ wa-known-date,
376
+ wa-number-input,
377
+ wa-radio-group,
378
+ wa-select,
379
+ wa-textarea,
380
+ wa-time-input
381
+ )::part(form-control-label),
382
+ wa-otp-input::part(label),
383
+ wa-slider::part(label) {
384
+ padding-inline: calc(
385
+ var(--wa-form-control-border-width) +
386
+ var(--wa-form-control-padding-inline)
387
+ );
388
+ color: var(--kui-color-neutral-on-quiet, var(--wa-color-text-quiet));
389
+ font-size: var(--kui-font-xs, var(--wa-font-size-xs));
390
+ font-weight: 650;
391
+ letter-spacing: 0.04em;
392
+ line-height: var(--wa-line-height-condensed);
393
+ text-transform: uppercase;
394
+ }
395
+
396
+ /* Checkbox/radio groups and the color picker have no bordered field shell,
397
+ so their control regions need the content-item's 8px inline outer inset. */
398
+ :is(wa-checkbox-group, wa-color-picker, wa-radio-group)::part(
399
+ form-control-input
400
+ ) {
401
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
402
+ }
403
+
404
+ wa-slider::part(slider) {
405
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
406
+ }
407
+
408
+ /* Secondary captions and hints align with the value inside bordered fields:
409
+ 1px border + 8px field padding = a 9px logical inset. */
410
+ wa-known-date::part(field-label),
411
+ :is(
412
+ wa-input,
413
+ wa-known-date,
414
+ wa-number-input,
415
+ wa-otp-input,
416
+ wa-select,
417
+ wa-textarea,
418
+ wa-time-input
419
+ )::part(hint) {
420
+ padding-inline: calc(
421
+ var(--wa-form-control-border-width) +
422
+ var(--wa-form-control-padding-inline)
423
+ );
424
+ }
254
425
  }
255
426
 
256
427
  @media (prefers-contrast: more) {
@@ -0,0 +1,187 @@
1
+ .kui-workbench {
2
+ position: relative;
3
+ display: flex;
4
+ min-width: 0;
5
+ min-height: 0;
6
+ height: 100%;
7
+ overflow: hidden;
8
+ background: var(--kui-color-surface);
9
+ }
10
+
11
+ /* Side rails. Collapsing snaps the flex track to zero (one reflow) while the
12
+ fixed-width content slides out via transform (composited, clipped) — never a
13
+ per-frame width animation. See docs/18 / the KF-7QKJRK catalog sidebar. */
14
+ .kui-workbench__rail {
15
+ flex: 0 0 var(--kui-workbench-rail-width, 17.5rem);
16
+ min-width: 0;
17
+ overflow: hidden;
18
+ background: var(--kui-color-surface);
19
+ }
20
+
21
+ .kui-workbench__rail--left {
22
+ border-inline-end: 1px solid var(--kui-color-border);
23
+ }
24
+
25
+ .kui-workbench__rail--right {
26
+ border-inline-start: 1px solid var(--kui-color-border);
27
+ }
28
+
29
+ .kui-workbench__rail[data-collapsed="true"] {
30
+ flex-basis: 0;
31
+ border-inline: 0;
32
+ }
33
+
34
+ .kui-workbench__rail[data-separator="hidden"],
35
+ .kui-workbench__drawer[data-separator="hidden"] {
36
+ border-color: transparent;
37
+ }
38
+
39
+ .kui-workbench__center {
40
+ display: flex;
41
+ flex: 1;
42
+ min-width: 0;
43
+ min-height: 0;
44
+ overflow: hidden;
45
+ flex-direction: column;
46
+ }
47
+
48
+ .kui-workbench__main {
49
+ flex: 1;
50
+ min-height: 0;
51
+ overflow: auto;
52
+ }
53
+
54
+ /* Bottom drawer — the vertical analogue of a rail. */
55
+ .kui-workbench__drawer {
56
+ position: relative;
57
+ flex: 0 0 var(--kui-workbench-drawer-height, 13.75rem);
58
+ min-height: 0;
59
+ overflow: hidden;
60
+ border-block-start: 1px solid var(--kui-color-border);
61
+ background: var(--kui-color-surface);
62
+ }
63
+
64
+ .kui-workbench__drawer[data-collapsed="true"] {
65
+ flex-basis: 0;
66
+ border-block-start: 0;
67
+ }
68
+
69
+ .kui-workbench__rail[data-content-overflow="auto"],
70
+ .kui-workbench__drawer[data-content-overflow="auto"] {
71
+ overflow: auto;
72
+ }
73
+
74
+ .kui-workbench__rail[data-content-overflow="visible"],
75
+ .kui-workbench__drawer[data-content-overflow="visible"] {
76
+ z-index: var(--kui-workbench-popup-z, 5);
77
+ overflow: visible;
78
+ }
79
+
80
+ /* The fixed-size sliding content. The rail/drawer keeps a definite size on its
81
+ content so the transform reads as a slide, not a squeeze. */
82
+ .kui-workbench__rail .kui-workbench__panel-content {
83
+ width: var(--kui-workbench-rail-width, 17.5rem);
84
+ height: 100%;
85
+ transition: transform 200ms ease;
86
+ }
87
+
88
+ .kui-workbench__drawer .kui-workbench__panel-content {
89
+ position: absolute;
90
+ inset-inline: 0;
91
+ inset-block-end: 0;
92
+ width: 100%;
93
+ height: var(--kui-workbench-drawer-height, 13.75rem);
94
+ transition: transform 200ms ease;
95
+ }
96
+
97
+ .kui-workbench__rail[data-collapse-motion="none"] .kui-workbench__panel-content,
98
+ .kui-workbench__drawer[data-collapse-motion="none"]
99
+ .kui-workbench__panel-content {
100
+ transition: none;
101
+ }
102
+
103
+ .kui-workbench__rail[data-collapse-motion="fade-slide"][data-collapsed="true"]
104
+ .kui-workbench__panel-content,
105
+ .kui-workbench__drawer[data-collapse-motion="fade-slide"][data-collapsed="true"]
106
+ .kui-workbench__panel-content {
107
+ opacity: 0;
108
+ }
109
+
110
+ .kui-workbench__rail--left[data-collapsed="true"]
111
+ .kui-workbench__panel-content {
112
+ transform: translateX(-100%);
113
+ }
114
+
115
+ .kui-workbench__rail--right[data-collapsed="true"]
116
+ .kui-workbench__panel-content {
117
+ transform: translateX(100%);
118
+ }
119
+
120
+ .kui-workbench__drawer[data-collapsed="true"] .kui-workbench__panel-content {
121
+ transform: translateY(100%);
122
+ }
123
+
124
+ .kui-workbench__rail[data-presentation="overlay"],
125
+ .kui-workbench__drawer[data-presentation="overlay"] {
126
+ position: absolute;
127
+ z-index: var(--kui-workbench-overlay-z, 41);
128
+ max-width: var(--kui-workbench-overlay-max-width, 85vw);
129
+ max-height: var(--kui-workbench-overlay-max-height, 85vh);
130
+ box-shadow: var(--kui-shadow-l, 0 8px 32px rgb(0 0 0 / 24%));
131
+ }
132
+
133
+ .kui-workbench__rail[data-presentation="overlay"] {
134
+ inset-block: 0;
135
+ }
136
+
137
+ .kui-workbench__rail--left[data-presentation="overlay"] {
138
+ inset-inline-start: 0;
139
+ }
140
+
141
+ .kui-workbench__rail--right[data-presentation="overlay"] {
142
+ inset-inline-end: 0;
143
+ }
144
+
145
+ .kui-workbench__drawer[data-presentation="overlay"] {
146
+ inset-inline: 0;
147
+ inset-block-end: 0;
148
+ }
149
+
150
+ .kui-workbench__rail[data-presentation="overlay"][data-collapsed="true"],
151
+ .kui-workbench__drawer[data-presentation="overlay"][data-collapsed="true"] {
152
+ pointer-events: none;
153
+ }
154
+
155
+ .kui-workbench__rail[data-presentation="hidden"],
156
+ .kui-workbench__drawer[data-presentation="hidden"] {
157
+ display: none;
158
+ }
159
+
160
+ .kui-workbench__restore {
161
+ position: fixed;
162
+ z-index: var(--kui-workbench-restore-z, 42);
163
+ inset-block-end: calc(
164
+ var(--kui-workbench-restore-inset, 1rem) +
165
+ var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
166
+ );
167
+ }
168
+
169
+ .kui-workbench__restore[data-position="bottom-start"] {
170
+ inset-inline-start: calc(
171
+ var(--kui-workbench-restore-inset, 1rem) +
172
+ var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
173
+ );
174
+ }
175
+
176
+ .kui-workbench__restore[data-position="bottom-end"] {
177
+ inset-inline-end: calc(
178
+ var(--kui-workbench-restore-inset, 1rem) +
179
+ var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
180
+ );
181
+ }
182
+
183
+ @media (prefers-reduced-motion: reduce) {
184
+ .kui-workbench__panel-content {
185
+ transition: none;
186
+ }
187
+ }
@@ -0,0 +1,20 @@
1
+ import * as kerfjs from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+
4
+ type SunkenPanelShape = 'rounded' | 'square';
5
+ interface SunkenPanelProps {
6
+ children?: KerfUiContent;
7
+ /** Optional accessible landmark name for a distinct application region. */
8
+ ariaLabel?: string;
9
+ /** Corner shape: a rounded rectangle (default) or square corners. */
10
+ shape?: SunkenPanelShape;
11
+ className?: string;
12
+ }
13
+ /**
14
+ * A lowered application surface with one compact inset and a vertical content
15
+ * stack. The panel owns its background and padding; children own their own
16
+ * borders and internal geometry.
17
+ */
18
+ declare function SunkenPanel({ children, ariaLabel, shape, className, }: SunkenPanelProps): kerfjs.SafeHtml;
19
+
20
+ export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
@@ -0,0 +1,3 @@
1
+ export { SunkenPanel } from './chunk-SOK5EUF7.js';
2
+
3
+ //# sourceMappingURL=sunken-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"sunken-panel.js"}
@@ -0,0 +1,26 @@
1
+ import * as kerfjs from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+
4
+ type DialogSurfaceSize = 'small' | 'medium' | 'large';
5
+ type DialogSurfacePresentation = 'modal' | 'side-sheet' | 'fullscreen';
6
+ type SurfaceInset = 'none' | 'compact' | 'comfortable';
7
+ interface DialogSurfaceProps {
8
+ children: KerfUiContent;
9
+ size?: DialogSurfaceSize;
10
+ presentation?: DialogSurfacePresentation;
11
+ bodyInset?: SurfaceInset;
12
+ footerInset?: SurfaceInset;
13
+ className?: string;
14
+ }
15
+ /** Configure recurring Web Awesome dialog geometry without consumer ::part() CSS. */
16
+ declare function DialogSurface({ children, size, presentation, bodyInset, footerInset, className, }: DialogSurfaceProps): kerfjs.SafeHtml;
17
+ type PopupSurfaceInset = 'standard' | 'compact' | 'list-zero';
18
+ interface PopupSurfaceProps {
19
+ children: KerfUiContent;
20
+ inset?: PopupSurfaceInset;
21
+ className?: string;
22
+ }
23
+ /** Configure recurring Web Awesome dropdown-menu geometry without consumer ::part() CSS. */
24
+ declare function PopupSurface({ children, inset, className, }: PopupSurfaceProps): kerfjs.SafeHtml;
25
+
26
+ export { DialogSurface, type DialogSurfacePresentation, type DialogSurfaceProps, type DialogSurfaceSize, PopupSurface, type PopupSurfaceInset, type PopupSurfaceProps, type SurfaceInset };
@@ -0,0 +1,3 @@
1
+ export { DialogSurface, PopupSurface } from './chunk-WSXUPSID.js';
2
+
3
+ //# sourceMappingURL=surface-scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"surface-scaffold.js"}
package/dist/tab-bar.d.ts CHANGED
@@ -1,14 +1,32 @@
1
- import { SafeHtml } from 'kerfjs';
1
+ import * as kerfjs from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2
3
 
4
+ type TabActivation = 'automatic' | 'manual';
5
+ type TabBarAllocation = 'intrinsic' | 'fill';
6
+ type TabBarPresentation = 'rail' | 'segmented' | 'inspector';
7
+ type TabBarTrailingPlacement = 'separate' | 'adjacent';
3
8
  interface TabBarProps {
4
9
  id: string;
5
10
  label: string;
6
- children: SafeHtml | readonly SafeHtml[];
7
- leading?: SafeHtml;
8
- trailing?: SafeHtml;
11
+ children: KerfUiContent;
12
+ leading?: KerfUiContent;
13
+ trailing?: KerfUiContent;
9
14
  className?: string;
15
+ /**
16
+ * Keyboard activation mode for this strip, emitted as `data-tab-activation` for
17
+ * `wireTabBars` to read (overrides its `activation` option). `'automatic'` (default)
18
+ * selects on arrow / Home / End; `'manual'` moves roving focus only and the user
19
+ * selects with Enter / Space / click — use it when selecting a tab is a heavy action.
20
+ */
21
+ activation?: TabActivation;
22
+ /** How available strip width is allocated across child AppTabs. */
23
+ allocation?: TabBarAllocation;
24
+ /** Named strip chrome for application rails, segmented tabs, or inspectors. */
25
+ presentation?: TabBarPresentation;
26
+ /** Keep a trailing action beside the final tab or at the far edge of the bar. */
27
+ trailingPlacement?: TabBarTrailingPlacement;
10
28
  }
11
29
  /** Render a controlled tab strip. The application owns selection, order, and persistence. */
12
- declare function TabBar({ id, label, children, leading, trailing, className }: TabBarProps): SafeHtml;
30
+ declare function TabBar({ id, label, children, leading, trailing, className, activation, allocation, presentation, trailingPlacement, }: TabBarProps): kerfjs.SafeHtml;
13
31
 
14
- export { TabBar, type TabBarProps };
32
+ export { type TabActivation, TabBar, type TabBarAllocation, type TabBarPresentation, type TabBarProps, type TabBarTrailingPlacement };
package/dist/tab-bar.js CHANGED
@@ -1,3 +1,3 @@
1
- export { TabBar } from './chunk-MBR3TYNL.js';
1
+ export { TabBar } from './chunk-ZPWZIVI6.js';
2
2
 
3
3
  //# sourceMappingURL=tab-bar.js.map
@@ -0,0 +1,31 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+
4
+ interface TabScaffoldTab<Id extends string = string> {
5
+ id: Id;
6
+ label: string;
7
+ /** Decorative icon shown above the label in the bottom bar. */
8
+ icon?: SafeHtml;
9
+ /** The tab's content — typically a `NavStack` so each tab keeps its own stack. */
10
+ content: KerfUiContent;
11
+ }
12
+ interface TabScaffoldProps<Id extends string = string> {
13
+ id: string;
14
+ /** Accessible name for the tab bar. */
15
+ label: string;
16
+ tabs: readonly TabScaffoldTab<Id>[];
17
+ /** The controlled active tab id (the app owns selection). */
18
+ active: NoInfer<Id>;
19
+ className?: string;
20
+ }
21
+ /**
22
+ * A mobile-first, iOS-like bottom tab scaffold: a bottom tab bar that switches
23
+ * between major sections, each tab keeping its own content (usually a `NavStack`)
24
+ * mounted so its stack and scroll survive a switch. Controlled — the app owns
25
+ * `active`; wire selection with `@kerfjs/ui/wire-tab-scaffold`'s `wireTabScaffold`.
26
+ * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of
27
+ * a bottom bar. See `docs/23-app-layouts.md` §3.4.
28
+ */
29
+ declare function TabScaffold<Id extends string>({ id, label, tabs, active, className, }: TabScaffoldProps<Id>): SafeHtml;
30
+
31
+ export { TabScaffold, type TabScaffoldProps, type TabScaffoldTab };
@@ -0,0 +1,51 @@
1
+ import { jsxs, jsx } from 'kerfjs/jsx-runtime';
2
+
3
+ // src/tab-scaffold.tsx
4
+ function TabScaffold({
5
+ id,
6
+ label,
7
+ tabs,
8
+ active,
9
+ className = ""
10
+ }) {
11
+ return /* @__PURE__ */ jsxs(
12
+ "section",
13
+ {
14
+ class: `kui-tab-scaffold ${className}`.trim(),
15
+ id,
16
+ "data-component": "tab-scaffold",
17
+ "data-tab-scaffold-id": id,
18
+ children: [
19
+ /* @__PURE__ */ jsx("div", { class: "kui-tab-scaffold__scenes", children: tabs.map((tab) => /* @__PURE__ */ jsx(
20
+ "div",
21
+ {
22
+ class: "kui-tab-scaffold__scene",
23
+ "data-tab-scaffold-scene": tab.id,
24
+ "data-active": String(tab.id === active),
25
+ "aria-hidden": String(tab.id !== active),
26
+ children: tab.content
27
+ }
28
+ )) }),
29
+ /* @__PURE__ */ jsx("nav", { class: "kui-tab-scaffold__bar", role: "tablist", "aria-label": label, children: tabs.map((tab) => /* @__PURE__ */ jsxs(
30
+ "button",
31
+ {
32
+ type: "button",
33
+ class: "kui-tab-scaffold__tab",
34
+ role: "tab",
35
+ "data-tab-scaffold-tab": tab.id,
36
+ "aria-selected": String(tab.id === active),
37
+ tabindex: tab.id === active ? "0" : "-1",
38
+ children: [
39
+ tab.icon && /* @__PURE__ */ jsx("span", { class: "kui-tab-scaffold__tab-icon", "aria-hidden": "true", children: tab.icon }),
40
+ /* @__PURE__ */ jsx("span", { class: "kui-tab-scaffold__tab-label", children: tab.label })
41
+ ]
42
+ }
43
+ )) })
44
+ ]
45
+ }
46
+ );
47
+ }
48
+
49
+ export { TabScaffold };
50
+
51
+ //# sourceMappingURL=tab-scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tab-scaffold.tsx"],"names":[],"mappings":";;;AA+BO,SAAS,WAAA,CAA+B;AAAA,EAC7C,EAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAyB;AACvB,EAAA,uBACE,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC5C,EAAA;AAAA,MACA,gBAAA,EAAe,cAAA;AAAA,MACf,sBAAA,EAAsB,EAAA;AAAA,MAEtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,SAAI,KAAA,EAAM,0BAAA,EACR,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACT,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,yBAAA;AAAA,YACN,2BAAyB,GAAA,CAAI,EAAA;AAAA,YAC7B,aAAA,EAAa,MAAA,CAAO,GAAA,CAAI,EAAA,KAAO,MAAM,CAAA;AAAA,YACrC,aAAA,EAAa,MAAA,CAAO,GAAA,CAAI,EAAA,KAAO,MAAM,CAAA;AAAA,YAEpC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,SAER,CAAA,EACH,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,uBAAA,EAAwB,IAAA,EAAK,SAAA,EAAU,YAAA,EAAY,KAAA,EAC3D,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACT,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,uBAAA;AAAA,YACN,IAAA,EAAK,KAAA;AAAA,YACL,yBAAuB,GAAA,CAAI,EAAA;AAAA,YAC3B,eAAA,EAAe,MAAA,CAAO,GAAA,CAAI,EAAA,KAAO,MAAM,CAAA;AAAA,YACvC,QAAA,EAAU,GAAA,CAAI,EAAA,KAAO,MAAA,GAAS,GAAA,GAAM,IAAA;AAAA,YAEnC,QAAA,EAAA;AAAA,cAAA,GAAA,CAAI,IAAA,wBACF,MAAA,EAAA,EAAK,KAAA,EAAM,8BAA6B,aAAA,EAAY,MAAA,EAClD,cAAI,IAAA,EACP,CAAA;AAAA,8BAEF,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,6BAAA,EAA+B,cAAI,KAAA,EAAM;AAAA;AAAA;AAAA,SAExD,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ","file":"tab-scaffold.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { KerfUiContent } from './semantic-content.js';\n\nexport interface TabScaffoldTab<Id extends string = string> {\n id: Id;\n label: string;\n /** Decorative icon shown above the label in the bottom bar. */\n icon?: SafeHtml;\n /** The tab's content — typically a `NavStack` so each tab keeps its own stack. */\n content: KerfUiContent;\n}\n\nexport interface TabScaffoldProps<Id extends string = string> {\n id: string;\n /** Accessible name for the tab bar. */\n label: string;\n tabs: readonly TabScaffoldTab<Id>[];\n /** The controlled active tab id (the app owns selection). */\n active: NoInfer<Id>;\n className?: string;\n}\n\n/**\n * A mobile-first, iOS-like bottom tab scaffold: a bottom tab bar that switches\n * between major sections, each tab keeping its own content (usually a `NavStack`)\n * mounted so its stack and scroll survive a switch. Controlled — the app owns\n * `active`; wire selection with `@kerfjs/ui/wire-tab-scaffold`'s `wireTabScaffold`.\n * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of\n * a bottom bar. See `docs/23-app-layouts.md` §3.4.\n */\nexport function TabScaffold<Id extends string>({\n id,\n label,\n tabs,\n active,\n className = '',\n}: TabScaffoldProps<Id>) {\n return (\n <section\n class={`kui-tab-scaffold ${className}`.trim()}\n id={id}\n data-component=\"tab-scaffold\"\n data-tab-scaffold-id={id}\n >\n <div class=\"kui-tab-scaffold__scenes\">\n {tabs.map((tab) => (\n <div\n class=\"kui-tab-scaffold__scene\"\n data-tab-scaffold-scene={tab.id}\n data-active={String(tab.id === active)}\n aria-hidden={String(tab.id !== active)}\n >\n {tab.content}\n </div>\n ))}\n </div>\n <nav class=\"kui-tab-scaffold__bar\" role=\"tablist\" aria-label={label}>\n {tabs.map((tab) => (\n <button\n type=\"button\"\n class=\"kui-tab-scaffold__tab\"\n role=\"tab\"\n data-tab-scaffold-tab={tab.id}\n aria-selected={String(tab.id === active)}\n tabindex={tab.id === active ? '0' : '-1'}\n >\n {tab.icon && (\n <span class=\"kui-tab-scaffold__tab-icon\" aria-hidden=\"true\">\n {tab.icon}\n </span>\n )}\n <span class=\"kui-tab-scaffold__tab-label\">{tab.label}</span>\n </button>\n ))}\n </nav>\n </section>\n );\n}\n"]}
package/dist/text.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import * as kerfjs from 'kerfjs';
2
+ import { KerfBaseAttrs } from 'kerfjs/jsx-runtime';
3
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
4
+
5
+ type TextVariant = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p';
6
+ type TextContent = KerfUiContent | string | number | readonly TextContent[];
7
+ type TextProps = Omit<KerfBaseAttrs, 'children' | 'class' | 'className'> & {
8
+ /** Native heading or paragraph element to render. */
9
+ variant: TextVariant;
10
+ children: TextContent;
11
+ class?: string;
12
+ className?: string;
13
+ };
14
+ /**
15
+ * Semantic heading or paragraph text with the standard content-item padding.
16
+ * All ordinary native heading/paragraph attributes pass through to the element.
17
+ */
18
+ declare function Text({ variant: Variant, children, class: classValue, className, ...attributes }: TextProps): kerfjs.SafeHtml;
19
+
20
+ export { Text, type TextContent, type TextProps, type TextVariant };
package/dist/text.js ADDED
@@ -0,0 +1,3 @@
1
+ export { Text } from './chunk-ZASJJMGV.js';
2
+
3
+ //# sourceMappingURL=text.js.map