@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
@@ -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;
@@ -3218,6 +3204,23 @@
3218
3204
  cursor: text;
3219
3205
  }
3220
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
+
3221
3224
  }
3222
3225
 
3223
3226
  @layer ui {
@@ -3878,6 +3881,39 @@
3878
3881
  display: none;
3879
3882
  }
3880
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
+
3881
3917
  /* ── Option / Command Item Base ── */
3882
3918
 
3883
3919
  :where(ui-option, ui-command-item, [role="option"]) {
@@ -4258,10 +4294,14 @@
4258
4294
  instead of expanding the <details>. Same pattern as sidebar-trigger menus. */
4259
4295
 
4260
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
+
4261
4300
  position: fixed;
4262
4301
  position-area: inline-end span-block-end;
4263
4302
  position-try-fallbacks: --nav-flyout-flip-up;
4264
- margin: 0;
4303
+ margin-block: var(--ui-popover-viewport-margin);
4304
+ margin-inline: 0;
4265
4305
  margin-inline-start: var(--ui-popover-gap);
4266
4306
  min-width: 200px;
4267
4307
  max-height: var(--ui-popover-max-height);
@@ -4272,6 +4312,10 @@
4272
4312
  position-area: inline-end span-block-start;
4273
4313
  }
4274
4314
 
4315
+ @position-try --nav-flyout-flip-down {
4316
+ position-area: inline-end span-block-end;
4317
+ }
4318
+
4275
4319
  /* ── Container Query: Collapsed Sidebar ── */
4276
4320
  /* WHY: Nav components own their own collapsed behavior via @container.
4277
4321
  The sidebar aside declares container-name: sidebar. When it shrinks
@@ -4315,6 +4359,14 @@
4315
4359
  font-size: var(--_font-size, 1rem);
4316
4360
  }
4317
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
+
4318
4370
  /* Collapse inter-group spacing in icon rail. */
4319
4371
  :where(ui-nav-group) + :where(ui-nav-group) {
4320
4372
  margin-block-start: 0;
@@ -4548,6 +4600,8 @@
4548
4600
  min-width: 0;
4549
4601
  align-items: center;
4550
4602
  position: relative;
4603
+ /* WHY: Isolate internal z-index (thumb z-index: 1) from parent stacking context */
4604
+ isolation: isolate;
4551
4605
 
4552
4606
  min-height: var(--_track-height);
4553
4607
 
@@ -4829,6 +4883,23 @@
4829
4883
  display: contents;
4830
4884
  }
4831
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
+
4832
4903
  }
4833
4904
 
4834
4905
  @layer ui {
@@ -5955,7 +6026,7 @@
5955
6026
  /* Default placement: above the anchor */
5956
6027
  position-area: block-start;
5957
6028
  position-try-fallbacks: flip-block, flip-inline;
5958
- margin: 0;
6029
+ margin: var(--ui-popover-viewport-margin);
5959
6030
 
5960
6031
  max-width: var(--ui-tooltip-max-width);
5961
6032
  padding-block: calc(var(--_space) * 1.5);
@@ -5977,8 +6048,12 @@
5977
6048
  inset: unset;
5978
6049
  overflow: visible;
5979
6050
 
6051
+ --_popover-origin: bottom center;
6052
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
6053
+
6054
+ transform-origin: var(--_popover-origin);
5980
6055
  opacity: 0;
5981
- transform: scale(0.96);
6056
+ transform: var(--_popover-from);
5982
6057
  transition:
5983
6058
  opacity var(--_duration) var(--_easing),
5984
6059
  transform var(--_duration) var(--_easing),
@@ -5990,35 +6065,43 @@
5990
6065
 
5991
6066
  :where(ui-tooltip[popover]):popover-open {
5992
6067
  opacity: 1;
5993
- transform: scale(1);
6068
+ transform: none;
5994
6069
  }
5995
6070
 
5996
6071
  /* Starting style for entry animation */
5997
6072
  @starting-style {
5998
6073
  :where(ui-tooltip[popover]):popover-open {
5999
6074
  opacity: 0;
6000
- transform: scale(0.96);
6075
+ transform: var(--_popover-from);
6001
6076
  }
6002
6077
  }
6003
6078
 
6004
6079
  /* ── Placement Variants ── */
6005
6080
 
6006
6081
  :where(ui-tooltip[placement="top"]) {
6082
+ --_popover-origin: bottom center;
6083
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
6007
6084
  position-area: block-start;
6008
6085
  margin-block-end: calc(var(--_space) * 2);
6009
6086
  }
6010
6087
 
6011
6088
  :where(ui-tooltip[placement="bottom"]) {
6089
+ --_popover-origin: top center;
6090
+ --_popover-from: perspective(800px) scale(0.96) rotateX(-10deg);
6012
6091
  position-area: block-end;
6013
6092
  margin-block-start: calc(var(--_space) * 2);
6014
6093
  }
6015
6094
 
6016
6095
  :where(ui-tooltip[placement="left"]) {
6096
+ --_popover-origin: right center;
6097
+ --_popover-from: perspective(800px) scale(0.96) rotateY(-10deg);
6017
6098
  position-area: inline-start;
6018
6099
  margin-inline-end: calc(var(--_space) * 2);
6019
6100
  }
6020
6101
 
6021
6102
  :where(ui-tooltip[placement="right"]) {
6103
+ --_popover-origin: left center;
6104
+ --_popover-from: perspective(800px) scale(0.96) rotateY(10deg);
6022
6105
  position-area: inline-end;
6023
6106
  margin-inline-start: calc(var(--_space) * 2);
6024
6107
  }
@@ -7007,10 +7090,14 @@
7007
7090
  Flip: bottom-aligned, grows upward (span-block-start). */
7008
7091
 
7009
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
+
7010
7096
  position: fixed;
7011
7097
  position-area: inline-end span-block-end;
7012
7098
  position-try-fallbacks: --sidebar-item-flip-up;
7013
- margin: 0;
7099
+ margin-block: var(--ui-popover-viewport-margin);
7100
+ margin-inline: 0;
7014
7101
  margin-inline-start: var(--ui-popover-gap);
7015
7102
  min-width: 200px;
7016
7103
  max-height: var(--ui-popover-max-height);
@@ -7021,6 +7108,10 @@
7021
7108
  position-area: inline-end span-block-start;
7022
7109
  }
