@kerfjs/ui 5.0.0-beta.3 → 5.0.0-beta.31

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 (470) hide show
  1. package/README.md +320 -107
  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 +131 -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 +486 -0
  17. package/ai/component-catalog-v2.d.ts +90 -0
  18. package/ai/component-catalog-v2.json +5455 -0
  19. package/ai/component-catalog-v2.schema.json +298 -0
  20. package/ai/component-catalog.json +2437 -419
  21. package/ai/component-catalog.schema.json +39 -0
  22. package/ai/public-api-signatures-v1.md +1442 -124
  23. package/ai/skill.md +131 -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/{menu-header.js → list-header.js} +3 -2
  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/segmented-control.js +1 -0
  41. package/dist/browser/select.js +1 -0
  42. package/dist/browser/skeleton.js +3 -0
  43. package/dist/browser/state-banner.js +1 -0
  44. package/dist/browser/sunken-panel.js +3 -0
  45. package/dist/browser/surface-scaffold.js +3 -0
  46. package/dist/browser/toolbar-text.js +1 -0
  47. package/dist/browser/value-table.js +1 -0
  48. package/dist/catalog-resources.d.ts +35 -0
  49. package/dist/catalog-resources.js +22 -0
  50. package/dist/catalog-resources.js.map +1 -0
  51. package/dist/catalog.d.ts +151 -0
  52. package/dist/catalog.js +379 -0
  53. package/dist/catalog.js.map +1 -0
  54. package/dist/chunk-6NDBE2OK.js +32 -0
  55. package/dist/chunk-6NDBE2OK.js.map +1 -0
  56. package/dist/chunk-6WTETUZ6.js +21 -0
  57. package/dist/chunk-6WTETUZ6.js.map +1 -0
  58. package/dist/chunk-AQFWBG23.js +83 -0
  59. package/dist/chunk-AQFWBG23.js.map +1 -0
  60. package/dist/chunk-B6JYRX3P.js +51 -0
  61. package/dist/chunk-B6JYRX3P.js.map +1 -0
  62. package/dist/chunk-CAB6NQ2T.js +102 -0
  63. package/dist/chunk-CAB6NQ2T.js.map +1 -0
  64. package/dist/chunk-CK6P5AUK.js +136 -0
  65. package/dist/chunk-CK6P5AUK.js.map +1 -0
  66. package/dist/chunk-DAO2VFTT.js +129 -0
  67. package/dist/chunk-DAO2VFTT.js.map +1 -0
  68. package/dist/chunk-DYBPI5O2.js +25 -0
  69. package/dist/chunk-DYBPI5O2.js.map +1 -0
  70. package/dist/{chunk-TRNBHPNW.js → chunk-E34TE2ZI.js} +12 -8
  71. package/dist/chunk-E34TE2ZI.js.map +1 -0
  72. package/dist/chunk-I45QO2IZ.js +88 -0
  73. package/dist/chunk-I45QO2IZ.js.map +1 -0
  74. package/dist/chunk-I4V3UDSA.js +79 -0
  75. package/dist/chunk-I4V3UDSA.js.map +1 -0
  76. package/dist/chunk-KFUUFNTS.js +15 -0
  77. package/dist/chunk-KFUUFNTS.js.map +1 -0
  78. package/dist/chunk-MFR2IIFG.js +20 -0
  79. package/dist/chunk-MFR2IIFG.js.map +1 -0
  80. package/dist/chunk-OC275HHS.js +128 -0
  81. package/dist/chunk-OC275HHS.js.map +1 -0
  82. package/dist/chunk-OL4TC3U2.js +156 -0
  83. package/dist/chunk-OL4TC3U2.js.map +1 -0
  84. package/dist/chunk-OMSRSL3B.js +120 -0
  85. package/dist/chunk-OMSRSL3B.js.map +1 -0
  86. package/dist/chunk-RL6COPKF.js +44 -0
  87. package/dist/chunk-RL6COPKF.js.map +1 -0
  88. package/dist/chunk-SOK5EUF7.js +25 -0
  89. package/dist/chunk-SOK5EUF7.js.map +1 -0
  90. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  91. package/dist/chunk-SRSJO5QE.js.map +1 -0
  92. package/dist/chunk-T7DOWS6T.js +61 -0
  93. package/dist/chunk-T7DOWS6T.js.map +1 -0
  94. package/dist/chunk-TIGSG6BX.js +218 -0
  95. package/dist/chunk-TIGSG6BX.js.map +1 -0
  96. package/dist/chunk-UDHHKZWO.js +41 -0
  97. package/dist/chunk-UDHHKZWO.js.map +1 -0
  98. package/dist/{chunk-MQIZAD4A.js → chunk-UKKSMZYT.js} +76 -22
  99. package/dist/chunk-UKKSMZYT.js.map +1 -0
  100. package/dist/chunk-V6GQKOX2.js +39 -0
  101. package/dist/chunk-V6GQKOX2.js.map +1 -0
  102. package/dist/chunk-V6HCTCVD.js +46 -0
  103. package/dist/chunk-V6HCTCVD.js.map +1 -0
  104. package/dist/chunk-VDUJZF5G.js +515 -0
  105. package/dist/chunk-VDUJZF5G.js.map +1 -0
  106. package/dist/chunk-VXFGMDA7.js +31 -0
  107. package/dist/chunk-VXFGMDA7.js.map +1 -0
  108. package/dist/chunk-WN52USHV.js +115 -0
  109. package/dist/chunk-WN52USHV.js.map +1 -0
  110. package/dist/chunk-WSXUPSID.js +43 -0
  111. package/dist/chunk-WSXUPSID.js.map +1 -0
  112. package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
  113. package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
  114. package/dist/chunk-ZPWZIVI6.js +47 -0
  115. package/dist/chunk-ZPWZIVI6.js.map +1 -0
  116. package/dist/collapsible-panel.d.ts +77 -0
  117. package/dist/collapsible-panel.js +84 -0
  118. package/dist/collapsible-panel.js.map +1 -0
  119. package/dist/css-values.d.ts +75 -0
  120. package/dist/css-values.js +3 -0
  121. package/dist/css-values.js.map +1 -0
  122. package/dist/device-class.d.ts +62 -0
  123. package/dist/device-class.js +103 -0
  124. package/dist/device-class.js.map +1 -0
  125. package/dist/disclosure-arrow.js +1 -1
  126. package/dist/divider-sides-267FA7sY.d.ts +4 -0
  127. package/dist/empty-state.d.ts +3 -2
  128. package/dist/empty-state.js +1 -1
  129. package/dist/floating-toolbar.d.ts +29 -0
  130. package/dist/floating-toolbar.js +3 -0
  131. package/dist/floating-toolbar.js.map +1 -0
  132. package/dist/index.d.ts +23 -14
  133. package/dist/index.js +30 -23
  134. package/dist/{menu-action-row.d.ts → list-action-row.d.ts} +19 -8
  135. package/dist/list-action-row.js +7 -0
  136. package/dist/list-action-row.js.map +1 -0
  137. package/dist/list-header.d.ts +77 -0
  138. package/dist/list-header.js +8 -0
  139. package/dist/list-header.js.map +1 -0
  140. package/dist/list-inset-control.d.ts +17 -0
  141. package/dist/list-inset-control.js +3 -0
  142. package/dist/list-inset-control.js.map +1 -0
  143. package/dist/list-inset-text.d.ts +26 -0
  144. package/dist/list-inset-text.js +3 -0
  145. package/dist/list-inset-text.js.map +1 -0
  146. package/dist/list-item.d.ts +45 -0
  147. package/dist/list-item.js +7 -0
  148. package/dist/list-item.js.map +1 -0
  149. package/dist/list.d.ts +21 -0
  150. package/dist/list.js +4 -0
  151. package/dist/list.js.map +1 -0
  152. package/dist/loading-spinner.js +1 -1
  153. package/dist/nav-stack.d.ts +41 -0
  154. package/dist/nav-stack.js +6 -0
  155. package/dist/nav-stack.js.map +1 -0
  156. package/dist/pane.d.ts +50 -0
  157. package/dist/pane.js +4 -0
  158. package/dist/pane.js.map +1 -0
  159. package/dist/resizable-region.d.ts +21 -3
  160. package/dist/resizable-region.js +1 -1
  161. package/dist/segmented-control.d.ts +11 -8
  162. package/dist/segmented-control.js +3 -1
  163. package/dist/select-register.d.ts +5 -1
  164. package/dist/select-register.js +3 -0
  165. package/dist/select-register.js.map +1 -1
  166. package/dist/select.d.ts +34 -8
  167. package/dist/select.js +3 -1
  168. package/dist/semantic-content-BbzjvSu9.d.ts +14 -0
  169. package/dist/skeleton.d.ts +25 -0
  170. package/dist/skeleton.js +4 -0
  171. package/dist/skeleton.js.map +1 -0
  172. package/dist/split-view.d.ts +43 -0
  173. package/dist/split-view.js +82 -0
  174. package/dist/split-view.js.map +1 -0
  175. package/dist/state-banner.d.ts +11 -5
  176. package/dist/state-banner.js +3 -1
  177. package/dist/styles/app-tab.css +26 -0
  178. package/dist/styles/catalog.css +582 -0
  179. package/dist/styles/collapsible-panel.css +212 -0
  180. package/dist/styles/floating-toolbar.css +38 -0
  181. package/dist/styles/foundation.css +80 -0
  182. package/dist/styles/layout.css +2 -20
  183. package/dist/styles/list-action-row.css +224 -0
  184. package/dist/styles/list-header.css +198 -0
  185. package/dist/styles/list-inset-control.css +7 -0
  186. package/dist/styles/list-inset-text.css +14 -0
  187. package/dist/styles/list-item.css +171 -0
  188. package/dist/styles/list.css +43 -0
  189. package/dist/styles/nav-stack.css +141 -0
  190. package/dist/styles/pane.css +62 -0
  191. package/dist/styles/resizable-region.css +158 -0
  192. package/dist/styles/segmented-control.css +10 -7
  193. package/dist/styles/select.css +115 -2
  194. package/dist/styles/skeleton.css +31 -0
  195. package/dist/styles/split-view.css +35 -0
  196. package/dist/styles/state-banner.css +49 -10
  197. package/dist/styles/styles.css +7 -5
  198. package/dist/styles/sunken-panel.css +22 -0
  199. package/dist/styles/surface-scaffold.css +51 -0
  200. package/dist/styles/tab-bar.css +24 -0
  201. package/dist/styles/tab-scaffold.css +85 -0
  202. package/dist/styles/token-search-field.css +14 -2
  203. package/dist/styles/toolbar-control-group.css +224 -6
  204. package/dist/styles/toolbar-text.css +65 -2
  205. package/dist/styles/toolbar.css +47 -2
  206. package/dist/styles/webawesome.css +165 -0
  207. package/dist/styles/workbench.css +187 -0
  208. package/dist/sunken-panel.d.ts +20 -0
  209. package/dist/sunken-panel.js +3 -0
  210. package/dist/sunken-panel.js.map +1 -0
  211. package/dist/surface-scaffold.d.ts +26 -0
  212. package/dist/surface-scaffold.js +3 -0
  213. package/dist/surface-scaffold.js.map +1 -0
  214. package/dist/tab-bar.d.ts +24 -6
  215. package/dist/tab-bar.js +1 -1
  216. package/dist/tab-scaffold.d.ts +31 -0
  217. package/dist/tab-scaffold.js +51 -0
  218. package/dist/tab-scaffold.js.map +1 -0
  219. package/dist/token-search-field.d.ts +30 -13
  220. package/dist/token-search-field.js +1 -1
  221. package/dist/toolbar-control-group.d.ts +33 -7
  222. package/dist/toolbar-control-group.js +1 -1
  223. package/dist/toolbar-text.d.ts +31 -4
  224. package/dist/toolbar-text.js +3 -1
  225. package/dist/toolbar.d.ts +10 -7
  226. package/dist/toolbar.js +1 -1
  227. package/dist/value-table.d.ts +7 -3
  228. package/dist/value-table.js +3 -1
  229. package/dist/webawesome.d.ts +1 -0
  230. package/dist/wire-catalog.d.ts +57 -0
  231. package/dist/wire-catalog.js +302 -0
  232. package/dist/wire-catalog.js.map +1 -0
  233. package/dist/wire-nav-stack.d.ts +18 -0
  234. package/dist/wire-nav-stack.js +228 -0
  235. package/dist/wire-nav-stack.js.map +1 -0
  236. package/dist/wire-resizable-regions.d.ts +1 -1
  237. package/dist/wire-resizable-regions.js +1 -1
  238. package/dist/wire-sidebar.d.ts +48 -0
  239. package/dist/wire-sidebar.js +147 -0
  240. package/dist/wire-sidebar.js.map +1 -0
  241. package/dist/wire-tab-bars.d.ts +19 -2
  242. package/dist/wire-tab-bars.js +1 -1
  243. package/dist/wire-tab-scaffold.d.ts +11 -0
  244. package/dist/wire-tab-scaffold.js +21 -0
  245. package/dist/wire-tab-scaffold.js.map +1 -0
  246. package/dist/wire-token-search-fields.d.ts +104 -4
  247. package/dist/wire-token-search-fields.js +1 -1
  248. package/dist/workbench.d.ts +44 -0
  249. package/dist/workbench.js +106 -0
  250. package/dist/workbench.js.map +1 -0
  251. package/docs/accessibility.md +137 -20
  252. package/docs/app-layouts.md +61 -0
  253. package/docs/catalog.md +364 -0
  254. package/docs/collapsible-panel.md +142 -0
  255. package/docs/component-contract.md +253 -26
  256. package/docs/component-selection.md +213 -57
  257. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  258. package/docs/design/templates/empty-state/filtered.svg +1 -0
  259. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  260. package/docs/design/templates/empty-state/with-action.svg +1 -0
  261. package/docs/design/templates/empty-state-dark.svg +1 -0
  262. package/docs/design/templates/empty-state.svg +1 -0
  263. package/docs/design/templates/list/compact-dark.svg +1 -0
  264. package/docs/design/templates/list/compact.svg +1 -0
  265. package/docs/design/templates/list/stack-dark.svg +1 -0
  266. package/docs/design/templates/list/stack.svg +1 -0
  267. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  268. package/docs/design/templates/list-action-row/default.svg +1 -0
  269. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  270. package/docs/design/templates/list-action-row/selected.svg +1 -0
  271. package/docs/design/templates/list-action-row-dark.svg +1 -0
  272. package/docs/design/templates/list-action-row.svg +1 -0
  273. package/docs/design/templates/list-dark.svg +1 -0
  274. package/docs/design/templates/list-header/action-dark.svg +1 -0
  275. package/docs/design/templates/list-header/action.svg +1 -0
  276. package/docs/design/templates/list-header/count-dark.svg +1 -0
  277. package/docs/design/templates/list-header/count.svg +1 -0
  278. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  279. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  280. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  281. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  282. package/docs/design/templates/list-header-dark.svg +1 -0
  283. package/docs/design/templates/list-header.svg +1 -0
  284. package/docs/design/templates/list-item/default-dark.svg +1 -0
  285. package/docs/design/templates/list-item/default.svg +1 -0
  286. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  287. package/docs/design/templates/list-item/multiline.svg +1 -0
  288. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  289. package/docs/design/templates/list-item/selected.svg +1 -0
  290. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  291. package/docs/design/templates/list-item/trailing.svg +1 -0
  292. package/docs/design/templates/list-item-dark.svg +1 -0
  293. package/docs/design/templates/list-item.svg +1 -0
  294. package/docs/design/templates/list.svg +1 -0
  295. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  296. package/docs/design/templates/segmented-control/equal.svg +1 -0
  297. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  298. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  299. package/docs/design/templates/segmented-control-dark.svg +1 -0
  300. package/docs/design/templates/segmented-control.svg +1 -0
  301. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  302. package/docs/design/templates/skeleton/avatar.svg +1 -0
  303. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  304. package/docs/design/templates/skeleton/block.svg +1 -0
  305. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  306. package/docs/design/templates/skeleton/lines.svg +1 -0
  307. package/docs/design/templates/skeleton-dark.svg +1 -0
  308. package/docs/design/templates/skeleton.svg +1 -0
  309. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  310. package/docs/design/templates/state-banner/danger.svg +1 -0
  311. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  312. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  313. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  314. package/docs/design/templates/state-banner/info.svg +1 -0
  315. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  316. package/docs/design/templates/state-banner/success.svg +1 -0
  317. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  318. package/docs/design/templates/state-banner/warning.svg +1 -0
  319. package/docs/design/templates/state-banner-dark.svg +1 -0
  320. package/docs/design/templates/state-banner.svg +1 -0
  321. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  322. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  323. package/docs/design/templates/tab-bar-dark.svg +1 -0
  324. package/docs/design/templates/tab-bar.svg +1 -0
  325. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  326. package/docs/design/templates/token-search-field/empty.svg +1 -0
  327. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  328. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  329. package/docs/design/templates/token-search-field-dark.svg +1 -0
  330. package/docs/design/templates/token-search-field.svg +1 -0
  331. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  332. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  333. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  334. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  335. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  336. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  337. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  338. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  339. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  340. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  341. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  342. package/docs/design/templates/toolbar-control-group.svg +1 -0
  343. package/docs/design/templates/toolbar-dark.svg +1 -0
  344. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  345. package/docs/design/templates/toolbar-text/default.svg +1 -0
  346. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  347. package/docs/design/templates/toolbar-text/large.svg +1 -0
  348. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  349. package/docs/design/templates/toolbar-text/small.svg +1 -0
  350. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  351. package/docs/design/templates/toolbar-text.svg +1 -0
  352. package/docs/design/templates/toolbar.svg +1 -0
  353. package/docs/design/templates/value-table/details-dark.svg +1 -0
  354. package/docs/design/templates/value-table/details.svg +1 -0
  355. package/docs/design/templates/value-table-dark.svg +1 -0
  356. package/docs/design/templates/value-table.svg +1 -0
  357. package/docs/design/templates.md +128 -0
  358. package/docs/design-philosophy.md +33 -11
  359. package/docs/device-class.md +54 -0
  360. package/docs/examples/application-ui-profile.json +60 -0
  361. package/docs/examples/command-palette-adapter.tsx +67 -17
  362. package/docs/examples/component-catalog-extension-v2.json +80 -0
  363. package/docs/examples/component-catalog-extension.json +45 -0
  364. package/docs/layout.md +98 -37
  365. package/docs/nav-stack.md +77 -0
  366. package/docs/recipes.md +75 -19
  367. package/docs/split-view.md +55 -0
  368. package/docs/sunken-panel.md +53 -0
  369. package/docs/surface-scaffold.md +25 -0
  370. package/docs/tab-scaffold.md +52 -0
  371. package/docs/type-contracts.md +127 -0
  372. package/docs/ui-analyzer.md +118 -0
  373. package/docs/ui-doctor.md +91 -0
  374. package/docs/ui-evaluator.md +122 -0
  375. package/docs/ux-demo.md +24 -13
  376. package/docs/webawesome-theme.md +82 -8
  377. package/docs/workbench.md +123 -0
  378. package/doctor/cli.mjs +115 -0
  379. package/doctor/config.schema.json +68 -0
  380. package/doctor/eslint-diagnostics.d.mts +24 -0
  381. package/doctor/eslint-diagnostics.mjs +24 -0
  382. package/doctor/index.d.mts +116 -0
  383. package/doctor/index.mjs +1272 -0
  384. package/doctor/report.schema.json +118 -0
  385. package/evaluator/cli.mjs +89 -0
  386. package/evaluator/index.d.mts +90 -0
  387. package/evaluator/index.mjs +1138 -0
  388. package/evaluator/report.schema.json +152 -0
  389. package/llms.txt +253 -43
  390. package/package.json +180 -37
  391. package/traversal-exclusions.mjs +27 -0
  392. package/ux-demo/recipes/app-shell.tsx +222 -13
  393. package/ux-demo/recipes/collapsible-sidebar.tsx +229 -0
  394. package/ux-demo/recipes/compact-toolbar.tsx +115 -12
  395. package/ux-demo/recipes/composer-form.tsx +119 -18
  396. package/ux-demo/recipes/list-detail-dialog.tsx +197 -0
  397. package/ux-demo/recipes/list-workspace-states.tsx +175 -9
  398. package/ux-demo/recipes/loaders.ts +13 -4
  399. package/ux-demo/recipes/loading-inspector.tsx +186 -0
  400. package/ux-demo/recipes/mount-recipe.ts +31 -5
  401. package/ux-demo/recipes/navigation-sidebar.tsx +122 -11
  402. package/ux-demo/recipes/navigation-stack.tsx +118 -0
  403. package/ux-demo/recipes/recipes.css +143 -18
  404. package/ux-demo/recipes/types.ts +9 -1
  405. package/ux-demo/recipes/workspace-header.tsx +68 -3
  406. package/dist/browser/dialog-header.js +0 -5
  407. package/dist/browser/menu-action-row.js +0 -3
  408. package/dist/browser/menu-item.js +0 -3
  409. package/dist/browser/page-header.js +0 -3
  410. package/dist/chunk-2PES33HS.js +0 -13
  411. package/dist/chunk-2PES33HS.js.map +0 -1
  412. package/dist/chunk-55DATV3A.js +0 -10
  413. package/dist/chunk-55DATV3A.js.map +0 -1
  414. package/dist/chunk-7BR3DO2A.js.map +0 -1
  415. package/dist/chunk-7LDCTU7D.js +0 -134
  416. package/dist/chunk-7LDCTU7D.js.map +0 -1
  417. package/dist/chunk-AQNKJRFH.js +0 -79
  418. package/dist/chunk-AQNKJRFH.js.map +0 -1
  419. package/dist/chunk-CTQKI2XL.js +0 -28
  420. package/dist/chunk-CTQKI2XL.js.map +0 -1
  421. package/dist/chunk-DAFFDO33.js +0 -14
  422. package/dist/chunk-DAFFDO33.js.map +0 -1
  423. package/dist/chunk-EGHL5S4P.js +0 -33
  424. package/dist/chunk-EGHL5S4P.js.map +0 -1
  425. package/dist/chunk-GY5WH7TO.js +0 -10
  426. package/dist/chunk-GY5WH7TO.js.map +0 -1
  427. package/dist/chunk-H5AGGVU5.js +0 -75
  428. package/dist/chunk-H5AGGVU5.js.map +0 -1
  429. package/dist/chunk-K3G72I6D.js +0 -24
  430. package/dist/chunk-K3G72I6D.js.map +0 -1
  431. package/dist/chunk-M5JRI6MN.js +0 -27
  432. package/dist/chunk-M5JRI6MN.js.map +0 -1
  433. package/dist/chunk-MBR3TYNL.js +0 -14
  434. package/dist/chunk-MBR3TYNL.js.map +0 -1
  435. package/dist/chunk-MFKMHK5W.js +0 -10
  436. package/dist/chunk-MFKMHK5W.js.map +0 -1
  437. package/dist/chunk-MQIZAD4A.js.map +0 -1
  438. package/dist/chunk-NPPD2A6O.js +0 -40
  439. package/dist/chunk-NPPD2A6O.js.map +0 -1
  440. package/dist/chunk-R6JHHBKQ.js +0 -19
  441. package/dist/chunk-R6JHHBKQ.js.map +0 -1
  442. package/dist/chunk-S3TPM2LP.js +0 -23
  443. package/dist/chunk-S3TPM2LP.js.map +0 -1
  444. package/dist/chunk-TRNBHPNW.js.map +0 -1
  445. package/dist/chunk-VHW5YNIB.js +0 -17
  446. package/dist/chunk-VHW5YNIB.js.map +0 -1
  447. package/dist/chunk-WVPYVDXY.js +0 -15
  448. package/dist/chunk-WVPYVDXY.js.map +0 -1
  449. package/dist/chunk-XZXRLY5Q.js +0 -33
  450. package/dist/chunk-XZXRLY5Q.js.map +0 -1
  451. package/dist/dialog-header.d.ts +0 -15
  452. package/dist/dialog-header.js +0 -5
  453. package/dist/dialog-header.js.map +0 -1
  454. package/dist/menu-action-row.js +0 -4
  455. package/dist/menu-action-row.js.map +0 -1
  456. package/dist/menu-header.d.ts +0 -41
  457. package/dist/menu-header.js +0 -6
  458. package/dist/menu-header.js.map +0 -1
  459. package/dist/menu-item.d.ts +0 -31
  460. package/dist/menu-item.js +0 -4
  461. package/dist/menu-item.js.map +0 -1
  462. package/dist/page-header.d.ts +0 -9
  463. package/dist/page-header.js +0 -3
  464. package/dist/page-header.js.map +0 -1
  465. package/dist/styles/dialog-header.css +0 -87
  466. package/dist/styles/menu-action-row.css +0 -154
  467. package/dist/styles/menu-header.css +0 -143
  468. package/dist/styles/menu-item.css +0 -118
  469. package/dist/styles/page-header.css +0 -26
  470. package/ux-demo/recipes/master-detail-dialog.tsx +0 -45
