@kerfjs/ui 5.0.0-beta.17 → 5.0.0-beta.21

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 (274) hide show
  1. package/README.md +221 -81
  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 +101 -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 +326 -0
  17. package/ai/component-catalog-v2.d.ts +67 -0
  18. package/ai/component-catalog-v2.json +4441 -0
  19. package/ai/component-catalog-v2.schema.json +246 -0
  20. package/ai/component-catalog.json +649 -6
  21. package/ai/component-catalog.schema.json +15 -0
  22. package/ai/public-api-signatures-v1.md +357 -91
  23. package/ai/skill.md +95 -50
  24. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  25. package/analyzer/cli.mjs +46 -0
  26. package/analyzer/index.d.mts +45 -0
  27. package/analyzer/index.mjs +743 -0
  28. package/analyzer/report.schema.json +66 -0
  29. package/dist/app-tab.d.ts +1 -1
  30. package/dist/app-tab.js +1 -1
  31. package/dist/browser/pane.js +3 -0
  32. package/dist/browser/sunken-panel.js +3 -0
  33. package/dist/catalog-resources.d.ts +34 -0
  34. package/dist/catalog-resources.js +22 -0
  35. package/dist/catalog-resources.js.map +1 -0
  36. package/dist/catalog.d.ts +29 -4
  37. package/dist/catalog.js +302 -84
  38. package/dist/catalog.js.map +1 -1
  39. package/dist/chunk-5VTB2BKP.js +35 -0
  40. package/dist/chunk-5VTB2BKP.js.map +1 -0
  41. package/dist/chunk-6WTETUZ6.js +21 -0
  42. package/dist/chunk-6WTETUZ6.js.map +1 -0
  43. package/dist/chunk-7KEUJIIC.js +218 -0
  44. package/dist/chunk-7KEUJIIC.js.map +1 -0
  45. package/dist/chunk-7L6EHUMV.js +31 -0
  46. package/dist/chunk-7L6EHUMV.js.map +1 -0
  47. package/dist/{chunk-XXMOARTH.js → chunk-AASLYRGE.js} +57 -16
  48. package/dist/chunk-AASLYRGE.js.map +1 -0
  49. package/dist/chunk-BBRXX6PF.js +108 -0
  50. package/dist/chunk-BBRXX6PF.js.map +1 -0
  51. package/dist/{chunk-6NLRBSVX.js → chunk-CN2XNTAM.js} +129 -72
  52. package/dist/chunk-CN2XNTAM.js.map +1 -0
  53. package/dist/chunk-DPDBVKNA.js +113 -0
  54. package/dist/chunk-DPDBVKNA.js.map +1 -0
  55. package/dist/chunk-DSNIYOZ3.js +114 -0
  56. package/dist/chunk-DSNIYOZ3.js.map +1 -0
  57. package/dist/chunk-ELSJX4W7.js +68 -0
  58. package/dist/chunk-ELSJX4W7.js.map +1 -0
  59. package/dist/{chunk-AHQI52QO.js → chunk-FEY65TBV.js} +6 -2
  60. package/dist/chunk-FEY65TBV.js.map +1 -0
  61. package/dist/chunk-JRKSK2HX.js +79 -0
  62. package/dist/chunk-JRKSK2HX.js.map +1 -0
  63. package/dist/chunk-K57KRAOV.js +117 -0
  64. package/dist/chunk-K57KRAOV.js.map +1 -0
  65. package/dist/chunk-LPOMRC4C.js +25 -0
  66. package/dist/chunk-LPOMRC4C.js.map +1 -0
  67. package/dist/chunk-M7JBER5U.js +41 -0
  68. package/dist/chunk-M7JBER5U.js.map +1 -0
  69. package/dist/chunk-NENBUYX5.js +79 -0
  70. package/dist/chunk-NENBUYX5.js.map +1 -0
  71. package/dist/chunk-OHU6CI22.js +83 -0
  72. package/dist/chunk-OHU6CI22.js.map +1 -0
  73. package/dist/{chunk-YGN7OMLT.js → chunk-OZWU5ZPZ.js} +2 -2
  74. package/dist/chunk-OZWU5ZPZ.js.map +1 -0
  75. package/dist/chunk-PIDTEQ3U.js +105 -0
  76. package/dist/chunk-PIDTEQ3U.js.map +1 -0
  77. package/dist/chunk-PX3YSS5C.js +32 -0
  78. package/dist/chunk-PX3YSS5C.js.map +1 -0
  79. package/dist/chunk-PZQVSDLH.js +61 -0
  80. package/dist/chunk-PZQVSDLH.js.map +1 -0
  81. package/dist/chunk-QO55FN2Y.js +20 -0
  82. package/dist/chunk-QO55FN2Y.js.map +1 -0
  83. package/dist/chunk-QQFJMRIB.js +45 -0
  84. package/dist/chunk-QQFJMRIB.js.map +1 -0
  85. package/dist/chunk-RYRIFZCT.js +58 -0
  86. package/dist/chunk-RYRIFZCT.js.map +1 -0
  87. package/dist/{chunk-7BR3DO2A.js → chunk-SRSJO5QE.js} +13 -4
  88. package/dist/chunk-SRSJO5QE.js.map +1 -0
  89. package/dist/chunk-VLYV65LK.js +38 -0
  90. package/dist/chunk-VLYV65LK.js.map +1 -0
  91. package/dist/chunk-W4CXQYSG.js +23 -0
  92. package/dist/chunk-W4CXQYSG.js.map +1 -0
  93. package/dist/{chunk-WXMGNX2Y.js → chunk-W7YD6E4N.js} +2 -2
  94. package/dist/chunk-W7YD6E4N.js.map +1 -0
  95. package/dist/{chunk-56RJXPHG.js → chunk-Y6LYKFXY.js} +1 -1
  96. package/dist/{chunk-56RJXPHG.js.map → chunk-Y6LYKFXY.js.map} +1 -1
  97. package/dist/collapsible-panel.d.ts +2 -2
  98. package/dist/collapsible-panel.js +47 -6
  99. package/dist/collapsible-panel.js.map +1 -1
  100. package/dist/device-class.js +33 -5
  101. package/dist/device-class.js.map +1 -1
  102. package/dist/disclosure-arrow.js +1 -1
  103. package/dist/empty-state.d.ts +1 -1
  104. package/dist/empty-state.js +1 -1
  105. package/dist/floating-toolbar.d.ts +1 -1
  106. package/dist/floating-toolbar.js +1 -1
  107. package/dist/index.d.ts +6 -4
  108. package/dist/index.js +27 -25
  109. package/dist/list-action-row.d.ts +1 -1
  110. package/dist/list-action-row.js +1 -1
  111. package/dist/list-header.d.ts +30 -9
  112. package/dist/list-header.js +1 -1
  113. package/dist/list-inset-control.d.ts +1 -1
  114. package/dist/list-inset-control.js +1 -1
  115. package/dist/list-inset-text.d.ts +1 -1
  116. package/dist/list-inset-text.js +1 -1
  117. package/dist/list-item.d.ts +1 -1
  118. package/dist/list-item.js +1 -1
  119. package/dist/loading-spinner.js +1 -1
  120. package/dist/nav-stack.d.ts +1 -1
  121. package/dist/nav-stack.js +1 -1
  122. package/dist/pane.d.ts +49 -0
  123. package/dist/pane.js +4 -0
  124. package/dist/pane.js.map +1 -0
  125. package/dist/panel-header.d.ts +10 -4
  126. package/dist/panel-header.js +1 -1
  127. package/dist/resizable-region.d.ts +1 -1
  128. package/dist/resizable-region.js +1 -1
  129. package/dist/segmented-control.d.ts +6 -6
  130. package/dist/segmented-control.js +1 -1
  131. package/dist/select.d.ts +11 -5
  132. package/dist/select.js +1 -1
  133. package/dist/skeleton.d.ts +1 -1
  134. package/dist/skeleton.js +1 -1
  135. package/dist/split-view.d.ts +1 -1
  136. package/dist/split-view.js +70 -10
  137. package/dist/split-view.js.map +1 -1
  138. package/dist/state-banner.d.ts +4 -3
  139. package/dist/state-banner.js +1 -1
  140. package/dist/styles/catalog.css +32 -6
  141. package/dist/styles/layout.css +2 -20
  142. package/dist/styles/pane.css +62 -0
  143. package/dist/styles/segmented-control.css +3 -7
  144. package/dist/styles/sunken-panel.css +18 -0
  145. package/dist/sunken-panel.d.ts +16 -0
  146. package/dist/sunken-panel.js +3 -0
  147. package/dist/sunken-panel.js.map +1 -0
  148. package/dist/tab-bar.d.ts +4 -3
  149. package/dist/tab-bar.js +1 -1
  150. package/dist/tab-scaffold.d.ts +6 -6
  151. package/dist/tab-scaffold.js +43 -8
  152. package/dist/tab-scaffold.js.map +1 -1
  153. package/dist/token-search-field.d.ts +25 -9
  154. package/dist/token-search-field.js +1 -1
  155. package/dist/toolbar-control-group.d.ts +10 -6
  156. package/dist/toolbar-control-group.js +1 -1
  157. package/dist/toolbar-text.d.ts +10 -11
  158. package/dist/toolbar-text.js +1 -1
  159. package/dist/toolbar.d.ts +1 -1
  160. package/dist/toolbar.js +1 -1
  161. package/dist/value-table.d.ts +2 -2
  162. package/dist/value-table.js +1 -1
  163. package/dist/wire-catalog.d.ts +31 -2
  164. package/dist/wire-catalog.js +203 -8
  165. package/dist/wire-catalog.js.map +1 -1
  166. package/dist/wire-nav-stack.js +22 -7
  167. package/dist/wire-nav-stack.js.map +1 -1
  168. package/dist/wire-resizable-regions.d.ts +1 -1
  169. package/dist/wire-resizable-regions.js +1 -1
  170. package/dist/wire-sidebar.js +52 -41
  171. package/dist/wire-sidebar.js.map +1 -1
  172. package/dist/wire-tab-bars.d.ts +5 -2
  173. package/dist/wire-tab-bars.js +1 -1
  174. package/dist/wire-tab-scaffold.js +9 -4
  175. package/dist/wire-tab-scaffold.js.map +1 -1
  176. package/dist/wire-token-search-fields.d.ts +12 -7
  177. package/dist/wire-token-search-fields.js +1 -1
  178. package/dist/workbench.d.ts +1 -1
  179. package/dist/workbench.js +56 -9
  180. package/dist/workbench.js.map +1 -1
  181. package/docs/app-layouts.md +7 -7
  182. package/docs/catalog.md +249 -46
  183. package/docs/collapsible-panel.md +38 -11
  184. package/docs/component-contract.md +132 -7
  185. package/docs/component-selection.md +79 -67
  186. package/docs/design/templates.md +1 -1
  187. package/docs/design-philosophy.md +7 -9
  188. package/docs/device-class.md +8 -8
  189. package/docs/examples/application-ui-profile.json +60 -0
  190. package/docs/examples/command-palette-adapter.tsx +67 -17
  191. package/docs/examples/component-catalog-extension-v2.json +81 -0
  192. package/docs/examples/component-catalog-extension.json +45 -0
  193. package/docs/layout.md +51 -32
  194. package/docs/nav-stack.md +15 -6
  195. package/docs/recipes.md +4 -4
  196. package/docs/split-view.md +3 -3
  197. package/docs/sunken-panel.md +43 -0
  198. package/docs/tab-scaffold.md +16 -7
  199. package/docs/type-contracts.md +99 -0
  200. package/docs/ui-analyzer.md +81 -0
  201. package/docs/ui-doctor.md +77 -0
  202. package/docs/ui-evaluator.md +122 -0
  203. package/docs/webawesome-theme.md +8 -8
  204. package/docs/workbench.md +18 -5
  205. package/doctor/cli.mjs +115 -0
  206. package/doctor/config.schema.json +68 -0
  207. package/doctor/index.d.mts +116 -0
  208. package/doctor/index.mjs +1256 -0
  209. package/doctor/report.schema.json +118 -0
  210. package/evaluator/cli.mjs +89 -0
  211. package/evaluator/index.d.mts +90 -0
  212. package/evaluator/index.mjs +1138 -0
  213. package/evaluator/report.schema.json +152 -0
  214. package/llms.txt +58 -15
  215. package/package.json +70 -10
  216. package/ux-demo/recipes/app-shell.tsx +206 -10
  217. package/ux-demo/recipes/collapsible-sidebar.tsx +167 -44
  218. package/ux-demo/recipes/compact-toolbar.tsx +114 -12
  219. package/ux-demo/recipes/composer-form.tsx +106 -18
  220. package/ux-demo/recipes/list-detail-dialog.tsx +144 -8
  221. package/ux-demo/recipes/list-workspace-states.tsx +165 -8
  222. package/ux-demo/recipes/loaders.ts +5 -2
  223. package/ux-demo/recipes/loading-inspector.tsx +124 -41
  224. package/ux-demo/recipes/mount-recipe.ts +27 -6
  225. package/ux-demo/recipes/navigation-sidebar.tsx +120 -9
  226. package/ux-demo/recipes/navigation-stack.tsx +61 -19
  227. package/ux-demo/recipes/types.ts +3 -1
  228. package/ux-demo/recipes/workspace-header.tsx +57 -2
  229. package/dist/chunk-2Z5TWHKQ.js +0 -34
  230. package/dist/chunk-2Z5TWHKQ.js.map +0 -1
  231. package/dist/chunk-37T3VNIZ.js +0 -19
  232. package/dist/chunk-37T3VNIZ.js.map +0 -1
  233. package/dist/chunk-55DATV3A.js +0 -10
  234. package/dist/chunk-55DATV3A.js.map +0 -1
  235. package/dist/chunk-5ATCDSQS.js +0 -42
  236. package/dist/chunk-5ATCDSQS.js.map +0 -1
  237. package/dist/chunk-5E2HVJ33.js +0 -10
  238. package/dist/chunk-5E2HVJ33.js.map +0 -1
  239. package/dist/chunk-6NLRBSVX.js.map +0 -1
  240. package/dist/chunk-7BR3DO2A.js.map +0 -1
  241. package/dist/chunk-7JB7VPRI.js +0 -34
  242. package/dist/chunk-7JB7VPRI.js.map +0 -1
  243. package/dist/chunk-7LDCTU7D.js +0 -134
  244. package/dist/chunk-7LDCTU7D.js.map +0 -1
  245. package/dist/chunk-AHQI52QO.js.map +0 -1
  246. package/dist/chunk-AQNKJRFH.js +0 -79
  247. package/dist/chunk-AQNKJRFH.js.map +0 -1
  248. package/dist/chunk-AVZHJN6C.js +0 -14
  249. package/dist/chunk-AVZHJN6C.js.map +0 -1
  250. package/dist/chunk-B24C4A6T.js +0 -22
  251. package/dist/chunk-B24C4A6T.js.map +0 -1
  252. package/dist/chunk-CH4SQ6H5.js +0 -39
  253. package/dist/chunk-CH4SQ6H5.js.map +0 -1
  254. package/dist/chunk-DAFFDO33.js +0 -14
  255. package/dist/chunk-DAFFDO33.js.map +0 -1
  256. package/dist/chunk-I7INRJO4.js +0 -17
  257. package/dist/chunk-I7INRJO4.js.map +0 -1
  258. package/dist/chunk-L4OKFDJY.js +0 -24
  259. package/dist/chunk-L4OKFDJY.js.map +0 -1
  260. package/dist/chunk-M5JRI6MN.js +0 -27
  261. package/dist/chunk-M5JRI6MN.js.map +0 -1
  262. package/dist/chunk-RNPGFQ33.js +0 -10
  263. package/dist/chunk-RNPGFQ33.js.map +0 -1
  264. package/dist/chunk-VPCTCUED.js +0 -10
  265. package/dist/chunk-VPCTCUED.js.map +0 -1
  266. package/dist/chunk-WRTAQ7BZ.js +0 -23
  267. package/dist/chunk-WRTAQ7BZ.js.map +0 -1
  268. package/dist/chunk-WVPYVDXY.js +0 -15
  269. package/dist/chunk-WVPYVDXY.js.map +0 -1
  270. package/dist/chunk-WXMGNX2Y.js.map +0 -1
  271. package/dist/chunk-XXMOARTH.js.map +0 -1
  272. package/dist/chunk-YGN7OMLT.js.map +0 -1
  273. package/dist/chunk-ZQQ6P4SV.js +0 -20
  274. package/dist/chunk-ZQQ6P4SV.js.map +0 -1
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"}
@@ -1,11 +1,9 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
  import { HeadingLevel } from './toolbar-text.js';
