@kerfjs/ui 4.4.1 → 4.5.0-beta.1

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 (499) hide show
  1. package/README.md +425 -42
  2. package/ai/application-ui-diagnostic-ids-v1.json +92 -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 +102 -0
  12. package/ai/compile-time-contracts-v1.schema.json +49 -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 +319 -0
  17. package/ai/component-catalog-v2.d.ts +67 -0
  18. package/ai/component-catalog-v2.json +4675 -0
  19. package/ai/component-catalog-v2.schema.json +246 -0
  20. package/ai/component-catalog.json +5826 -0
  21. package/ai/component-catalog.schema.json +95 -0
  22. package/ai/public-api-signatures-v1.md +1719 -0
  23. package/ai/skill.md +129 -21
  24. package/ai/webawesome-jsx-signatures-v1.md +106 -0
  25. package/analyzer/cli.mjs +46 -0
  26. package/analyzer/index.d.mts +45 -0
  27. package/analyzer/index.mjs +737 -0
  28. package/analyzer/report.schema.json +66 -0
  29. package/dist/app-tab.d.ts +14 -2
  30. package/dist/app-tab.js +3 -1
  31. package/dist/browser/app-tab.js +3 -2
  32. package/dist/browser/disclosure-arrow.js +4 -0
  33. package/dist/browser/empty-state.js +3 -3
  34. package/dist/browser/floating-toolbar.js +3 -0
  35. package/dist/browser/list-action-row.js +4 -0
  36. package/dist/browser/list-header.js +6 -0
  37. package/dist/browser/list-inset-control.js +3 -0
  38. package/dist/browser/list-inset-text.js +3 -0
  39. package/dist/browser/list-item.js +4 -0
  40. package/dist/browser/list.js +3 -0
  41. package/dist/browser/loading-spinner.js +2 -2
  42. package/dist/browser/lucide-icon.js +2 -2
  43. package/dist/browser/pane.js +3 -0
  44. package/dist/browser/panel-header.js +7 -0
  45. package/dist/browser/resizable-region.js +2 -2
  46. package/dist/browser/segmented-control.js +3 -2
  47. package/dist/browser/select.js +4 -3
  48. package/dist/browser/skeleton.js +3 -0
  49. package/dist/browser/state-banner.js +3 -2
  50. package/dist/browser/sunken-panel.js +3 -0
  51. package/dist/browser/tab-bar.js +2 -2
  52. package/dist/browser/token-search-field.js +4 -0
  53. package/dist/browser/toolbar-control-group.js +2 -2
  54. package/dist/browser/toolbar-text.js +3 -2
  55. package/dist/browser/toolbar.js +2 -2
  56. package/dist/browser/value-table.js +3 -2
  57. package/dist/catalog-resources.d.ts +34 -0
  58. package/dist/catalog-resources.js +22 -0
  59. package/dist/catalog-resources.js.map +1 -0
  60. package/dist/catalog.d.ts +150 -0
  61. package/dist/catalog.js +377 -0
  62. package/dist/catalog.js.map +1 -0
  63. package/dist/chunk-5VTB2BKP.js +35 -0
  64. package/dist/chunk-5VTB2BKP.js.map +1 -0
  65. package/dist/chunk-6WTETUZ6.js +21 -0
  66. package/dist/chunk-6WTETUZ6.js.map +1 -0
  67. package/dist/chunk-7KEUJIIC.js +218 -0
  68. package/dist/chunk-7KEUJIIC.js.map +1 -0
  69. package/dist/chunk-7XRDUG4Y.js +58 -0
  70. package/dist/chunk-7XRDUG4Y.js.map +1 -0
  71. package/dist/chunk-B3A3IVO5.js +83 -0
  72. package/dist/chunk-B3A3IVO5.js.map +1 -0
  73. package/dist/chunk-DPDBVKNA.js +113 -0
  74. package/dist/chunk-DPDBVKNA.js.map +1 -0
  75. package/dist/chunk-FEAMR7S4.js +68 -0
  76. package/dist/chunk-FEAMR7S4.js.map +1 -0
  77. package/dist/chunk-FEY65TBV.js +15 -0
  78. package/dist/chunk-FEY65TBV.js.map +1 -0
  79. package/dist/{chunk-TRNBHPNW.js → chunk-IJBSZ4NX.js} +11 -8
  80. package/dist/chunk-IJBSZ4NX.js.map +1 -0
  81. package/dist/chunk-J5BFYY7Q.js +35 -0
  82. package/dist/chunk-J5BFYY7Q.js.map +1 -0
  83. package/dist/chunk-JRKSK2HX.js +79 -0
  84. package/dist/chunk-JRKSK2HX.js.map +1 -0
  85. package/dist/chunk-KWWR5VMS.js +45 -0
  86. package/dist/chunk-KWWR5VMS.js.map +1 -0
  87. package/dist/chunk-LPOMRC4C.js +25 -0
  88. package/dist/chunk-LPOMRC4C.js.map +1 -0
  89. package/dist/chunk-M7JBER5U.js +41 -0
  90. package/dist/chunk-M7JBER5U.js.map +1 -0
  91. package/dist/chunk-NENBUYX5.js +79 -0
  92. package/dist/chunk-NENBUYX5.js.map +1 -0
  93. package/dist/chunk-NWSEP5RT.js +117 -0
  94. package/dist/chunk-NWSEP5RT.js.map +1 -0
  95. package/dist/chunk-OJWWHFH3.js +426 -0
  96. package/dist/chunk-OJWWHFH3.js.map +1 -0
  97. package/dist/chunk-PSKN344N.js +114 -0
  98. package/dist/chunk-PSKN344N.js.map +1 -0
  99. package/dist/chunk-PX3YSS5C.js +32 -0
  100. package/dist/chunk-PX3YSS5C.js.map +1 -0
  101. package/dist/chunk-QO55FN2Y.js +20 -0
  102. package/dist/chunk-QO55FN2Y.js.map +1 -0
  103. package/dist/chunk-R7ZWUN64.js +38 -0
  104. package/dist/chunk-R7ZWUN64.js.map +1 -0
  105. package/dist/chunk-RKVQEH4J.js +61 -0
  106. package/dist/chunk-RKVQEH4J.js.map +1 -0
  107. package/dist/chunk-SRSJO5QE.js +40 -0
  108. package/dist/chunk-SRSJO5QE.js.map +1 -0
  109. package/dist/chunk-SYDMYBPG.js +31 -0
  110. package/dist/chunk-SYDMYBPG.js.map +1 -0
  111. package/dist/chunk-TB6DY7H5.js +25 -0
  112. package/dist/chunk-TB6DY7H5.js.map +1 -0
  113. package/dist/chunk-UFZKLBCF.js +108 -0
  114. package/dist/chunk-UFZKLBCF.js.map +1 -0
  115. package/dist/{chunk-MQIZAD4A.js → chunk-UKKSMZYT.js} +76 -22
  116. package/dist/chunk-UKKSMZYT.js.map +1 -0
  117. package/dist/chunk-W5L2JSBY.js +40 -0
  118. package/dist/chunk-W5L2JSBY.js.map +1 -0
  119. package/dist/chunk-Y45PPBDV.js +105 -0
  120. package/dist/chunk-Y45PPBDV.js.map +1 -0
  121. package/dist/chunk-Y6LYKFXY.js +43 -0
  122. package/dist/chunk-Y6LYKFXY.js.map +1 -0
  123. package/dist/collapsible-panel.d.ts +66 -0
  124. package/dist/collapsible-panel.js +63 -0
  125. package/dist/collapsible-panel.js.map +1 -0
  126. package/dist/device-class.d.ts +62 -0
  127. package/dist/device-class.js +103 -0
  128. package/dist/device-class.js.map +1 -0
  129. package/dist/disclosure-arrow.d.ts +14 -0
  130. package/dist/disclosure-arrow.js +4 -0
  131. package/dist/disclosure-arrow.js.map +1 -0
  132. package/dist/divider-sides-267FA7sY.d.ts +4 -0
  133. package/dist/empty-state.d.ts +1 -1
  134. package/dist/empty-state.js +1 -1
  135. package/dist/floating-toolbar.d.ts +28 -0
  136. package/dist/floating-toolbar.js +3 -0
  137. package/dist/floating-toolbar.js.map +1 -0
  138. package/dist/index.d.ts +20 -9
  139. package/dist/index.js +29 -18
  140. package/dist/list-action-row.d.ts +52 -0
  141. package/dist/list-action-row.js +5 -0
  142. package/dist/list-action-row.js.map +1 -0
  143. package/dist/list-header.d.ts +64 -0
  144. package/dist/list-header.js +7 -0
  145. package/dist/list-header.js.map +1 -0
  146. package/dist/list-inset-control.d.ts +16 -0
  147. package/dist/list-inset-control.js +3 -0
  148. package/dist/list-inset-control.js.map +1 -0
  149. package/dist/list-inset-text.d.ts +25 -0
  150. package/dist/list-inset-text.js +3 -0
  151. package/dist/list-inset-text.js.map +1 -0
  152. package/dist/list-item.d.ts +33 -0
  153. package/dist/list-item.js +5 -0
  154. package/dist/list-item.js.map +1 -0
  155. package/dist/list.d.ts +19 -0
  156. package/dist/list.js +3 -0
  157. package/dist/list.js.map +1 -0
  158. package/dist/loading-spinner.js +1 -1
  159. package/dist/nav-stack.d.ts +38 -0
  160. package/dist/nav-stack.js +5 -0
  161. package/dist/nav-stack.js.map +1 -0
  162. package/dist/pane.d.ts +49 -0
  163. package/dist/pane.js +4 -0
  164. package/dist/pane.js.map +1 -0
  165. package/dist/panel-header.d.ts +42 -0
  166. package/dist/panel-header.js +7 -0
  167. package/dist/panel-header.js.map +1 -0
  168. package/dist/resizable-region.d.ts +3 -1
  169. package/dist/resizable-region.js +1 -1
  170. package/dist/segmented-control.d.ts +8 -6
  171. package/dist/segmented-control.js +2 -1
  172. package/dist/select-register.d.ts +5 -1
  173. package/dist/select-register.js +3 -0
  174. package/dist/select-register.js.map +1 -1
  175. package/dist/select.d.ts +15 -6
  176. package/dist/select.js +2 -1
  177. package/dist/skeleton.d.ts +24 -0
  178. package/dist/skeleton.js +3 -0
  179. package/dist/skeleton.js.map +1 -0
  180. package/dist/split-view.d.ts +42 -0
  181. package/dist/split-view.js +81 -0
  182. package/dist/split-view.js.map +1 -0
  183. package/dist/state-banner.d.ts +8 -3
  184. package/dist/state-banner.js +2 -1
  185. package/dist/styles/app-tab.css +152 -0
  186. package/dist/styles/catalog.css +575 -0
  187. package/dist/styles/collapsible-panel.css +146 -0
  188. package/dist/styles/disclosure-arrow.css +23 -0
  189. package/dist/styles/empty-state.css +47 -0
  190. package/dist/styles/floating-toolbar.css +38 -0
  191. package/dist/styles/foundation.css +362 -0
  192. package/dist/styles/layout.css +55 -0
  193. package/dist/styles/list-action-row.css +160 -0
  194. package/dist/styles/list-header.css +160 -0
  195. package/dist/styles/list-inset-control.css +7 -0
  196. package/dist/styles/list-inset-text.css +14 -0
  197. package/dist/styles/list-item.css +123 -0
  198. package/dist/styles/list.css +43 -0
  199. package/dist/styles/loading-spinner.css +21 -0
  200. package/dist/styles/lucide-icon.css +6 -0
  201. package/dist/styles/nav-stack.css +111 -0
  202. package/dist/styles/pane.css +62 -0
  203. package/dist/styles/panel-header.css +64 -0
  204. package/dist/styles/resizable-region.css +111 -0
  205. package/{src → dist/styles}/segmented-control.css +58 -31
  206. package/dist/styles/select.css +140 -0
  207. package/dist/styles/skeleton.css +31 -0
  208. package/dist/styles/split-view.css +35 -0
  209. package/dist/styles/state-banner.css +198 -0
  210. package/dist/styles/styles.css +24 -0
  211. package/dist/styles/sunken-panel.css +22 -0
  212. package/dist/styles/tab-bar.css +45 -0
  213. package/dist/styles/tab-scaffold.css +84 -0
  214. package/dist/styles/token-search-field.css +289 -0
  215. package/dist/styles/toolbar-control-group.css +225 -0
  216. package/dist/styles/toolbar-text.css +92 -0
  217. package/dist/styles/toolbar.css +97 -0
  218. package/dist/styles/value-table.css +75 -0
  219. package/dist/styles/webawesome.css +399 -0
  220. package/dist/styles/workbench.css +94 -0
  221. package/dist/sunken-panel.d.ts +19 -0
  222. package/dist/sunken-panel.js +3 -0
  223. package/dist/sunken-panel.js.map +1 -0
  224. package/dist/tab-bar.d.ts +10 -2
  225. package/dist/tab-bar.js +1 -1
  226. package/dist/tab-scaffold.d.ts +30 -0
  227. package/dist/tab-scaffold.js +51 -0
  228. package/dist/tab-scaffold.js.map +1 -0
  229. package/dist/token-search-field.d.ts +59 -0
  230. package/dist/token-search-field.js +4 -0
  231. package/dist/token-search-field.js.map +1 -0
  232. package/dist/toolbar-control-group.d.ts +11 -5
  233. package/dist/toolbar-control-group.js +1 -1
  234. package/dist/toolbar-text.d.ts +31 -4
  235. package/dist/toolbar-text.js +2 -1
  236. package/dist/toolbar.d.ts +5 -3
  237. package/dist/toolbar.js +1 -1
  238. package/dist/value-table.d.ts +13 -3
  239. package/dist/value-table.js +2 -1
  240. package/dist/webawesome.d.ts +100 -0
  241. package/dist/webawesome.js +3 -0
  242. package/dist/webawesome.js.map +1 -0
  243. package/dist/wire-catalog.d.ts +57 -0
  244. package/dist/wire-catalog.js +302 -0
  245. package/dist/wire-catalog.js.map +1 -0
  246. package/dist/wire-nav-stack.d.ts +15 -0
  247. package/dist/wire-nav-stack.js +103 -0
  248. package/dist/wire-nav-stack.js.map +1 -0
  249. package/dist/wire-resizable-regions.d.ts +1 -1
  250. package/dist/wire-resizable-regions.js +1 -1
  251. package/dist/wire-sidebar.d.ts +43 -0
  252. package/dist/wire-sidebar.js +128 -0
  253. package/dist/wire-sidebar.js.map +1 -0
  254. package/dist/wire-tab-bars.d.ts +18 -2
  255. package/dist/wire-tab-bars.js +1 -1
  256. package/dist/wire-tab-scaffold.d.ts +11 -0
  257. package/dist/wire-tab-scaffold.js +21 -0
  258. package/dist/wire-tab-scaffold.js.map +1 -0
  259. package/dist/wire-token-search-fields.d.ts +111 -0
  260. package/dist/wire-token-search-fields.js +5 -0
  261. package/dist/wire-token-search-fields.js.map +1 -0
  262. package/dist/workbench.d.ts +33 -0
  263. package/dist/workbench.js +64 -0
  264. package/dist/workbench.js.map +1 -0
  265. package/docs/accessibility.md +124 -4
  266. package/docs/app-layouts.md +61 -0
  267. package/docs/catalog.md +364 -0
  268. package/docs/collapsible-panel.md +129 -0
  269. package/docs/component-contract.md +312 -5
  270. package/docs/component-selection.md +219 -0
  271. package/docs/design/templates/empty-state/filtered-dark.svg +1 -0
  272. package/docs/design/templates/empty-state/filtered.svg +1 -0
  273. package/docs/design/templates/empty-state/with-action-dark.svg +1 -0
  274. package/docs/design/templates/empty-state/with-action.svg +1 -0
  275. package/docs/design/templates/empty-state-dark.svg +1 -0
  276. package/docs/design/templates/empty-state.svg +1 -0
  277. package/docs/design/templates/list/compact-dark.svg +1 -0
  278. package/docs/design/templates/list/compact.svg +1 -0
  279. package/docs/design/templates/list/stack-dark.svg +1 -0
  280. package/docs/design/templates/list/stack.svg +1 -0
  281. package/docs/design/templates/list-action-row/default-dark.svg +1 -0
  282. package/docs/design/templates/list-action-row/default.svg +1 -0
  283. package/docs/design/templates/list-action-row/selected-dark.svg +1 -0
  284. package/docs/design/templates/list-action-row/selected.svg +1 -0
  285. package/docs/design/templates/list-action-row-dark.svg +1 -0
  286. package/docs/design/templates/list-action-row.svg +1 -0
  287. package/docs/design/templates/list-dark.svg +1 -0
  288. package/docs/design/templates/list-header/action-dark.svg +1 -0
  289. package/docs/design/templates/list-header/action.svg +1 -0
  290. package/docs/design/templates/list-header/count-dark.svg +1 -0
  291. package/docs/design/templates/list-header/count.svg +1 -0
  292. package/docs/design/templates/list-header/toggle-collapsed-dark.svg +1 -0
  293. package/docs/design/templates/list-header/toggle-collapsed.svg +1 -0
  294. package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -0
  295. package/docs/design/templates/list-header/toggle-expanded.svg +1 -0
  296. package/docs/design/templates/list-header-dark.svg +1 -0
  297. package/docs/design/templates/list-header.svg +1 -0
  298. package/docs/design/templates/list-item/default-dark.svg +1 -0
  299. package/docs/design/templates/list-item/default.svg +1 -0
  300. package/docs/design/templates/list-item/multiline-dark.svg +1 -0
  301. package/docs/design/templates/list-item/multiline.svg +1 -0
  302. package/docs/design/templates/list-item/selected-dark.svg +1 -0
  303. package/docs/design/templates/list-item/selected.svg +1 -0
  304. package/docs/design/templates/list-item/trailing-dark.svg +1 -0
  305. package/docs/design/templates/list-item/trailing.svg +1 -0
  306. package/docs/design/templates/list-item-dark.svg +1 -0
  307. package/docs/design/templates/list-item.svg +1 -0
  308. package/docs/design/templates/list.svg +1 -0
  309. package/docs/design/templates/panel-header/icon-actions-dark.svg +1 -0
  310. package/docs/design/templates/panel-header/icon-actions.svg +1 -0
  311. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +1 -0
  312. package/docs/design/templates/panel-header/icon-summary-actions.svg +1 -0
  313. package/docs/design/templates/panel-header/no-icon-dark.svg +1 -0
  314. package/docs/design/templates/panel-header/no-icon.svg +1 -0
  315. package/docs/design/templates/panel-header/page-heading-dark.svg +1 -0
  316. package/docs/design/templates/panel-header/page-heading.svg +1 -0
  317. package/docs/design/templates/panel-header/title-only-dark.svg +1 -0
  318. package/docs/design/templates/panel-header/title-only.svg +1 -0
  319. package/docs/design/templates/panel-header-dark.svg +1 -0
  320. package/docs/design/templates/panel-header.svg +1 -0
  321. package/docs/design/templates/segmented-control/equal-dark.svg +1 -0
  322. package/docs/design/templates/segmented-control/equal.svg +1 -0
  323. package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -0
  324. package/docs/design/templates/segmented-control/pill-small.svg +1 -0
  325. package/docs/design/templates/segmented-control-dark.svg +1 -0
  326. package/docs/design/templates/segmented-control.svg +1 -0
  327. package/docs/design/templates/skeleton/avatar-dark.svg +1 -0
  328. package/docs/design/templates/skeleton/avatar.svg +1 -0
  329. package/docs/design/templates/skeleton/block-dark.svg +1 -0
  330. package/docs/design/templates/skeleton/block.svg +1 -0
  331. package/docs/design/templates/skeleton/lines-dark.svg +1 -0
  332. package/docs/design/templates/skeleton/lines.svg +1 -0
  333. package/docs/design/templates/skeleton-dark.svg +1 -0
  334. package/docs/design/templates/skeleton.svg +1 -0
  335. package/docs/design/templates/state-banner/danger-dark.svg +1 -0
  336. package/docs/design/templates/state-banner/danger.svg +1 -0
  337. package/docs/design/templates/state-banner/info-badge-dark.svg +1 -0
  338. package/docs/design/templates/state-banner/info-badge.svg +1 -0
  339. package/docs/design/templates/state-banner/info-dark.svg +1 -0
  340. package/docs/design/templates/state-banner/info.svg +1 -0
  341. package/docs/design/templates/state-banner/success-dark.svg +1 -0
  342. package/docs/design/templates/state-banner/success.svg +1 -0
  343. package/docs/design/templates/state-banner/warning-dark.svg +1 -0
  344. package/docs/design/templates/state-banner/warning.svg +1 -0
  345. package/docs/design/templates/state-banner-dark.svg +1 -0
  346. package/docs/design/templates/state-banner.svg +1 -0
  347. package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -0
  348. package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -0
  349. package/docs/design/templates/tab-bar-dark.svg +1 -0
  350. package/docs/design/templates/tab-bar.svg +1 -0
  351. package/docs/design/templates/token-search-field/empty-dark.svg +1 -0
  352. package/docs/design/templates/token-search-field/empty.svg +1 -0
  353. package/docs/design/templates/token-search-field/tokens-dark.svg +1 -0
  354. package/docs/design/templates/token-search-field/tokens.svg +1 -0
  355. package/docs/design/templates/token-search-field-dark.svg +1 -0
  356. package/docs/design/templates/token-search-field.svg +1 -0
  357. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -0
  358. package/docs/design/templates/toolbar/title-and-actions.svg +1 -0
  359. package/docs/design/templates/toolbar-control-group/borderless-single-dark.svg +1 -0
  360. package/docs/design/templates/toolbar-control-group/borderless-single.svg +1 -0
  361. package/docs/design/templates/toolbar-control-group/icon-buttons-dark.svg +1 -0
  362. package/docs/design/templates/toolbar-control-group/icon-buttons.svg +1 -0
  363. package/docs/design/templates/toolbar-control-group/push-buttons-dark.svg +1 -0
  364. package/docs/design/templates/toolbar-control-group/push-buttons.svg +1 -0
  365. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -0
  366. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -0
  367. package/docs/design/templates/toolbar-control-group-dark.svg +1 -0
  368. package/docs/design/templates/toolbar-control-group.svg +1 -0
  369. package/docs/design/templates/toolbar-dark.svg +1 -0
  370. package/docs/design/templates/toolbar-text/default-dark.svg +1 -0
  371. package/docs/design/templates/toolbar-text/default.svg +1 -0
  372. package/docs/design/templates/toolbar-text/large-dark.svg +1 -0
  373. package/docs/design/templates/toolbar-text/large.svg +1 -0
  374. package/docs/design/templates/toolbar-text/small-dark.svg +1 -0
  375. package/docs/design/templates/toolbar-text/small.svg +1 -0
  376. package/docs/design/templates/toolbar-text-dark.svg +1 -0
  377. package/docs/design/templates/toolbar-text.svg +1 -0
  378. package/docs/design/templates/toolbar.svg +1 -0
  379. package/docs/design/templates/value-table/details-dark.svg +1 -0
  380. package/docs/design/templates/value-table/details.svg +1 -0
  381. package/docs/design/templates/value-table-dark.svg +1 -0
  382. package/docs/design/templates/value-table.svg +1 -0
  383. package/docs/design/templates.md +130 -0
  384. package/docs/design-philosophy.md +59 -1
  385. package/docs/device-class.md +54 -0
  386. package/docs/examples/application-ui-profile.json +60 -0
  387. package/docs/examples/command-palette-adapter.tsx +120 -0
  388. package/docs/examples/component-catalog-extension-v2.json +81 -0
  389. package/docs/examples/component-catalog-extension.json +45 -0
  390. package/docs/layout.md +150 -0
  391. package/docs/nav-stack.md +56 -0
  392. package/docs/recipes.md +167 -0
  393. package/docs/split-view.md +49 -0
  394. package/docs/sunken-panel.md +53 -0
  395. package/docs/tab-scaffold.md +50 -0
  396. package/docs/type-contracts.md +102 -0
  397. package/docs/ui-analyzer.md +86 -0
  398. package/docs/ui-doctor.md +84 -0
  399. package/docs/ui-evaluator.md +122 -0
  400. package/docs/ux-demo.md +23 -9
  401. package/docs/webawesome-theme.md +87 -7
  402. package/docs/workbench.md +73 -0
  403. package/doctor/cli.mjs +115 -0
  404. package/doctor/config.schema.json +68 -0
  405. package/doctor/eslint-diagnostics.d.mts +8 -0
  406. package/doctor/eslint-diagnostics.mjs +7 -0
  407. package/doctor/index.d.mts +116 -0
  408. package/doctor/index.mjs +1257 -0
  409. package/doctor/report.schema.json +118 -0
  410. package/evaluator/cli.mjs +89 -0
  411. package/evaluator/index.d.mts +90 -0
  412. package/evaluator/index.mjs +1138 -0
  413. package/evaluator/report.schema.json +152 -0
  414. package/llms.txt +197 -14
  415. package/package.json +228 -46
  416. package/traversal-exclusions.mjs +27 -0
  417. package/ux-demo/recipes/app-shell.tsx +228 -0
  418. package/ux-demo/recipes/collapsible-sidebar.tsx +223 -0
  419. package/ux-demo/recipes/compact-toolbar.tsx +145 -0
  420. package/ux-demo/recipes/composer-form.tsx +151 -0
  421. package/ux-demo/recipes/list-detail-dialog.tsx +181 -0
  422. package/ux-demo/recipes/list-workspace-states.tsx +183 -0
  423. package/ux-demo/recipes/loaders.ts +36 -0
  424. package/ux-demo/recipes/loading-inspector.tsx +164 -0
  425. package/ux-demo/recipes/mount-recipe.ts +64 -0
  426. package/ux-demo/recipes/navigation-sidebar.tsx +137 -0
  427. package/ux-demo/recipes/navigation-stack.tsx +118 -0
  428. package/ux-demo/recipes/recipes.css +448 -0
  429. package/ux-demo/recipes/types.ts +19 -0
  430. package/ux-demo/recipes/workspace-header.tsx +67 -0
  431. package/dist/browser/dialog-header.js +0 -3
  432. package/dist/browser/menu-header.js +0 -3
  433. package/dist/browser/menu-item.js +0 -3
  434. package/dist/browser/page-header.js +0 -3
  435. package/dist/chunk-2PES33HS.js +0 -13
  436. package/dist/chunk-2PES33HS.js.map +0 -1
  437. package/dist/chunk-3O7ZEUW2.js +0 -27
  438. package/dist/chunk-3O7ZEUW2.js.map +0 -1
  439. package/dist/chunk-4HHCYSGT.js +0 -79
  440. package/dist/chunk-4HHCYSGT.js.map +0 -1
  441. package/dist/chunk-55DATV3A.js +0 -10
  442. package/dist/chunk-55DATV3A.js.map +0 -1
  443. package/dist/chunk-723YNJBH.js +0 -17
  444. package/dist/chunk-723YNJBH.js.map +0 -1
  445. package/dist/chunk-DAFFDO33.js +0 -14
  446. package/dist/chunk-DAFFDO33.js.map +0 -1
  447. package/dist/chunk-GY5WH7TO.js +0 -10
  448. package/dist/chunk-GY5WH7TO.js.map +0 -1
  449. package/dist/chunk-MBR3TYNL.js +0 -14
  450. package/dist/chunk-MBR3TYNL.js.map +0 -1
  451. package/dist/chunk-MFKMHK5W.js +0 -10
  452. package/dist/chunk-MFKMHK5W.js.map +0 -1
  453. package/dist/chunk-MQIZAD4A.js.map +0 -1
  454. package/dist/chunk-NHXX4JI5.js +0 -28
  455. package/dist/chunk-NHXX4JI5.js.map +0 -1
  456. package/dist/chunk-OPCJRCYO.js +0 -19
  457. package/dist/chunk-OPCJRCYO.js.map +0 -1
  458. package/dist/chunk-T5XNMVOI.js +0 -24
  459. package/dist/chunk-T5XNMVOI.js.map +0 -1
  460. package/dist/chunk-TRNBHPNW.js.map +0 -1
  461. package/dist/chunk-VHW5YNIB.js +0 -17
  462. package/dist/chunk-VHW5YNIB.js.map +0 -1
  463. package/dist/chunk-VKH2JLDZ.js +0 -10
  464. package/dist/chunk-VKH2JLDZ.js.map +0 -1
  465. package/dist/chunk-WVPYVDXY.js +0 -15
  466. package/dist/chunk-WVPYVDXY.js.map +0 -1
  467. package/dist/chunk-WY4CAEPG.js +0 -14
  468. package/dist/chunk-WY4CAEPG.js.map +0 -1
  469. package/dist/dialog-header.d.ts +0 -14
  470. package/dist/dialog-header.js +0 -3
  471. package/dist/dialog-header.js.map +0 -1
  472. package/dist/menu-header.d.ts +0 -15
  473. package/dist/menu-header.js +0 -3
  474. package/dist/menu-header.js.map +0 -1
  475. package/dist/menu-item.d.ts +0 -22
  476. package/dist/menu-item.js +0 -3
  477. package/dist/menu-item.js.map +0 -1
  478. package/dist/page-header.d.ts +0 -9
  479. package/dist/page-header.js +0 -3
  480. package/dist/page-header.js.map +0 -1
  481. package/src/app-tab.css +0 -20
  482. package/src/dialog-header.css +0 -9
  483. package/src/empty-state.css +0 -6
  484. package/src/foundation.css +0 -106
  485. package/src/loading-spinner.css +0 -4
  486. package/src/lucide-icon.css +0 -1
  487. package/src/menu-header.css +0 -13
  488. package/src/menu-item.css +0 -12
  489. package/src/page-header.css +0 -3
  490. package/src/resizable-region.css +0 -19
  491. package/src/select.css +0 -18
  492. package/src/state-banner.css +0 -31
  493. package/src/styles.css +0 -18
  494. package/src/tab-bar.css +0 -4
  495. package/src/toolbar-control-group.css +0 -25
  496. package/src/toolbar-text.css +0 -4
  497. package/src/toolbar.css +0 -9
  498. package/src/value-table.css +0 -5
  499. package/src/webawesome.css +0 -178
