@nonoun/native-ui 0.2.8 → 0.2.10
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/dist/components-lean.css +119 -6
- package/dist/components.css +119 -6
- package/dist/{ui-icon-element.js → components.js} +1387 -465
- package/dist/containers/ui-layout-sidebar/ui-layout-sidebar-element.d.ts.map +1 -1
- package/dist/core/trait-runtime.d.ts.map +1 -1
- package/dist/{register-all2.js → core.js} +79 -35
- package/dist/custom-elements.json +2747 -2747
- package/dist/foundation.css +1 -15
- package/dist/inspector/build-inspector.d.ts +8 -0
- package/dist/inspector/build-inspector.d.ts.map +1 -0
- package/dist/inspector/index.d.ts +10 -0
- package/dist/inspector/index.d.ts.map +1 -0
- package/dist/{nav/inspector/ds-color-swatch-element.d.ts → inspector/native-tokens-color-swatch-element.d.ts} +3 -3
- package/dist/inspector/native-tokens-color-swatch-element.d.ts.map +1 -0
- package/dist/inspector/native-tokens-color-swatch.d.ts +3 -0
- package/dist/inspector/native-tokens-color-swatch.d.ts.map +1 -0
- package/dist/{nav/inspector/ds-colors-element.d.ts → inspector/native-tokens-colors-element.d.ts} +4 -4
- package/dist/inspector/native-tokens-colors-element.d.ts.map +1 -0
- package/dist/inspector/native-tokens-colors.d.ts +4 -0
- package/dist/inspector/native-tokens-colors.d.ts.map +1 -0
- package/dist/inspector/native-tokens-inspector-element.d.ts +15 -0
- package/dist/inspector/native-tokens-inspector-element.d.ts.map +1 -0
- package/dist/inspector/native-tokens-inspector.d.ts +3 -0
- package/dist/inspector/native-tokens-inspector.d.ts.map +1 -0
- package/dist/{nav/inspector/ds-themes-element.d.ts → inspector/native-tokens-themes-element.d.ts} +4 -4
- package/dist/inspector/native-tokens-themes-element.d.ts.map +1 -0
- package/dist/inspector/native-tokens-themes.d.ts +4 -0
- package/dist/inspector/native-tokens-themes.d.ts.map +1 -0
- package/dist/{nav/inspector/ds-variable-element.d.ts → inspector/native-tokens-variable-element.d.ts} +4 -4
- package/dist/inspector/native-tokens-variable-element.d.ts.map +1 -0
- package/dist/inspector/native-tokens-variable.d.ts +4 -0
- package/dist/inspector/native-tokens-variable.d.ts.map +1 -0
- package/dist/inspector.css +31 -31
- package/dist/inspector.d.ts +11 -6
- package/dist/inspector.d.ts.map +1 -1
- package/dist/inspector.js +123 -105
- package/dist/kernel.js +77 -77
- package/dist/native-ui-lean.css +120 -21
- package/dist/native-ui.css +120 -21
- package/dist/native-ui.js +4 -49
- package/dist/register-all.js +4 -3
- package/dist/traits/adapters/draggable-adapter.d.ts.map +1 -1
- package/dist/traits/drag-controller.d.ts +3 -0
- package/dist/traits/drag-controller.d.ts.map +1 -1
- package/dist/traits.js +3 -6
- package/dist/ui-icon.js +56 -0
- package/package.json +1 -1
- package/dist/define.js +0 -62
- package/dist/dialog-controller.js +0 -703
- package/dist/nav/inspector/build-inspector.d.ts +0 -8
- package/dist/nav/inspector/build-inspector.d.ts.map +0 -1
- package/dist/nav/inspector/ds-color-swatch-element.d.ts.map +0 -1
- package/dist/nav/inspector/ds-color-swatch.d.ts +0 -3
- package/dist/nav/inspector/ds-color-swatch.d.ts.map +0 -1
- package/dist/nav/inspector/ds-colors-element.d.ts.map +0 -1
- package/dist/nav/inspector/ds-colors.d.ts +0 -4
- package/dist/nav/inspector/ds-colors.d.ts.map +0 -1
- package/dist/nav/inspector/ds-themes-element.d.ts.map +0 -1
- package/dist/nav/inspector/ds-themes.d.ts +0 -4
- package/dist/nav/inspector/ds-themes.d.ts.map +0 -1
- package/dist/nav/inspector/ds-variable-element.d.ts.map +0 -1
- package/dist/nav/inspector/ds-variable.d.ts +0 -4
- package/dist/nav/inspector/ds-variable.d.ts.map +0 -1
- package/dist/nav/inspector/index.d.ts +0 -9
- package/dist/nav/inspector/index.d.ts.map +0 -1
- package/dist/ui-element.js +0 -133
- package/dist/uid.js +0 -87
package/dist/components-lean.css
CHANGED
|
@@ -1136,6 +1136,23 @@
|
|
|
1136
1136
|
cursor: text;
|
|
1137
1137
|
}
|
|
1138
1138
|
|
|
1139
|
+
/* ── Popover Listbox Positioning ──
|
|
1140
|
+
WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
|
|
1141
|
+
for flex-child shrinking) so min-width: anchor-size(inline) wins by
|
|
1142
|
+
source order — both are zero-specificity via :where(). */
|
|
1143
|
+
|
|
1144
|
+
:where(ui-combobox) > :where(ui-listbox[popover]) {
|
|
1145
|
+
position: fixed;
|
|
1146
|
+
position-area: block-end span-inline-end;
|
|
1147
|
+
position-try-fallbacks: flip-block;
|
|
1148
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
1149
|
+
margin-inline: 0;
|
|
1150
|
+
margin-block-start: var(--ui-popover-gap);
|
|
1151
|
+
min-width: anchor-size(inline);
|
|
1152
|
+
max-height: var(--ui-popover-max-height);
|
|
1153
|
+
overflow-y: auto;
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1139
1156
|
}
|
|
1140
1157
|
|
|
1141
1158
|
@layer ui {
|
|
@@ -1796,6 +1813,39 @@
|
|
|
1796
1813
|
display: none;
|
|
1797
1814
|
}
|
|
1798
1815
|
|
|
1816
|
+
/* ── Popover Animation ──
|
|
1817
|
+
WHY: Shared entry/exit transition for all popover listboxes.
|
|
1818
|
+
Context CSS overrides --_popover-origin and --_popover-from
|
|
1819
|
+
to match the popover's anchor direction (e.g. sidebar flyouts
|
|
1820
|
+
open to the right → rotateY instead of rotateX). */
|
|
1821
|
+
|
|
1822
|
+
:where(ui-listbox[popover]) {
|
|
1823
|
+
--_popover-origin: top center;
|
|
1824
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(-20deg);
|
|
1825
|
+
|
|
1826
|
+
transform-origin: var(--_popover-origin);
|
|
1827
|
+
opacity: 0;
|
|
1828
|
+
transform: var(--_popover-from);
|
|
1829
|
+
|
|
1830
|
+
transition:
|
|
1831
|
+
opacity var(--_duration) var(--_easing),
|
|
1832
|
+
transform var(--_duration) var(--_easing),
|
|
1833
|
+
display var(--_duration) var(--_easing) allow-discrete,
|
|
1834
|
+
overlay var(--_duration) var(--_easing) allow-discrete;
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1837
|
+
:where(ui-listbox[popover]):popover-open {
|
|
1838
|
+
opacity: 1;
|
|
1839
|
+
transform: none;
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
@starting-style {
|
|
1843
|
+
:where(ui-listbox[popover]):popover-open {
|
|
1844
|
+
opacity: 0;
|
|
1845
|
+
transform: var(--_popover-from);
|
|
1846
|
+
}
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1799
1849
|
/* ── Option / Command Item Base ── */
|
|
1800
1850
|
|
|
1801
1851
|
:where(ui-option, ui-command-item, [role="option"]) {
|
|
@@ -2176,10 +2226,14 @@
|
|
|
2176
2226
|
instead of expanding the <details>. Same pattern as sidebar-trigger menus. */
|
|
2177
2227
|
|
|
2178
2228
|
:where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
|
|
2229
|
+
--_popover-origin: left center;
|
|
2230
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
|
|
2231
|
+
|
|
2179
2232
|
position: fixed;
|
|
2180
2233
|
position-area: inline-end span-block-end;
|
|
2181
2234
|
position-try-fallbacks: --nav-flyout-flip-up;
|
|
2182
|
-
margin:
|
|
2235
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
2236
|
+
margin-inline: 0;
|
|
2183
2237
|
margin-inline-start: var(--ui-popover-gap);
|
|
2184
2238
|
min-width: 200px;
|
|
2185
2239
|
max-height: var(--ui-popover-max-height);
|
|
@@ -2190,6 +2244,10 @@
|
|
|
2190
2244
|
position-area: inline-end span-block-start;
|
|
2191
2245
|
}
|
|
2192
2246
|
|
|
2247
|
+
@position-try --nav-flyout-flip-down {
|
|
2248
|
+
position-area: inline-end span-block-end;
|
|
2249
|
+
}
|
|
2250
|
+
|
|
2193
2251
|
/* ── Container Query: Collapsed Sidebar ── */
|
|
2194
2252
|
/* WHY: Nav components own their own collapsed behavior via @container.
|
|
2195
2253
|
The sidebar aside declares container-name: sidebar. When it shrinks
|
|
@@ -2233,6 +2291,14 @@
|
|
|
2233
2291
|
font-size: var(--_font-size, 1rem);
|
|
2234
2292
|
}
|
|
2235
2293
|
|
|
2294
|
+
/* WHY: In collapsed mode the group is a small icon — centering
|
|
2295
|
+
the flyout vertically with the anchor is more natural than top-aligning.
|
|
2296
|
+
Fallbacks handle viewport clipping (top/bottom edge). */
|
|
2297
|
+
:where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
|
|
2298
|
+
position-area: inline-end;
|
|
2299
|
+
position-try-fallbacks: --nav-flyout-flip-up, --nav-flyout-flip-down;
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2236
2302
|
/* Collapse inter-group spacing in icon rail. */
|
|
2237
2303
|
:where(ui-nav-group) + :where(ui-nav-group) {
|
|
2238
2304
|
margin-block-start: 0;
|
|
@@ -2466,6 +2532,8 @@
|
|
|
2466
2532
|
min-width: 0;
|
|
2467
2533
|
align-items: center;
|
|
2468
2534
|
position: relative;
|
|
2535
|
+
/* WHY: Isolate internal z-index (thumb z-index: 1) from parent stacking context */
|
|
2536
|
+
isolation: isolate;
|
|
2469
2537
|
|
|
2470
2538
|
min-height: var(--_track-height);
|
|
2471
2539
|
|
|
@@ -2747,6 +2815,23 @@
|
|
|
2747
2815
|
display: contents;
|
|
2748
2816
|
}
|
|
2749
2817
|
|
|
2818
|
+
/* ── Popover Listbox Positioning ──
|
|
2819
|
+
WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
|
|
2820
|
+
for flex-child shrinking) so min-width: anchor-size(inline) wins by
|
|
2821
|
+
source order — both are zero-specificity via :where(). */
|
|
2822
|
+
|
|
2823
|
+
:where(ui-select) > :where(ui-listbox[popover]) {
|
|
2824
|
+
position: fixed;
|
|
2825
|
+
position-area: block-end span-inline-end;
|
|
2826
|
+
position-try-fallbacks: flip-block;
|
|
2827
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
2828
|
+
margin-inline: 0;
|
|
2829
|
+
margin-block-start: var(--ui-popover-gap);
|
|
2830
|
+
min-width: anchor-size(inline);
|
|
2831
|
+
max-height: var(--ui-popover-max-height);
|
|
2832
|
+
overflow-y: auto;
|
|
2833
|
+
}
|
|
2834
|
+
|
|
2750
2835
|
}
|
|
2751
2836
|
|
|
2752
2837
|
@layer ui {
|
|
@@ -3873,7 +3958,7 @@
|
|
|
3873
3958
|
/* Default placement: above the anchor */
|
|
3874
3959
|
position-area: block-start;
|
|
3875
3960
|
position-try-fallbacks: flip-block, flip-inline;
|
|
3876
|
-
margin:
|
|
3961
|
+
margin: var(--ui-popover-viewport-margin);
|
|
3877
3962
|
|
|
3878
3963
|
max-width: var(--ui-tooltip-max-width);
|
|
3879
3964
|
padding-block: calc(var(--_space) * 1.5);
|
|
@@ -3895,8 +3980,12 @@
|
|
|
3895
3980
|
inset: unset;
|
|
3896
3981
|
overflow: visible;
|
|
3897
3982
|
|
|
3983
|
+
--_popover-origin: bottom center;
|
|
3984
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
|
|
3985
|
+
|
|
3986
|
+
transform-origin: var(--_popover-origin);
|
|
3898
3987
|
opacity: 0;
|
|
3899
|
-
transform:
|
|
3988
|
+
transform: var(--_popover-from);
|
|
3900
3989
|
transition:
|
|
3901
3990
|
opacity var(--_duration) var(--_easing),
|
|
3902
3991
|
transform var(--_duration) var(--_easing),
|
|
@@ -3908,35 +3997,43 @@
|
|
|
3908
3997
|
|
|
3909
3998
|
:where(ui-tooltip[popover]):popover-open {
|
|
3910
3999
|
opacity: 1;
|
|
3911
|
-
transform:
|
|
4000
|
+
transform: none;
|
|
3912
4001
|
}
|
|
3913
4002
|
|
|
3914
4003
|
/* Starting style for entry animation */
|
|
3915
4004
|
@starting-style {
|
|
3916
4005
|
:where(ui-tooltip[popover]):popover-open {
|
|
3917
4006
|
opacity: 0;
|
|
3918
|
-
transform:
|
|
4007
|
+
transform: var(--_popover-from);
|
|
3919
4008
|
}
|
|
3920
4009
|
}
|
|
3921
4010
|
|
|
3922
4011
|
/* ── Placement Variants ── */
|
|
3923
4012
|
|
|
3924
4013
|
:where(ui-tooltip[placement="top"]) {
|
|
4014
|
+
--_popover-origin: bottom center;
|
|
4015
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
|
|
3925
4016
|
position-area: block-start;
|
|
3926
4017
|
margin-block-end: calc(var(--_space) * 2);
|
|
3927
4018
|
}
|
|
3928
4019
|
|
|
3929
4020
|
:where(ui-tooltip[placement="bottom"]) {
|
|
4021
|
+
--_popover-origin: top center;
|
|
4022
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(-10deg);
|
|
3930
4023
|
position-area: block-end;
|
|
3931
4024
|
margin-block-start: calc(var(--_space) * 2);
|
|
3932
4025
|
}
|
|
3933
4026
|
|
|
3934
4027
|
:where(ui-tooltip[placement="left"]) {
|
|
4028
|
+
--_popover-origin: right center;
|
|
4029
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(-10deg);
|
|
3935
4030
|
position-area: inline-start;
|
|
3936
4031
|
margin-inline-end: calc(var(--_space) * 2);
|
|
3937
4032
|
}
|
|
3938
4033
|
|
|
3939
4034
|
:where(ui-tooltip[placement="right"]) {
|
|
4035
|
+
--_popover-origin: left center;
|
|
4036
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(10deg);
|
|
3940
4037
|
position-area: inline-end;
|
|
3941
4038
|
margin-inline-start: calc(var(--_space) * 2);
|
|
3942
4039
|
}
|
|
@@ -4925,10 +5022,14 @@
|
|
|
4925
5022
|
Flip: bottom-aligned, grows upward (span-block-start). */
|
|
4926
5023
|
|
|
4927
5024
|
:where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
|
|
5025
|
+
--_popover-origin: left center;
|
|
5026
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
|
|
5027
|
+
|
|
4928
5028
|
position: fixed;
|
|
4929
5029
|
position-area: inline-end span-block-end;
|
|
4930
5030
|
position-try-fallbacks: --sidebar-item-flip-up;
|
|
4931
|
-
margin:
|
|
5031
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
5032
|
+
margin-inline: 0;
|
|
4932
5033
|
margin-inline-start: var(--ui-popover-gap);
|
|
4933
5034
|
min-width: 200px;
|
|
4934
5035
|
max-height: var(--ui-popover-max-height);
|
|
@@ -4939,6 +5040,10 @@
|
|
|
4939
5040
|
position-area: inline-end span-block-start;
|
|
4940
5041
|
}
|
|
4941
5042
|
|
|
5043
|
+
@position-try --sidebar-item-flip-down {
|
|
5044
|
+
position-area: inline-end span-block-end;
|
|
5045
|
+
}
|
|
5046
|
+
|
|
4942
5047
|
/* ── Container Query: Collapsed Sidebar ── */
|
|
4943
5048
|
/* WHY: Each component owns its own collapsed behavior via @container.
|
|
4944
5049
|
The aside is the container (container-name: sidebar). When it shrinks
|
|
@@ -4979,6 +5084,14 @@
|
|
|
4979
5084
|
:where(ui-layout-sidebar-item) > :where(:not([slot="icon"]):not(ui-listbox[popover]):not(.nav-group-flyout)) {
|
|
4980
5085
|
display: none;
|
|
4981
5086
|
}
|
|
5087
|
+
|
|
5088
|
+
/* WHY: In collapsed mode the sidebar item is a small icon — centering
|
|
5089
|
+
the popover vertically with the anchor is more natural than top-aligning.
|
|
5090
|
+
Fallbacks handle viewport clipping (top/bottom edge). */
|
|
5091
|
+
:where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
|
|
5092
|
+
position-area: inline-end;
|
|
5093
|
+
position-try-fallbacks: --sidebar-item-flip-up, --sidebar-item-flip-down;
|
|
5094
|
+
}
|
|
4982
5095
|
}
|
|
4983
5096
|
|
|
4984
5097
|
}
|
package/dist/components.css
CHANGED
|
@@ -1154,6 +1154,23 @@
|
|
|
1154
1154
|
cursor: text;
|
|
1155
1155
|
}
|
|
1156
1156
|
|
|
1157
|
+
/* ── Popover Listbox Positioning ──
|
|
1158
|
+
WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
|
|
1159
|
+
for flex-child shrinking) so min-width: anchor-size(inline) wins by
|
|
1160
|
+
source order — both are zero-specificity via :where(). */
|
|
1161
|
+
|
|
1162
|
+
:where(ui-combobox) > :where(ui-listbox[popover]) {
|
|
1163
|
+
position: fixed;
|
|
1164
|
+
position-area: block-end span-inline-end;
|
|
1165
|
+
position-try-fallbacks: flip-block;
|
|
1166
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
1167
|
+
margin-inline: 0;
|
|
1168
|
+
margin-block-start: var(--ui-popover-gap);
|
|
1169
|
+
min-width: anchor-size(inline);
|
|
1170
|
+
max-height: var(--ui-popover-max-height);
|
|
1171
|
+
overflow-y: auto;
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1157
1174
|
}
|
|
1158
1175
|
|
|
1159
1176
|
@layer ui {
|
|
@@ -1820,6 +1837,39 @@
|
|
|
1820
1837
|
display: none;
|
|
1821
1838
|
}
|
|
1822
1839
|
|
|
1840
|
+
/* ── Popover Animation ──
|
|
1841
|
+
WHY: Shared entry/exit transition for all popover listboxes.
|
|
1842
|
+
Context CSS overrides --_popover-origin and --_popover-from
|
|
1843
|
+
to match the popover's anchor direction (e.g. sidebar flyouts
|
|
1844
|
+
open to the right → rotateY instead of rotateX). */
|
|
1845
|
+
|
|
1846
|
+
:where(ui-listbox[popover]) {
|
|
1847
|
+
--_popover-origin: top center;
|
|
1848
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(-20deg);
|
|
1849
|
+
|
|
1850
|
+
transform-origin: var(--_popover-origin);
|
|
1851
|
+
opacity: 0;
|
|
1852
|
+
transform: var(--_popover-from);
|
|
1853
|
+
|
|
1854
|
+
transition:
|
|
1855
|
+
opacity var(--_duration) var(--_easing),
|
|
1856
|
+
transform var(--_duration) var(--_easing),
|
|
1857
|
+
display var(--_duration) var(--_easing) allow-discrete,
|
|
1858
|
+
overlay var(--_duration) var(--_easing) allow-discrete;
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
:where(ui-listbox[popover]):popover-open {
|
|
1862
|
+
opacity: 1;
|
|
1863
|
+
transform: none;
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
@starting-style {
|
|
1867
|
+
:where(ui-listbox[popover]):popover-open {
|
|
1868
|
+
opacity: 0;
|
|
1869
|
+
transform: var(--_popover-from);
|
|
1870
|
+
}
|
|
1871
|
+
}
|
|
1872
|
+
|
|
1823
1873
|
/* ── Option / Command Item Base ── */
|
|
1824
1874
|
|
|
1825
1875
|
:where(ui-option, ui-command-item, [role="option"]) {
|
|
@@ -2208,10 +2258,14 @@
|
|
|
2208
2258
|
instead of expanding the <details>. Same pattern as sidebar-trigger menus. */
|
|
2209
2259
|
|
|
2210
2260
|
:where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
|
|
2261
|
+
--_popover-origin: left center;
|
|
2262
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
|
|
2263
|
+
|
|
2211
2264
|
position: fixed;
|
|
2212
2265
|
position-area: inline-end span-block-end;
|
|
2213
2266
|
position-try-fallbacks: --nav-flyout-flip-up;
|
|
2214
|
-
margin:
|
|
2267
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
2268
|
+
margin-inline: 0;
|
|
2215
2269
|
margin-inline-start: var(--ui-popover-gap);
|
|
2216
2270
|
min-width: 200px;
|
|
2217
2271
|
max-height: var(--ui-popover-max-height);
|
|
@@ -2222,6 +2276,10 @@
|
|
|
2222
2276
|
position-area: inline-end span-block-start;
|
|
2223
2277
|
}
|
|
2224
2278
|
|
|
2279
|
+
@position-try --nav-flyout-flip-down {
|
|
2280
|
+
position-area: inline-end span-block-end;
|
|
2281
|
+
}
|
|
2282
|
+
|
|
2225
2283
|
/* ── Container Query: Collapsed Sidebar ── */
|
|
2226
2284
|
/* WHY: Nav components own their own collapsed behavior via @container.
|
|
2227
2285
|
The sidebar aside declares container-name: sidebar. When it shrinks
|
|
@@ -2265,6 +2323,14 @@
|
|
|
2265
2323
|
font-size: var(--_font-size, 1rem);
|
|
2266
2324
|
}
|
|
2267
2325
|
|
|
2326
|
+
/* WHY: In collapsed mode the group is a small icon — centering
|
|
2327
|
+
the flyout vertically with the anchor is more natural than top-aligning.
|
|
2328
|
+
Fallbacks handle viewport clipping (top/bottom edge). */
|
|
2329
|
+
:where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
|
|
2330
|
+
position-area: inline-end;
|
|
2331
|
+
position-try-fallbacks: --nav-flyout-flip-up, --nav-flyout-flip-down;
|
|
2332
|
+
}
|
|
2333
|
+
|
|
2268
2334
|
/* Collapse inter-group spacing in icon rail. */
|
|
2269
2335
|
:where(ui-nav-group) + :where(ui-nav-group) {
|
|
2270
2336
|
margin-block-start: 0;
|
|
@@ -2504,6 +2570,8 @@
|
|
|
2504
2570
|
min-width: 0;
|
|
2505
2571
|
align-items: center;
|
|
2506
2572
|
position: relative;
|
|
2573
|
+
/* WHY: Isolate internal z-index (thumb z-index: 1) from parent stacking context */
|
|
2574
|
+
isolation: isolate;
|
|
2507
2575
|
|
|
2508
2576
|
min-height: var(--_track-height);
|
|
2509
2577
|
|
|
@@ -2794,6 +2862,23 @@
|
|
|
2794
2862
|
display: contents;
|
|
2795
2863
|
}
|
|
2796
2864
|
|
|
2865
|
+
/* ── Popover Listbox Positioning ──
|
|
2866
|
+
WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
|
|
2867
|
+
for flex-child shrinking) so min-width: anchor-size(inline) wins by
|
|
2868
|
+
source order — both are zero-specificity via :where(). */
|
|
2869
|
+
|
|
2870
|
+
:where(ui-select) > :where(ui-listbox[popover]) {
|
|
2871
|
+
position: fixed;
|
|
2872
|
+
position-area: block-end span-inline-end;
|
|
2873
|
+
position-try-fallbacks: flip-block;
|
|
2874
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
2875
|
+
margin-inline: 0;
|
|
2876
|
+
margin-block-start: var(--ui-popover-gap);
|
|
2877
|
+
min-width: anchor-size(inline);
|
|
2878
|
+
max-height: var(--ui-popover-max-height);
|
|
2879
|
+
overflow-y: auto;
|
|
2880
|
+
}
|
|
2881
|
+
|
|
2797
2882
|
}
|
|
2798
2883
|
|
|
2799
2884
|
@layer ui {
|
|
@@ -3946,7 +4031,7 @@
|
|
|
3946
4031
|
/* Default placement: above the anchor */
|
|
3947
4032
|
position-area: block-start;
|
|
3948
4033
|
position-try-fallbacks: flip-block, flip-inline;
|
|
3949
|
-
margin:
|
|
4034
|
+
margin: var(--ui-popover-viewport-margin);
|
|
3950
4035
|
|
|
3951
4036
|
max-width: var(--ui-tooltip-max-width);
|
|
3952
4037
|
padding-block: calc(var(--_space) * 1.5);
|
|
@@ -3968,8 +4053,12 @@
|
|
|
3968
4053
|
inset: unset;
|
|
3969
4054
|
overflow: visible;
|
|
3970
4055
|
|
|
4056
|
+
--_popover-origin: bottom center;
|
|
4057
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
|
|
4058
|
+
|
|
4059
|
+
transform-origin: var(--_popover-origin);
|
|
3971
4060
|
opacity: 0;
|
|
3972
|
-
transform:
|
|
4061
|
+
transform: var(--_popover-from);
|
|
3973
4062
|
transition:
|
|
3974
4063
|
opacity var(--_duration) var(--_easing),
|
|
3975
4064
|
transform var(--_duration) var(--_easing),
|
|
@@ -3981,35 +4070,43 @@
|
|
|
3981
4070
|
|
|
3982
4071
|
:where(ui-tooltip[popover]):popover-open {
|
|
3983
4072
|
opacity: 1;
|
|
3984
|
-
transform:
|
|
4073
|
+
transform: none;
|
|
3985
4074
|
}
|
|
3986
4075
|
|
|
3987
4076
|
/* Starting style for entry animation */
|
|
3988
4077
|
@starting-style {
|
|
3989
4078
|
:where(ui-tooltip[popover]):popover-open {
|
|
3990
4079
|
opacity: 0;
|
|
3991
|
-
transform:
|
|
4080
|
+
transform: var(--_popover-from);
|
|
3992
4081
|
}
|
|
3993
4082
|
}
|
|
3994
4083
|
|
|
3995
4084
|
/* ── Placement Variants ── */
|
|
3996
4085
|
|
|
3997
4086
|
:where(ui-tooltip[placement="top"]) {
|
|
4087
|
+
--_popover-origin: bottom center;
|
|
4088
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
|
|
3998
4089
|
position-area: block-start;
|
|
3999
4090
|
margin-block-end: calc(var(--_space) * 2);
|
|
4000
4091
|
}
|
|
4001
4092
|
|
|
4002
4093
|
:where(ui-tooltip[placement="bottom"]) {
|
|
4094
|
+
--_popover-origin: top center;
|
|
4095
|
+
--_popover-from: perspective(800px) scale(0.96) rotateX(-10deg);
|
|
4003
4096
|
position-area: block-end;
|
|
4004
4097
|
margin-block-start: calc(var(--_space) * 2);
|
|
4005
4098
|
}
|
|
4006
4099
|
|
|
4007
4100
|
:where(ui-tooltip[placement="left"]) {
|
|
4101
|
+
--_popover-origin: right center;
|
|
4102
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(-10deg);
|
|
4008
4103
|
position-area: inline-start;
|
|
4009
4104
|
margin-inline-end: calc(var(--_space) * 2);
|
|
4010
4105
|
}
|
|
4011
4106
|
|
|
4012
4107
|
:where(ui-tooltip[placement="right"]) {
|
|
4108
|
+
--_popover-origin: left center;
|
|
4109
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(10deg);
|
|
4013
4110
|
position-area: inline-end;
|
|
4014
4111
|
margin-inline-start: calc(var(--_space) * 2);
|
|
4015
4112
|
}
|
|
@@ -5004,10 +5101,14 @@
|
|
|
5004
5101
|
Flip: bottom-aligned, grows upward (span-block-start). */
|
|
5005
5102
|
|
|
5006
5103
|
:where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
|
|
5104
|
+
--_popover-origin: left center;
|
|
5105
|
+
--_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
|
|
5106
|
+
|
|
5007
5107
|
position: fixed;
|
|
5008
5108
|
position-area: inline-end span-block-end;
|
|
5009
5109
|
position-try-fallbacks: --sidebar-item-flip-up;
|
|
5010
|
-
margin:
|
|
5110
|
+
margin-block: var(--ui-popover-viewport-margin);
|
|
5111
|
+
margin-inline: 0;
|
|
5011
5112
|
margin-inline-start: var(--ui-popover-gap);
|
|
5012
5113
|
min-width: 200px;
|
|
5013
5114
|
max-height: var(--ui-popover-max-height);
|
|
@@ -5018,6 +5119,10 @@
|
|
|
5018
5119
|
position-area: inline-end span-block-start;
|
|
5019
5120
|
}
|
|
5020
5121
|
|
|
5122
|
+
@position-try --sidebar-item-flip-down {
|
|
5123
|
+
position-area: inline-end span-block-end;
|
|
5124
|
+
}
|
|
5125
|
+
|
|
5021
5126
|
/* ── Container Query: Collapsed Sidebar ── */
|
|
5022
5127
|
/* WHY: Each component owns its own collapsed behavior via @container.
|
|
5023
5128
|
The aside is the container (container-name: sidebar). When it shrinks
|
|
@@ -5058,6 +5163,14 @@
|
|
|
5058
5163
|
:where(ui-layout-sidebar-item) > :where(:not([slot="icon"]):not(ui-listbox[popover]):not(.nav-group-flyout)) {
|
|
5059
5164
|
display: none;
|
|
5060
5165
|
}
|
|
5166
|
+
|
|
5167
|
+
/* WHY: In collapsed mode the sidebar item is a small icon — centering
|
|
5168
|
+
the popover vertically with the anchor is more natural than top-aligning.
|
|
5169
|
+
Fallbacks handle viewport clipping (top/bottom edge). */
|
|
5170
|
+
:where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
|
|
5171
|
+
position-area: inline-end;
|
|
5172
|
+
position-try-fallbacks: --sidebar-item-flip-up, --sidebar-item-flip-down;
|
|
5173
|
+
}
|
|
5061
5174
|
}
|
|
5062
5175
|
|
|
5063
5176
|
}
|