@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,62 @@
1
+ import { ReadonlySignal } from 'kerfjs';
2
+
3
+ /**
4
+ * Reactive device-class detection for `@kerfjs/ui` (see `docs/23-app-layouts.md`
5
+ * §2). `deviceClass()` returns a `ReadonlySignal<DeviceClass>` describing the
6
+ * current viewport as a size bucket × orientation × viewport-segment count, so a
7
+ * layout can pick its presentation reactively instead of hand-wiring `matchMedia`.
8
+ *
9
+ * One shared viewport source backs every reader; the pure `classifyViewport`
10
+ * core is DOM-free and directly unit-tested.
11
+ */
12
+ type DeviceSize = 'xs-mobile' | 'mobile' | 'tablet' | 'desktop' | 'xl-desktop';
13
+ type DeviceOrientation = 'portrait' | 'landscape';
14
+ /** Minimum widths (px) at which each larger bucket begins. `xs-mobile` is 0. */
15
+ interface DeviceBreakpoints {
16
+ mobile: number;
17
+ tablet: number;
18
+ desktop: number;
19
+ 'xl-desktop': number;
20
+ }
21
+ interface DeviceClass {
22
+ size: DeviceSize;
23
+ orientation: DeviceOrientation;
24
+ /** Horizontal viewport segments (foldables / dual-screen); 1 on ordinary devices. */
25
+ segments: number;
26
+ /** Vertical viewport segments; 1 on ordinary devices. */
27
+ verticalSegments: number;
28
+ /** Small phones — `xs-mobile` or `mobile`. */
29
+ handset: boolean;
30
+ /** "One pane at a time" — a handset or a portrait tablet. */
31
+ compact: boolean;
32
+ /** True when the current size is `size` or larger, e.g. `atLeast('tablet')`. */
33
+ atLeast(size: DeviceSize): boolean;
34
+ }
35
+ /** A raw viewport snapshot, before breakpoints are applied. */
36
+ interface Viewport {
37
+ width: number;
38
+ height: number;
39
+ segments: number;
40
+ verticalSegments: number;
41
+ }
42
+ interface DeviceClassOptions {
43
+ /** Override any of the default bucket thresholds. */
44
+ breakpoints?: Partial<DeviceBreakpoints>;
45
+ /** The viewport assumed when there is no DOM (SSR). Defaults to 1024×768, one segment. */
46
+ ssr?: Partial<Viewport>;
47
+ }
48
+ declare const DEFAULT_BREAKPOINTS: DeviceBreakpoints;
49
+ /**
50
+ * Classify a raw viewport into a {@link DeviceClass}. Pure and DOM-free — the
51
+ * single source of truth for the bucketing rules.
52
+ */
53
+ declare function classifyViewport(width: number, orientation: DeviceOrientation, segments?: number, verticalSegments?: number, breakpoints?: DeviceBreakpoints): DeviceClass;
54
+ /**
55
+ * A reactive signal of the current {@link DeviceClass}. Reading it inside an
56
+ * `effect`/`computed` re-runs when the viewport crosses a breakpoint, rotates,
57
+ * or changes its segment count. Without a DOM it resolves to `options.ssr`
58
+ * (default 1024×768, landscape, one segment).
59
+ */
60
+ declare function deviceClass(options?: DeviceClassOptions): ReadonlySignal<DeviceClass>;
61
+
62
+ export { DEFAULT_BREAKPOINTS, type DeviceBreakpoints, type DeviceClass, type DeviceClassOptions, type DeviceOrientation, type DeviceSize, type Viewport, classifyViewport, deviceClass };
@@ -0,0 +1,103 @@
1
+ import { computed, signal } from 'kerfjs';
2
+
3
+ // src/device-class.ts
4
+ var DEFAULT_BREAKPOINTS = {
5
+ mobile: 360,
6
+ tablet: 720,
7
+ desktop: 1024,
8
+ "xl-desktop": 1440
9
+ };
10
+ var SIZE_ORDER = [
11
+ "xs-mobile",
12
+ "mobile",
13
+ "tablet",
14
+ "desktop",
15
+ "xl-desktop"
16
+ ];
17
+ var SSR_VIEWPORT = {
18
+ width: 1024,
19
+ height: 768,
20
+ segments: 1,
21
+ verticalSegments: 1
22
+ };
23
+ function classifyViewport(width, orientation, segments = 1, verticalSegments = 1, breakpoints = DEFAULT_BREAKPOINTS) {
24
+ const size = width >= breakpoints["xl-desktop"] ? "xl-desktop" : width >= breakpoints.desktop ? "desktop" : width >= breakpoints.tablet ? "tablet" : width >= breakpoints.mobile ? "mobile" : "xs-mobile";
25
+ const rank = SIZE_ORDER.indexOf(size);
26
+ return {
27
+ size,
28
+ orientation,
29
+ segments,
30
+ verticalSegments,
31
+ handset: rank <= 1,
32
+ compact: rank <= 1 || size === "tablet" && orientation === "portrait",
33
+ atLeast: (target) => rank >= SIZE_ORDER.indexOf(target)
34
+ };
35
+ }
36
+ function countSegments(axis, view) {
37
+ const mq = view.matchMedia;
38
+ if (typeof mq !== "function") return 1;
39
+ for (let n = 4; n >= 2; n--) {
40
+ if (mq.call(view, `(${axis}-viewport-segments: ${n})`).matches) return n;
41
+ }
42
+ return 1;
43
+ }
44
+ function readViewport(view) {
45
+ return {
46
+ width: view.innerWidth,
47
+ height: view.innerHeight,
48
+ segments: countSegments("horizontal", view),
49
+ verticalSegments: countSegments("vertical", view)
50
+ };
51
+ }
52
+ function browserWindow() {
53
+ return typeof window === "undefined" ? void 0 : window;
54
+ }
55
+ var sharedSource;
56
+ function viewportSource(view) {
57
+ if (sharedSource) return sharedSource;
58
+ const source = signal(readViewport(view));
59
+ sharedSource = source;
60
+ const update = () => {
61
+ source.value = readViewport(view);
62
+ };
63
+ view.addEventListener("resize", update);
64
+ view.addEventListener("orientationchange", update);
65
+ return source;
66
+ }
67
+ function orientationOf(view) {
68
+ return view.height > view.width ? "portrait" : "landscape";
69
+ }
70
+ function deviceClass(options = {}) {
71
+ const breakpoints = {
72
+ ...DEFAULT_BREAKPOINTS,
73
+ ...options.breakpoints
74
+ };
75
+ const view = browserWindow();
76
+ if (!view) {
77
+ const snapshot = { ...SSR_VIEWPORT, ...options.ssr };
78
+ return computed(
79
+ () => classifyViewport(
80
+ snapshot.width,
81
+ orientationOf(snapshot),
82
+ snapshot.segments,
83
+ snapshot.verticalSegments,
84
+ breakpoints
85
+ )
86
+ );
87
+ }
88
+ const source = viewportSource(view);
89
+ return computed(() => {
90
+ const v = source.value;
91
+ return classifyViewport(
92
+ v.width,
93
+ orientationOf(v),
94
+ v.segments,
95
+ v.verticalSegments,
96
+ breakpoints
97
+ );
98
+ });
99
+ }
100
+
101
+ export { DEFAULT_BREAKPOINTS, classifyViewport, deviceClass };
102
+
103
+ //# sourceMappingURL=device-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/device-class.ts"],"names":[],"mappings":";;;AAsDO,IAAM,mBAAA,GAAyC;AAAA,EACpD,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,YAAA,EAAc;AAChB;AAEA,IAAM,UAAA,GAAoC;AAAA,EACxC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,YAAA,GAAyB;AAAA,EAC7B,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,QAAA,EAAU,CAAA;AAAA,EACV,gBAAA,EAAkB;AACpB,CAAA;AAMO,SAAS,gBAAA,CACd,OACA,WAAA,EACA,QAAA,GAAW,GACX,gBAAA,GAAmB,CAAA,EACnB,cAAiC,mBAAA,EACpB;AACb,EAAA,MAAM,OACJ,KAAA,IAAS,WAAA,CAAY,YAAY,CAAA,GAC7B,eACA,KAAA,IAAS,WAAA,CAAY,OAAA,GACnB,SAAA,GACA,SAAS,WAAA,CAAY,MAAA,GACnB,WACA,KAAA,IAAS,WAAA,CAAY,SACnB,QAAA,GACA,WAAA;AACZ,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AACpC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAS,IAAA,IAAQ,CAAA;AAAA,IACjB,OAAA,EAAS,IAAA,IAAQ,CAAA,IAAM,IAAA,KAAS,YAAY,WAAA,KAAgB,UAAA;AAAA,IAC5D,SAAS,CAAC,MAAA,KAAW,IAAA,IAAQ,UAAA,CAAW,QAAQ,MAAM;AAAA,GACxD;AACF;AAGA,SAAS,aAAA,CAAc,MAAiC,IAAA,EAAsB;AAC5E,EAAA,MAAM,KAAK,IAAA,CAAK,UAAA;AAChB,EAAA,IAAI,OAAO,EAAA,KAAO,UAAA,EAAY,OAAO,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAI,EAAA,CAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAA,EAAI,IAAI,uBAAuB,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,OAAA,EAAS,OAAO,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,aAAa,IAAA,EAAwB;AAC5C,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,UAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,WAAA;AAAA,IACb,QAAA,EAAU,aAAA,CAAc,YAAA,EAAc,IAAI,CAAA;AAAA,IAC1C,gBAAA,EAAkB,aAAA,CAAc,UAAA,EAAY,IAAI;AAAA,GAClD;AACF;AAGA,SAAS,aAAA,GAAoC;AAC3C,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,GAAY,MAAA;AACrD;AAEA,IAAI,YAAA;AAOJ,SAAS,eAAe,IAAA,EAAmD;AACzE,EAAA,IAAI,cAAc,OAAO,YAAA;AACzB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,IAAI,CAAC,CAAA;AACxC,EAAA,YAAA,GAAe,MAAA;AACf,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAA,CAAO,KAAA,GAAQ,aAAa,IAAI,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,IAAA,CAAK,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACtC,EAAA,IAAA,CAAK,gBAAA,CAAiB,qBAAqB,MAAM,CAAA;AACjD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,IAAA,EAAmC;AACxD,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,UAAA,GAAa,WAAA;AACjD;AAQO,SAAS,WAAA,CACd,OAAA,GAA8B,EAAC,EACF;AAC7B,EAAA,MAAM,WAAA,GAAiC;AAAA,IACrC,GAAG,mBAAA;AAAA,IACH,GAAG,OAAA,CAAQ;AAAA,GACb;AACA,EAAA,MAAM,OAAO,aAAA,EAAc;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,WAAqB,EAAE,GAAG,YAAA,EAAc,GAAG,QAAQ,GAAA,EAAI;AAC7D,IAAA,OAAO,QAAA;AAAA,MAAS,MACd,gBAAA;AAAA,QACE,QAAA,CAAS,KAAA;AAAA,QACT,cAAc,QAAQ,CAAA;AAAA,QACtB,QAAA,CAAS,QAAA;AAAA,QACT,QAAA,CAAS,gBAAA;AAAA,QACT;AAAA;AACF,KACF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,EAAA,OAAO,SAAS,MAAM;AACpB,IAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,IAAA,OAAO,gBAAA;AAAA,MACL,CAAA,CAAE,KAAA;AAAA,MACF,cAAc,CAAC,CAAA;AAAA,MACf,CAAA,CAAE,QAAA;AAAA,MACF,CAAA,CAAE,gBAAA;AAAA,MACF;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH","file":"device-class.js","sourcesContent":["import { computed, type ReadonlySignal, signal } from 'kerfjs';\n\n/**\n * Reactive device-class detection for `@kerfjs/ui` (see `docs/23-app-layouts.md`\n * §2). `deviceClass()` returns a `ReadonlySignal<DeviceClass>` describing the\n * current viewport as a size bucket × orientation × viewport-segment count, so a\n * layout can pick its presentation reactively instead of hand-wiring `matchMedia`.\n *\n * One shared viewport source backs every reader; the pure `classifyViewport`\n * core is DOM-free and directly unit-tested.\n */\n\nexport type DeviceSize =\n 'xs-mobile' | 'mobile' | 'tablet' | 'desktop' | 'xl-desktop';\nexport type DeviceOrientation = 'portrait' | 'landscape';\n\n/** Minimum widths (px) at which each larger bucket begins. `xs-mobile` is 0. */\nexport interface DeviceBreakpoints {\n mobile: number;\n tablet: number;\n desktop: number;\n 'xl-desktop': number;\n}\n\nexport interface DeviceClass {\n size: DeviceSize;\n orientation: DeviceOrientation;\n /** Horizontal viewport segments (foldables / dual-screen); 1 on ordinary devices. */\n segments: number;\n /** Vertical viewport segments; 1 on ordinary devices. */\n verticalSegments: number;\n /** Small phones — `xs-mobile` or `mobile`. */\n handset: boolean;\n /** \"One pane at a time\" — a handset or a portrait tablet. */\n compact: boolean;\n /** True when the current size is `size` or larger, e.g. `atLeast('tablet')`. */\n atLeast(size: DeviceSize): boolean;\n}\n\n/** A raw viewport snapshot, before breakpoints are applied. */\nexport interface Viewport {\n width: number;\n height: number;\n segments: number;\n verticalSegments: number;\n}\n\nexport interface DeviceClassOptions {\n /** Override any of the default bucket thresholds. */\n breakpoints?: Partial<DeviceBreakpoints>;\n /** The viewport assumed when there is no DOM (SSR). Defaults to 1024×768, one segment. */\n ssr?: Partial<Viewport>;\n}\n\nexport const DEFAULT_BREAKPOINTS: DeviceBreakpoints = {\n mobile: 360,\n tablet: 720,\n desktop: 1024,\n 'xl-desktop': 1440,\n};\n\nconst SIZE_ORDER: readonly DeviceSize[] = [\n 'xs-mobile',\n 'mobile',\n 'tablet',\n 'desktop',\n 'xl-desktop',\n];\n\nconst SSR_VIEWPORT: Viewport = {\n width: 1024,\n height: 768,\n segments: 1,\n verticalSegments: 1,\n};\n\n/**\n * Classify a raw viewport into a {@link DeviceClass}. Pure and DOM-free — the\n * single source of truth for the bucketing rules.\n */\nexport function classifyViewport(\n width: number,\n orientation: DeviceOrientation,\n segments = 1,\n verticalSegments = 1,\n breakpoints: DeviceBreakpoints = DEFAULT_BREAKPOINTS,\n): DeviceClass {\n const size: DeviceSize =\n width >= breakpoints['xl-desktop']\n ? 'xl-desktop'\n : width >= breakpoints.desktop\n ? 'desktop'\n : width >= breakpoints.tablet\n ? 'tablet'\n : width >= breakpoints.mobile\n ? 'mobile'\n : 'xs-mobile';\n const rank = SIZE_ORDER.indexOf(size);\n return {\n size,\n orientation,\n segments,\n verticalSegments,\n handset: rank <= 1,\n compact: rank <= 1 || (size === 'tablet' && orientation === 'portrait'),\n atLeast: (target) => rank >= SIZE_ORDER.indexOf(target),\n };\n}\n\n/** Count viewport segments along one axis, feature-detecting the media query. */\nfunction countSegments(axis: 'horizontal' | 'vertical', view: Window): number {\n const mq = view.matchMedia;\n if (typeof mq !== 'function') return 1;\n for (let n = 4; n >= 2; n--) {\n if (mq.call(view, `(${axis}-viewport-segments: ${n})`).matches) return n;\n }\n return 1;\n}\n\n/** Read the current viewport from a browser window. */\nfunction readViewport(view: Window): Viewport {\n return {\n width: view.innerWidth,\n height: view.innerHeight,\n segments: countSegments('horizontal', view),\n verticalSegments: countSegments('vertical', view),\n };\n}\n\n/** The browser window, or `undefined` when running without a DOM (SSR). */\nfunction browserWindow(): Window | undefined {\n return typeof window === 'undefined' ? undefined : window;\n}\n\nlet sharedSource: ReturnType<typeof signal<Viewport>> | undefined;\n\n/**\n * The shared reactive viewport source. Installed lazily on first read and kept\n * for the life of the page — there is only ever one viewport, so a single\n * listener set backs every `deviceClass()` reader.\n */\nfunction viewportSource(view: Window): ReturnType<typeof signal<Viewport>> {\n if (sharedSource) return sharedSource;\n const source = signal(readViewport(view));\n sharedSource = source;\n const update = (): void => {\n source.value = readViewport(view);\n };\n view.addEventListener('resize', update);\n view.addEventListener('orientationchange', update);\n return source;\n}\n\nfunction orientationOf(view: Viewport): DeviceOrientation {\n return view.height > view.width ? 'portrait' : 'landscape';\n}\n\n/**\n * A reactive signal of the current {@link DeviceClass}. Reading it inside an\n * `effect`/`computed` re-runs when the viewport crosses a breakpoint, rotates,\n * or changes its segment count. Without a DOM it resolves to `options.ssr`\n * (default 1024×768, landscape, one segment).\n */\nexport function deviceClass(\n options: DeviceClassOptions = {},\n): ReadonlySignal<DeviceClass> {\n const breakpoints: DeviceBreakpoints = {\n ...DEFAULT_BREAKPOINTS,\n ...options.breakpoints,\n };\n const view = browserWindow();\n if (!view) {\n const snapshot: Viewport = { ...SSR_VIEWPORT, ...options.ssr };\n return computed(() =>\n classifyViewport(\n snapshot.width,\n orientationOf(snapshot),\n snapshot.segments,\n snapshot.verticalSegments,\n breakpoints,\n ),\n );\n }\n const source = viewportSource(view);\n return computed(() => {\n const v = source.value;\n return classifyViewport(\n v.width,\n orientationOf(v),\n v.segments,\n v.verticalSegments,\n breakpoints,\n );\n });\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ type DisclosureDirection = 'up' | 'down' | 'left' | 'right';
4
+ interface DisclosureArrowProps {
5
+ open: boolean;
6
+ openDirection?: DisclosureDirection;
7
+ closedDirection?: DisclosureDirection;
8
+ /** Replacement icons should use right as their unrotated orientation. */
9
+ icon?: SafeHtml;
10
+ className?: string;
11
+ }
12
+ declare function DisclosureArrow({ open, openDirection, closedDirection, icon, className, }: DisclosureArrowProps): SafeHtml;
13
+
14
+ export { DisclosureArrow, type DisclosureArrowProps, type DisclosureDirection };
@@ -0,0 +1,4 @@
1
+ export { DisclosureArrow } from './chunk-Y6LYKFXY.js';
2
+
3
+
4
+ //# sourceMappingURL=disclosure-arrow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"disclosure-arrow.js"}
@@ -0,0 +1,4 @@
1
+ /** Canonical physical edge combinations for components that draw dividers. */
2
+ type DividerSides = '' | 't' | 'r' | 'b' | 'l' | 'tr' | 'tb' | 'tl' | 'rb' | 'rl' | 'bl' | 'trb' | 'trl' | 'tbl' | 'rbl' | 'trbl';
3
+
4
+ export type { DividerSides as D };
@@ -8,6 +8,6 @@ interface EmptyStateProps {
8
8
  busy?: boolean;
9
9
  className?: string;
10
10
  }
