@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
@@ -1,3 +1,3 @@
1
- export { LoadingSpinner } from './chunk-55DATV3A.js';
1
+ export { LoadingSpinner } from './chunk-6WTETUZ6.js';
2
2
 
3
3
  //# sourceMappingURL=loading-spinner.js.map
@@ -0,0 +1,38 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ /**
4
+ * One entry in a {@link NavStack}. The app owns the stack as an array (usually a
5
+ * signal); `NavStack` renders it and `wireNavStack` animates the transitions.
6
+ */
7
+ interface NavStackView {
8
+ /** Stable identity for keyed reconcile and transition direction. */
9
+ key: string;
10
+ content: SafeHtml;
11
+ /** Title shown in the top toolbar for this view. */
12
+ title?: string;
13
+ /** Trailing actions for this view's top toolbar. */
14
+ toolbar?: SafeHtml;
15
+ }
16
+ interface NavStackProps {
17
+ id: string;
18
+ /** Accessible name for the stack region. */
19
+ label: string;
20
+ /** The stack, root first; the last entry is the active top view. */
21
+ views: NavStackView[];
22
+ /** Accessible label for the back control (default "Back"). */
23
+ backLabel?: string;
24
+ /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */
25
+ hideToolbar?: boolean;
26
+ /** Optional persistent bottom toolbar. */
27
+ bottomToolbar?: SafeHtml;
28
+ className?: string;
29
+ }
30
+ /**
31
+ * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last
32
+ * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and
33
+ * cross-fades the chrome across a change. A single-pane layout is a `NavStack`
34
+ * with one entry. See `docs/23-app-layouts.md` §3.1.
35
+ */
36
+ declare function NavStack({ id, label, views, backLabel, hideToolbar, bottomToolbar, className, }: NavStackProps): SafeHtml;
37
+
38
+ export { NavStack, type NavStackProps, type NavStackView };
@@ -0,0 +1,5 @@
1
+ export { NavStack } from './chunk-B3A3IVO5.js';
2
+
3
+
4
+
5
+ //# sourceMappingURL=nav-stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"nav-stack.js"}
package/dist/pane.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ /** Logical sides that can show a {@link Pane} separator. */
4
+ type PaneSeparatorSide = 'block-start' | 'block-end' | 'inline-start' | 'inline-end';
5
+ /** Semantic root elements supported by {@link Pane}. */
6
+ type PaneElement = 'article' | 'aside' | 'div' | 'main' | 'section';
7
+ /** Semantic elements supported by the scrolling content slot. */
8
+ type PaneContentElement = 'div' | 'main' | 'nav' | 'section';
9
+ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
10
+ 'data-component'?: never;
11
+ 'data-separator-block-start'?: never;
12
+ 'data-separator-block-end'?: never;
13
+ 'data-separator-inline-start'?: never;
14
+ 'data-separator-inline-end'?: never;
15
+ }>;
16
+ interface PaneProps {
17
+ /** Optional fixed chrome above the scrolling content, arranged vertically. */
18
+ header?: SafeHtml | readonly SafeHtml[];
19
+ /** The pane's primary vertical, scrolling content stack. */
20
+ children?: SafeHtml | readonly SafeHtml[];
21
+ /** Optional fixed chrome below the scrolling content. */
22
+ footer?: SafeHtml | readonly SafeHtml[];
23
+ /** Root semantics. Defaults to `div`. */
24
+ element?: PaneElement;
25
+ /** Scrolling content semantics. Defaults to `div`. */
26
+ contentElement?: PaneContentElement;
27
+ /** Independent logical-edge separator lines. Defaults to none. */
28
+ separators?: readonly PaneSeparatorSide[];
29
+ id?: string;
30
+ /** Accessible name for a landmark root such as `aside` or `main`. */
31
+ label?: string;
32
+ /** Accessible name for a landmark scrolling slot such as `nav`. */
33
+ contentLabel?: string;
34
+ className?: string;
35
+ headerClassName?: string;
36
+ contentClassName?: string;
37
+ footerClassName?: string;
38
+ /** Safe `data-*` metadata; Pane-owned structural attributes remain protected. */
39
+ rootAttributes?: PaneRootAttributes;
40
+ }
41
+ /**
42
+ * An unpadded application column with optional fixed header/footer slots and one
43
+ * scrolling vertical content owner. Separator lines are independently opt-in on
44
+ * each logical edge, so the same component works as a sidebar, main area,
45
+ * inspector, or dialog column.
46
+ */
47
+ declare function Pane({ header, children, footer, element, contentElement, separators, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, }: PaneProps): SafeHtml;
48
+
49
+ export { Pane, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
package/dist/pane.js ADDED
@@ -0,0 +1,4 @@
1
+ export { Pane } from './chunk-JRKSK2HX.js';
2
+
3
+
4
+ //# sourceMappingURL=pane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"pane.js"}
@@ -0,0 +1,42 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+ import { HeadingLevel } from './toolbar-text.js';
3
+
4
+ interface PanelHeaderBaseProps {
5
+ title: string;
6
+ titleId: string;
7
+ icon?: SafeHtml;
8
+ iconClassName?: string;
9
+ actions?: SafeHtml;
10
+ /**
11
+ * Expose the title as a heading landmark (`role="heading"` + `aria-level`). Set it
12
+ * for a PAGE or view heading so screen-reader heading navigation works and the view
13
+ * has a primary heading; omit it (the default) for a dialog title, which is instead
14
+ * referenced via `aria-labelledby={titleId}` and needs no heading landmark.
15
+ */
16
+ headingLevel?: HeadingLevel;
17
+ /** Render the title and summary as unanimated loading skeletons, keeping the icon and actions. */
18
+ placeholder?: boolean;
19
+ }
20
+ type PanelHeaderSummaryProps = {
21
+ summary: string;
22
+ summaryId?: string;
23
+ } | {
24
+ summary?: never;
25
+ summaryId?: never;
26
+ };
27
+ type PanelHeaderProps = PanelHeaderBaseProps & PanelHeaderSummaryProps;
28
+ /**
29
+ * The heading of a panel, dialog, or page: a plain `Toolbar` whose leading zone
30
+ * holds an optional icon control group and the title as extra-large `ToolbarText`,
31
+ * whose trailing zone holds the app's action controls, and with an optional
32
+ * subtitle on its own row, left-aligned with the title.
33
+ *
34
+ * PanelHeader overrides no Toolbar styles — it is just a Toolbar with an xl title.
35
+ * The only styling it adds is the icon group's fill/border color and the subtitle.
36
+ * When no icon is provided, the icon group is omitted entirely. The `actions` slot
37
+ * is passed straight into the toolbar's trailing zone; the app supplies whatever
38
+ * trailing controls it needs (typically a `ToolbarControlGroup`).
39
+ */
40
+ declare function PanelHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions, headingLevel, placeholder, }: PanelHeaderProps): SafeHtml;
41
+
42
+ export { PanelHeader, type PanelHeaderProps };
@@ -0,0 +1,7 @@
1
+ export { PanelHeader } from './chunk-7XRDUG4Y.js';
2
+
3
+
4
+
5
+
6
+
7
+ //# sourceMappingURL=panel-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"panel-header.js"}
@@ -12,10 +12,12 @@ interface ResizableRegionProps {
12
12
  edge?: ResizableRegionEdge;
13
13
  collapsed?: boolean;
14
14
  transitioning?: boolean;
15
+ /** Decorative dormant content for the separator handle. Must not contain interactive descendants. */
16
+ handleIcon?: SafeHtml;
15
17
  children: SafeHtml | SafeHtml[];
16
18
  }