7023
7110
 
7111
+ @position-try --sidebar-item-flip-down {
7112
+ position-area: inline-end span-block-end;
7113
+ }
7114
+
7024
7115
  /* ── Container Query: Collapsed Sidebar ── */
7025
7116
  /* WHY: Each component owns its own collapsed behavior via @container.
7026
7117
  The aside is the container (container-name: sidebar). When it shrinks
@@ -7061,6 +7152,14 @@
7061
7152
  :where(ui-layout-sidebar-item) > :where(:not([slot="icon"]):not(ui-listbox[popover]):not(.nav-group-flyout)) {
7062
7153
  display: none;
7063
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
+ }
7064
7163
  }
7065
7164
 
7066
7165
  }
@@ -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;
@@ -3236,6 +3222,23 @@
3236
3222
  cursor: text;
3237
3223
  }
3238
3224
 
3225
+ /* ── Popover Listbox Positioning ──
3226
+ WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
3227
+ for flex-child shrinking) so min-width: anchor-size(inline) wins by
3228
+ source order — both are zero-specificity via :where(). */
3229
+
3230
+ :where(ui-combobox) > :where(ui-listbox[popover]) {
3231
+ position: fixed;
3232
+ position-area: block-end span-inline-end;
3233
+ position-try-fallbacks: flip-block;
3234
+ margin-block: var(--ui-popover-viewport-margin);
3235
+ margin-inline: 0;
3236
+ margin-block-start: var(--ui-popover-gap);
3237
+ min-width: anchor-size(inline);
3238
+ max-height: var(--ui-popover-max-height);
3239
+ overflow-y: auto;
3240
+ }
3241
+
3239
3242
  }
3240
3243
 
3241
3244
  @layer ui {
@@ -3902,6 +3905,39 @@
3902
3905
  display: none;
3903
3906
  }
3904
3907
 
