@nonoun/native-ui 0.2.7 → 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 (153) hide show
  1. package/dist/components/ui-accordion/ui-accordion-element.d.ts.map +1 -1
  2. package/dist/components/ui-avatar/ui-avatar-element.d.ts +2 -0
  3. package/dist/components/ui-avatar/ui-avatar-element.d.ts.map +1 -1
  4. package/dist/components/ui-calendar/calendar-store.d.ts.map +1 -1
  5. package/dist/components/ui-calendar/ui-calendar-element.d.ts +1 -0
  6. package/dist/components/ui-calendar/ui-calendar-element.d.ts.map +1 -1
  7. package/dist/components/ui-chat/ui-chat-input-element.d.ts.map +1 -1
  8. package/dist/components/ui-checkbox/ui-checkbox-element.d.ts +1 -0
  9. package/dist/components/ui-checkbox/ui-checkbox-element.d.ts.map +1 -1
  10. package/dist/components/ui-combobox/ui-combobox-element.d.ts +1 -0
  11. package/dist/components/ui-combobox/ui-combobox-element.d.ts.map +1 -1
  12. package/dist/components/ui-command/ui-command-element.d.ts.map +1 -1
  13. package/dist/components/ui-command/ui-command-group-element.d.ts +1 -0
  14. package/dist/components/ui-command/ui-command-group-element.d.ts.map +1 -1
  15. package/dist/components/ui-controller/ui-controller-element.d.ts +1 -0
  16. package/dist/components/ui-controller/ui-controller-element.d.ts.map +1 -1
  17. package/dist/components/ui-dialog/ui-dialog-element.d.ts +0 -1
  18. package/dist/components/ui-dialog/ui-dialog-element.d.ts.map +1 -1
  19. package/dist/components/ui-drawer/ui-drawer-element.d.ts +0 -1
  20. package/dist/components/ui-drawer/ui-drawer-element.d.ts.map +1 -1
  21. package/dist/components/ui-field/ui-field-element.d.ts.map +1 -1
  22. package/dist/components/ui-input/ui-input-element.d.ts +1 -0
  23. package/dist/components/ui-input/ui-input-element.d.ts.map +1 -1
  24. package/dist/components/ui-input-otp/ui-input-otp-element.d.ts +1 -0
  25. package/dist/components/ui-input-otp/ui-input-otp-element.d.ts.map +1 -1
  26. package/dist/components/ui-listbox/ui-listbox-element.d.ts.map +1 -1
  27. package/dist/components/ui-nav/ui-nav-group-element.d.ts +1 -1
  28. package/dist/components/ui-pagination/ui-pagination-element.d.ts.map +1 -1
  29. package/dist/components/ui-radio/ui-radio-element.d.ts.map +1 -1
  30. package/dist/components/ui-radio/ui-radio-group-element.d.ts +1 -0
  31. package/dist/components/ui-radio/ui-radio-group-element.d.ts.map +1 -1
  32. package/dist/components/ui-range/ui-range-element.d.ts +4 -0
  33. package/dist/components/ui-range/ui-range-element.d.ts.map +1 -1
  34. package/dist/components/ui-segmented-control/ui-segment-element.d.ts.map +1 -1
  35. package/dist/components/ui-segmented-control/ui-segmented-control-element.d.ts +1 -0
  36. package/dist/components/ui-segmented-control/ui-segmented-control-element.d.ts.map +1 -1
  37. package/dist/components/ui-select/ui-select-element.d.ts +1 -0
  38. package/dist/components/ui-select/ui-select-element.d.ts.map +1 -1
  39. package/dist/components/ui-slideshow/ui-slideshow-element.d.ts.map +1 -1
  40. package/dist/components/ui-switch/ui-switch-element.d.ts +4 -0
  41. package/dist/components/ui-switch/ui-switch-element.d.ts.map +1 -1
  42. package/dist/components/ui-table/index.d.ts +1 -1
  43. package/dist/components/ui-table/index.d.ts.map +1 -1
  44. package/dist/components/ui-table/table-store.d.ts +0 -1
  45. package/dist/components/ui-table/table-store.d.ts.map +1 -1
  46. package/dist/components/ui-table/ui-table-element.d.ts +1 -0
  47. package/dist/components/ui-table/ui-table-element.d.ts.map +1 -1
  48. package/dist/components/ui-table/ui-table-header-element.d.ts +1 -0
  49. package/dist/components/ui-table/ui-table-header-element.d.ts.map +1 -1
  50. package/dist/components/ui-tabs/ui-tab-element.d.ts.map +1 -1
  51. package/dist/components/ui-tabs/ui-tabs-element.d.ts.map +1 -1
  52. package/dist/components/ui-textarea/ui-textarea-element.d.ts +1 -0
  53. package/dist/components/ui-textarea/ui-textarea-element.d.ts.map +1 -1
  54. package/dist/components/ui-tree/ui-tree-item-element.d.ts +4 -0
  55. package/dist/components/ui-tree/ui-tree-item-element.d.ts.map +1 -1
  56. package/dist/components-lean.css +208 -84
  57. package/dist/components.css +216 -84
  58. package/dist/containers/ui-layout-sidebar/ui-layout-sidebar-element.d.ts.map +1 -1
  59. package/dist/core/form-associable.d.ts +2 -2
  60. package/dist/core/trait-runtime.d.ts.map +1 -1
  61. package/dist/core/ui-element.d.ts +2 -0
  62. package/dist/core/ui-element.d.ts.map +1 -1
  63. package/dist/custom-elements.json +4715 -2573
  64. package/dist/dialog-controller.js +54 -349
  65. package/dist/foundation.css +1 -15
  66. package/dist/icons/ui-icon-element.d.ts +1 -0
  67. package/dist/icons/ui-icon-element.d.ts.map +1 -1
  68. package/dist/index.d.ts +1 -1
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/{nav/inspector → inspector}/build-inspector.d.ts +2 -2
  71. package/dist/inspector/build-inspector.d.ts.map +1 -0
  72. package/dist/{nav/inspector → inspector}/ds-color-swatch-element.d.ts +1 -1
  73. package/dist/inspector/ds-color-swatch-element.d.ts.map +1 -0
  74. package/dist/inspector/ds-color-swatch.d.ts.map +1 -0
  75. package/dist/{nav/inspector → inspector}/ds-colors-element.d.ts +1 -1
  76. package/dist/inspector/ds-colors-element.d.ts.map +1 -0
  77. package/dist/inspector/ds-colors.d.ts.map +1 -0
  78. package/dist/inspector/ds-inspector-element.d.ts +15 -0
  79. package/dist/inspector/ds-inspector-element.d.ts.map +1 -0
  80. package/dist/inspector/ds-inspector.d.ts +3 -0
  81. package/dist/inspector/ds-inspector.d.ts.map +1 -0
  82. package/dist/{nav/inspector → inspector}/ds-themes-element.d.ts +1 -1
  83. package/dist/inspector/ds-themes-element.d.ts.map +1 -0
  84. package/dist/inspector/ds-themes.d.ts.map +1 -0
  85. package/dist/{nav/inspector → inspector}/ds-variable-element.d.ts +1 -1
  86. package/dist/inspector/ds-variable-element.d.ts.map +1 -0
  87. package/dist/inspector/ds-variable.d.ts.map +1 -0
  88. package/dist/{nav/inspector → inspector}/index.d.ts +1 -0
  89. package/dist/inspector/index.d.ts.map +1 -0
  90. package/dist/inspector.css +1 -1
  91. package/dist/inspector.d.ts +10 -6
  92. package/dist/inspector.d.ts.map +1 -1
  93. package/dist/inspector.js +94 -75
  94. package/dist/kernel/index.d.ts +1 -0
  95. package/dist/kernel/index.d.ts.map +1 -1
  96. package/dist/kernel/overlay-manager.d.ts +5 -1
  97. package/dist/kernel/overlay-manager.d.ts.map +1 -1
  98. package/dist/kernel.js +212 -194
  99. package/dist/list-navigate-controller.js +457 -0
  100. package/dist/native-ui-lean.css +209 -99
  101. package/dist/native-ui.css +217 -99
  102. package/dist/native-ui.js +7 -7
  103. package/dist/register-all.js +4 -3
  104. package/dist/register-all2.js +151 -79
  105. package/dist/traits/adapters/collapsible-adapter.d.ts.map +1 -1
  106. package/dist/traits/adapters/copyable-adapter.d.ts.map +1 -1
  107. package/dist/traits/adapters/draggable-adapter.d.ts.map +1 -1
  108. package/dist/traits/adapters/hoverable-adapter.d.ts.map +1 -1
  109. package/dist/traits/adapters/intersectable-adapter.d.ts.map +1 -1
  110. package/dist/traits/adapters/resizable-adapter.d.ts.map +1 -1
  111. package/dist/traits/adapters/searchable-adapter.d.ts.map +1 -1
  112. package/dist/traits/adapters/sortable-adapter.d.ts.map +1 -1
  113. package/dist/traits/adapters/swipeable-adapter.d.ts.map +1 -1
  114. package/dist/traits/adapters/virtualizable-adapter.d.ts.map +1 -1
  115. package/dist/traits/collapsible-controller.d.ts.map +1 -1
  116. package/dist/traits/dialog-controller.d.ts.map +1 -1
  117. package/dist/traits/drag-controller.d.ts +3 -0
  118. package/dist/traits/drag-controller.d.ts.map +1 -1
  119. package/dist/traits/drop-zone-controller.d.ts +1 -1
  120. package/dist/traits/drop-zone-controller.d.ts.map +1 -1
  121. package/dist/traits/focus-trap-controller.d.ts.map +1 -1
  122. package/dist/traits/hover-controller.d.ts +1 -1
  123. package/dist/traits/hover-controller.d.ts.map +1 -1
  124. package/dist/traits/intersect-controller.d.ts.map +1 -1
  125. package/dist/traits/popover-controller.d.ts.map +1 -1
  126. package/dist/traits/press-controller.d.ts.map +1 -1
  127. package/dist/traits/resize-controller.d.ts.map +1 -1
  128. package/dist/traits/selection-controller.d.ts.map +1 -1
  129. package/dist/traits/sort-controller.d.ts.map +1 -1
  130. package/dist/traits/swipe-controller.d.ts.map +1 -1
  131. package/dist/traits/validate-controller.d.ts +2 -0
  132. package/dist/traits/validate-controller.d.ts.map +1 -1
  133. package/dist/traits.js +5 -6
  134. package/dist/ui-icon-element.js +407 -3949
  135. package/dist/ui-layout-inspector-element.js +3777 -0
  136. package/dist/uid.js +63 -3
  137. package/package.json +1 -1
  138. package/dist/define.js +0 -62
  139. package/dist/nav/inspector/build-inspector.d.ts.map +0 -1
  140. package/dist/nav/inspector/ds-color-swatch-element.d.ts.map +0 -1
  141. package/dist/nav/inspector/ds-color-swatch.d.ts.map +0 -1
  142. package/dist/nav/inspector/ds-colors-element.d.ts.map +0 -1
  143. package/dist/nav/inspector/ds-colors.d.ts.map +0 -1
  144. package/dist/nav/inspector/ds-themes-element.d.ts.map +0 -1
  145. package/dist/nav/inspector/ds-themes.d.ts.map +0 -1
  146. package/dist/nav/inspector/ds-variable-element.d.ts.map +0 -1
  147. package/dist/nav/inspector/ds-variable.d.ts.map +0 -1
  148. package/dist/nav/inspector/index.d.ts.map +0 -1
  149. package/dist/ui-element.js +0 -128
  150. /package/dist/{nav/inspector → inspector}/ds-color-swatch.d.ts +0 -0
  151. /package/dist/{nav/inspector → inspector}/ds-colors.d.ts +0 -0
  152. /package/dist/{nav/inspector → inspector}/ds-themes.d.ts +0 -0
  153. /package/dist/{nav/inspector → inspector}/ds-variable.d.ts +0 -0