3
3
 
4
- interface PanelHeaderProps {
4
+ interface PanelHeaderBaseProps {
5
5
  title: string;
6
6
  titleId: string;
7
- summary?: string;
8
- summaryId?: string;
9
7
  icon?: SafeHtml;
10
8
  iconClassName?: string;
11
9
  actions?: SafeHtml;
@@ -19,6 +17,14 @@ interface PanelHeaderProps {
19
17
  /** Render the title and summary as unanimated loading skeletons, keeping the icon and actions. */
20
18
  placeholder?: boolean;
21
19
  }
20
+ type PanelHeaderSummaryProps = {
21
+ summary: string;
22
+ summaryId?: string;
23
+ } | {
24
+ summary?: never;
25
+ summaryId?: never;
26
+ };
27
+ type PanelHeaderProps = PanelHeaderBaseProps & PanelHeaderSummaryProps;
22
28
  /**
23
29
  * The heading of a panel, dialog, or page: a plain `Toolbar` whose leading zone
24
30
  * holds an optional icon control group and the title as extra-large `ToolbarText`,
@@ -31,6 +37,6 @@ interface PanelHeaderProps {
31
37
  * is passed straight into the toolbar's trailing zone; the app supplies whatever
32
38
  * trailing controls it needs (typically a `ToolbarControlGroup`).
33
39
  */
34
- declare function PanelHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions, headingLevel, placeholder }: PanelHeaderProps): SafeHtml;
40
+ declare function PanelHeader({ title, titleId, summary, summaryId, icon, iconClassName, actions, headingLevel, placeholder, }: PanelHeaderProps): SafeHtml;
35
41
 