@@ -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,154 @@
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
+ }
302
+
303
+ /* Dialog content follows the compact surface inset, while its action region
304
+ retains the roomier homogeneous-group step. Keep these independent of
305
+ Web Awesome's shared --spacing property so applications can tune the
306
+ header without accidentally moving body or footer content. */
307
+ wa-dialog::part(header) {
308
+ padding: var(--kui-wa-surface-inset);
309
+ }
310
+
311
+ wa-dialog::part(body) {
312
+ padding: var(--kui-wa-surface-inset);
313
+ }
314
+
315
+ wa-dialog::part(footer) {
316
+ padding: var(--kui-wa-container-inset);
317
+ }
318
+
319
+ /* Dialogs that provide their own dismissal affordance can opt out of Web
320
+ Awesome's header action region without reaching through the shadow root.
321
+ `header-actions` is a directly exported part, so it must be targeted from
322
+ the host rather than chained through the `dialog` and `header` parts. */
323
+ wa-dialog.hide-actions::part(header-actions) {
324
+ display: none;
325
+ }
326
+
327
+ wa-callout {
328
+ padding: var(--kui-wa-surface-inset) !important;
329
+ }
330
+
331
+ wa-include {
332
+ padding: var(--kui-wa-surface-inset);
333
+ }
334
+
335
+ /* Interactive and item chrome follows the content-item 8px inset. */
336
+ wa-tab::part(tab) {
337
+ padding: var(--kui-wa-control-inset);
338
+ }
339
+
340
+ wa-tab-panel {
341
+ --padding: var(--kui-wa-container-inset) 0 !important;
342
+ }
343
+
344
+ wa-tree-item::part(item) {
345
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
346
+ padding-inline-end: var(--kui-wa-control-inset);
347
+ border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
348
+ }
349
+
350
+ wa-tag {
351
+ padding-inline: var(--kui-wa-control-inset) !important;
352
+ }
353
+
354
+ wa-dropdown-item {
355
+ padding-inline: var(--kui-wa-control-inset) !important;
356
+ }
357
+
251
358
  wa-popover {
252
359
  --arrow-size: var(--kui-wa-popover-arrow-size);
253
360
  }
