@duskmoon-dev/core 1.9.0 → 1.10.1

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 (54) hide show
  1. package/README.md +3 -3
  2. package/dist/components/appbar.css +2 -2
  3. package/dist/components/autocomplete.css +1 -1
  4. package/dist/components/card.css +4 -4
  5. package/dist/components/cascader.css +1 -1
  6. package/dist/components/collapse.css +1 -1
  7. package/dist/components/datepicker.css +2 -2
  8. package/dist/components/dialog.css +1 -1
  9. package/dist/components/drawer.css +1 -1
  10. package/dist/components/file-upload.css +1 -1
  11. package/dist/components/form-group.css +33 -1
  12. package/dist/components/index.css +630 -42
  13. package/dist/components/modal.css +1 -1
  14. package/dist/components/multi-select.css +1 -1
  15. package/dist/components/navigation.css +2 -2
  16. package/dist/components/nested-menu.css +261 -0
  17. package/dist/components/popover.css +28 -16
  18. package/dist/components/snackbar.css +1 -1
  19. package/dist/components/theme-controller.css +281 -0
  20. package/dist/components/time-input.css +1 -1
  21. package/dist/components/toast.css +1 -1
  22. package/dist/components/toggle.css +274 -0
  23. package/dist/components/tooltip.css +2 -2
  24. package/dist/components/tree-select.css +1 -1
  25. package/dist/esm/components/appbar.js +2 -2
  26. package/dist/esm/components/autocomplete.js +1 -1
  27. package/dist/esm/components/card.js +4 -4
  28. package/dist/esm/components/cascader.js +1 -1
  29. package/dist/esm/components/collapse.js +1 -1
  30. package/dist/esm/components/datepicker.js +2 -2
  31. package/dist/esm/components/dialog.js +1 -1
  32. package/dist/esm/components/drawer.js +1 -1
  33. package/dist/esm/components/file-upload.js +1 -1
  34. package/dist/esm/components/form-group.js +33 -1
  35. package/dist/esm/components/modal.js +1 -1
  36. package/dist/esm/components/multi-select.js +1 -1
  37. package/dist/esm/components/navigation.js +2 -2
  38. package/dist/esm/components/nested-menu.js +268 -0
  39. package/dist/esm/components/popover.js +28 -16
  40. package/dist/esm/components/snackbar.js +1 -1
  41. package/dist/esm/components/theme-controller.js +288 -0
  42. package/dist/esm/components/time-input.js +1 -1
  43. package/dist/esm/components/toast.js +1 -1
  44. package/dist/esm/components/toggle.js +281 -0
  45. package/dist/esm/components/tooltip.js +2 -2
  46. package/dist/esm/components/tree-select.js +1 -1
  47. package/dist/index.css +702 -73
  48. package/dist/index.min.css +1 -0
  49. package/dist/themes/moonlight.css +34 -16
  50. package/dist/themes/ocean.css +16 -7
  51. package/dist/themes/sunset.css +5 -4
  52. package/dist/themes/sunshine.css +6 -4
  53. package/dist/types/types/plugin.d.ts +1 -1
  54. package/package.json +21 -1
package/dist/index.css CHANGED
@@ -230,6 +230,17 @@ html {
230
230
 
231
231
  --color-shadow: initial;
232
232
  --color-scrim: initial;
233
+
234
+ /* ============================================
235
+ * ELEVATION SHADOWS (6 tokens)
236
+ * ============================================ */
237
+
238
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
239
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
240
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
241
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
242
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
243
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
233
244
  }
234
245
 
235
246
  /* Utility classes for colors - OKLCH format */
@@ -518,8 +529,9 @@ html {
518
529
  * SHAPE & DEPTH
519
530
  * ============================================ */
520
531
 
521
- --radius-selector: 0rem;
522
- --radius-field: 0.5rem;
532
+ /* Sunshine: rounded, bubbly, soft feel */
533
+ --radius-selector: 0.25rem;
534
+ --radius-field: 0.625rem;
523
535
  --radius-box: 2rem;
524
536
  --size-selector: 0.1875rem;
525
537
  --size-field: 0.1875rem;
@@ -631,8 +643,9 @@ html {
631
643
  * SHAPE & DEPTH
632
644
  * ============================================ */
633
645
 
634
- --radius-selector: 0rem;
635
- --radius-field: 0.5rem;
646
+ /* Sunshine: rounded, bubbly, soft feel */
647
+ --radius-selector: 0.25rem;
648
+ --radius-field: 0.625rem;
636
649
  --radius-box: 2rem;
637
650
  --size-selector: 0.1875rem;
638
651
  --size-field: 0.1875rem;
@@ -770,14 +783,15 @@ html {
770
783
  * SHAPE & DEPTH
771
784
  * ============================================ */
772
785
 
773
- --radius-selector: 0rem;
774
- --radius-field: 0.5rem;
775
- --radius-box: 2rem;
776
- --size-selector: 0.1875rem;
777
- --size-field: 0.1875rem;
778
- --border: 0.5px;
779
- --depth: 1;
780
- --noise: 1;
786
+ /* Moonlight: sleek, minimal, slightly angular */
787
+ --radius-selector: 0.125rem;
788
+ --radius-field: 0.375rem;
789
+ --radius-box: 1rem;
790
+ --size-selector: 0.125rem;
791
+ --size-field: 0.125rem;
792
+ --border: 1px;
793
+ --depth: 0.8;
794
+ --noise: 0.6;
781
795
 
782
796
  /* ============================================
783
797
  * SURFACE VARIANT
@@ -799,6 +813,14 @@ html {
799
813
 
800
814
  --color-shadow: oklch(0% 0 0);
801
815
  --color-scrim: oklch(0% 0 0 / 60%);
816
+
817
+ /* Dark-mode shadows: stronger opacity for depth on dark surfaces */
818
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.15);
819
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.25), 0 1px 2px -1px rgb(0 0 0 / 0.25);
820
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.25), 0 2px 4px -2px rgb(0 0 0 / 0.25);
821
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.3);
822
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.3);
823
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);
802
824
  }
