@kerfjs/ui 5.0.0-beta.77 → 5.0.0-beta.79

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 (128) hide show
  1. package/README.md +9 -4
  2. package/ai/application-ui-diagnostic-ids-v1.json +4 -0
  3. package/ai/compile-time-contracts-v1.json +3 -3
  4. package/ai/component-catalog.json +152 -31
  5. package/ai/component-composition-rules.json +6 -14
  6. package/ai/component-composition.json +123 -29
  7. package/ai/components/README.md +1 -1
  8. package/ai/components/document-baseline.md +1 -1
  9. package/ai/components/nav-stack.md +6 -6
  10. package/ai/components/pane.md +3 -1
  11. package/ai/components/surface-scaffold.md +11 -2
  12. package/ai/components/{tab-scaffold.md → tab-navigator.md} +14 -14
  13. package/ai/components/token-search-field.md +1 -0
  14. package/ai/components/toolbar-control-group.md +2 -0
  15. package/ai/components/toolbar-text.md +2 -0
  16. package/ai/components/toolbar.md +6 -8
  17. package/ai/public-api-signatures-v1.md +68 -140
  18. package/ai/skill.md +15 -4
  19. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  20. package/dist/browser/nav-stack.js +2 -0
  21. package/dist/browser/split-view.js +2 -0
  22. package/dist/browser/tab-navigator.js +4 -0
  23. package/dist/catalog-resources.d.ts +3 -3
  24. package/dist/catalog.d.ts +3 -3
  25. package/dist/catalog.js +3 -3
  26. package/dist/{chunk-WJN3V2H5.js → chunk-2GOCOLQL.js} +18 -4
  27. package/dist/chunk-2GOCOLQL.js.map +1 -0
  28. package/dist/{chunk-QYXKMLHO.js → chunk-3CXRQAYT.js} +2 -2
  29. package/dist/chunk-3CXRQAYT.js.map +1 -0
  30. package/dist/{chunk-G4VKQP7B.js → chunk-3SXWV2IR.js} +5 -1
  31. package/dist/chunk-3SXWV2IR.js.map +1 -0
  32. package/dist/{chunk-VLPE6OPN.js → chunk-62VMNBV2.js} +6 -2
  33. package/dist/chunk-62VMNBV2.js.map +1 -0
  34. package/dist/{chunk-XIZRXI7N.js → chunk-A7DYEERU.js} +13 -1
  35. package/dist/chunk-A7DYEERU.js.map +1 -0
  36. package/dist/{chunk-6VQPLV3O.js → chunk-DSLRNR43.js} +9 -8
  37. package/dist/chunk-DSLRNR43.js.map +1 -0
  38. package/dist/{chunk-AOAW55JN.js → chunk-DXQZ3BEO.js} +4 -1
  39. package/dist/chunk-DXQZ3BEO.js.map +1 -0
  40. package/dist/chunk-IKCUPTR2.js +170 -0
  41. package/dist/chunk-IKCUPTR2.js.map +1 -0
  42. package/dist/{chunk-Z6PE5T7N.js → chunk-JL4BBZP4.js} +4 -3
  43. package/dist/chunk-JL4BBZP4.js.map +1 -0
  44. package/dist/collapsible-panel.js +2 -2
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +8 -8
  47. package/dist/nav-stack-B1Qc2e5q.d.ts +101 -0
  48. package/dist/nav-stack.d.ts +11 -93
  49. package/dist/nav-stack.js +5 -1
  50. package/dist/pane.d.ts +5 -2
  51. package/dist/pane.js +1 -1
  52. package/dist/split-view.d.ts +9 -4
  53. package/dist/split-view.js +7 -3
  54. package/dist/split-view.js.map +1 -1
  55. package/dist/styles/components/actions/toolbar/toolbar.css +7 -14
  56. package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +63 -13
  57. package/dist/styles/components/actions/toolbar-text/toolbar-text.css +8 -1
  58. package/dist/styles/components/forms/token-search-field/token-search-field.css +12 -1
  59. package/dist/styles/components/layout/pane/pane.css +18 -1
  60. package/dist/styles/components/navigation/nav-stack/nav-stack.css +6 -12
  61. package/dist/styles/components/navigation/tab-scaffold/tab-scaffold.css +18 -1
  62. package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +55 -0
  63. package/dist/styles/nav-stack.css +6 -12
  64. package/dist/styles/pane.css +18 -1
  65. package/dist/styles/surface-scaffold.css +55 -0
  66. package/dist/styles/{tab-scaffold.css → tab-navigator.css} +18 -1
  67. package/dist/styles/token-search-field.css +12 -1
  68. package/dist/styles/toolbar-control-group.css +63 -13
  69. package/dist/styles/toolbar-text.css +8 -1
  70. package/dist/styles/toolbar.css +7 -14
  71. package/dist/surface-scaffold-register.d.ts +4 -0
  72. package/dist/surface-scaffold-register.js +59 -0
  73. package/dist/surface-scaffold-register.js.map +1 -0
  74. package/dist/surface-scaffold.d.ts +10 -2
  75. package/dist/surface-scaffold.js +1 -1
  76. package/dist/{tab-scaffold.d.ts → tab-navigator.d.ts} +12 -10
  77. package/dist/{tab-scaffold.js → tab-navigator.js} +4 -3
  78. package/dist/tab-navigator.js.map +1 -0
  79. package/dist/token-search-field.js +1 -1
  80. package/dist/wire-catalog.js +1 -1
  81. package/dist/wire-scroll-dividers.d.ts +3 -3
  82. package/dist/wire-scroll-dividers.js +1 -1
  83. package/dist/wire-tab-navigator.d.ts +11 -0
  84. package/dist/{wire-tab-scaffold.js → wire-tab-navigator.js} +3 -3
  85. package/dist/wire-tab-navigator.js.map +1 -0
  86. package/dist/wire-token-search-fields.js +1 -1
  87. package/dist/wire-toolbar-visibility.js +1 -1
  88. package/dist/workbench.d.ts +5 -13
  89. package/dist/workbench.js +1 -1
  90. package/docs/app-layouts.md +44 -11
  91. package/docs/component-contract.md +9 -2
  92. package/docs/component-selection.md +17 -15
  93. package/docs/design/templates/token-search-field/empty-dark.svg +1 -1
  94. package/docs/design/templates/token-search-field/empty.svg +1 -1
  95. package/docs/design/templates/token-search-field-dark.svg +1 -1
  96. package/docs/design/templates/token-search-field.svg +1 -1
  97. package/docs/design/templates.md +1 -1
  98. package/docs/examples/application-ui-profile.json +4 -4
  99. package/docs/layout.md +31 -8
  100. package/docs/nav-stack.md +30 -18
  101. package/docs/recipes.md +6 -2
  102. package/docs/split-view.md +7 -4
  103. package/docs/surface-scaffold.md +46 -0
  104. package/docs/{tab-scaffold.md → tab-navigator.md} +83 -11
  105. package/docs/type-contracts.md +3 -3
  106. package/docs/ui-analyzer.md +5 -0
  107. package/docs/ui-doctor.md +33 -0
  108. package/docs/workbench.md +3 -2
  109. package/doctor/component-style-checks.mjs +457 -0
  110. package/doctor/index.mjs +43 -13
  111. package/llms.txt +18 -6
  112. package/package.json +16 -11
  113. package/ux-demo/recipes/list-detail-dialog.tsx +4 -0
  114. package/ux-demo/recipes/navigation-stack.tsx +2 -2
  115. package/dist/browser/tab-scaffold.js +0 -4
  116. package/dist/chunk-6VQPLV3O.js.map +0 -1
  117. package/dist/chunk-AOAW55JN.js.map +0 -1
  118. package/dist/chunk-G4VKQP7B.js.map +0 -1
  119. package/dist/chunk-QYXKMLHO.js.map +0 -1
  120. package/dist/chunk-VLPE6OPN.js.map +0 -1
  121. package/dist/chunk-WJN3V2H5.js.map +0 -1
  122. package/dist/chunk-XIZRXI7N.js.map +0 -1
  123. package/dist/chunk-Z4EPMX25.js +0 -123
  124. package/dist/chunk-Z4EPMX25.js.map +0 -1
  125. package/dist/chunk-Z6PE5T7N.js.map +0 -1
  126. package/dist/tab-scaffold.js.map +0 -1
  127. package/dist/wire-tab-scaffold.d.ts +0 -11
  128. package/dist/wire-tab-scaffold.js.map +0 -1