@@ -0,0 +1,94 @@
1
+ .kui-workbench {
2
+ display: flex;
3
+ min-width: 0;
4
+ min-height: 0;
5
+ height: 100%;
6
+ overflow: hidden;
7
+ background: var(--kui-color-surface);
8
+ }
9
+
10
+ /* Side rails. Collapsing snaps the flex track to zero (one reflow) while the
11
+ fixed-width content slides out via transform (composited, clipped) — never a
12
+ per-frame width animation. See docs/18 / the KF-7QKJRK catalog sidebar. */
13
+ .kui-workbench__rail {
14
+ flex: 0 0 var(--kui-workbench-rail-width, 17.5rem);
15
+ min-width: 0;
16
+ overflow: hidden;
17
+ background: var(--kui-color-surface);
18
+ }
19
+
20
+ .kui-workbench__rail--left {
21
+ border-inline-end: 1px solid var(--kui-color-border);
22
+ }
23
+
24
+ .kui-workbench__rail--right {
25
+ border-inline-start: 1px solid var(--kui-color-border);
26
+ }
27
+
28
+ .kui-workbench__rail[data-collapsed="true"] {
29
+ flex-basis: 0;
30
+ border-inline: 0;
31
+ }
32
+
33
+ .kui-workbench__center {
34
+ display: flex;
35
+ flex: 1;
36
+ min-width: 0;
37
+ min-height: 0;
38
+ overflow: hidden;
39
+ flex-direction: column;
40
+ }
41
+
42
+ .kui-workbench__main {
43
+ flex: 1;
44
+ min-height: 0;
45
+ overflow: auto;
46
+ }
47
+
48
+ /* Bottom drawer — the vertical analogue of a rail. */
49
+ .kui-workbench__drawer {
50
+ flex: 0 0 var(--kui-workbench-drawer-height, 13.75rem);
51
+ min-height: 0;
52
+ overflow: hidden;
53
+ border-block-start: 1px solid var(--kui-color-border);
54
+ background: var(--kui-color-surface);
55
+ }
56
+
57
+ .kui-workbench__drawer[data-collapsed="true"] {
58
+ flex-basis: 0;
59
+ border-block-start: 0;
60
+ }
61
+
62
+ /* The fixed-size sliding content. The rail/drawer keeps a definite size on its
63
+ content so the transform reads as a slide, not a squeeze. */
64
+ .kui-workbench__rail .kui-workbench__panel-content {
65
+ width: var(--kui-workbench-rail-width, 17.5rem);
66
+ height: 100%;
67
+ transition: transform 200ms ease;
68
+ }
69
+
70
+ .kui-workbench__drawer .kui-workbench__panel-content {
71
+ width: 100%;
72
+ height: var(--kui-workbench-drawer-height, 13.75rem);
73
+ transition: transform 200ms ease;
74
+ }
75
+
76
+ .kui-workbench__rail--left[data-collapsed="true"]
77
+ .kui-workbench__panel-content {
78
+ transform: translateX(-100%);
79
+ }
80
+
81
+ .kui-workbench__rail--right[data-collapsed="true"]
82
+ .kui-workbench__panel-content {
83
+ transform: translateX(100%);
84
+ }
85
+
86
+ .kui-workbench__drawer[data-collapsed="true"] .kui-workbench__panel-content {
87
+ transform: translateY(100%);
88
+ }
89
+
90
+ @media (prefers-reduced-motion: reduce) {
91
+ .kui-workbench__panel-content {
92
+ transition: none;
93
+ }
94
+ }
@@ -0,0 +1,19 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ type SunkenPanelShape = 'rounded' | 'square';
4
+ interface SunkenPanelProps {
5
+ children?: SafeHtml | readonly SafeHtml[];
6
+ /** Optional accessible landmark name for a distinct application region. */
7
+ ariaLabel?: string;
8
+ /** Corner shape: a rounded rectangle (default) or square corners. */
9
+ shape?: SunkenPanelShape;
10
+ className?: string;
11
+ }
12
+ /**
13
+ * A lowered application surface with one compact inset and a vertical content
14
+ * stack. The panel owns its background and padding; children own their own
15
+ * borders and internal geometry.
16
+ */
17
+ declare function SunkenPanel({ children, ariaLabel, shape, className, }: SunkenPanelProps): SafeHtml;
18
+
19
+ export { SunkenPanel, type SunkenPanelProps, type SunkenPanelShape };
@@ -0,0 +1,3 @@
1
+ export { SunkenPanel } from './chunk-TB6DY7H5.js';
2
+
3
+ //# sourceMappingURL=sunken-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"sunken-panel.js"}
package/dist/tab-bar.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
+ type TabActivation = 'automatic' | 'manual';
3
4
  interface TabBarProps {
4
5
  id: string;
5
6
  label: string;
@@ -7,8 +8,15 @@ interface TabBarProps {
7
8
  leading?: SafeHtml;
8
9
  trailing?: SafeHtml;
9
10
  className?: string;
11
+ /**
12
+ * Keyboard activation mode for this strip, emitted as `data-tab-activation` for
13
+ * `wireTabBars` to read (overrides its `activation` option). `'automatic'` (default)
14
+ * selects on arrow / Home / End; `'manual'` moves roving focus only and the user
15
+ * selects with Enter / Space / click — use it when selecting a tab is a heavy action.
16
+ */
17
+ activation?: TabActivation;
10
18
  }
11
19
  /** Render a controlled tab strip. The application owns selection, order, and persistence. */
12
- declare function TabBar({ id, label, children, leading, trailing, className }: TabBarProps): SafeHtml;
20
+ declare function TabBar({ id, label, children, leading, trailing, className, activation, }: TabBarProps): SafeHtml;
13
21
 
14
- export { TabBar, type TabBarProps };
22
+ export { type TabActivation, TabBar, type TabBarProps };
package/dist/tab-bar.js CHANGED
@@ -1,3 +1,3 @@
1
- export { TabBar } from './chunk-MBR3TYNL.js';
1
+ export { TabBar } from './chunk-M7JBER5U.js';
2
2
 
3
3
  //# sourceMappingURL=tab-bar.js.map
@@ -0,0 +1,30 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ interface TabScaffoldTab<Id extends string = string> {
4
+ id: Id;
5
+ label: string;
6
+ /** Decorative icon shown above the label in the bottom bar. */
7
+ icon?: SafeHtml;
8
+ /** The tab's content — typically a `NavStack` so each tab keeps its own stack. */
9
+ content: SafeHtml;
10
+ }
11
+ interface TabScaffoldProps<Id extends string = string> {
12
+ id: string;
13
+ /** Accessible name for the tab bar. */
14
+ label: string;
15
+ tabs: readonly TabScaffoldTab<Id>[];
16
+ /** The controlled active tab id (the app owns selection). */
17
+ active: NoInfer<Id>;
18
+ className?: string;
19
+ }
20
+ /**
21
+ * A mobile-first, iOS-like bottom tab scaffold: a bottom tab bar that switches
22
+ * between major sections, each tab keeping its own content (usually a `NavStack`)
23
+ * mounted so its stack and scroll survive a switch. Controlled — the app owns
24
+ * `active`; wire selection with `@kerfjs/ui/wire-tab-scaffold`'s `wireTabScaffold`.
25
+ * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of
26
+ * a bottom bar. See `docs/23-app-layouts.md` §3.4.
27
+ */
28
+ declare function TabScaffold<Id extends string>({ id, label, tabs, active, className, }: TabScaffoldProps<Id>): SafeHtml;
29
+
30
+ 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":";;;AA6BO,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\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: SafeHtml;\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"]}
@@ -0,0 +1,59 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ interface TokenSearchToken {
4
+ value: string;
5
+ label: string;
6
+ offset?: number;
7
+ accessibleLabel?: string;
8
+ }
9
+ type TokenSearchEditorAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
10
+ 'data-component'?: never;
11
+ 'data-key'?: never;
12
+ 'data-morph-skip'?: never;
13
+ 'data-token-search-editor'?: never;
14
+ 'data-token-count'?: never;
15
+ 'data-placeholder'?: never;
16
+ }>;
17
+ interface TokenSearchFieldBaseProps {
18
+ id: string;
19
+ label: string;
20
+ query?: string;
21
+ tokens?: readonly TokenSearchToken[];
22
+ placeholder?: string;
23
+ tokenPlaceholder?: string;
24
+ disabled?: boolean;
25
+ autofocus?: boolean;
26
+ leading?: SafeHtml;
27
+ trailing?: SafeHtml;
28
+ editAction?: string;
29
+ removeAction?: string;
30
+ clearAction?: string;
31
+ clearLabel?: string;
32
+ className?: string;
33
+ editorAttributes?: TokenSearchEditorAttributes;
34
+ }
35
+ type TokenSearchCollapsibleProps = {
36
+ /** Allow an empty field to render as one iconic action. */
37
+ collapsible: true;
38
+ /** Keep an empty collapsible field open while the application owns focus. */
39
+ expanded?: boolean;
40
+ expandAction?: string;
41
+ expandLabel?: string;
42
+ } | {
43
+ collapsible?: false;
44
+ expanded?: never;
45
+ expandAction?: never;
46
+ expandLabel?: never;
47
+ };
48
+ type TokenSearchFieldProps = TokenSearchFieldBaseProps & TokenSearchCollapsibleProps;
49
+ interface TokenSearchFieldValue {
50
+ query: string;
51
+ tokens: TokenSearchToken[];
52
+ }
53
+ 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
+ /** Read editable text and ordered token offsets from a rendered TokenSearchField editor. */
55
+ declare function readTokenSearchField(editor: HTMLElement, knownTokens?: readonly TokenSearchToken[]): TokenSearchFieldValue;
56
+ /** Focus an editor and place its caret at a text offset, skipping atomic token chips. */
57
+ declare function placeTokenSearchCaret(editor: HTMLElement, offset?: number): void;
58
+
59
+ export { type TokenSearchEditorAttributes, TokenSearchField, type TokenSearchFieldProps, type TokenSearchFieldValue, type TokenSearchToken, placeTokenSearchCaret, readTokenSearchField };
@@ -0,0 +1,4 @@
1
+ export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-7KEUJIIC.js';
2
+
3
+
4
+ //# sourceMappingURL=token-search-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"token-search-field.js"}
@@ -1,15 +1,21 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
+ type ToolbarControlGroupAppearance = 'contained' | 'borderless';
4
+ type ToolbarControlGroupTone = 'default' | 'dark';
5
+ type ToolbarControlGroupButtonAppearance = 'plain' | 'push';
6
+ type ToolbarControlGroupShape = 'pill' | 'rounded';
3
7
  interface ToolbarControlGroupProps {
4
8
  children: SafeHtml | SafeHtml[];
5
9
  label?: string;
6
10
  className?: string;
7
11
  expanded?: boolean;
8
12
  single?: boolean;
9
- appearance?: 'contained' | 'borderless';
10
- tone?: 'default' | 'dark';
11
- buttonAppearance?: 'plain' | 'push';
13
+ appearance?: ToolbarControlGroupAppearance;
14
+ tone?: ToolbarControlGroupTone;
15
+ buttonAppearance?: ToolbarControlGroupButtonAppearance;
16
+ /** Corner shape: fully round `pill` (default) or a softer `rounded` rectangle. */
17
+ shape?: ToolbarControlGroupShape;
12
18
  }