803
825
 
804
826
  /* System preference: prefers-color-scheme dark */
@@ -884,14 +906,15 @@ html {
884
906
  * SHAPE & DEPTH
885
907
  * ============================================ */
886
908
 
887
- --radius-selector: 0rem;
888
- --radius-field: 0.5rem;
889
- --radius-box: 2rem;
890
- --size-selector: 0.1875rem;
891
- --size-field: 0.1875rem;
892
- --border: 0.5px;
893
- --depth: 1;
894
- --noise: 1;
909
+ /* Moonlight: sleek, minimal, slightly angular */
910
+ --radius-selector: 0.125rem;
911
+ --radius-field: 0.375rem;
912
+ --radius-box: 1rem;
913
+ --size-selector: 0.125rem;
914
+ --size-field: 0.125rem;
915
+ --border: 1px;
916
+ --depth: 0.8;
917
+ --noise: 0.6;
895
918
 
896
919
  /* Surface Variant */
897
920
  --color-surface-variant: oklch(30% 0.02 260);
@@ -904,6 +927,14 @@ html {
904
927
  /* Shadow & Scrim */
905
928
  --color-shadow: oklch(0% 0 0);
906
929
  --color-scrim: oklch(0% 0 0 / 60%);
930
+
931
+ /* Dark-mode shadows */
932
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.15);
933
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.25), 0 1px 2px -1px rgb(0 0 0 / 0.25);
934
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.25), 0 2px 4px -2px rgb(0 0 0 / 0.25);
935
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.3);
936
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.3);
937
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);
907
938
  }
908
939
  }
909
940
 
@@ -1023,14 +1054,15 @@ html {
1023
1054
  * SHAPE & DEPTH
1024
1055
  * ============================================ */
1025
1056
 
1026
- --radius-selector: 0rem;
1027
- --radius-field: 0.5rem;
1057
+ /* Ocean: smooth, flowing, generous curves */
1058
+ --radius-selector: 0.25rem;
1059
+ --radius-field: 0.75rem;
1028
1060
  --radius-box: 1.5rem;
1029
- --size-selector: 0.1875rem;
1030
- --size-field: 0.1875rem;
1031
- --border: 0.5px;
1032
- --depth: 1;
1033
- --noise: 0.5;
1061
+ --size-selector: 0.125rem;
1062
+ --size-field: 0.125rem;
1063
+ --border: 1px;
1064
+ --depth: 0.7;
1065
+ --noise: 0.3;
1034
1066
 
1035
1067
  /* ============================================
1036
1068
  * SURFACE VARIANT
@@ -1052,6 +1084,14 @@ html {
1052
1084
 
1053
1085
  --color-shadow: oklch(0% 0 0);
1054
1086
  --color-scrim: oklch(0% 0 0 / 60%);
1087
+
1088
+ /* Dark-mode shadows: stronger opacity for depth on dark surfaces */
1089
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.15);
1090
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.25), 0 1px 2px -1px rgb(0 0 0 / 0.25);
1091
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.25), 0 2px 4px -2px rgb(0 0 0 / 0.25);
1092
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.3), 0 4px 6px -4px rgb(0 0 0 / 0.3);
1093
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.3), 0 8px 10px -6px rgb(0 0 0 / 0.3);
1094
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.5);
1055
1095
  }
1056
1096
 
1057
1097
  /**
@@ -1315,13 +1355,14 @@ html {
1315
1355
  * SHAPE & DEPTH
1316
1356
  * ============================================ */
1317
1357
 
1318
- --radius-selector: 0rem;
1358
+ /* Sunset: warm, soft, organic feel */
1359
+ --radius-selector: 0.1875rem;
1319
1360
  --radius-field: 0.5rem;
1320
- --radius-box: 1.5rem;
1361
+ --radius-box: 1.25rem;
1321
1362
  --size-selector: 0.1875rem;
1322
1363
  --size-field: 0.1875rem;
1323
- --border: 0.5px;
1324
- --depth: 1;
1364
+ --border: 0.75px;
1365
+ --depth: 0.9;
1325
1366
  --noise: 0.7;
1326
1367
 
1327
1368
  /* ============================================
@@ -1852,12 +1893,12 @@ html {
1852
1893
  border-radius: 1rem;
1853
1894
  background-color: var(--color-surface);
1854
1895
  color: var(--color-on-surface);
1855
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1896
+ box-shadow: var(--shadow-sm);
1856
1897
  transition: box-shadow 150ms ease-in-out, transform 150ms ease-in-out;
1857
1898
  }
1858
1899
 
1859
1900
  .card:hover {
1860
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
1901
+ box-shadow: var(--shadow-md);
1861
1902
  }
1862
1903
 
1863
1904
  /* Card Image */
