@kerfjs/ui 5.0.0-beta.61 → 5.0.0-beta.63

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 (191) hide show
  1. package/README.md +4 -0
  2. package/ai/component-catalog-extension.schema.json +13 -0
  3. package/ai/component-catalog.json +20 -7
  4. package/ai/component-composition.json +17 -3
  5. package/ai/components/list-item.md +1 -1
  6. package/ai/components/pane.md +3 -2
  7. package/ai/components/select.md +1 -0
  8. package/ai/components/toolbar-text.md +2 -1
  9. package/ai/components/workbench.md +3 -2
  10. package/ai/public-api-signatures-v1.md +162 -48
  11. package/ai/skill.md +11 -5
  12. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  13. package/analyzer/index.mjs +3 -2
  14. package/catalog-projection-cli.mjs +96 -0
  15. package/catalog-projection.d.mts +55 -0
  16. package/catalog-projection.mjs +62 -0
  17. package/dist/browser/catalog.js +1 -1
  18. package/dist/browser/collapsible-panel.js +2 -0
  19. package/dist/browser/nav-stack.js +1 -0
  20. package/dist/browser/split-view.js +1 -0
  21. package/dist/browser/toolbar-control-group.js +1 -0
  22. package/dist/browser/workbench.js +1 -0
  23. package/dist/catalog-resources.d.ts +1 -1
  24. package/dist/catalog.d.ts +1 -1
  25. package/dist/catalog.js +11 -10
  26. package/dist/catalog.js.map +1 -1
  27. package/dist/chip.d.ts +9 -3
  28. package/dist/chip.js +1 -1
  29. package/dist/{chunk-EZVNC4J6.js → chunk-3BYFWTP3.js} +7 -3
  30. package/dist/chunk-3BYFWTP3.js.map +1 -0
  31. package/dist/{chunk-5Q3N6EV7.js → chunk-5IJ6UGNZ.js} +3 -3
  32. package/dist/{chunk-5Q3N6EV7.js.map → chunk-5IJ6UGNZ.js.map} +1 -1
  33. package/dist/chunk-7AKGPBCC.js +76 -0
  34. package/dist/chunk-7AKGPBCC.js.map +1 -0
  35. package/dist/{chunk-KROD7KZK.js → chunk-AUVG54KC.js} +2 -2
  36. package/dist/{chunk-KROD7KZK.js.map → chunk-AUVG54KC.js.map} +1 -1
  37. package/dist/{chunk-AUKT3KMG.js → chunk-CQHN45XR.js} +17 -2
  38. package/dist/chunk-CQHN45XR.js.map +1 -0
  39. package/dist/{chunk-SWVW56CV.js → chunk-EN4LDR5Y.js} +2 -2
  40. package/dist/{chunk-SWVW56CV.js.map → chunk-EN4LDR5Y.js.map} +1 -1
  41. package/dist/{chunk-TEYARRAK.js → chunk-F7OCOBTG.js} +5 -2
  42. package/dist/chunk-F7OCOBTG.js.map +1 -0
  43. package/dist/{chunk-5PESG2VP.js → chunk-HXCMWANP.js} +6 -5
  44. package/dist/chunk-HXCMWANP.js.map +1 -0
  45. package/dist/{chunk-NYL63PSD.js → chunk-IA4D5XNT.js} +61 -10
  46. package/dist/chunk-IA4D5XNT.js.map +1 -0
  47. package/dist/{chunk-F4QMLOXJ.js → chunk-IAOAZUOO.js} +2 -2
  48. package/dist/{chunk-F4QMLOXJ.js.map → chunk-IAOAZUOO.js.map} +1 -1
  49. package/dist/{chunk-Y74NWGQW.js → chunk-KFYANKJI.js} +66 -22
  50. package/dist/chunk-KFYANKJI.js.map +1 -0
  51. package/dist/chunk-MOSIE4Z2.js +51 -0
  52. package/dist/chunk-MOSIE4Z2.js.map +1 -0
  53. package/dist/{chunk-7JUBXOIV.js → chunk-NXWE5S57.js} +25 -6
  54. package/dist/chunk-NXWE5S57.js.map +1 -0
  55. package/dist/{chunk-NNMLEDMD.js → chunk-OBAFAH5B.js} +36 -8
  56. package/dist/chunk-OBAFAH5B.js.map +1 -0
  57. package/dist/{chunk-A3CKOW2R.js → chunk-R75GGNWY.js} +123 -20
  58. package/dist/chunk-R75GGNWY.js.map +1 -0
  59. package/dist/chunk-RGS4WX2M.js +44 -0
  60. package/dist/chunk-RGS4WX2M.js.map +1 -0
  61. package/dist/{chunk-N3GKMPDW.js → chunk-RKTTF3L4.js} +3 -1
  62. package/dist/chunk-RKTTF3L4.js.map +1 -0
  63. package/dist/{chunk-RRB26JRJ.js → chunk-RTJNJTG3.js} +2 -2
  64. package/dist/{chunk-RRB26JRJ.js.map → chunk-RTJNJTG3.js.map} +1 -1
  65. package/dist/{chunk-EAC4CDY7.js → chunk-SMZGAPCU.js} +15 -2
  66. package/dist/chunk-SMZGAPCU.js.map +1 -0
  67. package/dist/{chunk-C4OYOKWX.js → chunk-UA6JW52D.js} +36 -2
  68. package/dist/chunk-UA6JW52D.js.map +1 -0
  69. package/dist/{chunk-3SXMEK3B.js → chunk-V3DX3K65.js} +1 -1
  70. package/dist/chunk-V3DX3K65.js.map +1 -0
  71. package/dist/{chunk-6ZXOQEAN.js → chunk-WF75U3V4.js} +7 -1
  72. package/dist/chunk-WF75U3V4.js.map +1 -0
  73. package/dist/{chunk-VCBTX62E.js → chunk-ZRWXFDDS.js} +2 -2
  74. package/dist/chunk-ZRWXFDDS.js.map +1 -0
  75. package/dist/collapsible-panel.d.ts +18 -7
  76. package/dist/collapsible-panel.js +19 -3
  77. package/dist/collapsible-panel.js.map +1 -1
  78. package/dist/content-item.d.ts +36 -5
  79. package/dist/content-item.js +1 -1
  80. package/dist/disclosure-arrow.js +2 -1
  81. package/dist/index.d.ts +3 -3
  82. package/dist/index.js +22 -22
  83. package/dist/list-action-row.js +1 -1
  84. package/dist/list-header.js +1 -1
  85. package/dist/list-item.js +1 -1
  86. package/dist/lucide-icon.d.ts +5 -2
  87. package/dist/lucide-icon.js +2 -1
  88. package/dist/nav-stack.d.ts +3 -1
  89. package/dist/nav-stack.js +2 -1
  90. package/dist/pane.d.ts +10 -4
  91. package/dist/pane.js +1 -1
  92. package/dist/{panel-toolbar-DqwtBxQL.d.ts → panel-toolbar-DDKh4uKd.d.ts} +11 -2
  93. package/dist/popup-menu-register.js +38 -1
  94. package/dist/popup-menu-register.js.map +1 -1
  95. package/dist/popup-menu.d.ts +2 -2
  96. package/dist/popup-menu.js +1 -1
  97. package/dist/select.d.ts +2 -0
  98. package/dist/select.js +1 -1
  99. package/dist/split-view.d.ts +1 -1
  100. package/dist/split-view.js +2 -1
  101. package/dist/split-view.js.map +1 -1
  102. package/dist/styles/app-tab.css +84 -0
  103. package/dist/styles/chip.css +14 -0
  104. package/dist/styles/content-item.css +36 -0
  105. package/dist/styles/list-action-row.css +4 -3
  106. package/dist/styles/list-header.css +4 -3
  107. package/dist/styles/list-item.css +21 -11
  108. package/dist/styles/lucide-icon.css +5 -0
  109. package/dist/styles/nav-stack.css +13 -0
  110. package/dist/styles/pane.css +36 -2
  111. package/dist/styles/popup-menu.css +15 -10
  112. package/dist/styles/resizable-region.css +9 -0
  113. package/dist/styles/select.css +26 -0
  114. package/dist/styles/split-view.css +6 -0
  115. package/dist/styles/sunken-panel.css +7 -0
  116. package/dist/styles/tab-bar.css +3 -0
  117. package/dist/styles/tab-scaffold.css +13 -0
  118. package/dist/styles/text.css +29 -0
  119. package/dist/styles/token-search-field.css +29 -6
  120. package/dist/styles/toolbar-control-group.css +35 -0
  121. package/dist/styles/toolbar-text.css +15 -6
  122. package/dist/styles/toolbar.css +7 -0
  123. package/dist/styles/workbench.css +260 -90
  124. package/dist/sunken-panel.d.ts +6 -1
  125. package/dist/sunken-panel.js +1 -1
  126. package/dist/tab-bar.d.ts +6 -2
  127. package/dist/tab-bar.js +1 -1
  128. package/dist/tab-scaffold.d.ts +3 -0
  129. package/dist/tab-scaffold.js +1 -0
  130. package/dist/tab-scaffold.js.map +1 -1
  131. package/dist/text.d.ts +14 -3
  132. package/dist/text.js +1 -1
  133. package/dist/token-search-field.js +2 -1
  134. package/dist/toolbar-control-group.d.ts +5 -1
  135. package/dist/toolbar-control-group.js +2 -1
  136. package/dist/toolbar-text.d.ts +1 -1
  137. package/dist/toolbar-text.js +1 -1
  138. package/dist/toolbar.d.ts +7 -4
  139. package/dist/toolbar.js +1 -1
  140. package/dist/wire-catalog.js +1 -1
  141. package/dist/wire-content-items.d.ts +9 -0
  142. package/dist/wire-content-items.js +62 -0
  143. package/dist/wire-content-items.js.map +1 -0
  144. package/dist/wire-tab-bars.js +1 -1
  145. package/dist/wire-token-search-fields.js +2 -1
  146. package/dist/wire-workbench.d.ts +7 -0
  147. package/dist/wire-workbench.js +1 -1
  148. package/dist/workbench.d.ts +24 -8
  149. package/dist/workbench.js +2 -1
  150. package/docs/accessibility.md +21 -5
  151. package/docs/catalog.md +36 -0
  152. package/docs/collapsible-panel.md +12 -4
  153. package/docs/component-contract.md +10 -4
  154. package/docs/component-selection.md +65 -15
  155. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  156. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  157. package/docs/design/templates/toolbar-dark.svg +1 -1
  158. package/docs/design/templates/toolbar.svg +1 -1
  159. package/docs/examples/component-catalog-extension.json +6 -0
  160. package/docs/layout.md +61 -3
  161. package/docs/nav-stack.md +5 -0
  162. package/docs/split-view.md +5 -0
  163. package/docs/sunken-panel.md +30 -1
  164. package/docs/tab-scaffold.md +5 -0
  165. package/docs/ui-analyzer.md +4 -0
  166. package/docs/webawesome-theme.md +36 -6
  167. package/docs/workbench.md +60 -14
  168. package/llms.txt +12 -4
  169. package/package.json +16 -2
  170. package/scripts/component-catalog-extension-validation.mjs +28 -0
  171. package/dist/chunk-3SXMEK3B.js.map +0 -1
  172. package/dist/chunk-4R777DUZ.js +0 -34
  173. package/dist/chunk-4R777DUZ.js.map +0 -1
  174. package/dist/chunk-5PESG2VP.js.map +0 -1
  175. package/dist/chunk-6ZXOQEAN.js.map +0 -1
  176. package/dist/chunk-7JUBXOIV.js.map +0 -1
  177. package/dist/chunk-A3CKOW2R.js.map +0 -1
  178. package/dist/chunk-AUKT3KMG.js.map +0 -1
  179. package/dist/chunk-C4OYOKWX.js.map +0 -1
  180. package/dist/chunk-EAC4CDY7.js.map +0 -1
  181. package/dist/chunk-EZVNC4J6.js.map +0 -1
  182. package/dist/chunk-MA73TA6D.js +0 -42
  183. package/dist/chunk-MA73TA6D.js.map +0 -1
  184. package/dist/chunk-MERWRTBG.js +0 -45
  185. package/dist/chunk-MERWRTBG.js.map +0 -1
  186. package/dist/chunk-N3GKMPDW.js.map +0 -1
  187. package/dist/chunk-NNMLEDMD.js.map +0 -1
  188. package/dist/chunk-NYL63PSD.js.map +0 -1
  189. package/dist/chunk-TEYARRAK.js.map +0 -1
  190. package/dist/chunk-VCBTX62E.js.map +0 -1
  191. package/dist/chunk-Y74NWGQW.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,45 +1,45 @@