36
42
  export { PanelHeader, type PanelHeaderProps };
@@ -1,4 +1,4 @@
1
- export { PanelHeader } from './chunk-ZQQ6P4SV.js';
1
+ export { PanelHeader } from './chunk-RYRIFZCT.js';
2
2
 
3
3
 
4
4
 
@@ -18,6 +18,6 @@ interface ResizableRegionProps {
18
18
  }
19
19
  declare const clampRegionSize: (size: number, min: number, max: number) => number;
20
20
  declare const resizeRegionFromPointer: (startSize: number, delta: number, edge: ResizableRegionEdge) => number;
21
- declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, handleIcon, children }: ResizableRegionProps): SafeHtml;
21
+ declare function ResizableRegion({ id, label, size, min, max, axis, edge, collapsed, transitioning, handleIcon, children, }: ResizableRegionProps): SafeHtml;
22
22
 
23
23
  export { ResizableRegion, type ResizableRegionAxis, type ResizableRegionEdge, type ResizableRegionProps, clampRegionSize, resizeRegionFromPointer };
@@ -1,3 +1,3 @@
1
- export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-M5JRI6MN.js';
1
+ export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-NENBUYX5.js';
2
2
 
3
3
  //# sourceMappingURL=resizable-region.js.map
@@ -4,18 +4,18 @@ 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;
@@ -25,6 +25,6 @@ interface SegmentedControlProps {
25
25
  /** Render as an unanimated loading skeleton, disabling every segment. */
26
26
  placeholder?: boolean;
27
27
  }