13
- declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance }: ToolbarControlGroupProps): SafeHtml;
19
+ declare function ToolbarControlGroup({ children, label, className, expanded, single, appearance, tone, buttonAppearance, shape, }: ToolbarControlGroupProps): SafeHtml;
14
20
 
15
- export { ToolbarControlGroup, type ToolbarControlGroupProps };
21
+ export { ToolbarControlGroup, type ToolbarControlGroupAppearance, type ToolbarControlGroupButtonAppearance, type ToolbarControlGroupProps, type ToolbarControlGroupShape, type ToolbarControlGroupTone };
@@ -1,3 +1,3 @@
1
- export { ToolbarControlGroup } from './chunk-MFKMHK5W.js';
1
+ export { ToolbarControlGroup } from './chunk-5VTB2BKP.js';
2
2
 
3
3
  //# sourceMappingURL=toolbar-control-group.js.map
@@ -1,11 +1,38 @@
1
1
  import * as kerfjs from 'kerfjs';
2
2
 
3
- type ToolbarTextSize = 'large' | 'default' | 'small';
4
- interface ToolbarTextProps {
3
+ type ToolbarTextSize = 'xlarge' | 'large' | 'default' | 'small';
4
+ /** ARIA heading level for a title exposed as a heading landmark. */
5
+ type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
6
+ interface ToolbarTextBaseProps {
5
7
  text: string;
6
8
  size?: ToolbarTextSize;
7
9
  className?: string;
10
+ /** Optional id, e.g. so a dialog can reference the title via aria-labelledby. */
11
+ id?: string;
12
+ /**
13
+ * Expose heading semantics (`role="heading"` + `aria-level`) so the text acts as
14
+ * a heading landmark — e.g. a page's primary title. Omit to keep the plain span
15
+ * (the default), which suits a dialog title referenced via `aria-labelledby`.
16
+ */
17
+ headingLevel?: HeadingLevel;
18
+ /** Render the text as an unanimated loading skeleton instead of its value. */
19
+ placeholder?: boolean;
20
+ /**
21
+ * Show a trailing ellipsis (…) where the text is truncated — on the single line
22
+ * (default), or at the `maxLines` boundary when wrapping. Set false to hard-clip
23
+ * instead. Default true.
24
+ */
25
+ ellipsis?: boolean;
8
26
  }
9
- declare function ToolbarText({ text, size, className }: ToolbarTextProps): kerfjs.SafeHtml;
27
+ type ToolbarTextWrappingProps = {
28
+ /** Wrap onto multiple lines; combine with `maxLines` to cap them. */
29
+ wrap: true;
30
+ maxLines?: number | null;
31
+ } | {
32
+ wrap?: false;
33
+ maxLines?: never;
34
+ };
35
+ type ToolbarTextProps = ToolbarTextBaseProps & ToolbarTextWrappingProps;
36
+ declare function ToolbarText({ text, size, className, id, headingLevel, placeholder, wrap, ellipsis, maxLines, }: ToolbarTextProps): kerfjs.SafeHtml;
10
37
 
11
- export { ToolbarText, type ToolbarTextProps, type ToolbarTextSize };
38
+ export { type HeadingLevel, ToolbarText, type ToolbarTextProps, type ToolbarTextSize };
@@ -1,3 +1,4 @@
1
- export { ToolbarText } from './chunk-GY5WH7TO.js';
1
+ export { ToolbarText } from './chunk-R7ZWUN64.js';
2
+
2
3
 
3
4
  //# sourceMappingURL=toolbar-text.js.map
package/dist/toolbar.d.ts CHANGED
@@ -1,13 +1,15 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
+ import { D as DividerSides } from './divider-sides-267FA7sY.js';
2
3
 
3
4
  interface ToolbarProps {
4
5
  leading?: SafeHtml;
5
6
  center?: SafeHtml;
6
7
  trailing?: SafeHtml;
7
8
  label?: string;
8
- divider?: boolean;
9
+ /** Physical divider edges in canonical top/right/bottom/left order. Defaults to bottom. */
10
+ dividerSides?: DividerSides;
9
11
  className?: string;
10
12
  }
11
- declare function Toolbar({ leading, center, trailing, label, divider, className }: ToolbarProps): SafeHtml;
13
+ declare function Toolbar({ leading, center, trailing, label, dividerSides, className, }: ToolbarProps): SafeHtml;
12
14
 
13
- export { Toolbar, type ToolbarProps };
15
+ export { DividerSides, Toolbar, type ToolbarProps };
package/dist/toolbar.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Toolbar } from './chunk-DAFFDO33.js';
1
+ export { Toolbar } from './chunk-SYDMYBPG.js';
2
2
 