1
+ export { wireTokenSearchFields } from './chunk-R75GGNWY.js';
1
2
  export { wireResizableRegions } from './chunk-UIDKY4UB.js';
2
3
 
3
4
  export { wireScrollDividers } from './chunk-JCV4GXWB.js';
4
- export { reorderTabs, wireTabBars } from './chunk-C4OYOKWX.js';
5
- export { wireTokenSearchFields } from './chunk-A3CKOW2R.js';
6
- export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-RRB26JRJ.js';
5
+ export { reorderTabs, wireTabBars } from './chunk-UA6JW52D.js';
6
+ export { TokenSearchField, placeTokenSearchCaret, readTokenSearchField } from './chunk-RTJNJTG3.js';
7
7
  export { createTokenSearchModel } from './chunk-4SQK27MR.js';
8
8
  export { ValueTable, ValueTableRow } from './chunk-P7D3EMXM.js';
9
9
  export { Spacer } from './chunk-MEY33VWB.js';
10
10
  export { StateBanner } from './chunk-GLDWRCAM.js';
11
- export { SunkenPanel } from './chunk-6ZXOQEAN.js';
11
+ export { SunkenPanel } from './chunk-WF75U3V4.js';
12
12
  export { DialogSurface, PopupSurface } from './chunk-NN6GYOA2.js';