@@ -1,3 +1,54 @@
1
+ @layer ui {
2
+
3
+ /* ── Icon Base ── */
4
+
5
+ :where(ui-icon) {
6
+ --ui-icon-size: var(--_icon-size);
7
+ --ui-icon-color: currentColor;
8
+
9
+ box-sizing: border-box;
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ width: var(--ui-icon-size);
14
+ height: var(--ui-icon-size);
15
+ color: var(--ui-icon-color);
16
+ flex-shrink: 0;
17
+ vertical-align: middle;
18
+ line-height: 0;
19
+ }
20
+
21
+ :where(ui-icon) > :where(svg) {
22
+ width: 100%;
23
+ height: 100%;
24
+ }
25
+
26
+ /* WHY: Unregistered icons (no SVG content) should collapse to zero size
27
+ so surrounding buttons/slots don't render with phantom dimensions */
28
+ :where(ui-icon:empty) {
29
+ width: 0;
30
+ height: 0;
31
+ overflow: hidden;
32
+ }
33
+
34
+ /* ── Icon Size Variants ── */
35
+
36
+ :where(ui-icon[size="xs"]) { --ui-icon-size: var(--ui-icon-xs); }
37
+ :where(ui-icon[size="sm"]) { --ui-icon-size: var(--ui-icon-sm); }
38
+ :where(ui-icon[size="md"]) { --ui-icon-size: var(--ui-icon-md); }
39
+ :where(ui-icon[size="lg"]) { --ui-icon-size: var(--ui-icon-lg); }
40
+ :where(ui-icon[size="xl"]) { --ui-icon-size: var(--ui-icon-xl); }
41
+
42
+ /* ── Forced Colors ── */
43
+
44
+ @media (forced-colors: active) {
45
+ :where(ui-icon) {
46
+ --ui-icon-color: ButtonText;
47
+ }
48
+ }
49
+
50
+ }
51
+
1
52
  @layer ui {
2
53
 
3
54
  /* ── Accordion Container ── */
@@ -467,7 +518,8 @@
467
518
  display: inline-flex;
468
519
  flex-direction: column;
469
520
  gap: calc(var(--_space));
470
- padding: calc(var(--_space) * 2);
521
+ padding-block: calc(var(--_space) * 2);
522
+ padding-inline: calc(var(--_space) * 2);
471
523
  border: 1px solid var(--_border-color);
472
524
  border-radius: var(--_radius);
473
525
  background: var(--_background);
@@ -674,11 +726,17 @@
674
726
  }