3
3
  //# sourceMappingURL=toolbar.js.map
@@ -1,10 +1,20 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
+ interface ValueTableRowProps {
4
+ label: string | SafeHtml;
5
+ value: string | SafeHtml;
6
+ icon?: SafeHtml;
7
+ className?: string;
8
+ /** Render the value as an unanimated loading skeleton, keeping the field label. */
9
+ placeholder?: boolean;
10
+ }
11
+ declare function ValueTableRow({ label, value, icon, className, placeholder, }: ValueTableRowProps): SafeHtml;
12
+
3
13
  interface ValueTableProps {
4
14
  label: string;
5
15
  className?: string;
6
- children: SafeHtml | SafeHtml[];
16
+ children: SafeHtml | readonly SafeHtml[];
7
17
  }
8
- declare function ValueTable({ label, className, children }: ValueTableProps): SafeHtml;
18
+ declare function ValueTable({ label, className, children, }: ValueTableProps): SafeHtml;
9
19
 
10
- export { ValueTable, type ValueTableProps };
20
+ export { ValueTable, type ValueTableProps, ValueTableRow, type ValueTableRowProps };
@@ -1,3 +1,4 @@
1
- export { ValueTable } from './chunk-VKH2JLDZ.js';
1
+ export { ValueTable, ValueTableRow } from './chunk-KWWR5VMS.js';
2
+
2
3
 
