@duskmoon-dev/core 1.9.0 → 1.10.0

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 (48) hide show
  1. package/dist/components/appbar.css +2 -2
  2. package/dist/components/autocomplete.css +1 -1
  3. package/dist/components/card.css +4 -4
  4. package/dist/components/cascader.css +1 -1
  5. package/dist/components/collapse.css +1 -1
  6. package/dist/components/datepicker.css +2 -2
  7. package/dist/components/dialog.css +1 -1
  8. package/dist/components/drawer.css +1 -1
  9. package/dist/components/file-upload.css +1 -1
  10. package/dist/components/form-group.css +33 -1
  11. package/dist/components/index.css +349 -42
  12. package/dist/components/modal.css +1 -1
  13. package/dist/components/multi-select.css +1 -1
  14. package/dist/components/navigation.css +2 -2
  15. package/dist/components/nested-menu.css +261 -0
  16. package/dist/components/popover.css +28 -16
  17. package/dist/components/snackbar.css +1 -1
  18. package/dist/components/time-input.css +1 -1
  19. package/dist/components/toast.css +1 -1
  20. package/dist/components/tooltip.css +2 -2
  21. package/dist/components/tree-select.css +1 -1
  22. package/dist/esm/components/appbar.js +2 -2
  23. package/dist/esm/components/autocomplete.js +1 -1
  24. package/dist/esm/components/card.js +4 -4
  25. package/dist/esm/components/cascader.js +1 -1
  26. package/dist/esm/components/collapse.js +1 -1
  27. package/dist/esm/components/datepicker.js +2 -2
  28. package/dist/esm/components/dialog.js +1 -1
  29. package/dist/esm/components/drawer.js +1 -1
  30. package/dist/esm/components/file-upload.js +1 -1
  31. package/dist/esm/components/form-group.js +33 -1
  32. package/dist/esm/components/modal.js +1 -1
  33. package/dist/esm/components/multi-select.js +1 -1
  34. package/dist/esm/components/navigation.js +2 -2
  35. package/dist/esm/components/nested-menu.js +268 -0
  36. package/dist/esm/components/popover.js +28 -16
  37. package/dist/esm/components/snackbar.js +1 -1
  38. package/dist/esm/components/time-input.js +1 -1
  39. package/dist/esm/components/toast.js +1 -1
  40. package/dist/esm/components/tooltip.js +2 -2
  41. package/dist/esm/components/tree-select.js +1 -1
  42. package/dist/index.css +421 -73
  43. package/dist/index.min.css +1 -0
  44. package/dist/themes/moonlight.css +34 -16
  45. package/dist/themes/ocean.css +16 -7
  46. package/dist/themes/sunset.css +5 -4
  47. package/dist/themes/sunshine.css +6 -4
  48. package/package.json +1 -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,7 @@ html {
9674
9747
  }
9675
9748
  }
9676
9749
 
9750
+
9677
9751
  /**
9678
9752
  * Toggle Button Component Styles
9679
9753
  * DuskMoonUI - Material Design 3 inspired toggle button
@@ -9841,7 +9915,7 @@ html {
9841
9915
  .toggle-segmented .toggle-btn.active {
9842
9916
  background-color: var(--color-surface-variant);
9843
9917
  border-color: transparent;
9844
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
9918
+ box-shadow: var(--shadow-sm);
9845
9919
  }
9846
9920
 
9847
9921
  /* Chip-like toggle */
@@ -10149,7 +10223,7 @@ html {
10149
10223
  background-color: var(--color-surface);
10150
10224
  border: 1px solid var(--color-outline-variant);
10151
10225
  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);
10226
+ box-shadow: var(--shadow-md);
10153
10227
  }
10154
10228
 
10155
10229
  .time-picker-dropdown-open {
@@ -10340,7 +10414,7 @@ html {
10340
10414
  background-color: var(--color-surface);
10341
10415
  border: 1px solid var(--color-outline-variant);
10342
10416
  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);
10417
+ box-shadow: var(--shadow-md);
10344
10418
  overflow-y: auto;
10345
10419
  }
10346
10420
 
@@ -10899,7 +10973,7 @@ html {
10899
10973
  background-color: var(--color-surface);
10900
10974
  color: var(--color-on-surface);
10901
10975
  border-radius: 1.5rem;
10902
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
10976
+ box-shadow: var(--shadow-2xl);
10903
10977
  overflow: hidden;
10904
10978
  }