17
19
  declare const clampRegionSize: (size: number, min: number, max: number) => number;
18
20
  declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
19
- declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, children }: ResizableRegionProps): SafeHtml;
21
+ declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, handleIcon, children, }: ResizableRegionProps): SafeHtml;
20
22
 
21
23
  export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionEdge, type ResizableRegionProps, clampRegionSize, resizeRegionFromPointer };
@@ -1,3 +1,3 @@
1
- export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-3O7ZEUW2.js';
1
+ export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-NENBUYX5.js';
2
2
 
3
3
  //# sourceMappingURL=resizable-region.js.map
@@ -4,25 +4,27 @@ type SegmentedControlAppearance = 'filled' | 'outlined' | 'toolbar';
4
4
  type SegmentedControlShape = 'rounded' | 'pill';
5
5
  type SegmentedControlSize = 'small' | 'default';
6
6
  type SegmentedControlLayout = 'content' | 'equal';
7
- interface SegmentedControlChoice {
8
- value: string;
7
+ interface SegmentedControlChoice<Value extends string = string> {
8
+ value: Value;
9
9
  label: string;
10
10
  content?: SafeHtml;
11
11
  title?: string;
12
12
  disabled?: boolean;
13
13
  }
14
- interface SegmentedControlProps {
14
+ interface SegmentedControlProps<Value extends string = string> {
15
15
  id: string;
16
16
  label: string;
17
- value: string;
18
- choices: readonly SegmentedControlChoice[];
17
+ value: NoInfer<Value>;
18
+ choices: readonly SegmentedControlChoice<Value>[];
19
19
  action?: string;
20
20
  appearance?: SegmentedControlAppearance;
21
21
  shape?: SegmentedControlShape;
22
22
  size?: SegmentedControlSize;
23
23
  layout?: SegmentedControlLayout;
24
24
  className?: string;
25
+ /** Render as an unanimated loading skeleton, disabling every segment. */
26
+ placeholder?: boolean;
25
27
  }
26
- declare function SegmentedControl({ id, label, value, choices, action, appearance, shape, size, layout, className, }: SegmentedControlProps): SafeHtml;
28
+ declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps<Value>): SafeHtml;
27
29
 
28
30
  export { SegmentedControl, type SegmentedControlAppearance, type SegmentedControlChoice, type SegmentedControlLayout, type SegmentedControlProps, type SegmentedControlShape, type SegmentedControlSize };
@@ -1,3 +1,4 @@
1
- export { SegmentedControl } from './chunk-TRNBHPNW.js';
1
+ export { SegmentedControl } from './chunk-IJBSZ4NX.js';
2
+
2
3
 
3
4
  //# sourceMappingURL=segmented-control.js.map
@@ -1,4 +1,8 @@
1
- /** Marker export for tests and tooling; importing this module performs registration. */
1
+ /**
2
+ * Marker export for tests and tooling; importing this module performs registration.
3
+ * Registers both the `Select` elements and the `Catalog` related-entries popup-menu
4
+ * elements (`wa-dropdown` / `wa-dropdown-item` / `wa-button`).
5
+ */
2
6
  declare const selectElementsRegistered = true;
3
7
 
4
8
  export { selectElementsRegistered };
@@ -1,4 +1,7 @@
1
+ import '@awesome.me/webawesome/dist/components/button/button.js';
1
2
  import '@awesome.me/webawesome/dist/components/divider/divider.js';
3
+ import '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';
4
+ import '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';
2
5
  import '@awesome.me/webawesome/dist/components/option/option.js';
3
6
  import '@awesome.me/webawesome/dist/components/select/select.js';
4
7
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/select-register.ts"],"names":[],"mappings":";;;;;AAKO,IAAM,wBAAA,GAA2B","file":"select-register.js","sourcesContent":["import '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/option/option.js';\nimport '@awesome.me/webawesome/dist/components/select/select.js';\n\n/** Marker export for tests and tooling; importing this module performs registration. */\nexport const selectElementsRegistered = true;\n"]}
1
+ {"version":3,"sources":["../src/select-register.ts"],"names":[],"mappings":";;;;;;;;AAYO,IAAM,wBAAA,GAA2B","file":"select-register.js","sourcesContent":["import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/option/option.js';\nimport '@awesome.me/webawesome/dist/components/select/select.js';\n\n/**\n * Marker export for tests and tooling; importing this module performs registration.\n * Registers both the `Select` elements and the `Catalog` related-entries popup-menu\n * elements (`wa-dropdown` / `wa-dropdown-item` / `wa-button`).\n */\nexport const selectElementsRegistered = true;\n"]}
package/dist/select.d.ts CHANGED
@@ -11,18 +11,27 @@ interface SelectChoice<Value extends string = string> {
11
11
  group?: string;
12
12
  separatorBefore?: boolean;
13
13
  }
14
- interface SelectProps<Value extends string = string> {
15
- name: string;
16
- value: Value;
17
- label?: string;
14
+ type SelectAccessibleName = {
15
+ label: string;
18
16
  ariaLabel?: string;
17
+ } | {
18
+ label?: never;
19
+ ariaLabel: string;
20
+ };
21
+ interface SelectBaseProps<Value extends string = string> {
22
+ name: string;
23
+ value: NoInfer<Value>;
19
24
  choices: readonly SelectChoice<Value>[];
20
25
  className?: string;
21
- placeholder?: string;
26
+ /** Empty-value hint text shown in the closed control (the native select placeholder). */
27
+ placeholderText?: string;
22
28
  disabled?: boolean;
23
29
  fitMenu?: boolean;
24
30
  renderSelected?: (choice: SelectChoice<Value>) => SafeHtml;
31
+ /** Render as an unanimated loading skeleton: the label above a static, empty control box. */
32
+ placeholder?: boolean;
25
33
  }
26
- declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholder, disabled, fitMenu, renderSelected }: SelectProps<Value>): SafeHtml;
34
+ type SelectProps<Value extends string = string> = SelectBaseProps<Value> & SelectAccessibleName;
35
+ declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, disabled, fitMenu, renderSelected, placeholder, }: SelectProps<Value>): SafeHtml;
27
36
 