13
- export { TabBar } from './chunk-N3GKMPDW.js';
13
+ export { TabBar } from './chunk-RKTTF3L4.js';
14
14
  export { SegmentedControl } from './chunk-X5QSICJ3.js';
15
- export { Select } from './chunk-TEYARRAK.js';
15
+ export { Select } from './chunk-F7OCOBTG.js';
16
16
  export { ListInsetControl } from './chunk-5I7QGQVT.js';
17
17
  export { EmptyState } from './chunk-E36EVCKG.js';
18
18
  export { Grid } from './chunk-UCKKT6KO.js';
19
- export { ListActionRow } from './chunk-F4QMLOXJ.js';
19
+ export { ListActionRow } from './chunk-IAOAZUOO.js';
20
20
  export { AppTab } from './chunk-Q6YU3BT7.js';
21
- export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-VCBTX62E.js';
21
+ export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-ZRWXFDDS.js';
22
22
  export { ResizableRegion, clampRegionSize, resizeRegionFromPointer } from './chunk-KLJKU6ZL.js';
23
23
  export { Row } from './chunk-VZOFZPSO.js';
24
- export { ListHeader } from './chunk-5Q3N6EV7.js';
25
- export { Text } from './chunk-AUKT3KMG.js';
24
+ export { ListHeader } from './chunk-5IJ6UGNZ.js';
25
+ export { Text } from './chunk-CQHN45XR.js';
26
26
  export { ListInsetText } from './chunk-DG6G5EPF.js';
27
- export { ListItem, ListItemLink } from './chunk-SWVW56CV.js';
28
- export { List } from './chunk-NAPE7WUS.js';
29
-
30
- export { ToolbarText } from './chunk-3SXMEK3B.js';
31
- export { DisclosureArrow } from './chunk-KROD7KZK.js';
27
+ export { ListItem, ListItemLink } from './chunk-EN4LDR5Y.js';
28
+ export { ToolbarText } from './chunk-V3DX3K65.js';
29
+ export { DisclosureArrow } from './chunk-AUVG54KC.js';
32
30
  export { FloatingToolbar } from './chunk-I3Q7KKYM.js';
33
31
 
34
- export { LoadingSpinner } from './chunk-ZLWQZUGF.js';
35
32
  export { Skeleton } from './chunk-AHEG27M7.js';
36
33
  export { Badge } from './chunk-MP2GDBQZ.js';
37
- export { Chip } from './chunk-EAC4CDY7.js';
38
- export { Pane } from './chunk-EZVNC4J6.js';
39
- export { ToolbarActionLink, ToolbarControlGroup } from './chunk-7JUBXOIV.js';
40
- export { Toolbar } from './chunk-MERWRTBG.js';
41
- export { LucideIcon } from './chunk-4R777DUZ.js';
42
- export { ContentItem } from './chunk-MA73TA6D.js';
34
+ export { Chip } from './chunk-SMZGAPCU.js';
35
+ export { Pane } from './chunk-3BYFWTP3.js';
36
+ export { List } from './chunk-NAPE7WUS.js';
37
+
38
+ export { ToolbarActionLink, ToolbarControlGroup } from './chunk-NXWE5S57.js';
39
+ export { Toolbar } from './chunk-RGS4WX2M.js';
40
+ export { LucideIcon } from './chunk-MOSIE4Z2.js';
41
+ export { LoadingSpinner } from './chunk-ZLWQZUGF.js';
42
+ export { ContentItem } from './chunk-7AKGPBCC.js';
43
43
 
44
44
  export { calc, colorVar, em, flex, foregroundColorVar, lengthVar, pct, plus, px, rem, space, uiColor } from './chunk-2G2ZJQYK.js';
45
45
 
@@ -1,4 +1,4 @@
1
- export { ListActionRow } from './chunk-F4QMLOXJ.js';
1
+ export { ListActionRow } from './chunk-IAOAZUOO.js';
2
2
 
3
3
 
4
4
 
@@ -1,4 +1,4 @@
1
- export { ListHeader } from './chunk-5Q3N6EV7.js';
1
+ export { ListHeader } from './chunk-5IJ6UGNZ.js';
2
2
 
3
3
 
4
4
 
package/dist/list-item.js CHANGED
@@ -1,4 +1,4 @@
1
- export { ListItem, ListItemLink } from './chunk-SWVW56CV.js';
1
+ export { ListItem, ListItemLink } from './chunk-EN4LDR5Y.js';
2
2
 
3
3
 
4
4
 
@@ -2,15 +2,18 @@ import * as kerfjs from 'kerfjs';
2
2
  import { IconNode } from 'lucide';
3
3
 
4
4
  type LucideNode = IconNode;
5
+ type LucideIconSize = 'xs' | 's' | 'm' | 'l' | 'xl' | number;
5
6
  interface LucideIconProps {
6
7
  icon: LucideNode;
7
8
  name: string;
8
9
  className?: string;
9
10
  label?: string;
11
+ /** Named icon scale or positive pixel size, converted to rem. Omit for 1em. */
12
+ size?: LucideIconSize;
10
13
  /** Native named-slot assignment when composed inside a web component. */
11
14
  slot?: string;
12
15
  }
13
16
  /** Render a Lucide-compatible icon node without copying icon SVG strings. */
14
- declare function LucideIcon({ icon, name, className, label, slot, }: LucideIconProps): kerfjs.SafeHtml;
17
+ declare function LucideIcon({ icon, name, className, label, size, slot, }: LucideIconProps): kerfjs.SafeHtml;
15
18
 
