@nonoun/native-ui 0.2.8 → 0.2.9

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.
Files changed (62) hide show
  1. package/dist/components-lean.css +119 -6
  2. package/dist/components.css +119 -6
  3. package/dist/containers/ui-layout-sidebar/ui-layout-sidebar-element.d.ts.map +1 -1
  4. package/dist/core/trait-runtime.d.ts.map +1 -1
  5. package/dist/custom-elements.json +1602 -1602
  6. package/dist/dialog-controller.js +38 -350
  7. package/dist/foundation.css +1 -15
  8. package/dist/{nav/inspector → inspector}/build-inspector.d.ts +2 -2
  9. package/dist/inspector/build-inspector.d.ts.map +1 -0
  10. package/dist/{nav/inspector → inspector}/ds-color-swatch-element.d.ts +1 -1
  11. package/dist/inspector/ds-color-swatch-element.d.ts.map +1 -0
  12. package/dist/inspector/ds-color-swatch.d.ts.map +1 -0
  13. package/dist/{nav/inspector → inspector}/ds-colors-element.d.ts +1 -1
  14. package/dist/inspector/ds-colors-element.d.ts.map +1 -0
  15. package/dist/inspector/ds-colors.d.ts.map +1 -0
  16. package/dist/inspector/ds-inspector-element.d.ts +15 -0
  17. package/dist/inspector/ds-inspector-element.d.ts.map +1 -0
  18. package/dist/inspector/ds-inspector.d.ts +3 -0
  19. package/dist/inspector/ds-inspector.d.ts.map +1 -0
  20. package/dist/{nav/inspector → inspector}/ds-themes-element.d.ts +1 -1
  21. package/dist/inspector/ds-themes-element.d.ts.map +1 -0
  22. package/dist/inspector/ds-themes.d.ts.map +1 -0
  23. package/dist/{nav/inspector → inspector}/ds-variable-element.d.ts +1 -1
  24. package/dist/inspector/ds-variable-element.d.ts.map +1 -0
  25. package/dist/inspector/ds-variable.d.ts.map +1 -0
  26. package/dist/{nav/inspector → inspector}/index.d.ts +1 -0
  27. package/dist/inspector/index.d.ts.map +1 -0
  28. package/dist/inspector.css +1 -1
  29. package/dist/inspector.d.ts +10 -6
  30. package/dist/inspector.d.ts.map +1 -1
  31. package/dist/inspector.js +94 -75
  32. package/dist/kernel.js +185 -186
  33. package/dist/list-navigate-controller.js +457 -0
  34. package/dist/native-ui-lean.css +120 -21
  35. package/dist/native-ui.css +120 -21
  36. package/dist/native-ui.js +7 -7
  37. package/dist/register-all.js +4 -3
  38. package/dist/register-all2.js +20 -19
  39. package/dist/traits/adapters/draggable-adapter.d.ts.map +1 -1
  40. package/dist/traits/drag-controller.d.ts +3 -0
  41. package/dist/traits/drag-controller.d.ts.map +1 -1
  42. package/dist/traits.js +5 -6
  43. package/dist/ui-icon-element.js +391 -4153
  44. package/dist/ui-layout-inspector-element.js +3777 -0
  45. package/dist/uid.js +63 -3
  46. package/package.json +1 -1
  47. package/dist/define.js +0 -62
  48. package/dist/nav/inspector/build-inspector.d.ts.map +0 -1
  49. package/dist/nav/inspector/ds-color-swatch-element.d.ts.map +0 -1
  50. package/dist/nav/inspector/ds-color-swatch.d.ts.map +0 -1
  51. package/dist/nav/inspector/ds-colors-element.d.ts.map +0 -1
  52. package/dist/nav/inspector/ds-colors.d.ts.map +0 -1
  53. package/dist/nav/inspector/ds-themes-element.d.ts.map +0 -1
  54. package/dist/nav/inspector/ds-themes.d.ts.map +0 -1
  55. package/dist/nav/inspector/ds-variable-element.d.ts.map +0 -1
  56. package/dist/nav/inspector/ds-variable.d.ts.map +0 -1
  57. package/dist/nav/inspector/index.d.ts.map +0 -1
  58. package/dist/ui-element.js +0 -133
  59. /package/dist/{nav/inspector → inspector}/ds-color-swatch.d.ts +0 -0
  60. /package/dist/{nav/inspector → inspector}/ds-colors.d.ts +0 -0
  61. /package/dist/{nav/inspector → inspector}/ds-themes.d.ts +0 -0
  62. /package/dist/{nav/inspector → inspector}/ds-variable.d.ts +0 -0
@@ -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: 0;
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: 0;
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: scale(0.96);
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: scale(1);
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: scale(0.96);
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: 0;
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
  }
@@ -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: 0;
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: 0;
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: scale(0.96);
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: scale(1);
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: scale(0.96);
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: 0;
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ui-layout-sidebar-element.d.ts","sourceRoot":"","sources":["../../../src/containers/ui-layout-sidebar/ui-layout-sidebar-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD;2EAC2E;AAC3E,qBAAa,eAAgB,SAAQ,SAAS;;IAC5C,MAAM,CAAC,kBAAkB,WAAiB;IAS1C,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASpF,KAAK,IAAI,IAAI;IA+Bb,QAAQ,IAAI,IAAI;CAoGjB"}
1
+ {"version":3,"file":"ui-layout-sidebar-element.d.ts","sourceRoot":"","sources":["../../../src/containers/ui-layout-sidebar/ui-layout-sidebar-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD;2EAC2E;AAC3E,qBAAa,eAAgB,SAAQ,SAAS;;IAC5C,MAAM,CAAC,kBAAkB,WAAiB;IAS1C,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASpF,KAAK,IAAI,IAAI;IAmCb,QAAQ,IAAI,IAAI;CAoGjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"trait-runtime.d.ts","sourceRoot":"","sources":["../../src/core/trait-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,YAAY;;IAmBvB,IAAI,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAO3B,MAAM,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;CAmB9B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAQD,qBAAa,YAAY;;IA0BvB,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM;IAuCvD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAazB,UAAU,IAAI,IAAI;CAKnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAID,wBAAgB,eAAe,IAAI,YAAY,CAS9C"}
1
+ {"version":3,"file":"trait-runtime.d.ts","sourceRoot":"","sources":["../../src/core/trait-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,YAAY;;IAsBvB,IAAI,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAO3B,MAAM,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;CAmB9B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAQD,qBAAa,YAAY;;IA0BvB,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM;IAuCvD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAazB,UAAU,IAAI,IAAI;CAKnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACvC;AAID,wBAAgB,eAAe,IAAI,YAAY,CAS9C"}