28
- declare function SegmentedControl({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps): SafeHtml;
28
+ declare function SegmentedControl<Value extends string>({ id, label, value, choices, action, appearance, shape, size, layout, className, placeholder, }: SegmentedControlProps<Value>): SafeHtml;
29
29
 
30
30
  export { SegmentedControl, type SegmentedControlAppearance, type SegmentedControlChoice, type SegmentedControlLayout, type SegmentedControlProps, type SegmentedControlShape, type SegmentedControlSize };
@@ -1,4 +1,4 @@
1
- export { SegmentedControl } from './chunk-YGN7OMLT.js';
1
+ export { SegmentedControl } from './chunk-OZWU5ZPZ.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=segmented-control.js.map
package/dist/select.d.ts CHANGED
@@ -11,11 +11,16 @@ 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
26
  /** Empty-value hint text shown in the closed control (the native select placeholder). */
@@ -26,6 +31,7 @@ interface SelectProps<Value extends string = string> {
26
31
  /** Render as an unanimated loading skeleton: the label above a static, empty control box. */
27
32
  placeholder?: boolean;
28
33
  }
29
- declare function Select<Value extends string>({ name, value, label, ariaLabel, choices, className, placeholderText, disabled, fitMenu, renderSelected, placeholder }: 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;
30
36
 
31
37
  export { Select, type SelectChoice, type SelectProps };
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-CH4SQ6H5.js';
1
+ export { Select } from './chunk-K57KRAOV.js';
2
2
 
3
3
 
4
4
 
@@ -19,6 +19,6 @@ interface SkeletonProps {
19
19
  * `placeholder` prop. Decorative by default (`aria-hidden`); pass `label` to
20
20
  * announce it. Sizes to its slot unless `width`/`height` are given.
21
21
  */
22
- declare function Skeleton({ width, height, radius, lines, label, className }: SkeletonProps): kerfjs.SafeHtml;
22
+ declare function Skeleton({ width, height, radius, lines, label, className, }: SkeletonProps): kerfjs.SafeHtml;
23
23
 
24
24
  export { Skeleton, type SkeletonProps };
package/dist/skeleton.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Skeleton } from './chunk-B24C4A6T.js';
1
+ export { Skeleton } from './chunk-PZQVSDLH.js';
2
2
 
3
3
  //# sourceMappingURL=skeleton.js.map
@@ -37,6 +37,6 @@ interface SplitViewProps {
37
37
  * resizable wiring with `wireResizableRegions` and the compact back with
38
38
  * `wireNavStack`.
39
39
  */
40
- declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className }: SplitViewProps): SafeHtml;
40
+ declare function SplitView({ id, label, list, detail, compact, detailActive, listTitle, detailTitle, backLabel, resizable, className, }: SplitViewProps): SafeHtml;
41
41
 
42
42
  export { SplitView, type SplitViewProps, type SplitViewResizable };
@@ -1,19 +1,79 @@
1
- import { NavStack } from './chunk-WRTAQ7BZ.js';
2
- import { ResizableRegion } from './chunk-M5JRI6MN.js';
1
+ import { NavStack } from './chunk-OHU6CI22.js';
3
2
 
3
+ import { ResizableRegion } from './chunk-NENBUYX5.js';
4
4
 
5
5
  import { jsx, jsxs } from 'kerfjs/jsx-runtime';
6
6
 
7
- function SplitView({ id, label, list, detail, compact = false, detailActive = false, listTitle = "", detailTitle = "", backLabel = "Back", resizable, className = "" }) {
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
+ }) {
8
20
  if (compact) {
9
- const views = detailActive ? [{ key: "list", title: listTitle, content: list }, { key: "detail", title: detailTitle, content: detail }] : [{ key: "list", title: listTitle, content: list }];
10
- return /* @__PURE__ */ jsx("div", { class: `kui-split-view kui-split-view--compact ${className}`.trim(), id, "data-component": "split-view", "data-split-mode": "compact", children: /* @__PURE__ */ jsx(NavStack, { id: `${id}-stack`, label, views, backLabel }) });
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
+ );
11
43
  }