@@ -0,0 +1,101 @@
1
+ import * as kerfjs from 'kerfjs';
2
+ import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
+ import { ListConfig } from './list.js';
4
+ import { PaneConfig } from './pane.js';
5
+ import { c as PanelBottomToolbar } from './panel-toolbar-CL9tYOkh.js';
6
+ import { ToolbarConfig } from './toolbar.js';
7
+ import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
8
+
9
+ /** Content and chrome shared by a navigation view and a static workbench panel. */
10
+ interface NavPane<TToolbar, TBottomToolbar> {
11
+ content: KerfUiContent;
12
+ toolbar?: TToolbar;
13
+ header?: KerfUiContent;
14
+ headerList?: ListConfig;
15
+ footer?: KerfUiContent;
16
+ footerList?: ListConfig;
17
+ bottomToolbar?: TBottomToolbar;
18
+ pane?: PaneConfig;
19
+ }
20
+
21
+ /**
22
+ * One entry in a {@link NavStack}. The app owns the stack as an array (usually a
23
+ * signal); `NavStack` renders it and `wireNavStack` animates the transitions.
24
+ */
25
+ interface NavStackView extends NavPane<NavStackViewToolbar, PanelBottomToolbar> {
26
+ /** Stable identity for keyed reconcile and transition direction. */
27
+ key: string;
28
+ }
29
+ /** Per-view top toolbar. The stack supplies its back control before `leading`. */
30
+ interface NavStackViewToolbar extends NavStackToolbarConfig {
31
+ title?: string;
32
+ leading?: KerfUiContent;
33
+ center?: KerfUiContent;
34
+ trailing?: KerfUiContent;
35
+ }
36
+ /** A view's structured bottom toolbar; it cross-fades on navigation. */
37
+ type NavStackViewBottomToolbar = PanelBottomToolbar;
38
+ /**
39
+ * The top toolbar's configuration. Its `ToolbarConfig` forwards to the real
40
+ * `Toolbar` the stack renders; by default that toolbar draws no divider and
41
+ * claims the top and side safe-area edges the stack still touches.
42
+ */
43
+ interface NavStackToolbarConfig extends ToolbarConfig {
44
+ /** Accessible name of the top toolbar (default: none). */
45
+ label?: string;
46
+ /** Size of the view title's `ToolbarText` (default `large`). */
47
+ titleSize?: ToolbarTextSize;
48
+ /** Expose the view title as a heading at this level (default: a plain span). */
49
+ headingLevel?: HeadingLevel;
50
+ }
51
+ interface NavStackProps {
52
+ id: string;
53
+ /** Accessible name for the stack region. */
54
+ label: string;
55
+ /** The stack, root first; the last entry is the active top view. */
56
+ views: NavStackView[];
57
+ /** Accessible label for the icon-only back control (default "Back"). */
58
+ backLabel?: string;
59
+ /** The back control's icon (default a chevron-left `LucideIcon`). */
60
+ backIcon?: KerfUiContent;
61
+ /**
62
+ * Visible text beside the back icon, such as the previous view's title
63
+ * (default: icon only). When set, the text names the control and
64
+ * `backLabel` is not used.
65
+ */
66
+ backText?: string;
67
+ /** The top toolbar's configuration, forwarded to its `Toolbar`. */
68
+ toolbarConfig?: NavStackToolbarConfig;
69
+ /** Persistent last group in every view's top toolbar, supplied by a hosting panel. */
70
+ panelToggle?: KerfUiContent;
71
+ /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */
72
+ hideToolbar?: boolean;
73
+ /** Optional persistent bottom toolbar used when the active view does not provide one. */
74
+ bottomToolbar?: NavStackViewBottomToolbar;
75
+ /**
76
+ * The line under the top chrome and over the bottom toolbar, where they
77
+ * meet the active view. `scroll` (default) shows the chrome's line only
78
+ * while the view's content is scrolled beneath it, and the bottom
79
+ * toolbar's only while more content lies below — never when the content
80
+ * fits — once `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is
81
+ * wired above the stack; unwired, neither shows. `always` shows both
82
+ * without the wiring; `none` neither, even when wired. The line is drawn
83
+ * inside the chrome, so no state moves the chrome or the content. A
84
+ * `toolbarConfig.dividerSides` edge is the Toolbar's own and is unaffected.
85
+ */
86
+ chromeDividers?: 'scroll' | 'always' | 'none';
87
+ className?: string;
88
+ /** Native named-slot assignment when composed inside a web component. */
89
+ slot?: string;
90
+ }
91
+ /**
92
+ * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last
93
+ * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and
94
+ * cross-fades the chrome across a change. Its top chrome is a real `Toolbar`: the
95
+ * back control and title lead, the active view's `toolbar` fills the zones,
96
+ * and `toolbarConfig` supplies defaults. A single-pane
97
+ * layout is a `NavStack` with one entry. See `docs/23-app-layouts.md` §3.1.
98
+ */
99
+ declare function NavStack({ id, label, views, backLabel, backIcon, backText, toolbarConfig, panelToggle, hideToolbar, bottomToolbar, chromeDividers, className, slot, }: NavStackProps): kerfjs.SafeHtml;
100
+
101
+ export { type NavStackProps as N, type NavStackView as a, type NavPane as b, NavStack as c, type NavStackToolbarConfig as d, type NavStackViewBottomToolbar as e, type NavStackViewToolbar as f };
@@ -1,95 +1,13 @@
1
- import * as kerfjs from 'kerfjs';
2
- import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
- import { ToolbarConfig } from './toolbar.js';
4
- import { ToolbarTextSize, HeadingLevel } from './toolbar-text.js';
5
- import { PaneAppearance } from './pane.js';
1
+ export { c as NavStack, N as NavStackProps, d as NavStackToolbarConfig, a as NavStackView, e as NavStackViewBottomToolbar, f as NavStackViewToolbar } from './nav-stack-B1Qc2e5q.js';
2
+ import 'kerfjs';
3
+ import './semantic-content-BbzjvSu9.js';
4
+ import './list.js';
5
+ import './flex-alignment-4ms8ZbV8.js';
6
6
  import './sides-BPSWde0A.js';
