@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
@@ -1374,21 +1374,6 @@
1374
1374
 
1375
1375
 
1376
1376
 
1377
- /* ── Popover Anchor Positioning ──
1378
- Shared anchor-to-trigger positioning for dropdown popovers.
1379
- Coordinators (select, combobox) use this for their popover listbox. */
1380
-
1381
- :where(ui-select) > :where(ui-listbox[popover]),
1382
- :where(ui-combobox) > :where(ui-listbox[popover]) {
1383
- position: fixed;
1384
- position-area: block-end span-inline-end;
1385
- position-try-fallbacks: flip-block;
1386
- margin: var(--ui-popover-gap) 0 0;
1387
- min-width: anchor-size(inline);
1388
- max-height: var(--ui-popover-max-height);
1389
- overflow-y: auto;
1390
- }
1391
-
1392
1377
  /* ── Container-Level Disabled ──
1393
1378
  Containers that disable all children use aria-disabled="true".
1394
1379
  Disabled colors propagate via inheritance — children inherit the muted text.
@@ -1510,6 +1495,7 @@
1510
1495
  /* Popover (select / combobox / command) */
1511
1496
  --ui-popover-max-height: calc(100dvh - 2rem);
1512
1497
  --ui-popover-gap: 0.25rem;
1498
+ --ui-popover-viewport-margin: 0.5rem;
1513
1499
 
1514
1500
  /* Drawer */
1515
1501
  --ui-drawer-width: 24rem;
@@ -2080,6 +2066,57 @@
2080
2066
  }
2081
2067
  }
2082
2068
 
2069
+ @layer ui {
2070
+
2071
+ /* ── Icon Base ── */
2072
+
2073
+ :where(ui-icon) {
2074
+ --ui-icon-size: var(--_icon-size);
2075
+ --ui-icon-color: currentColor;
2076
+
2077
+ box-sizing: border-box;
2078
+ display: inline-flex;
2079
+ align-items: center;
2080
+ justify-content: center;
2081
+ width: var(--ui-icon-size);
2082
+ height: var(--ui-icon-size);
2083
+ color: var(--ui-icon-color);
2084
+ flex-shrink: 0;
2085
+ vertical-align: middle;
2086
+ line-height: 0;
2087
+ }
2088
+
2089
+ :where(ui-icon) > :where(svg) {
2090
+ width: 100%;
2091
+ height: 100%;
2092
+ }
2093
+
2094
+ /* WHY: Unregistered icons (no SVG content) should collapse to zero size
2095
+ so surrounding buttons/slots don't render with phantom dimensions */
2096
+ :where(ui-icon:empty) {
2097
+ width: 0;
2098
+ height: 0;
2099
+ overflow: hidden;
2100
+ }
2101
+
2102
+ /* ── Icon Size Variants ── */
2103
+
2104
+ :where(ui-icon[size="xs"]) { --ui-icon-size: var(--ui-icon-xs); }
2105
+ :where(ui-icon[size="sm"]) { --ui-icon-size: var(--ui-icon-sm); }
2106
+ :where(ui-icon[size="md"]) { --ui-icon-size: var(--ui-icon-md); }
2107
+ :where(ui-icon[size="lg"]) { --ui-icon-size: var(--ui-icon-lg); }
2108
+ :where(ui-icon[size="xl"]) { --ui-icon-size: var(--ui-icon-xl); }
2109
+
2110
+ /* ── Forced Colors ── */
2111
+
2112
+ @media (forced-colors: active) {
2113
+ :where(ui-icon) {
2114
+ --ui-icon-color: ButtonText;
2115
+ }
2116
+ }
2117
+
2118
+ }
2119
+
2083
2120
  @layer ui {
2084
2121
 
2085
2122
  /* ── Accordion Container ── */
@@ -2549,7 +2586,8 @@
2549
2586
  display: inline-flex;
2550
2587
  flex-direction: column;
2551
2588
  gap: calc(var(--_space));
2552
- padding: calc(var(--_space) * 2);
2589
+ padding-block: calc(var(--_space) * 2);
2590
+ padding-inline: calc(var(--_space) * 2);
2553
2591
  border: 1px solid var(--_border-color);
2554
2592
  border-radius: var(--_radius);
2555
2593
  background: var(--_background);
@@ -2756,11 +2794,17 @@
2756
2794
  }