3908
+ /* ── Popover Animation ──
3909
+ WHY: Shared entry/exit transition for all popover listboxes.
3910
+ Context CSS overrides --_popover-origin and --_popover-from
3911
+ to match the popover's anchor direction (e.g. sidebar flyouts
3912
+ open to the right → rotateY instead of rotateX). */
3913
+
3914
+ :where(ui-listbox[popover]) {
3915
+ --_popover-origin: top center;
3916
+ --_popover-from: perspective(800px) scale(0.96) rotateX(-20deg);
3917
+
3918
+ transform-origin: var(--_popover-origin);
3919
+ opacity: 0;
3920
+ transform: var(--_popover-from);
3921
+
3922
+ transition:
3923
+ opacity var(--_duration) var(--_easing),
3924
+ transform var(--_duration) var(--_easing),
3925
+ display var(--_duration) var(--_easing) allow-discrete,
3926
+ overlay var(--_duration) var(--_easing) allow-discrete;
3927
+ }
3928
+
3929
+ :where(ui-listbox[popover]):popover-open {
3930
+ opacity: 1;
3931
+ transform: none;
3932
+ }
3933
+
3934
+ @starting-style {
3935
+ :where(ui-listbox[popover]):popover-open {
3936
+ opacity: 0;
3937
+ transform: var(--_popover-from);
3938
+ }
3939
+ }
3940
+
3905
3941
  /* ── Option / Command Item Base ── */
3906
3942
 
3907
3943
  :where(ui-option, ui-command-item, [role="option"]) {
@@ -4290,10 +4326,14 @@
4290
4326
  instead of expanding the <details>. Same pattern as sidebar-trigger menus. */
4291
4327
 
4292
4328
  :where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
4329
+ --_popover-origin: left center;
4330
+ --_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
4331
+
4293
4332
  position: fixed;
4294
4333
  position-area: inline-end span-block-end;
4295
4334
  position-try-fallbacks: --nav-flyout-flip-up;
4296
- margin: 0;
4335
+ margin-block: var(--ui-popover-viewport-margin);
4336
+ margin-inline: 0;
4297
4337
  margin-inline-start: var(--ui-popover-gap);
4298
4338
  min-width: 200px;
4299
4339
  max-height: var(--ui-popover-max-height);
@@ -4304,6 +4344,10 @@
4304
4344
  position-area: inline-end span-block-start;
4305
4345
  }
4306
4346
 
4347
+ @position-try --nav-flyout-flip-down {
4348
+ position-area: inline-end span-block-end;
4349
+ }
4350
+
4307
4351
  /* ── Container Query: Collapsed Sidebar ── */
4308
4352
  /* WHY: Nav components own their own collapsed behavior via @container.
4309
4353
  The sidebar aside declares container-name: sidebar. When it shrinks
@@ -4347,6 +4391,14 @@
4347
4391
  font-size: var(--_font-size, 1rem);
4348
4392
  }
4349
4393
 
4394
+ /* WHY: In collapsed mode the group is a small icon — centering
4395
+ the flyout vertically with the anchor is more natural than top-aligning.
4396
+ Fallbacks handle viewport clipping (top/bottom edge). */
4397
+ :where(ui-nav-group) > :where(ui-listbox.nav-group-flyout[popover]) {
4398
+ position-area: inline-end;
4399
+ position-try-fallbacks: --nav-flyout-flip-up, --nav-flyout-flip-down;
4400
+ }
4401
+
4350
4402
  /* Collapse inter-group spacing in icon rail. */
4351
4403
  :where(ui-nav-group) + :where(ui-nav-group) {
4352
4404
  margin-block-start: 0;
@@ -4586,6 +4638,8 @@
4586
4638
  min-width: 0;
4587
4639
  align-items: center;
4588
4640
  position: relative;
4641
+ /* WHY: Isolate internal z-index (thumb z-index: 1) from parent stacking context */
4642
+ isolation: isolate;
4589
4643
 
4590
4644
  min-height: var(--_track-height);
4591
4645
 
@@ -4876,6 +4930,23 @@
4876
4930
  display: contents;
4877
4931
  }
4878
4932
 
4933
+ /* ── Popover Listbox Positioning ──
4934
+ WHY: Must come after ui-listbox.css base rule (which sets min-width: 0
4935
+ for flex-child shrinking) so min-width: anchor-size(inline) wins by
4936
+ source order — both are zero-specificity via :where(). */
4937
+
4938
+ :where(ui-select) > :where(ui-listbox[popover]) {
4939
+ position: fixed;
4940
+ position-area: block-end span-inline-end;
4941
+ position-try-fallbacks: flip-block;
4942
+ margin-block: var(--ui-popover-viewport-margin);
4943
+ margin-inline: 0;
4944
+ margin-block-start: var(--ui-popover-gap);
4945
+ min-width: anchor-size(inline);
4946
+ max-height: var(--ui-popover-max-height);
4947
+ overflow-y: auto;
4948
+ }
4949
+
4879
4950
  }
4880
4951
 