11
- declare function EmptyState({ title, detail, icon, action, busy, className }: EmptyStateProps): SafeHtml;
11
+ declare function EmptyState({ title, detail, icon, action, busy, className, }: EmptyStateProps): SafeHtml;
12
12
 
13
13
  export { EmptyState, type EmptyStateProps };
@@ -1,4 +1,4 @@
1
- export { EmptyState } from './chunk-WVPYVDXY.js';
1
+ export { EmptyState } from './chunk-PX3YSS5C.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=empty-state.js.map
@@ -0,0 +1,28 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ /** Where a {@link FloatingToolbar} floats within its positioned container. */
4
+ type FloatingToolbarPosition = 'bottom' | 'bottom-start' | 'bottom-end' | 'top' | 'top-start' | 'top-end';
5
+ interface FloatingToolbarProps {
6
+ /** Toolbar contents — normally one or more `ToolbarControlGroup`s. */
7
+ children: SafeHtml | SafeHtml[];
8
+ /** Accessible name for the toolbar (required — it exposes `role="toolbar"`). */
9
+ label: string;
10
+ /**
11
+ * Corner or edge it floats to inside its nearest positioned ancestor.
12
+ * Default: `'bottom-end'`.
13
+ */
14
+ position?: FloatingToolbarPosition;
15
+ className?: string;
16
+ }
17
+ /**
18
+ * A toolbar that floats above the main content of its nearest positioned
19
+ * ancestor — a transparent, forced-dark cluster of controls (e.g. a drawer
20
+ * restore button) that sits over the content but NOT over dialogs or overlays
21
+ * (it is not in the top layer). It is inset from the container edges by
22
+ * `--kui-floating-toolbar-inset` (default `--kui-space-m`, i.e. 8px more than a
23
+ * top toolbar's own inset); override that token to move it. The app owns the
24
+ * controls and their behavior — wire them with `delegate()` as usual.
25
+ */
26
+ declare function FloatingToolbar({ children, label, position, className, }: FloatingToolbarProps): SafeHtml;
27
+
28
+ export { FloatingToolbar, type FloatingToolbarPosition, type FloatingToolbarProps };
@@ -0,0 +1,3 @@
1
+ export { FloatingToolbar } from './chunk-LPOMRC4C.js';
2
+
3
+ //# sourceMappingURL=floating-toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"floating-toolbar.js"}
package/dist/index.d.ts CHANGED
@@ -1,21 +1,32 @@
1
1
  export { AppTab, AppTabProps } from './app-tab.js';
