@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
@@ -1,9 +1,4 @@
1
1
  .kui-list-item {
2
- --kui-list-group-divider-color: var(--kui-color-neutral-border-quiet);
3
- --kui-list-item-color: var(--kui-color-neutral-on-normal);
4
- --kui-list-item-hover-background: var(--kui-color-neutral-fill-quiet);
5
- --kui-list-item-selected-color: var(--kui-color-neutral-on-normal);
6
- --kui-list-item-selected-background: var(--kui-color-brand-fill-normal);
7
2
  display: grid;
8
3
  width: calc(100% - (2 * var(--kui-layout-inline-margin, 0.5rem)));
9
4
  min-height: var(--kui-list-item-min-height, 2.75rem);
@@ -24,7 +19,7 @@
24
19
  --kui-list-item-radius,
25
20
  var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
26
21
  );
27
- color: var(--kui-list-item-color);
22
+ color: var(--kui-list-item-color, var(--kui-color-neutral-on-normal));
28
23
  background: var(--kui-list-item-background, transparent);
29
24
  cursor: pointer;
30
25
  grid-template-columns: var(--kui-list-item-columns, minmax(0, 1fr) auto);
@@ -55,14 +50,20 @@
55
50
 
56
51
  .kui-list-item[data-divider="before"],
57
52
  .kui-list-item[data-divider="both"] {
58
- border-block-start-color: var(--kui-list-group-divider-color);
53
+ border-block-start-color: var(
54
+ --kui-list-group-divider-color,
55
+ var(--kui-color-neutral-border-quiet)
56
+ );
59
57
  border-start-start-radius: 0;
60
58
  border-start-end-radius: 0;
61
59
  }
62
60
 
63
61
  .kui-list-item[data-divider="after"],
64
62
  .kui-list-item[data-divider="both"] {
65
- border-block-end-color: var(--kui-list-group-divider-color);
63
+ border-block-end-color: var(
64
+ --kui-list-group-divider-color,
65
+ var(--kui-color-neutral-border-quiet)
66
+ );
66
67
  border-end-start-radius: 0;
67
68
  border-end-end-radius: 0;
68
69
  }
@@ -99,7 +100,10 @@
99
100
  --kui-list-item-hover-border,
100
101
  var(--kui-color-neutral-border-normal)
101
102
  );
102
- background: var(--kui-list-item-hover-background);
103
+ background: var(
104
+ --kui-list-item-hover-background,
105
+ var(--kui-color-neutral-fill-quiet)
106
+ );
103
107
  }
104
108
 