16
- export { LucideIcon, type LucideIconProps, type LucideNode };
19
+ export { LucideIcon, type LucideIconProps, type LucideIconSize, type LucideNode };
@@ -1,3 +1,4 @@
1
- export { LucideIcon } from './chunk-4R777DUZ.js';
1
+ export { LucideIcon } from './chunk-MOSIE4Z2.js';
2
+
2
3
 
3
4
  //# sourceMappingURL=lucide-icon.js.map
@@ -1,8 +1,8 @@
1
1
  import * as kerfjs from 'kerfjs';
2
+ import { PaneAppearance } from './pane.js';
2
3
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
4
  import { ToolbarConfig } from './toolbar.js';
4
5
  import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
5
- import './pane.js';
6
6
  import './sides-BPSWde0A.js';
7
7
 
8
8
  /**
@@ -13,6 +13,8 @@ interface NavStackView {
13
13
  /** Stable identity for keyed reconcile and transition direction. */
14
14
  key: string;
15
15
  content: KerfUiContent;
16
+ /** Background of this view's scrolling work surface. */
17
+ appearance?: PaneAppearance;
16
18
  /** Title shown in the top toolbar for this view. */
17
19
  title?: string;
18
20
  /** Leading groups for this view's top toolbar, after the back control and before the title. */
package/dist/nav-stack.js CHANGED
@@ -1,4 +1,5 @@
1
- export { NavStack } from './chunk-5PESG2VP.js';
1
+ export { NavStack } from './chunk-HXCMWANP.js';
2
+
2
3
 
3
4
 
4
5
 
package/dist/pane.d.ts CHANGED
@@ -22,6 +22,7 @@ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
22
22
  'data-safe-area-inline-end'?: never;
23
23
  'data-chrome-placement'?: never;
24
24
  'data-chrome-dividers'?: never;
25
+ 'data-appearance'?: never;
25
26
  }>;
26
27
  /** How a Pane's header and footer relate to its scrolling content. */
27
28
  type PaneChromePlacement = 'fixed' | 'auto';
@@ -31,6 +32,8 @@ type PaneChromePlacement = 'fixed' | 'auto';
31
32
  * chrome, as `wireScrollDividers` reports; `always`; or `none`.
32
33
  */
33
34
  type PaneChromeDividers = 'scroll' | 'always' | 'none';