2
- export { DialogHeader, DialogHeaderProps } from './dialog-header.js';
2
+ export { DisclosureArrow, DisclosureArrowProps, DisclosureDirection } from './disclosure-arrow.js';
3
3
  export { EmptyState, EmptyStateProps } from './empty-state.js';
4
+ export { FloatingToolbar, FloatingToolbarPosition, FloatingToolbarProps } from './floating-toolbar.js';
5
+ export { List, ListProps } from './list.js';
6
+ export { ListActionRow, ListActionRowProps } from './list-action-row.js';
7
+ export { ListHeader, ListHeaderProps } from './list-header.js';
8
+ export { ListInsetControl, ListInsetControlProps } from './list-inset-control.js';
9
+ export { ListInsetText, ListInsetTextProps } from './list-inset-text.js';
10
+ export { ListItem, ListItemProps } from './list-item.js';
4
11
  export { LoadingSpinner, LoadingSpinnerProps } from './loading-spinner.js';
5
12
  export { LucideIcon, LucideIconProps, LucideNode } from './lucide-icon.js';
6
- export { MenuHeader, MenuHeaderProps } from './menu-header.js';
7
- export { MenuItem, MenuItemProps } from './menu-item.js';
8
- export { PageHeader, PageHeaderProps } from './page-header.js';
13
+ export { Pane, PaneContentElement, PaneElement, PaneProps, PaneSeparatorSide } from './pane.js';
14
+ export { PanelHeader, PanelHeaderProps } from './panel-header.js';
9
15
  export { ResizableRegion, ResizableRegionAxis, ResizableRegionEdge, ResizableRegionProps, clampRegionSize, resizeRegionFromPointer } from './resizable-region.js';