675
727
 
676
728
  :where(ui-calendar) :where([data-range-start]) {
677
- border-radius: calc(var(--_radius) - var(--_space)) 0 0 calc(var(--_radius) - var(--_space));
729
+ border-start-start-radius: calc(var(--_radius) - var(--_space));
730
+ border-end-start-radius: calc(var(--_radius) - var(--_space));
731
+ border-start-end-radius: 0;
732
+ border-end-end-radius: 0;
678
733
  }
679
734
 
680
735
  :where(ui-calendar) :where([data-range-end]) {
681
- border-radius: 0 calc(var(--_radius) - var(--_space)) calc(var(--_radius) - var(--_space)) 0;
736
+ border-start-start-radius: 0;
737
+ border-end-start-radius: 0;
738
+ border-start-end-radius: calc(var(--_radius) - var(--_space));
739
+ border-end-end-radius: calc(var(--_radius) - var(--_space));
682
740
  }
683
741
 
684
742
  :where(ui-calendar) :where([data-range-start][data-range-end]) {
@@ -1015,13 +1073,14 @@
1015
1073
 
1016
1074
  /* ── Active (pressed) ── */
1017
1075
 
1018
- :where(ui-checkbox)[pressed]::before {
1076
+ :where(ui-checkbox)[pressed]::before{
1019
1077
  background: var(--_background-active, var(--_widget-active));
1020
1078
  border-color: var(--_border-color-active, var(--_border-active));
1021
1079
  }
1022
1080
 
1023
1081
  :where(ui-checkbox)[aria-checked="true"][pressed]::before,
1024
- :where(ui-checkbox)[aria-checked="mixed"][pressed]::before {
1082
+ :where(ui-checkbox)[aria-checked="mixed"][pressed]::before
1083
+ :where(ui-checkbox)[aria-checked="mixed"][force-active]::before {
1025
1084
  background: var(--_surface-active);
1026
1085
  border-color: var(--_surface-active);
1027
1086
  }
@@ -1077,6 +1136,23 @@
1077
1136
  cursor: text;
1078
1137
  }
1079
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
+
1080
1156
  }
1081
1157
 
1082
1158
  @layer ui {
@@ -1129,7 +1205,8 @@
1129
1205
  :where(ui-command-list) {
1130
1206
  overflow-y: auto;
1131
1207
  max-height: var(--ui-popover-max-height);
1132
- padding: var(--_space);
1208
+ padding-block: var(--_space);
1209
+ padding-inline: var(--_space);
1133
1210
  }
1134
1211
 
1135
1212
  /* ── Command Group ── */
@@ -1221,7 +1298,8 @@
1221
1298
  }
1222
1299
 
1223
1300
  :where(ui-dialog) > :where(dialog)::backdrop {
1224
- background: var(--ui-backdrop-color) / var(--ui-backdrop-opacity);
1301
+ background: var(--ui-backdrop-color);
1302
+ opacity: var(--ui-backdrop-opacity);
1225
1303
  }
1226
1304
 
1227
1305
  }