105
109
  /* A placeholder is disabled to stay inert, but it is loading, not unavailable:
@@ -124,8 +128,14 @@
124
128
  --kui-list-item-selected-border,
125
129
  var(--kui-color-brand-border-quiet)
126
130
  );
127
- color: var(--kui-list-item-selected-color);
128
- background: var(--kui-list-item-selected-background);
131
+ color: var(
132
+ --kui-list-item-selected-color,
133
+ var(--kui-color-neutral-on-normal)
134
+ );
135
+ background: var(
136
+ --kui-list-item-selected-background,
137
+ var(--kui-color-brand-fill-normal)
138
+ );
129
139
  font-weight: 650;
130
140
  }
131
141
 
@@ -4,3 +4,8 @@
4
4
  height: 1em;
5
5
  flex: none;
6
6
  }
7
+
8
+ [data-lucide][data-size] {
9
+ width: var(--_kui-lucide-size);
10
+ height: var(--_kui-lucide-size);
11
+ }
@@ -100,6 +100,13 @@
100
100
  inset: 0;
101
101
  }
102
102
 
103
+ .kui-nav-stack__view[data-appearance="sunken"] {
104
+ background: var(
105
+ --kui-sunken-panel-background,
106
+ var(--kui-color-surface-lowered)
107
+ );
108
+ }
109
+
103
110
  /* Each view is its region's scroll owner: block insets become padding inside
104
111
  the scroller so content scrolls under an unsafe edge but can always be
105
112
  scrolled clear. A view whose only child is a Pane or layout lets that child
@@ -217,4 +224,10 @@
217
224
  :is([data-workbench-main], [data-workbench-panel-content])
218
225
  > [data-component="nav-stack"]:only-child {
219
226
  height: 100%;
227
+ --kui-edge-inset-block-start: var(--_kui-workbench-content-edge-block-start);
228
+ --kui-edge-inset-block-end: var(--_kui-workbench-content-edge-block-end);
229
+ --kui-edge-inset-inline-start: var(
230
+ --_kui-workbench-content-edge-inline-start
231
+ );
232
+ --kui-edge-inset-inline-end: var(--_kui-workbench-content-edge-inline-end);
220
233
  }
@@ -22,6 +22,33 @@
22
22
  grid-template-rows: auto minmax(0, 1fr) auto;
23
23
  }
24
24
 
25
+ /* Paint the active scroll owner once, so alpha lowered colors do not stack.
26
+ Fixed chrome leaves the content slot scrolling; auto chrome lets the Pane
27
+ root scroll in its short mode, while its content remains transparent. */
28
+ .kui-pane[data-appearance="sunken"] > .kui-pane__content {
29
+ background: var(
30
+ --kui-sunken-panel-background,
31
+ var(--kui-color-surface-lowered)
32
+ );
33
+ }
34
+
35
+ .kui-pane[data-appearance="sunken"][data-chrome-placement="auto"] {
36
+ background: var(
37
+ --kui-sunken-panel-background,
38
+ var(--kui-color-surface-lowered)
39
+ );
40
+ }
41
+
42
+ .kui-pane[data-appearance="sunken"][data-chrome-placement="auto"]
43
+ > .kui-pane__content {
44
+ background: transparent;
45
+ }
46
+
47
+ .kui-pane[data-appearance="sunken"][data-chrome-placement="auto"]
48
+ > :is(.kui-pane__header, .kui-pane__footer) {
49
+ background: var(--kui-pane-chrome-background, var(--kui-color-surface));
50
+ }
51
+
25
52
  /* Safe areas. The pane root never pads, so its background and separators paint
26
53
  through an unsafe area; its slots compensate on the edges the pane still
27
54
  touches. The inherited `--kui-edge-inset-*` context says how far each edge
@@ -149,9 +176,10 @@
149
176
 
150
177
  /* Chrome dividers: one line under the header and one over the footer, where
151
178
  the pinned chrome meets the scrolling content, whatever the chrome holds.
152
- `chromeDividers="scroll"` (the default, no attribute) draws each only while
179
+ `chromeDividers="scroll"` (the plain-pane default, no attribute) draws each only while
153
180
  `wireScrollDividers` reports content scrolled away beneath it through
154
- `data-scroll-divider` on the slot; `always` draws both; `none` neither. The
181
+ `data-scroll-divider` on the slot; a sunken pane defaults to `always`, which
182
+ draws both; `none` draws neither. The
155
183
  line is an inset shadow inside the slot, so showing or hiding it never
156
184
  moves the chrome or the content. */