@@ -2010,11 +2051,11 @@ html {
2010
2051
 
2011
2052
  /* Elevated Variants */
2012
2053
  .card-elevated {
2013
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
2054
+ box-shadow: var(--shadow-lg);
2014
2055
  }
2015
2056
 
2016
2057
  .card-elevated:hover {
2017
- box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
2058
+ box-shadow: var(--shadow-xl);
2018
2059
  transform: translateY(-2px);
2019
2060
  }
2020
2061
 
@@ -3187,7 +3228,7 @@ html {
3187
3228
  .tabs-boxed .tab[aria-selected="true"] {
3188
3229
  background-color: var(--color-surface);
3189
3230
  color: var(--color-on-surface);
3190
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
3231
+ box-shadow: var(--shadow-xs);
3191
3232
  }
3192
3233
 
3193
3234
  /* Tabs Lifted */
@@ -3239,7 +3280,7 @@ html {
3239
3280
  background-color: var(--color-surface);
3240
3281
  border: 1px solid var(--color-outline);
3241
3282
  border-radius: 0.5rem;
3242
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
3283
+ box-shadow: var(--shadow-lg);
3243
3284
  opacity: 0;
3244
3285
  visibility: hidden;
3245
3286
  transform: translateY(-0.5rem);
@@ -3523,7 +3564,7 @@ html {
3523
3564
  background-color: var(--color-surface);
3524
3565
  color: var(--color-on-surface);
3525
3566
  border-radius: 1rem;
3526
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
3567
+ box-shadow: var(--shadow-2xl);
3527
3568
  overflow-y: auto;
3528
3569
  transform: scale(0.95);
3529
3570
  transition: transform 200ms ease-out;
@@ -4787,7 +4828,7 @@ html {
4787
4828
  background-color: var(--color-surface);
4788
4829
  border: 1px solid var(--color-outline);
4789
4830
  border-radius: 0.5rem;
4790
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
4831
+ box-shadow: var(--shadow-lg);
4791
4832
  overflow-y: auto;
4792
4833
  opacity: 0;
4793
4834
  visibility: hidden;
@@ -5133,7 +5174,7 @@ html {
5133
5174
  background-color: var(--color-surface);
5134
5175
  border: 1px solid var(--color-outline-variant);
5135
5176
  border-radius: 0.5rem;
5136
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
5177
+ box-shadow: var(--shadow-md);
5137
5178
  overflow: hidden;
5138
5179
  }
5139
5180
 
@@ -5776,7 +5817,7 @@ html {
5776
5817
  background-color: var(--color-surface);
5777
5818
  border: 1px solid var(--color-outline);
5778
5819
  border-radius: 0.75rem;
5779
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
5820
+ box-shadow: var(--shadow-lg);
5780
5821
  opacity: 0;
5781
5822
  visibility: hidden;
5782
5823
  transform: translateY(-0.5rem);
@@ -5802,7 +5843,7 @@ html {
5802
5843
  background-color: var(--color-surface);
5803
5844
  border: 1px solid var(--color-outline);
5804
5845
  border-radius: 0.75rem;
5805
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
5846
+ box-shadow: var(--shadow-lg);
5806
5847
  }
5807
5848
 
5808
5849
  /* Calendar Header */
@@ -6688,7 +6729,7 @@ html {
6688
6729
  }
6689
6730
 
6690
6731
  .file-upload-button:hover {
6691
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
6732
+ box-shadow: var(--shadow-md);
6692
6733
  }
6693
6734
 
6694
6735
  .file-upload-button:focus-visible {
@@ -6871,7 +6912,7 @@ html {
6871
6912
  .fieldset-card {
6872
6913
  background-color: var(--color-surface);
6873
6914
  border-color: transparent;
6874
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
6915
+ box-shadow: var(--shadow-xs);
6875
6916
  padding: 1.5rem;
6876
6917
  }
6877
6918
 
@@ -7013,6 +7054,13 @@ html {
7013
7054
  border-color: var(--color-error);
7014
7055
  }
7015
7056
 
7057
+ .form-group-error .input:focus-visible,
7058
+ .form-group-error .select:focus-visible,
7059
+ .form-group-error .textarea:focus-visible {
7060
+ border-color: var(--color-error);
7061
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
7062
+ }
7063
+
7016
7064
  /* Success State on Form Group */
7017
7065
  .form-group-success .form-label {
7018
7066
  color: var(--color-success);
@@ -7024,6 +7072,31 @@ html {
7024
7072
  border-color: var(--color-success);
7025
7073
  }
7026
7074
 
7075
+ .form-group-success .input:focus-visible,
7076
+ .form-group-success .select:focus-visible,
7077
+ .form-group-success .textarea:focus-visible {
7078
+ border-color: var(--color-success);
7079
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
7080
+ }
7081
+
7082
+ /* Warning State on Form Group */
7083
+ .form-group-warning .form-label {
7084
+ color: var(--color-warning);
7085
+ }
7086
+
7087
+ .form-group-warning .input,
7088
+ .form-group-warning .select,
7089
+ .form-group-warning .textarea {
7090
+ border-color: var(--color-warning);
7091
+ }
7092
+
7093
+ .form-group-warning .input:focus-visible,
7094
+ .form-group-warning .select:focus-visible,
7095
+ .form-group-warning .textarea:focus-visible {
7096
+ border-color: var(--color-warning);
7097
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
7098
+ }
7099
+
7027
7100
  /* Disabled Form Group */
7028
7101
  .form-group-disabled {
7029
7102
  opacity: 0.5;
@@ -7224,7 +7297,7 @@ html {
7224
7297
  background-color: var(--color-surface);
7225
7298
  border: 1px solid var(--color-outline-variant);
7226
7299
  border-radius: 0.5rem;
7227
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
7300
+ box-shadow: var(--shadow-md);
7228
7301
  overflow: hidden;
7229
7302
  }
7230
7303
 
@@ -9674,6 +9747,288 @@ html {
9674
9747
  }
9675
9748
  }
9676
9749
 
9750
+ /**
9751
+ * Theme Controller Component Styles
9752
+ * DuskMoonUI - Two display modes for theme switching:
9753
+ *
9754
+ * 1. Switch (.theme-controller) — inline pill-shaped radio group, all options visible
9755
+ * 2. Dropdown (.theme-controller-dropdown) — <details>/<summary> with floating menu
9756
+ *
9757
+ * Both modes reuse .theme-controller-item (hidden radio) and .theme-controller-label
9758
+ * for CSS-only active state via :checked + label.
9759
+ */
9760
+
9761
+ @layer components {
9762
+ /* ========================================
9763
+ * SHARED — Radio input & label (used in both modes)
9764
+ * ======================================== */
9765
+
9766
+ /* Hidden Radio Input — visually hidden but accessible */
9767
+ .theme-controller-item {
9768
+ position: absolute;
9769
+ width: 1px;
9770
+ height: 1px;
9771
+ padding: 0;
9772
+ margin: -1px;
9773
+ overflow: hidden;
9774
+ clip: rect(0, 0, 0, 0);
9775
+ white-space: nowrap;
9776
+ border: 0;
9777
+ }
9778
+
9779
+ /* Visible Label — the clickable option */
9780
+ .theme-controller-label {
9781
+ display: inline-flex;
9782
+ align-items: center;
9783
+ justify-content: center;
9784
+ gap: 0.5rem;
9785
+ padding: 0.5rem 1rem;
9786
+ font-size: 0.875rem;
9787
+ font-weight: 500;
9788
+ line-height: 1.25rem;
9789
+ color: var(--color-on-surface-variant);
9790
+ background-color: transparent;
9791
+ border-radius: calc(var(--radius-box, 1.5rem) - 0.25rem);
9792
+ cursor: pointer;
9793
+ transition: background-color 150ms ease-in-out, color 150ms ease-in-out,
9794
+ box-shadow 150ms ease-in-out;
9795
+ user-select: none;
9796
+ white-space: nowrap;
9797
+ }
9798
+
9799
+ /* Hover state */
9800
+ .theme-controller-label:hover {
9801
+ background-color: var(--color-surface-container-high);
9802
+ }
9803
+
9804
+ /* Focus-visible ring on the label when its radio is focused */
9805
+ .theme-controller-item:focus-visible + .theme-controller-label {
9806
+ outline: 2px solid var(--color-primary);
9807
+ outline-offset: 2px;
9808
+ }
9809
+
9810
+ /* Active/checked state */
9811
+ .theme-controller-item:checked + .theme-controller-label {
9812
+ background-color: var(--color-primary-container);
9813
+ color: var(--color-on-primary-container);
9814
+ box-shadow: var(--shadow-xs);
9815
+ }
9816
+
9817
+ .theme-controller-item:checked + .theme-controller-label:hover {
9818
+ background-color: color-mix(in oklch, var(--color-primary-container), black 5%);
9819
+ }
9820
+
9821
+ /* ========================================
9822
+ * SWITCH MODE — inline pill radio group
9823
+ * ======================================== */
9824
+
9825
+ .theme-controller {
9826
+ display: inline-flex;
9827
+ align-items: stretch;
9828
+ background-color: var(--color-surface-container);
9829
+ border: 1px solid var(--color-outline-variant);
9830
+ border-radius: var(--radius-box, 1.5rem);
9831
+ padding: 0.25rem;
9832
+ gap: 0.125rem;
9833
+ }
9834
+
9835
+ /* ── Switch Size Variants ── */
9836
+
9837
+ .theme-controller-sm {
9838
+ padding: 0.125rem;
9839
+ border-radius: calc(var(--radius-box, 1.5rem) * 0.75);
9840
+ }
9841
+
9842
+ .theme-controller-sm .theme-controller-label {
9843
+ padding: 0.375rem 0.75rem;
9844
+ font-size: 0.75rem;
9845
+ line-height: 1rem;
9846
+ border-radius: calc(var(--radius-box, 1.5rem) * 0.75 - 0.125rem);
9847
+ }
9848
+
9849
+ .theme-controller-lg {
9850
+ padding: 0.375rem;
9851
+ gap: 0.25rem;
9852
+ border-radius: calc(var(--radius-box, 1.5rem) * 1.25);
9853
+ }
9854
+
9855
+ .theme-controller-lg .theme-controller-label {
9856
+ padding: 0.75rem 1.5rem;
9857
+ font-size: 1rem;
9858
+ line-height: 1.5rem;
9859
+ border-radius: calc(var(--radius-box, 1.5rem) * 1.25 - 0.375rem);
9860
+ }
9861
+
9862
+ /* ── Switch Icon-only Variant ── */
9863
+
9864
+ .theme-controller-icon .theme-controller-label {
9865
+ padding: 0.5rem;
9866
+ }
9867
+
9868
+ .theme-controller-icon.theme-controller-sm .theme-controller-label {
9869
+ padding: 0.375rem;
9870
+ }
9871
+
9872
+ .theme-controller-icon.theme-controller-lg .theme-controller-label {
9873
+ padding: 0.75rem;
9874
+ }
9875
+
9876
+ /* ========================================
9877
+ * DROPDOWN MODE — <details>/<summary> with floating menu
9878
+ * ======================================== */
9879
+
9880
+ .theme-controller-dropdown {
9881
+ position: relative;
9882
+ display: inline-block;
9883
+ }
9884
+
9885
+ /* Trigger button (<summary>) */
9886
+ .theme-controller-trigger {
9887
+ display: inline-flex;
9888
+ align-items: center;
9889
+ gap: 0.5rem;
9890
+ padding: 0.5rem 0.75rem;
9891
+ font-size: 0.875rem;
9892
+ font-weight: 500;
9893
+ line-height: 1.25rem;
9894
+ color: var(--color-on-surface);
9895
+ background-color: var(--color-surface-container);
9896
+ border: 1px solid var(--color-outline-variant);
9897
+ border-radius: var(--radius-field, 0.5rem);
9898
+ cursor: pointer;
9899
+ user-select: none;
9900
+ transition: background-color 150ms ease-in-out;
9901
+ list-style: none;
9902
+ }
9903
+
9904
+ .theme-controller-trigger::-webkit-details-marker {
9905
+ display: none;
9906
+ }
9907
+
9908
+ .theme-controller-trigger:hover {
9909
+ background-color: var(--color-surface-container-high);
9910
+ }
9911
+
9912
+ .theme-controller-trigger:focus-visible {
9913
+ outline: 2px solid var(--color-primary);
9914
+ outline-offset: 2px;
9915
+ }
9916
+
9917
+ /* Chevron indicator */
9918
+ .theme-controller-trigger::after {
9919
+ content: '';
9920
+ display: inline-block;
9921
+ width: 0.5rem;
9922
+ height: 0.5rem;
9923
+ border-right: 2px solid currentColor;
9924
+ border-bottom: 2px solid currentColor;
9925
+ transform: rotate(45deg);
9926
+ margin-top: -0.125rem;
9927
+ transition: transform 150ms ease-in-out;
9928
+ }
9929
+
9930
+ .theme-controller-dropdown[open] .theme-controller-trigger::after {
9931
+ transform: rotate(-135deg);
9932
+ margin-top: 0.125rem;
9933
+ }
9934
+
9935
+ /* Floating menu */
9936
+ .theme-controller-menu {
9937
+ position: absolute;
9938
+ top: calc(100% + 0.25rem);
9939
+ left: 0;
9940
+ z-index: 50;
9941
+ min-width: 100%;
9942
+ background-color: var(--color-surface-container);
9943
+ border: 1px solid var(--color-outline-variant);
9944
+ border-radius: var(--radius-field, 0.5rem);
9945
+ padding: 0.25rem;
9946
+ box-shadow: var(--shadow-md);
9947
+ display: flex;
9948
+ flex-direction: column;
9949
+ gap: 0.125rem;
9950
+ }
9951
+
9952
+ /* Menu labels are full-width and left-aligned */
9953
+ .theme-controller-menu .theme-controller-label {
9954
+ width: 100%;
9955
+ justify-content: flex-start;
9956
+ border-radius: calc(var(--radius-field, 0.5rem) - 0.25rem);
9957
+ }
9958
+
9959
+ /* ── Dropdown Size Variants ── */
9960
+
9961
+ .theme-controller-dropdown-sm .theme-controller-trigger {
9962
+ padding: 0.375rem 0.625rem;
9963
+ font-size: 0.75rem;
9964
+ line-height: 1rem;
9965
+ }
9966
+
9967
+ .theme-controller-dropdown-sm .theme-controller-menu {
9968
+ padding: 0.125rem;
9969
+ }
9970
+
9971
+ .theme-controller-dropdown-sm .theme-controller-menu .theme-controller-label {
9972
+ padding: 0.375rem 0.75rem;
9973
+ font-size: 0.75rem;
9974
+ line-height: 1rem;
9975
+ }
9976
+
9977
+ .theme-controller-dropdown-lg .theme-controller-trigger {
9978
+ padding: 0.75rem 1rem;
9979
+ font-size: 1rem;
9980
+ line-height: 1.5rem;
9981
+ }
9982
+
9983
+ .theme-controller-dropdown-lg .theme-controller-menu {
9984
+ padding: 0.375rem;
9985
+ }
9986
+
9987
+ .theme-controller-dropdown-lg .theme-controller-menu .theme-controller-label {
9988
+ padding: 0.75rem 1.5rem;
9989
+ font-size: 1rem;
9990
+ line-height: 1.5rem;
9991
+ }
9992
+
9993
+ /* ── Dropdown Icon-only Trigger ── */
9994
+
9995
+ .theme-controller-dropdown-icon .theme-controller-trigger {
9996
+ padding: 0.5rem;
9997
+ }
9998
+
9999
+ /* Hide chevron for icon-only trigger */
10000
+ .theme-controller-dropdown-icon .theme-controller-trigger::after {
10001
+ display: none;
10002
+ }
10003
+
10004
+ .theme-controller-dropdown-icon.theme-controller-dropdown-sm .theme-controller-trigger {
10005
+ padding: 0.375rem;
10006
+ }
10007
+
10008
+ .theme-controller-dropdown-icon.theme-controller-dropdown-lg .theme-controller-trigger {
10009
+ padding: 0.75rem;
10010
+ }
10011
+
10012
+ /* ── Dropdown Alignment ── */
10013
+
10014
+ .theme-controller-dropdown-end .theme-controller-menu {
10015
+ left: auto;
10016
+ right: 0;
10017
+ }
10018
+
10019
+ /* ========================================
10020
+ * REDUCED MOTION
10021
+ * ======================================== */
10022
+
10023
+ @media (prefers-reduced-motion: reduce) {
10024
+ .theme-controller-label,
10025
+ .theme-controller-trigger,
10026
+ .theme-controller-trigger::after {
10027
+ transition: none;
10028
+ }
10029
+ }
10030
+ }
10031
+
9677
10032
  /**
9678
10033
  * Toggle Button Component Styles
9679
10034
  * DuskMoonUI - Material Design 3 inspired toggle button
@@ -9841,7 +10196,7 @@ html {
9841
10196
  .toggle-segmented .toggle-btn.active {
9842
10197
  background-color: var(--color-surface-variant);
9843
10198
  border-color: transparent;
9844
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
10199
+ box-shadow: var(--shadow-sm);
9845
10200
  }
9846
10201
 
9847
10202
  /* Chip-like toggle */
@@ -10149,7 +10504,7 @@ html {
10149
10504
  background-color: var(--color-surface);
10150
10505
  border: 1px solid var(--color-outline-variant);
10151
10506
  border-radius: 0.5rem;
10152
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
10507
+ box-shadow: var(--shadow-md);
10153
10508
  }
10154
10509
 
10155
10510
  .time-picker-dropdown-open {
@@ -10340,7 +10695,7 @@ html {
10340
10695
  background-color: var(--color-surface);
10341
10696
  border: 1px solid var(--color-outline-variant);
10342
10697
  border-radius: 0.5rem;
10343
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
10698
+ box-shadow: var(--shadow-md);
10344
10699
  overflow-y: auto;
10345
10700
  }
10346
10701
 
@@ -10899,7 +11254,7 @@ html {
10899
11254
  background-color: var(--color-surface);
10900
11255
  color: var(--color-on-surface);
10901
11256
  border-radius: 1.5rem;
10902
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
11257
+ box-shadow: var(--shadow-2xl);
10903
11258
  overflow: hidden;
10904
11259
  }
10905
11260
 
@@ -11577,7 +11932,7 @@ html {
11577
11932
  background-color: var(--color-surface-container-highest);
11578
11933
  color: var(--color-on-surface);
11579
11934
  border-radius: 0.5rem;
11580
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
11935
+ box-shadow: var(--shadow-md);
11581
11936
  pointer-events: auto;
11582
11937
  opacity: 0;
11583
11938
  transform: translateY(100%);
@@ -11890,7 +12245,7 @@ html {
11890
12245
  color: var(--color-on-surface);
11891
12246
  border: 1px solid var(--color-outline);
11892
12247
  border-radius: 0.75rem;
11893
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
12248
+ box-shadow: var(--shadow-lg);
11894
12249
  pointer-events: auto;
11895
12250
  opacity: 0;
11896
12251
  transform: translateX(100%);
@@ -12098,7 +12453,7 @@ html {
12098
12453
  background-color: var(--color-on-surface);
12099
12454
  color: var(--color-surface);
12100
12455
  border-radius: 0.25rem;
12101
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
12456
+ box-shadow: var(--shadow-md);
12102
12457
  opacity: 0;
12103
12458
  visibility: hidden;
12104
12459
  transition: opacity 150ms ease-out, visibility 150ms ease-out;
@@ -12227,7 +12582,7 @@ html {
12227
12582
  background-color: var(--color-surface);
12228
12583
  color: var(--color-on-surface);
12229
12584
  border: 1px solid var(--color-outline);
12230
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
12585
+ box-shadow: var(--shadow-md);
12231
12586
  }
12232
12587
 
12233
12588
  .tooltip.tooltip-light .tooltip-content::before {
@@ -12380,7 +12735,7 @@ html {
12380
12735
  padding: 0 1rem;
12381
12736
  background-color: var(--color-surface);
12382
12737
  color: var(--color-on-surface);
12383
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
12738
+ box-shadow: var(--shadow-sm);
12384
12739
  }
12385
12740
 
12386
12741
  /* Static App Bar (default) */
@@ -12421,7 +12776,7 @@ html {
12421
12776
 
12422
12777
  /* App Bar with Shadow (elevated) */
12423
12778
  .appbar-elevated {
12424
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
12779
+ box-shadow: var(--shadow-sm);
12425
12780
  }
12426
12781
 
12427
12782
  /* Flat App Bar (no shadow) */
@@ -13441,7 +13796,7 @@ html {
13441
13796
  display: flex;
13442
13797
  flex-direction: column;
13443
13798
  background-color: var(--color-surface-container-low);
13444
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
13799
+ box-shadow: var(--shadow-2xl);
13445
13800
  transition: transform 300ms ease-out;
13446
13801
  }
13447
13802
 
@@ -13784,6 +14139,268 @@ html {
13784
14139
  }
13785
14140
  }
13786
14141
 
14142
+ /**
14143
+ * Nested Menu Component Styles
14144
+ * DuskMoonUI - Sidebar navigation with collapsible cascading levels via <details>/<summary>
14145
+ */
14146
+
14147
+ @layer components {
14148
+ /* ============================================
14149
+ * ROOT CONTAINER
14150
+ * ============================================ */
14151
+
14152
+ .nested-menu {
14153
+ display: flex;
14154
+ flex-direction: column;
14155
+ list-style: none;
14156
+ margin: 0;
14157
+ padding: 0.5rem;
14158
+ gap: 0.125rem;
14159
+ font-size: 0.875rem;
14160
+ color: var(--color-on-surface);
14161
+ }
14162
+
14163
+ /* ============================================
14164
+ * SECTION TITLES
14165
+ * ============================================ */
14166
+
14167
+ .nested-menu-title {
14168
+ padding: 0.75rem 0.75rem 0.25rem;
14169
+ font-size: 0.6875rem;
14170
+ font-weight: 600;
14171
+ text-transform: uppercase;
14172
+ letter-spacing: 0.05em;
14173
+ color: var(--color-on-surface-variant);
14174
+ user-select: none;
14175
+ }
14176
+
14177
+ /* ============================================
14178
+ * MENU ITEMS (links and buttons)
14179
+ * ============================================ */
14180
+
14181
+ .nested-menu li > a,
14182
+ .nested-menu li > button {
14183
+ display: flex;
14184
+ align-items: center;
14185
+ gap: 0.5rem;
14186
+ width: 100%;
14187
+ padding: 0.5rem 0.75rem;
14188
+ font-size: inherit;
14189
+ color: var(--color-on-surface);
14190
+ text-decoration: none;
14191
+ background-color: transparent;
14192
+ border: none;
14193
+ border-radius: var(--radius-field, 0.375rem);
14194
+ cursor: pointer;
14195
+ transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
14196
+ }
14197
+
14198
+ .nested-menu li > a:hover,
14199
+ .nested-menu li > button:hover {
14200
+ background-color: var(--color-surface-container);
14201
+ }
14202
+
14203
+ .nested-menu li > a:focus-visible,
14204
+ .nested-menu li > button:focus-visible {
14205
+ outline: 2px solid var(--color-primary);
14206
+ outline-offset: -2px;
14207
+ }
14208
+
14209
+ /* Active state */
14210
+ .nested-menu li > a.active,
14211
+ .nested-menu li > button.active,
14212
+ .nested-menu li > a[aria-current="page"],
14213
+ .nested-menu li > button[aria-current="page"] {
14214
+ background-color: var(--color-primary-container);
14215
+ color: var(--color-on-primary-container);
14216
+ }
14217
+
14218
+ .nested-menu li > a.active:hover,
14219
+ .nested-menu li > button.active:hover,
14220
+ .nested-menu li > a[aria-current="page"]:hover,
14221
+ .nested-menu li > button[aria-current="page"]:hover {
14222
+ background-color: color-mix(in oklch, var(--color-primary-container), var(--color-on-primary-container) 8%);
14223
+ }
14224
+
14225
+ /* Disabled state */
14226
+ .nested-menu li.disabled {
14227
+ opacity: 0.5;
14228
+ pointer-events: none;
14229
+ }
14230
+
14231
+ /* ============================================
14232
+ * COLLAPSIBLE SUBMENUS (<details>/<summary>)
14233
+ * ============================================ */
14234
+
14235
+ .nested-menu details {
14236
+ width: 100%;
14237
+ }
14238
+
14239
+ /* Remove native marker */
14240
+ .nested-menu summary {
14241
+ display: flex;
14242
+ align-items: center;
14243
+ gap: 0.5rem;
14244
+ width: 100%;
14245
+ padding: 0.5rem 0.75rem;
14246
+ font-size: inherit;
14247
+ color: var(--color-on-surface);
14248
+ background-color: transparent;
14249
+ border: none;
14250
+ border-radius: var(--radius-field, 0.375rem);
14251
+ cursor: pointer;
14252
+ list-style: none;
14253
+ transition: background-color 150ms ease-in-out;
14254
+ }
14255
+
14256
+ .nested-menu summary::-webkit-details-marker {
14257
+ display: none;
14258
+ }
14259
+
14260
+ .nested-menu summary::marker {
14261
+ display: none;
14262
+ content: "";
14263
+ }
14264
+
14265
+ .nested-menu summary:hover {
14266
+ background-color: var(--color-surface-container);
14267
+ }
14268
+
14269
+ .nested-menu summary:focus-visible {
14270
+ outline: 2px solid var(--color-primary);
14271
+ outline-offset: -2px;
14272
+ }
14273
+
14274
+ /* Chevron indicator */
14275
+ .nested-menu summary::after {
14276
+ content: "";
14277
+ display: inline-block;
14278
+ margin-left: auto;
14279
+ width: 0.375rem;
14280
+ height: 0.375rem;
14281
+ border-right: 1.5px solid currentColor;
14282
+ border-bottom: 1.5px solid currentColor;
14283
+ transform: rotate(-45deg);
14284
+ transition: transform 200ms ease-in-out;
14285
+ flex-shrink: 0;
14286
+ opacity: 0.6;
14287
+ }
14288
+
14289
+ .nested-menu details[open] > summary::after {
14290
+ transform: rotate(45deg);
14291
+ }
14292
+
14293
+ /* Nested <ul> inside details — auto-indentation */
14294
+ .nested-menu details > ul {
14295
+ list-style: none;
14296
+ margin: 0;
14297
+ padding: 0.125rem 0 0.125rem 1rem;
14298
+ display: flex;
14299
+ flex-direction: column;
14300
+ gap: 0.125rem;
14301
+ }
14302
+
14303
+ /* ============================================
14304
+ * SIZE VARIANTS
14305
+ * ============================================ */
14306
+
14307
+ .nested-menu-xs {
14308
+ font-size: 0.75rem;
14309
+ padding: 0.25rem;
14310
+ }
14311
+
14312
+ .nested-menu-xs li > a,
14313
+ .nested-menu-xs li > button,
14314
+ .nested-menu-xs summary {
14315
+ padding: 0.25rem 0.5rem;
14316
+ gap: 0.375rem;
14317
+ }
14318
+
14319
+ .nested-menu-xs .nested-menu-title {
14320
+ padding: 0.5rem 0.5rem 0.125rem;
14321
+ font-size: 0.625rem;
14322
+ }
14323
+
14324
+ .nested-menu-sm {
14325
+ font-size: 0.8125rem;
14326
+ padding: 0.375rem;
14327
+ }
14328
+
14329
+ .nested-menu-sm li > a,
14330
+ .nested-menu-sm li > button,
14331
+ .nested-menu-sm summary {
14332
+ padding: 0.375rem 0.625rem;
14333
+ gap: 0.375rem;
14334
+ }
14335
+
14336
+ .nested-menu-sm .nested-menu-title {
14337
+ padding: 0.625rem 0.625rem 0.1875rem;
14338
+ font-size: 0.625rem;
14339
+ }
14340
+
14341
+ .nested-menu-lg {
14342
+ font-size: 1rem;
14343
+ padding: 0.625rem;
14344
+ }
14345
+
14346
+ .nested-menu-lg li > a,
14347
+ .nested-menu-lg li > button,
14348
+ .nested-menu-lg summary {
14349
+ padding: 0.625rem 1rem;
14350
+ gap: 0.625rem;
14351
+ }
14352
+
14353
+ .nested-menu-lg .nested-menu-title {
14354
+ padding: 0.875rem 1rem 0.375rem;
14355
+ font-size: 0.75rem;
14356
+ }
14357
+
14358
+ /* ============================================
14359
+ * MODIFIER VARIANTS
14360
+ * ============================================ */
14361
+
14362
+ /* Bordered — sidebar panel look */
14363
+ .nested-menu-bordered {
14364
+ background-color: var(--color-surface);
14365
+ border: 1px solid var(--color-outline-variant);
14366
+ border-radius: var(--radius-card, 0.75rem);
14367
+ box-shadow: var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
14368
+ }
14369
+
14370
+ /* Compact — tighter padding throughout */
14371
+ .nested-menu-compact {
14372
+ padding: 0.25rem;
14373
+ gap: 0;
14374
+ }
14375
+
14376
+ .nested-menu-compact li > a,
14377
+ .nested-menu-compact li > button,
14378
+ .nested-menu-compact summary {
14379
+ padding: 0.3125rem 0.625rem;
14380
+ }
14381
+
14382
+ .nested-menu-compact .nested-menu-title {
14383
+ padding: 0.5rem 0.625rem 0.125rem;
14384
+ }
14385
+
14386
+ .nested-menu-compact details > ul {
14387
+ padding: 0 0 0 0.75rem;
14388
+ }
14389
+
14390
+ /* ============================================
14391
+ * REDUCED MOTION
14392
+ * ============================================ */
14393
+
14394
+ @media (prefers-reduced-motion: reduce) {
14395
+ .nested-menu li > a,
14396
+ .nested-menu li > button,
14397
+ .nested-menu summary,
14398
+ .nested-menu summary::after {
14399
+ transition: none;
14400
+ }
14401
+ }
14402
+ }
14403
+
13787
14404
  /**
13788
14405
  * Stepper Component Styles
13789
14406
  * DuskMoonUI - Material Design 3 inspired stepper/wizard system
@@ -14841,7 +15458,7 @@ html {
14841
15458
  border: 1px solid var(--color-outline-variant);
14842
15459
  border-radius: 0.75rem;
14843
15460
  overflow: hidden;
14844
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
15461
+ box-shadow: var(--shadow-sm);
14845
15462
  }
14846
15463
 
14847
15464
  .collapse-card .collapse-toggle,
@@ -15144,8 +15761,8 @@ html {
15144
15761
  */
15145
15762
 
15146
15763
  @layer components {
15147
- /* Popover Container */
15148
- .popover {
15764
+ /* Popover Container (class-based approach only, not native [popover]) */
15765
+ .popover:not([popover]) {
15149
15766
  position: relative;
15150
15767
  display: inline-block;
15151
15768
  }
@@ -15160,7 +15777,7 @@ html {
15160
15777
  background-color: var(--color-surface);
15161
15778
  border: 1px solid var(--color-outline-variant);
15162
15779
  border-radius: 0.75rem;
15163
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
15780
+ box-shadow: var(--shadow-lg);
15164
15781
  opacity: 0;
15165
15782
  visibility: hidden;
15166
15783
  transform: scale(0.95);
@@ -15195,7 +15812,7 @@ html {
15195
15812
  background-color: var(--color-surface);
15196
15813
  border: 1px solid var(--color-outline-variant);
15197
15814
  border-radius: 0.75rem;
15198
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
15815
+ box-shadow: var(--shadow-lg);
15199
15816
  opacity: 0;
15200
15817
  visibility: hidden;
15201
15818
  transition: opacity 150ms ease-out, visibility 150ms ease-out;
@@ -15649,7 +16266,7 @@ html {
15649
16266
  background-color: var(--color-surface);
15650
16267
  border: 1px solid var(--color-outline-variant);
15651
16268
  border-radius: 0.75rem;
15652
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
16269
+ box-shadow: var(--shadow-lg);
15653
16270
  opacity: 0;
15654
16271
  transform: scale(0.95);
15655
16272
  transition: opacity 150ms ease-out, transform 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
@@ -15791,53 +16408,65 @@ html {
15791
16408
  style="anchor-name: --my-popover" */
15792
16409
  }
15793
16410
 
15794
- /* Anchored popover positioning */
16411
+ /* Anchored popover positioning
16412
+ * Uses anchor() functions instead of position-area to avoid
16413
+ * a Chrome rendering bug at HiDPI (DPR>=2) where position-area
16414
+ * computes correct CSS-pixel offsets but renders at physical-pixel
16415
+ * coordinates, doubling the distance from the anchor. */
15795
16416
  .popover[popover][style*="position-anchor"] {
15796
- position: absolute;
15797
- position-area: bottom;
16417
+ inset: unset;
16418
+ top: anchor(bottom);
16419
+ justify-self: anchor-center;
15798
16420
  margin-top: 0.5rem;
15799
16421
  }
15800
16422
 
15801
16423
  /* Position variants for anchored popovers */
15802
16424
  .popover-top[popover][style*="position-anchor"] {
15803
- position-area: top;
16425
+ top: unset;
16426
+ bottom: anchor(top);
15804
16427
  margin-top: 0;
15805
16428
  margin-bottom: 0.5rem;
15806
16429
  }
15807
16430
 
15808
16431
  .popover-bottom[popover][style*="position-anchor"] {
15809
- position-area: bottom;
16432
+ top: anchor(bottom);
15810
16433
  margin-top: 0.5rem;
15811
16434
  margin-bottom: 0;
15812
16435
  }
15813
16436
 
15814
16437
  .popover-left[popover][style*="position-anchor"] {
15815
- position-area: left;
16438
+ top: anchor(center);
16439
+ right: anchor(left);
16440
+ justify-self: unset;
16441
+ translate: 0 -50%;
15816
16442
  margin-top: 0;
15817
16443
  margin-right: 0.5rem;
15818
16444
  }
15819
16445
 
15820
16446
  .popover-right[popover][style*="position-anchor"] {
15821
- position-area: right;
16447
+ top: anchor(center);
16448
+ left: anchor(right);
16449
+ justify-self: unset;
16450
+ translate: 0 -50%;
15822
16451
  margin-top: 0;
15823
16452
  margin-left: 0.5rem;
15824
16453
  }
15825
16454
 
15826
16455
  /* Anchored popover alignment variants */
15827
16456
  .popover-start[popover][style*="position-anchor"] {
15828
- position-area: bottom start;
16457
+ justify-self: start;
15829
16458
  }
15830
16459
 
15831
16460
  .popover-end[popover][style*="position-anchor"] {
15832
- position-area: bottom end;
16461
+ justify-self: end;
15833
16462
  }
15834
16463
 
15835
16464
  .popover-top.popover-start[popover][style*="position-anchor"] {
15836
- position-area: top start;
16465
+ justify-self: start;
15837
16466
  }
15838
16467
 
15839
16468
  .popover-top.popover-end[popover][style*="position-anchor"] {
15840
- position-area: top end;
16469
+ justify-self: end;
15841
16470
  }
15842
16471
 
15843
16472
  /* Reduce Motion */