361
+
362
+ /* A form field's top label is inset by the field's own border + inline padding
363
+ (1px + 8px = 9px) so the label text lines up with the value inside the field,
364
+ and it is styled exactly like a ListHeader label: uppercase, xs, quiet. */
365
+ :is(
366
+ wa-checkbox-group,
367
+ wa-color-picker,
368
+ wa-input,
369
+ wa-known-date,
370
+ wa-number-input,
371
+ wa-radio-group,
372
+ wa-select,
373
+ wa-textarea,
374
+ wa-time-input
375
+ )::part(form-control-label),
376
+ wa-otp-input::part(label),
377
+ wa-slider::part(label) {
378
+ padding-inline: calc(
379
+ var(--wa-form-control-border-width) +
380
+ var(--wa-form-control-padding-inline)
381
+ );
382
+ color: var(--kui-color-neutral-on-quiet, var(--wa-color-text-quiet));
383
+ font-size: var(--kui-font-xs, var(--wa-font-size-xs));
384
+ font-weight: 650;
385
+ letter-spacing: 0.04em;
386
+ line-height: var(--wa-line-height-condensed);
387
+ text-transform: uppercase;
388
+ }
389
+
390
+ /* Checkbox/radio groups and the color picker have no bordered field shell,
391
+ so their control regions need the content-item's 8px inline outer inset. */
392
+ :is(wa-checkbox-group, wa-color-picker, wa-radio-group)::part(
393
+ form-control-input
394
+ ) {
395
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
396
+ }
397
+
398
+ wa-slider::part(slider) {
399
+ margin-inline: var(--kui-layout-inline-margin, 0.5rem);
400
+ }
401
+
402
+ /* Secondary captions and hints align with the value inside bordered fields:
403
+ 1px border + 8px field padding = a 9px logical inset. */
404
+ wa-known-date::part(field-label),
405
+ :is(
406
+ wa-input,
407
+ wa-known-date,
408
+ wa-number-input,
409
+ wa-otp-input,
410
+ wa-select,
411
+ wa-textarea,
412
+ wa-time-input
413
+ )::part(hint) {
414
+ padding-inline: calc(
415
+ var(--wa-form-control-border-width) +
416
+ var(--wa-form-control-padding-inline)
417
+ );
418
+ }
254
419
  }
