@kerfjs/ui 5.0.0-beta.50 → 5.0.0-beta.51
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 +29 -5
- package/ai/compile-time-contracts-v1.json +5 -2
- package/ai/component-catalog-v2.d.ts +19 -1
- package/ai/component-catalog-v2.json +842 -127
- package/ai/component-catalog-v2.schema.json +33 -1
- package/ai/component-catalog.json +603 -126
- package/ai/component-catalog.schema.json +21 -1
- package/ai/public-api-signatures-v1.md +201 -29
- package/ai/skill.md +12 -9
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +105 -35
- package/dist/app-tab.js +1 -1
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +28 -5
- package/dist/catalog.js +66 -25
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-COUPLRZG.js → chunk-5FZZMIMD.js} +3 -3
- package/dist/{chunk-COUPLRZG.js.map → chunk-5FZZMIMD.js.map} +1 -1
- package/dist/{chunk-DARTMI5Z.js → chunk-5PMGQDG7.js} +2 -2
- package/dist/{chunk-DARTMI5Z.js.map → chunk-5PMGQDG7.js.map} +1 -1
- package/dist/{chunk-V6RZWDII.js → chunk-7GUQYHKA.js} +19 -2
- package/dist/chunk-7GUQYHKA.js.map +1 -0
- package/dist/{chunk-ZNZ2JDBW.js → chunk-7IUSV4XG.js} +1 -1
- package/dist/chunk-7IUSV4XG.js.map +1 -0
- package/dist/{chunk-ELRMBQEC.js → chunk-AEPXGCNF.js} +17 -2
- package/dist/chunk-AEPXGCNF.js.map +1 -0
- package/dist/{chunk-5CE64WGC.js → chunk-D547PH4L.js} +3 -3
- package/dist/{chunk-5CE64WGC.js.map → chunk-D547PH4L.js.map} +1 -1
- package/dist/{chunk-S6ZTTTV7.js → chunk-DVZCMMB3.js} +3 -3
- package/dist/{chunk-S6ZTTTV7.js.map → chunk-DVZCMMB3.js.map} +1 -1
- package/dist/chunk-EKYZCRCX.js +256 -0
- package/dist/chunk-EKYZCRCX.js.map +1 -0
- package/dist/{chunk-3V75EQIP.js → chunk-JM53SMVF.js} +3 -3
- package/dist/{chunk-3V75EQIP.js.map → chunk-JM53SMVF.js.map} +1 -1
- package/dist/{chunk-2WMSE4MK.js → chunk-JMGKM7RK.js} +2 -2
- package/dist/{chunk-2WMSE4MK.js.map → chunk-JMGKM7RK.js.map} +1 -1
- package/dist/{chunk-2YOUUEWR.js → chunk-KX7DP2GO.js} +4 -4
- package/dist/{chunk-2YOUUEWR.js.map → chunk-KX7DP2GO.js.map} +1 -1
- package/dist/{chunk-OL4TC3U2.js → chunk-MO56ZZLG.js} +6 -2
- package/dist/chunk-MO56ZZLG.js.map +1 -0
- package/dist/{chunk-OQI7RCRP.js → chunk-MTM43SJO.js} +7 -1
- package/dist/chunk-MTM43SJO.js.map +1 -0
- package/dist/{chunk-ZSYLBVWG.js → chunk-NMGTHYW3.js} +3 -3
- package/dist/{chunk-ZSYLBVWG.js.map → chunk-NMGTHYW3.js.map} +1 -1
- package/dist/{chunk-AQSKJ6U6.js → chunk-NZXWU4R5.js} +21 -2
- package/dist/chunk-NZXWU4R5.js.map +1 -0
- package/dist/{chunk-DJKWFYAA.js → chunk-O3RCCSQJ.js} +3 -3
- package/dist/{chunk-DJKWFYAA.js.map → chunk-O3RCCSQJ.js.map} +1 -1
- package/dist/{chunk-UMGY5JSP.js → chunk-S4QRSBFI.js} +22 -2
- package/dist/chunk-S4QRSBFI.js.map +1 -0
- package/dist/{chunk-KKNK3JUT.js → chunk-UBH743HV.js} +5 -5
- package/dist/chunk-UBH743HV.js.map +1 -0
- package/dist/{chunk-54HM36IQ.js → chunk-ULCDZTWL.js} +2 -2
- package/dist/{chunk-54HM36IQ.js.map → chunk-ULCDZTWL.js.map} +1 -1
- package/dist/{chunk-SIU2AC5W.js → chunk-UPZ6EEJN.js} +3 -3
- package/dist/{chunk-SIU2AC5W.js.map → chunk-UPZ6EEJN.js.map} +1 -1
- package/dist/collapsible-panel.d.ts +1 -1
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/css-values.d.ts +39 -3
- package/dist/css-values.js +1 -1
- package/dist/grid.d.ts +15 -1
- package/dist/grid.js +2 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +19 -19
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/list.d.ts +21 -2
- package/dist/list.js +2 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +17 -2
- package/dist/pane.js +1 -1
- package/dist/row.d.ts +19 -1
- package/dist/row.js +2 -1
- package/dist/segmented-control.js +1 -1
- package/dist/select.d.ts +13 -3
- package/dist/select.js +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/catalog/components/catalog-example-stack.css +4 -1
- package/dist/styles/catalog/components/catalog-example.css +145 -0
- package/dist/styles/collapsible-panel.css +132 -4
- package/dist/styles/document.css +23 -0
- package/dist/styles/foundation.css +21 -7
- package/dist/styles/grid.css +10 -0
- package/dist/styles/list-header.css +45 -0
- package/dist/styles/list-inset-control.css +8 -1
- package/dist/styles/list-item.css +6 -0
- package/dist/styles/list.css +11 -0
- package/dist/styles/nav-stack.css +89 -2
- package/dist/styles/pane.css +86 -1
- package/dist/styles/resizable-region.css +93 -5
- package/dist/styles/row.css +10 -0
- package/dist/styles/select.css +39 -4
- package/dist/styles/split-view.css +107 -1
- package/dist/styles/tab-scaffold.css +64 -1
- package/dist/styles/text.css +6 -0
- package/dist/styles/toolbar-control-group.css +90 -11
- package/dist/styles/toolbar-text.css +4 -1
- package/dist/styles/toolbar.css +130 -38
- package/dist/styles/webawesome.css +48 -2
- package/dist/styles/workbench.css +136 -4
- package/dist/text.d.ts +4 -3
- package/dist/text.js +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +24 -3
- package/dist/toolbar.js +1 -1
- package/dist/{types-CzgSrFXP.d.ts → types-CEsieBZi.d.ts} +6 -1
- package/dist/value-table.js +1 -1
- package/dist/wire-resizable-regions.js +1 -1
- package/dist/wire-sidebar.d.ts +18 -3
- package/dist/wire-sidebar.js +95 -14
- package/dist/wire-sidebar.js.map +1 -1
- package/docs/accessibility.md +45 -8
- package/docs/app-layouts.md +73 -0
- package/docs/catalog.md +23 -2
- package/docs/collapsible-panel.md +81 -8
- package/docs/component-contract.md +28 -9
- package/docs/component-integration.md +9 -4
- package/docs/component-selection.md +25 -6
- package/docs/design/templates/list/stack-dark.svg +1 -1
- package/docs/design/templates/list/stack.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-header/action-dark.svg +1 -1
- package/docs/design/templates/list-header/action.svg +1 -1
- package/docs/design/templates/list-header/count-dark.svg +1 -1
- package/docs/design/templates/list-header/count.svg +1 -1
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
- package/docs/design/templates/list-header/inline-action.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
- package/docs/design/templates/state-banner/info-badge.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
- package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
- package/docs/design/templates/toolbar-control-group.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/default.svg +1 -1
- package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/large.svg +1 -1
- package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
- package/docs/design/templates/toolbar-text/small.svg +1 -1
- package/docs/design/templates/toolbar-text-dark.svg +1 -1
- package/docs/design/templates/toolbar-text.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/document-baseline.md +31 -0
- package/docs/layout.md +86 -21
- package/docs/nav-stack.md +8 -0
- package/docs/recipes.md +78 -43
- package/docs/split-view.md +8 -0
- package/docs/tab-scaffold.md +4 -2
- package/docs/type-contracts.md +21 -17
- package/docs/ui-analyzer.md +19 -0
- package/docs/ui-evaluator.md +17 -0
- package/docs/ux-demo.md +4 -4
- package/docs/webawesome-theme.md +20 -2
- package/docs/workbench.md +20 -1
- package/evaluator/index.mjs +73 -8
- package/llms.txt +32 -14
- package/package.json +4 -2
- package/ux-demo/recipes/app-shell.tsx +209 -178
- package/ux-demo/recipes/collapsible-sidebar.tsx +188 -159
- package/ux-demo/recipes/compact-toolbar.tsx +48 -35
- package/ux-demo/recipes/composer-form.tsx +85 -79
- package/ux-demo/recipes/list-detail-dialog.tsx +124 -142
- package/ux-demo/recipes/list-workspace-states.tsx +83 -83
- package/ux-demo/recipes/loaders.ts +5 -2
- package/ux-demo/recipes/loading-inspector.tsx +157 -160
- package/ux-demo/recipes/navigation-sidebar.tsx +111 -109
- package/ux-demo/recipes/navigation-stack.tsx +50 -49
- package/ux-demo/recipes/types.ts +14 -0
- package/ux-demo/recipes/workspace-header.tsx +73 -56
- package/dist/chunk-AQSKJ6U6.js.map +0 -1
- package/dist/chunk-ELRMBQEC.js.map +0 -1
- package/dist/chunk-J3EE6XWD.js +0 -115
- package/dist/chunk-J3EE6XWD.js.map +0 -1
- package/dist/chunk-KKNK3JUT.js.map +0 -1
- package/dist/chunk-OL4TC3U2.js.map +0 -1
- package/dist/chunk-OQI7RCRP.js.map +0 -1
- package/dist/chunk-UMGY5JSP.js.map +0 -1
- package/dist/chunk-V6RZWDII.js.map +0 -1
- package/dist/chunk-ZNZ2JDBW.js.map +0 -1
- package/ux-demo/recipes/app-shell.css +0 -87
- package/ux-demo/recipes/collapsible-sidebar.css +0 -83
- package/ux-demo/recipes/compact-toolbar.css +0 -35
- package/ux-demo/recipes/composer-form.css +0 -19
- package/ux-demo/recipes/list-detail-dialog.css +0 -42
- package/ux-demo/recipes/list-workspace-states.css +0 -30
- package/ux-demo/recipes/loading-inspector.css +0 -7
- package/ux-demo/recipes/navigation-sidebar.css +0 -12
- package/ux-demo/recipes/navigation-stack.css +0 -12
- package/ux-demo/recipes/recipe-root.css +0 -67
- package/ux-demo/recipes/recipe-root.tsx +0 -87
- package/ux-demo/recipes/workspace-header.css +0 -7
|
@@ -21,6 +21,15 @@
|
|
|
21
21
|
)
|
|
22
22
|
);
|
|
23
23
|
--kui-toolbar-item-radius: var(--kui-control-highlight-radius);
|
|
24
|
+
/* Internal group-to-child contract: the control slot a composed child (an
|
|
25
|
+
icon-only Select) fills so it is inset evenly on every side and the
|
|
26
|
+
group-owned focus ring stays concentric with the visible control. The
|
|
27
|
+
group sizes to the child's width. A default slot is 40px tall inside the
|
|
28
|
+
2px inset; a compact slot is the full 32px padding box, and a lone
|
|
29
|
+
compact child also overlaps the 1px inline padding. */
|
|
30
|
+
--_kui-toolbar-slot-height: 2.5rem;
|
|
31
|
+
--_kui-toolbar-slot-overlap: 0px;
|
|
32
|
+
--_kui-toolbar-slot-radius: var(--kui-toolbar-item-radius);
|
|
24
33
|
display: inline-flex;
|
|
25
34
|
height: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
|
|
26
35
|
min-width: var(--kui-toolbar-group-size, calc(2px + 2.625rem));
|
|
@@ -71,6 +80,13 @@
|
|
|
71
80
|
}
|
|
72
81
|
.kui-toolbar-control-group[data-size="compact"] {
|
|
73
82
|
--kui-toolbar-group-size: 2.125rem;
|
|
83
|
+
--_kui-toolbar-slot-height: 2rem;
|
|
84
|
+
--_kui-toolbar-slot-overlap: 1px;
|
|
85
|
+
--_kui-toolbar-slot-radius: max(
|
|
86
|
+
0px,
|
|
87
|
+
calc(var(--kui-toolbar-group-radius) - 1px)
|
|
88
|
+
);
|
|
89
|
+
gap: 4px; /* Compensating for -2px margins */
|
|
74
90
|
}
|
|
75
91
|
.kui-toolbar-control-group[data-density="tight"] {
|
|
76
92
|
--kui-layout-item-padding: 0.3125rem;
|
|
@@ -105,6 +121,18 @@
|
|
|
105
121
|
display: flex;
|
|
106
122
|
gap: var(--kui-space-xs);
|
|
107
123
|
}
|
|
124
|
+
.kui-toolbar-control-group[data-content="mixed"] wa-button {
|
|
125
|
+
line-height: normal;
|
|
126
|
+
}
|
|
127
|
+
/* Toolbar controls never wrap. Web Awesome's label part is a plain block, so a
|
|
128
|
+
slotted icon (a block SVG) and its text would otherwise stack vertically —
|
|
129
|
+
lay them out on one row the way native mixed buttons already are. */
|
|
130
|
+
.kui-toolbar-control-group wa-button::part(label) {
|
|
131
|
+
display: inline-flex;
|
|
132
|
+
align-items: center;
|
|
133
|
+
gap: var(--kui-space-xs);
|
|
134
|
+
white-space: nowrap;
|
|
135
|
+
}
|
|
108
136
|
.kui-toolbar-control-group[data-content="avatar"][data-scrim="true"] {
|
|
109
137
|
--kui-toolbar-control-background: color-mix(
|
|
110
138
|
in srgb,
|
|
@@ -234,6 +262,15 @@
|
|
|
234
262
|
height: 1rem;
|
|
235
263
|
}
|
|
236
264
|
|
|
265
|
+
/* Nested Web Awesome buttons take the group's control height, not the theme's
|
|
266
|
+
44px standalone control height. */
|
|
267
|
+
.kui-toolbar-control-group wa-button {
|
|
268
|
+
--wa-form-control-height: 2.5rem;
|
|
269
|
+
}
|
|
270
|
+
.kui-toolbar-control-group[data-size="compact"] wa-button {
|
|
271
|
+
--wa-form-control-height: 2rem;
|
|
272
|
+
}
|
|
273
|
+
|
|
237
274
|
.kui-toolbar-control-group > wa-button,
|
|
238
275
|
.kui-toolbar-control-group > wa-dropdown,
|
|
239
276
|
.kui-toolbar-control-group > wa-dropdown > wa-button,
|
|
@@ -260,6 +297,13 @@
|
|
|
260
297
|
min-height: 2rem;
|
|
261
298
|
}
|
|
262
299
|
|
|
300
|
+
/* A compact icon button is a 32px circle like its compact wa-button and
|
|
301
|
+
Select siblings; the default 8px inline padding around a 16px icon made its
|
|
302
|
+
selected highlight a 34x32 oval. */
|
|
303
|
+
.kui-toolbar-control-group[data-size="compact"][data-content="icon"] > button {
|
|
304
|
+
padding-inline: 0;
|
|
305
|
+
}
|
|
306
|
+
|
|
263
307
|
.kui-toolbar-control-group[data-menu-inset="standard"] wa-dropdown::part(menu) {
|
|
264
308
|
padding: var(--kui-wa-surface-inset, 0.5rem);
|
|
265
309
|
}
|
|
@@ -287,6 +331,13 @@
|
|
|
287
331
|
border-radius: var(--kui-toolbar-group-radius);
|
|
288
332
|
}
|
|
289
333
|
|
|
334
|
+
.kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
|
|
335
|
+
> wa-dropdown,
|
|
336
|
+
.kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
|
|
337
|
+
> wa-button {
|
|
338
|
+
margin: -2px;
|
|
339
|
+
}
|
|
340
|
+
|
|
290
341
|
/* A compact icon-only trigger may stay square, but a mixed-content dropdown
|
|
291
342
|
trigger must grow for its slotted label plus Web Awesome's caret. Otherwise
|
|
292
343
|
the fixed 32px base centers both outside its host, painting the label across
|
|
@@ -301,20 +352,14 @@
|
|
|
301
352
|
}
|
|
302
353
|
.kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
|
|
303
354
|
> wa-dropdown
|
|
304
|
-
> wa-button {
|
|
305
|
-
|
|
306
|
-
host's intrinsic inline size. Give the standard short text trigger an
|
|
307
|
-
engine-stable floor; max-content still wins for longer light-DOM labels,
|
|
308
|
-
and consumers can raise the public variable for localized copy. */
|
|
309
|
-
width: var(--kui-toolbar-dropdown-trigger-width, 4.125rem);
|
|
355
|
+
> wa-button::part(base) {
|
|
356
|
+
width: max-content;
|
|
310
357
|
}
|
|
311
358
|
|
|
312
|
-
.kui-toolbar-control-group[data-single="true"] > wa-dropdown,
|
|
313
|
-
.kui-toolbar-control-group[data-single="true"] > wa-dropdown > wa-button,
|
|
314
359
|
.kui-toolbar-control-group[data-single="true"]
|
|
315
360
|
> wa-dropdown
|
|
316
361
|
> wa-button::part(base) {
|
|
317
|
-
width:
|
|
362
|
+
width: max-content;
|
|
318
363
|
}
|
|
319
364
|
|
|
320
365
|
.kui-toolbar-control-group wa-button {
|
|
@@ -345,7 +390,7 @@
|
|
|
345
390
|
}
|
|
346
391
|
|
|
347
392
|
.kui-toolbar-control-group[data-single="true"]:has(
|
|
348
|
-
> :is(button, wa-button, wa-dropdown, .kui-toolbar-action-link)
|
|
393
|
+
> :is(button, wa-button, wa-dropdown, wa-select, .kui-toolbar-action-link)
|
|
349
394
|
):hover {
|
|
350
395
|
background-color: var(--kui-toolbar-control-hover-background);
|
|
351
396
|
}
|
|
@@ -362,7 +407,7 @@
|
|
|
362
407
|
inner layer inset from the border (KF-J9P1ZD — a heading toolbar's lone Close/
|
|
363
408
|
Done action). */
|
|
364
409
|
.kui-toolbar-control-group:not([data-single="true"]):has(
|
|
365
|
-
> :is(button, wa-button, .kui-toolbar-action-link):only-child
|
|
410
|
+
> :is(button, wa-button, wa-select, .kui-toolbar-action-link):only-child
|
|
366
411
|
):hover {
|
|
367
412
|
background-color: var(--kui-toolbar-control-hover-background);
|
|
368
413
|
}
|
|
@@ -379,6 +424,15 @@
|
|
|
379
424
|
background: transparent;
|
|
380
425
|
}
|
|
381
426
|
|
|
427
|
+
/* A toolbar Select beside other controls highlights its own pill on hover,
|
|
428
|
+
like its button and dropdown siblings; a lone Select instead lifts the whole
|
|
429
|
+
group (above). */
|
|
430
|
+
.kui-toolbar-control-group:not([data-single="true"])
|
|
431
|
+
> wa-select:not(:only-child):hover::part(combobox) {
|
|
432
|
+
border-color: var(--kui-toolbar-control-border);
|
|
433
|
+
background: var(--kui-toolbar-control-hover-background);
|
|
434
|
+
}
|
|
435
|
+
|
|
382
436
|
/* A plain <button> child paints its own box for the selected state. */
|
|
383
437
|
.kui-toolbar-control-group[data-single="false"] > button[aria-pressed="true"] {
|
|
384
438
|
border-color: var(--kui-toolbar-control-selected-border);
|
|
@@ -409,6 +463,15 @@
|
|
|
409
463
|
outline-offset: 1px;
|
|
410
464
|
}
|
|
411
465
|
|
|
466
|
+
/* With per-control rings, a composed Select paints its own ring even when it
|
|
467
|
+
was told the group owns it: nothing else would show focus. It matches the
|
|
468
|
+
sibling controls' ring and offset. */
|
|
469
|
+
.kui-toolbar-control-group[data-focus-ring="control"]
|
|
470
|
+
> wa-select:focus-within::part(combobox) {
|
|
471
|
+
outline: var(--kui-focus-ring);
|
|
472
|
+
outline-offset: 1px;
|
|
473
|
+
}
|
|
474
|
+
|
|
412
475
|
.kui-toolbar-control-group[data-focus-ring="outline"]:focus-within {
|
|
413
476
|
outline: var(--kui-focus-ring);
|
|
414
477
|
outline-offset: 1px;
|
|
@@ -420,6 +483,22 @@
|
|
|
420
483
|
color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
|
|
421
484
|
}
|
|
422
485
|
|
|
486
|
+
/* Chromium and WebKit do not propagate :focus-within from a focused
|
|
487
|
+
light-DOM child (an open wa-select's active wa-option) through the host's
|
|
488
|
+
popup shadow tree, so the group ring vanished while its Select listbox was
|
|
489
|
+
open. A focused light-DOM descendant still owns the group ring. Kept as
|
|
490
|
+
separate rules so an engine without :has() keeps the :focus-within ring. */
|
|
491
|
+
.kui-toolbar-control-group[data-focus-ring="outline"]:has(:focus) {
|
|
492
|
+
outline: var(--kui-focus-ring);
|
|
493
|
+
outline-offset: 1px;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
.kui-toolbar-control-group[data-focus-ring="halo"]:has(:focus) {
|
|
497
|
+
border-color: var(--kui-color-text-link);
|
|
498
|
+
box-shadow: 0 0 0 3px
|
|
499
|
+
color-mix(in srgb, var(--kui-color-text-link) 22%, transparent);
|
|
500
|
+
}
|
|
501
|
+
|
|
423
502
|
.kui-toolbar-control-group[data-button-appearance="push"][data-single="true"]:has(
|
|
424
503
|
> :is(button, wa-button)[aria-pressed="true"]
|
|
425
504
|
) {
|
|
@@ -46,8 +46,11 @@
|
|
|
46
46
|
font-size: var(--kui-font-s);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
/* Every size keeps the inherited UI sans stack: compact identity text is a
|
|
50
|
+
label, not code. (A monospace role here resolved through Web Awesome's
|
|
51
|
+
`ui-monospace, monospace` code stack; Chromium does not
|
|
52
|
+
recognize `ui-monospace`, so small labels fell back to generic monospace.) */
|
|
49
53
|
.kui-toolbar-text[data-size="small"] {
|
|
50
|
-
font-family: var(--kui-font-mono);
|
|
51
54
|
font-size: var(--kui-font-xs);
|
|
52
55
|
}
|
|
53
56
|
|
package/dist/styles/toolbar.css
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
.kui-toolbar {
|
|
2
2
|
display: grid;
|
|
3
3
|
width: 100%;
|
|
4
|
-
min-height:
|
|
5
|
-
var(--kui-toolbar-group-size, calc(2px + 2.625rem)) +
|
|
6
|
-
(2 * var(--kui-toolbar-gap, 0.5rem))
|
|
7
|
-
);
|
|
8
|
-
padding: var(--kui-toolbar-gap, 0.5rem);
|
|
4
|
+
/* min-height and padding: see the safe-area rules below. */
|
|
9
5
|
box-sizing: border-box;
|
|
10
6
|
color: var(--kui-color-text);
|
|
11
7
|
background: transparent;
|
|
@@ -16,6 +12,78 @@
|
|
|
16
12
|
font-family: var(--kui-font-sans);
|
|
17
13
|
}
|
|
18
14
|
|
|
15
|
+
/* Safe areas: a toolbar compensates only for the inline edges its owner hands
|
|
16
|
+
it through `--kui-edge-inset-inline-*` (a Pane header or footer does), so its
|
|
17
|
+
box and dividers keep reaching the edge while its zones clear the unsafe
|
|
18
|
+
area. Unset means none: a toolbar embedded in content never pads for the
|
|
19
|
+
device. An app bar or bottom bar at a screen edge claims its sides with
|
|
20
|
+
`safeAreaEdges`; each claimed side pads by the routed edge context, or the
|
|
21
|
+
full device inset when nothing routes it (the Pane rule), so the top bar of
|
|
22
|
+
a shell clears the status area. A Pane header or footer clears the context
|
|
23
|
+
for its children, so a claimed side there never double-insets. Its zones
|
|
24
|
+
then see a cleared context. */
|
|
25
|
+
.kui-toolbar {
|
|
26
|
+
--_kui-toolbar-safe-block-start: 0px;
|
|
27
|
+
--_kui-toolbar-safe-block-end: 0px;
|
|
28
|
+
--_kui-toolbar-safe-inline-start: var(--kui-edge-inset-inline-start, 0px);
|
|
29
|
+
--_kui-toolbar-safe-inline-end: var(--kui-edge-inset-inline-end, 0px);
|
|
30
|
+
/* The minimum height grows by any claimed block inset, so a toolbar a flex
|
|
31
|
+
column shrinks still keeps a whole control row clear of the unsafe area. */
|
|
32
|
+
min-height: calc(
|
|
33
|
+
var(--kui-toolbar-group-size, calc(2px + 2.625rem)) +
|
|
34
|
+
(2 * var(--kui-toolbar-gap, 0.5rem)) +
|
|
35
|
+
var(--_kui-toolbar-safe-block-start) + var(--_kui-toolbar-safe-block-end)
|
|
36
|
+
);
|
|
37
|
+
padding-block: calc(
|
|
38
|
+
var(--kui-toolbar-gap, 0.5rem) + var(--_kui-toolbar-safe-block-start)
|
|
39
|
+
)
|
|
40
|
+
calc(
|
|
41
|
+
var(--kui-toolbar-gap, 0.5rem) + var(--_kui-toolbar-safe-block-end)
|
|
42
|
+
);
|
|
43
|
+
padding-inline: calc(
|
|
44
|
+
var(--kui-toolbar-gap, 0.5rem) +
|
|
45
|
+
var(--_kui-toolbar-safe-inline-start)
|
|
46
|
+
)
|
|
47
|
+
calc(
|
|
48
|
+
var(--kui-toolbar-gap, 0.5rem) + var(--_kui-toolbar-safe-inline-end)
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.kui-toolbar[data-safe-area-block-start="true"] {
|
|
53
|
+
--_kui-toolbar-safe-block-start: var(
|
|
54
|
+
--kui-edge-inset-block-start,
|
|
55
|
+
var(--kui-safe-area-block-start, env(safe-area-inset-top, 0px))
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.kui-toolbar[data-safe-area-block-end="true"] {
|
|
60
|
+
--_kui-toolbar-safe-block-end: var(
|
|
61
|
+
--kui-edge-inset-block-end,
|
|
62
|
+
var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.kui-toolbar[data-safe-area-inline-start="true"] {
|
|
67
|
+
--_kui-toolbar-safe-inline-start: var(
|
|
68
|
+
--kui-edge-inset-inline-start,
|
|
69
|
+
var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.kui-toolbar[data-safe-area-inline-end="true"] {
|
|
74
|
+
--_kui-toolbar-safe-inline-end: var(
|
|
75
|
+
--kui-edge-inset-inline-end,
|
|
76
|
+
var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.kui-toolbar > * {
|
|
81
|
+
--kui-edge-inset-block-start: 0px;
|
|
82
|
+
--kui-edge-inset-block-end: 0px;
|
|
83
|
+
--kui-edge-inset-inline-start: 0px;
|
|
84
|
+
--kui-edge-inset-inline-end: 0px;
|
|
85
|
+
}
|
|
86
|
+
|
|
19
87
|
.kui-toolbar[data-has-center="false"] {
|
|
20
88
|
grid-template-columns: minmax(0, 1fr) auto;
|
|
21
89
|
}
|
|
@@ -97,6 +165,35 @@
|
|
|
97
165
|
.kui-toolbar__trailing {
|
|
98
166
|
justify-content: flex-end;
|
|
99
167
|
grid-column: -2 / -1;
|
|
168
|
+
/* Trailing actions never clip (KF-4EYES0): the zone wraps its groups, so its
|
|
169
|
+
track can shrink only to the widest single group. When one row cannot hold
|
|
170
|
+
every group, the next group moves to a new trailing-aligned row instead of
|
|
171
|
+
overflowing the toolbar. */
|
|
172
|
+
flex-wrap: wrap;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* Content-driven wrap: one row while every zone fits at its natural width;
|
|
176
|
+
otherwise the trailing zone moves below the identity, still trailing-aligned,
|
|
177
|
+
instead of truncating the leading title or clipping an action. For panel,
|
|
178
|
+
inspector, and dialog headings whose identity must stay whole. */
|
|
179
|
+
.kui-toolbar[data-responsive="wrap"] {
|
|
180
|
+
display: flex;
|
|
181
|
+
flex-wrap: wrap;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.kui-toolbar[data-responsive="wrap"] > .kui-toolbar__leading {
|
|
185
|
+
max-width: 100%;
|
|
186
|
+
flex: 1 1 auto;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.kui-toolbar[data-responsive="wrap"] > .kui-toolbar__center {
|
|
190
|
+
flex: 1 1 auto;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.kui-toolbar[data-responsive="wrap"] > .kui-toolbar__trailing {
|
|
194
|
+
max-width: 100%;
|
|
195
|
+
flex: 0 1 auto;
|
|
196
|
+
margin-inline-start: auto;
|
|
100
197
|
}
|
|
101
198
|
|
|
102
199
|
.kui-toolbar[data-has-center="false"] .kui-toolbar__center,
|
|
@@ -105,59 +202,54 @@
|
|
|
105
202
|
display: none;
|
|
106
203
|
}
|
|
107
204
|
|
|
205
|
+
/* Stacked topology. A container query only matches an ancestor container, so
|
|
206
|
+
these rules style the zones (whose query container is this toolbar) rather
|
|
207
|
+
than the toolbar's own grid template, which a self query can never reach.
|
|
208
|
+
Each zone spans every column track, one zone per row, so no empty track or
|
|
209
|
+
column gap narrows a stacked zone. Stacked control zones wrap at group
|
|
210
|
+
granularity (KF-4EYES0: a stacked trailing zone clipped its last action at
|
|
211
|
+
phone widths), so every group stays whole, reachable, and full size; the
|
|
212
|
+
leading identity keeps its single-line truncation. */
|
|
108
213
|
@container kui-toolbar (max-width: 52rem) {
|
|
109
|
-
.kui-toolbar[data-responsive="stack"][data-responsive-at="narrow"] {
|
|
110
|
-
height: auto;
|
|
111
|
-
grid-template-columns: minmax(0, 1fr);
|
|
112
|
-
grid-template-areas: "leading" "center" "trailing";
|
|
113
|
-
row-gap: var(--kui-toolbar-gap, 0.5rem);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
214
|
.kui-toolbar[data-responsive="stack"][data-responsive-at="narrow"]
|
|
117
|
-
> .kui-toolbar__leading,
|
|
118
|
-
.kui-toolbar[data-responsive="stack"][data-responsive-at="narrow"]
|
|
119
|
-
> .kui-toolbar__center,
|
|
120
|
-
.kui-toolbar[data-responsive="stack"][data-responsive-at="narrow"]
|
|
121
|
-
> .kui-toolbar__trailing {
|
|
215
|
+
> :is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing) {
|
|
122
216
|
width: 100%;
|
|
123
|
-
grid-column: 1;
|
|
217
|
+
grid-column: 1 / -1;
|
|
124
218
|
justify-content: flex-start;
|
|
125
219
|
}
|
|
126
|
-
}
|
|
127
220
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
grid-template-columns: minmax(0, 1fr);
|
|
132
|
-
grid-template-areas: "leading" "center" "trailing";
|
|
133
|
-
row-gap: var(--kui-toolbar-gap, 0.5rem);
|
|
221
|
+
.kui-toolbar[data-responsive="stack"][data-responsive-at="narrow"]
|
|
222
|
+
> :is(.kui-toolbar__center, .kui-toolbar__trailing) {
|
|
223
|
+
flex-wrap: wrap;
|
|
134
224
|
}
|
|
225
|
+
}
|
|
135
226
|
|
|
227
|
+
@container kui-toolbar (max-width: 44rem) {
|
|
136
228
|
.kui-toolbar[data-responsive="stack"][data-responsive-at="compact"]
|
|
137
|
-
> .kui-toolbar__leading,
|
|
138
|
-
.kui-toolbar[data-responsive="stack"][data-responsive-at="compact"]
|
|
139
|
-
> .kui-toolbar__center,
|
|
140
|
-
.kui-toolbar[data-responsive="stack"][data-responsive-at="compact"]
|
|
141
|
-
> .kui-toolbar__trailing {
|
|
229
|
+
> :is(.kui-toolbar__leading, .kui-toolbar__center, .kui-toolbar__trailing) {
|
|
142
230
|
width: 100%;
|
|
143
|
-
grid-column: 1;
|
|
231
|
+
grid-column: 1 / -1;
|
|
144
232
|
justify-content: flex-start;
|
|
145
233
|
}
|
|
146
|
-
}
|
|
147
234
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
) {
|
|
152
|
-
grid-template-columns: minmax(0, 1fr);
|
|
235
|
+
.kui-toolbar[data-responsive="stack"][data-responsive-at="compact"]
|
|
236
|
+
> :is(.kui-toolbar__center, .kui-toolbar__trailing) {
|
|
237
|
+
flex-wrap: wrap;
|
|
153
238
|
}
|
|
239
|
+
}
|
|
154
240
|
|
|
241
|
+
/* Center priority. As with the stacked topology, the toolbar cannot query its
|
|
242
|
+
own width, so these rules style the zones: while the center holds an expanded
|
|
243
|
+
control, the leading and trailing zones leave and the center spans every
|
|
244
|
+
column track (including the gaps the vacated tracks still own), taking the
|
|
245
|
+
whole row. */
|
|
246
|
+
@container kui-toolbar (max-width: 42rem) {
|
|
155
247
|
.kui-toolbar[data-responsive="center-priority"]:has(
|
|
156
248
|
> .kui-toolbar__center [data-expanded="true"]
|
|
157
249
|
)
|
|
158
250
|
> .kui-toolbar__center {
|
|
159
251
|
width: 100%;
|
|
160
|
-
grid-column: 1;
|
|
252
|
+
grid-column: 1 / -1;
|
|
161
253
|
}
|
|
162
254
|
|
|
163
255
|
.kui-toolbar[data-responsive="center-priority"]:has(
|
|
@@ -177,8 +177,8 @@
|
|
|
177
177
|
--wa-form-control-activated-color: var(--wa-color-brand-fill-loud);
|
|
178
178
|
/* Field inset: a 1px border with 8px inside it, the same content-item
|
|
179
179
|
geometry the Kerf primitives use (docs/layout.md). WA's defaults are a
|
|
180
|
-
larger 0.75em/1em pad; this brings every form field onto our 8px rhythm
|
|
181
|
-
|
|
180
|
+
larger 0.75em/1em pad; this brings every form field onto our 8px rhythm.
|
|
181
|
+
The single-line control height is set on the controls below. */
|
|
182
182
|
--wa-form-control-border-width: var(--kui-layout-item-border-width, 1px);
|
|
183
183
|
--wa-form-control-padding-block: var(
|
|
184
184
|
--kui-layout-item-padding,
|
|
@@ -193,6 +193,18 @@
|
|
|
193
193
|
--wa-tooltip-content-color: var(--wa-color-neutral-on-loud);
|
|
194
194
|
--wa-tooltip-arrow-size: 0px;
|
|
195
195
|
--kui-wa-popover-arrow-size: 0px;
|
|
196
|
+
/* Web Awesome's own `ui-monospace, monospace` renders the generic face
|
|
197
|
+
(Courier) in Chromium; use Kerf's named code stack for its components. */
|
|
198
|
+
--wa-font-family-code: var(
|
|
199
|
+
--kui-font-mono,
|
|
200
|
+
ui-monospace,
|
|
201
|
+
SFMono-Regular,
|
|
202
|
+
"SF Mono",
|
|
203
|
+
Menlo,
|
|
204
|
+
Consolas,
|
|
205
|
+
"Liberation Mono",
|
|
206
|
+
monospace
|
|
207
|
+
);
|
|
196
208
|
--kui-wa-carousel-dot-size: 7px;
|
|
197
209
|
--kui-wa-carousel-dot-hit-size: 20px;
|
|
198
210
|
--kui-wa-carousel-control-size: 28px;
|
|
@@ -403,6 +415,17 @@
|
|
|
403
415
|
padding: var(--kui-wa-surface-inset);
|
|
404
416
|
}
|
|
405
417
|
|
|
418
|
+
/* A plain-string `label` renders straight into the title part, so it would
|
|
419
|
+
sit at the bare surface inset while body content (list-inset text, Text)
|
|
420
|
+
starts one bordered item further in. Inset the default title by that item
|
|
421
|
+
step so the header label lines up with the body's text and icons. A
|
|
422
|
+
slotted label element owns its own geometry and is left alone. */
|
|
423
|
+
wa-dialog:not(:has(> [slot="label"]))::part(title) {
|
|
424
|
+
padding-inline: calc(
|
|
425
|
+
var(--kui-layout-item-padding, 0.5rem) + 0.0625rem
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
|
|
406
429
|
wa-dialog::part(body) {
|
|
407
430
|
padding: var(--kui-wa-surface-inset);
|
|
408
431
|
}
|
|
@@ -457,6 +480,29 @@
|
|
|
457
480
|
--arrow-size: var(--kui-wa-popover-arrow-size);
|
|
458
481
|
}
|
|
459
482
|
|
|
483
|
+
/* Default-size single-line controls share Kerf's 44px control height (the
|
|
484
|
+
Select field, toolbar groups, and list rows), so a Web Awesome field,
|
|
485
|
+
button, or button radio sits flush beside a Kerf Select instead of 9px
|
|
486
|
+
shorter. The height is 2.75em of the control's own font size (44px at the
|
|
487
|
+
16px default), so size="large" grows proportionally; size="small" stays
|
|
488
|
+
Web Awesome's deliberately compact secondary control. It is scoped to the
|
|
489
|
+
controls rather than the root because Web Awesome also derives tag, copy
|
|
490
|
+
button, and toast geometry from this token. A ToolbarControlGroup still
|
|
491
|
+
sizes its own nested buttons. */
|
|
492
|
+
:is(
|
|
493
|
+
wa-button,
|
|
494
|
+
wa-color-picker,
|
|
495
|
+
wa-input,
|
|
496
|
+
wa-known-date,
|
|
497
|
+
wa-number-input,
|
|
498
|
+
wa-radio-group,
|
|
499
|
+
wa-select,
|
|
500
|
+
wa-textarea,
|
|
501
|
+
wa-time-input
|
|
502
|
+
):not([size="small"]) {
|
|
503
|
+
--wa-form-control-height: round(2.75em, 1px);
|
|
504
|
+
}
|
|
505
|
+
|
|
460
506
|
/* A form field's top label is inset by the field's own border + inline padding
|
|
461
507
|
(1px + 8px = 9px) so the label text lines up with the value inside the field,
|
|
462
508
|
and it is styled exactly like a ListHeader label: uppercase, xs, quiet. */
|
|
@@ -6,23 +6,56 @@
|
|
|
6
6
|
height: 100%;
|
|
7
7
|
overflow: hidden;
|
|
8
8
|
background: var(--kui-color-surface);
|
|
9
|
+
/* Safe areas: every track paints through the unsafe area it reaches (a rail
|
|
10
|
+
or drawer grows by that inset), and each region's content compensates only
|
|
11
|
+
for the edges the region still touches. An expanded inline rail takes its
|
|
12
|
+
edge away from the center; collapsing it hands the edge back. See pane.css
|
|
13
|
+
for the `--kui-edge-inset-*` edge context. */
|
|
14
|
+
--_kui-workbench-safe-block-start: var(
|
|
15
|
+
--kui-edge-inset-block-start,
|
|
16
|
+
var(--kui-safe-area-block-start, env(safe-area-inset-top, 0px))
|
|
17
|
+
);
|
|
18
|
+
--_kui-workbench-safe-block-end: var(
|
|
19
|
+
--kui-edge-inset-block-end,
|
|
20
|
+
var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
|
|
21
|
+
);
|
|
22
|
+
--_kui-workbench-safe-inline-start: var(
|
|
23
|
+
--kui-edge-inset-inline-start,
|
|
24
|
+
var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
|
|
25
|
+
);
|
|
26
|
+
--_kui-workbench-safe-inline-end: var(
|
|
27
|
+
--kui-edge-inset-inline-end,
|
|
28
|
+
var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
|
|
29
|
+
);
|
|
9
30
|
}
|
|
10
31
|
|
|
11
32
|
/* Side rails. Collapsing snaps the flex track to zero (one reflow) while the
|
|
12
33
|
fixed-width content slides out via transform (composited, clipped) — never a
|
|
13
34
|
per-frame width animation. See docs/18 / the KF-7QKJRK catalog sidebar. */
|
|
14
35
|
.kui-workbench__rail {
|
|
15
|
-
|
|
36
|
+
--kui-edge-inset-block-start: var(--_kui-workbench-safe-block-start);
|
|
37
|
+
--kui-edge-inset-block-end: var(--_kui-workbench-safe-block-end);
|
|
38
|
+
--_kui-workbench-rail-extent: calc(
|
|
39
|
+
var(--kui-workbench-rail-width, 17.5rem) +
|
|
40
|
+
var(--_kui-workbench-rail-safe-inset)
|
|
41
|
+
);
|
|
42
|
+
flex: 0 0 var(--_kui-workbench-rail-extent);
|
|
16
43
|
min-width: 0;
|
|
17
44
|
overflow: hidden;
|
|
18
45
|
background: var(--kui-color-surface);
|
|
19
46
|
}
|
|
20
47
|
|
|
21
48
|
.kui-workbench__rail--left {
|
|
49
|
+
--_kui-workbench-rail-safe-inset: var(--_kui-workbench-safe-inline-start);
|
|
50
|
+
--kui-edge-inset-inline-start: var(--_kui-workbench-safe-inline-start);
|
|
51
|
+
--kui-edge-inset-inline-end: 0px;
|
|
22
52
|
border-inline-end: 1px solid var(--kui-color-border);
|
|
23
53
|
}
|
|
24
54
|
|
|
25
55
|
.kui-workbench__rail--right {
|
|
56
|
+
--_kui-workbench-rail-safe-inset: var(--_kui-workbench-safe-inline-end);
|
|
57
|
+
--kui-edge-inset-inline-start: 0px;
|
|
58
|
+
--kui-edge-inset-inline-end: var(--_kui-workbench-safe-inline-end);
|
|
26
59
|
border-inline-start: 1px solid var(--kui-color-border);
|
|
27
60
|
}
|
|
28
61
|
|
|
@@ -37,6 +70,10 @@
|
|
|
37
70
|
}
|
|
38
71
|
|
|
39
72
|
.kui-workbench__center {
|
|
73
|
+
--kui-edge-inset-block-start: var(--_kui-workbench-safe-block-start);
|
|
74
|
+
--kui-edge-inset-block-end: var(--_kui-workbench-safe-block-end);
|
|
75
|
+
--kui-edge-inset-inline-start: var(--_kui-workbench-safe-inline-start);
|
|
76
|
+
--kui-edge-inset-inline-end: var(--_kui-workbench-safe-inline-end);
|
|
40
77
|
display: flex;
|
|
41
78
|
flex: 1;
|
|
42
79
|
min-width: 0;
|
|
@@ -45,16 +82,111 @@
|
|
|
45
82
|
flex-direction: column;
|
|
46
83
|
}
|
|
47
84
|
|
|
85
|
+
.kui-workbench:has(
|
|
86
|
+
> .kui-workbench__rail--left[data-presentation="inline"]:not(
|
|
87
|
+
[data-collapsed="true"]
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
> .kui-workbench__center {
|
|
91
|
+
--kui-edge-inset-inline-start: 0px;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.kui-workbench:has(
|
|
95
|
+
> .kui-workbench__rail--right[data-presentation="inline"]:not(
|
|
96
|
+
[data-collapsed="true"]
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
> .kui-workbench__center {
|
|
100
|
+
--kui-edge-inset-inline-end: 0px;
|
|
101
|
+
}
|
|
102
|
+
|
|
48
103
|
.kui-workbench__main {
|
|
49
104
|
flex: 1;
|
|
50
105
|
min-height: 0;
|
|
51
106
|
overflow: auto;
|
|
52
107
|
}
|
|
53
108
|
|
|
109
|
+
.kui-workbench__main:has(
|
|
110
|
+
~ .kui-workbench__drawer[data-presentation="inline"]:not(
|
|
111
|
+
[data-collapsed="true"]
|
|
112
|
+
)
|
|
113
|
+
) {
|
|
114
|
+
--kui-edge-inset-block-end: 0px;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* The main area and each panel's content are the consumers: they pad for the
|
|
118
|
+
edges their region still touches, the main area inside its scroller so
|
|
119
|
+
content scrolls under an unsafe edge but can always be scrolled clear. A
|
|
120
|
+
region whose only child is a Pane or layout lets that child own the insets. */
|
|
121
|
+
.kui-workbench__main:not(
|
|
122
|
+
:has(
|
|
123
|
+
> :is(
|
|
124
|
+
[data-component="pane"],
|
|
125
|
+
[data-component="nav-stack"],
|
|
126
|
+
[data-component="split-view"],
|
|
127
|
+
[data-component="workbench"],
|
|
128
|
+
[data-component="tab-scaffold"]
|
|
129
|
+
):only-child
|
|
130
|
+
)
|
|
131
|
+
),
|
|
132
|
+
.kui-workbench__panel-content:not(
|
|
133
|
+
:has(
|
|
134
|
+
> :is(
|
|
135
|
+
[data-component="pane"],
|
|
136
|
+
[data-component="nav-stack"],
|
|
137
|
+
[data-component="split-view"],
|
|
138
|
+
[data-component="workbench"],
|
|
139
|
+
[data-component="tab-scaffold"]
|
|
140
|
+
):only-child
|
|
141
|
+
)
|
|
142
|
+
) {
|
|
143
|
+
padding-block: var(--kui-edge-inset-block-start)
|
|
144
|
+
var(--kui-edge-inset-block-end);
|
|
145
|
+
padding-inline: var(--kui-edge-inset-inline-start)
|
|
146
|
+
var(--kui-edge-inset-inline-end);
|
|
147
|
+
scroll-padding-block: var(--kui-edge-inset-block-start)
|
|
148
|
+
var(--kui-edge-inset-block-end);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.kui-workbench__main:not(
|
|
152
|
+
:has(
|
|
153
|
+
> :is(
|
|
154
|
+
[data-component="pane"],
|
|
155
|
+
[data-component="nav-stack"],
|
|
156
|
+
[data-component="split-view"],
|
|
157
|
+
[data-component="workbench"],
|
|
158
|
+
[data-component="tab-scaffold"]
|
|
159
|
+
):only-child
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
> *,
|
|
163
|
+
.kui-workbench__panel-content:not(
|
|
164
|
+
:has(
|
|
165
|
+
> :is(
|
|
166
|
+
[data-component="pane"],
|
|
167
|
+
[data-component="nav-stack"],
|
|
168
|
+
[data-component="split-view"],
|
|
169
|
+
[data-component="workbench"],
|
|
170
|
+
[data-component="tab-scaffold"]
|
|
171
|
+
):only-child
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
> * {
|
|
175
|
+
--kui-edge-inset-block-start: 0px;
|
|
176
|
+
--kui-edge-inset-block-end: 0px;
|
|
177
|
+
--kui-edge-inset-inline-start: 0px;
|
|
178
|
+
--kui-edge-inset-inline-end: 0px;
|
|
179
|
+
}
|
|
180
|
+
|
|
54
181
|
/* Bottom drawer — the vertical analogue of a rail. */
|
|
55
182
|
.kui-workbench__drawer {
|
|
183
|
+
--kui-edge-inset-block-start: 0px;
|
|
184
|
+
--_kui-workbench-drawer-extent: calc(
|
|
185
|
+
var(--kui-workbench-drawer-height, 13.75rem) +
|
|
186
|
+
var(--_kui-workbench-safe-block-end)
|
|
187
|
+
);
|
|
56
188
|
position: relative;
|
|
57
|
-
flex: 0 0 var(--
|
|
189
|
+
flex: 0 0 var(--_kui-workbench-drawer-extent);
|
|
58
190
|
min-height: 0;
|
|
59
191
|
overflow: hidden;
|
|
60
192
|
border-block-start: 1px solid var(--kui-color-border);
|
|
@@ -80,7 +212,7 @@
|
|
|
80
212
|
/* The fixed-size sliding content. The rail/drawer keeps a definite size on its
|
|
81
213
|
content so the transform reads as a slide, not a squeeze. */
|
|
82
214
|
.kui-workbench__rail .kui-workbench__panel-content {
|
|
83
|
-
width: var(--
|
|
215
|
+
width: var(--_kui-workbench-rail-extent);
|
|
84
216
|
height: 100%;
|
|
85
217
|
transition: transform 200ms ease;
|
|
86
218
|
}
|
|
@@ -90,7 +222,7 @@
|
|
|
90
222
|
inset-inline: 0;
|
|
91
223
|
inset-block-end: 0;
|
|
92
224
|
width: 100%;
|
|
93
|
-
height: var(--
|
|
225
|
+
height: var(--_kui-workbench-drawer-extent);
|
|
94
226
|
transition: transform 200ms ease;
|
|
95
227
|
}
|
|
96
228
|
|