28
37
  export { Select, type SelectChoice, type SelectProps };
package/dist/select.js CHANGED
@@ -1,4 +1,5 @@
1
- export { Select } from './chunk-NHXX4JI5.js';
1
+ export { Select } from './chunk-NWSEP5RT.js';
2
+
2
3
 
3
4
 
4
5
  //# sourceMappingURL=select.js.map
@@ -0,0 +1,24 @@
1
+ import * as kerfjs from 'kerfjs';
2
+
3
+ interface SkeletonProps {
4
+ /** Width as any browser CSS length (e.g. `7.5rem`, `60%`). Defaults to filling its slot. */
5
+ width?: string;
6
+ /** Height as any CSS length. Defaults to a single text line. */
7
+ height?: string;
8
+ /** Corner radius override (a CSS length). Defaults to the small radius token. */
9
+ radius?: string;
10
+ /** Render this many stacked lines (the last one shorter), for multi-line text. */
11
+ lines?: number;
12
+ /** Accessible label. Omit to keep the block decorative (`aria-hidden`). */
13
+ label?: string;
14
+ className?: string;
15
+ }
16
+ /**
17
+ * A subtle, deliberately **unanimated** loading placeholder block. Use it for a
18
+ * value slot whose content is not yet known, on its own or via a component's
19
+ * `placeholder` prop. Decorative by default (`aria-hidden`); pass `label` to
20
+ * announce it. Sizes to its slot unless `width`/`height` are given.
21
+ */
22
+ declare function Skeleton({ width, height, radius, lines, label, className, }: SkeletonProps): kerfjs.SafeHtml;
23
+
24
+ export { Skeleton, type SkeletonProps };
@@ -0,0 +1,3 @@
1
+ export { Skeleton } from './chunk-RKVQEH4J.js';
2
+
3
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"skeleton.js"}
@@ -0,0 +1,42 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ interface SplitViewResizable {
4
+ size: number;
5
+ min: number;
6
+ max: number;
7
+ }
8
+ interface SplitViewProps {
9
+ id: string;
10
+ label: string;
11
+ /** The list (primary) pane. */
12
+ list: SafeHtml;
13
+ /** The detail (secondary) pane. */
14
+ detail: SafeHtml;
15
+ /**
16
+ * Compact ("one pane at a time") classes — a handset or portrait tablet.
17
+ * Derive from `deviceClass().value.compact`. When true the split collapses to
18
+ * a `NavStack`: the list is the root and the detail is pushed over it.
19
+ */
20
+ compact?: boolean;
21
+ /** In compact mode, whether the detail is currently pushed over the list. */
22
+ detailActive?: boolean;
23
+ /** Title/label for the list (compact NavStack root + region label). */
24
+ listTitle?: string;
25
+ /** Title/label for the detail (compact NavStack pushed view + region label). */
26
+ detailTitle?: string;
27
+ /** Back label for the compact NavStack (default "Back"). */
28
+ backLabel?: string;
29
+ /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */
30
+ resizable?: SplitViewResizable;
31
+ className?: string;
32
+ }
33
+ /**
34
+ * A list-detail split. On roomy classes it shows both panes side
35
+ * by side with an optional resizable separator; on compact classes it collapses
36
+ * to a `NavStack` (list → detail). See `docs/23-app-layouts.md` §3.2. Compose the
37
+ * resizable wiring with `wireResizableRegions` and the compact back with
38
+ * `wireNavStack`.
39
+ */
40
+ declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, }: SplitViewProps): SafeHtml;
41
+
42
+ export { SplitView, type SplitViewProps, type SplitViewResizable };
@@ -0,0 +1,81 @@
1
+ import { NavStack } from './chunk-B3A3IVO5.js';
2
+
3
+ import { ResizableRegion } from './chunk-NENBUYX5.js';
4
+
5
+ import { jsx, jsxs } from 'kerfjs/jsx-runtime';
6
+
7
+ function SplitView({
8
+ id,
9
+ label,
10
+ list,
11
+ detail,
12
+ compact = false,
13
+ detailActive = false,
14
+ listTitle = "",
15
+ detailTitle = "",
16
+ backLabel = "Back",
17
+ resizable,
18
+ className = ""
19
+ }) {
20
+ if (compact) {
21
+ const views = detailActive ? [
22
+ { key: "list", title: listTitle, content: list },
23
+ { key: "detail", title: detailTitle, content: detail }
24
+ ] : [{ key: "list", title: listTitle, content: list }];
25
+ return /* @__PURE__ */ jsx(
26
+ "div",
27
+ {
28
+ class: `kui-split-view kui-split-view--compact ${className}`.trim(),
29
+ id,
30
+ "data-component": "split-view",
31
+ "data-split-mode": "compact",
32
+ children: /* @__PURE__ */ jsx(
33
+ NavStack,
34
+ {
35
+ id: `${id}-stack`,
36
+ label,
37
+ views,
38
+ backLabel
39
+ }
40
+ )
41
+ }
42
+ );
43
+ }
44
+ const listPane = resizable ? /* @__PURE__ */ jsx(
45
+ ResizableRegion,
46
+ {
47
+ id: `${id}-list`,
48
+ label: listTitle || "List",
49
+ size: resizable.size,
50
+ min: resizable.min,
51
+ max: resizable.max,
52
+ children: /* @__PURE__ */ jsx("div", { class: "kui-split-view__list kui-pane", "data-split-list": true, children: list })
53
+ }
54
+ ) : /* @__PURE__ */ jsx("div", { class: "kui-split-view__list kui-pane", "data-split-list": true, children: list });
55
+ return /* @__PURE__ */ jsxs(
56
+ "div",
57
+ {
58
+ class: `kui-split-view ${className}`.trim(),
59
+ id,
60
+ "data-component": "split-view",
61
+ "data-split-mode": "split",
62
+ "aria-label": label,
63
+ children: [
64
+ listPane,
65
+ /* @__PURE__ */ jsx(
66
+ "div",
67
+ {
68
+ class: "kui-split-view__detail kui-pane",
69
+ "data-split-detail": true,
70
+ "aria-label": detailTitle || void 0,
71
+ children: detail
72
+ }
73
+ )
74
+ ]
75
+ }
76
+ );
77
+ }
78
+
79
+ export { SplitView };
80
+
81
+ //# sourceMappingURL=split-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":";;;;;;AA4CO,SAAS,SAAA,CAAU;AAAA,EACxB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,KAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,EAAA;AAAA,EACd,SAAA,GAAY,MAAA;AAAA,EACZ,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAAmB;AACjB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,QAAQ,YAAA,GACV;AAAA,MACE,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,MAC/C,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,SAAS,MAAA;AAAO,KACvD,GACA,CAAC,EAAE,GAAA,EAAK,QAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,CAAA;AACrD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,QAClE,EAAA;AAAA,QACA,gBAAA,EAAe,YAAA;AAAA,QACf,iBAAA,EAAgB,SAAA;AAAA,QAEhB,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,GAAG,EAAE,CAAA,MAAA,CAAA;AAAA,YACT,KAAA;AAAA,YACA,KAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,MAAM,WAAW,SAAA,mBACf,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,GAAG,EAAE,CAAA,KAAA,CAAA;AAAA,MACT,OAAO,SAAA,IAAa,MAAA;AAAA,MACpB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,KAAK,SAAA,CAAU,GAAA;AAAA,MACf,KAAK,SAAA,CAAU,GAAA;AAAA,MAEf,8BAAC,KAAA,EAAA,EAAI,KAAA,EAAM,+BAAA,EAAgC,iBAAA,EAAe,MACvD,QAAA,EAAA,IAAA,EACH;AAAA;AAAA,sBAGF,GAAA,CAAC,KAAA,EAAA,EAAI,OAAM,+BAAA,EAAgC,iBAAA,EAAe,MACvD,QAAA,EAAA,IAAA,EACH,CAAA;AAEF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MAC1C,EAAA;AAAA,MACA,gBAAA,EAAe,YAAA;AAAA,MACf,iBAAA,EAAgB,OAAA;AAAA,MAChB,YAAA,EAAY,KAAA;AAAA,MAEX,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACD,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,iCAAA;AAAA,YACN,mBAAA,EAAiB,IAAA;AAAA,YACjB,cAAY,WAAA,IAAe,MAAA;AAAA,YAE1B,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ","file":"split-view.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport { NavStack } from './nav-stack.js';\nimport { ResizableRegion } from './resizable-region.js';\n\nexport interface SplitViewResizable {\n size: number;\n min: number;\n max: number;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: SafeHtml;\n /** The detail (secondary) pane. */\n detail: SafeHtml;\n /**\n * Compact (\"one pane at a time\") classes — a handset or portrait tablet.\n * Derive from `deviceClass().value.compact`. When true the split collapses to\n * a `NavStack`: the list is the root and the detail is pushed over it.\n */\n compact?: boolean;\n /** In compact mode, whether the detail is currently pushed over the list. */\n detailActive?: boolean;\n /** Title/label for the list (compact NavStack root + region label). */\n listTitle?: string;\n /** Title/label for the detail (compact NavStack pushed view + region label). */\n detailTitle?: string;\n /** Back label for the compact NavStack (default \"Back\"). */\n backLabel?: string;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n className?: string;\n}\n\n/**\n * A list-detail split. On roomy classes it shows both panes side\n * by side with an optional resizable separator; on compact classes it collapses\n * to a `NavStack` (list → detail). See `docs/23-app-layouts.md` §3.2. Compose the\n * resizable wiring with `wireResizableRegions` and the compact back with\n * `wireNavStack`.\n */\nexport function SplitView({\n id,\n label,\n list,\n detail,\n compact = false,\n detailActive = false,\n listTitle = '',\n detailTitle = '',\n backLabel = 'Back',\n resizable,\n className = '',\n}: SplitViewProps) {\n if (compact) {\n const views = detailActive\n ? [\n { key: 'list', title: listTitle, content: list },\n { key: 'detail', title: detailTitle, content: detail },\n ]\n : [{ key: 'list', title: listTitle, content: list }];\n return (\n <div\n class={`kui-split-view kui-split-view--compact ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"compact\"\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n />\n </div>\n );\n }\n const listPane = resizable ? (\n <ResizableRegion\n id={`${id}-list`}\n label={listTitle || 'List'}\n size={resizable.size}\n min={resizable.min}\n max={resizable.max}\n >\n <div class=\"kui-split-view__list kui-pane\" data-split-list>\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div class=\"kui-split-view__list kui-pane\" data-split-list>\n {list}\n </div>\n );\n return (\n <div\n class={`kui-split-view ${className}`.trim()}\n id={id}\n data-component=\"split-view\"\n data-split-mode=\"split\"\n aria-label={label}\n >\n {listPane}\n <div\n class=\"kui-split-view__detail kui-pane\"\n data-split-detail\n aria-label={detailTitle || undefined}\n >\n {detail}\n </div>\n </div>\n );\n}\n"]}
@@ -1,15 +1,20 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
3
  type StateBannerTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