10
16
  export { SegmentedControl, SegmentedControlAppearance, SegmentedControlChoice, SegmentedControlLayout, SegmentedControlProps, SegmentedControlShape, SegmentedControlSize } from './segmented-control.js';
11
17
  export { Select, SelectChoice, SelectProps } from './select.js';
12
- export { StateBanner, StateBannerProps, StateBannerTone } from './state-banner.js';
13
- export { TabBar, TabBarProps } from './tab-bar.js';
18
+ export { Skeleton, SkeletonProps } from './skeleton.js';
19
+ export { StateBanner, StateBannerProps, StateBannerTone, StateBannerUrgency } from './state-banner.js';
20
+ export { SunkenPanel, SunkenPanelProps, SunkenPanelShape } from './sunken-panel.js';
21
+ export { TabActivation, TabBar, TabBarProps } from './tab-bar.js';
22
+ export { TokenSearchEditorAttributes, TokenSearchField, TokenSearchFieldProps, TokenSearchFieldValue, TokenSearchToken, placeTokenSearchCaret, readTokenSearchField } from './token-search-field.js';
14
23
  export { Toolbar, ToolbarProps } from './toolbar.js';
15
- export { ToolbarControlGroup, ToolbarControlGroupProps } from './toolbar-control-group.js';
16
- export { ToolbarText, ToolbarTextProps, ToolbarTextSize } from './toolbar-text.js';
17
- export { ValueTable, ValueTableProps } from './value-table.js';
24
+ export { ToolbarControlGroup, ToolbarControlGroupAppearance, ToolbarControlGroupButtonAppearance, ToolbarControlGroupProps, ToolbarControlGroupShape, ToolbarControlGroupTone } from './toolbar-control-group.js';
25
+ export { HeadingLevel, ToolbarText, ToolbarTextProps, ToolbarTextSize } from './toolbar-text.js';
26
+ export { ValueTable, ValueTableProps, ValueTableRow, ValueTableRowProps } from './value-table.js';
18
27
  export { ResizeCommit, WireResizableRegionsOptions, wireResizableRegions } from './wire-resizable-regions.js';