12
- const listPane = resizable ? /* @__PURE__ */ jsx(ResizableRegion, { id: `${id}-list`, label: listTitle || "List", size: resizable.size, min: resizable.min, max: resizable.max, children: /* @__PURE__ */ jsx("div", { class: "kui-split-view__list kui-pane", "data-split-list": true, children: list }) }) : /* @__PURE__ */ jsx("div", { class: "kui-split-view__list kui-pane", "data-split-list": true, children: list });
13
- return /* @__PURE__ */ jsxs("div", { class: `kui-split-view ${className}`.trim(), id, "data-component": "split-view", "data-split-mode": "split", "aria-label": label, children: [
14
- listPane,
15
- /* @__PURE__ */ jsx("div", { class: "kui-split-view__detail kui-pane", "data-split-detail": true, "aria-label": detailTitle || void 0, children: detail })
16
- ] });
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
+ );
17
77
  }
18
78
 
19
79
  export { SplitView };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":";;;;;;AA4CO,SAAS,UAAU,EAAE,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAO,YAAA,GAAe,OAAO,SAAA,GAAY,EAAA,EAAI,cAAc,EAAA,EAAI,SAAA,GAAY,QAAQ,SAAA,EAAW,SAAA,GAAY,IAAG,EAAmB;AAC7L,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,KAAA,GAAQ,YAAA,GACV,CAAC,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,IAAA,EAAK,EAAG,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,MAAA,EAAQ,CAAA,GACzG,CAAC,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,CAAA;AACrD,IAAA,uBAAO,GAAA,CAAC,SAAI,KAAA,EAAO,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK,EAAG,EAAA,EAAQ,gBAAA,EAAe,YAAA,EAAa,mBAAgB,SAAA,EACnI,QAAA,kBAAA,GAAA,CAAC,YAAS,EAAA,EAAI,CAAA,EAAG,EAAE,CAAA,MAAA,CAAA,EAAU,KAAA,EAAc,KAAA,EAAc,SAAA,EAAsB,CAAA,EACjF,CAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,SAAA,mBACb,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAI,CAAA,EAAG,EAAE,CAAA,KAAA,CAAA,EAAS,KAAA,EAAO,aAAa,MAAA,EAAQ,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,KAAK,SAAA,CAAU,GAAA,EAAK,GAAA,EAAK,SAAA,CAAU,KACtH,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,+BAAA,EAAgC,mBAAe,IAAA,EAAE,QAAA,EAAA,IAAA,EAAK,CAAA,EACnE,CAAA,uBACC,KAAA,EAAA,EAAI,KAAA,EAAM,+BAAA,EAAgC,iBAAA,EAAe,MAAE,QAAA,EAAA,IAAA,EAAK,CAAA;AACrE,EAAA,uBAAO,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,IAAA,EAAK,EAAG,EAAA,EAAQ,gBAAA,EAAe,YAAA,EAAa,iBAAA,EAAgB,OAAA,EAAQ,cAAY,KAAA,EAC9H,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,oBACD,GAAA,CAAC,SAAI,KAAA,EAAM,iCAAA,EAAkC,qBAAiB,IAAA,EAAC,YAAA,EAAY,WAAA,IAAe,MAAA,EAAY,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EAC/G,CAAA;AACF","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({ id, label, list, detail, compact = false, detailActive = false, listTitle = '', detailTitle = '', backLabel = 'Back', resizable, className = '' }: SplitViewProps) {\n if (compact) {\n const views = detailActive\n ? [{ key: 'list', title: listTitle, content: list }, { key: 'detail', title: detailTitle, content: detail }]\n : [{ key: 'list', title: listTitle, content: list }];\n return <div class={`kui-split-view kui-split-view--compact ${className}`.trim()} id={id} data-component=\"split-view\" data-split-mode=\"compact\">\n <NavStack id={`${id}-stack`} label={label} views={views} backLabel={backLabel} />\n </div>;\n }\n const listPane = resizable\n ? <ResizableRegion id={`${id}-list`} label={listTitle || 'List'} size={resizable.size} min={resizable.min} max={resizable.max}>\n <div class=\"kui-split-view__list kui-pane\" data-split-list>{list}</div>\n </ResizableRegion>\n : <div class=\"kui-split-view__list kui-pane\" data-split-list>{list}</div>;\n return <div class={`kui-split-view ${className}`.trim()} id={id} data-component=\"split-view\" data-split-mode=\"split\" aria-label={label}>\n {listPane}\n <div class=\"kui-split-view__detail kui-pane\" data-split-detail aria-label={detailTitle || undefined}>{detail}</div>\n </div>;\n}\n"]}
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,17 +1,18 @@
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;
7
8
  icon?: SafeHtml;