255
420
 
256
421
  @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"]}
@@ -1,4 +1,5 @@
1
- import { SafeHtml } from 'kerfjs';
1
+ import * as kerfjs from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2
3
 
3
4
  interface TokenSearchToken {
4
5
  value: string;
@@ -6,7 +7,15 @@ interface TokenSearchToken {
6
7
  offset?: number;
7
8
  accessibleLabel?: string;
8
9
  }
9
- interface TokenSearchFieldProps {
10
+ type TokenSearchEditorAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
11
+ 'data-component'?: never;
12
+ 'data-key'?: never;
13
+ 'data-morph-skip'?: never;
14
+ 'data-token-search-editor'?: never;
15
+ 'data-token-count'?: never;
16
+ 'data-placeholder'?: never;
17
+ }>;
18
+ interface TokenSearchFieldBaseProps {
10
19
  id: string;
11
20
  label: string;
12
21
  query?: string;
@@ -15,29 +24,37 @@ interface TokenSearchFieldProps {
15
24
  tokenPlaceholder?: string;
16
25
  disabled?: boolean;
17
26
  autofocus?: boolean;
18
- /** Allow an empty field to render as one iconic action. */
19
- collapsible?: boolean;
20
- /** Keep an empty collapsible field open while the application owns focus. */
21
- expanded?: boolean;
22
- expandAction?: string;
23
- expandLabel?: string;
24
- leading?: SafeHtml;
25
- trailing?: SafeHtml;
27
+ leading?: KerfUiContent;
28
+ trailing?: KerfUiContent;
26
29
  editAction?: string;
27
30
  removeAction?: string;
28
31
  clearAction?: string;
29
32
  clearLabel?: string;
30
33
  className?: string;
31
- editorAttributes?: Readonly<Record<`data-${string}`, string>>;
34
+ editorAttributes?: TokenSearchEditorAttributes;
32
35
  }
36
+ type TokenSearchCollapsibleProps = {
37
+ /** Allow an empty field to render as one iconic action. */
38
+ collapsible: true;
39
+ /** Keep an empty collapsible field open while the application owns focus. */
40
+ expanded?: boolean;
41
+ expandAction?: string;
42
+ expandLabel?: string;
43
+ } | {
44
+ collapsible?: false;
45
+ expanded?: never;
46
+ expandAction?: never;
47
+ expandLabel?: never;
48
+ };
49
+ type TokenSearchFieldProps = TokenSearchFieldBaseProps & TokenSearchCollapsibleProps;
33
50
  interface TokenSearchFieldValue {
34
51
  query: string;
35
52
  tokens: TokenSearchToken[];
36
53
  }
37
- declare function TokenSearchField({ id, label, query, tokens, placeholder, tokenPlaceholder, disabled, autofocus, collapsible, expanded, expandAction, expandLabel, leading, trailing, editAction, removeAction, clearAction, clearLabel, className, editorAttributes, }: TokenSearchFieldProps): SafeHtml;
54
+ declare function TokenSearchField({ id, label, query, tokens, placeholder, tokenPlaceholder, disabled, autofocus, collapsible, expanded, expandAction, expandLabel, leading, trailing, editAction, removeAction, clearAction, clearLabel, className, editorAttributes, }: TokenSearchFieldProps): kerfjs.SafeHtml;
38
55
  /** Read editable text and ordered token offsets from a rendered TokenSearchField editor. */
39
56
  declare function readTokenSearchField(editor: HTMLElement, knownTokens?: readonly TokenSearchToken[]): TokenSearchFieldValue;
40
57
  /** Focus an editor and place its caret at a text offset, skipping atomic token chips. */
41
58
  declare function placeTokenSearchCaret(editor: HTMLElement, offset?: number): void;
42
59
 
43
- export { TokenSearchField, type TokenSearchFieldProps, type TokenSearchFieldValue, type TokenSearchToken, placeTokenSearchCaret, readTokenSearchField };
60
+ export { type TokenSearchEditorAttributes, TokenSearchField, type TokenSearchFieldProps, type TokenSearchFieldValue, type TokenSearchToken, placeTokenSearchCaret, readTokenSearchField };
@@ -1,4 +1,4 @@
1
- export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-7LDCTU7D.js';
1
+ export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-TIGSG6BX.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=token-search-field.js.map