@kerfjs/ui 5.0.0-beta.53 → 5.0.0-beta.55
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.
- package/README.md +4 -2
- package/ai/application-ui-diagnostic-ids-v1.json +1 -0
- package/ai/component-catalog-v2.json +138 -5
- package/ai/component-catalog-v2.schema.json +2 -1
- package/ai/component-catalog.json +208 -16
- package/ai/public-api-signatures-v1.md +462 -39
- package/ai/skill.md +28 -20
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +48 -0
- package/analyzer/loud-pairs.d.mts +49 -0
- package/analyzer/loud-pairs.mjs +357 -0
- package/dist/app-tab.d.ts +7 -5
- package/dist/app-tab.js +1 -1
- package/dist/browser/popup-menu.js +3 -0
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +10 -4
- package/dist/catalog.js +243 -300
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-7IUSV4XG.js → chunk-24PHKUR3.js} +2 -2
- package/dist/chunk-24PHKUR3.js.map +1 -0
- package/dist/{chunk-EKYZCRCX.js → chunk-3CGQ7ZNO.js} +54 -22
- package/dist/chunk-3CGQ7ZNO.js.map +1 -0
- package/dist/{chunk-UKKSMZYT.js → chunk-46263QLK.js} +51 -1
- package/dist/chunk-46263QLK.js.map +1 -0
- package/dist/chunk-4BIMLITI.js +92 -0
- package/dist/chunk-4BIMLITI.js.map +1 -0
- package/dist/{chunk-NDUGJ4TU.js → chunk-5NDQABWK.js} +1 -1
- package/dist/{chunk-NDUGJ4TU.js.map → chunk-5NDQABWK.js.map} +1 -1
- package/dist/{chunk-ZK5EGVFP.js → chunk-5OLVUEND.js} +12 -2
- package/dist/chunk-5OLVUEND.js.map +1 -0
- package/dist/{chunk-CMUIXJZM.js → chunk-BSKEH3UC.js} +2 -2
- package/dist/{chunk-CMUIXJZM.js.map → chunk-BSKEH3UC.js.map} +1 -1
- package/dist/chunk-EAX2GSS4.js +384 -0
- package/dist/chunk-EAX2GSS4.js.map +1 -0
- package/dist/chunk-KH6VUGHU.js +399 -0
- package/dist/chunk-KH6VUGHU.js.map +1 -0
- package/dist/{chunk-BJJKFVWW.js → chunk-LZXQVUGN.js} +2 -2
- package/dist/chunk-LZXQVUGN.js.map +1 -0
- package/dist/chunk-N7FHFNT6.js +55 -0
- package/dist/chunk-N7FHFNT6.js.map +1 -0
- package/dist/{chunk-CCMKJWLX.js → chunk-NE5JAOQS.js} +7 -7
- package/dist/chunk-NE5JAOQS.js.map +1 -0
- package/dist/chunk-PSHUSWQH.js +18 -0
- package/dist/chunk-PSHUSWQH.js.map +1 -0
- package/dist/{chunk-KPNTVB7A.js → chunk-R754MHXX.js} +3 -3
- package/dist/{chunk-KPNTVB7A.js.map → chunk-R754MHXX.js.map} +1 -1
- package/dist/{chunk-HJKRCKDR.js → chunk-RNRUVPJ3.js} +4 -2
- package/dist/chunk-RNRUVPJ3.js.map +1 -0
- package/dist/{chunk-VOCPXGQN.js → chunk-VHADGP3B.js} +9 -8
- package/dist/chunk-VHADGP3B.js.map +1 -0
- package/dist/chunk-XQV2B4IL.js +14 -0
- package/dist/chunk-XQV2B4IL.js.map +1 -0
- package/dist/collapsible-panel.d.ts +46 -15
- package/dist/collapsible-panel.js +42 -10
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/floating-toolbar.d.ts +5 -2
- package/dist/floating-toolbar.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -18
- package/dist/list-header.js +1 -1
- package/dist/list-inset-text.d.ts +7 -1
- package/dist/list-inset-text.js +2 -1
- package/dist/panel-toolbar-BFQxFITu.d.ts +52 -0
- package/dist/popup-menu-register.d.ts +9 -0
- package/dist/popup-menu-register.js +30 -0
- package/dist/popup-menu-register.js.map +1 -0
- package/dist/popup-menu.d.ts +71 -0
- package/dist/popup-menu.js +3 -0
- package/dist/popup-menu.js.map +1 -0
- package/dist/resizable-region.d.ts +4 -1
- package/dist/resizable-region.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/catalog/components/catalog-example.css +0 -16
- package/dist/styles/catalog/components/catalog-stage.css +8 -13
- package/dist/styles/catalog/components/catalog.css +8 -18
- package/dist/styles/catalog.css +0 -5
- package/dist/styles/collapsible-panel.css +88 -10
- package/dist/styles/floating-toolbar.css +11 -6
- package/dist/styles/popup-menu.css +12 -0
- package/dist/styles/resizable-region.css +81 -13
- package/dist/styles/state-banner.css +13 -4
- package/dist/styles/styles.css +1 -0
- package/dist/styles/tab-bar.css +31 -3
- package/dist/styles/toolbar-control-group.css +13 -0
- package/dist/styles/toolbar.css +43 -2
- package/dist/styles/workbench.css +503 -10
- package/dist/text.js +1 -1
- package/dist/token-search-field.d.ts +10 -1
- package/dist/token-search-field.js +1 -1
- package/dist/{types-CEsieBZi.d.ts → types-D6vzj-VT.d.ts} +15 -0
- package/dist/wire-catalog.d.ts +13 -1
- package/dist/wire-catalog.js +18 -3
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-sidebar.js +6 -3
- package/dist/wire-sidebar.js.map +1 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.js +1 -1
- package/dist/wire-workbench.d.ts +109 -0
- package/dist/wire-workbench.js +6 -0
- package/dist/wire-workbench.js.map +1 -0
- package/dist/workbench.d.ts +166 -6
- package/dist/workbench.js +11 -104
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +66 -10
- package/docs/app-layouts.md +12 -1
- package/docs/catalog.md +27 -9
- package/docs/collapsible-panel.md +114 -1
- package/docs/component-contract.md +2 -2
- package/docs/component-selection.md +41 -23
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/document-baseline.md +4 -0
- package/docs/layout.md +10 -1
- package/docs/recipes.md +48 -39
- package/docs/surface-scaffold.md +1 -1
- package/docs/type-contracts.md +2 -1
- package/docs/ui-analyzer.md +94 -19
- package/docs/ui-doctor.md +6 -0
- package/docs/ux-demo.md +7 -3
- package/docs/webawesome-theme.md +11 -2
- package/docs/workbench.md +388 -8
- package/llms.txt +13 -8
- package/package.json +17 -2
- package/ux-demo/recipes/app-shell.tsx +141 -223
- package/ux-demo/recipes/collapsible-sidebar.tsx +48 -78
- package/ux-demo/recipes/list-detail-dialog.tsx +150 -54
- package/ux-demo/recipes/mount-recipe.ts +0 -5
- package/ux-demo/recipes/types.ts +0 -1
- package/dist/chunk-7IUSV4XG.js.map +0 -1
- package/dist/chunk-BJJKFVWW.js.map +0 -1
- package/dist/chunk-CCMKJWLX.js.map +0 -1
- package/dist/chunk-EKYZCRCX.js.map +0 -1
- package/dist/chunk-HJKRCKDR.js.map +0 -1
- package/dist/chunk-UKKSMZYT.js.map +0 -1
- package/dist/chunk-VOCPXGQN.js.map +0 -1
- package/dist/chunk-ZK5EGVFP.js.map +0 -1
- package/dist/styles/catalog/components/catalog-detail.css +0 -35
- package/dist/styles/catalog/components/catalog-resource-footer.css +0 -37
- package/dist/styles/catalog/components/catalog-secondary-sections.css +0 -38
- package/dist/styles/catalog/components/catalog-section-list.css +0 -22
- package/dist/styles/catalog/components/catalog-sidebar.css +0 -82
|
@@ -146,16 +146,22 @@
|
|
|
146
146
|
|
|
147
147
|
/* Responsive replacement policies. Overlay regions stay on their logical edge
|
|
148
148
|
and stop participating in the parent's flex tracks; hidden regions are fully
|
|
149
|
-
replaced by application-owned compact UI.
|
|
149
|
+
replaced by application-owned compact UI. An overlay floats over the work
|
|
150
|
+
area, so it paints the surface like an overlay CollapsiblePanel: without it
|
|
151
|
+
the content beneath (and the restore control stacked below it) shows
|
|
152
|
+
through the shadowed box. An inline region stays transparent and shows its
|
|
153
|
+
host's background. */
|
|
150
154
|
.kui-resizable-region[data-presentation="overlay"] {
|
|
151
155
|
position: absolute;
|
|
152
156
|
z-index: var(--kui-resizable-region-overlay-z, 41);
|
|
153
|
-
|
|
154
|
-
max-height: var(--kui-resizable-region-overlay-max-height, 85vh);
|
|
157
|
+
background: var(--kui-color-surface);
|
|
155
158
|
box-shadow: var(--kui-shadow-l);
|
|
156
159
|
}
|
|
160
|
+
/* Each overlay maximum caps only the resizable axis: a side overlay spans its
|
|
161
|
+
host's full height and a drawer its full width, like their inline tracks. */
|
|
157
162
|
.kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"] {
|
|
158
163
|
inset-block: 0;
|
|
164
|
+
max-width: var(--kui-resizable-region-overlay-max-width, 85vw);
|
|
159
165
|
}
|
|
160
166
|
.kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"][data-edge="end"] {
|
|
161
167
|
inset-inline-start: 0;
|
|
@@ -165,6 +171,7 @@
|
|
|
165
171
|
}
|
|
166
172
|
.kui-resizable-region[data-presentation="overlay"][data-axis="vertical"] {
|
|
167
173
|
inset-inline: 0;
|
|
174
|
+
max-height: var(--kui-resizable-region-overlay-max-height, 85vh);
|
|
168
175
|
}
|
|
169
176
|
.kui-resizable-region[data-presentation="overlay"][data-axis="vertical"][data-edge="end"] {
|
|
170
177
|
inset-block-start: 0;
|
|
@@ -229,26 +236,87 @@
|
|
|
229
236
|
}
|
|
230
237
|
}
|
|
231
238
|
|
|
232
|
-
/* A collapsed
|
|
233
|
-
|
|
239
|
+
/* A collapsed region can supply its own affordance. It floats in a corner of
|
|
240
|
+
the region's own container, never of the viewport, so a region embedded in a
|
|
241
|
+
page cannot float it over page content outside that container. The
|
|
242
|
+
container becomes the corner's containing block and isolates its stacking
|
|
243
|
+
only while a restore control is shown, at zero specificity so an app's own
|
|
244
|
+
positioning of that container wins. The corner is inset from the
|
|
245
|
+
container's edges plus the unsafe area of each edge it reaches. The
|
|
246
|
+
control belongs to the layer beneath open overlays, two below the overlay
|
|
247
|
+
z-index: an open overlay region covers it as it covers the rest of the
|
|
248
|
+
work area, the Workbench rule. A collapsed overlay drops its pointer
|
|
249
|
+
events, so the control is usable again as soon as the overlay closes. */
|
|
250
|
+
:where(:has(> .kui-resizable-region__restore)) {
|
|
251
|
+
position: relative;
|
|
252
|
+
isolation: isolate;
|
|
253
|
+
anchor-scope: --kui-restore-drawer;
|
|
254
|
+
}
|
|
255
|
+
/* An expanded bottom region (a vertical region resized from its top edge)
|
|
256
|
+
beside the collapsed one — a direct child of that container or of one of
|
|
257
|
+
its direct children (the app's work-area column) — owns the container's
|
|
258
|
+
bottom, so the corner floats above the drawer's top edge instead of over
|
|
259
|
+
it. CollapsiblePanel drawers publish the same anchor. A drawer nested
|
|
260
|
+
deeper, inside the work area's own content, belongs to another layout and
|
|
261
|
+
is scoped out. Without anchor positioning the corner keeps the container's
|
|
262
|
+
bottom edge. */
|
|
263
|
+
.kui-resizable-region[data-axis="vertical"][data-edge="start"][data-presentation="inline"]:not(
|
|
264
|
+
[data-collapsed="true"]
|
|
265
|
+
) {
|
|
266
|
+
anchor-name: --kui-restore-drawer;
|
|
267
|
+
}
|
|
268
|
+
:where(:has(> .kui-resizable-region__restore)) > * > * > * {
|
|
269
|
+
anchor-scope: --kui-restore-drawer;
|
|
270
|
+
}
|
|
234
271
|
.kui-resizable-region__restore {
|
|
235
|
-
|
|
236
|
-
|
|
272
|
+
--_kui-resizable-region-restore-inset: var(
|
|
273
|
+
--kui-resizable-region-restore-inset,
|
|
274
|
+
1rem
|
|
275
|
+
);
|
|
276
|
+
/* The corner owns the inset, so a FloatingToolbar composed here floats
|
|
277
|
+
from this point instead of adding its own inset on top. */
|
|
278
|
+
--kui-floating-toolbar-inset: 0px;
|
|
279
|
+
position: absolute;
|
|
280
|
+
z-index: var(
|
|
281
|
+
--kui-resizable-region-restore-z,
|
|
282
|
+
calc(var(--kui-resizable-region-overlay-z, 41) - 2)
|
|
283
|
+
);
|
|
284
|
+
position-visibility: always;
|
|
285
|
+
inset-block-end: calc(
|
|
286
|
+
var(--_kui-resizable-region-restore-inset) +
|
|
287
|
+
var(
|
|
288
|
+
--kui-edge-inset-block-end,
|
|
289
|
+
var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
|
|
290
|
+
)
|
|
291
|
+
);
|
|
292
|
+
/* Above an expanded drawer's top edge when one is in scope (see above). */
|
|
237
293
|
inset-block-end: calc(
|
|
238
|
-
var(--
|
|
239
|
-
|
|
294
|
+
var(--_kui-resizable-region-restore-inset) +
|
|
295
|
+
anchor(
|
|
296
|
+
--kui-restore-drawer top,
|
|
297
|
+
var(
|
|
298
|
+
--kui-edge-inset-block-end,
|
|
299
|
+
var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
|
|
300
|
+
)
|
|
301
|
+
)
|
|
240
302
|
);
|
|
241
303
|
}
|
|
242
304
|
.kui-resizable-region__restore[data-position="bottom-start"] {
|
|
243
305
|
inset-inline-start: calc(
|
|
244
|
-
var(--
|
|
245
|
-
var(
|
|
306
|
+
var(--_kui-resizable-region-restore-inset) +
|
|
307
|
+
var(
|
|
308
|
+
--kui-edge-inset-inline-start,
|
|
309
|
+
var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
|
|
310
|
+
)
|
|
246
311
|
);
|
|
247
312
|
}
|
|
248
313
|
.kui-resizable-region__restore[data-position="bottom-end"] {
|
|
249
314
|
inset-inline-end: calc(
|
|
250
|
-
var(--
|
|
251
|
-
var(
|
|
315
|
+
var(--_kui-resizable-region-restore-inset) +
|
|
316
|
+
var(
|
|
317
|
+
--kui-edge-inset-inline-end,
|
|
318
|
+
var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
|
|
319
|
+
)
|
|
252
320
|
);
|
|
253
321
|
}
|
|
254
322
|
.kui-resizable-region__handle {
|
|
@@ -179,16 +179,25 @@
|
|
|
179
179
|
> *::before {
|
|
180
180
|
content: "\200b";
|
|
181
181
|
}
|
|
182
|
+
/* The clip lives on an inner span, not on the detail itself. WebKit still
|
|
183
|
+
applies the CSS 2.1 rule that an inline-block whose overflow is not
|
|
184
|
+
`visible` takes its baseline from its bottom margin edge, so a clipped
|
|
185
|
+
inline-block detail rose off the title's baseline there and pushed the
|
|
186
|
+
title and badge down. An inline flex container's baseline is its first
|
|
187
|
+
item's text baseline in every engine, whatever that item's overflow. */
|
|
182
188
|
.kui-state-banner__detail {
|
|
183
|
-
display: inline-
|
|
189
|
+
display: inline-flex;
|
|
184
190
|
max-width: 100%;
|
|
185
|
-
overflow: clip;
|
|
186
191
|
color: var(--_kui-state-banner-detail);
|
|
187
192
|
font-size: var(--kui-font-2xs);
|
|
188
|
-
text-overflow: ellipsis;
|
|
189
193
|
vertical-align: baseline;
|
|
190
194
|
white-space: nowrap;
|
|
191
195
|
}
|
|
196
|
+
.kui-state-banner__detail > span {
|
|
197
|
+
min-width: 0;
|
|
198
|
+
overflow: clip;
|
|
199
|
+
text-overflow: ellipsis;
|
|
200
|
+
}
|
|
192
201
|
.kui-state-banner__action {
|
|
193
202
|
justify-self: end;
|
|
194
203
|
}
|
|
@@ -216,6 +225,6 @@
|
|
|
216
225
|
relationship: a content-sized badge one item gap after the title, on the
|
|
217
226
|
title's baseline. */
|
|
218
227
|
.kui-state-banner__detail {
|
|
219
|
-
display:
|
|
228
|
+
display: flex;
|
|
220
229
|
}
|
|
221
230
|
}
|
package/dist/styles/styles.css
CHANGED
package/dist/styles/tab-bar.css
CHANGED
|
@@ -18,9 +18,11 @@
|
|
|
18
18
|
.kui-tab-bar__tabs {
|
|
19
19
|
display: flex;
|
|
20
20
|
min-width: 0;
|
|
21
|
-
height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
|
|
21
|
+
min-height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
|
|
22
22
|
padding: 1px;
|
|
23
|
-
overflow-x
|
|
23
|
+
/* Scroll along the strip only: overflow-x alone computes overflow-y to auto,
|
|
24
|
+
so any vertical excess would let the strip scroll vertically on touch. */
|
|
25
|
+
overflow: auto hidden;
|
|
24
26
|
box-sizing: border-box;
|
|
25
27
|
border: 1px solid var(--kui-tab-bar-border);
|
|
26
28
|
border-radius: var(--kui-layout-pill-radius, calc(1px + 1.3125rem));
|
|
@@ -36,12 +38,38 @@
|
|
|
36
38
|
--kui-tab-bar-background: var(--kui-color-neutral-fill-quiet);
|
|
37
39
|
--kui-tab-bar-border: var(--kui-color-neutral-border-quiet);
|
|
38
40
|
}
|
|
41
|
+
/* A segmented strip's outer ends follow the pill track. The first tab's
|
|
42
|
+
leading corners, and a filled strip's last tab's trailing corners, are
|
|
43
|
+
pill-rounded, and a compact tab is inset from the track's ends by the same
|
|
44
|
+
distance as from its top and bottom, so each end is concentric with the
|
|
45
|
+
track. Only fill allocation carries the last tab to the track's trailing
|
|
46
|
+
end; an intrinsic strip's last tab stops short of it and keeps the segment
|
|
47
|
+
radius, as do the corners between tabs. */
|
|
48
|
+
.kui-tab-bar[data-presentation="segmented"]
|
|
49
|
+
.kui-tab-bar__tabs:has(> [data-component="app-tab"][data-size="compact"]) {
|
|
50
|
+
padding-inline: calc(
|
|
51
|
+
(var(--kui-toolbar-group-size, calc(2px + 2.625rem)) - 2rem) /
|
|
52
|
+
2 - 1px
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
.kui-tab-bar[data-presentation="segmented"]
|
|
56
|
+
.kui-tab-bar__tabs
|
|
57
|
+
> [data-component="app-tab"]:first-child {
|
|
58
|
+
border-start-start-radius: var(--kui-radius-pill);
|
|
59
|
+
border-end-start-radius: var(--kui-radius-pill);
|
|
60
|
+
}
|
|
61
|
+
.kui-tab-bar[data-presentation="segmented"][data-allocation="fill"]
|
|
62
|
+
.kui-tab-bar__tabs
|
|
63
|
+
> [data-component="app-tab"]:last-child {
|
|
64
|
+
border-start-end-radius: var(--kui-radius-pill);
|
|
65
|
+
border-end-end-radius: var(--kui-radius-pill);
|
|
66
|
+
}
|
|
39
67
|
.kui-tab-bar[data-presentation="inspector"] {
|
|
40
68
|
min-height: 2.125rem;
|
|
41
69
|
padding: 0;
|
|
42
70
|
}
|
|
43
71
|
.kui-tab-bar[data-presentation="inspector"] .kui-tab-bar__tabs {
|
|
44
|
-
height: 2.125rem;
|
|
72
|
+
min-height: 2.125rem;
|
|
45
73
|
border-radius: var(--kui-radius-s);
|
|
46
74
|
}
|
|
47
75
|
.kui-tab-bar[data-allocation="fill"] [data-component="app-tab"] {
|
|
@@ -254,6 +254,19 @@
|
|
|
254
254
|
white-space: nowrap;
|
|
255
255
|
}
|
|
256
256
|
|
|
257
|
+
/* An icon tile: a non-interactive icon placed directly in a group (a panel
|
|
258
|
+
heading's identity glyph) takes the same 40px slot and 16px visual as an
|
|
259
|
+
icon button, so it centers in the group and lines up with button icons,
|
|
260
|
+
without a hover surface or a focusable control that does nothing. */
|
|
261
|
+
.kui-toolbar-control-group > svg {
|
|
262
|
+
display: block;
|
|
263
|
+
width: 1rem;
|
|
264
|
+
height: 1rem;
|
|
265
|
+
padding: 0.75rem;
|
|
266
|
+
box-sizing: content-box;
|
|
267
|
+
flex: 0 0 auto;
|
|
268
|
+
}
|
|
269
|
+
|
|
257
270
|
.kui-toolbar-control-group > button svg,
|
|
258
271
|
.kui-toolbar-control-group wa-button > svg,
|
|
259
272
|
.kui-toolbar-control-group > .kui-toolbar-action-link svg {
|
package/dist/styles/toolbar.css
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
color: var(--kui-color-text);
|
|
7
7
|
background: transparent;
|
|
8
8
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
9
|
-
align-items:
|
|
9
|
+
align-items: start;
|
|
10
10
|
gap: var(--kui-toolbar-gap, 0.5rem);
|
|
11
11
|
container: kui-toolbar / inline-size;
|
|
12
12
|
font-family: var(--kui-font-sans);
|
|
@@ -128,15 +128,56 @@
|
|
|
128
128
|
);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
/* The control band. Every zone reserves one group-height row at the top of
|
|
132
|
+
the toolbar, and each item is centered in that band by its own size, not by
|
|
133
|
+
its siblings: a group or title shorter than the band takes half the
|
|
134
|
+
difference as a top margin, and anything taller (a wrapped title, a
|
|
135
|
+
multi-line search, a second trailing row) starts at the band's top and grows
|
|
136
|
+
down. A growing item therefore never moves the other items or its own top.
|
|
137
|
+
Centering the zones in the toolbar row instead dropped every control to the
|
|
138
|
+
middle of a two-line title. The band is resolved here, on the toolbar, so a
|
|
139
|
+
compact group's own smaller group size never redefines it. */
|
|
140
|
+
.kui-toolbar {
|
|
141
|
+
--_kui-toolbar-band: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
|
|
142
|
+
}
|
|
143
|
+
|
|
131
144
|
.kui-toolbar__leading,
|
|
132
145
|
.kui-toolbar__center,
|
|
133
146
|
.kui-toolbar__trailing {
|
|
134
147
|
display: flex;
|
|
135
148
|
min-width: 0;
|
|
136
|
-
|
|
149
|
+
min-height: var(--_kui-toolbar-band);
|
|
150
|
+
align-items: flex-start;
|
|
137
151
|
gap: var(--kui-toolbar-gap, 0.5rem);
|
|
138
152
|
}
|
|
139
153
|
|
|
154
|
+
:is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
|
|
155
|
+
> [data-component="toolbar-control-group"] {
|
|
156
|
+
margin-block-start: max(
|
|
157
|
+
0px,
|
|
158
|
+
calc(
|
|
159
|
+
(
|
|
160
|
+
var(--_kui-toolbar-band) -
|
|
161
|
+
var(--kui-toolbar-group-size, calc(2px + 2.625rem))
|
|
162
|
+
) /
|
|
163
|
+
2
|
|
164
|
+
)
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* A title fills the band and centers its first line in it; further lines of a
|
|
169
|
+
wrapped title continue below the band. */
|
|
170
|
+
:is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
|
|
171
|
+
> [data-component="toolbar-text"] {
|
|
172
|
+
height: auto;
|
|
173
|
+
min-height: var(--_kui-toolbar-band);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
:is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing)
|
|
177
|
+
> [data-component="toolbar-text"][data-wrap="true"] {
|
|
178
|
+
padding-block: max(0px, calc((var(--_kui-toolbar-band) - 1.25em) / 2));
|
|
179
|
+
}
|
|
180
|
+
|
|
140
181
|
/* Pin each zone to its column so a display:none (empty) leading or center zone
|
|
141
182
|
doesn't let the trailing zone auto-place into the first column — which left an
|
|
142
183
|
extra gap + empty track to the trailing zone's right (KF-5BEF2M). The trailing
|