10905
10979
 
@@ -11577,7 +11651,7 @@ html {
11577
11651
  background-color: var(--color-surface-container-highest);
11578
11652
  color: var(--color-on-surface);
11579
11653
  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);
11654
+ box-shadow: var(--shadow-md);
11581
11655
  pointer-events: auto;
11582
11656
  opacity: 0;
11583
11657
  transform: translateY(100%);
@@ -11890,7 +11964,7 @@ html {
11890
11964
  color: var(--color-on-surface);
11891
11965
  border: 1px solid var(--color-outline);
11892
11966
  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);
11967
+ box-shadow: var(--shadow-lg);
11894
11968
  pointer-events: auto;
11895
11969
  opacity: 0;
11896
11970
  transform: translateX(100%);
@@ -12098,7 +12172,7 @@ html {
12098
12172
  background-color: var(--color-on-surface);
12099
12173
  color: var(--color-surface);
12100
12174
  border-radius: 0.25rem;
12101
- box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
12175
+ box-shadow: var(--shadow-md);
12102
12176
  opacity: 0;
12103
12177
  visibility: hidden;
12104
12178
  transition: opacity 150ms ease-out, visibility 150ms ease-out;
@@ -12227,7 +12301,7 @@ html {
12227
12301
  background-color: var(--color-surface);
12228
12302
  color: var(--color-on-surface);
12229
12303
  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);
12304
+ box-shadow: var(--shadow-md);
12231
12305
  }
12232
12306
 
12233
12307
  .tooltip.tooltip-light .tooltip-content::before {
@@ -12380,7 +12454,7 @@ html {
12380
12454
  padding: 0 1rem;
12381
12455
  background-color: var(--color-surface);
12382
12456
  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);
12457
+ box-shadow: var(--shadow-sm);
12384
12458
  }
12385
12459
 
12386
12460
  /* Static App Bar (default) */
@@ -12421,7 +12495,7 @@ html {
12421
12495
 
12422
12496
  /* App Bar with Shadow (elevated) */
12423
12497
  .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);
12498
+ box-shadow: var(--shadow-sm);
12425
12499
  }
12426
12500
 
12427
12501
  /* Flat App Bar (no shadow) */
@@ -13441,7 +13515,7 @@ html {
13441
13515
  display: flex;
13442
13516
  flex-direction: column;
13443
13517
  background-color: var(--color-surface-container-low);
13444
- box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
13518
+ box-shadow: var(--shadow-2xl);
13445
13519
  transition: transform 300ms ease-out;
13446
13520
  }
13447
13521
 
@@ -13784,6 +13858,268 @@ html {
13784
13858
  }
13785
13859
  }
13786
13860
 