7
7
  import './css-values.js';
8
-
9
- /**
10
- * One entry in a {@link NavStack}. The app owns the stack as an array (usually a
11
- * signal); `NavStack` renders it and `wireNavStack` animates the transitions.
12
- */
13
- interface NavStackView {
14
- /** Stable identity for keyed reconcile and transition direction. */
15
- key: string;
16
- content: KerfUiContent;
17
- /** Background of this view's scrolling work surface. */
18
- appearance?: PaneAppearance;
19
- /** Title shown in the top toolbar for this view. */
20
- title?: string;
21
- /** Leading groups for this view's top toolbar, after the back control and before the title. */
22
- leading?: KerfUiContent;
23
- /** Center content for this view's top toolbar (placed per `toolbarConfig.centerAlign`). */
24
- center?: KerfUiContent;
25
- /** Trailing actions for this view's top toolbar. */
26
- toolbar?: KerfUiContent;
27
- /** Fixed chrome below this view's toolbar, above its scrolling content. */
28
- header?: KerfUiContent;
29
- /** Bottom toolbar for this view. Cross-fades with the top chrome on navigation. */
30
- bottomToolbar?: KerfUiContent;
31
- }
32
- /**
33
- * The top toolbar's configuration. Its `ToolbarConfig` forwards to the real
34
- * `Toolbar` the stack renders; by default that toolbar draws no divider and
35
- * claims the top and side safe-area edges the stack still touches.
36
- */
37
- interface NavStackToolbarConfig extends ToolbarConfig {
38
- /** Accessible name of the top toolbar (default: none). */
39
- label?: string;
40
- /** Size of the view title's `ToolbarText` (default `large`). */
41
- titleSize?: ToolbarTextSize;
42
- /** Expose the view title as a heading at this level (default: a plain span). */
43
- headingLevel?: HeadingLevel;
44
- }
45
- interface NavStackProps {
46
- id: string;
47
- /** Accessible name for the stack region. */
48
- label: string;
49
- /** The stack, root first; the last entry is the active top view. */
50
- views: NavStackView[];
51
- /** Accessible label for the icon-only back control (default "Back"). */
52
- backLabel?: string;
53
- /** The back control's icon (default a chevron-left `LucideIcon`). */
54
- backIcon?: KerfUiContent;
55
- /**
56
- * Visible text beside the back icon, such as the previous view's title
57
- * (default: icon only). When set, the text names the control and
58
- * `backLabel` is not used.
59
- */
60
- backText?: string;
61
- /** The top toolbar's configuration, forwarded to its `Toolbar`. */
62
- toolbarConfig?: NavStackToolbarConfig;
63
- /** Persistent last group in every view's top toolbar, supplied by a hosting panel. */
64
- panelToggle?: KerfUiContent;
65
- /** Hide the top toolbar entirely (rare — a fully custom-chrome view). */
66
- hideToolbar?: boolean;
67
- /** Optional persistent bottom toolbar used when the active view does not provide one. */
68
- bottomToolbar?: KerfUiContent;
69
- /**
70
- * The line under the top chrome and over the bottom toolbar, where they
71
- * meet the active view. `scroll` (default) shows the chrome's line only
72
- * while the view's content is scrolled beneath it, and the bottom
73
- * toolbar's only while more content lies below — never when the content
74
- * fits — once `wireScrollDividers` (`@kerfjs/ui/wire-scroll-dividers`) is
75
- * wired above the stack; unwired, neither shows. `always` shows both
76
- * without the wiring; `none` neither, even when wired. The line is drawn
77
- * inside the chrome, so no state moves the chrome or the content. A
78
- * `toolbarConfig.dividerSides` edge is the Toolbar's own and is unaffected.
79
- */
80
- chromeDividers?: 'scroll' | 'always' | 'none';
81
- className?: string;
82
- /** Native named-slot assignment when composed inside a web component. */
83
- slot?: string;
84
- }
85
- /**
86
- * A navigation stack (iOS-style push/pop). Renders every entry stacked, the last
87
- * one active; `@kerfjs/ui/wire-nav-stack`'s `wireNavStack` slides the content and
88
- * cross-fades the chrome across a change. Its top chrome is a real `Toolbar`: the
89
- * back control and title lead, the active view's `leading` / `center` / `toolbar`
90
- * content fills the zones, and `toolbarConfig` configures it. A single-pane
91
- * layout is a `NavStack` with one entry. See `docs/23-app-layouts.md` §3.1.
92
- */
93
- declare function NavStack({ id, label, views, backLabel, backIcon, backText, toolbarConfig, panelToggle, hideToolbar, bottomToolbar, chromeDividers, className, slot, }: NavStackProps): kerfjs.SafeHtml;
94
-
95
- export { NavStack, type NavStackProps, type NavStackToolbarConfig, type NavStackView };
8
+ import './pane.js';
9
+ import './panel-toolbar-CL9tYOkh.js';
10
+ import './toolbar.js';
11
+ import './lucide-icon.js';
12
+ import 'lucide';
13
+ import './toolbar-text.js';
package/dist/nav-stack.js CHANGED
@@ -1,4 +1,8 @@
1
- export { NavStack } from './chunk-Z4EPMX25.js';
1
+ export { NavStack } from './chunk-IKCUPTR2.js';
2
+
3
+
4
+
5
+
2
6
 