@@ -1261,7 +1339,8 @@
1261
1339
  /* WHY: Animate backdrop opacity on open for a smooth reveal. */
1262
1340
 
1263
1341
  :where(ui-drawer) > :where(dialog)::backdrop {
1264
- background: var(--ui-backdrop-color) / var(--ui-backdrop-opacity);
1342
+ background: var(--ui-backdrop-color);
1343
+ opacity: var(--ui-backdrop-opacity);
1265
1344
  animation: drawer-backdrop-in var(--_duration) ease-out;
1266
1345
  }
1267
1346
 
@@ -1717,7 +1796,8 @@
1717
1796
  min-width: 0;
1718
1797
  flex-direction: column;
1719
1798
  gap: 0;
1720
- padding: var(--_space);
1799
+ padding-block: var(--_space);
1800
+ padding-inline: var(--_space);
1721
1801
  border-radius: var(--_radius);
1722
1802
  border: 1px solid var(--_border-color, var(--_border-rest));
1723
1803
  background: var(--_background, var(--_control));
@@ -1733,6 +1813,39 @@
1733
1813
  display: none;
1734
1814
  }
1735
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
+
1736
1849
  /* ── Option / Command Item Base ── */
1737
1850
 
1738
1851
  :where(ui-option, ui-command-item, [role="option"]) {
@@ -1893,10 +2006,6 @@
1893
2006
  color: var(--_ink-hover);
1894
2007
  }