13861
+ /**
13862
+ * Nested Menu Component Styles
13863
+ * DuskMoonUI - Sidebar navigation with collapsible cascading levels via <details>/<summary>
13864
+ */
13865
+
13866
+ @layer components {
13867
+ /* ============================================
13868
+ * ROOT CONTAINER
13869
+ * ============================================ */
13870
+
13871
+ .nested-menu {
13872
+ display: flex;
13873
+ flex-direction: column;
13874
+ list-style: none;
13875
+ margin: 0;
13876
+ padding: 0.5rem;
13877
+ gap: 0.125rem;
13878
+ font-size: 0.875rem;
13879
+ color: var(--color-on-surface);
13880
+ }
13881
+
13882
+ /* ============================================
13883
+ * SECTION TITLES
13884
+ * ============================================ */
13885
+
13886
+ .nested-menu-title {
13887
+ padding: 0.75rem 0.75rem 0.25rem;
13888
+ font-size: 0.6875rem;
13889
+ font-weight: 600;
13890
+ text-transform: uppercase;
13891
+ letter-spacing: 0.05em;
13892
+ color: var(--color-on-surface-variant);
13893
+ user-select: none;
13894
+ }
13895
+
13896
+ /* ============================================
13897
+ * MENU ITEMS (links and buttons)
13898
+ * ============================================ */
13899
+
13900
+ .nested-menu li > a,
13901
+ .nested-menu li > button {
13902
+ display: flex;
13903
+ align-items: center;
13904
+ gap: 0.5rem;
13905
+ width: 100%;
13906
+ padding: 0.5rem 0.75rem;
13907
+ font-size: inherit;
13908
+ color: var(--color-on-surface);
13909
+ text-decoration: none;
13910
+ background-color: transparent;
13911
+ border: none;
13912
+ border-radius: var(--radius-field, 0.375rem);
13913
+ cursor: pointer;
13914
+ transition: background-color 150ms ease-in-out, color 150ms ease-in-out;
13915
+ }
13916
+
13917
+ .nested-menu li > a:hover,
13918
+ .nested-menu li > button:hover {
13919
+ background-color: var(--color-surface-container);
13920
+ }
13921
+
13922
+ .nested-menu li > a:focus-visible,
13923
+ .nested-menu li > button:focus-visible {
13924
+ outline: 2px solid var(--color-primary);
13925
+ outline-offset: -2px;
13926
+ }
13927
+
13928
+ /* Active state */
13929
+ .nested-menu li > a.active,
13930
+ .nested-menu li > button.active,
13931
+ .nested-menu li > a[aria-current="page"],
13932
+ .nested-menu li > button[aria-current="page"] {
13933
+ background-color: var(--color-primary-container);
13934
+ color: var(--color-on-primary-container);
13935
+ }
13936
+
13937
+ .nested-menu li > a.active:hover,
13938
+ .nested-menu li > button.active:hover,
13939
+ .nested-menu li > a[aria-current="page"]:hover,
13940
+ .nested-menu li > button[aria-current="page"]:hover {
13941
+ background-color: color-mix(in oklch, var(--color-primary-container), var(--color-on-primary-container) 8%);
13942
+ }
13943
+
13944
+ /* Disabled state */
13945
+ .nested-menu li.disabled {
13946
+ opacity: 0.5;
13947
+ pointer-events: none;
13948
+ }
13949
+
13950
+ /* ============================================
13951
+ * COLLAPSIBLE SUBMENUS (<details>/<summary>)
13952
+ * ============================================ */
13953
+
13954
+ .nested-menu details {
13955
+ width: 100%;
13956
+ }
13957
+
13958
+ /* Remove native marker */
13959
+ .nested-menu summary {
13960
+ display: flex;
13961
+ align-items: center;
13962
+ gap: 0.5rem;
13963
+ width: 100%;
13964
+ padding: 0.5rem 0.75rem;
13965
+ font-size: inherit;
13966
+ color: var(--color-on-surface);
13967
+ background-color: transparent;
13968
+ border: none;
13969
+ border-radius: var(--radius-field, 0.375rem);
13970
+ cursor: pointer;
13971
+ list-style: none;
13972
+ transition: background-color 150ms ease-in-out;
13973
+ }
13974
+
13975
+ .nested-menu summary::-webkit-details-marker {
13976
+ display: none;
13977
+ }
13978
+
13979
+ .nested-menu summary::marker {
13980
+ display: none;
13981
+ content: "";
13982
+ }
13983
+
13984
+ .nested-menu summary:hover {
13985
+ background-color: var(--color-surface-container);
13986
+ }
13987
+
13988
+ .nested-menu summary:focus-visible {
13989
+ outline: 2px solid var(--color-primary);
13990
+ outline-offset: -2px;
13991
+ }
13992
+
13993
+ /* Chevron indicator */
13994
+ .nested-menu summary::after {
13995
+ content: "";
13996
+ display: inline-block;
13997
+ margin-left: auto;
13998
+ width: 0.375rem;
13999
+ height: 0.375rem;
14000
+ border-right: 1.5px solid currentColor;
14001
+ border-bottom: 1.5px solid currentColor;
14002
+ transform: rotate(-45deg);
14003
+ transition: transform 200ms ease-in-out;
14004
+ flex-shrink: 0;
14005
+ opacity: 0.6;
14006
+ }
14007
+
14008
+ .nested-menu details[open] > summary::after {
14009
+ transform: rotate(45deg);
14010
+ }
14011
+
14012
+ /* Nested <ul> inside details — auto-indentation */
14013
+ .nested-menu details > ul {
14014
+ list-style: none;
14015
+ margin: 0;
14016
+ padding: 0.125rem 0 0.125rem 1rem;
14017
+ display: flex;
14018
+ flex-direction: column;
14019
+ gap: 0.125rem;
14020
+ }
14021
+
14022
+ /* ============================================
14023
+ * SIZE VARIANTS
14024
+ * ============================================ */
14025
+
14026
+ .nested-menu-xs {
14027
+ font-size: 0.75rem;
14028
+ padding: 0.25rem;
14029
+ }
14030
+
14031
+ .nested-menu-xs li > a,
14032
+ .nested-menu-xs li > button,
14033
+ .nested-menu-xs summary {
14034
+ padding: 0.25rem 0.5rem;
14035
+ gap: 0.375rem;
14036
+ }
14037
+
14038
+ .nested-menu-xs .nested-menu-title {
14039
+ padding: 0.5rem 0.5rem 0.125rem;
14040
+ font-size: 0.625rem;
14041
+ }
14042
+
14043
+ .nested-menu-sm {
14044
+ font-size: 0.8125rem;
14045
+ padding: 0.375rem;
14046
+ }
14047
+
14048
+ .nested-menu-sm li > a,
14049
+ .nested-menu-sm li > button,
14050
+ .nested-menu-sm summary {
14051
+ padding: 0.375rem 0.625rem;
14052
+ gap: 0.375rem;
14053
+ }
14054
+
14055
+ .nested-menu-sm .nested-menu-title {
14056
+ padding: 0.625rem 0.625rem 0.1875rem;
14057
+ font-size: 0.625rem;
14058
+ }
14059
+
14060
+ .nested-menu-lg {
14061
+ font-size: 1rem;
14062
+ padding: 0.625rem;
14063
+ }
14064
+
14065
+ .nested-menu-lg li > a,
14066
+ .nested-menu-lg li > button,
14067
+ .nested-menu-lg summary {
14068
+ padding: 0.625rem 1rem;
14069
+ gap: 0.625rem;
14070
+ }
14071
+
14072
+ .nested-menu-lg .nested-menu-title {
14073
+ padding: 0.875rem 1rem 0.375rem;
14074
+ font-size: 0.75rem;
14075
+ }
14076
+
14077
+ /* ============================================
14078
+ * MODIFIER VARIANTS
14079
+ * ============================================ */
14080
+
14081
+ /* Bordered — sidebar panel look */
14082
+ .nested-menu-bordered {
14083
+ background-color: var(--color-surface);
14084
+ border: 1px solid var(--color-outline-variant);
14085
+ border-radius: var(--radius-card, 0.75rem);
14086
+ box-shadow: var(--shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));
14087
+ }
14088
+
14089
+ /* Compact — tighter padding throughout */
14090
+ .nested-menu-compact {
14091
+ padding: 0.25rem;
14092
+ gap: 0;
14093
+ }
14094
+
14095
+ .nested-menu-compact li > a,
14096
+ .nested-menu-compact li > button,
14097
+ .nested-menu-compact summary {
14098
+ padding: 0.3125rem 0.625rem;
14099
+ }
14100
+
14101
+ .nested-menu-compact .nested-menu-title {
14102
+ padding: 0.5rem 0.625rem 0.125rem;
14103
+ }
14104
+
14105
+ .nested-menu-compact details > ul {
14106
+ padding: 0 0 0 0.75rem;
14107
+ }
14108
+
14109
+ /* ============================================
14110
+ * REDUCED MOTION
14111
+ * ============================================ */
14112
+
14113
+ @media (prefers-reduced-motion: reduce) {
14114
+ .nested-menu li > a,
14115
+ .nested-menu li > button,
14116
+ .nested-menu summary,
14117
+ .nested-menu summary::after {
14118
+ transition: none;
14119
+ }
14120
+ }
14121
+ }
14122
+
13787
14123
  /**
13788
14124
  * Stepper Component Styles
13789
14125
  * DuskMoonUI - Material Design 3 inspired stepper/wizard system
@@ -14841,7 +15177,7 @@ html {
14841
15177
  border: 1px solid var(--color-outline-variant);
14842
15178
  border-radius: 0.75rem;
14843
15179
  overflow: hidden;
14844
- box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
15180
+ box-shadow: var(--shadow-sm);
14845
15181
  }
14846
15182
 
14847
15183
  .collapse-card .collapse-toggle,
@@ -15144,8 +15480,8 @@ html {
15144
15480
  */