19
28
  export { TabDropPosition, TabReorder, TabReorderSource, WireTabBarsOptions, reorderTabs, wireTabBars } from './wire-tab-bars.js';
29
+ export { TokenSearchCollapsibleOptions, TokenSearchEdit, TokenSearchFieldsHandle, TokenSearchSubmit, WireTokenSearchFieldsOptions, wireTokenSearchFields } from './wire-token-search-fields.js';
30
+ export { D as DividerSides } from './divider-sides-267FA7sY.js';
20
31
  import 'kerfjs';
21
32
  import 'lucide';
package/dist/index.js CHANGED
@@ -1,21 +1,32 @@
1
- export { ToolbarText } from './chunk-GY5WH7TO.js';
2
- export { Toolbar } from './chunk-DAFFDO33.js';
3
- export { ValueTable } from './chunk-VKH2JLDZ.js';
4
- export { wireResizableRegions } from './chunk-4HHCYSGT.js';
5
- export { reorderTabs, wireTabBars } from './chunk-MQIZAD4A.js';
6
- export { PageHeader } from './chunk-2PES33HS.js';
7
- export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-3O7ZEUW2.js';
8
- export { SegmentedControl } from './chunk-TRNBHPNW.js';
9
- export { Select } from './chunk-NHXX4JI5.js';
10
- export { StateBanner } from './chunk-VHW5YNIB.js';
11
- export { TabBar } from './chunk-MBR3TYNL.js';
12
- export { ToolbarControlGroup } from './chunk-MFKMHK5W.js';
13
- export { AppTab } from './chunk-T5XNMVOI.js';
14
- export { DialogHeader } from './chunk-723YNJBH.js';
15
- export { EmptyState } from './chunk-WVPYVDXY.js';
16
- export { LoadingSpinner } from './chunk-55DATV3A.js';
1
+ export { reorderTabs, wireTabBars } from './chunk-UKKSMZYT.js';
2
+ export { wireTokenSearchFields } from './chunk-OJWWHFH3.js';
3
+ export { ValueTable, ValueTableRow } from './chunk-KWWR5VMS.js';
4
+ export { wireResizableRegions } from './chunk-DPDBVKNA.js';
5
+ export { StateBanner } from './chunk-W5L2JSBY.js';
6
+ export { SunkenPanel } from './chunk-TB6DY7H5.js';
7
+ export { TabBar } from './chunk-M7JBER5U.js';
8
+ export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-7KEUJIIC.js';
9
+ export { PanelHeader } from './chunk-7XRDUG4Y.js';
10
+ export { ToolbarText } from './chunk-R7ZWUN64.js';
11
+ export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-NENBUYX5.js';
12
+ export { SegmentedControl } from './chunk-IJBSZ4NX.js';
13
+ export { Select } from './chunk-NWSEP5RT.js';
14
+ export { ListActionRow } from './chunk-UFZKLBCF.js';
15
+ export { ListInsetControl } from './chunk-QO55FN2Y.js';
16
+ export { ListInsetText } from './chunk-FEY65TBV.js';
17
+ export { AppTab } from './chunk-Y45PPBDV.js';
18
+ export { Pane } from './chunk-JRKSK2HX.js';
19
+ export { Toolbar } from './chunk-SYDMYBPG.js';
20
+ export { ToolbarControlGroup } from './chunk-5VTB2BKP.js';
21
+ export { ListHeader } from './chunk-PSKN344N.js';
22
+ export { ListItem } from './chunk-FEAMR7S4.js';
23
+ export { List } from './chunk-J5BFYY7Q.js';
24
+
25
+ export { Skeleton } from './chunk-RKVQEH4J.js';
26
+ export { DisclosureArrow } from './chunk-Y6LYKFXY.js';
17
27
  export { LucideIcon } from './chunk-W2FK7ZNY.js';