157
185
  .kui-pane > :is(.kui-pane__header, .kui-pane__toolbar, .kui-pane__footer) {
@@ -217,6 +245,12 @@
217
245
  :is([data-workbench-main], [data-workbench-panel-content])
218
246
  > [data-component="pane"]:only-child {
219
247
  height: 100%;
248
+ --kui-edge-inset-block-start: var(--_kui-workbench-content-edge-block-start);
249
+ --kui-edge-inset-block-end: var(--_kui-workbench-content-edge-block-end);
250
+ --kui-edge-inset-inline-start: var(
251
+ --_kui-workbench-content-edge-inline-start
252
+ );
253
+ --kui-edge-inset-inline-end: var(--_kui-workbench-content-edge-inline-end);
220
254
  }
221
255
 
222
256
  /* As the only child of a NavStack view or a TabScaffold scene, a Pane fills
@@ -11,10 +11,9 @@
11
11
  clip-path: inset(50%);
12
12
  }
13
13
 
14
- /* A PopupMenu draws exactly the Select's popup: the same caret motion, surface
15
- inset, row geometry, reserved check column, current-row fill, and group
16
- titles, all read from the private popup-choice contract in foundation.css
17
- (select.css reads the same values). */
14
+ /* PopupMenu shares the Select's caret motion, surface inset, row rhythm,
15
+ current-row fill, and group titles from the popup-choice contract in
16
+ foundation.css. Only checkbox items reserve a check column. */
18
17
 
19
18
  /* The trigger caret turns to face the open menu, like the Select's. */
20
19
  .kui-popup-menu > wa-button::part(caret) {
@@ -34,14 +33,20 @@
34
33
  }
35
34
 
36
35
  .kui-popup-menu wa-dropdown-item {
37
- /* Leading inset plus the Select's check column, so item icons and labels
38
- start where a Select option's do. */
36
+ /* A plain command starts at the checkbox glyph's leading edge. The glyph
37
+ sits half a smaller-font em beyond the row's base inset; its label starts
38
+ after the full check column below. */
39
39
  padding: var(--_kui-popup-row-padding-block)
40
40
  var(--_kui-popup-row-padding-inline-end) var(--_kui-popup-row-padding-block)
41
- calc(
42
- var(--_kui-popup-row-padding-inline-start) +
43
- var(--_kui-popup-row-check-width)
44
- );
41
+ calc(var(--_kui-popup-row-padding-inline-start) + 0.4375em);
42
+ }
43
+ .kui-popup-menu wa-dropdown-item[type="checkbox"] {
44
+ /* Web Awesome marks every sibling checkbox-adjacent; reserve this column
45
+ only on items whose checked state was explicitly supplied. */
46
+ padding-inline-start: calc(
47
+ var(--_kui-popup-row-padding-inline-start) +
48
+ var(--_kui-popup-row-check-width)
49
+ );
45
50
  }
46
51
  .kui-popup-menu wa-dropdown-item::part(label) {
47
52
  padding-block: var(--_kui-popup-row-label-padding-block);
@@ -73,6 +73,15 @@
73
73
  > .kui-resizable-region__content {
74
74
  overflow: visible;
75
75
  }
76
+ /* An open Web Awesome dropdown (including PopupMenu) releases both clipping
77
+ ancestors without rerendering the region during the dropdown lifecycle. */
78
+ .kui-resizable-region:has(wa-dropdown[open]) {
79
+ z-index: var(--kui-resizable-region-popup-z, 5);
80
+ overflow: visible;
81
+ }
82
+ .kui-resizable-region:has(wa-dropdown[open]) > .kui-resizable-region__content {
83
+ overflow: visible;
84
+ }
76
85
  .kui-resizable-region[data-separator="hidden"] {
77
86
  --kui-resizable-region-separator-color: transparent;
78
87
  }
@@ -108,6 +108,21 @@
108
108
  margin-inline-start: 0.75rem;
109
109
  transform: scale(0.875);
110
110
  }
111
+ .kui-select[data-caret="false"]::part(expand-icon) {
112
+ display: none;
113
+ }
114
+ .kui-select[data-selected-presentation="icon-only"][data-caret="false"]::part(
115
+ combobox
116
+ ) {
117
+ width: var(
118
+ --_kui-toolbar-control-group-slot-height,
119
+ var(--_kui-select-height)
120
+ );
121
+ justify-content: center;
122
+ }
123
+ .kui-select[data-caret="false"] .kui-select__placeholder-chevron {
124
+ display: none;
125
+ }
111
126
  .kui-select[data-selected-presentation="icon-only"]::part(display-input) {
112
127
  position: absolute;
113
128
  width: 1px;
@@ -207,6 +222,17 @@
207
222
  min-width: 0;
208
223
  flex: 1 1 auto;
209
224
  }
225
+ /* A label can use the free start-slot width to truncate, but a caret-free
226
+ icon must keep its intrinsic width so the combobox can center the glyph. */
227
+ .kui-select--custom-selected[data-selected-presentation="icon-only"][data-caret="false"]::part(
228
+ start
229
+ ) {
230
+ flex: 0 0 auto;
231
+ }
232
+ .kui-select--custom-selected[data-selected-presentation="icon-only"][data-caret="false"]
233
+ .kui-select__custom-selected {
234
+ margin-inline-end: 0 !important;
235
+ }
210
236
  .kui-select--custom-selected::part(display-input) {
211
237
  position: absolute;
212
238
  width: 1px;
@@ -137,4 +137,10 @@
137
137
  :is([data-workbench-main], [data-workbench-panel-content])
138
138
  > [data-component="split-view"]:only-child {
139
139
  height: 100%;
140
+ --kui-edge-inset-block-start: var(--_kui-workbench-content-edge-block-start);
141
+ --kui-edge-inset-block-end: var(--_kui-workbench-content-edge-block-end);
142
+ --kui-edge-inset-inline-start: var(
143
+ --_kui-workbench-content-edge-inline-start
144
+ );
145
+ --kui-edge-inset-inline-end: var(--_kui-workbench-content-edge-inline-end);
140
146
  }
@@ -1,9 +1,12 @@
1
1
  .kui-sunken-panel {
2
+ /* Reset the private value on each panel so nested panels do not inherit it. */
3
+ --_kui-sunken-panel-flex: 0 1 auto;
2
4
  display: flex;
3
5
  min-width: 0;
4
6
  min-height: 0;
5
7
  padding: var(--kui-sunken-panel-padding, 0.5rem);
6
8
  box-sizing: border-box;
9
+ flex: var(--_kui-sunken-panel-flex, initial);
7
10
  border-radius: var(
8
11
  --kui-sunken-panel-radius,
9
12
  var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
@@ -17,6 +20,10 @@
17
20
  gap: var(--kui-sunken-panel-gap, 0.5rem);
18
21
  }
19
22
 
23
+ .kui-sunken-panel[data-fill="true"] {
24
+ height: 100%;
25
+ }
26
+
20
27
  .kui-sunken-panel[data-shape="square"] {
21
28
  border-radius: 0;
22
29
  }
@@ -45,6 +45,9 @@
45
45
  scroll-padding-inline: var(--kui-tab-bar-strip-scroll-padding-inline, 0);
46
46
  overscroll-behavior-inline: contain;
47
47
  }
48
+ .kui-tab-bar[data-icon-only-at] .kui-tab-bar__tabs {
49
+ container: kui-tab-bar-tabs / inline-size;
50
+ }
48
51
  .kui-tab-bar[data-presentation="segmented"],
49
52
  .kui-tab-bar[data-presentation="inspector"] {
50
53
  --kui-tab-bar-background: var(--kui-color-neutral-fill-quiet);
@@ -46,6 +46,13 @@
46
46
  inset: 0;
47
47
  }
48
48
 
49
+ .kui-tab-scaffold__scene[data-appearance="sunken"] {
50
+ background: var(
51
+ --kui-sunken-panel-background,
52
+ var(--kui-color-surface-lowered)
53
+ );
54
+ }
55
+
49
56
  /* A scene is its region's scroll owner, so its top inset is padding inside
50
57
  the scroller. A scene whose only child is a Pane or layout (usually a
51
58
  NavStack) lets that child own the insets instead. */
@@ -191,4 +198,10 @@
191
198
  :is([data-workbench-main], [data-workbench-panel-content])
192
199
  > [data-component="tab-scaffold"]:only-child {
193
200
  height: 100%;
201
+ --kui-edge-inset-block-start: var(--_kui-workbench-content-edge-block-start);
202
+ --kui-edge-inset-block-end: var(--_kui-workbench-content-edge-block-end);
203
+ --kui-edge-inset-inline-start: var(
204
+ --_kui-workbench-content-edge-inline-start
205
+ );
206
+ --kui-edge-inset-inline-end: var(--_kui-workbench-content-edge-inline-end);
194
207
  }
@@ -3,6 +3,35 @@
3
3
  box-sizing: border-box;
4
4
  border: 1px solid transparent;
5
5
  margin: 0;
6
+ white-space: normal;
7
+ overflow-wrap: normal;
8
+ }
9
+
10
+ .kui-text[data-wrap="anywhere"] {
11
+ overflow-wrap: anywhere;
12
+ }
13
+
14
+ .kui-text[data-wrap="nowrap"] {
15
+ white-space: nowrap;
16
+ }
17
+
18
+ .kui-text[data-wrap="truncate"] {
19
+ min-width: 0;
20
+ overflow: hidden;
21
+ text-overflow: ellipsis;
22
+ white-space: nowrap;
23
+ }
24
+
25
+ span.kui-text[data-wrap="truncate"] {
26
+ display: inline-block;
27
+ max-width: 100%;
28
+ }
29
+
30
+ .kui-text__clamp {
31
+ display: -webkit-box;
32
+ overflow: hidden;
33
+ -webkit-box-orient: vertical;
34
+ -webkit-line-clamp: var(--_kui-text-max-lines);
6
35
  }
7
36
 
8
37
  .kui-text[data-tone="quiet"] {
@@ -6,6 +6,7 @@
6
6
  --kui-token-search-line-size: 2.125rem;
7
7
 
8
8
  display: grid;
9
+ position: relative;
9
10
  width: 100%;
10
11
  min-width: 0;
11
12
  min-height: 2.75rem;
@@ -139,6 +140,7 @@
139
140
 
140
141
  .kui-token-search__clear {
141
142
  grid-column: 3;
143
+ border-radius: var(--kui-radius-pill);
142
144
  }
143
145
 
144
146
  .kui-token-search__trailing {
@@ -147,13 +149,24 @@
147
149
 
148
150
  .kui-token-search__suggestions {
149
151
  display: grid;
150
- grid-column: 2 / -1;
151
- min-width: 0;
152
- padding: 0.25rem;
153
- border: 1px solid var(--kui-token-search-border);
152
+ position: absolute;
153
+ z-index: 20;
154
+ inset-block-start: calc(100% + 0.25rem);
155
+ inset-inline-start: 0;
156
+ width: min(max(100%, 15rem), calc(100vw - 1rem));
157
+ max-height: 15rem;
158
+ padding: var(--_kui-popup-inset);
159
+ box-sizing: border-box;
160
+ border: 1px solid var(--kui-color-neutral-border-normal);
154
161
  border-radius: var(--kui-radius-pill);
155
- background: var(--kui-token-search-background);
156
- gap: 0.125rem;
162
+ background: var(--kui-color-surface-raised);
163
+ box-shadow: var(--kui-shadow-m);
164
+ gap: var(--_kui-popup-row-gap);
165
+ overflow-y: auto;
166
+ }
167
+
168
+ .kui-token-search__suggestions:has(> :nth-child(2)) {
169
+ border-radius: var(--kui-layout-rounded-radius, calc(1px + 0.6875rem));
157
170
  }
158
171
 
159
172
  .kui-token-search__suggestion {
@@ -200,6 +213,12 @@
200
213
  border-color 0.2s ease;
201
214
  }
202
215
 
216
+ .kui-token-search[data-collapsible="true"][data-expanded="true"]:has(
217
+ .kui-token-search__suggestions
218
+ ) {
219
+ overflow: visible;
220
+ }
221
+
203
222
  .kui-token-search[data-collapsible="true"][data-expanded="false"] {
204
223
  width: 2.75rem;
205
224
  min-width: 2.75rem;
@@ -256,6 +275,10 @@
256
275
  box-shadow: none;
257
276
  }
258
277
 
278
+ .kui-token-search[data-presentation="toolbar-group"] .kui-token-search__clear {
279
+ border-radius: var(--kui-control-highlight-radius);
280
+ }
281
+
259
282
  .kui-token-search[data-presentation="toolbar-group"][data-collapsible="true"]:focus-within {
260
283
  border-color: var(--kui-color-focus);
261
284
  background: var(--kui-token-search-background);
@@ -33,6 +33,7 @@
33
33
  --_kui-toolbar-control-group-slot-overlap: 0px;
34
34
  --_kui-toolbar-control-group-slot-radius: var(--kui-toolbar-item-radius);
35
35
  display: inline-flex;
36
+ position: relative;
36
37
  height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
37
38
  min-width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
38
39
  padding: 1px;
@@ -46,6 +47,34 @@
46
47
  gap: 0;
47
48
  }
48
49
 
50
+ .kui-toolbar-control-group[data-busy="true"] > svg,
51
+ .kui-toolbar-control-group[data-busy="true"]
52
+ > :not(.kui-toolbar-control-group__busy-spinner)
53
+ svg {
54
+ visibility: hidden;
55
+ }
56
+
57
+ .kui-toolbar-control-group__busy-spinner {
58
+ position: absolute;
59
+ inset-block-start: 50%;
60
+ inset-inline-start: 50%;
61
+ display: grid;
62
+ width: 1rem;
63
+ height: 1rem;
64
+ transform: translate(-50%, -50%);
65
+ place-items: center;
66
+ pointer-events: none;
67
+ }
68
+
69
+ .kui-toolbar-control-group__busy-status {
70
+ position: absolute;
71
+ width: 1px;
72
+ height: 1px;
73
+ overflow: hidden;
74
+ clip-path: inset(50%);
75
+ white-space: nowrap;
76
+ }
77
+
49
78
  /* In a Toolbar zone, a group shorter than the toolbar's control band (the
50
79
  `--_kui-toolbar-band` the Toolbar provides) takes half the difference as a
51
80
  top margin, so it centers in the band by its own size. */
@@ -126,6 +155,12 @@
126
155
  background-color 0.2s ease,
127
156
  border-color 0.2s ease;
128
157
  }
158
+
159
+ .kui-toolbar-control-group[data-content="search"]:has(
160
+ .kui-token-search__suggestions
161
+ ) {
162
+ overflow: visible;
163
+ }
129
164
  .kui-toolbar-control-group[data-content="search"][data-expanded="false"] {
130
165
  width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
131
166
  flex: 0 0 auto;
@@ -47,17 +47,23 @@
47
47
  text-overflow: ellipsis;
48
48
  }
49
49
 
50
- .kui-toolbar-text[data-size="xlarge"] {
51
- /* Matches page/panel titles: the same responsive clamp so a heading toolbar
52
- title reads at the page-title scale without a bespoke override. Height grows
53
- to the larger text (the fixed 40px would clip its ascenders). */
50
+ .kui-toolbar-text:is([data-size="xlarge"], [data-size="xlarge-fixed"]) {
51
+ /* Both title sizes keep page/panel title color and geometry. Height grows to
52
+ their text instead of clipping ascenders in the default 40px box. */
54
53
  height: auto;
55
54
  min-height: 2.75rem;
56
55
  color: var(--kui-color-text);
57
- font-size: clamp(var(--kui-font-l), 2.3vw, var(--kui-font-2xl));
58
56
  letter-spacing: -0.025em;
59
57
  }
60
58
 
59
+ .kui-toolbar-text[data-size="xlarge"] {
60
+ font-size: clamp(var(--kui-font-l), 2.3vw, var(--kui-font-2xl));
61
+ }
62
+
63
+ .kui-toolbar-text[data-size="xlarge-fixed"] {
64
+ font-size: var(--kui-font-l);
65
+ }
66
+
61
67
  .kui-toolbar-text[data-size="large"] {
62
68
  font-size: var(--kui-font-m);
63
69
  letter-spacing: -0.015em;
@@ -93,7 +99,10 @@
93
99
  min-height: 2.5rem;
94
100
  }
95
101
 
96
- .kui-toolbar-text[data-size="xlarge"][data-wrap="true"] {
102
+ .kui-toolbar-text:is(
103
+ [data-size="xlarge"],
104
+ [data-size="xlarge-fixed"]
105
+ )[data-wrap="true"] {
97
106
  min-height: 2.75rem;
98
107
  }
99
108
 
@@ -95,6 +95,13 @@
95
95
  grid-template-columns: minmax(0, 1fr) auto;
96
96
  }
97
97
 
98
+ /* Equal side tracks center the middle zone on the toolbar's content box even
99
+ when one side has no controls. Side content still shrinks or wraps within
100
+ its own track, and responsive policies below may move a zone to a new row. */
101
+ .kui-toolbar[data-center-align="balanced"][data-has-center="true"] {
102
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
103
+ }
104
+
98
105
  .kui-toolbar[data-responsive="trailing-priority"][data-has-center="false"]:has(
99
106
  > .kui-toolbar__trailing [data-expanded="true"]
100
107
  ) {