3
4
  //# sourceMappingURL=value-table.js.map
@@ -0,0 +1,100 @@
1
+ import { KerfCustomElement } from 'kerfjs/jsx-runtime';
2
+
3
+ /**
4
+ * Opt-in Kerf JSX declarations for the Web Awesome elements supported by the
5
+ * @kerfjs/ui catalog. Import this module for type effects only; component
6
+ * registration remains an explicit application concern.
7
+ */
8
+ declare module 'kerfjs/jsx-runtime' {
9
+ namespace JSX {
10
+ interface IntrinsicElements {
11
+ 'wa-accordion': KerfCustomElement;
12
+ 'wa-accordion-item': KerfCustomElement;
13
+ 'wa-animated-image': KerfCustomElement;
14
+ 'wa-animation': KerfCustomElement;
15
+ 'wa-avatar': KerfCustomElement;
16
+ 'wa-badge': KerfCustomElement;
17
+ 'wa-breadcrumb': KerfCustomElement;
18
+ 'wa-breadcrumb-item': KerfCustomElement;
19
+ 'wa-select': KerfCustomElement & {
20
+ class?: string;
21
+ name?: string;
22
+ label?: string;
23
+ 'aria-label'?: string;
24
+ value?: string;
25
+ placeholder?: string;
26
+ disabled?: boolean;
27
+ };
28
+ 'wa-option': KerfCustomElement & {
29
+ value?: string;
30
+ };
31
+ 'wa-button-group': KerfCustomElement;
32
+ 'wa-callout': KerfCustomElement;
33
+ 'wa-card': KerfCustomElement;
34
+ 'wa-carousel': KerfCustomElement;
35
+ 'wa-carousel-item': KerfCustomElement;
36
+ 'wa-checkbox': KerfCustomElement;
37
+ 'wa-checkbox-group': KerfCustomElement;
38
+ 'wa-color-picker': KerfCustomElement;
39
+ 'wa-comparison': KerfCustomElement;
40
+ 'wa-copy-button': KerfCustomElement;
41
+ 'wa-details': KerfCustomElement;
42
+ 'wa-divider': KerfCustomElement;
43
+ 'wa-dialog': KerfCustomElement;
44
+ 'wa-drawer': KerfCustomElement;
45
+ 'wa-button': KerfCustomElement & {
46
+ slot?: string;
47
+ appearance?: string;
48
+ 'with-caret'?: boolean;
49
+ 'aria-label'?: string;
50
+ };
51
+ 'wa-dropdown': KerfCustomElement & {
52
+ placement?: string;
53
+ };
54
+ 'wa-dropdown-item': KerfCustomElement;
55
+ 'wa-format-bytes': KerfCustomElement;
56
+ 'wa-format-date': KerfCustomElement;
57
+ 'wa-format-number': KerfCustomElement;
58
+ 'wa-icon': KerfCustomElement;
59
+ 'wa-include': KerfCustomElement;
60
+ 'wa-input': KerfCustomElement;
61
+ 'wa-intersection-observer': KerfCustomElement;
62
+ 'wa-known-date': KerfCustomElement;
63
+ 'wa-markdown': KerfCustomElement;
64
+ 'wa-mutation-observer': KerfCustomElement;
65
+ 'wa-number-input': KerfCustomElement;
66
+ 'wa-otp-input': KerfCustomElement;
67
+ 'wa-page': KerfCustomElement;
68
+ 'wa-pagination': KerfCustomElement;
69
+ 'wa-popover': KerfCustomElement;
70
+ 'wa-popup': KerfCustomElement;
71
+ 'wa-progress-bar': KerfCustomElement;
72
+ 'wa-progress-ring': KerfCustomElement;
73
+ 'wa-qr-code': KerfCustomElement;
74
+ 'wa-radio': KerfCustomElement;
75
+ 'wa-radio-group': KerfCustomElement;
76
+ 'wa-random-content': KerfCustomElement;
77
+ 'wa-rating': KerfCustomElement;
78
+ 'wa-relative-time': KerfCustomElement;
79
+ 'wa-resize-observer': KerfCustomElement;
80
+ 'wa-scroller': KerfCustomElement;
81
+ 'wa-skeleton': KerfCustomElement;
82
+ 'wa-slider': KerfCustomElement;
83
+ 'wa-spinner': KerfCustomElement;
84
+ 'wa-split-panel': KerfCustomElement;
85
+ 'wa-switch': KerfCustomElement;
86
+ 'wa-tab': KerfCustomElement;
87
+ 'wa-tab-group': KerfCustomElement;
88
+ 'wa-tab-panel': KerfCustomElement;
89
+ 'wa-tag': KerfCustomElement;
90
+ 'wa-textarea': KerfCustomElement;
91
+ 'wa-time-input': KerfCustomElement;
92
+ 'wa-toast': KerfCustomElement;
93
+ 'wa-toast-item': KerfCustomElement;
94
+ 'wa-tooltip': KerfCustomElement;
95
+ 'wa-tree': KerfCustomElement;
96
+ 'wa-tree-item': KerfCustomElement;
97
+ 'wa-zoomable-frame': KerfCustomElement;
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,3 @@
1
+
2
+
3
+ //# sourceMappingURL=webawesome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"webawesome.js"}
@@ -0,0 +1,57 @@
1
+ interface WireCatalogOptions {
2
+ /** Invoked with the entry id when a sidebar item or a related-entry option is chosen. */
3
+ onSelect: (id: string) => void;
4
+ /** Invoked when the sidebar collapse/expand control is activated. */
5
+ onToggleSidebar?: () => void;
6
+ /** Invoked when the theme toggle is activated. */
7
+ onToggleTheme?: () => void;
8
+ /** Invoked when the secondary (ecosystem) group's disclosure toggle is activated. */
9
+ onToggleSecondary?: () => void;
10
+ /** When set, `?<urlParam>=<id>` is written on select via `history.replaceState`. */
11
+ urlParam?: string;
12
+ /**
13
+ * Reveal the chosen sidebar row after selection. `true` uses desktop-safe
14
+ * defaults; pass options to customize scroll alignment or the media guard.
15
+ */
16
+ revealSelection?: boolean | CatalogRevealOptions;
17
+ selectAction?: string;
18
+ toggleSidebarAction?: string;
19
+ toggleThemeAction?: string;
20
+ toggleSecondaryAction?: string;
21
+ }
22
+ interface CatalogRevealOptions {
23
+ /** Scroll alignment within the sidebar. Default `'nearest'`. */
24
+ block?: ScrollLogicalPosition;
25
+ /** Cross-axis alignment. Default `'nearest'`. */
26
+ inline?: ScrollLogicalPosition;
27
+ /** Scroll behavior. Default `'auto'`. */
28
+ behavior?: ScrollBehavior;
29
+ /**
30
+ * Only reveal when this media query matches. Defaults to the Catalog's
31
+ * desktop layout; pass `false` to reveal at every viewport size.
32
+ */
33
+ media?: string | false;
34
+ }
35
+ /**
36
+ * Reveal one Catalog sidebar entry after the controlled render settles without
37
+ * moving focus. Returns a cancellation function for rapid selection changes.
38
+ */
39
+ declare function revealCatalogEntry(root: HTMLElement, id: string, { block, inline, behavior, media, }?: CatalogRevealOptions): () => void;
40
+ /**
41
+ * Keep a Catalog's opt-in geometry overlay synchronized with its preview.
42
+ * Specimens receive computed border highlights (or a dashed bound when they
43
+ * have no border and are transparent), while positive computed margins use
44
+ * devtools-style orange bands. CSS/stylesheet-only changes are observed too.
45
+ * Returns a disposer.
46
+ */
47
+ declare function wireCatalogGeometryOverlay(root: HTMLElement): () => void;
48
+ /**
49
+ * Wire a {@link Catalog}'s interactions with one delegated listener set: sidebar
50
+ * item selection (and the related-entry popup menu), the sidebar collapse toggle, and
51
+ * the theme toggle. The app owns the `active`/`collapsed`/`theme` signals and updates
52
+ * them in the callbacks; optionally mirror the active id into the URL via `urlParam`.
53
+ * Returns a disposer.
54
+ */
55
+ declare function wireCatalog(root: HTMLElement, { onSelect, onToggleSidebar, onToggleTheme, onToggleSecondary, urlParam, revealSelection, selectAction, toggleSidebarAction, toggleThemeAction, toggleSecondaryAction, }: WireCatalogOptions): () => void;
56
+
57
+ export { type CatalogRevealOptions, type WireCatalogOptions, revealCatalogEntry, wireCatalog, wireCatalogGeometryOverlay };