@kerfjs/ui 5.0.0-beta.56 → 5.0.0-beta.58
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 +81 -37
- package/ai/application-ui-diagnostic-ids-v1.json +9 -1
- package/ai/application-ui-profile-sync.cjs +1 -1
- package/ai/application-ui-profile.defaults.json +63 -8
- package/ai/application-ui-profile.mjs +1 -1
- package/ai/component-catalog.json +211 -33
- package/ai/component-catalog.schema.json +2 -0
- package/ai/component-class-owners.cjs +83 -0
- package/ai/component-composition-extension.d.ts +7 -0
- package/ai/component-composition-extension.schema.json +7 -0
- package/ai/{component-catalog-v2-overrides.json → component-composition-rules.json} +2 -1
- package/ai/{component-catalog-v2.d.ts → component-composition.d.ts} +9 -5
- package/ai/{component-catalog-v2.json → component-composition.json} +155 -24
- package/ai/{component-catalog-v2.schema.json → component-composition.schema.json} +21 -5
- package/ai/components/README.md +170 -0
- package/ai/components/application-tabs.md +65 -0
- package/ai/components/badge.md +72 -0
- package/ai/components/collapsible-panel.md +102 -0
- package/ai/components/content-item.md +90 -0
- package/ai/components/disclosure-arrow.md +77 -0
- package/ai/components/document-baseline.md +75 -0
- package/ai/components/empty-state.md +80 -0
- package/ai/components/feedback.md +71 -0
- package/ai/components/floating-toolbar.md +80 -0
- package/ai/components/foundation.md +65 -0
- package/ai/components/grid.md +93 -0
- package/ai/components/headers.md +63 -0
- package/ai/components/layout.md +75 -0
- package/ai/components/list-action-row.md +91 -0
- package/ai/components/list-header.md +89 -0
- package/ai/components/list-inset-control.md +74 -0
- package/ai/components/list-inset-text.md +72 -0
- package/ai/components/list-item.md +88 -0
- package/ai/components/list.md +103 -0
- package/ai/components/loading-spinner.md +72 -0
- package/ai/components/lucide-icon.md +66 -0
- package/ai/components/nav-stack.md +103 -0
- package/ai/components/pane.md +100 -0
- package/ai/components/popup-menu.md +82 -0
- package/ai/components/recipe-app-shell.md +57 -0
- package/ai/components/recipe-collapsible-sidebar.md +57 -0
- package/ai/components/recipe-compact-toolbar.md +57 -0
- package/ai/components/recipe-composer-form.md +57 -0
- package/ai/components/recipe-list-detail-dialog.md +57 -0
- package/ai/components/recipe-list-workspace-states.md +57 -0
- package/ai/components/recipe-loading-inspector.md +57 -0
- package/ai/components/recipe-navigation-sidebar.md +57 -0
- package/ai/components/recipe-navigation-stack.md +57 -0
- package/ai/components/recipe-workspace-header.md +57 -0
- package/ai/components/resize.md +101 -0
- package/ai/components/row.md +96 -0
- package/ai/components/segmented-control.md +82 -0
- package/ai/components/select.md +107 -0
- package/ai/components/skeleton.md +84 -0
- package/ai/components/spacer.md +86 -0
- package/ai/components/split-view.md +102 -0
- package/ai/components/state-banner.md +92 -0
- package/ai/components/sunken-panel.md +79 -0
- package/ai/components/surface-scaffold.md +78 -0
- package/ai/components/tab-bar.md +112 -0
- package/ai/components/tab-scaffold.md +94 -0
- package/ai/components/tabs.md +90 -0
- package/ai/components/text.md +82 -0
- package/ai/components/token-search-field.md +101 -0
- package/ai/components/toolbar-control-group.md +102 -0
- package/ai/components/toolbar-text.md +76 -0
- package/ai/components/toolbar.md +95 -0
- package/ai/components/value-table.md +72 -0
- package/ai/components/wa-accordion-item.md +55 -0
- package/ai/components/wa-accordion.md +65 -0
- package/ai/components/wa-animated-image.md +55 -0
- package/ai/components/wa-animation.md +55 -0
- package/ai/components/wa-avatar.md +55 -0
- package/ai/components/wa-badge.md +55 -0
- package/ai/components/wa-breadcrumb-item.md +53 -0
- package/ai/components/wa-breadcrumb.md +55 -0
- package/ai/components/wa-button-group.md +59 -0
- package/ai/components/wa-button.md +55 -0
- package/ai/components/wa-callout.md +58 -0
- package/ai/components/wa-card.md +59 -0
- package/ai/components/wa-carousel-item.md +53 -0
- package/ai/components/wa-carousel.md +55 -0
- package/ai/components/wa-checkbox-group.md +55 -0
- package/ai/components/wa-checkbox.md +55 -0
- package/ai/components/wa-color-picker.md +55 -0
- package/ai/components/wa-comparison.md +55 -0
- package/ai/components/wa-copy-button.md +55 -0
- package/ai/components/wa-details.md +61 -0
- package/ai/components/wa-dialog.md +59 -0
- package/ai/components/wa-divider.md +53 -0
- package/ai/components/wa-drawer.md +55 -0
- package/ai/components/wa-dropdown-item.md +60 -0
- package/ai/components/wa-dropdown.md +60 -0
- package/ai/components/wa-format-bytes.md +53 -0
- package/ai/components/wa-format-date.md +53 -0
- package/ai/components/wa-format-number.md +53 -0
- package/ai/components/wa-icon.md +58 -0
- package/ai/components/wa-include.md +53 -0
- package/ai/components/wa-input.md +59 -0
- package/ai/components/wa-intersection-observer.md +53 -0
- package/ai/components/wa-known-date.md +53 -0
- package/ai/components/wa-markdown.md +53 -0
- package/ai/components/wa-mutation-observer.md +53 -0
- package/ai/components/wa-number-input.md +55 -0
- package/ai/components/wa-option.md +59 -0
- package/ai/components/wa-otp-input.md +53 -0
- package/ai/components/wa-page.md +53 -0
- package/ai/components/wa-pagination.md +55 -0
- package/ai/components/wa-popover.md +55 -0
- package/ai/components/wa-popup.md +53 -0
- package/ai/components/wa-progress-bar.md +53 -0
- package/ai/components/wa-progress-ring.md +53 -0
- package/ai/components/wa-qr-code.md +53 -0
- package/ai/components/wa-radio-group.md +59 -0
- package/ai/components/wa-radio.md +55 -0
- package/ai/components/wa-random-content.md +53 -0
- package/ai/components/wa-rating.md +55 -0
- package/ai/components/wa-relative-time.md +53 -0
- package/ai/components/wa-resize-observer.md +53 -0
- package/ai/components/wa-scroller.md +53 -0
- package/ai/components/wa-select.md +63 -0
- package/ai/components/wa-skeleton.md +53 -0
- package/ai/components/wa-slider.md +55 -0
- package/ai/components/wa-spinner.md +58 -0
- package/ai/components/wa-split-panel.md +58 -0
- package/ai/components/wa-switch.md +53 -0
- package/ai/components/wa-tab-group.md +69 -0
- package/ai/components/wa-tab-panel.md +60 -0
- package/ai/components/wa-tab.md +59 -0
- package/ai/components/wa-tag.md +59 -0
- package/ai/components/wa-textarea.md +53 -0
- package/ai/components/wa-time-input.md +55 -0
- package/ai/components/wa-toast-item.md +60 -0
- package/ai/components/wa-toast.md +60 -0
- package/ai/components/wa-tooltip.md +55 -0
- package/ai/components/wa-tree-item.md +55 -0
- package/ai/components/wa-tree.md +55 -0
- package/ai/components/wa-zoomable-frame.md +55 -0
- package/ai/components/workbench.md +114 -0
- package/ai/public-api-signatures-v1.md +174 -43
- package/ai/skill.md +100 -48
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/component-ownership.d.mts +56 -0
- package/analyzer/component-ownership.mjs +184 -0
- package/analyzer/index.d.mts +3 -0
- package/analyzer/index.mjs +274 -20
- package/analyzer/selectors.d.mts +21 -0
- package/analyzer/selectors.mjs +212 -0
- package/dist/browser/catalog.js +25 -0
- package/dist/browser/collapsible-panel.js +7 -0
- package/dist/browser/nav-stack.js +8 -0
- package/dist/browser/split-view.js +10 -0
- package/dist/browser/tab-scaffold.js +4 -0
- package/dist/browser/workbench.js +10 -0
- package/dist/catalog-resources.d.ts +2 -2
- package/dist/catalog.d.ts +3 -3
- package/dist/catalog.js +8 -7
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-QQOTQTDD.js → chunk-2CCMJTVY.js} +13 -10
- package/dist/chunk-2CCMJTVY.js.map +1 -0
- package/dist/{chunk-PK4N5QTO.js → chunk-553ASUK6.js} +2 -3
- package/dist/chunk-553ASUK6.js.map +1 -0
- package/dist/{chunk-G33XC2NB.js → chunk-6YFHCLHG.js} +2 -2
- package/dist/chunk-6YFHCLHG.js.map +1 -0
- package/dist/{chunk-ZIYOJFZD.js → chunk-7JUBXOIV.js} +17 -4
- package/dist/chunk-7JUBXOIV.js.map +1 -0
- package/dist/{chunk-T4UZTNZ4.js → chunk-EVYKTVBQ.js} +2 -11
- package/dist/chunk-EVYKTVBQ.js.map +1 -0
- package/dist/{chunk-AK67F6QN.js → chunk-EZVNC4J6.js} +4 -1
- package/dist/chunk-EZVNC4J6.js.map +1 -0
- package/dist/{chunk-MA6Z6EIM.js → chunk-F4QMLOXJ.js} +3 -2
- package/dist/chunk-F4QMLOXJ.js.map +1 -0
- package/dist/chunk-JCV4GXWB.js +249 -0
- package/dist/chunk-JCV4GXWB.js.map +1 -0
- package/dist/chunk-K47P7QZC.js +17 -0
- package/dist/chunk-K47P7QZC.js.map +1 -0
- package/dist/{chunk-MOBRFZH3.js → chunk-OUK6QRDR.js} +2 -12
- package/dist/chunk-OUK6QRDR.js.map +1 -0
- package/dist/{chunk-VNPQDCQZ.js → chunk-QOWG4ZCL.js} +3 -2
- package/dist/chunk-QOWG4ZCL.js.map +1 -0
- package/dist/{chunk-V65EOWNF.js → chunk-QPUPLNNB.js} +20 -8
- package/dist/chunk-QPUPLNNB.js.map +1 -0
- package/dist/{chunk-O3EXIBEZ.js → chunk-W4XKTST6.js} +8 -7
- package/dist/chunk-W4XKTST6.js.map +1 -0
- package/dist/{chunk-K6UNVKDK.js → chunk-XDKAYSVD.js} +3 -1
- package/dist/chunk-XDKAYSVD.js.map +1 -0
- package/dist/collapsible-panel.d.ts +9 -9
- package/dist/collapsible-panel.js +2 -2
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +11 -9
- package/dist/list-action-row.js +2 -1
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +2 -1
- package/dist/nav-stack.d.ts +13 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +20 -3
- package/dist/pane.js +1 -1
- package/dist/{panel-toolbar-C8sF-YZC.d.ts → panel-toolbar-DqwtBxQL.d.ts} +13 -13
- package/dist/select.js +1 -1
- package/dist/split-view.d.ts +3 -3
- package/dist/split-view.js +3 -2
- package/dist/split-view.js.map +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/app-tab.css +31 -0
- package/dist/styles/badge.css +19 -11
- package/dist/styles/collapsible-panel.css +13 -9
- package/dist/styles/floating-toolbar.css +25 -6
- package/dist/styles/list-header.css +0 -12
- package/dist/styles/list.css +4 -4
- package/dist/styles/nav-stack.css +46 -19
- package/dist/styles/pane.css +50 -0
- package/dist/styles/popup-menu.css +151 -0
- package/dist/styles/resizable-region.css +22 -10
- package/dist/styles/select.css +28 -14
- package/dist/styles/skeleton.css +30 -3
- package/dist/styles/split-view.css +10 -7
- package/dist/styles/state-banner.css +0 -19
- package/dist/styles/surface-scaffold.css +8 -3
- package/dist/styles/tab-bar.css +79 -28
- package/dist/styles/tab-scaffold.css +25 -1
- package/dist/styles/text.css +16 -0
- package/dist/styles/toolbar-control-group.css +121 -66
- package/dist/styles/toolbar-text.css +21 -0
- package/dist/styles/toolbar.css +8 -32
- package/dist/styles/workbench.css +18 -18
- package/dist/tab-scaffold.d.ts +11 -1
- package/dist/tab-scaffold.js +2 -0
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/toolbar-control-group.d.ts +3 -1
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +7 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +8 -1
- package/dist/toolbar.js +1 -1
- package/dist/{types-DXAGogOS.d.ts → types-BuHELdXR.d.ts} +1 -1
- package/dist/wire-catalog.d.ts +3 -1
- package/dist/wire-catalog.js +2 -0
- package/dist/wire-catalog.js.map +1 -1
- package/dist/wire-scroll-dividers.d.ts +69 -0
- package/dist/wire-scroll-dividers.js +3 -0
- package/dist/wire-scroll-dividers.js.map +1 -0
- package/dist/workbench.d.ts +17 -16
- package/dist/workbench.js +1 -1
- package/docs/app-layouts.md +9 -1
- package/docs/catalog.md +10 -5
- package/docs/collapsible-panel.md +22 -13
- package/docs/component-contract.md +147 -21
- package/docs/component-selection.md +21 -8
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design-philosophy.md +30 -3
- package/docs/examples/application-ui-profile.json +4 -4
- package/docs/examples/{component-catalog-extension-v2.json → component-composition-extension.json} +3 -3
- package/docs/layout.md +82 -3
- package/docs/nav-stack.md +33 -3
- package/docs/split-view.md +10 -5
- package/docs/tab-scaffold.md +23 -1
- package/docs/type-contracts.md +4 -3
- package/docs/ui-analyzer.md +99 -5
- package/docs/ui-doctor.md +10 -0
- package/docs/workbench.md +31 -20
- package/doctor/index.mjs +6 -1
- package/llms.txt +85 -20
- package/package.json +17 -5
- package/ux-demo/recipes/collapsible-sidebar.tsx +0 -1
- package/ux-demo/recipes/composer-form.tsx +0 -1
- package/ux-demo/recipes/list-detail-dialog.tsx +0 -2
- package/ux-demo/recipes/list-workspace-states.tsx +0 -1
- package/ux-demo/recipes/loading-inspector.tsx +0 -1
- package/ux-demo/recipes/workspace-header.tsx +0 -1
- package/ai/component-catalog-extension-v2.d.ts +0 -7
- package/ai/component-catalog-extension-v2.schema.json +0 -7
- package/dist/chunk-AK67F6QN.js.map +0 -1
- package/dist/chunk-G33XC2NB.js.map +0 -1
- package/dist/chunk-K6UNVKDK.js.map +0 -1
- package/dist/chunk-MA6Z6EIM.js.map +0 -1
- package/dist/chunk-MOBRFZH3.js.map +0 -1
- package/dist/chunk-O3EXIBEZ.js.map +0 -1
- package/dist/chunk-PK4N5QTO.js.map +0 -1
- package/dist/chunk-QQOTQTDD.js.map +0 -1
- package/dist/chunk-T4UZTNZ4.js.map +0 -1
- package/dist/chunk-V65EOWNF.js.map +0 -1
- package/dist/chunk-VNPQDCQZ.js.map +0 -1
- package/dist/chunk-ZIYOJFZD.js.map +0 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
.kui-floating-toolbar {
|
|
2
2
|
/* Inset from the container edges: a top toolbar sits 8px in, so this floats an
|
|
3
3
|
extra 8px past that (--kui-space-m = 16px). Override the token to reposition,
|
|
4
|
-
on the toolbar or on an ancestor composition boundary
|
|
5
|
-
corner sets it to 0 because the corner already owns the inset. */
|
|
4
|
+
on the toolbar or on an ancestor composition boundary. */
|
|
6
5
|
--_kui-floating-toolbar-inset: var(
|
|
7
6
|
--kui-floating-toolbar-inset,
|
|
8
7
|
var(--kui-space-m, 1rem)
|
|
@@ -14,16 +13,36 @@
|
|
|
14
13
|
position: absolute;
|
|
15
14
|
z-index: 4;
|
|
16
15
|
/* A layout whose open side overlay covers this toolbar's region (a
|
|
17
|
-
Workbench rail, a CollapsiblePanel, a ResizableRegion)
|
|
18
|
-
and the toolbar hides — out of the tab
|
|
19
|
-
rather than risk painting over the
|
|
20
|
-
|
|
16
|
+
Workbench rail, a CollapsiblePanel, a ResizableRegion) provides its own
|
|
17
|
+
covered context to that region, and the toolbar hides — out of the tab
|
|
18
|
+
order and the accessibility tree — rather than risk painting over the
|
|
19
|
+
overlay. Any enclosing layout's covered context hides it. */
|
|
20
|
+
visibility: var(
|
|
21
|
+
--_kui-workbench-covered,
|
|
22
|
+
var(
|
|
23
|
+
--_kui-collapsible-panel-covered,
|
|
24
|
+
var(--_kui-resizable-region-covered, inherit)
|
|
25
|
+
)
|
|
26
|
+
);
|
|
21
27
|
display: flex;
|
|
22
28
|
color-scheme: dark;
|
|
23
29
|
align-items: center;
|
|
24
30
|
gap: var(--kui-space-xs, 0.5rem);
|
|
25
31
|
}
|
|
26
32
|
|
|
33
|
+
/* In a layout's restore corner the corner already owns the inset, so the
|
|
34
|
+
toolbar floats from the corner itself. Zero specificity: the toolbar's own
|
|
35
|
+
`inset` (or an app rule on the toolbar) still wins, while a token inherited
|
|
36
|
+
from outside the corner does not. */
|
|
37
|
+
:where(
|
|
38
|
+
.kui-workbench__restore,
|
|
39
|
+
.kui-collapsible-panel__restore,
|
|
40
|
+
.kui-resizable-region__restore
|
|
41
|
+
)
|
|
42
|
+
:where(.kui-floating-toolbar) {
|
|
43
|
+
--kui-floating-toolbar-inset: 0px;
|
|
44
|
+
}
|
|
45
|
+
|
|
27
46
|
.kui-floating-toolbar[data-position^="bottom"] {
|
|
28
47
|
inset-block-end: var(--_kui-floating-toolbar-inset);
|
|
29
48
|
}
|
|
@@ -88,18 +88,6 @@
|
|
|
88
88
|
text-align: start;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
.kui-list-header__label {
|
|
92
|
-
min-width: 0;
|
|
93
|
-
margin: 0;
|
|
94
|
-
overflow: hidden;
|
|
95
|
-
font-size: var(--kui-font-xs);
|
|
96
|
-
font-weight: 650;
|
|
97
|
-
letter-spacing: 0.04em;
|
|
98
|
-
text-overflow: ellipsis;
|
|
99
|
-
text-transform: uppercase;
|
|
100
|
-
white-space: nowrap;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
91
|
.kui-list-header__action,
|
|
104
92
|
.kui-list-header__action-layer {
|
|
105
93
|
display: grid;
|
package/dist/styles/list.css
CHANGED
|
@@ -110,19 +110,19 @@
|
|
|
110
110
|
overscroll-behavior-y: contain;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
.kui-list[divider-sides*="t"] {
|
|
113
|
+
.kui-list:is([divider-sides*="t"], [data-scroll-divider*="t"]) {
|
|
114
114
|
--_kui-list-divider-top: var(--kui-list-divider-color);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
.kui-list[divider-sides*="r"] {
|
|
117
|
+
.kui-list:is([divider-sides*="r"], [data-scroll-divider*="r"]) {
|
|
118
118
|
--_kui-list-divider-right: var(--kui-list-divider-color);
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
.kui-list[divider-sides*="b"] {
|
|
121
|
+
.kui-list:is([divider-sides*="b"], [data-scroll-divider*="b"]) {
|
|
122
122
|
--_kui-list-divider-bottom: var(--kui-list-divider-color);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
.kui-list[divider-sides*="l"] {
|
|
125
|
+
.kui-list:is([divider-sides*="l"], [data-scroll-divider*="l"]) {
|
|
126
126
|
--_kui-list-divider-left: var(--kui-list-divider-color);
|
|
127
127
|
}
|
|
128
128
|
|
|
@@ -69,24 +69,6 @@
|
|
|
69
69
|
background: var(--kui-color-surface);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
/* A navigation bar is one control band tall: the toolbar keeps its inline
|
|
73
|
-
padding and any claimed block inset, but drops the block gap so the bar is
|
|
74
|
-
the band height (44px) plus the unsafe inset it clears. */
|
|
75
|
-
.kui-nav-stack__chrome > .kui-nav-stack__toolbar {
|
|
76
|
-
min-height: calc(
|
|
77
|
-
var(--_kui-toolbar-band) + var(--_kui-toolbar-safe-block-start) +
|
|
78
|
-
var(--_kui-toolbar-safe-block-end)
|
|
79
|
-
);
|
|
80
|
-
padding-block: var(--_kui-toolbar-safe-block-start)
|
|
81
|
-
var(--_kui-toolbar-safe-block-end);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/* The title fills the leading zone beside the back control and truncates. */
|
|
85
|
-
.kui-nav-stack__title {
|
|
86
|
-
flex: 1 1 auto;
|
|
87
|
-
min-width: 0;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
72
|
.kui-nav-stack__viewport {
|
|
91
73
|
--kui-edge-inset-block-start: var(--_kui-nav-stack-safe-block-start);
|
|
92
74
|
--kui-edge-inset-block-end: var(--_kui-nav-stack-safe-block-end);
|
|
@@ -179,10 +161,45 @@
|
|
|
179
161
|
padding-block-end: var(--_kui-nav-stack-safe-block-end);
|
|
180
162
|
padding-inline: var(--_kui-nav-stack-safe-inline-start)
|
|
181
163
|
var(--_kui-nav-stack-safe-inline-end);
|
|
182
|
-
border-block-start: 1px solid
|
|
164
|
+
border-block-start: 1px solid
|
|
165
|
+
var(--_kui-nav-stack-bottom-divider, transparent);
|
|
183
166
|
background: var(--kui-color-surface);
|
|
184
167
|
}
|
|
185
168
|
|
|
169
|
+
/* The live chrome is the containing block of its scroll divider; a
|
|
170
|
+
cross-fading copy stays absolutely positioned. */
|
|
171
|
+
.kui-nav-stack__chrome:not(.kui-nav-stack__chrome-copy) {
|
|
172
|
+
position: relative;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* Chrome dividers: with `chromeDividers="scroll"` (the default, no
|
|
176
|
+
attribute) the top chrome draws a line along its bottom edge while the
|
|
177
|
+
active view's content is scrolled beneath it, and the bottom toolbar
|
|
178
|
+
colors its 1px top border while more content lies below it — never when
|
|
179
|
+
the content fits. `wireScrollDividers` reports that state through
|
|
180
|
+
`data-scroll-divider`; `always` draws both lines without it, and `none`
|
|
181
|
+
neither, whatever it reports. The chrome's line is an overlaid 1px pseudo-element
|
|
182
|
+
(whatever the chrome holds never covers it) and the bottom's border is
|
|
183
|
+
always there, so showing either never moves the chrome, the toolbar, or
|
|
184
|
+
the content. A cross-fading chrome copy keeps the line its snapshot had. */
|
|
185
|
+
.kui-nav-stack:not([data-chrome-dividers])
|
|
186
|
+
> .kui-nav-stack__chrome[data-scroll-divider*="b"]::after,
|
|
187
|
+
.kui-nav-stack[data-chrome-dividers="always"] > .kui-nav-stack__chrome::after {
|
|
188
|
+
position: absolute;
|
|
189
|
+
block-size: 1px;
|
|
190
|
+
background: var(--kui-color-neutral-border-normal);
|
|
191
|
+
content: "";
|
|
192
|
+
inset-block-end: 0;
|
|
193
|
+
inset-inline: 0;
|
|
194
|
+
pointer-events: none;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.kui-nav-stack:not([data-chrome-dividers])
|
|
198
|
+
> .kui-nav-stack__bottom[data-scroll-divider*="t"],
|
|
199
|
+
.kui-nav-stack[data-chrome-dividers="always"] > .kui-nav-stack__bottom {
|
|
200
|
+
--_kui-nav-stack-bottom-divider: var(--kui-color-neutral-border-normal);
|
|
201
|
+
}
|
|
202
|
+
|
|
186
203
|
@media (prefers-reduced-motion: reduce) {
|
|
187
204
|
.kui-nav-stack__view,
|
|
188
205
|
.kui-nav-stack__chrome,
|
|
@@ -191,3 +208,13 @@
|
|
|
191
208
|
transition: none;
|
|
192
209
|
}
|
|
193
210
|
}
|
|
211
|
+
|
|
212
|
+
/* As the only child of a Workbench region (its main area or a panel's
|
|
213
|
+
content, which the Workbench marks with `data-workbench-main` /
|
|
214
|
+
`data-workbench-panel-content`), a NavStack fills the region, so a
|
|
215
|
+
composed toolbar's footer (or the app's own) sits at the region's bottom
|
|
216
|
+
edge rather than under short content. */
|
|
217
|
+
:is([data-workbench-main], [data-workbench-panel-content])
|
|
218
|
+
> [data-component="nav-stack"]:only-child {
|
|
219
|
+
height: 100%;
|
|
220
|
+
}
|
package/dist/styles/pane.css
CHANGED
|
@@ -147,6 +147,37 @@
|
|
|
147
147
|
grid-area: footer;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
/* Chrome dividers: one line under the header and one over the footer, where
|
|
151
|
+
the pinned chrome meets the scrolling content, whatever the chrome holds.
|
|
152
|
+
`chromeDividers="scroll"` (the default, no attribute) draws each only while
|
|
153
|
+
`wireScrollDividers` reports content scrolled away beneath it through
|
|
154
|
+
`data-scroll-divider` on the slot; `always` draws both; `none` neither. The
|
|
155
|
+
line is an inset shadow inside the slot, so showing or hiding it never
|
|
156
|
+
moves the chrome or the content. */
|
|
157
|
+
.kui-pane > :is(.kui-pane__header, .kui-pane__toolbar, .kui-pane__footer) {
|
|
158
|
+
--_kui-pane-chrome-divider: transparent;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.kui-pane > :is(.kui-pane__header, .kui-pane__toolbar) {
|
|
162
|
+
box-shadow: inset 0 -1px var(--_kui-pane-chrome-divider);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.kui-pane > .kui-pane__footer {
|
|
166
|
+
box-shadow: inset 0 1px var(--_kui-pane-chrome-divider);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.kui-pane:not([data-chrome-dividers])
|
|
170
|
+
> :is(.kui-pane__header, .kui-pane__toolbar)[data-scroll-divider*="b"],
|
|
171
|
+
.kui-pane:not([data-chrome-dividers])
|
|
172
|
+
> .kui-pane__footer[data-scroll-divider*="t"],
|
|
173
|
+
.kui-pane[data-chrome-dividers="always"]
|
|
174
|
+
> :is(.kui-pane__header, .kui-pane__toolbar, .kui-pane__footer) {
|
|
175
|
+
--_kui-pane-chrome-divider: var(
|
|
176
|
+
--kui-pane-separator-color,
|
|
177
|
+
var(--kui-color-neutral-border-normal)
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
150
181
|
/* `chromePlacement="auto"`: the header and footer stay pinned while the pane
|
|
151
182
|
is tall enough; below 480px of height (30rem, so it scales with the text
|
|
152
183
|
size) the whole pane scrolls as one column instead, so tall chrome can never
|
|
@@ -177,3 +208,22 @@
|
|
|
177
208
|
overflow: visible;
|
|
178
209
|
}
|
|
179
210
|
}
|
|
211
|
+
|
|
212
|
+
/* As the only child of a Workbench region (its main area or a panel's
|
|
213
|
+
content, which the Workbench marks with `data-workbench-main` /
|
|
214
|
+
`data-workbench-panel-content`), a Pane fills the region, so a
|
|
215
|
+
composed toolbar's footer (or the app's own) sits at the region's bottom
|
|
216
|
+
edge rather than under short content. */
|
|
217
|
+
:is([data-workbench-main], [data-workbench-panel-content])
|
|
218
|
+
> [data-component="pane"]:only-child {
|
|
219
|
+
height: 100%;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* As the only child of a NavStack view or a TabScaffold scene, a Pane fills
|
|
223
|
+
it too, so its content owns the scroll and its header and footer stay
|
|
224
|
+
pinned; the view or scene then never scrolls (it hands the Pane its
|
|
225
|
+
safe-area edge context, which the Pane's slots apply). */
|
|
226
|
+
:is(.kui-nav-stack__view, .kui-tab-scaffold__scene)
|
|
227
|
+
> [data-component="pane"]:only-child {
|
|
228
|
+
height: 100%;
|
|
229
|
+
}
|
|
@@ -88,3 +88,154 @@
|
|
|
88
88
|
letter-spacing: 0.04em;
|
|
89
89
|
text-transform: uppercase;
|
|
90
90
|
}
|
|
91
|
+
|
|
92
|
+
/* In a ToolbarControlGroup a PopupMenu sizes itself in the group's context:
|
|
93
|
+
the group lays out its own native and raw Web Awesome children and names a
|
|
94
|
+
PopupMenu only to key its own state on it. The trigger takes the group's
|
|
95
|
+
control height (40px, or 32px in a compact group). A mixed-content trigger
|
|
96
|
+
in a nested-dropdown group grows for its label plus the caret; a fixed 32px
|
|
97
|
+
base would center both outside its host, painting the label across the
|
|
98
|
+
separator and the caret beyond the group border. */
|
|
99
|
+
/* The trigger button takes the group's control metrics, as the group's own
|
|
100
|
+
raw wa-button children do (toolbar-control-group.css excludes this
|
|
101
|
+
trigger). The PopupMenu ancestor sits in `:where()` so each rule keeps the
|
|
102
|
+
specificity of the group's matching raw-child rule and resolves against the
|
|
103
|
+
group's attribute-keyed variants exactly as they do. */
|
|
104
|
+
.kui-toolbar-control-group :where(wa-dropdown.kui-popup-menu) > wa-button {
|
|
105
|
+
--wa-form-control-height: 2.5rem;
|
|
106
|
+
display: inline-flex;
|
|
107
|
+
line-height: 0;
|
|
108
|
+
align-items: center;
|
|
109
|
+
justify-content: center;
|
|
110
|
+
--wa-color-fill-quiet: transparent;
|
|
111
|
+
}
|
|
112
|
+
.kui-toolbar-control-group[data-size="compact"]
|
|
113
|
+
:where(wa-dropdown.kui-popup-menu)
|
|
114
|
+
> wa-button {
|
|
115
|
+
--wa-form-control-height: 2rem;
|
|
116
|
+
}
|
|
117
|
+
.kui-toolbar-control-group[data-content="mixed"]
|
|
118
|
+
:where(wa-dropdown.kui-popup-menu)
|
|
119
|
+
> wa-button {
|
|
120
|
+
line-height: normal;
|
|
121
|
+
}
|
|
122
|
+
.kui-toolbar-control-group
|
|
123
|
+
:where(wa-dropdown.kui-popup-menu)
|
|
124
|
+
> wa-button
|
|
125
|
+
> svg {
|
|
126
|
+
display: block;
|
|
127
|
+
width: 1rem;
|
|
128
|
+
height: 1rem;
|
|
129
|
+
}
|
|
130
|
+
/* Toolbar controls never wrap: a slotted icon and its label share one row. */
|
|
131
|
+
.kui-toolbar-control-group
|
|
132
|
+
:where(wa-dropdown.kui-popup-menu)
|
|
133
|
+
> wa-button::part(label) {
|
|
134
|
+
display: inline-flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
gap: var(--kui-space-xs);
|
|
137
|
+
white-space: nowrap;
|
|
138
|
+
}
|
|
139
|
+
/* At least a circle around an icon-only trigger, with the group's item radius;
|
|
140
|
+
hover lifts the trigger like a group button, except in a `single` group,
|
|
141
|
+
whose whole surface shows the hover (toolbar-control-group.css). */
|
|
142
|
+
.kui-toolbar-control-group
|
|
143
|
+
:where(wa-dropdown.kui-popup-menu)
|
|
144
|
+
> wa-button::part(base) {
|
|
145
|
+
min-width: 2.5rem;
|
|
146
|
+
min-height: 2.5rem;
|
|
147
|
+
box-sizing: border-box;
|
|
148
|
+
border: 1px solid transparent;
|
|
149
|
+
border-radius: var(
|
|
150
|
+
--kui-toolbar-item-radius,
|
|
151
|
+
var(--kui-layout-pill-radius, calc(1px + 1.3125rem))
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
.kui-toolbar-control-group
|
|
155
|
+
:where(wa-dropdown.kui-popup-menu)
|
|
156
|
+
> wa-button:hover::part(base) {
|
|
157
|
+
border-color: var(--kui-toolbar-control-border);
|
|
158
|
+
background-color: var(--kui-toolbar-control-hover-background);
|
|
159
|
+
}
|
|
160
|
+
.kui-toolbar-control-group[data-single="true"]
|
|
161
|
+
:where(wa-dropdown.kui-popup-menu)
|
|
162
|
+
> wa-button:hover::part(base) {
|
|
163
|
+
border-color: transparent;
|
|
164
|
+
background: transparent;
|
|
165
|
+
}
|
|
166
|
+
.kui-toolbar-control-group > wa-dropdown.kui-popup-menu {
|
|
167
|
+
display: inline-flex;
|
|
168
|
+
flex: 0 0 auto;
|
|
169
|
+
}
|
|
170
|
+
.kui-toolbar-control-group > wa-dropdown.kui-popup-menu,
|
|
171
|
+
.kui-toolbar-control-group > wa-dropdown.kui-popup-menu > wa-button,
|
|
172
|
+
.kui-toolbar-control-group
|
|
173
|
+
> wa-dropdown.kui-popup-menu
|
|
174
|
+
> wa-button::part(base) {
|
|
175
|
+
min-width: 2.5rem;
|
|
176
|
+
height: 2.5rem;
|
|
177
|
+
}
|
|
178
|
+
.kui-toolbar-control-group[data-size="compact"] > wa-dropdown.kui-popup-menu,
|
|
179
|
+
.kui-toolbar-control-group[data-size="compact"]
|
|
180
|
+
> wa-dropdown.kui-popup-menu
|
|
181
|
+
> wa-button,
|
|
182
|
+
.kui-toolbar-control-group[data-size="compact"]
|
|
183
|
+
> wa-dropdown.kui-popup-menu
|
|
184
|
+
> wa-button::part(base),
|
|
185
|
+
.kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
|
|
186
|
+
wa-dropdown.kui-popup-menu
|
|
187
|
+
wa-button,
|
|
188
|
+
.kui-toolbar-control-group[data-size="compact"][data-nested-dropdown="true"]
|
|
189
|
+
wa-dropdown.kui-popup-menu
|
|
190
|
+
wa-button::part(base) {
|
|
191
|
+
min-width: 2rem;
|
|
192
|
+
height: 2rem;
|
|
193
|
+
min-height: 2rem;
|
|
194
|
+
}
|
|
195
|
+
.kui-toolbar-control-group[data-size="compact"][data-content="mixed"]
|
|
196
|
+
> wa-dropdown.kui-popup-menu {
|
|
197
|
+
margin: -2px;
|
|
198
|
+
}
|
|
199
|
+
.kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
|
|
200
|
+
> wa-dropdown.kui-popup-menu
|
|
201
|
+
> wa-button,
|
|
202
|
+
.kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
|
|
203
|
+
> wa-dropdown.kui-popup-menu
|
|
204
|
+
> wa-button::part(base) {
|
|
205
|
+
min-width: max-content;
|
|
206
|
+
}
|
|
207
|
+
.kui-toolbar-control-group[data-content="mixed"][data-nested-dropdown="true"]
|
|
208
|
+
> wa-dropdown.kui-popup-menu
|
|
209
|
+
> wa-button::part(base) {
|
|
210
|
+
width: max-content;
|
|
211
|
+
}
|
|
212
|
+
.kui-toolbar-control-group[data-single="true"]
|
|
213
|
+
> wa-dropdown.kui-popup-menu
|
|
214
|
+
> wa-button::part(base) {
|
|
215
|
+
width: max-content;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* The menu insets a composing parent asks for. A PopupMenu applies them to
|
|
219
|
+
itself; its default is the Select listbox inset above, which a
|
|
220
|
+
ToolbarControlGroup's `standard` inset keeps. A PopupSurface's inset follows
|
|
221
|
+
the group's, so a surface wins when both apply. */
|
|
222
|
+
.kui-toolbar-control-group[data-menu-inset="compact"]
|
|
223
|
+
wa-dropdown.kui-popup-menu::part(menu) {
|
|
224
|
+
padding: 0.25rem;
|
|
225
|
+
}
|
|
226
|
+
.kui-toolbar-control-group[data-menu-inset="list-zero"]
|
|
227
|
+
wa-dropdown.kui-popup-menu::part(menu) {
|
|
228
|
+
padding: 0;
|
|
229
|
+
}
|
|
230
|
+
.kui-popup-surface[data-inset="standard"]
|
|
231
|
+
> wa-dropdown.kui-popup-menu::part(menu) {
|
|
232
|
+
padding: var(--kui-wa-surface-inset, 0.5rem);
|
|
233
|
+
}
|
|
234
|
+
.kui-popup-surface[data-inset="compact"]
|
|
235
|
+
> wa-dropdown.kui-popup-menu::part(menu) {
|
|
236
|
+
padding: 0.25rem;
|
|
237
|
+
}
|
|
238
|
+
.kui-popup-surface[data-inset="list-zero"]
|
|
239
|
+
> wa-dropdown.kui-popup-menu::part(menu) {
|
|
240
|
+
padding: 0;
|
|
241
|
+
}
|
|
@@ -6,14 +6,22 @@
|
|
|
6
6
|
--kui-resizable-region-handle-active-color: var(--kui-color-text-link);
|
|
7
7
|
/* Extra track a horizontal region adds when it reaches an unsafe screen edge,
|
|
8
8
|
so its surface paints through the unsafe area while its committed size
|
|
9
|
-
stays the content width.
|
|
10
|
-
|
|
9
|
+
stays the content width. The region sets it itself from the context of a
|
|
10
|
+
layout that places it at an edge (a SplitView list); it never inherits
|
|
11
|
+
into a nested region. */
|
|
11
12
|
--kui-resizable-region-edge-extent: 0px;
|
|
12
13
|
position: relative;
|
|
13
14
|
display: flex;
|
|
14
15
|
min-width: 0;
|
|
15
16
|
min-height: 0;
|
|
16
17
|
}
|
|
18
|
+
/* As a split SplitView's list, the region's track grows by the unsafe
|
|
19
|
+
inline-start inset the SplitView provides, while its committed size stays
|
|
20
|
+
the content width. A collapsed region stays shut. */
|
|
21
|
+
.kui-split-view[data-split-mode="split"]
|
|
22
|
+
> .kui-resizable-region:not([data-collapsed="true"]) {
|
|
23
|
+
--kui-resizable-region-edge-extent: var(--_kui-split-view-safe-inline-start);
|
|
24
|
+
}
|
|
17
25
|
.kui-resizable-region[data-axis="horizontal"] {
|
|
18
26
|
width: calc(
|
|
19
27
|
var(--kui-resizable-region-size) + var(--kui-resizable-region-edge-extent)
|
|
@@ -218,8 +226,9 @@
|
|
|
218
226
|
hidden, not merely stacked beneath it: they never paint over the overlay
|
|
219
227
|
whatever stacking context an app puts them in, and hidden they leave the
|
|
220
228
|
tab order and the accessibility tree. They come back as the overlay
|
|
221
|
-
closes. The
|
|
222
|
-
|
|
229
|
+
closes. The ResizableRegion's own covered context,
|
|
230
|
+
`--_kui-resizable-region-covered`, is read by FloatingToolbar and the
|
|
231
|
+
layouts' restore corners. It is set on the overlay's container and cleared again on the
|
|
223
232
|
overlay regions in it, so it reaches the overlay's siblings only. It is
|
|
224
233
|
never set by a universal selector below the :has() container (`:has(…) >
|
|
225
234
|
:not(…)`): Chromium then restyles every child of every ancestor of a DOM
|
|
@@ -231,7 +240,7 @@
|
|
|
231
240
|
)
|
|
232
241
|
)
|
|
233
242
|
) {
|
|
234
|
-
--_kui-
|
|
243
|
+
--_kui-resizable-region-covered: hidden;
|
|
235
244
|
}
|
|
236
245
|
:where(
|
|
237
246
|
:has(
|
|
@@ -241,7 +250,7 @@
|
|
|
241
250
|
)
|
|
242
251
|
)
|
|
243
252
|
> .kui-resizable-region[data-presentation="overlay"] {
|
|
244
|
-
--_kui-
|
|
253
|
+
--_kui-resizable-region-covered: initial;
|
|
245
254
|
}
|
|
246
255
|
|
|
247
256
|
@container (max-width: 44rem) {
|
|
@@ -311,12 +320,15 @@
|
|
|
311
320
|
--kui-resizable-region-restore-inset,
|
|
312
321
|
1rem
|
|
313
322
|
);
|
|
314
|
-
/* The corner owns the inset, so a FloatingToolbar composed here floats
|
|
315
|
-
from this point instead of adding its own inset on top. */
|
|
316
|
-
--kui-floating-toolbar-inset: 0px;
|
|
317
323
|
position: absolute;
|
|
318
324
|
/* Hidden while an open side overlay covers the content (see above). */
|
|
319
|
-
visibility: var(
|
|
325
|
+
visibility: var(
|
|
326
|
+
--_kui-workbench-covered,
|
|
327
|
+
var(
|
|
328
|
+
--_kui-collapsible-panel-covered,
|
|
329
|
+
var(--_kui-resizable-region-covered, inherit)
|
|
330
|
+
)
|
|
331
|
+
);
|
|
320
332
|
z-index: var(
|
|
321
333
|
--kui-resizable-region-restore-z,
|
|
322
334
|
calc(var(--kui-resizable-region-overlay-z, 41) - 2)
|
package/dist/styles/select.css
CHANGED
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
caret wa-button): symmetric 8px inline padding, 12px from the icon to the
|
|
50
50
|
caret's 20px box, the caret glyph size, and the control height, so the icon
|
|
51
51
|
sits left of center to balance the caret. Inside a ToolbarControlGroup the
|
|
52
|
-
trigger takes the
|
|
53
|
-
(`--_kui-toolbar-slot-*`) so it is inset evenly on
|
|
54
|
-
sizes to the trigger (wider than tall), and the
|
|
55
|
-
stays concentric with it. */
|
|
52
|
+
trigger takes the control-slot height, overlap, and radius the group
|
|
53
|
+
provides (`--_kui-toolbar-control-group-slot-*`) so it is inset evenly on
|
|
54
|
+
every side, the group sizes to the trigger (wider than tall), and the
|
|
55
|
+
group-owned focus ring stays concentric with it. */
|
|
56
56
|
.kui-select[data-selected-presentation="icon-only"] {
|
|
57
57
|
--_kui-select-height: 2.75rem;
|
|
58
58
|
width: max-content;
|
|
@@ -61,7 +61,10 @@
|
|
|
61
61
|
--_kui-select-height: 2rem;
|
|
62
62
|
}
|
|
63
63
|
.kui-select[data-selected-presentation="icon-only"]::part(combobox) {
|
|
64
|
-
min-height: var(
|
|
64
|
+
min-height: var(
|
|
65
|
+
--_kui-toolbar-control-group-slot-height,
|
|
66
|
+
var(--_kui-select-height)
|
|
67
|
+
);
|
|
65
68
|
padding-inline: 0.5rem;
|
|
66
69
|
border-radius: var(
|
|
67
70
|
--kui-toolbar-item-radius,
|
|
@@ -72,14 +75,32 @@
|
|
|
72
75
|
sibling controls it keeps the group's gap, end insets, and item radius, as
|
|
73
76
|
they do. */
|
|
74
77
|
.kui-select[data-selected-presentation="icon-only"]:only-child {
|
|
75
|
-
margin-inline: calc(var(--_kui-toolbar-slot-overlap, 0px) * -1);
|
|
78
|
+
margin-inline: calc(var(--_kui-toolbar-control-group-slot-overlap, 0px) * -1);
|
|
76
79
|
}
|
|
77
80
|
.kui-select[data-selected-presentation="icon-only"]:only-child::part(combobox) {
|
|
78
81
|
border-radius: var(
|
|
79
|
-
--_kui-toolbar-slot-radius,
|
|
82
|
+
--_kui-toolbar-control-group-slot-radius,
|
|
80
83
|
var(--kui-layout-rounded-radius, calc(1px + 0.6875rem))
|
|
81
84
|
);
|
|
82
85
|
}
|
|
86
|
+
/* In a ToolbarControlGroup, a Select beside other controls highlights its own
|
|
87
|
+
pill on hover, like its button and dropdown siblings; a lone Select instead
|
|
88
|
+
lifts the whole group (toolbar-control-group.css). */
|
|
89
|
+
.kui-toolbar-control-group:not([data-single="true"])
|
|
90
|
+
> .kui-select:not(:only-child):hover::part(combobox) {
|
|
91
|
+
border-color: var(--kui-toolbar-control-border);
|
|
92
|
+
background: var(--kui-toolbar-control-hover-background);
|
|
93
|
+
}
|
|
94
|
+
/* With the group's per-control rings, a composed Select paints its own ring
|
|
95
|
+
even when it was told the group owns it: nothing else would show focus. It
|
|
96
|
+
matches the sibling controls' ring and offset. While its listbox is open the
|
|
97
|
+
popup shows focus instead, so the trigger ring stays off, as a PopupMenu
|
|
98
|
+
trigger's does. */
|
|
99
|
+
.kui-toolbar-control-group[data-focus-ring="control"]
|
|
100
|
+
> .kui-select:not([open]):focus-within::part(combobox) {
|
|
101
|
+
outline: var(--kui-focus-ring);
|
|
102
|
+
outline-offset: 1px;
|
|
103
|
+
}
|
|
83
104
|
/* The popup-menu wa-button draws the same chevron glyph at 0.875em inside a
|
|
84
105
|
20px box; match its box, spacing, and glyph size rather than the smaller
|
|
85
106
|
form-field disclosure scale. */
|
|
@@ -99,13 +120,6 @@
|
|
|
99
120
|
.kui-select__icon[slot="start"] {
|
|
100
121
|
margin-inline-end: 0 !important;
|
|
101
122
|
}
|
|
102
|
-
/* A multiple icon-only trigger: its fixed icon, then a count badge while any
|
|
103
|
-
choice is chosen, 4px from the icon (the caret keeps its 12px after it).
|
|
104
|
-
The summary that ends its label (and accessible name) stays inline text, so
|
|
105
|
-
a visible label reads "Labels: Bug, Docs" in place of the hidden value. */
|
|
106
|
-
.kui-select__count {
|
|
107
|
-
margin-inline-start: 0.25rem;
|
|
108
|
-
}
|
|
109
123
|
.kui-select::part(start),
|
|
110
124
|
.kui-select::part(end),
|
|
111
125
|
.kui-select::part(expand-icon) {
|
package/dist/styles/skeleton.css
CHANGED
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
height: 1em;
|
|
8
8
|
border-radius: var(--kui-skeleton-radius);
|
|
9
9
|
/* Deliberately unanimated: a flat, subtle fill that reads as "not yet loaded"
|
|
10
|
-
without drawing the eye or implying progress.
|
|
11
|
-
fill (a solid Badge)
|
|
12
|
-
foreground, since a text-color tint vanishes on a
|
|
10
|
+
without drawing the eye or implying progress. On a host with its own
|
|
11
|
+
solid fill (a solid Badge) the skeleton derives `--_kui-skeleton-fill`
|
|
12
|
+
from the host's foreground, since a text-color tint vanishes on a
|
|
13
|
+
saturated fill. */
|
|
13
14
|
background: var(
|
|
14
15
|
--_kui-skeleton-fill,
|
|
15
16
|
color-mix(in srgb, var(--kui-color-text) 12%, transparent)
|
|
@@ -17,6 +18,19 @@
|
|
|
17
18
|
vertical-align: middle;
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
/* A placeholder's skeleton inside a solid badge: the generic text-color tint is
|
|
22
|
+
nearly invisible on the saturated fill, so derive it from the on-solid
|
|
23
|
+
foreground the badge provides, which contrasts with the fill in every tone
|
|
24
|
+
and color scheme. Quiet and outline badges sit on a pale fill and keep the
|
|
25
|
+
generic tint. */
|
|
26
|
+
.kui-badge[data-appearance="solid"] .kui-skeleton {
|
|
27
|
+
--_kui-skeleton-fill: color-mix(
|
|
28
|
+
in srgb,
|
|
29
|
+
var(--_kui-badge-on-solid) 45%,
|
|
30
|
+
transparent
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
20
34
|
.kui-skeleton[data-block="true"] {
|
|
21
35
|
display: block;
|
|
22
36
|
}
|
|
@@ -63,3 +77,16 @@
|
|
|
63
77
|
background: GrayText;
|
|
64
78
|
}
|
|
65
79
|
}
|
|
80
|
+
|
|
81
|
+
/* A placeholder StateBanner's badge holds this skeleton instead of text. With
|
|
82
|
+
no text, the skeleton's baseline would be synthesized from its bottom edge,
|
|
83
|
+
sitting the badge higher than the live one by a font-dependent amount. A
|
|
84
|
+
zero-width character gives it a text baseline in the badge's own font and
|
|
85
|
+
line height, exactly where the live badge's text baseline falls on every
|
|
86
|
+
platform. */
|
|
87
|
+
.kui-state-banner[data-placeholder="true"]
|
|
88
|
+
.kui-state-banner__copy
|
|
89
|
+
> .kui-badge
|
|
90
|
+
> .kui-skeleton::before {
|
|
91
|
+
content: "\200b";
|
|
92
|
+
}
|
|
@@ -51,13 +51,6 @@
|
|
|
51
51
|
min-height: 0;
|
|
52
52
|
}
|
|
53
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
54
|
.kui-split-view__list,
|
|
62
55
|
.kui-split-view__detail {
|
|
63
56
|
--kui-edge-inset-block-start: var(--_kui-split-view-safe-block-start);
|
|
@@ -135,3 +128,13 @@
|
|
|
135
128
|
display: block;
|
|
136
129
|
height: 100%;
|
|
137
130
|
}
|
|
131
|
+
|
|
132
|
+
/* As the only child of a Workbench region (its main area or a panel's
|
|
133
|
+
content, which the Workbench marks with `data-workbench-main` /
|
|
134
|
+
`data-workbench-panel-content`), a SplitView fills the region, so a
|
|
135
|
+
composed toolbar's footer (or the app's own) sits at the region's bottom
|
|
136
|
+
edge rather than under short content. */
|
|
137
|
+
:is([data-workbench-main], [data-workbench-panel-content])
|
|
138
|
+
> [data-component="split-view"]:only-child {
|
|
139
|
+
height: 100%;
|
|
140
|
+
}
|
|
@@ -160,25 +160,6 @@
|
|
|
160
160
|
margin-inline-end: var(--kui-layout-item-gap, 0.5rem);
|
|
161
161
|
font-size: var(--kui-font-xs);
|
|
162
162
|
}
|
|
163
|
-
/* The badge is taller than the title's line. Negative block margins keep it
|
|
164
|
-
out of the line-height calculation, so a wrapped title's lines stay evenly
|
|
165
|
-
spaced whichever line the badge lands on. */
|
|
166
|
-
.kui-state-banner__badge {
|
|
167
|
-
margin-block: -0.5em;
|
|
168
|
-
margin-inline-end: var(--kui-layout-item-gap, 0.5rem);
|
|
169
|
-
vertical-align: baseline;
|
|
170
|
-
}
|
|
171
|
-
/* A placeholder badge holds a skeleton instead of text. With no text, the
|
|
172
|
-
skeleton's baseline would be synthesized from its bottom edge, sitting the
|
|
173
|
-
badge higher than the live one by a font-dependent amount. A zero-width
|
|
174
|
-
character gives it a text baseline in the badge's own font and line
|
|
175
|
-
height, exactly where the live badge's text baseline falls on every
|
|
176
|
-
platform. */
|
|
177
|
-
.kui-state-banner[data-placeholder="true"]
|
|
178
|
-
.kui-state-banner__badge
|
|
179
|
-
> *::before {
|
|
180
|
-
content: "\200b";
|
|
181
|
-
}
|
|
182
163
|
/* The clip lives on an inner span, not on the detail itself. WebKit still
|
|
183
164
|
applies the CSS 2.1 rule that an inline-block whose overflow is not
|
|
184
165
|
`visible` takes its baseline from its bottom margin edge, so a clipped
|
|
@@ -40,12 +40,17 @@
|
|
|
40
40
|
.kui-popup-surface {
|
|
41
41
|
display: inline-flex;
|
|
42
42
|
}
|
|
43
|
-
|
|
43
|
+
/* The surface insets the menu of a raw wa-dropdown it wraps. A PopupMenu
|
|
44
|
+
applies the surface's inset to itself (popup-menu.css). */
|
|
45
|
+
.kui-popup-surface[data-inset="standard"]
|
|
46
|
+
> wa-dropdown:not(.kui-popup-menu)::part(menu) {
|
|
44
47
|
padding: var(--kui-wa-surface-inset, 0.5rem);
|
|
45
48
|
}
|
|
46
|
-
.kui-popup-surface[data-inset="compact"]
|
|
49
|
+
.kui-popup-surface[data-inset="compact"]
|
|
50
|
+
> wa-dropdown:not(.kui-popup-menu)::part(menu) {
|
|
47
51
|
padding: 0.25rem;
|
|
48
52
|
}
|
|
49
|
-
.kui-popup-surface[data-inset="list-zero"]
|
|
53
|
+
.kui-popup-surface[data-inset="list-zero"]
|
|
54
|
+
> wa-dropdown:not(.kui-popup-menu)::part(menu) {
|
|
50
55
|
padding: 0;
|
|
51
56
|
}
|