35
+ /** Background treatment of the Pane's scrolling work surface. */
36
+ type PaneAppearance = 'default' | 'sunken';
34
37
  interface PaneProps {
35
38
  /** Optional fixed chrome above the scrolling content, arranged vertically. */
36
39
  header?: KerfUiContent;
@@ -48,7 +51,8 @@ interface PaneProps {
48
51
  chromePlacement?: PaneChromePlacement;
49
52
  /**
50
53
  * The divider under the header and over the footer, where they meet the
51
- * scrolling content. `scroll` (default) shows the header's divider only
54
+ * scrolling content. Omitted defaults to `scroll` for a plain pane and
55
+ * `always` for `appearance="sunken"`. `scroll` shows the header's divider only
52
56
  * while the content is scrolled down, and the footer's only while more
53
57
  * content lies below — never when the content fits — once
54
58
  * `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is wired above
@@ -56,6 +60,8 @@ interface PaneProps {
56
60
  * The line is drawn inside the chrome, so no state moves the content.
57
61
  */
58
62
  chromeDividers?: PaneChromeDividers;
63
+ /** Paint the scrolling work surface with the shared lowered-surface color. */
64
+ appearance?: PaneAppearance;
59
65
  /** Root semantics. Defaults to `div`. */
60
66
  element?: PaneElement;
61
67
  /** Scrolling content semantics. Defaults to `div`. */
@@ -90,13 +96,13 @@ interface PaneProps {
90
96
  * or a CollapsiblePanel) forwards, so the app configures that pane instead of
91
97
  * styling it. An omitted or `undefined` field keeps the composite's default.
92
98
  */
93
- type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers'>;
99
+ type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'appearance'>;
94
100
  /**
95
101
  * An unpadded application column with optional fixed header/footer slots and one
96
102
  * scrolling vertical content owner. Separator lines are independently opt-in on
97
103
  * each logical edge, so the same component works as a sidebar, main area,
98
104
  * inspector, or dialog column.
99
105
  */
100
- declare function Pane({ header, children, footer, chromePlacement, chromeDividers, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
106
+ declare function Pane({ header, children, footer, chromePlacement, chromeDividers, appearance, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
101
107
 
102
- export { Pane, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
108
+ export { Pane, type PaneAppearance, type PaneChromeDividers, type PaneChromePlacement, type PaneConfig, type PaneContentElement, type PaneElement, type PaneProps, type PaneSeparatorSide };
package/dist/pane.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Pane } from './chunk-EZVNC4J6.js';
1
+ export { Pane } from './chunk-3BYFWTP3.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=pane.js.map
@@ -1,5 +1,5 @@
1
- import { LucideIcon } from './lucide-icon.js';
2
1
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
2
+ import { LucideIcon } from './lucide-icon.js';
3
3
  import { ToolbarConfig } from './toolbar.js';
4
4
 
5
5
  /** Which edge a collapsible panel docks to. */
@@ -59,5 +59,14 @@ interface PanelToolbar extends ToolbarConfig {
59
59
  trailing?: KerfUiContent;
60
60
  toggle?: PanelToggle;
61
61
  }
62
+ /** A panel's fixed bottom toolbar, below its optional footer content. */
63
+ interface PanelBottomToolbar extends ToolbarConfig {
64
+ label: string;
65
+ leading?: KerfUiContent;
66
+ center?: KerfUiContent;
67
+ trailing?: KerfUiContent;
68
+ }
69
+ /** Whether panel chrome stays fixed, scrolls, or follows Pane's auto rule. */
70
+ type PanelChromePlacement = 'fixed' | 'scroll' | 'auto';
62
71
 
63
- export { type PanelSide as P, type PanelToolbar as a, type PanelToggle as b, collapsiblePanelToggleIcon as c };
72
+ export { type PanelSide as P, type PanelToolbar as a, type PanelChromePlacement as b, type PanelBottomToolbar as c, type PanelToggle as d, collapsiblePanelToggleIcon as e };
@@ -1,7 +1,7 @@
1
1
  import { installHelpTags } from './chunk-BFPBS5Y4.js';
2
2
  import '@awesome.me/webawesome/dist/components/button/button.js';
3
3
  import '@awesome.me/webawesome/dist/components/divider/divider.js';
4
- import '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';
4
+ import WaDropdownItem from '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';
5
5
  import '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';
6
6
  import WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';
7
7
 
@@ -21,8 +21,45 @@ function installPopupMenuKeyboard(prototype) {
21
21
  };
22
22
  }
23
23
 
24
+ // src/install-popup-menu-submenu-focus.ts
25
+ var installed2 = /* @__PURE__ */ new WeakSet();
26
+ function installPopupMenuSubmenuFocus(prototype) {
27
+ if (installed2.has(prototype)) return;
28
+ installed2.add(prototype);
29
+ const target = prototype;
30
+ const openSubmenu = target.openSubmenu;
31
+ target.openSubmenu = async function() {
32
+ const submenu = this.submenuElement;
33
+ if (!this.closest("wa-dropdown.kui-popup-menu") || !submenu)
34
+ return openSubmenu.call(this);
35
+ let desired;
36
+ const trackFocus = (event) => {
37
+ const item = event.composedPath().find(
38
+ (node) => node instanceof HTMLElement && node.localName === "wa-dropdown-item" && node.getAttribute("slot") === "submenu"
39
+ );
40
+ if (item && this.getSubmenuItems().includes(item)) desired = item;
41
+ };
42
+ submenu.addEventListener("focusin", trackFocus);
43
+ try {
44
+ await openSubmenu.call(this);
45
+ } finally {
46
+ submenu.removeEventListener("focusin", trackFocus);
47
+ }
48
+ const items = this.getSubmenuItems();
49
+ if (!desired || desired === items[0]) return;
50
+ const selected = desired;
51
+ window.setTimeout(() => {
52
+ if (!this.isConnected || !this.submenuOpen || submenu.hidden || document.activeElement !== items[0])
53
+ return;
54
+ items.forEach((item) => item.active = item === selected);
55
+ selected.focus({ preventScroll: true });
56
+ }, 0);
57
+ };
58
+ }
59
+
24
60
  // src/popup-menu-register.ts
25
61
  installPopupMenuKeyboard(WaDropdown.prototype);
62
+ installPopupMenuSubmenuFocus(WaDropdownItem.prototype);
26
63
  installHelpTags();
27
64
  var popupMenuElementsRegistered = true;
28
65
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/install-popup-menu-keyboard.ts","../src/popup-menu-register.ts"],"names":[],"mappings":";;;;;;;;AAOA,IAAM,SAAA,uBAAgB,OAAA,EAAgB;AAW/B,SAAS,yBAAyB,SAAA,EAAyB;AAChE,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,EAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,SAAA;AACf,EAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA;AAC7B,EAAA,MAAA,CAAO,aAAA,GAAgB,SAAmC,IAAA,EAAM,KAAA,EAAa;AAC3E,IAAA,IACE,KAAA,YAAiB,iBACjB,IAAA,CAAK,SAAA,CAAU,SAAS,gBAAgB,CAAA,IACxC,CAAC,IAAA,CAAK,QAAA,EACN;AACA,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EACtC,CAAA;AACF;;;ACxBA,wBAAA,CAAyB,WAAW,SAAS,CAAA;AAC7C,eAAA,EAAgB;AAQT,IAAM,2BAAA,GAA8B","file":"popup-menu-register.js","sourcesContent":["interface PopupMenuDropdown extends HTMLElement {\n makeSelection(\n item: HTMLElement & { disabled?: boolean },\n event?: Event,\n ): void;\n}\n\nconst installed = new WeakSet<object>();\n\n/**\n * Route a keyboard choice in a `PopupMenu` through the item's click. Web Awesome\n * selects a pointer choice from the item's click event but a keyboard choice\n * (Enter or Space) directly, so delegated `data-action` click handlers would\n * never run for keyboard users. Clicking the item makes Web Awesome select it\n * exactly as it does for a pointer — one `wa-select`, then close and focus\n * return — while the click reaches the application's delegation. Raw\n * `wa-dropdown`s outside `PopupMenu` are unaffected.\n */\nexport function installPopupMenuKeyboard(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const makeSelection = target.makeSelection;\n target.makeSelection = function (this: PopupMenuDropdown, item, event): void {\n if (\n event instanceof KeyboardEvent &&\n this.classList.contains('kui-popup-menu') &&\n !item.disabled\n ) {\n item.click();\n return;\n }\n makeSelection.call(this, item, event);\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\n\nimport { installHelpTags } from './install-help-tag.js';\nimport { installPopupMenuKeyboard } from './install-popup-menu-keyboard.js';\n\ninstallPopupMenuKeyboard(WaDropdown.prototype);\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module registers the\n * Web Awesome elements a `PopupMenu` renders (`wa-dropdown`,\n * `wa-dropdown-item`, `wa-button`, and `wa-divider`) and routes a keyboard\n * choice through the item's click so delegated `data-action`s run.\n */\nexport const popupMenuElementsRegistered = true;\n"]}
1
+ {"version":3,"sources":["../src/install-popup-menu-keyboard.ts","../src/install-popup-menu-submenu-focus.ts","../src/popup-menu-register.ts"],"names":["installed"],"mappings":"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","file":"popup-menu-register.js","sourcesContent":["interface PopupMenuDropdown extends HTMLElement {\n makeSelection(\n item: HTMLElement & { disabled?: boolean },\n event?: Event,\n ): void;\n}\n\nconst installed = new WeakSet<object>();\n\n/**\n * Route a keyboard choice in a `PopupMenu` through the item's click. Web Awesome\n * selects a pointer choice from the item's click event but a keyboard choice\n * (Enter or Space) directly, so delegated `data-action` click handlers would\n * never run for keyboard users. Clicking the item makes Web Awesome select it\n * exactly as it does for a pointer — one `wa-select`, then close and focus\n * return — while the click reaches the application's delegation. Raw\n * `wa-dropdown`s outside `PopupMenu` are unaffected.\n */\nexport function installPopupMenuKeyboard(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuDropdown;\n const makeSelection = target.makeSelection;\n target.makeSelection = function (this: PopupMenuDropdown, item, event): void {\n if (\n event instanceof KeyboardEvent &&\n this.classList.contains('kui-popup-menu') &&\n !item.disabled\n ) {\n item.click();\n return;\n }\n makeSelection.call(this, item, event);\n };\n}\n","interface SubmenuItem extends HTMLElement {\n active: boolean;\n}\n\ninterface PopupMenuParentItem extends HTMLElement {\n submenuElement?: HTMLElement;\n submenuOpen: boolean;\n getSubmenuItems(): SubmenuItem[];\n openSubmenu(): Promise<void>;\n}\n\nconst installed = new WeakSet<object>();\n\n/** Preserve a rapid keyboard move past Web Awesome's late first-item focus. */\nexport function installPopupMenuSubmenuFocus(prototype: object): void {\n if (installed.has(prototype)) return;\n installed.add(prototype);\n const target = prototype as PopupMenuParentItem;\n const openSubmenu = target.openSubmenu;\n target.openSubmenu = async function (\n this: PopupMenuParentItem,\n ): Promise<void> {\n const submenu = this.submenuElement;\n if (!this.closest('wa-dropdown.kui-popup-menu') || !submenu)\n return openSubmenu.call(this);\n\n let desired: SubmenuItem | undefined;\n const trackFocus = (event: FocusEvent) => {\n const item = event\n .composedPath()\n .find(\n (node): node is SubmenuItem =>\n node instanceof HTMLElement &&\n node.localName === 'wa-dropdown-item' &&\n node.getAttribute('slot') === 'submenu',\n );\n if (item && this.getSubmenuItems().includes(item)) desired = item;\n };\n submenu.addEventListener('focusin', trackFocus);\n try {\n await openSubmenu.call(this);\n } finally {\n submenu.removeEventListener('focusin', trackFocus);\n }\n\n const items = this.getSubmenuItems();\n if (!desired || desired === items[0]) return;\n const selected = desired;\n // Web Awesome queues its first-item focus after the show animation. This\n // timer follows that one, restoring a user's later arrow choice only if\n // the queued focus actually reset it. Pointer/blur/close paths are left alone.\n window.setTimeout(() => {\n if (\n !this.isConnected ||\n !this.submenuOpen ||\n submenu.hidden ||\n document.activeElement !== items[0]\n )\n return;\n items.forEach((item) => (item.active = item === selected));\n selected.focus({ preventScroll: true });\n }, 0);\n };\n}\n","import '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\n\nimport WaDropdown from '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport WaDropdownItem from '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\n\nimport { installHelpTags } from './install-help-tag.js';\nimport { installPopupMenuKeyboard } from './install-popup-menu-keyboard.js';\nimport { installPopupMenuSubmenuFocus } from './install-popup-menu-submenu-focus.js';\n\ninstallPopupMenuKeyboard(WaDropdown.prototype);\ninstallPopupMenuSubmenuFocus(WaDropdownItem.prototype);\ninstallHelpTags();\n\n/**\n * Marker export for tests and tooling; importing this module registers the\n * Web Awesome elements a `PopupMenu` renders (`wa-dropdown`,\n * `wa-dropdown-item`, `wa-button`, and `wa-divider`) and routes a keyboard\n * choice through the item's click so delegated `data-action`s run.\n */\nexport const popupMenuElementsRegistered = true;\n"]}
@@ -18,9 +18,9 @@ interface PopupMenuItem {
18
18
  value?: string;
19
19
  /** Leading icon, typically a `LucideIcon`; it is placed in the item's icon slot. */
20
20
  icon?: SafeHtml;
21
- /** A checked menu choice, including nested choices. */
21
+ /** A checkbox choice, including nested choices; omit for a plain command. */
22
22
  checked?: boolean;
23
- /** Trailing safe content, such as a selected-choice tick. */
23
+ /** Trailing safe content, such as secondary status. */
24
24
  details?: SafeHtml;
25
25
  /** Destructive command styling. */
26
26
  tone?: 'default' | 'danger';
@@ -1,3 +1,3 @@
1
- export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-VCBTX62E.js';
1
+ export { PopupMenu, closePopupMenu, openPopupMenuAt } from './chunk-ZRWXFDDS.js';
2
2
 
3
3
  //# sourceMappingURL=popup-menu.js.map
package/dist/select.d.ts CHANGED
@@ -58,6 +58,8 @@ interface SelectBaseProps<Value extends string = string> {
58
58
  size?: SelectSize;
59
59
  /** Closed trigger width; omit to keep the presentation's default. */
60
60
  triggerWidth?: SelectTriggerWidth;
61
+ /** Show the disclosure caret (default); omit it for a compact icon-only trigger. */
62
+ caret?: boolean;
61
63
  /** Let an enclosing ToolbarControlGroup paint the composed focus ring. */
62
64
  focusRingOwner?: SelectFocusRingOwner;
63
65
  /** Maximum closed-control label width in CSS pixels before ellipsis. */
package/dist/select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-TEYARRAK.js';
1
+ export { Select } from './chunk-F7OCOBTG.js';
2
2
 
3
3
 
4
4
 
@@ -2,8 +2,8 @@ import * as kerfjs from 'kerfjs';
2
2
  import { NavStackProps, NavStackView } from './nav-stack.js';
3
3
  import { ResizableRegionProps } from './resizable-region.js';
4
4
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
5
- import './toolbar.js';
6
5
  import './pane.js';
6
+ import './toolbar.js';
7
7
  import './sides-BPSWde0A.js';
8
8
  import './toolbar-text.js';
9
9
  import './css-values.js';
@@ -1,4 +1,4 @@
1
- import { NavStack } from './chunk-5PESG2VP.js';
1
+ import { NavStack } from './chunk-HXCMWANP.js';
2
2
  import { ResizableRegion } from './chunk-KLJKU6ZL.js';
3
3
 
4
4
 
@@ -6,6 +6,7 @@ import { ResizableRegion } from './chunk-KLJKU6ZL.js';
6
6
 
7
7
 
8
8
 
9
+
9
10
  import { jsx, jsxs } from 'kerfjs/jsx-runtime';
10
11
 
11
12
  function SplitView({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from './nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from './resizable-region.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\n/**\n * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /\n * `max` limits, plus the region configuration that forwards unchanged\n * (`separator`, `handleIcon`, `contentOverflow`, and collapse:\n * `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,\n * `restorePosition`). Omitted options keep the region's defaults.\n */\nexport interface SplitViewResizable extends Pick<\n ResizableRegionProps,\n | 'separator'\n | 'handleIcon'\n | 'contentOverflow'\n | 'collapsed'\n | 'transitioning'\n | 'collapseMotion'\n | 'restoreControl'\n | 'restorePosition'\n> {\n size: number;\n min: number;\n max: number;\n}\n\n/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */\nexport type SplitViewCompactViewToolbars = Pick<\n NavStackView,\n 'leading' | 'center' | 'toolbar' | 'bottomToolbar'\n>;\n\n/**\n * The compact `NavStack`'s configuration: its toolbar configuration, back\n * control, persistent bottom toolbar, and chrome dividers forward to the\n * stack, and `list` / `detail` give each view its own toolbar groups.\n */\nexport interface SplitViewCompactStack extends Pick<\n NavStackProps,\n | 'toolbarConfig'\n | 'backIcon'\n | 'backText'\n | 'hideToolbar'\n | 'bottomToolbar'\n | 'chromeDividers'\n> {\n /** Toolbar content for the list (root) view. */\n list?: SplitViewCompactViewToolbars;\n /** Toolbar content for the pushed detail view. */\n detail?: SplitViewCompactViewToolbars;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: KerfUiContent;\n /** The detail (secondary) pane. */\n detail: KerfUiContent;\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 /** Compact NavStack configuration and per-view toolbars. */\n compactStack?: SplitViewCompactStack;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: 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 compactStack = {},\n resizable,\n className = '',\n slot,\n}: SplitViewProps) {\n if (compact) {\n const listView: NavStackView = {\n ...compactStack.list,\n key: 'list',\n title: listTitle,\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n title: detailTitle,\n content: detail,\n },\n ]\n : [listView];\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 slot={slot}\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n backIcon={compactStack.backIcon}\n backText={compactStack.backText}\n toolbarConfig={compactStack.toolbarConfig}\n hideToolbar={compactStack.hideToolbar}\n bottomToolbar={compactStack.bottomToolbar}\n chromeDividers={compactStack.chromeDividers}\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 separator={resizable.separator}\n handleIcon={resizable.handleIcon}\n contentOverflow={resizable.contentOverflow}\n collapsed={resizable.collapsed}\n transitioning={resizable.transitioning}\n collapseMotion={resizable.collapseMotion}\n restoreControl={resizable.restoreControl}\n restorePosition={resizable.restorePosition}\n >\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"true\"\n >\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"false\"\n >\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 slot={slot}\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
+ {"version":3,"sources":["../src/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from './nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from './resizable-region.js';\nimport type { KerfUiContent } from './semantic-content.js';\n\n/**\n * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /\n * `max` limits, plus the region configuration that forwards unchanged\n * (`separator`, `handleIcon`, `contentOverflow`, and collapse:\n * `collapsed`, `transitioning`, `collapseMotion`, `restoreControl`,\n * `restorePosition`). Omitted options keep the region's defaults.\n */\nexport interface SplitViewResizable extends Pick<\n ResizableRegionProps,\n | 'separator'\n | 'handleIcon'\n | 'contentOverflow'\n | 'collapsed'\n | 'transitioning'\n | 'collapseMotion'\n | 'restoreControl'\n | 'restorePosition'\n> {\n size: number;\n min: number;\n max: number;\n}\n\n/** One compact view's top- and bottom-toolbar content (see `NavStackView`). */\nexport type SplitViewCompactViewToolbars = Pick<\n NavStackView,\n 'leading' | 'center' | 'toolbar' | 'bottomToolbar'\n>;\n\n/**\n * The compact `NavStack`'s configuration: its toolbar configuration, back\n * control, persistent bottom toolbar, and chrome dividers forward to the\n * stack, and `list` / `detail` give each view its own toolbar groups.\n */\nexport interface SplitViewCompactStack extends Pick<\n NavStackProps,\n | 'toolbarConfig'\n | 'backIcon'\n | 'backText'\n | 'hideToolbar'\n | 'bottomToolbar'\n | 'chromeDividers'\n> {\n /** Toolbar content for the list (root) view. */\n list?: SplitViewCompactViewToolbars;\n /** Toolbar content for the pushed detail view. */\n detail?: SplitViewCompactViewToolbars;\n}\n\nexport interface SplitViewProps {\n id: string;\n label: string;\n /** The list (primary) pane. */\n list: KerfUiContent;\n /** The detail (secondary) pane. */\n detail: KerfUiContent;\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 /** Compact NavStack configuration and per-view toolbars. */\n compactStack?: SplitViewCompactStack;\n /** A resizable separator on roomy classes (min/max px). Omit for a fixed split. */\n resizable?: SplitViewResizable;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: 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 compactStack = {},\n resizable,\n className = '',\n slot,\n}: SplitViewProps) {\n if (compact) {\n const listView: NavStackView = {\n ...compactStack.list,\n key: 'list',\n title: listTitle,\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n title: detailTitle,\n content: detail,\n },\n ]\n : [listView];\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 slot={slot}\n >\n <NavStack\n id={`${id}-stack`}\n label={label}\n views={views}\n backLabel={backLabel}\n backIcon={compactStack.backIcon}\n backText={compactStack.backText}\n toolbarConfig={compactStack.toolbarConfig}\n hideToolbar={compactStack.hideToolbar}\n bottomToolbar={compactStack.bottomToolbar}\n chromeDividers={compactStack.chromeDividers}\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 separator={resizable.separator}\n handleIcon={resizable.handleIcon}\n contentOverflow={resizable.contentOverflow}\n collapsed={resizable.collapsed}\n transitioning={resizable.transitioning}\n collapseMotion={resizable.collapseMotion}\n restoreControl={resizable.restoreControl}\n restorePosition={resizable.restorePosition}\n >\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"true\"\n >\n {list}\n </div>\n </ResizableRegion>\n ) : (\n <div\n class=\"kui-split-view__list kui-pane\"\n data-split-list\n data-resizable=\"false\"\n >\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 slot={slot}\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"]}
@@ -162,6 +162,90 @@
162
162
  width: 2rem;
163
163
  min-width: 2rem;
164
164
  }
165
+ /* TabBar owns the tablist width query; AppTab owns its own responsive
166
+ geometry and visually hidden name. The name remains in the accessibility
167
+ tree, so the tab keeps its accessible name without a rerender. */
168
+ @container kui-tab-bar-tabs (max-width: 52rem) {
169
+ .kui-tab-bar[data-icon-only-at="wide"]
170
+ .kui-tab-bar__tabs
171
+ > .kui-app-tab[data-presentation="segmented"] {
172
+ width: 2rem;
173
+ min-width: 2rem;
174
+ flex: none;
175
+ }
176
+ .kui-tab-bar[data-icon-only-at="wide"]
177
+ .kui-app-tab[data-presentation="segmented"]
178
+ .kui-app-tab__select {
179
+ width: 100%;
180
+ justify-content: center;
181
+ }
182
+ .kui-tab-bar[data-icon-only-at="wide"]
183
+ .kui-app-tab[data-presentation="segmented"]
184
+ .kui-app-tab__name {
185
+ position: absolute;
186
+ width: 1px;
187
+ height: 1px;
188
+ padding: 0;
189
+ overflow: hidden;
190
+ clip: rect(0, 0, 0, 0);
191
+ white-space: nowrap;
192
+ clip-path: inset(50%);
193
+ }
194
+ }
195
+ @container kui-tab-bar-tabs (max-width: 44rem) {
196
+ .kui-tab-bar[data-icon-only-at="narrow"]
197
+ .kui-tab-bar__tabs
198
+ > .kui-app-tab[data-presentation="segmented"] {
199
+ width: 2rem;
200
+ min-width: 2rem;
201
+ flex: none;
202
+ }
203
+ .kui-tab-bar[data-icon-only-at="narrow"]
204
+ .kui-app-tab[data-presentation="segmented"]
205
+ .kui-app-tab__select {
206
+ width: 100%;
207
+ justify-content: center;
208
+ }
209
+ .kui-tab-bar[data-icon-only-at="narrow"]
210
+ .kui-app-tab[data-presentation="segmented"]
211
+ .kui-app-tab__name {
212
+ position: absolute;
213
+ width: 1px;
214
+ height: 1px;
215
+ padding: 0;
216
+ overflow: hidden;
217
+ clip: rect(0, 0, 0, 0);
218
+ white-space: nowrap;
219
+ clip-path: inset(50%);
220
+ }
221
+ }
222
+ @container kui-tab-bar-tabs (max-width: 28rem) {
223
+ .kui-tab-bar[data-icon-only-at="compact"]
224
+ .kui-tab-bar__tabs
225
+ > .kui-app-tab[data-presentation="segmented"] {
226
+ width: 2rem;
227
+ min-width: 2rem;
228
+ flex: none;
229
+ }
230
+ .kui-tab-bar[data-icon-only-at="compact"]
231
+ .kui-app-tab[data-presentation="segmented"]
232
+ .kui-app-tab__select {
233
+ width: 100%;
234
+ justify-content: center;
235
+ }
236
+ .kui-tab-bar[data-icon-only-at="compact"]
237
+ .kui-app-tab[data-presentation="segmented"]
238
+ .kui-app-tab__name {
239
+ position: absolute;
240
+ width: 1px;
241
+ height: 1px;
242
+ padding: 0;
243
+ overflow: hidden;
244
+ clip: rect(0, 0, 0, 0);
245
+ white-space: nowrap;
246
+ clip-path: inset(50%);
247
+ }
248
+ }
165
249
  /* In a TabBar, the tab styles itself in the context of its parent strip. A
166
250
  segmented strip's outer ends follow the pill track: the first tab's leading
167
251
  corners, and a filled strip's last tab's trailing corners, are pill-rounded
@@ -82,6 +82,20 @@
82
82
  pointer-events: none;
83
83
  }
84
84
 
85
+ .kui-chip[data-truncate] {
86
+ max-width: 100%;
87
+ overflow: hidden;
88
+ }
89
+
90
+ .kui-chip__icon {
91
+ display: inline-grid;
92
+ width: 1em;
93
+ height: 1em;
94
+ color: inherit;
95
+ place-items: center;
96
+ flex: none;
97
+ }
98
+
85
99
  .kui-chip__label {
86
100
  min-width: 0;
87
101
  overflow: hidden;
@@ -28,3 +28,39 @@
28
28
  .kui-content-item--framed {
29
29
  --kui-content-item-border: var(--kui-color-neutral-border-normal);
30
30
  }
31
+
32
+ .kui-content-item[data-interactive="true"] {
33
+ color: var(--kui-color-neutral-on-normal);
34
+ cursor: pointer;
35
+ }
36
+
37
+ .kui-content-item[data-interactive="true"]:hover:not(
38
+ [data-disabled="true"],
39
+ [data-selected="true"]
40
+ ),
41
+ .kui-content-item[data-interactive="true"][data-kui-pressed="true"]:not(
42
+ [data-selected="true"]
43
+ ) {
44
+ --kui-content-item-border: var(--kui-color-neutral-border-normal);
45
+ --kui-content-item-background: var(--kui-color-neutral-fill-quiet);
46
+ }
47
+
48
+ .kui-content-item[data-interactive="true"]:active:not([data-disabled="true"]) {
49
+ --kui-content-item-background: var(--kui-color-neutral-fill-normal);
50
+ }
51
+
52
+ .kui-content-item[data-interactive="true"][data-selected="true"] {
53
+ --kui-content-item-border: var(--kui-color-brand-border-quiet);
54
+ --kui-content-item-background: var(--kui-color-brand-fill-normal);
55
+ }
56
+
57
+ .kui-content-item[data-interactive="true"]:focus-visible {
58
+ outline: var(--kui-focus-ring);
59
+ outline-offset: 1px;
60
+ }
61
+
62
+ .kui-content-item[data-interactive="true"][data-disabled="true"] {
63
+ color: var(--kui-color-neutral-on-quiet);
64
+ opacity: 0.58;
65
+ cursor: not-allowed;
66
+ }
@@ -1,5 +1,4 @@
1
1
  .kui-list-action-row {
2
- --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
3
2
  --kui-list-action-row-color: var(--kui-color-neutral-on-normal);
4
3
  --kui-list-action-row-border: transparent;
5
4
  --kui-list-action-row-background: transparent;
@@ -33,14 +32,16 @@
33
32
 
34
33
  .kui-list-action-row[data-divider="before"],
35
34
  .kui-list-action-row[data-divider="both"] {
36
- border-block-start: 1px solid var(--kui-list-group-divider-color);
35
+ border-block-start: 1px solid
36
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
37
37
  border-start-start-radius: 0;
38
38
  border-start-end-radius: 0;
39
39
  }
40
40
 
41
41
  .kui-list-action-row[data-divider="after"],
42
42
  .kui-list-action-row[data-divider="both"] {
43
- border-block-end: 1px solid var(--kui-list-group-divider-color);
43
+ border-block-end: 1px solid
44
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
44
45
  border-end-start-radius: 0;
45
46
  border-end-end-radius: 0;
46
47
  }
@@ -1,5 +1,4 @@
1
1
  .kui-list-header {
2
- --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
3
2
  --kui-list-header-color: var(--kui-color-neutral-on-quiet);
4
3
  --kui-list-header-hover-background: var(--kui-color-neutral-border-quiet);
5
4
  --_kui-list-header-action-icon-size: var(
@@ -32,12 +31,14 @@
32
31
 
33
32
  .kui-list-header[data-divider="before"],
34
33
  .kui-list-header[data-divider="both"] {
35
- border-block-start: 1px solid var(--kui-list-group-divider-color);
34
+ border-block-start: 1px solid
35
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
36
36
  }
37
37
 
38
38
  .kui-list-header[data-divider="after"],
39
39
  .kui-list-header[data-divider="both"] {
40
- border-block-end: 1px solid var(--kui-list-group-divider-color);
40
+ border-block-end: 1px solid
41
+ var(--kui-list-group-divider-color, var(--kui-color-neutral-border-quiet));
41
42
  }
42
43
 
43
44
  .kui-list-header[data-inline="true"] {