15145
15481
 
15146
15482
  @layer components {
15147
- /* Popover Container */
15148
- .popover {
15483
+ /* Popover Container (class-based approach only, not native [popover]) */
15484
+ .popover:not([popover]) {
15149
15485
  position: relative;
15150
15486
  display: inline-block;
15151
15487
  }
@@ -15160,7 +15496,7 @@ html {
15160
15496
  background-color: var(--color-surface);
15161
15497
  border: 1px solid var(--color-outline-variant);
15162
15498
  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);
15499
+ box-shadow: var(--shadow-lg);
15164
15500
  opacity: 0;
15165
15501
  visibility: hidden;
15166
15502
  transform: scale(0.95);
@@ -15195,7 +15531,7 @@ html {
15195
15531
  background-color: var(--color-surface);
15196
15532
  border: 1px solid var(--color-outline-variant);
15197
15533
  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);
15534
+ box-shadow: var(--shadow-lg);
15199
15535
  opacity: 0;
15200
15536
  visibility: hidden;
15201
15537
  transition: opacity 150ms ease-out, visibility 150ms ease-out;
@@ -15649,7 +15985,7 @@ html {
15649
15985
  background-color: var(--color-surface);
15650
15986
  border: 1px solid var(--color-outline-variant);
15651
15987
  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);
15988
+ box-shadow: var(--shadow-lg);
15653
15989
  opacity: 0;
15654
15990
  transform: scale(0.95);
15655
15991
  transition: opacity 150ms ease-out, transform 150ms ease-out, overlay 150ms ease-out allow-discrete, display 150ms ease-out allow-discrete;
@@ -15791,53 +16127,65 @@ html {
15791
16127
  style="anchor-name: --my-popover" */
15792
16128
  }
15793
16129
 
15794
- /* Anchored popover positioning */
16130
+ /* Anchored popover positioning
16131
+ * Uses anchor() functions instead of position-area to avoid
16132
+ * a Chrome rendering bug at HiDPI (DPR>=2) where position-area
16133
+ * computes correct CSS-pixel offsets but renders at physical-pixel
16134
+ * coordinates, doubling the distance from the anchor. */
15795
16135
  .popover[popover][style*="position-anchor"] {
15796
- position: absolute;
15797
- position-area: bottom;
16136
+ inset: unset;
16137
+ top: anchor(bottom);
16138
+ justify-self: anchor-center;
15798
16139
  margin-top: 0.5rem;
15799
16140
  }
15800
16141
 
15801
16142
  /* Position variants for anchored popovers */
15802
16143
  .popover-top[popover][style*="position-anchor"] {
15803
- position-area: top;
16144
+ top: unset;
16145
+ bottom: anchor(top);
15804
16146
  margin-top: 0;
15805
16147
  margin-bottom: 0.5rem;
15806
16148
  }
15807
16149
 
15808
16150
  .popover-bottom[popover][style*="position-anchor"] {
15809
- position-area: bottom;
16151
+ top: anchor(bottom);
15810
16152
  margin-top: 0.5rem;
15811
16153
  margin-bottom: 0;
15812
16154
  }
15813
16155
 
15814
16156
  .popover-left[popover][style*="position-anchor"] {
15815
- position-area: left;
16157
+ top: anchor(center);
16158
+ right: anchor(left);
16159
+ justify-self: unset;
16160
+ translate: 0 -50%;
15816
16161
  margin-top: 0;
15817
16162
  margin-right: 0.5rem;
15818
16163
  }
15819
16164
 
15820
16165
  .popover-right[popover][style*="position-anchor"] {
15821
- position-area: right;
16166
+ top: anchor(center);
16167
+ left: anchor(right);
16168
+ justify-self: unset;
16169
+ translate: 0 -50%;
15822
16170
  margin-top: 0;
15823
16171
  margin-left: 0.5rem;
15824
16172
  }
15825
16173
 
15826
16174
  /* Anchored popover alignment variants */
15827
16175
  .popover-start[popover][style*="position-anchor"] {
15828
- position-area: bottom start;
16176
+ justify-self: start;
15829
16177
  }
15830
16178
 
15831
16179
  .popover-end[popover][style*="position-anchor"] {
15832
- position-area: bottom end;
16180
+ justify-self: end;
15833
16181
  }
15834
16182
 
15835
16183
  .popover-top.popover-start[popover][style*="position-anchor"] {
15836
- position-area: top start;
16184
+ justify-self: start;
15837
16185
  }
15838
16186
 
15839
16187
  .popover-top.popover-end[popover][style*="position-anchor"] {
15840
- position-area: top end;
16188
+ justify-self: end;
15841
16189
  }
15842
16190
 
15843
16191
  /* Reduce Motion */