18
- export { MenuHeader } from './chunk-OPCJRCYO.js';
19
- export { MenuItem } from './chunk-WY4CAEPG.js';
28
+ export { EmptyState } from './chunk-PX3YSS5C.js';
29
+ export { LoadingSpinner } from './chunk-6WTETUZ6.js';
30
+ export { FloatingToolbar } from './chunk-LPOMRC4C.js';
20
31
 
21
32
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,52 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ type ListActionRowRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
4
+ 'data-component'?: never;
5
+ 'data-action'?: never;
6
+ 'data-item-id'?: never;
7
+ 'data-has-icon'?: never;
8
+ 'data-multiline'?: never;
9
+ 'data-state'?: never;
10
+ 'data-selected'?: never;
11
+ 'data-pressed'?: never;
12
+ }>;
13
+ type ListActionRowTrailingAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
14
+ 'data-component'?: never;
15
+ 'data-action'?: never;
16
+ 'data-item-id'?: never;
17
+ popoverTarget?: string;
18
+ popoverTargetAction?: 'toggle' | 'show' | 'hide';
19
+ 'aria-controls'?: string;
20
+ 'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | 'tree' | 'grid' | 'true';
21
+ }>;
22
+ interface ListActionRowProps {
23
+ /** Visible dormant content for the primary button. Must not contain interactive descendants. */
24
+ label: string | SafeHtml;
25
+ /** Decorative dormant content for the primary button. Must not contain interactive descendants. */
26
+ icon?: SafeHtml;
27
+ action: string;
28
+ itemId?: string;
29
+ selected?: boolean;
30
+ pressed?: boolean;
31
+ accessibleLabel?: string;
32
+ title?: string;
33
+ multiline?: boolean;
34
+ state?: string;
35
+ disabled?: boolean;
36
+ tabIndex?: number;
37
+ /** Render as an unanimated loading skeleton, disabling both actions. */
38
+ placeholder?: boolean;
39
+ trailingAction: string;
40
+ trailingActionLabel: string;
41
+ /** Decorative dormant content for the trailing button. Must not contain interactive descendants. */
42
+ trailingActionIcon: SafeHtml;
43
+ trailingActionDisabled?: boolean;
44
+ trailingActionTitle?: string;
45
+ className?: string;
46
+ style?: string;
47
+ rootAttributes?: ListActionRowRootAttributes;
48
+ trailingActionAttributes?: ListActionRowTrailingAttributes;
49
+ }
50
+ declare function ListActionRow({ label, icon, action, itemId, selected, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, trailingAction, trailingActionLabel, trailingActionIcon, trailingActionDisabled, trailingActionTitle, className, style, rootAttributes, trailingActionAttributes, }: ListActionRowProps): SafeHtml;
51
+
52
+ export { ListActionRow, type ListActionRowProps };
@@ -0,0 +1,5 @@
1
+ export { ListActionRow } from './chunk-UFZKLBCF.js';
2
+
3
+
4
+
5
+ //# sourceMappingURL=list-action-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"list-action-row.js"}
@@ -0,0 +1,64 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ type ListHeaderRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
4
+ 'data-component'?: never;
5
+ 'data-action'?: never;
6
+ 'data-has-badge'?: never;
7
+ 'data-has-count'?: never;
8
+ 'data-toggle'?: never;
9
+ }>;
10
+ type ListHeaderTriggerAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
11
+ 'data-action'?: never;
12
+ popoverTarget?: string;
13
+ popoverTargetAction?: 'toggle' | 'show' | 'hide';
14
+ 'aria-controls'?: string;
15
+ 'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | 'tree' | 'grid' | 'true';
16
+ }>;
17
+ interface ListHeaderBaseProps {
18
+ label: string;
19
+ /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */
20
+ placeholder?: boolean;
21
+ rootAttributes?: ListHeaderRootAttributes;
22
+ triggerAttributes?: ListHeaderTriggerAttributes;
23
+ }
24
+ type ListHeaderModeProps = {
25
+ /** Render the title as a controlled disclosure trigger. */
26
+ toggle: true;
27
+ action: string;
28
+ expanded: boolean;
29
+ actionIcon?: SafeHtml;
30
+ actionLabel?: never;
31
+ actionDisabled?: boolean;
32
+ disabledReason?: string;
33
+ } | {
34
+ /** Render a separately named trailing action. */
35
+ toggle?: false;
36
+ action: string;
37
+ actionLabel: string;
38
+ actionIcon: SafeHtml;
39
+ expanded?: never;
40
+ actionDisabled?: boolean;
41
+ disabledReason?: string;
42
+ } | {
43
+ /** Render a passive section heading. */
44
+ toggle?: false;
45
+ action?: never;
46
+ actionLabel?: never;
47
+ actionIcon?: never;
48
+ expanded?: never;
49
+ actionDisabled?: never;
50
+ disabledReason?: never;
51
+ };
52
+ type ListHeaderIndicatorProps = {
53
+ count: number;
54
+ countLabel: string;
55
+ badge?: never;
56
+ } | {
57
+ count?: never;
58
+ countLabel?: never;
59
+ badge?: SafeHtml;
60
+ };
61
+ type ListHeaderProps = ListHeaderBaseProps & ListHeaderIndicatorProps & ListHeaderModeProps;
62
+ declare function ListHeader({ label, count, countLabel, badge, action, actionLabel, actionIcon, actionDisabled, disabledReason, expanded, toggle, placeholder, rootAttributes, triggerAttributes, }: ListHeaderProps): SafeHtml;
63
+
64
+ export { ListHeader, type ListHeaderProps };
@@ -0,0 +1,7 @@
1
+ export { ListHeader } from './chunk-PSKN344N.js';
2
+
3
+
4
+
5
+
6
+
7
+ //# sourceMappingURL=list-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"list-header.js"}
@@ -0,0 +1,16 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ interface ListInsetControlProps {
4
+ /** Control(s) that own their own border and padding (e.g. an input, a `wa-*`). */
5
+ children: SafeHtml | SafeHtml[];
6
+ className?: string;
7
+ }
8
+ /**
9
+ * Insets a control into a pane/list content region: an 8px inline margin (so its
10
+ * edges line up with `.kui-content` items) and a stretch flex row with an 8px gap.
11
+ * Use it for controls that carry their own border and padding but no outer margin
12
+ * — the wrapper adds only the alignment margin and layout, not a second inset.
13
+ */
14
+ declare function ListInsetControl({ children, className, }: ListInsetControlProps): SafeHtml;
15
+
16
+ export { ListInsetControl, type ListInsetControlProps };
@@ -0,0 +1,3 @@
1
+ export { ListInsetControl } from './chunk-QO55FN2Y.js';
2
+
3
+ //# sourceMappingURL=list-inset-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"list-inset-control.js"}
@@ -0,0 +1,25 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ interface ListInsetTextProps {
4
+ /** Text (or inline content) that carries no margin, border, or padding of its own. */
5
+ children: SafeHtml | SafeHtml[] | string;
6
+ /**
7
+ * Keep only the horizontal geometry (inline margin, left/right border, and
8
+ * left/right padding) and drop the vertical margin, border, and padding. Use it
9
+ * when the text edge must still align with bordered items but the line should not
10
+ * add its own vertical box space — tight text layout inside a content region.
11
+ */
12
+ horizontalOnly?: boolean;
13
+ className?: string;
14
+ }
15
+ /**
16
+ * Gives bare text the content-item geometry — an 8px inline margin, a 1px
17
+ * transparent border, and 8px padding — so a plain string lines up with
18
+ * bordered `.kui-content` items (its text edge lands at the same 17px inset).
19
+ * Use it for text elements that have no margin, border, or padding of their own.
20
+ * Pass `horizontalOnly` to keep the horizontal inset but drop the vertical box
21
+ * space for tight text layout.
22
+ */
23
+ declare function ListInsetText({ children, horizontalOnly, className, }: ListInsetTextProps): SafeHtml;
24
+
25
+ export { ListInsetText, type ListInsetTextProps };
@@ -0,0 +1,3 @@
1
+ export { ListInsetText } from './chunk-FEY65TBV.js';
2
+
3
+ //# sourceMappingURL=list-inset-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"list-inset-text.js"}
@@ -0,0 +1,33 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ type ListItemRootAttributes = Readonly<Record<`data-${string}`, string | undefined> & {
4
+ 'data-component'?: never;
5
+ 'data-action'?: never;
6
+ 'data-item-id'?: never;
7
+ 'data-has-icon'?: never;
8
+ 'data-multiline'?: never;
9
+ 'data-state'?: never;
10
+ }>;
11
+ interface ListItemProps {
12
+ label: string | SafeHtml;
13
+ icon?: SafeHtml;
14
+ trailing?: SafeHtml;
15
+ selected?: boolean;
16
+ action: string;
17
+ itemId?: string;
18
+ className?: string;
19
+ style?: string;
20
+ pressed?: boolean;
21
+ accessibleLabel?: string;
22
+ title?: string;
23
+ multiline?: boolean;
24
+ state?: string;
25
+ disabled?: boolean;
26
+ tabIndex?: number;
27
+ /** Render the row as an unanimated loading skeleton, disabling its action. */
28
+ placeholder?: boolean;
29
+ rootAttributes?: ListItemRootAttributes;
30
+ }
31
+ declare function ListItem({ label, icon, trailing, selected, action, itemId, className, style, pressed, accessibleLabel, title, multiline, state, disabled, tabIndex, placeholder, rootAttributes, }: ListItemProps): SafeHtml;
32
+
33
+ export { ListItem, type ListItemProps };
@@ -0,0 +1,5 @@
1
+ export { ListItem } from './chunk-FEAMR7S4.js';
2
+
3
+
4
+
5
+ //# sourceMappingURL=list-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"list-item.js"}
package/dist/list.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+ import { D as DividerSides } from './divider-sides-267FA7sY.js';
3
+
4
+ interface ListProps {
5
+ children?: SafeHtml | readonly SafeHtml[];
6
+ /** Use the standard item gap, or supply browser CSS such as `var(--kui-space-2xs)` or `0.25rem`. Defaults to no gap. */
7
+ gap?: boolean | string;
8
+ /** Allow this list to grow/shrink, or supply a CSS flex shorthand. */
9
+ flex?: boolean | string;
10
+ /** Own vertical scrolling and overscroll containment. */
11
+ scrollable?: boolean;
12
+ /** Physical divider edges in canonical top/right/bottom/left order. */
13
+ dividerSides?: DividerSides;
14
+ className?: string;
15
+ }
16
+ /** A stretch-aligned vertical stack with optional gap, flex, scroll, and dividers. */
17
+ declare function List({ children, gap, flex, scrollable, dividerSides, className, }: ListProps): SafeHtml;
18
+
19
+ export { DividerSides, List, type ListProps };
package/dist/list.js ADDED
@@ -0,0 +1,3 @@
1
+ export { List } from './chunk-J5BFYY7Q.js';
2
+
3
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"list.js"}