2757
2795
 
2758
2796
  :where(ui-calendar) :where([data-range-start]) {
2759
- border-radius: calc(var(--_radius) - var(--_space)) 0 0 calc(var(--_radius) - var(--_space));
2797
+ border-start-start-radius: calc(var(--_radius) - var(--_space));
2798
+ border-end-start-radius: calc(var(--_radius) - var(--_space));
2799
+ border-start-end-radius: 0;
2800
+ border-end-end-radius: 0;
2760
2801
  }
2761
2802
 
2762
2803
  :where(ui-calendar) :where([data-range-end]) {
2763
- border-radius: 0 calc(var(--_radius) - var(--_space)) calc(var(--_radius) - var(--_space)) 0;
2804
+ border-start-start-radius: 0;
2805
+ border-end-start-radius: 0;
2806
+ border-start-end-radius: calc(var(--_radius) - var(--_space));
2807
+ border-end-end-radius: calc(var(--_radius) - var(--_space));
2764
2808
  }
2765
2809
 
2766
2810
  :where(ui-calendar) :where([data-range-start][data-range-end]) {
@@ -3097,13 +3141,14 @@
3097
3141
 
3098
3142
  /* ── Active (pressed) ── */
3099
3143
 
3100
- :where(ui-checkbox)[pressed]::before {
3144
+ :where(ui-checkbox)[pressed]::before{
3101
3145
  background: var(--_background-active, var(--_widget-active));
3102
3146
  border-color: var(--_border-color-active, var(--_border-active));
3103
3147
  }
3104
3148
 
3105
3149
  :where(ui-checkbox)[aria-checked="true"][pressed]::before,
3106
- :where(ui-checkbox)[aria-checked="mixed"][pressed]::before {
3150
+ :where(ui-checkbox)[aria-checked="mixed"][pressed]::before
3151
+ :where(ui-checkbox)[aria-checked="mixed"][force-active]::before {
3107
3152
  background: var(--_surface-active);
3108
3153
  border-color: var(--_surface-active);
3109
3154
  }
@@ -3159,6 +3204,23 @@
3159
3204
  cursor: text;
3160
3205
  }
3161
3206
 
3207
+ /* ── Popover Listbox Positioning ──
3208
+ WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
3209
+ for flex-child shrinking) so min-width: anchor-size(inline) wins by
3210
+ source order — both are zero-specificity via :where(). */
3211
+
3212
+ :where(ui-combobox) > :where(ui-listbox[popover]) {
3213
+ position: fixed;
3214
+ position-area: block-end span-inline-end;
3215
+ position-try-fallbacks: flip-block;
3216
+ margin-block: var(--ui-popover-viewport-margin);
3217
+ margin-inline: 0;
3218
+ margin-block-start: var(--ui-popover-gap);
3219
+ min-width: anchor-size(inline);
3220
+ max-height: var(--ui-popover-max-height);
3221
+ overflow-y: auto;
3222
+ }
3223
+
3162
3224
  }
3163
3225
 
3164
3226
  @layer ui {
@@ -3211,7 +3273,8 @@
3211
3273
  :where(ui-command-list) {
3212
3274
  overflow-y: auto;
3213
3275
  max-height: var(--ui-popover-max-height);
3214
- padding: var(--_space);
3276
+ padding-block: var(--_space);
3277
+ padding-inline: var(--_space);
3215
3278
  }
3216
3279
 
3217
3280
  /* ── Command Group ── */
@@ -3303,7 +3366,8 @@
3303
3366
  }
3304
3367
 
3305
3368
  :where(ui-dialog) > :where(dialog)::backdrop {
3306
- background: var(--ui-backdrop-color) / var(--ui-backdrop-opacity);
3369
+ background: var(--ui-backdrop-color);
3370
+ opacity: var(--ui-backdrop-opacity);
3307
3371
  }
3308
3372
 
3309
3373
  }
@@ -3343,7 +3407,8 @@
3343
3407
  /* WHY: Animate backdrop opacity on open for a smooth reveal. */
3344
3408
 
3345
3409
  :where(ui-drawer) > :where(dialog)::backdrop {
3346
- background: var(--ui-backdrop-color) / var(--ui-backdrop-opacity);
3410
+ background: var(--ui-backdrop-color);
3411
+ opacity: var(--ui-backdrop-opacity);
3347
3412
  animation: drawer-backdrop-in var(--_duration) ease-out;
3348
3413
  }