4881
4952
  @layer ui {
@@ -6028,7 +6099,7 @@
6028
6099
  /* Default placement: above the anchor */
6029
6100
  position-area: block-start;
6030
6101
  position-try-fallbacks: flip-block, flip-inline;
6031
- margin: 0;
6102
+ margin: var(--ui-popover-viewport-margin);
6032
6103
 
6033
6104
  max-width: var(--ui-tooltip-max-width);
6034
6105
  padding-block: calc(var(--_space) * 1.5);
@@ -6050,8 +6121,12 @@
6050
6121
  inset: unset;
6051
6122
  overflow: visible;
6052
6123
 
6124
+ --_popover-origin: bottom center;
6125
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
6126
+
6127
+ transform-origin: var(--_popover-origin);
6053
6128
  opacity: 0;
6054
- transform: scale(0.96);
6129
+ transform: var(--_popover-from);
6055
6130
  transition:
6056
6131
  opacity var(--_duration) var(--_easing),
6057
6132
  transform var(--_duration) var(--_easing),
@@ -6063,35 +6138,43 @@
6063
6138
 
6064
6139
  :where(ui-tooltip[popover]):popover-open {
6065
6140
  opacity: 1;
6066
- transform: scale(1);
6141
+ transform: none;
6067
6142
  }
6068
6143
 
6069
6144
  /* Starting style for entry animation */
6070
6145
  @starting-style {
6071
6146
  :where(ui-tooltip[popover]):popover-open {
6072
6147
  opacity: 0;
6073
- transform: scale(0.96);
6148
+ transform: var(--_popover-from);
6074
6149
  }
6075
6150
  }
6076
6151
 
6077
6152
  /* ── Placement Variants ── */
6078
6153
 
6079
6154
  :where(ui-tooltip[placement="top"]) {
6155
+ --_popover-origin: bottom center;
6156
+ --_popover-from: perspective(800px) scale(0.96) rotateX(10deg);
6080
6157
  position-area: block-start;
6081
6158
  margin-block-end: calc(var(--_space) * 2);
6082
6159
  }
6083
6160
 
6084
6161
  :where(ui-tooltip[placement="bottom"]) {
6162
+ --_popover-origin: top center;
6163
+ --_popover-from: perspective(800px) scale(0.96) rotateX(-10deg);
6085
6164
  position-area: block-end;
6086
6165
  margin-block-start: calc(var(--_space) * 2);
6087
6166
  }
6088
6167
 
6089
6168
  :where(ui-tooltip[placement="left"]) {
6169
+ --_popover-origin: right center;
6170
+ --_popover-from: perspective(800px) scale(0.96) rotateY(-10deg);
6090
6171
  position-area: inline-start;
6091
6172
  margin-inline-end: calc(var(--_space) * 2);
6092
6173
  }
6093
6174
 
6094
6175
  :where(ui-tooltip[placement="right"]) {
6176
+ --_popover-origin: left center;
6177
+ --_popover-from: perspective(800px) scale(0.96) rotateY(10deg);
6095
6178
  position-area: inline-end;
6096
6179
  margin-inline-start: calc(var(--_space) * 2);
6097
6180
  }
@@ -7086,10 +7169,14 @@
7086
7169
  Flip: bottom-aligned, grows upward (span-block-start). */
7087
7170
 
7088
7171
  :where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
7172
+ --_popover-origin: left center;
7173
+ --_popover-from: perspective(800px) scale(0.96) rotateY(20deg);
7174
+
7089
7175
  position: fixed;
7090
7176
  position-area: inline-end span-block-end;
7091
7177
  position-try-fallbacks: --sidebar-item-flip-up;
7092
- margin: 0;
7178
+ margin-block: var(--ui-popover-viewport-margin);
7179
+ margin-inline: 0;
7093
7180
  margin-inline-start: var(--ui-popover-gap);
7094
7181
  min-width: 200px;
7095
7182
  max-height: var(--ui-popover-max-height);
@@ -7100,6 +7187,10 @@
7100
7187
  position-area: inline-end span-block-start;
7101
7188
  }
7102
7189
 
7190
+ @position-try --sidebar-item-flip-down {
7191
+ position-area: inline-end span-block-end;
7192
+ }
7193
+
7103
7194
  /* ── Container Query: Collapsed Sidebar ── */