1895
2008
 
1896
- :where(ui-nav-item)[active] {
1897
- color: var(--_ink-hover);
1898
- }
1899
-
1900
2009
  :where(ui-nav-item):active{
1901
2010
  color: var(--_ink-active);
1902
2011
  }
@@ -2117,10 +2226,15 @@
2117
2226
  instead of expanding the <details>. Same pattern as sidebar-trigger menus. */
2118
2227
 
2119
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
+
2120
2232
  position: fixed;
2121
2233
  position-area: inline-end span-block-end;
2122
2234
  position-try-fallbacks: --nav-flyout-flip-up;
2123
- margin: 0 0 0 var(--ui-popover-gap);
2235
+ margin-block: var(--ui-popover-viewport-margin);
2236
+ margin-inline: 0;
2237
+ margin-inline-start: var(--ui-popover-gap);
2124
2238
  min-width: 200px;
2125
2239
  max-height: var(--ui-popover-max-height);
2126
2240
  overflow-y: auto;
@@ -2130,6 +2244,10 @@
2130
2244
  position-area: inline-end span-block-start;
2131
2245
  }
2132
2246
 
2247
+ @position-try --nav-flyout-flip-down {
2248
+ position-area: inline-end span-block-end;
2249
+ }
2250
+
2133
2251
  /* ── Container Query: Collapsed Sidebar ── */