3349
3414
 
@@ -3799,7 +3864,8 @@
3799
3864
  min-width: 0;
3800
3865
  flex-direction: column;
3801
3866
  gap: 0;
3802
- padding: var(--_space);
3867
+ padding-block: var(--_space);
3868
+ padding-inline: var(--_space);
3803
3869
  border-radius: var(--_radius);
3804
3870
  border: 1px solid var(--_border-color, var(--_border-rest));
3805
3871
  background: var(--_background, var(--_control));
@@ -3815,6 +3881,39 @@
3815
3881
  display: none;
3816
3882
  }
3817
3883
 
3884
+ /* ── Popover Animation ──
3885
+ WHY: Shared entry/exit transition for all popover listboxes.
3886
+ Context CSS overrides --_popover-origin and --_popover-from
3887
+ to match the popover's anchor direction (e.g. sidebar flyouts
3888
+ open to the right → rotateY instead of rotateX). */
3889
+
3890
+ :where(ui-listbox[popover]) {
3891
+ --_popover-origin: top center;
3892
+ --_popover-from: perspective(800px) scale(0.96) rotateX(-20deg);
3893
+
3894
+ transform-origin: var(--_popover-origin);
3895
+ opacity: 0;
3896
+ transform: var(--_popover-from);
3897
+
3898
+ transition:
3899
+ opacity var(--_duration) var(--_easing),
3900
+ transform var(--_duration) var(--_easing),
3901
+ display var(--_duration) var(--_easing) allow-discrete,
3902
+ overlay var(--_duration) var(--_easing) allow-discrete;
3903
+ }
3904
+
3905
+ :where(ui-listbox[popover]):popover-open {
3906
+ opacity: 1;
3907
+ transform: none;
3908
+ }
3909
+
3910
+ @starting-style {
3911
+ :where(ui-listbox[popover]):popover-open {
3912
+ opacity: 0;
3913
+ transform: var(--_popover-from);
3914
+ }
3915
+ }
3916
+
3818
3917
  /* ── Option / Command Item Base ── */
3819
3918
 
3820
3919
  :where(ui-option, ui-command-item, [role="option"]) {
@@ -3975,10 +4074,6 @@
3975
4074
  color: var(--_ink-hover);
3976
4075
  }
3977
4076
 
3978
- :where(ui-nav-item)[active] {
3979
- color: var(--_ink-hover);
3980
- }
3981
-
3982
4077
  :where(ui-nav-item):active{
3983
4078
  color: var(--_ink-active);
3984
4079
  }
@@ -4199,10 +4294,15 @@
4199
4294
  instead of expanding the <details>. Same pattern as sidebar-trigger menus. */
4200
4295
 
4201
4296
  :where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
4297
+ --_popover-origin: left center;
4298
+ --_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
4299
+
4202
4300
  position: fixed;
4203
4301
  position-area: inline-end span-block-end;
4204
4302
  position-try-fallbacks: --nav-flyout-flip-up;
4205
- margin: 0 0 0 var(--ui-popover-gap);
4303
+ margin-block: var(--ui-popover-viewport-margin);
4304
+ margin-inline: 0;
4305
+ margin-inline-start: var(--ui-popover-gap);
4206
4306
  min-width: 200px;
4207
4307
  max-height: var(--ui-popover-max-height);
4208
4308
  overflow-y: auto;
@@ -4212,6 +4312,10 @@
4212
4312
  position-area: inline-end span-block-start;
4213
4313
  }
4214
4314
 
4315
+ @position-try --nav-flyout-flip-down {
4316
+ position-area: inline-end span-block-end;
4317
+ }
4318
+
4215
4319
  /* ── Container Query: Collapsed Sidebar ── */
4216
4320
  /* WHY: Nav components own their own collapsed behavior via @container.
4217
4321
  The sidebar aside declares container-name: sidebar. When it shrinks
@@ -4255,6 +4359,14 @@
4255
4359
  font-size: var(--_font-size, 1rem);
4256
4360
  }
4257
4361
 
4362
+ /* WHY: In collapsed mode the group is a small icon — centering
4363
+ the flyout vertically with the anchor is more natural than top-aligning.
4364
+ Fallbacks handle viewport clipping (top/bottom edge). */
4365
+ :where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
4366
+ position-area: inline-end;
4367
+ position-try-fallbacks: --nav-flyout-flip-up, --nav-flyout-flip-down;
4368
+ }
4369
+
4258
4370
  /* Collapse inter-group spacing in icon rail. */