4
+ type StateBannerUrgency = 'status' | 'alert';
4
5
  interface StateBannerProps {
5
6
  title: string;
6
7
  detail?: string;
8
+ /** Optional compact status or count shown beside the title. */
9
+ badge?: string;
7
10
  icon?: SafeHtml;
8
11
  action?: SafeHtml;
9
12
  tone?: StateBannerTone;
10
- urgency?: 'status' | 'alert';
13
+ urgency?: StateBannerUrgency;
11
14
  className?: string;
15
+ /** Render the title, badge, and detail as unanimated loading skeletons, keeping the icon and tone. */
16
+ placeholder?: boolean;
12
17
  }
13
- declare function StateBanner({ title, detail, icon, action, tone, urgency, className }: StateBannerProps): SafeHtml;
18
+ declare function StateBanner({ title, detail, badge, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
14
19
 
15
- export { StateBanner, type StateBannerProps, type StateBannerTone };
20
+ export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
@@ -1,3 +1,4 @@
1
- export { StateBanner } from './chunk-VHW5YNIB.js';
1
+ export { StateBanner } from './chunk-W5L2JSBY.js';
2
+
2
3
 
3
4
  //# sourceMappingURL=state-banner.js.map
@@ -0,0 +1,152 @@
1
+ .kui-app-tab {
2
+ --kui-app-tab-color: var(--kui-color-neutral-on-quiet);
3
+ --kui-app-tab-hover-background: color-mix(
4
+ in srgb,
5
+ var(--kui-color-surface) 72%,
6
+ transparent
7
+ );
8
+ --kui-app-tab-selected-color: var(--kui-color-brand-on-quiet);
9
+ --kui-app-tab-selected-background: var(--kui-color-surface);
10
+ --kui-app-tab-selected-border: color-mix(
11
+ in srgb,
12
+ var(--kui-color-neutral-border-normal) 80%,
13
+ transparent
14
+ );
15
+ --kui-app-tab-drop-indicator: var(--kui-color-brand-border-normal);
16
+ position: relative;
17
+ display: flex;
18
+ width: max-content;
19
+ min-width: max-content;
20
+ height: 2.5rem;
21
+ box-sizing: border-box;
22
+ border: 1px solid transparent;
23
+ border-radius: var(--kui-layout-pill-radius, calc(1px + 1.3125rem));
24
+ color: var(--kui-app-tab-color);
25
+ background: transparent;
26
+ align-items: center;
27
+ flex: none;
28
+ }
29
+ .kui-app-tab:hover {
30
+ border-color: var(--kui-color-neutral-border-normal);
31
+ background: var(--kui-app-tab-hover-background);
32
+ }
33
+ .kui-app-tab[data-selected="true"] {
34
+ border-color: var(--kui-app-tab-selected-border);
35
+ color: var(--kui-app-tab-selected-color);
36
+ background: var(--kui-app-tab-selected-background);
37
+ box-shadow: var(--kui-shadow-s);
38
+ }
39
+ .kui-app-tab[data-tab-dragging="true"] {
40
+ opacity: 0.55;
41
+ }
42
+ .kui-app-tab[data-tab-drop-position]::after {
43
+ position: absolute;
44
+ z-index: 2;
45
+ top: 0.2rem;
46
+ bottom: 0.2rem;
47
+ width: 2px;
48
+ border-radius: var(--kui-radius-pill);
49
+ background: var(--kui-app-tab-drop-indicator);
50
+ content: "";
51
+ pointer-events: none;
52
+ }
53
+ .kui-app-tab[data-tab-drop-position="before"]::after {
54
+ inset-inline-start: calc(var(--kui-space-2xs) * -1);
55
+ }
56
+ .kui-app-tab[data-tab-drop-position="after"]::after {
57
+ inset-inline-end: calc(var(--kui-space-2xs) * -1);
58
+ }
59
+ .kui-app-tab__select {
60
+ display: flex;
61
+ min-width: 0;
62
+ height: 100%;
63
+ padding: 0 var(--kui-layout-item-padding, 0.5rem);
64
+ border: 0;
65
+ appearance: none;
66
+ color: inherit;
67
+ background: transparent;
68
+ cursor: pointer;
69
+ font: inherit;
70
+ align-items: center;
71
+ gap: var(--kui-layout-item-gap, 0.5rem);
72
+ text-align: start;
73
+ }
74
+ .kui-app-tab:has(.kui-app-tab__close) .kui-app-tab__select {
75
+ padding-inline-start: var(--kui-layout-item-padding, 0.5rem);
76
+ }
77
+ .kui-app-tab:has(.kui-app-tab__select:focus-visible) {
78
+ outline: var(--kui-focus-ring);
79
+ outline-offset: -2px;
80
+ }
81
+ .kui-app-tab__select:focus-visible {
82
+ outline: none;
83
+ }
84
+ .kui-app-tab__close:focus-visible {
85
+ border-radius: var(--kui-radius-pill);
86
+ outline: var(--kui-focus-ring);
87
+ outline-offset: -2px;
88
+ }
89
+ .kui-app-tab__select > svg {
90
+ width: 1rem;
91
+ height: 1rem;
92
+ flex: none;
93
+ }
94
+ .kui-app-tab__name {
95
+ overflow: hidden;
96
+ font-size: var(--kui-font-xs);
97
+ font-weight: 650;
98
+ text-overflow: ellipsis;
99
+ white-space: nowrap;
100
+ }
101
+ .kui-app-tab__trailing {
102
+ display: grid;
103
+ min-width: 1.275rem;
104
+ min-height: 1.275rem;
105
+ flex: none;
106
+ place-items: center;
107
+ }
108
+ .kui-app-tab__close {
109
+ display: grid;
110
+ width: 1.275rem;
111
+ height: 1.275rem;
112
+ margin-inline-start: var(--kui-space-xs);
113
+ padding: 0;
114
+ border: 0;
115
+ appearance: none;
116
+ color: var(--kui-color-neutral-on-quiet);
117
+ background: transparent;
118
+ cursor: pointer;
119
+ flex: none;
120
+ place-items: center;
121
+ }
122
+ .kui-app-tab__close:hover {
123
+ color: var(--kui-color-text);
124
+ }
125
+ .kui-app-tab__close-icon {
126
+ display: grid;
127
+ width: 0.6375rem;
128
+ height: 0.6375rem;
129
+ pointer-events: none;
130
+ place-items: center;
131
+ }
132
+ .kui-app-tab__close-icon > svg {
133
+ width: 100%;
134
+ height: 100%;
135
+ }
136
+ @media (hover: hover) and (pointer: fine) {
137
+ .kui-app-tab__close {
138
+ opacity: 0;
139
+ pointer-events: none;
140
+ transition: opacity 0.12s ease;
141
+ }
142
+ .kui-app-tab:hover .kui-app-tab__close,
143
+ .kui-app-tab:focus-within .kui-app-tab__close {
144
+ opacity: 1;
145
+ pointer-events: auto;
146
+ }
147
+ }
148
+ @media (prefers-reduced-motion: reduce) {
149
+ .kui-app-tab__close {
150
+ transition: none;
151
+ }
152
+ }