7104
7195
  /* WHY: Each component owns its own collapsed behavior via @container.
7105
7196
  The aside is the container (container-name: sidebar). When it shrinks
@@ -7140,6 +7231,14 @@
7140
7231
  :where(ui-layout-sidebar-item) > :where(:not([slot="icon"]):not(ui-listbox[popover]):not(.nav-group-flyout)) {
7141
7232
  display: none;
7142
7233
  }
7234
+
7235
+ /* WHY: In collapsed mode the sidebar item is a small icon — centering
7236
+ the popover vertically with the anchor is more natural than top-aligning.
7237
+ Fallbacks handle viewport clipping (top/bottom edge). */
7238
+ :where(ui-layout-sidebar-item) > :where(ui-listbox[popover]) {
7239
+ position-area: inline-end;
7240
+ position-try-fallbacks: --sidebar-item-flip-up, --sidebar-item-flip-down;
7241
+ }
7143
7242
  }
7144
7243
 
7145
7244
  }
package/dist/native-ui.js CHANGED
@@ -1,9 +1,9 @@
1
- import { n as e, t } from "./uid.js";
2
- import { i as n, n as ee, r as te, t as ne } from "./define.js";
3
- import { a as r, c as i, d as a, f as o, i as s, l as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h } from "./dialog-controller.js";
4
- import { A as g, B as _, C as v, D as y, E as b, F as x, H as S, I as C, L as w, M as T, N as E, O as D, P as O, R as k, S as A, T as j, U as M, V as N, W as P, _ as F, a as I, b as L, c as R, d as z, f as B, g as V, h as H, i as U, j as W, k as G, l as K, m as q, n as J, o as Y, p as X, r as Z, s as re, t as ie, u as ae, v as oe, w as se, x as ce, y as le, z as ue } from "./register-all2.js";
5
- import { a as de, i as fe, n as pe, r as me, s as he, t as ge } from "./ui-element.js";
6
- import { $ as _e, A as ve, B as ye, C as be, Ct as xe, D as Se, Dt as Ce, E as we, Et as Te, F as Ee, G as De, H as Oe, I as ke, J as Ae, K as je, L as Q, M as Me, N as Ne, O as Pe, P as Fe, Q as Ie, R as Le, S as Re, St as ze, T as Be, Tt as Ve, U as He, V as Ue, W as We, X as Ge, Y as Ke, Z as qe, _ as Je, _t as Ye, a as Xe, at as Ze, b as Qe, bt as $e, c as et, ct as tt, d as nt, dt as rt, et as it, f as at, ft as ot, g as st, gt as ct, h as lt, ht as ut, i as dt, it as ft, j as pt, k as mt, l as ht, lt as gt, m as _t, mt as vt, n as yt, nt as bt, o as xt, ot as St, p as Ct, pt as wt, q as Tt, r as Et, rt as Dt, s as Ot, st as kt, t as At, tt as jt, u as Mt, ut as Nt, v as Pt, vt as Ft, w as It, wt as Lt, x as Rt, xt as zt, y as Bt, yt as Vt, z as Ht } from "./ui-icon-element.js";
1
+ import { a as e, i as t, n, o as ee, r as te, t as ne } from "./uid.js";
2
+ import { i as r, n as i, r as a, t as o } from "./dialog-controller.js";
3
+ import { A as s, B as c, C as l, D as u, E as d, F as f, H as p, I as m, L as h, M as g, N as _, O as v, P as y, R as b, S as x, T as S, U as C, V as w, W as T, _ as E, a as D, b as O, c as k, d as A, f as j, g as M, h as N, i as P, j as F, k as I, l as L, m as R, n as z, o as B, p as V, r as H, s as U, t as W, u as G, v as K, w as q, x as J, y as Y, z as X } from "./register-all2.js";
4
+ import { a as Z, c as re, d as ie, f as ae, g as oe, i as se, l as ce, m as le, n as ue, o as de, p as fe, r as pe, s as me, t as he, u as ge } from "./list-navigate-controller.js";
5
+ import { _ as _e, a as ve, c as ye, d as be, f as xe, g as Se, h as Ce, i as we, l as Te, m as Ee, n as De, o as Oe, p as ke, r as Ae, s as je, t as Q, u as Me, v as Ne } from "./ui-icon-element.js";
6
+ import { $ as Pe, A as Fe, B as Ie, C as Le, D as Re, E as ze, F as Be, G as Ve, H as He, I as Ue, J as We, K as Ge, L as Ke, M as qe, N as Je, O as Ye, P as Xe, Q as Ze, R as Qe, S as $e, T as et, U as tt, V as nt, W as rt, X as it, Y as at, Z as ot, _ as st, a as ct, at as lt, b as ut, c as dt, ct as ft, d as pt, et as mt, f as ht, g as gt, h as _t, i as vt, it as yt, j as bt, k as xt, l as St, lt as Ct, m as wt, n as Tt, nt as Et, o as Dt, ot as Ot, p as kt, q as At, r as jt, rt as Mt, s as Nt, st as Pt, t as Ft, tt as It, u as Lt, v as Rt, w as zt, x as Bt, y as Vt, z as Ht } from "./ui-layout-inspector-element.js";
7
7
  var $ = class extends Event {
8
8
  context;
9
9
  callback;
@@ -46,4 +46,4 @@ function Wt(e) {
46
46
  }
47
47
  };