8
9
  action?: SafeHtml;
9
10
  tone?: StateBannerTone;
10
- urgency?: 'status' | 'alert';
11
+ urgency?: StateBannerUrgency;
11
12
  className?: string;
12
13
  /** Render the title and detail as unanimated loading skeletons, keeping the icon and tone. */
13
14
  placeholder?: boolean;
14
15
  }
15
- declare function StateBanner({ title, detail, icon, action, tone, urgency, className, placeholder }: StateBannerProps): SafeHtml;
16
+ declare function StateBanner({ title, detail, icon, action, tone, urgency, className, placeholder, }: StateBannerProps): SafeHtml;
16
17
 
17
- export { StateBanner, type StateBannerProps, type StateBannerTone };
18
+ export { StateBanner, type StateBannerProps, type StateBannerTone, type StateBannerUrgency };
@@ -1,4 +1,4 @@
1
- export { StateBanner } from './chunk-I7INRJO4.js';
1
+ export { StateBanner } from './chunk-VLYV65LK.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=state-banner.js.map
@@ -23,15 +23,14 @@
23
23
  padding: 0;
24
24
  overflow: hidden;
25
25
  justify-self: start;
26
- border-inline-end: 1px solid var(--kui-color-border);
27
26
  background: var(--kui-color-surface);
28
27
  transition:
29
28
  transform 200ms ease,
30
29
  visibility 0s linear 0s;
31
30
  }
32
31
 