3
7
 
4
8
 
package/dist/pane.d.ts CHANGED
@@ -23,6 +23,7 @@ type PaneRootAttributes = Readonly<Record<`data-${string}`, string | undefined>
23
23
  'data-chrome-placement'?: never;
24
24
  'data-chrome-dividers'?: never;
25
25
  'data-appearance'?: never;
26
+ 'data-deep-inset'?: never;
26
27
  }>;
27
28
  /** How a Pane's header and footer relate to its scrolling content. */
28
29
  type PaneChromePlacement = 'fixed' | 'auto';
@@ -62,6 +63,8 @@ interface PaneProps {
62
63
  chromeDividers?: PaneChromeDividers;
63
64
  /** Paint the scrolling work surface with the shared lowered-surface color. */
64
65
  appearance?: PaneAppearance;
66
+ /** Add an extra 8px inline gutter to scrolling content (default: false). */
67
+ deepInset?: boolean;
65
68
  /** Root semantics. Defaults to `div`. */
66
69
  element?: PaneElement;
67
70
  /** Scrolling content semantics. Defaults to `div`. */
@@ -96,13 +99,13 @@ interface PaneProps {
96
99
  * or a CollapsiblePanel) forwards, so the app configures that pane instead of
97
100
  * styling it. An omitted or `undefined` field keeps the composite's default.
98
101
  */
99
- type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'appearance'>;
102
+ type PaneConfig = Pick<PaneProps, 'contentElement' | 'contentLabel' | 'separators' | 'safeAreaEdges' | 'chromeDividers' | 'appearance' | 'deepInset'>;
100
103
  /**
101
104
  * An unpadded application column with optional fixed header/footer slots and one
102
105
  * scrolling vertical content owner. Separator lines are independently opt-in on
103
106
  * each logical edge, so the same component works as a sidebar, main area,
104
107
  * inspector, or dialog column.
105
108
  */
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;
109
+ declare function Pane({ header, children, footer, chromePlacement, chromeDividers, appearance, deepInset, element, contentElement, separators, safeAreaEdges, id, label, contentLabel, className, headerClassName, contentClassName, footerClassName, rootAttributes, slot, }: PaneProps): kerfjs.SafeHtml;
107
110
 
108
111
  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-AOAW55JN.js';
1
+ export { Pane } from './chunk-DXQZ3BEO.js';
2
2
 
3
3
 
4
4
  //# sourceMappingURL=pane.js.map
@@ -1,12 +1,17 @@
1
1
  import * as kerfjs from 'kerfjs';
2
2
  import { K as KerfUiContent } from './semantic-content-BbzjvSu9.js';
3
- import { NavStackProps, NavStackView } from './nav-stack.js';
3
+ import { N as NavStackProps, a as NavStackView } from './nav-stack-B1Qc2e5q.js';
4
4
  import { ResizableRegionProps } from './resizable-region.js';
5
- import './toolbar.js';
5
+ import './list.js';
6
+ import './flex-alignment-4ms8ZbV8.js';
6
7
  import './sides-BPSWde0A.js';
8
+ import './css-values.js';
7
9
  import './pane.js';
10
+ import './panel-toolbar-CL9tYOkh.js';
11
+ import './toolbar.js';
12
+ import './lucide-icon.js';
13
+ import 'lucide';
8
14
  import './toolbar-text.js';
9
- import './css-values.js';
10
15
 
11
16
  /**
12
17
  * The roomy list pane's `ResizableRegion`: its committed `size` and `min` /
@@ -21,7 +26,7 @@ interface SplitViewResizable extends Pick<ResizableRegionProps, 'separator' | 'h
21
26
  max: number;
22
27
  }
23
28
  /** One compact view's top- and bottom-toolbar content (see `NavStackView`). */
24
- type SplitViewCompactViewToolbars = Pick<NavStackView, 'leading' | 'center' | 'toolbar' | 'bottomToolbar'>;
29
+ type SplitViewCompactViewToolbars = Pick<NavStackView, 'toolbar' | 'bottomToolbar'>;
25
30
  /**
26
31
  * The compact `NavStack`'s configuration: its toolbar configuration, back
27
32
  * control, persistent bottom toolbar, and chrome dividers forward to the
@@ -1,4 +1,4 @@
1
- import { NavStack } from './chunk-Z4EPMX25.js';
1
+ import { NavStack } from './chunk-IKCUPTR2.js';
2
2
  import { ResizableRegion } from './chunk-Y6KT7ZTR.js';
3
3
 
4
4
 
@@ -7,6 +7,10 @@ import { ResizableRegion } from './chunk-Y6KT7ZTR.js';
7
7
 
8
8
 
9
9
 
10
+
11
+
12
+
13
+
10
14
  import { jsx, jsxs } from 'kerfjs/jsx-runtime';
11
15
 
12
16
  function SplitView({
@@ -28,7 +32,7 @@ function SplitView({
28
32
  const listView = {
29
33
  ...compactStack.list,
30
34
  key: "list",
31
- title: listTitle,
35
+ toolbar: { ...compactStack.list?.toolbar, title: listTitle },
32
36
  content: list
33
37
  };
34
38
  const views = detailActive ? [
@@ -36,7 +40,7 @@ function SplitView({
36
40
  {
37
41
  ...compactStack.detail,
38
42
  key: "detail",
39
- title: detailTitle,
43
+ toolbar: { ...compactStack.detail?.toolbar, title: detailTitle },
40
44
  content: detail
41
45
  }
42
46
  ] : [listView];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/layout/split-view/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from '../../navigation/nav-stack/nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from '../resizable-region/resizable-region.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/components/layout/split-view/split-view.tsx"],"names":[],"mappings":"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","file":"split-view.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport {\n NavStack,\n type NavStackProps,\n type NavStackView,\n} from '../../navigation/nav-stack/nav-stack.js';\nimport {\n ResizableRegion,\n type ResizableRegionProps,\n} from '../resizable-region/resizable-region.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 '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 toolbar: { ...compactStack.list?.toolbar, title: listTitle },\n content: list,\n };\n const views: NavStackView[] = detailActive\n ? [\n listView,\n {\n ...compactStack.detail,\n key: 'detail',\n toolbar: { ...compactStack.detail?.toolbar, 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"]}
@@ -150,19 +150,11 @@
150
150
  );
151
151
  }
152
152
 
153
- /* The control band. Every zone reserves one group-height row at the top of
154
- the toolbar, and each item is centered in that band by its own size, not by
155
- its siblings: a group or title shorter than the band takes half the
156
- difference as a top margin, and anything taller (a wrapped title, a
157
- multi-line search, a second trailing row) starts at the band's top and grows
158
- down. A growing item therefore never moves the other items or its own top.
159
- Centering the zones in the toolbar row instead dropped every control to the
160
- middle of a two-line title. The band is resolved here, on the toolbar, so a
161
- compact group's own smaller group size never redefines it.
162
- `--_kui-toolbar-band` is context the toolbar provides: a ToolbarControlGroup
163
- and a ToolbarText each center themselves in it from their own stylesheets
164
- (toolbar-control-group.css, toolbar-text.css). A direct primary wa-button in
165
- trailing is centered here without altering its Web Awesome chrome. */
153
+ /* Every zone reserves a group-height control band. Direct custom content
154
+ centers against its zone's height by default. ToolbarText,
155
+ ToolbarControlGroup, and standalone wa-button keep their own first-band
156
+ placement, so taller siblings do not move their controls off that axis.
157
+ `--_kui-toolbar-band` is context those components use for that placement. */
166
158
  .kui-toolbar {
167
159
  --_kui-toolbar-band: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
168
160
  }
@@ -175,7 +167,7 @@
175
167
  min-height: var(--_kui-toolbar-band);
176
168
  padding-inline: var(--kui-toolbar-zone-padding-inline, 0px);
177
169
  box-sizing: border-box;
178
- align-items: flex-start;
170
+ align-items: center;
179
171
  gap: var(--kui-toolbar-gap, 0.5rem);
180
172
  }