48
48
  }
49
- export { Q as CalendarStore, x as ClipboardController, y as CollapsibleController, De as ColumnResizeController, Wt as ContextConsumer, Ut as ContextProvider, $ as ContextRequestEvent, E as CopyController, ze as DataListController, m as DialogController, s as DismissController, c as DismissStack, i as DragController, W as DropZoneController, C as EditController, D as FocusTrapController, Lt as FormAssociable, o as GestureRouter, O as HoverController, T as IntersectController, l as ListNavigateController, f as PopoverController, u as PressController, N as RangeSelectController, p as ResizeController, r as RovingFocusController, k as SearchController, Ee as SelectController, ue as SelectionController, g as SortController, w as SwipeController, je as TableStore, b as ToastController, h as ToastManager, it as UIAccordion, _e as UIAccordionItem, Pe as UIAvatar, Se as UIBadge, Be as UIBreadcrumb, It as UIBreadcrumbItem, Vt as UIButton, ke as UICalendar, nt as UICard, at as UIChatInput, kt as UICheckbox, Ne as UICombobox, wt as UICommand, tt as UICommandEmpty, gt as UICommandGroup, ot as UICommandInput, Nt as UICommandItem, rt as UICommandList, Ct as UIController, Ie as UIDialog, Re as UIDrawer, ge as UIElement, Me as UIField, At as UIIcon, Ft as UIInput, mt as UIInputOtp, we as UIKbd, xt as UILayoutChat, Xe as UILayoutInspector, et as UILayoutSidebar, Ot as UILayoutSidebarItem, Ye as UIListbox, Je as UINav, lt as UINavGroup, _t as UINavGroupHeader, st as UINavItem, ct as UIOption, vt as UIOptionGroup, ut as UIOptionGroupHeader, be as UIPagination, Ze as UIRadio, ft as UIRadioGroup, ve as UIRange, Mt as UISection, bt as UISegment, Dt as UISegmentedControl, Fe as UISelect, Pt as UISlide, Bt as UISlideshow, St as UISwitch, Ge as UITab, Ke as UITabPanel, Ae as UITabPanels, We as UITable, Oe as UITableBody, ye as UITableCell, He as UITableHead, Ht as UITableHeader, Ue as UITableRow, qe as UITabs, pt as UITextarea, ht as UIToolbar, jt as UITooltip, Rt as UITree, Qe as UITreeItem, G as ValidateController, _ as VirtualScrollController, ee as batch, U as clippableAdapter, F as collapsibleAdapter, pe as collectTraitOptions, te as computed, v as copyableAdapter, Le as createCalendarStore, xe as createDataList, Ce as createDisabledEffect, Tt as createTableStore, S as debugReactive, ne as define, z as dialogableAdapter, H as dismissableAdapter, ae as draggableAdapter, ce as droppableAdapter, J as editableAdapter, e as effect, $e as fetchDataOptions, oe as focusTrappableAdapter, yt as getIcon, fe as getRegisteredTraitNames, de as getTrait, a as getTraitRuntime, se as hoverableAdapter, A as intersectableAdapter, M as isComputed, P as isSignal, B as listNavigableAdapter, Et as onIconRegistered, zt as parseDataOptions, me as parseTraitAttribute, X as popoverableAdapter, j as pressableAdapter, Ve as prop, K as rangeSelectableAdapter, ie as registerAllTraits, dt as registerIcon, he as registerTrait, R as resizableAdapter, V as rovingFocusableAdapter, I as searchableAdapter, Y as selectableAdapter, n as signal, L as sortableAdapter, Z as swipeableAdapter, Te as syncProp, q as toastableAdapter, t as uid, d as untrack, le as validatableAdapter, re as virtualizableAdapter };
49
+ export { Fe as CalendarStore, f as ClipboardController, u as CollapsibleController, Qe as ColumnResizeController, Wt as ContextConsumer, Ut as ContextProvider, $ as ContextRequestEvent, _ as CopyController, ke as DataListController, o as DialogController, pe as DismissController, de as DismissStack, a as DragController, F as DropZoneController, m as EditController, v as FocusTrapController, Ce as FormAssociable, ce as GestureRouter, y as HoverController, g as IntersectController, he as ListNavigateController, ue as PopoverController, Z as PressController, w as RangeSelectController, i as ResizeController, se as RovingFocusController, b as SearchController, je as SelectController, X as SelectionController, s as SortController, h as SwipeController, Ht as TableStore, d as ToastController, me as ToastManager, At as UIAccordion, Ge as UIAccordionItem, zt as UIAvatar, Le as UIBadge, Bt as UIBreadcrumb, ut as UIBreadcrumbItem, Me as UIButton, xt as UICalendar, Nt as UICard, dt as UIChatInput, mt as UICheckbox, Ye as UICombobox, Ot as UICommand, It as UICommandEmpty, Et as UICommandGroup, lt as UICommandInput, Mt as UICommandItem, yt as UICommandList, St as UIController, Ve as UIDialog, Rt as UIDrawer, ge as UIElement, Re as UIField, Q as UIIcon, Ct as UIInput, et as UIInputOtp, $e as UIKbd, Tt as UILayoutChat, Ft as UILayoutInspector, vt as UILayoutSidebar, jt as UILayoutSidebarItem, Te as UIListbox, kt as UINav, pt as UINavGroup, Lt as UINavGroupHeader, ht as UINavItem, ye as UIOption, Pt as UIOptionGroup, ft as UIOptionGroupHeader, Vt as UIPagination, Ze as UIRadio, ot as UIRadioGroup, ve as UIRange, Dt as UISection, at as UISegment, it as UISegmentedControl, Oe as UISelect, wt as UISlide, _t as UISlideshow, Pe as UISwitch, tt as UITab, He as UITabPanel, nt as UITabPanels, Ke as UITable, Be as UITableBody, Je as UITableCell, Ue as UITableHead, qe as UITableHeader, Xe as UITableRow, rt as UITabs, ze as UITextarea, ct as UIToolbar, We as UITooltip, st as UITree, gt as UITreeItem, I as ValidateController, c as VirtualScrollController, te as batch, P as clippableAdapter, E as collapsibleAdapter, ie as collectTraitOptions, e as computed, l as copyableAdapter, bt as createCalendarStore, Ee as createDataList, Ne as createDisabledEffect, Ie as createTableStore, p as debugReactive, n as define, A as dialogableAdapter, N as dismissableAdapter, G as draggableAdapter, J as droppableAdapter, z as editableAdapter, t as effect, be as fetchDataOptions, K as focusTrappableAdapter, De as getIcon, fe as getRegisteredTraitNames, le as getTrait, re as getTraitRuntime, q as hoverableAdapter, x as intersectableAdapter, C as isComputed, T as isSignal, j as listNavigableAdapter, Ae as onIconRegistered, xe as parseDataOptions, ae as parseTraitAttribute, V as popoverableAdapter, S as pressableAdapter, Se as prop, L as rangeSelectableAdapter, W as registerAllTraits, we as registerIcon, oe as registerTrait, k as resizableAdapter, M as rovingFocusableAdapter, D as searchableAdapter, B as selectableAdapter, ee as signal, O as sortableAdapter, H as swipeableAdapter, _e as syncProp, R as toastableAdapter, ne as uid, r as untrack, Y as validatableAdapter, U as virtualizableAdapter };
@@ -1,3 +1,4 @@
1
- import { t as e } from "./define.js";
2
- import { $ as t, A as n, B as r, C as i, D as a, E as o, H as s, I as c, J as l, M as u, N as d, O as f, P as p, Q as m, S as h, T as g, U as _, V as v, W as y, X as b, Y as x, Z as S, _ as C, _t as w, a as T, at as E, b as D, c as O, ct as k, d as A, dt as j, et as M, f as N, ft as P, g as F, gt as I, h as L, ht as R, it as z, j as B, k as V, l as H, lt as U, m as W, mt as G, nt as K, o as q, ot as J, p as Y, pt as X, rt as Z, s as Q, st as $, t as ee, tt as te, u as ne, ut as re, v as ie, vt as ae, w as oe, x as se, y as ce, yt as le, z as ue } from "./ui-icon-element.js";
3
- e("ui-button", le), e("ui-input", ae), e("ui-listbox", w), e("ui-option", I), e("ui-option-group", G), e("ui-option-group-header", R), e("ui-select", p), e("ui-combobox", d), e("ui-command", X), e("ui-command-input", P), e("ui-command-list", j), e("ui-command-group", U), e("ui-command-item", re), e("ui-command-empty", k), e("ui-checkbox", $), e("ui-switch", J), e("ui-radio", E), e("ui-radio-group", z), e("ui-segmented-control", Z), e("ui-segment", K), e("ui-tooltip", te), e("ui-accordion", M), e("ui-accordion-item", t), e("ui-dialog", m), e("ui-tabs", S), e("ui-tab", b), e("ui-tab-panel", x), e("ui-tab-panels", l), e("ui-table", y), e("ui-table-head", _), e("ui-table-body", s), e("ui-table-row", v), e("ui-table-header", ue), e("ui-table-cell", r), e("ui-calendar", c), e("ui-field", u), e("ui-textarea", B), e("ui-range", n), e("ui-input-otp", V), e("ui-avatar", f), e("ui-badge", a), e("ui-kbd", o), e("ui-breadcrumb", g), e("ui-breadcrumb-item", oe), e("ui-pagination", i), e("ui-drawer", h), e("ui-tree", se), e("ui-tree-item", D), e("ui-slideshow", ce), e("ui-slide", ie), e("ui-nav", C), e("ui-nav-group", L), e("ui-nav-group-header", W), e("ui-nav-item", F), e("ui-chat-input", N), e("ui-controller", Y), e("ui-card", A), e("ui-section", ne), e("ui-toolbar", H), e("ui-layout-sidebar", O), e("ui-layout-sidebar-item", Q), e("ui-layout-chat", q), e("ui-layout-inspector", T), e("ui-icon", ee);
1
+ import { n as e } from "./uid.js";
2
+ import { a as t, c as n, l as r, o as i, t as a, u as o } from "./ui-icon-element.js";
3
+ import { $ as s, C as c, D as l, E as u, F as d, G as f, H as p, I as m, J as h, K as g, L as _, M as v, N as y, O as b, P as x, Q as S, S as C, T as w, U as T, V as E, W as D, X as O, Y as k, Z as A, _ as j, a as M, at as N, b as P, c as F, ct as I, d as L, et as R, f as z, g as B, h as V, i as H, it as U, k as W, l as G, lt as K, m as q, n as J, nt as Y, o as X, ot as Z, p as Q, q as $, r as ee, rt as te, s as ne, st as re, t as ie, tt as ae, u as oe, v as se, w as ce, x as le, y as ue } from "./ui-layout-inspector-element.js";
4
+ e("ui-button", o), e("ui-input", K), e("ui-listbox", r), e("ui-option", n), e("ui-option-group", re), e("ui-option-group-header", I), e("ui-select", i), e("ui-combobox", b), e("ui-command", Z), e("ui-command-input", N), e("ui-command-list", U), e("ui-command-group", Y), e("ui-command-item", te), e("ui-command-empty", ae), e("ui-checkbox", R), e("ui-switch", s), e("ui-radio", S), e("ui-radio-group", A), e("ui-segmented-control", O), e("ui-segment", k), e("ui-tooltip", h), e("ui-accordion", $), e("ui-accordion-item", g), e("ui-dialog", f), e("ui-tabs", D), e("ui-tab", T), e("ui-tab-panel", p), e("ui-tab-panels", E), e("ui-table", _), e("ui-table-head", m), e("ui-table-body", d), e("ui-table-row", x), e("ui-table-header", v), e("ui-table-cell", y), e("ui-calendar", W), e("ui-field", l), e("ui-textarea", u), e("ui-range", t), e("ui-input-otp", w), e("ui-avatar", ce), e("ui-badge", c), e("ui-kbd", C), e("ui-breadcrumb", le), e("ui-breadcrumb-item", P), e("ui-pagination", ue), e("ui-drawer", se), e("ui-tree", j), e("ui-tree-item", B), e("ui-slideshow", V), e("ui-slide", q), e("ui-nav", Q), e("ui-nav-group", L), e("ui-nav-group-header", oe), e("ui-nav-item", z), e("ui-chat-input", F), e("ui-controller", G), e("ui-card", ne), e("ui-section", X), e("ui-toolbar", M), e("ui-layout-sidebar", H), e("ui-layout-sidebar-item", ee), e("ui-layout-chat", J), e("ui-layout-inspector", ie), e("ui-icon", a);