@kerfjs/ui 5.0.0-beta.50 → 5.0.0-beta.52
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 +218 -31
- package/ai/skill.md +27 -24
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +105 -35
- package/dist/app-tab.d.ts +10 -1
- 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-OL4TC3U2.js → chunk-2CE22Q2K.js} +9 -2
- package/dist/chunk-2CE22Q2K.js.map +1 -0
- package/dist/{chunk-SIU2AC5W.js → chunk-2S7OWAEV.js} +3 -3
- package/dist/{chunk-SIU2AC5W.js.map → chunk-2S7OWAEV.js.map} +1 -1
- package/dist/{chunk-2YOUUEWR.js → chunk-3S7OUHUN.js} +4 -4
- package/dist/{chunk-2YOUUEWR.js.map → chunk-3S7OUHUN.js.map} +1 -1
- package/dist/{chunk-2WMSE4MK.js → chunk-4XE2CDYB.js} +2 -2
- package/dist/{chunk-2WMSE4MK.js.map → chunk-4XE2CDYB.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-UMGY5JSP.js → chunk-7XJO4D6A.js} +22 -2
- package/dist/chunk-7XJO4D6A.js.map +1 -0
- package/dist/{chunk-KKNK3JUT.js → chunk-ABAXNUXU.js} +5 -5
- package/dist/chunk-ABAXNUXU.js.map +1 -0
- package/dist/{chunk-AQSKJ6U6.js → chunk-DNCOFEUL.js} +21 -2
- package/dist/chunk-DNCOFEUL.js.map +1 -0
- package/dist/chunk-EKYZCRCX.js +256 -0
- package/dist/chunk-EKYZCRCX.js.map +1 -0
- package/dist/{chunk-COUPLRZG.js → chunk-IR53BQUJ.js} +16 -12
- package/dist/chunk-IR53BQUJ.js.map +1 -0
- package/dist/{chunk-3V75EQIP.js → chunk-JGFZ42ZF.js} +3 -3
- package/dist/{chunk-3V75EQIP.js.map → chunk-JGFZ42ZF.js.map} +1 -1
- package/dist/{chunk-54HM36IQ.js → chunk-KAQUUTZR.js} +4 -2
- package/dist/chunk-KAQUUTZR.js.map +1 -0
- package/dist/{chunk-ZSYLBVWG.js → chunk-LIOXPQ7N.js} +4 -4
- package/dist/chunk-LIOXPQ7N.js.map +1 -0
- package/dist/{chunk-S6ZTTTV7.js → chunk-M6GLI6A6.js} +3 -3
- package/dist/{chunk-S6ZTTTV7.js.map → chunk-M6GLI6A6.js.map} +1 -1
- package/dist/{chunk-OQI7RCRP.js → chunk-MTM43SJO.js} +7 -1
- package/dist/chunk-MTM43SJO.js.map +1 -0
- package/dist/{chunk-5CE64WGC.js → chunk-OSCL5TKR.js} +3 -3
- package/dist/{chunk-5CE64WGC.js.map → chunk-OSCL5TKR.js.map} +1 -1
- package/dist/{chunk-DARTMI5Z.js → chunk-SV22UIW4.js} +2 -2
- package/dist/{chunk-DARTMI5Z.js.map → chunk-SV22UIW4.js.map} +1 -1
- package/dist/{chunk-ELRMBQEC.js → chunk-T7C2VZUB.js} +17 -2
- package/dist/chunk-T7C2VZUB.js.map +1 -0
- package/dist/{chunk-DJKWFYAA.js → chunk-YZV2PTY4.js} +3 -3
- package/dist/{chunk-DJKWFYAA.js.map → chunk-YZV2PTY4.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 +41 -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.d.ts +5 -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/app-tab.css +9 -0
- 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/skeleton.css +4 -1
- 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 +96 -15
- package/dist/wire-sidebar.js.map +1 -1
- package/docs/accessibility.md +49 -9
- package/docs/app-layouts.md +73 -0
- package/docs/catalog.md +23 -2
- package/docs/collapsible-panel.md +83 -9
- package/docs/component-contract.md +36 -12
- 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 +81 -44
- 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 +5 -5
- 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 +189 -159
- package/ux-demo/recipes/compact-toolbar.tsx +48 -35
- package/ux-demo/recipes/composer-form.tsx +87 -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-54HM36IQ.js.map +0 -1
- package/dist/chunk-AQSKJ6U6.js.map +0 -1
- package/dist/chunk-COUPLRZG.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/dist/chunk-ZSYLBVWG.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
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
--kui-resizable-region-separator-color: var(--kui-color-border);
|
|
3
3
|
--kui-resizable-region-handle-color: var(--kui-color-neutral-on-quiet);
|
|
4
4
|
--kui-resizable-region-handle-active-color: var(--kui-color-text-link);
|
|
5
|
+
/* Extra track a horizontal region adds when it reaches an unsafe screen edge,
|
|
6
|
+
so its surface paints through the unsafe area while its committed size
|
|
7
|
+
stays the content width. A composing layout sets it on the region (a
|
|
8
|
+
SplitView list does); it never inherits into a nested region. */
|
|
9
|
+
--kui-resizable-region-edge-extent: 0px;
|
|
5
10
|
position: relative;
|
|
6
11
|
display: flex;
|
|
7
12
|
min-width: 0;
|
|
8
13
|
min-height: 0;
|
|
9
14
|
}
|
|
10
15
|
.kui-resizable-region[data-axis="horizontal"] {
|
|
11
|
-
width:
|
|
16
|
+
width: calc(
|
|
17
|
+
var(--kui-resizable-region-size) + var(--kui-resizable-region-edge-extent)
|
|
18
|
+
);
|
|
12
19
|
height: 100%;
|
|
13
|
-
flex: 0 0
|
|
20
|
+
flex: 0 0
|
|
21
|
+
calc(
|
|
22
|
+
var(--kui-resizable-region-size) + var(--kui-resizable-region-edge-extent)
|
|
23
|
+
);
|
|
14
24
|
}
|
|
15
25
|
.kui-resizable-region[data-axis="vertical"] {
|
|
16
26
|
width: 100%;
|
|
@@ -21,12 +31,25 @@
|
|
|
21
31
|
.kui-resizable-region[data-collapsed="true"] {
|
|
22
32
|
overflow: visible;
|
|
23
33
|
}
|
|
34
|
+
/* The content spans the whole region, like the separator does. A vertical
|
|
35
|
+
stack keeps several children at their natural height, while a lone child —
|
|
36
|
+
typically a Pane or a layout — fills the region, so it owns its scrolling
|
|
37
|
+
and reaches the region's far edge. */
|
|
24
38
|
.kui-resizable-region__content {
|
|
39
|
+
display: flex;
|
|
40
|
+
flex-direction: column;
|
|
25
41
|
width: 100%;
|
|
26
42
|
min-width: 0;
|
|
27
43
|
min-height: 0;
|
|
28
44
|
overflow: hidden;
|
|
29
45
|
}
|
|
46
|
+
.kui-resizable-region[data-axis="vertical"] > .kui-resizable-region__content {
|
|
47
|
+
flex-grow: 1;
|
|
48
|
+
}
|
|
49
|
+
.kui-resizable-region__content > :only-child {
|
|
50
|
+
flex: 1 1 auto;
|
|
51
|
+
min-height: 0;
|
|
52
|
+
}
|
|
30
53
|
.kui-resizable-region[data-content-overflow="auto"]
|
|
31
54
|
> .kui-resizable-region__content {
|
|
32
55
|
overflow: auto;
|
|
@@ -62,8 +85,14 @@
|
|
|
62
85
|
[data-collapse-motion="none"]
|
|
63
86
|
)
|
|
64
87
|
> .kui-resizable-region__content {
|
|
65
|
-
width:
|
|
66
|
-
|
|
88
|
+
width: calc(
|
|
89
|
+
var(--kui-resizable-region-expanded-size) +
|
|
90
|
+
var(--kui-resizable-region-edge-extent)
|
|
91
|
+
);
|
|
92
|
+
min-width: calc(
|
|
93
|
+
var(--kui-resizable-region-expanded-size) +
|
|
94
|
+
var(--kui-resizable-region-edge-extent)
|
|
95
|
+
);
|
|
67
96
|
}
|
|
68
97
|
.kui-resizable-region[data-axis="vertical"][data-collapse-motion]:not(
|
|
69
98
|
[data-collapse-motion="none"]
|
|
@@ -72,6 +101,25 @@
|
|
|
72
101
|
height: var(--kui-resizable-region-expanded-size);
|
|
73
102
|
min-height: var(--kui-resizable-region-expanded-size);
|
|
74
103
|
}
|
|
104
|
+
/* While expanded, the sliding content follows the region's actual track, so a
|
|
105
|
+
region its parent clamps (a max-width, a narrow container) never shows
|
|
106
|
+
content past its separator. The fixed expanded size above only matters once
|
|
107
|
+
the track collapses to zero and the content slides out. */
|
|
108
|
+
.kui-resizable-region[data-axis="horizontal"][data-collapse-motion]:not(
|
|
109
|
+
[data-collapsed="true"]
|
|
110
|
+
)
|
|
111
|
+
> .kui-resizable-region__content {
|
|
112
|
+
width: 100%;
|
|
113
|
+
min-width: 0;
|
|
114
|
+
}
|
|
115
|
+
.kui-resizable-region[data-axis="vertical"][data-collapse-motion]:not(
|
|
116
|
+
[data-collapsed="true"]
|
|
117
|
+
)
|
|
118
|
+
> .kui-resizable-region__content {
|
|
119
|
+
height: auto;
|
|
120
|
+
min-height: 0;
|
|
121
|
+
flex: 1 1 0;
|
|
122
|
+
}
|
|
75
123
|
.kui-resizable-region[data-axis="horizontal"][data-edge="end"][data-collapsed="true"]
|
|
76
124
|
> .kui-resizable-region__content {
|
|
77
125
|
transform: translateX(-100%);
|
|
@@ -259,14 +307,54 @@
|
|
|
259
307
|
.kui-resizable-region__handle {
|
|
260
308
|
top: -10px;
|
|
261
309
|
}
|
|
310
|
+
/* wireResizableRegions sets data-handle-inset when a parent clamps the track
|
|
311
|
+
and the separator has less room past it than the handle's overhang, which
|
|
312
|
+
puts it at the parent's edge. The handle then sits wholly inside the region
|
|
313
|
+
and keeps its separator line on the region's edge, so a clipping ancestor
|
|
314
|
+
never cuts off half of the hit target or its focus ring. */
|
|
315
|
+
.kui-resizable-region[data-handle-inset][data-axis="horizontal"][data-edge="end"]
|
|
316
|
+
> .kui-resizable-region__handle {
|
|
317
|
+
right: 0;
|
|
318
|
+
}
|
|
319
|
+
.kui-resizable-region[data-handle-inset][data-axis="horizontal"][data-edge="end"]
|
|
320
|
+
> .kui-resizable-region__handle::before {
|
|
321
|
+
right: 0;
|
|
322
|
+
}
|
|
323
|
+
.kui-resizable-region[data-handle-inset][data-axis="horizontal"][data-edge="start"]
|
|
324
|
+
> .kui-resizable-region__handle {
|
|
325
|
+
left: 0;
|
|
326
|
+
}
|
|
327
|
+
.kui-resizable-region[data-handle-inset][data-axis="horizontal"][data-edge="start"]
|
|
328
|
+
> .kui-resizable-region__handle::before {
|
|
329
|
+
left: 0;
|
|
330
|
+
}
|
|
331
|
+
.kui-resizable-region[data-handle-inset][data-axis="vertical"][data-edge="end"]
|
|
332
|
+
> .kui-resizable-region__handle {
|
|
333
|
+
bottom: 0;
|
|
334
|
+
}
|
|
335
|
+
.kui-resizable-region[data-handle-inset][data-axis="vertical"][data-edge="end"]
|
|
336
|
+
> .kui-resizable-region__handle::before {
|
|
337
|
+
bottom: 0;
|
|
338
|
+
}
|
|
339
|
+
.kui-resizable-region[data-handle-inset][data-axis="vertical"][data-edge="start"]
|
|
340
|
+
> .kui-resizable-region__handle {
|
|
341
|
+
top: 0;
|
|
342
|
+
}
|
|
343
|
+
.kui-resizable-region[data-handle-inset][data-axis="vertical"][data-edge="start"]
|
|
344
|
+
> .kui-resizable-region__handle::before {
|
|
345
|
+
top: 0;
|
|
346
|
+
}
|
|
262
347
|
.kui-resizable-region__handle:hover,
|
|
263
348
|
.kui-resizable-region__handle:focus-visible {
|
|
264
349
|
color: var(--kui-resizable-region-handle-active-color);
|
|
265
350
|
}
|
|
351
|
+
/* The ring stays wholly inside the handle's box (the focus ring is 3px).
|
|
352
|
+
The handle runs the region's full length, and those ends usually meet a
|
|
353
|
+
clipping ancestor's edge, which would otherwise shave the ring there. */
|
|
266
354
|
.kui-resizable-region__handle:focus-visible {
|
|
267
355
|
border-radius: var(--kui-radius-s);
|
|
268
356
|
outline: var(--kui-focus-ring);
|
|
269
|
-
outline-offset: -
|
|
357
|
+
outline-offset: -3px;
|
|
270
358
|
}
|
|
271
359
|
.kui-resizable-region__handle-icon {
|
|
272
360
|
position: relative;
|
package/dist/styles/row.css
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
.kui-row {
|
|
2
2
|
--kui-row-gap: var(--kui-layout-item-gap, 0.5rem);
|
|
3
|
+
/* Private per-instance values are reset on every Row so a nested Row never
|
|
4
|
+
inherits its ancestor's; the inline style overrides them per prop. */
|
|
5
|
+
--_kui-row-gap: var(--kui-row-gap);
|
|
6
|
+
--_kui-row-flex: 0 1 auto;
|
|
3
7
|
--_kui-row-inset-top: 0;
|
|
4
8
|
--_kui-row-inset-right: 0;
|
|
5
9
|
--_kui-row-inset-bottom: 0;
|
|
@@ -99,3 +103,9 @@
|
|
|
99
103
|
align-items: baseline;
|
|
100
104
|
align-content: baseline;
|
|
101
105
|
}
|
|
106
|
+
|
|
107
|
+
/* `fill`: the layout root of a definite-height parent (an app root or a
|
|
108
|
+
fixed-height frame) takes its full height. Inside a flex layout use `flex`. */
|
|
109
|
+
.kui-row[data-fill="true"] {
|
|
110
|
+
height: 100%;
|
|
111
|
+
}
|
package/dist/styles/select.css
CHANGED
|
@@ -39,13 +39,48 @@
|
|
|
39
39
|
outline: none;
|
|
40
40
|
box-shadow: none;
|
|
41
41
|
}
|
|
42
|
+
/* An icon-only trigger shows the selected icon and the disclosure caret as one
|
|
43
|
+
pill, the same control family as a toolbar popup-menu dropdown (an icon +
|
|
44
|
+
caret wa-button): symmetric 8px inline padding, 12px from the icon to the
|
|
45
|
+
caret's 20px box, the caret glyph size, and the control height, so the icon
|
|
46
|
+
sits left of center to balance the caret. Inside a ToolbarControlGroup the
|
|
47
|
+
trigger takes the group's control-slot height, overlap, and radius
|
|
48
|
+
(`--_kui-toolbar-slot-*`) so it is inset evenly on every side, the group
|
|
49
|
+
sizes to the trigger (wider than tall), and the group-owned focus ring
|
|
50
|
+
stays concentric with it. */
|
|
42
51
|
.kui-select[data-selected-presentation="icon-only"] {
|
|
43
|
-
|
|
52
|
+
--_kui-select-height: 2.75rem;
|
|
53
|
+
width: max-content;
|
|
54
|
+
}
|
|
55
|
+
.kui-select[data-selected-presentation="icon-only"][data-size="compact"] {
|
|
56
|
+
--_kui-select-height: 2rem;
|
|
44
57
|
}
|
|
45
58
|
.kui-select[data-selected-presentation="icon-only"]::part(combobox) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
59
|
+
min-height: var(--_kui-toolbar-slot-height, var(--_kui-select-height));
|
|
60
|
+
padding-inline: 0.5rem;
|
|
61
|
+
border-radius: var(
|
|
62
|
+
--kui-toolbar-item-radius,
|
|
63
|
+
var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
/* Only a lone trigger takes the group's slot overlap and radius; beside
|
|
67
|
+
sibling controls it keeps the group's gap, end insets, and item radius, as
|
|
68
|
+
they do. */
|
|
69
|
+
.kui-select[data-selected-presentation="icon-only"]:only-child {
|
|
70
|
+
margin-inline: calc(var(--_kui-toolbar-slot-overlap, 0px) * -1);
|
|
71
|
+
}
|
|
72
|
+
.kui-select[data-selected-presentation="icon-only"]:only-child::part(combobox) {
|
|
73
|
+
border-radius: var(
|
|
74
|
+
--_kui-toolbar-slot-radius,
|
|
75
|
+
var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
/* The popup-menu wa-button draws the same chevron glyph at 0.875em inside a
|
|
79
|
+
20px box; match its box, spacing, and glyph size rather than the smaller
|
|
80
|
+
form-field disclosure scale. */
|
|
81
|
+
.kui-select[data-selected-presentation="icon-only"]::part(expand-icon) {
|
|
82
|
+
margin-inline-start: 0.75rem;
|
|
83
|
+
transform: scale(0.875);
|
|
49
84
|
}
|
|
50
85
|
.kui-select[data-selected-presentation="icon-only"]::part(display-input) {
|
|
51
86
|
position: absolute;
|
package/dist/styles/skeleton.css
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
width: 100%;
|
|
6
6
|
max-width: 100%;
|
|
7
7
|
height: 1em;
|
|
8
|
-
min-width: 1.5rem;
|
|
9
8
|
border-radius: var(--kui-skeleton-radius);
|
|
10
9
|
/* Deliberately unanimated: a flat, subtle fill that reads as "not yet loaded"
|
|
11
10
|
without drawing the eye or implying progress. */
|
|
@@ -13,6 +12,10 @@
|
|
|
13
12
|
vertical-align: middle;
|
|
14
13
|
}
|
|
15
14
|
|
|
15
|
+
.kui-skeleton[data-block="true"] {
|
|
16
|
+
display: block;
|
|
17
|
+
}
|
|
18
|
+
|
|
16
19
|
.kui-skeleton-lines {
|
|
17
20
|
display: flex;
|
|
18
21
|
width: 100%;
|
|
@@ -5,6 +5,26 @@
|
|
|
5
5
|
height: 100%;
|
|
6
6
|
overflow: hidden;
|
|
7
7
|
background: var(--kui-color-surface);
|
|
8
|
+
/* Safe areas: the list column grows by the inline-start unsafe inset and each
|
|
9
|
+
pane compensates only for the edges it touches — never the shared interior
|
|
10
|
+
edge. The compact form hands the context to its NavStack. See pane.css for
|
|
11
|
+
the `--kui-edge-inset-*` edge context. */
|
|
12
|
+
--_kui-split-view-safe-block-start: var(
|
|
13
|
+
--kui-edge-inset-block-start,
|
|
14
|
+
var(--kui-safe-area-block-start, env(safe-area-inset-top, 0px))
|
|
15
|
+
);
|
|
16
|
+
--_kui-split-view-safe-block-end: var(
|
|
17
|
+
--kui-edge-inset-block-end,
|
|
18
|
+
var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
|
|
19
|
+
);
|
|
20
|
+
--_kui-split-view-safe-inline-start: var(
|
|
21
|
+
--kui-edge-inset-inline-start,
|
|
22
|
+
var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
|
|
23
|
+
);
|
|
24
|
+
--_kui-split-view-safe-inline-end: var(
|
|
25
|
+
--kui-edge-inset-inline-end,
|
|
26
|
+
var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
|
|
27
|
+
);
|
|
8
28
|
}
|
|
9
29
|
|
|
10
30
|
/* The list pane; when not resizable it takes an intrinsic column and the detail
|
|
@@ -13,7 +33,10 @@
|
|
|
13
33
|
min-width: 0;
|
|
14
34
|
min-height: 0;
|
|
15
35
|
flex: 0 0 auto;
|
|
16
|
-
width:
|
|
36
|
+
width: calc(
|
|
37
|
+
var(--kui-split-view-list-width, 20rem) +
|
|
38
|
+
var(--_kui-split-view-safe-inline-start)
|
|
39
|
+
);
|
|
17
40
|
border-inline-end: 1px solid var(--kui-color-border);
|
|
18
41
|
}
|
|
19
42
|
|
|
@@ -28,6 +51,89 @@
|
|
|
28
51
|
min-height: 0;
|
|
29
52
|
}
|
|
30
53
|
|
|
54
|
+
/* A resizable list keeps its committed size as content width; its region's
|
|
55
|
+
track grows by the unsafe inset it reaches. A collapsed region stays shut. */
|
|
56
|
+
.kui-split-view[data-split-mode="split"]
|
|
57
|
+
> [data-component="resizable-region"]:not([data-collapsed="true"]) {
|
|
58
|
+
--kui-resizable-region-edge-extent: var(--_kui-split-view-safe-inline-start);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.kui-split-view__list,
|
|
62
|
+
.kui-split-view__detail {
|
|
63
|
+
--kui-edge-inset-block-start: var(--_kui-split-view-safe-block-start);
|
|
64
|
+
--kui-edge-inset-block-end: var(--_kui-split-view-safe-block-end);
|
|
65
|
+
--kui-edge-inset-inline-start: var(--_kui-split-view-safe-inline-start);
|
|
66
|
+
--kui-edge-inset-inline-end: var(--_kui-split-view-safe-inline-end);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.kui-split-view__list {
|
|
70
|
+
--kui-edge-inset-inline-end: 0px;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.kui-split-view__detail {
|
|
74
|
+
--kui-edge-inset-inline-start: 0px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Each pane pads for the edges it touches unless its only child is a Pane or
|
|
78
|
+
layout, which then owns the insets. */
|
|
79
|
+
.kui-split-view__list:not(
|
|
80
|
+
:has(
|
|
81
|
+
> :is(
|
|
82
|
+
[data-component="pane"],
|
|
83
|
+
[data-component="nav-stack"],
|
|
84
|
+
[data-component="split-view"],
|
|
85
|
+
[data-component="workbench"],
|
|
86
|
+
[data-component="tab-scaffold"]
|
|
87
|
+
):only-child
|
|
88
|
+
)
|
|
89
|
+
),
|
|
90
|
+
.kui-split-view__detail:not(
|
|
91
|
+
:has(
|
|
92
|
+
> :is(
|
|
93
|
+
[data-component="pane"],
|
|
94
|
+
[data-component="nav-stack"],
|
|
95
|
+
[data-component="split-view"],
|
|
96
|
+
[data-component="workbench"],
|
|
97
|
+
[data-component="tab-scaffold"]
|
|
98
|
+
):only-child
|
|
99
|
+
)
|
|
100
|
+
) {
|
|
101
|
+
padding-block: var(--kui-edge-inset-block-start)
|
|
102
|
+
var(--kui-edge-inset-block-end);
|
|
103
|
+
padding-inline: var(--kui-edge-inset-inline-start)
|
|
104
|
+
var(--kui-edge-inset-inline-end);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.kui-split-view__list:not(
|
|
108
|
+
:has(
|
|
109
|
+
> :is(
|
|
110
|
+
[data-component="pane"],
|
|
111
|
+
[data-component="nav-stack"],
|
|
112
|
+
[data-component="split-view"],
|
|
113
|
+
[data-component="workbench"],
|
|
114
|
+
[data-component="tab-scaffold"]
|
|
115
|
+
):only-child
|
|
116
|
+
)
|
|
117
|
+
)
|
|
118
|
+
> *,
|
|
119
|
+
.kui-split-view__detail:not(
|
|
120
|
+
:has(
|
|
121
|
+
> :is(
|
|
122
|
+
[data-component="pane"],
|
|
123
|
+
[data-component="nav-stack"],
|
|
124
|
+
[data-component="split-view"],
|
|
125
|
+
[data-component="workbench"],
|
|
126
|
+
[data-component="tab-scaffold"]
|
|
127
|
+
):only-child
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
> * {
|
|
131
|
+
--kui-edge-inset-block-start: 0px;
|
|
132
|
+
--kui-edge-inset-block-end: 0px;
|
|
133
|
+
--kui-edge-inset-inline-start: 0px;
|
|
134
|
+
--kui-edge-inset-inline-end: 0px;
|
|
135
|
+
}
|
|
136
|
+
|
|
31
137
|
/* Compact mode is a full-bleed NavStack. */
|
|
32
138
|
.kui-split-view--compact {
|
|
33
139
|
display: block;
|
|
@@ -6,9 +6,32 @@
|
|
|
6
6
|
overflow: hidden;
|
|
7
7
|
flex-direction: column;
|
|
8
8
|
background: var(--kui-color-surface);
|
|
9
|
+
/* Safe areas: the scenes and the bar paint through unsafe areas; the bar
|
|
10
|
+
compensates for the bottom and inline edges, and the scenes for the top
|
|
11
|
+
and inline edges (see pane.css for the `--kui-edge-inset-*` context). */
|
|
12
|
+
--_kui-tab-scaffold-safe-block-start: var(
|
|
13
|
+
--kui-edge-inset-block-start,
|
|
14
|
+
var(--kui-safe-area-block-start, env(safe-area-inset-top, 0px))
|
|
15
|
+
);
|
|
16
|
+
--_kui-tab-scaffold-safe-block-end: var(
|
|
17
|
+
--kui-edge-inset-block-end,
|
|
18
|
+
var(--kui-safe-area-block-end, env(safe-area-inset-bottom, 0px))
|
|
19
|
+
);
|
|
20
|
+
--_kui-tab-scaffold-safe-inline-start: var(
|
|
21
|
+
--kui-edge-inset-inline-start,
|
|
22
|
+
var(--kui-safe-area-inline-start, env(safe-area-inset-left, 0px))
|
|
23
|
+
);
|
|
24
|
+
--_kui-tab-scaffold-safe-inline-end: var(
|
|
25
|
+
--kui-edge-inset-inline-end,
|
|
26
|
+
var(--kui-safe-area-inline-end, env(safe-area-inset-right, 0px))
|
|
27
|
+
);
|
|
9
28
|
}
|
|
10
29
|
|
|
11
30
|
.kui-tab-scaffold__scenes {
|
|
31
|
+
--kui-edge-inset-block-start: var(--_kui-tab-scaffold-safe-block-start);
|
|
32
|
+
--kui-edge-inset-block-end: 0px;
|
|
33
|
+
--kui-edge-inset-inline-start: var(--_kui-tab-scaffold-safe-inline-start);
|
|
34
|
+
--kui-edge-inset-inline-end: var(--_kui-tab-scaffold-safe-inline-end);
|
|
12
35
|
position: relative;
|
|
13
36
|
flex: 1;
|
|
14
37
|
min-height: 0;
|
|
@@ -23,6 +46,44 @@
|
|
|
23
46
|
inset: 0;
|
|
24
47
|
}
|
|
25
48
|
|
|
49
|
+
/* A scene is its region's scroll owner, so its top inset is padding inside
|
|
50
|
+
the scroller. A scene whose only child is a Pane or layout (usually a
|
|
51
|
+
NavStack) lets that child own the insets instead. */
|
|
52
|
+
.kui-tab-scaffold__scene:not(
|
|
53
|
+
:has(
|
|
54
|
+
> :is(
|
|
55
|
+
[data-component="pane"],
|
|
56
|
+
[data-component="nav-stack"],
|
|
57
|
+
[data-component="split-view"],
|
|
58
|
+
[data-component="workbench"],
|
|
59
|
+
[data-component="tab-scaffold"]
|
|
60
|
+
):only-child
|
|
61
|
+
)
|
|
62
|
+
) {
|
|
63
|
+
padding-block-start: var(--kui-edge-inset-block-start);
|
|
64
|
+
padding-inline: var(--kui-edge-inset-inline-start)
|
|
65
|
+
var(--kui-edge-inset-inline-end);
|
|
66
|
+
scroll-padding-block-start: var(--kui-edge-inset-block-start);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.kui-tab-scaffold__scene:not(
|
|
70
|
+
:has(
|
|
71
|
+
> :is(
|
|
72
|
+
[data-component="pane"],
|
|
73
|
+
[data-component="nav-stack"],
|
|
74
|
+
[data-component="split-view"],
|
|
75
|
+
[data-component="workbench"],
|
|
76
|
+
[data-component="tab-scaffold"]
|
|
77
|
+
):only-child
|
|
78
|
+
)
|
|
79
|
+
)
|
|
80
|
+
> * {
|
|
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
|
+
|
|
26
87
|
.kui-tab-scaffold__scene[data-active="false"] {
|
|
27
88
|
visibility: hidden;
|
|
28
89
|
}
|
|
@@ -33,8 +94,10 @@
|
|
|
33
94
|
padding-block-start: var(--kui-space-2xs);
|
|
34
95
|
/* Respect the home-indicator safe area on iOS-class devices. */
|
|
35
96
|
padding-block-end: calc(
|
|
36
|
-
var(--kui-space-2xs) +
|
|
97
|
+
var(--kui-space-2xs) + var(--_kui-tab-scaffold-safe-block-end)
|
|
37
98
|
);
|
|
99
|
+
padding-inline: var(--_kui-tab-scaffold-safe-inline-start)
|
|
100
|
+
var(--_kui-tab-scaffold-safe-inline-end);
|
|
38
101
|
border-block-start: 1px solid var(--kui-color-border);
|
|
39
102
|
background: var(--kui-color-surface);
|
|
40
103
|
}
|
package/dist/styles/text.css
CHANGED
|
@@ -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
|
|