181
173
 
@@ -243,6 +235,7 @@
243
235
  0px,
244
236
  calc((var(--_kui-toolbar-band) - var(--wa-form-control-height)) / 2)
245
237
  );
238
+ align-self: flex-start;
246
239
  flex: 0 0 auto;
247
240
  }
248
241
 
@@ -80,6 +80,7 @@
80
80
  top margin, so it centers in the band by its own size. */
81
81
  :is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
82
82
  > .kui-toolbar-control-group {
83
+ align-self: flex-start;
83
84
  margin-block-start: max(
84
85
  0px,
85
86
  calc(
@@ -610,17 +611,23 @@
610
611
  wa-button,
611
612
  .kui-select,
612
613
  .kui-toolbar-action-link
613
- ):only-child
614
+ ):nth-child(1 of :where(:not([data-toolbar-visibility-state]))):where(
615
+ :nth-last-child(1 of :not([data-toolbar-visibility-state]))
616
+ )
614
617
  ):hover {
615
618
  background-color: var(--kui-toolbar-control-hover-background);
616
619
  }
617
620
 
618
621
  .kui-toolbar-control-group:not([data-single="true"]):has(
619
- > :is(button, wa-button, .kui-toolbar-action-link):only-child
622
+ > :is(button, wa-button, .kui-toolbar-action-link):nth-child(
623
+ 1 of :where(:not([data-toolbar-visibility-state]))
624
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
620
625
  )
621
626
  > :is(button, wa-button, .kui-toolbar-action-link):hover,
622
627
  .kui-toolbar-control-group:not([data-single="true"]):has(
623
- > :is(button, wa-button):only-child
628
+ > :is(button, wa-button):nth-child(
629
+ 1 of :where(:not([data-toolbar-visibility-state]))
630
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
624
631
  )
625
632
  > wa-button:hover::part(base) {
626
633
  border-color: transparent;
@@ -758,6 +765,7 @@
758
765
  lone control belongs to the outer group surface; in a group of choices the
759
766
  image belongs only to the selected highlight. */
760
767
  .kui-toolbar-control-group[data-content="avatar"] {
768
+ background-origin: border-box;
761
769
  background-position: center;
762
770
  background-repeat: no-repeat;
763
771
  background-size: contain;
@@ -765,29 +773,46 @@
765
773
 
766
774
  .kui-toolbar-control-group[data-content="avatar"]:is(
767
775
  [data-single="true"],
768
- :has(> :is(button, wa-button):only-child)
776
+ :has(
777
+ > :is(button, wa-button):nth-child(
778
+ 1 of :where(:not([data-toolbar-visibility-state]))
779
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
780
+ )
769
781
  ) {
770
782
  background-image: var(--kui-toolbar-avatar-image);
771
783
  }
772
784
 
773
785
  .kui-toolbar-control-group[data-content="avatar"]:is(
774
786
  [data-single="true"],
775
- :has(> :is(button, wa-button):only-child)
787
+ :has(
788
+ > :is(button, wa-button):nth-child(
789
+ 1 of :where(:not([data-toolbar-visibility-state]))
790
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
791
+ )
776
792
  )
777
793
  > :is(button, wa-button) {
778
794
  color: transparent;
779
795
  }
780
796
 
781
797
  .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
782
- :has(> :is(button, wa-button):only-child)
798
+ :has(
799
+ > :is(button, wa-button):nth-child(
800
+ 1 of :where(:not([data-toolbar-visibility-state]))
801
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
802
+ )
783
803
  )
784
804
  > button[aria-pressed="true"],
785
805
  .kui-toolbar-control-group[data-content="avatar"][data-single="false"]:not(
786
- :has(> :is(button, wa-button):only-child)
806
+ :has(
807
+ > :is(button, wa-button):nth-child(
808
+ 1 of :where(:not([data-toolbar-visibility-state]))
809
+ ):where(:nth-last-child(1 of :not([data-toolbar-visibility-state])))
810
+ )
787
811
  )
788
812
  > wa-button[aria-pressed="true"]::part(base) {
789
813
  color: transparent;
790
814
  background-image: var(--kui-toolbar-avatar-image);
815
+ background-origin: border-box;
791
816
  background-position: center;
792
817
  background-repeat: no-repeat;
793
818
  background-size: contain;
@@ -798,7 +823,10 @@
798
823
 
799
824
  .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="neutral"]:has(
800
825
  > svg[aria-hidden="true"]
801
- ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
826
+ ):not(
827
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
828
+ :has(> svg ~ svg)
829
+ ) {
802
830
  background: var(--kui-color-neutral-fill-quiet);
803
831
  border-color: var(--kui-color-neutral-border-quiet);
804
832
  color: var(--kui-color-neutral-on-quiet);
@@ -806,7 +834,10 @@
806
834
 
807
835
  .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="brand"]:has(
808
836
  > svg[aria-hidden="true"]
809
- ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
837
+ ):not(
838
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
839
+ :has(> svg ~ svg)
840
+ ) {
810
841
  background: var(--kui-color-brand-fill-quiet);
811
842
  border-color: var(--kui-color-brand-border-quiet);
812
843
  color: var(--kui-color-brand-on-quiet);
@@ -814,7 +845,10 @@
814
845
 
815
846
  .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="success"]:has(
816
847
  > svg[aria-hidden="true"]
817
- ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
848
+ ):not(
849
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
850
+ :has(> svg ~ svg)
851
+ ) {
818
852
  background: var(--kui-color-success-fill-quiet);
819
853
  border-color: var(--kui-color-success-border-quiet);
820
854
  color: var(--kui-color-success-on-quiet);
@@ -822,7 +856,10 @@
822
856
 
823
857
  .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="warning"]:has(
824
858
  > svg[aria-hidden="true"]
825
- ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
859
+ ):not(
860
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
861
+ :has(> svg ~ svg)
862
+ ) {
826
863
  background: var(--kui-color-warning-fill-quiet);
827
864
  border-color: var(--kui-color-warning-border-quiet);
828
865
  color: var(--kui-color-warning-on-quiet);
@@ -830,12 +867,25 @@
830
867
 
831
868
  .kui-toolbar-control-group[data-single="true"][data-appearance="contained"][data-tile-tone="danger"]:has(
832
869
  > svg[aria-hidden="true"]
833
- ):not(:has(> :not(svg[aria-hidden="true"])), :has(> svg ~ svg)) {
870
+ ):not(
871
+ :has(> :not(svg[aria-hidden="true"], [data-toolbar-visibility-state])),
872
+ :has(> svg ~ svg)
873
+ ) {
834
874
  background: var(--kui-color-danger-fill-quiet);
835
875
  border-color: var(--kui-color-danger-border-quiet);
836
876
  color: var(--kui-color-danger-on-quiet);
837
877
  }
838
878
  .kui-toolbar-control-group[data-toolbar-width-hidden="true"],
839
- .kui-toolbar-control-group__busy-status[data-toolbar-width-hidden="true"] {
879
+ .kui-toolbar-control-group__busy-status[data-toolbar-width-hidden="true"],
880
+ .kui-toolbar-control-group:has(
881
+ > [data-toolbar-visibility-state][data-toolbar-width-hidden="true"]
882
+ ),
883
+ .kui-toolbar-control-group__busy-status:has(
884
+ > [data-toolbar-visibility-state][data-toolbar-width-hidden="true"]
885
+ ) {
886
+ display: none;
887
+ }
888
+ .kui-toolbar-control-group > [data-toolbar-visibility-state],
889
+ .kui-toolbar-control-group__busy-status > [data-toolbar-visibility-state] {
840
890
  display: none;
841
891
  }
@@ -39,6 +39,7 @@ button.kui-toolbar-text:focus-visible {
39
39
  heights. */
40
40
  :is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
41
41
  > .kui-toolbar-text {
42
+ align-self: flex-start;
42
43
  height: auto;
43
44
  min-height: var(--_kui-toolbar-band);
44
45
  }
@@ -159,6 +160,12 @@ button.kui-toolbar-text[data-tone="dark"]:hover {
159
160
  line-clamp: none;
160
161
  max-height: calc(var(--kui-toolbar-text-max-lines) * 1.25em);
161
162
  }
162
- .kui-toolbar-text[data-toolbar-width-hidden="true"] {
163
+ .kui-toolbar-text[data-toolbar-width-hidden="true"],
164
+ .kui-toolbar-text:has(
165
+ > [data-toolbar-visibility-state][data-toolbar-width-hidden="true"]
166
+ ) {
167
+ display: none;
168
+ }
169
+ .kui-toolbar-text > [data-toolbar-visibility-state] {
163
170
  display: none;
164
171
  }
@@ -82,6 +82,7 @@
82
82
 
83
83
  .kui-token-search__editor {
84
84
  grid-column: 2;
85
+ grid-row: 1;
85
86
  min-width: var(--kui-token-search-editor-min-width, 0px);
86
87
  min-height: var(--kui-token-search-line-size);
87
88
  padding-block: calc((var(--kui-token-search-line-size) - 1.35em) / 2) 0;
@@ -104,10 +105,20 @@
104
105
  }
105
106
  }
106
107
 
107
- .kui-token-search__editor:empty::before {
108
+ .kui-token-search[data-placeholder-visible="true"]:has(
109
+ > .kui-token-search__editor
110
+ )::before {
111
+ grid-column: 2;
112
+ grid-row: 1;
113
+ min-width: 0;
114
+ padding-block: calc((var(--kui-token-search-line-size) - 1.35em) / 2) 0;
108
115
  color: var(--kui-color-text-quiet);
109
116
  content: attr(data-placeholder);
117
+ font-size: var(--kui-font-s);
118
+ line-height: 1.35;
119
+ overflow: hidden;
110
120
  pointer-events: none;
121
+ white-space: nowrap;
111
122
  }
112
123
 
113
124
  .kui-token-search__token {