2134
2252
  /* WHY: Nav components own their own collapsed behavior via @container.
2135
2253
  The sidebar aside declares container-name: sidebar. When it shrinks
@@ -2173,6 +2291,14 @@
2173
2291
  font-size: var(--_font-size, 1rem);
2174
2292
  }
2175
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
+
2176
2302
  /* Collapse inter-group spacing in icon rail. */
2177
2303
  :where(ui-nav-group) + :where(ui-nav-group) {
2178
2304
  margin-block-start: 0;
@@ -2348,12 +2474,12 @@
2348
2474
 
2349
2475
  /* ── Active (pressed) ── */
2350
2476
 
2351
- :where(ui-radio)[pressed]::before {
2477
+ :where(ui-radio)[pressed]::before{
2352
2478
  background: var(--_background-active, var(--_widget-active));
2353
2479
  border-color: var(--_border-color-active, var(--_border-active));
2354
2480
  }
2355
2481
 
2356
- :where(ui-radio)[aria-checked="true"][pressed]::before {
2482
+ :where(ui-radio)[aria-checked="true"][pressed]::before{
2357
2483
  background: var(--_surface-active);
2358
2484
  border-color: var(--_surface-active);
2359
2485
  }
@@ -2406,6 +2532,8 @@
2406
2532
  min-width: 0;
2407
2533
  align-items: center;
2408
2534
  position: relative;
2535
+ /* WHY: Isolate internal z-index (thumb z-index: 1) from parent stacking context */
2536
+ isolation: isolate;
2409
2537
 
2410
2538
  min-height: var(--_track-height);
2411
2539
 
@@ -2499,11 +2627,11 @@
2499
2627
 
2500
2628
  /* ── Active (dragging) ── */
2501
2629
 
2502
- :where(ui-range)[pressed]::after {
2630
+ :where(ui-range)[pressed]::after{
2503
2631
  background: var(--_surface-active);
2504
2632
  }
2505
2633
 
2506
- :where(ui-range)[pressed] > :where(.ui-range-thumb) {
2634
+ :where(ui-range)[pressed] > :where(.ui-range-thumb){
2507
2635
  border-color: var(--_surface-active);
2508
2636
  box-shadow: var(--ui-shadow-sm), 0 0 0 6px var(--_surface);
2509
2637
  }
@@ -2687,6 +2815,23 @@
2687
2815
  display: contents;
2688
2816
  }
2689
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
+
2690
2835
  }
2691
2836
 
2692
2837
  @layer ui {
@@ -3078,12 +3223,12 @@
3078
3223
 
3079
3224
  /* ── Active (pressed) ── */
3080
3225
 
3081
- :where(ui-switch)[pressed]::before {
3226
+ :where(ui-switch)[pressed]::before{
3082
3227
  background: var(--_track-bg-active);
3083
3228
  border-color: var(--_track-border-active);
3084
3229
  }
3085
3230
 
3086
- :where(ui-switch)[aria-checked="true"][pressed]::before {
3231
+ :where(ui-switch)[aria-checked="true"][pressed]::before{
3087
3232
  background: var(--_surface-active);
3088
3233
  border-color: var(--_surface-active);
3089
3234
  }
@@ -3813,7 +3958,7 @@
3813
3958
  /* Default placement: above the anchor */
3814
3959
  position-area: block-start;
3815
3960
  position-try-fallbacks: flip-block, flip-inline;
3816
- margin: 0;
3961
+ margin: var(--ui-popover-viewport-margin);
3817
3962
 
3818
3963
  max-width: var(--ui-tooltip-max-width);
3819
3964
  padding-block: calc(var(--_space) * 1.5);
@@ -3835,8 +3980,12 @@
3835
3980
  inset: unset;
3836
3981
  overflow: visible;
3837
3982
 
3983
+ --_popover-origin: bottom center;
3984
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
3985
+
3986
+ transform-origin: var(--_popover-origin);
3838
3987
  opacity: 0;
3839
- transform: scale(0.96);
3988
+ transform: var(--_popover-from);
3840
3989
  transition:
3841
3990
  opacity var(--_duration) var(--_easing),
3842
3991
  transform var(--_duration) var(--_easing),
@@ -3848,37 +3997,45 @@
3848
3997
 
3849
3998
  :where(ui-tooltip[popover]):popover-open {
3850
3999
  opacity: 1;
3851
- transform: scale(1);
4000
+ transform: none;
3852
4001
  }
3853
4002
 
3854
4003
  /* Starting style for entry animation */
3855
4004
  @starting-style {
3856
4005
  :where(ui-tooltip[popover]):popover-open {
3857
4006
  opacity: 0;
3858
- transform: scale(0.96);
4007
+ transform: var(--_popover-from);
3859
4008
  }
3860
4009
  }
3861
4010
 
3862
4011
  /* ── Placement Variants ── */
3863
4012
 
3864
4013
  :where(ui-tooltip[placement="top"]) {
4014
+ --_popover-origin: bottom center;
4015
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
3865
4016
  position-area: block-start;
3866
- margin-bottom: calc(var(--_space) * 2);
4017
+ margin-block-end: calc(var(--_space) * 2);
3867
4018
  }
3868
4019
 
3869
4020
  :where(ui-tooltip[placement="bottom"]) {
4021
+ --_popover-origin: top center;
4022
+ --_popover-from: perspective(800px) scale(0.96) rotateX(-10deg);
3870
4023
  position-area: block-end;
3871
- margin-top: calc(var(--_space) * 2);
4024
+ margin-block-start: calc(var(--_space) * 2);
3872
4025
  }
3873
4026
 
3874
4027
  :where(ui-tooltip[placement="left"]) {
4028
+ --_popover-origin: right center;
4029
+ --_popover-from: perspective(800px) scale(0.96) rotateY(-10deg);
3875
4030
  position-area: inline-start;
3876
- margin-right: calc(var(--_space) * 2);
4031
+ margin-inline-end: calc(var(--_space) * 2);
3877
4032
  }
3878
4033
 
3879
4034
  :where(ui-tooltip[placement="right"]) {
4035
+ --_popover-origin: left center;
4036
+ --_popover-from: perspective(800px) scale(0.96) rotateY(10deg);
3880
4037
  position-area: inline-end;
3881
- margin-left: calc(var(--_space) * 2);
4038
+ margin-inline-start: calc(var(--_space) * 2);
3882
4039
  }
3883
4040
 
3884
4041
  /* ── Hidden (not :popover-open) ── */
@@ -3902,7 +4059,8 @@
3902
4059
  flex: 1 1 0%;
3903
4060
  min-width: 0;
3904
4061
  flex-direction: column;
3905
- padding: var(--_space);
4062
+ padding-block: var(--_space);
4063
+ padding-inline: var(--_space);
3906
4064
  font-size: var(--_font-size);
3907
4065
  line-height: var(--_line-height);
3908
4066
  }
@@ -3985,7 +4143,7 @@
3985
4143
 
3986
4144
  /* ── Disabled ── */
3987
4145
 
3988
- :where(ui-tree-item[disabled]) > :where([slot="label"]) {
4146
+ :where(ui-tree-item[aria-disabled="true"]) > :where([slot="label"]) {
3989
4147
  color: var(--_ink-disabled);
3990
4148
  cursor: not-allowed;
3991
4149
  pointer-events: none;
@@ -4693,11 +4851,11 @@
4693
4851
  /* WHY: When collapsed to icon rail, the sidebar edge meets content — drop left padding. */
4694
4852
 
4695
4853
  :where(ui-layout-sidebar)[collapsed] :where(ui-layout-canvas) {
4696
- padding-left: 0;
4854
+ padding-inline-start: 0;
4697
4855
  }
4698
4856
 
4699
4857
  :where(ui-layout-sidebar)[collapsed] :where(ui-layout-breadcrumb) {
4700
- padding-left: 0;
4858
+ padding-inline-start: 0;
4701
4859
  }
4702
4860
 
4703
4861
  /* ── Sidebar Header ── */
@@ -4864,10 +5022,15 @@
4864
5022
  Flip: bottom-aligned, grows upward (span-block-start). */
4865
5023
 
4866
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
+
4867
5028
  position: fixed;
4868
5029
  position-area: inline-end span-block-end;
4869
5030
  position-try-fallbacks: --sidebar-item-flip-up;
4870
- margin: 0 0 0 var(--ui-popover-gap);
5031
+ margin-block: var(--ui-popover-viewport-margin);
5032
+ margin-inline: 0;
5033
+ margin-inline-start: var(--ui-popover-gap);
4871
5034
  min-width: 200px;
4872
5035
  max-height: var(--ui-popover-max-height);
4873
5036
  overflow-y: auto;
@@ -4877,6 +5040,10 @@
4877
5040
  position-area: inline-end span-block-start;
4878
5041
  }
4879
5042
 
5043
+ @position-try --sidebar-item-flip-down {
5044
+ position-area: inline-end span-block-end;
5045
+ }
5046
+
4880
5047
  /* ── Container Query: Collapsed Sidebar ── */
4881
5048
  /* WHY: Each component owns its own collapsed behavior via @container.
4882
5049
  The aside is the container (container-name: sidebar). When it shrinks
@@ -4917,6 +5084,14 @@
4917
5084
  :where(ui-layout-sidebar-item) > :where(:not([slot="icon"]):not(ui-listbox[popover]):not(.nav-group-flyout)) {
4918
5085
  display: none;
4919
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
+ }
4920
5095
  }
4921
5096
 
4922
5097
  }
@@ -5125,57 +5300,6 @@
5125
5300
 
5126
5301
  }
5127
5302
 
5128
- @layer ui {
5129
-
5130
- /* ── Icon Base ── */
5131
-
5132
- :where(ui-icon) {
5133
- --ui-icon-size: var(--_icon-size);
5134
- --ui-icon-color: currentColor;
5135
-
5136
- box-sizing: border-box;
5137
- display: inline-flex;
5138
- align-items: center;
5139
- justify-content: center;
5140
- width: var(--ui-icon-size);
5141
- height: var(--ui-icon-size);
5142
- color: var(--ui-icon-color);
5143
- flex-shrink: 0;
5144
- vertical-align: middle;
5145
- line-height: 0;
5146
- }
5147
-
5148
- :where(ui-icon) > :where(svg) {
5149
- width: 100%;
5150
- height: 100%;
5151
- }
5152
-
5153
- /* WHY: Unregistered icons (no SVG content) should collapse to zero size
5154
- so surrounding buttons/slots don't render with phantom dimensions */
5155
- :where(ui-icon:empty) {
5156
- width: 0;
5157
- height: 0;
5158
- overflow: hidden;
5159
- }
5160
-
5161
- /* ── Icon Size Variants ── */
5162
-
5163
- :where(ui-icon[size="xs"]) { --ui-icon-size: var(--ui-icon-xs); }
5164
- :where(ui-icon[size="sm"]) { --ui-icon-size: var(--ui-icon-sm); }
5165
- :where(ui-icon[size="md"]) { --ui-icon-size: var(--ui-icon-md); }
5166
- :where(ui-icon[size="lg"]) { --ui-icon-size: var(--ui-icon-lg); }
5167
- :where(ui-icon[size="xl"]) { --ui-icon-size: var(--ui-icon-xl); }
5168
-
5169
- /* ── Forced Colors ── */
5170
-
5171
- @media (forced-colors: active) {
5172
- :where(ui-icon) {
5173
- --ui-icon-color: ButtonText;
5174
- }
5175
- }
5176
-
5177
- }
5178
-
5179
5303
  @layer ui {
5180
5304
 
5181
5305
  /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━