33
- .kui-catalog[data-sidebar-collapsed="true"] .kui-catalog__sidebar {
34
- border-inline-end: 0;
32
+ .kui-catalog[data-sidebar-collapsed="true"] .kui-catalog__sidebar.kui-pane {
33
+ --kui-pane-separator-inline-end-width: 0;
35
34
  /* Slide out first, then hide, so the panel animates offscreen and only then
36
35
  leaves the tab order rather than snapping invisible mid-slide. */
37
36
  transform: translateX(-100%);
@@ -325,6 +324,32 @@
325
324
  place-items: center;
326
325
  }
327
326
 
327
+ /* Optional devtools-style geometry overlay. `wireCatalogGeometryOverlay` draws
328
+ a quiet dashed outer bound for transparent specimens and orange bands for
329
+ non-zero margins. */
330
+ .kui-catalog__geometry-overlay {
331
+ position: absolute;
332
+ z-index: 3;
333
+ pointer-events: none;
334
+ inset: 0;
335
+ }
336
+
337
+ .kui-catalog__geometry-bound,
338
+ .kui-catalog__geometry-margin {
339
+ position: absolute;
340
+ top: 0;
341
+ left: 0;
342
+ box-sizing: border-box;
343
+ }
344
+
345
+ .kui-catalog__geometry-bound {
346
+ border: 1px dashed color-mix(in srgb, var(--kui-color-text) 40%, transparent);
347
+ }
348
+
349
+ .kui-catalog__geometry-margin {
350
+ background: color-mix(in srgb, #f6a94c 55%, transparent);
351
+ }
352
+
328
353
  .kui-catalog__footer {
329
354
  --kui-toolbar-gap: 0.25rem;
330
355
  --kui-toolbar-group-size: 2rem;
@@ -484,15 +509,16 @@
484
509
  .kui-catalog[data-sidebar-collapsed="true"] .kui-catalog__sidebar {
485
510
  display: none;
486
511
  }
487
- .kui-catalog__sidebar {
512
+ .kui-catalog .kui-catalog__sidebar.kui-pane {
513
+ --kui-pane-separator-block-end-width: var(--kui-pane-separator-width, 1px);
514
+ --kui-pane-separator-inline-end-width: 0;
515
+
488
516
  width: 100%;
489
517
  min-width: 0;
490
518
  height: auto;
491
519
  justify-self: stretch;
492
520
  /* Narrow layout collapses via display:none, not the desktop slide. */
493
521
  transform: none;
494
- border-inline-end: 0;
495
- border-block-end: 1px solid var(--kui-color-border);
496
522
  }
497
523
  .kui-catalog__detail {
498
524
  height: auto;
@@ -1,24 +1,6 @@
1
- /* Shared application geometry: unpadded panes containing toolbars and content. */
2
- .kui-pane {
3
- display: grid;
4
- min-width: 0;
5
- min-height: 0;
6
- padding: 0;
7
- grid-template-rows: auto minmax(0, 1fr) auto;
8
- }
9
-
10
- .kui-pane__toolbar,
11
- .kui-pane__footer {
12
- min-width: 0;
13
- }
1
+ @import "./pane.css";
14
2
 
15
- .kui-pane__content {
16
- min-width: 0;
17
- min-height: 0;
18
- padding: 0;
19
- overflow: auto;
20
- overscroll-behavior: contain;
21
- }
3
+ /* Shared application content geometry for Pane children and standalone stacks. */
22
4
 
23
5
  .kui-content {
24
6
  display: flex;
@@ -0,0 +1,62 @@
1
+ .kui-pane {
2
+ --kui-pane-separator-block-start-width: 0;
3
+ --kui-pane-separator-block-end-width: 0;
4
+ --kui-pane-separator-inline-start-width: 0;
5
+ --kui-pane-separator-inline-end-width: 0;
6
+
7
+ display: grid;
8
+ min-width: 0;
9
+ min-height: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ border: 0 solid var(--kui-pane-separator-color, var(--kui-color-border));
13
+ border-block-start-width: var(--kui-pane-separator-block-start-width);
14
+ border-block-end-width: var(--kui-pane-separator-block-end-width);
15
+ border-inline-start-width: var(--kui-pane-separator-inline-start-width);
16
+ border-inline-end-width: var(--kui-pane-separator-inline-end-width);
17
+ grid-template-areas:
18
+ "header"
19
+ "content"
20
+ "footer";
21
+ grid-template-rows: auto minmax(0, 1fr) auto;
22
+ }
23
+
24
+ .kui-pane[data-separator-block-start="true"] {
25
+ --kui-pane-separator-block-start-width: var(--kui-pane-separator-width, 1px);
26
+ }
27
+
28
+ .kui-pane[data-separator-block-end="true"] {
29
+ --kui-pane-separator-block-end-width: var(--kui-pane-separator-width, 1px);
30
+ }
31
+
32
+ .kui-pane[data-separator-inline-start="true"] {
33
+ --kui-pane-separator-inline-start-width: var(--kui-pane-separator-width, 1px);
34
+ }
35
+
36
+ .kui-pane[data-separator-inline-end="true"] {
37
+ --kui-pane-separator-inline-end-width: var(--kui-pane-separator-width, 1px);
38
+ }
39
+
40
+ .kui-pane__header,
41
+ .kui-pane__toolbar {
42
+ display: flex;
43
+ min-width: 0;
44
+ flex-direction: column;
45
+ grid-area: header;
46
+ }
47
+
48
+ .kui-pane__content {
49
+ min-width: 0;
50
+ min-height: 0;
51
+ padding: 0;
52
+ overflow: auto;
53
+ grid-area: content;
54
+ overscroll-behavior: contain;
55
+ }
56
+
57
+ .kui-pane__footer {
58
+ display: flex;
59
+ min-width: 0;
60
+ flex-direction: column;
61
+ grid-area: footer;
62
+ }
@@ -12,9 +12,9 @@
12
12
  --kui-layout-rounded-radius,
13
13
  calc(1px + 0.6875rem)
14
14
  );
15
- --kui-segmented-item-radius: var(
16
- --kui-layout-rounded-radius,
17
- calc(1px + 0.6875rem)
15
+ --kui-segmented-item-radius: max(
16
+ 0px,
17
+ calc(var(--kui-segmented-radius) - 2px)
18
18
  );
19
19
  display: inline-flex;
20
20
  max-width: 100%;
@@ -82,10 +82,6 @@
82
82
  --kui-layout-pill-radius,
83
83
  calc(1px + 1.3125rem)
84
84
  );
85
- --kui-segmented-item-radius: var(
86
- --kui-layout-pill-radius,
87
- calc(1px + 1.3125rem)
88
- );
89
85
  }
90
86
 
91
87
  .kui-segmented-control[data-layout="equal"] {
@@ -0,0 +1,18 @@
1
+ .kui-sunken-panel {
2
+ display: flex;
3
+ min-width: 0;
4
+ min-height: 0;
5
+ padding: var(--kui-sunken-panel-padding, 0.5rem);
6
+ box-sizing: border-box;
7
+ border-radius: var(
8
+ --kui-sunken-panel-radius,
9
+ var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
10
+ );
11
+ color: var(--kui-sunken-panel-foreground, var(--kui-color-text));
12
+ background: var(
13
+ --kui-sunken-panel-background,
14
+ var(--kui-color-surface-lowered)
15
+ );
16
+ flex-direction: column;
17
+ gap: var(--kui-sunken-panel-gap, 0.5rem);
18
+ }
@@ -0,0 +1,16 @@
1
+ import { SafeHtml } from 'kerfjs';
2
+
3
+ interface SunkenPanelProps {
4
+ children?: SafeHtml | readonly SafeHtml[];
5
+ /** Optional accessible landmark name for a distinct application region. */
6
+ ariaLabel?: string;
7
+ className?: string;
8
+ }
9
+ /**
10
+ * A lowered application surface with one compact inset and a vertical content
11
+ * stack. The panel owns its background and padding; children own their own
12
+ * borders and internal geometry.
13
+ */
14
+ declare function SunkenPanel({ children, ariaLabel, className, }: SunkenPanelProps): SafeHtml;
15
+
16
+ export { SunkenPanel, type SunkenPanelProps };
@@ -0,0 +1,3 @@
1
+ export { SunkenPanel } from './chunk-W4CXQYSG.js';
2
+
3
+ //# sourceMappingURL=sunken-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"sunken-panel.js"}
package/dist/tab-bar.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
+ type TabActivation = 'automatic' | 'manual';
3
4
  interface TabBarProps {
4
5
  id: string;
5
6
  label: string;
@@ -13,9 +14,9 @@ interface TabBarProps {
13
14
  * selects on arrow / Home / End; `'manual'` moves roving focus only and the user
14
15
  * selects with Enter / Space / click — use it when selecting a tab is a heavy action.
15
16
  */
16
- activation?: 'automatic' | 'manual';
17
+ activation?: TabActivation;
17
18
  }
18
19
  /** Render a controlled tab strip. The application owns selection, order, and persistence. */
19
- declare function TabBar({ id, label, children, leading, trailing, className, activation }: TabBarProps): SafeHtml;
20
+ declare function TabBar({ id, label, children, leading, trailing, className, activation, }: TabBarProps): SafeHtml;
20
21
 
21
- export { TabBar, type TabBarProps };
22
+ export { type TabActivation, TabBar, type TabBarProps };
package/dist/tab-bar.js CHANGED
@@ -1,3 +1,3 @@
1
- export { TabBar } from './chunk-AVZHJN6C.js';
1
+ export { TabBar } from './chunk-M7JBER5U.js';
2
2
 
3
3
  //# sourceMappingURL=tab-bar.js.map
@@ -1,20 +1,20 @@
1
1
  import { SafeHtml } from 'kerfjs';
2
2
 
3
- interface TabScaffoldTab {
4
- id: string;
3
+ interface TabScaffoldTab<Id extends string = string> {
4
+ id: Id;
5
5
  label: string;
6
6
  /** Decorative icon shown above the label in the bottom bar. */
7
7
  icon?: SafeHtml;
8
8
  /** The tab's content — typically a `NavStack` so each tab keeps its own stack. */
9
9
  content: SafeHtml;
10
10
  }
11
- interface TabScaffoldProps {
11
+ interface TabScaffoldProps<Id extends string = string> {
12
12
  id: string;
13
13
  /** Accessible name for the tab bar. */
14
14
  label: string;
15
- tabs: TabScaffoldTab[];
15
+ tabs: readonly TabScaffoldTab<Id>[];
16
16
  /** The controlled active tab id (the app owns selection). */
17
- active: string;
17
+ active: NoInfer<Id>;
18
18
  className?: string;
19
19
  }
20
20
  /**
@@ -25,6 +25,6 @@ interface TabScaffoldProps {
25
25
  * On larger classes, promote the tabs to a `Workbench` rail or sidebar instead of
26
26
  * a bottom bar. See `docs/23-app-layouts.md` §3.4.
27
27
  */
28
- declare function TabScaffold({ id, label, tabs, active, className }: TabScaffoldProps): SafeHtml;
28
+ declare function TabScaffold<Id extends string>({ id, label, tabs, active, className, }: TabScaffoldProps<Id>): SafeHtml;
29
29
 
30
30
  export { TabScaffold, type TabScaffoldProps, type TabScaffoldTab };