4259
4371
  :where(ui-nav-group) + :where(ui-nav-group) {
4260
4372
  margin-block-start: 0;
@@ -4430,12 +4542,12 @@
4430
4542
 
4431
4543
  /* ── Active (pressed) ── */
4432
4544
 
4433
- :where(ui-radio)[pressed]::before {
4545
+ :where(ui-radio)[pressed]::before{
4434
4546
  background: var(--_background-active, var(--_widget-active));
4435
4547
  border-color: var(--_border-color-active, var(--_border-active));
4436
4548
  }
4437
4549
 
4438
- :where(ui-radio)[aria-checked="true"][pressed]::before {
4550
+ :where(ui-radio)[aria-checked="true"][pressed]::before{
4439
4551
  background: var(--_surface-active);
4440
4552
  border-color: var(--_surface-active);
4441
4553
  }
@@ -4488,6 +4600,8 @@
4488
4600
  min-width: 0;
4489
4601
  align-items: center;
4490
4602
  position: relative;
4603
+ /* WHY: Isolate internal z-index (thumb z-index: 1) from parent stacking context */
4604
+ isolation: isolate;
4491
4605
 
4492
4606
  min-height: var(--_track-height);
4493
4607
 
@@ -4581,11 +4695,11 @@
4581
4695
 
4582
4696
  /* ── Active (dragging) ── */
4583
4697
 
4584
- :where(ui-range)[pressed]::after {
4698
+ :where(ui-range)[pressed]::after{
4585
4699
  background: var(--_surface-active);
4586
4700
  }
4587
4701
 
4588
- :where(ui-range)[pressed] > :where(.ui-range-thumb) {
4702
+ :where(ui-range)[pressed] > :where(.ui-range-thumb){
4589
4703
  border-color: var(--_surface-active);
4590
4704
  box-shadow: var(--ui-shadow-sm), 0 0 0 6px var(--_surface);
4591
4705
  }
@@ -4769,6 +4883,23 @@
4769
4883
  display: contents;
4770
4884
  }
4771
4885
 
4886
+ /* ── Popover Listbox Positioning ──
4887
+ WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
4888
+ for flex-child shrinking) so min-width: anchor-size(inline) wins by
4889
+ source order — both are zero-specificity via :where(). */
4890
+
4891
+ :where(ui-select) > :where(ui-listbox[popover]) {
4892
+ position: fixed;
4893
+ position-area: block-end span-inline-end;
4894
+ position-try-fallbacks: flip-block;
4895
+ margin-block: var(--ui-popover-viewport-margin);
4896
+ margin-inline: 0;
4897
+ margin-block-start: var(--ui-popover-gap);
4898
+ min-width: anchor-size(inline);
4899
+ max-height: var(--ui-popover-max-height);
4900
+ overflow-y: auto;
4901
+ }
4902
+
4772
4903
  }
4773
4904
 
4774
4905
  @layer ui {
@@ -5160,12 +5291,12 @@
5160
5291
 
5161
5292
  /* ── Active (pressed) ── */
5162
5293
 
5163
- :where(ui-switch)[pressed]::before {
5294
+ :where(ui-switch)[pressed]::before{
5164
5295
  background: var(--_track-bg-active);
5165
5296
  border-color: var(--_track-border-active);
5166
5297
  }
5167
5298
 
5168
- :where(ui-switch)[aria-checked="true"][pressed]::before {
5299
+ :where(ui-switch)[aria-checked="true"][pressed]::before{
5169
5300
  background: var(--_surface-active);
5170
5301
  border-color: var(--_surface-active);
5171
5302
  }
@@ -5895,7 +6026,7 @@
5895
6026
  /* Default placement: above the anchor */
5896
6027
  position-area: block-start;
5897
6028
  position-try-fallbacks: flip-block, flip-inline;
5898
- margin: 0;
6029
+ margin: var(--ui-popover-viewport-margin);
5899
6030
 
5900
6031
  max-width: var(--ui-tooltip-max-width);
5901
6032
  padding-block: calc(var(--_space) * 1.5);
@@ -5917,8 +6048,12 @@
5917
6048
  inset: unset;
5918
6049
  overflow: visible;
5919
6050
 
6051
+ --_popover-origin: bottom center;
6052
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
6053
+
6054
+ transform-origin: var(--_popover-origin);
5920
6055
  opacity: 0;
5921
- transform: scale(0.96);
6056
+ transform: var(--_popover-from);
5922
6057
  transition:
5923
6058
  opacity var(--_duration) var(--_easing),
5924
6059
  transform var(--_duration) var(--_easing),
@@ -5930,37 +6065,45 @@
5930
6065
 
5931
6066
  :where(ui-tooltip[popover]):popover-open {
5932
6067
  opacity: 1;
5933
- transform: scale(1);
6068
+ transform: none;
5934
6069
  }
5935
6070
 
5936
6071
  /* Starting style for entry animation */
5937
6072
  @starting-style {
5938
6073
  :where(ui-tooltip[popover]):popover-open {
5939
6074
  opacity: 0;
5940
- transform: scale(0.96);
6075
+ transform: var(--_popover-from);
5941
6076
  }
5942
6077
  }
5943
6078
 
5944
6079
  /* ── Placement Variants ── */
5945
6080
 
5946
6081
  :where(ui-tooltip[placement="top"]) {
6082
+ --_popover-origin: bottom center;
6083
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
5947
6084
  position-area: block-start;
5948
- margin-bottom: calc(var(--_space) * 2);
6085
+ margin-block-end: calc(var(--_space) * 2);
5949
6086
  }
5950
6087
 
5951
6088
  :where(ui-tooltip[placement="bottom"]) {
6089
+ --_popover-origin: top center;
6090
+ --_popover-from: perspective(800px) scale(0.96) rotateX(-10deg);
5952
6091
  position-area: block-end;
5953
- margin-top: calc(var(--_space) * 2);
6092
+ margin-block-start: calc(var(--_space) * 2);
5954
6093
  }
5955
6094
 
5956
6095
  :where(ui-tooltip[placement="left"]) {
6096
+ --_popover-origin: right center;
6097
+ --_popover-from: perspective(800px) scale(0.96) rotateY(-10deg);
5957
6098
  position-area: inline-start;
5958
- margin-right: calc(var(--_space) * 2);
6099
+ margin-inline-end: calc(var(--_space) * 2);
5959
6100
  }
5960
6101
 
5961
6102
  :where(ui-tooltip[placement="right"]) {
6103
+ --_popover-origin: left center;
6104
+ --_popover-from: perspective(800px) scale(0.96) rotateY(10deg);
5962
6105
  position-area: inline-end;
5963
- margin-left: calc(var(--_space) * 2);
6106
+ margin-inline-start: calc(var(--_space) * 2);
5964
6107
  }
5965
6108
 
5966
6109
  /* ── Hidden (not :popover-open) ── */
@@ -5984,7 +6127,8 @@
5984
6127
  flex: 1 1 0%;
5985
6128
  min-width: 0;
5986
6129
  flex-direction: column;
5987
- padding: var(--_space);
6130
+ padding-block: var(--_space);
6131
+ padding-inline: var(--_space);
5988
6132
  font-size: var(--_font-size);
5989
6133
  line-height: var(--_line-height);
5990
6134
  }
@@ -6067,7 +6211,7 @@
6067
6211
 
6068
6212
  /* ── Disabled ── */
6069
6213
 
6070
- :where(ui-tree-item[disabled]) > :where([slot="label"]) {
6214
+ :where(ui-tree-item[aria-disabled="true"]) > :where([slot="label"]) {
6071
6215
  color: var(--_ink-disabled);
6072
6216
  cursor: not-allowed;
6073
6217
  pointer-events: none;
@@ -6775,11 +6919,11 @@
6775
6919
  /* WHY: When collapsed to icon rail, the sidebar edge meets content — drop left padding. */
6776
6920
 
6777
6921
  :where(ui-layout-sidebar)[collapsed] :where(ui-layout-canvas) {
6778
- padding-left: 0;
6922
+ padding-inline-start: 0;
6779
6923
  }
6780
6924
 
6781
6925
  :where(ui-layout-sidebar)[collapsed] :where(ui-layout-breadcrumb) {
6782
- padding-left: 0;
6926
+ padding-inline-start: 0;
6783
6927
  }
6784
6928
 
6785
6929
  /* ── Sidebar Header ── */
@@ -6946,10 +7090,15 @@
6946
7090
  Flip: bottom-aligned, grows upward (span-block-start). */
6947
7091
 
6948
7092
  :where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
7093
+ --_popover-origin: left center;
7094
+ --_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
7095
+
6949
7096
  position: fixed;
6950
7097
  position-area: inline-end span-block-end;
6951
7098
  position-try-fallbacks: --sidebar-item-flip-up;
6952
- margin: 0 0 0 var(--ui-popover-gap);
7099
+ margin-block: var(--ui-popover-viewport-margin);
7100
+ margin-inline: 0;
7101
+ margin-inline-start: var(--ui-popover-gap);
6953
7102
  min-width: 200px;
6954
7103
  max-height: var(--ui-popover-max-height);
6955
7104
  overflow-y: auto;
@@ -6959,6 +7108,10 @@
6959
7108
  position-area: inline-end span-block-start;
6960
7109
  }
6961
7110
 
7111
+ @position-try --sidebar-item-flip-down {
7112
+ position-area: inline-end span-block-end;
7113
+ }
7114
+
6962
7115
  /* ── Container Query: Collapsed Sidebar ── */
6963
7116
  /* WHY: Each component owns its own collapsed behavior via @container.
6964
7117
  The aside is the container (container-name: sidebar). When it shrinks
@@ -6999,6 +7152,14 @@
6999
7152
  :where(ui-layout-sidebar-item) > :where(:not([slot="icon"]):not(ui-listbox[popover]):not(.nav-group-flyout)) {
7000
7153
  display: none;
7001
7154
  }
7155
+
7156
+ /* WHY: In collapsed mode the sidebar item is a small icon — centering
7157
+ the popover vertically with the anchor is more natural than top-aligning.
7158
+ Fallbacks handle viewport clipping (top/bottom edge). */
7159
+ :where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
7160
+ position-area: inline-end;
7161
+ position-try-fallbacks: --sidebar-item-flip-up, --sidebar-item-flip-down;
7162
+ }
7002
7163
  }
7003
7164
 
7004
7165
  }
@@ -7207,57 +7368,6 @@
7207
7368
 
7208
7369
  }
7209
7370
 
7210
- @layer ui {
7211
-
7212
- /* ── Icon Base ── */
7213
-
7214
- :where(ui-icon) {
7215
- --ui-icon-size: var(--_icon-size);
7216
- --ui-icon-color: currentColor;
7217
-
7218
- box-sizing: border-box;
7219
- display: inline-flex;
7220
- align-items: center;
7221
- justify-content: center;
7222
- width: var(--ui-icon-size);
7223
- height: var(--ui-icon-size);
7224
- color: var(--ui-icon-color);
7225
- flex-shrink: 0;
7226
- vertical-align: middle;
7227
- line-height: 0;
7228
- }
7229
-
7230
- :where(ui-icon) > :where(svg) {
7231
- width: 100%;
7232
- height: 100%;
7233
- }
7234
-
7235
- /* WHY: Unregistered icons (no SVG content) should collapse to zero size
7236
- so surrounding buttons/slots don't render with phantom dimensions */
7237
- :where(ui-icon:empty) {
7238
- width: 0;
7239
- height: 0;
7240
- overflow: hidden;
7241
- }
7242
-
7243
- /* ── Icon Size Variants ── */
7244
-
7245
- :where(ui-icon[size="xs"]) { --ui-icon-size: var(--ui-icon-xs); }
7246
- :where(ui-icon[size="sm"]) { --ui-icon-size: var(--ui-icon-sm); }
7247
- :where(ui-icon[size="md"]) { --ui-icon-size: var(--ui-icon-md); }
7248
- :where(ui-icon[size="lg"]) { --ui-icon-size: var(--ui-icon-lg); }
7249
- :where(ui-icon[size="xl"]) { --ui-icon-size: var(--ui-icon-xl); }
7250
-
7251
- /* ── Forced Colors ── */
7252
-
7253
- @media (forced-colors: active) {
7254
- :where(ui-icon) {
7255
- --ui-icon-color: ButtonText;
7256
- }
7257
- }
7258
-
7259
- }
7260
-
7261
7371
  @layer ui {
7262
7372
 
7263
7373
  /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━