@duskmoon-dev/core 1.19.5 → 1.19.6

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.
@@ -721,6 +721,308 @@
721
721
  }
722
722
 
723
723
 
724
+ /* Action composition components */
725
+ /**
726
+ * FAB / Speed Dial Component Styles
727
+ *
728
+ * FAB owns viewport placement and action layout. Pair its trigger and actions
729
+ * with Button classes for color, interaction, and disabled states.
730
+ */
731
+
732
+ @layer components {
733
+ .fab {
734
+ --fab-offset-block: 1rem;
735
+ --fab-offset-inline: 1rem;
736
+ --fab-gap: 0.75rem;
737
+ --fab-size: 3.5rem;
738
+
739
+ position: fixed;
740
+ inset-block-end: calc(var(--fab-offset-block) + env(safe-area-inset-bottom, 0px));
741
+ inset-inline-end: calc(var(--fab-offset-inline) + env(safe-area-inset-right, 0px));
742
+ z-index: 40;
743
+ display: inline-flex;
744
+ flex-direction: column-reverse;
745
+ align-items: flex-end;
746
+ gap: var(--fab-gap);
747
+ max-inline-size: calc(100dvw - 2 * var(--fab-offset-inline));
748
+ }
749
+
750
+ .fab-start {
751
+ inset-inline-start: calc(var(--fab-offset-inline) + env(safe-area-inset-left, 0px));
752
+ inset-inline-end: auto;
753
+ align-items: flex-start;
754
+ }
755
+
756
+ .fab-contained {
757
+ position: absolute;
758
+ }
759
+
760
+ .fab-speed-dial {
761
+ flex-direction: column-reverse;
762
+ }
763
+
764
+ .fab-trigger {
765
+ min-inline-size: var(--fab-size);
766
+ min-block-size: var(--fab-size);
767
+ padding: 0.875rem;
768
+ border-radius: var(--radius-lg);
769
+ box-shadow: var(--shadow-lg);
770
+ }
771
+
772
+ .fab-trigger:not(.fab-extended) {
773
+ inline-size: var(--fab-size);
774
+ block-size: var(--fab-size);
775
+ }
776
+
777
+ .fab-extended {
778
+ inline-size: auto;
779
+ max-inline-size: 100%;
780
+ min-block-size: var(--fab-size);
781
+ padding-inline: 1.25rem;
782
+ border-radius: var(--radius-lg);
783
+ }
784
+
785
+ .fab-actions {
786
+ align-items: flex-end;
787
+ flex-direction: column-reverse;
788
+ gap: var(--fab-gap);
789
+ max-inline-size: min(22rem, calc(100dvw - 2rem));
790
+ }
791
+
792
+ .fab-start .fab-actions {
793
+ align-items: flex-start;
794
+ }
795
+
796
+ /* Controlled mode: application code owns .fab-open and all ARIA state. */
797
+ .fab-controlled > .fab-actions:not([popover]) {
798
+ display: none;
799
+ }
800
+
801
+ .fab-controlled.fab-open > .fab-actions:not([popover]) {
802
+ display: flex;
803
+ }
804
+
805
+ /* Native mode: the browser's popover state is the sole authority. */
806
+ .fab-actions[popover] {
807
+ display: none;
808
+ position: fixed;
809
+ inset-block-start: auto;
810
+ inset-block-end: calc(
811
+ var(--fab-offset-block, 1rem) + env(safe-area-inset-bottom, 0px) +
812
+ var(--fab-size, 3.5rem) + var(--fab-gap, 0.75rem)
813
+ );
814
+ inset-inline-start: auto;
815
+ inset-inline-end: calc(var(--fab-offset-inline, 1rem) + env(safe-area-inset-right, 0px));
816
+ margin: 0;
817
+ padding: 0;
818
+ border: 0;
819
+ overflow: visible;
820
+ color: inherit;
821
+ background: transparent;
822
+ opacity: 0;
823
+ visibility: hidden;
824
+ pointer-events: none;
825
+ transform: translateY(0.5rem);
826
+ transition:
827
+ opacity 150ms ease-out,
828
+ transform 150ms ease-out,
829
+ overlay 150ms ease-out allow-discrete,
830
+ display 150ms ease-out allow-discrete;
831
+ }
832
+
833
+ .fab-start > .fab-actions[popover] {
834
+ inset-inline-start: calc(var(--fab-offset-inline, 1rem) + env(safe-area-inset-left, 0px));
835
+ inset-inline-end: auto;
836
+ }
837
+
838
+ .fab-actions[popover]:popover-open {
839
+ display: flex;
840
+ opacity: 1;
841
+ visibility: visible;
842
+ pointer-events: auto;
843
+ transform: translateY(0);
844
+ }
845
+
846
+ @starting-style {
847
+ .fab-actions[popover]:popover-open {
848
+ opacity: 0;
849
+ transform: translateY(0.5rem);
850
+ }
851
+ }
852
+
853
+ @supports (position-area: top) {
854
+ .fab-actions[popover] {
855
+ inset: auto;
856
+ margin: var(--fab-gap, 0.75rem);
857
+ position-area: top span-left;
858
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
859
+ }
860
+
861
+ .fab-start > .fab-actions[popover] {
862
+ inset: auto;
863
+ position-area: top span-right;
864
+ }
865
+ }
866
+
867
+ .fab-action {
868
+ display: inline-flex;
869
+ align-items: center;
870
+ justify-content: flex-end;
871
+ gap: 0.5rem;
872
+ max-inline-size: 100%;
873
+ }
874
+
875
+ .fab-start .fab-action {
876
+ flex-direction: row-reverse;
877
+ }
878
+
879
+ .fab-label {
880
+ max-inline-size: min(16rem, calc(100dvw - 6rem));
881
+ padding: 0.375rem 0.625rem;
882
+ overflow-wrap: anywhere;
883
+ color: var(--color-on-surface);
884
+ background-color: var(--color-surface-container-high);
885
+ border: 1px solid var(--color-outline-variant);
886
+ border-radius: var(--radius-sm);
887
+ box-shadow: var(--shadow-sm);
888
+ font-size: 0.8125rem;
889
+ font-weight: 500;
890
+ line-height: 1.125rem;
891
+ }
892
+
893
+ @media (max-width: 30rem) {
894
+ .fab {
895
+ --fab-offset-block: 0.75rem;
896
+ --fab-offset-inline: 0.75rem;
897
+ }
898
+ }
899
+
900
+ @media (prefers-reduced-motion: reduce) {
901
+ .fab-actions[popover] {
902
+ transition: none;
903
+ transform: none;
904
+ }
905
+ }
906
+ }
907
+
908
+ /**
909
+ * Swap Component Styles
910
+ * Displays one of two non-interactive state indicators.
911
+ */
912
+
913
+ @layer components {
914
+ .swap {
915
+ position: relative;
916
+ display: inline-grid;
917
+ place-items: center;
918
+ vertical-align: middle;
919
+ cursor: pointer;
920
+ user-select: none;
921
+ }
922
+
923
+ .swap-input {
924
+ position: absolute;
925
+ inset: 0;
926
+ z-index: 1;
927
+ width: 100%;
928
+ height: 100%;
929
+ margin: 0;
930
+ opacity: 0;
931
+ cursor: pointer;
932
+ }
933
+
934
+ .swap-on,
935
+ .swap-off {
936
+ grid-area: 1 / 1;
937
+ display: inline-flex;
938
+ align-items: center;
939
+ justify-content: center;
940
+ inline-size: max-content;
941
+ max-inline-size: 100%;
942
+ transition: opacity 150ms ease-out, transform 150ms ease-out;
943
+ }
944
+
945
+ .swap-on {
946
+ opacity: 0;
947
+ visibility: hidden;
948
+ pointer-events: none;
949
+ }
950
+
951
+ .swap-off {
952
+ opacity: 1;
953
+ visibility: visible;
954
+ pointer-events: none;
955
+ }
956
+
957
+ .swap-input:checked ~ .swap-on,
958
+ .swap[aria-pressed="true"] > .swap-on {
959
+ opacity: 1;
960
+ visibility: visible;
961
+ }
962
+
963
+ .swap-input:checked ~ .swap-off,
964
+ .swap[aria-pressed="true"] > .swap-off {
965
+ opacity: 0;
966
+ visibility: hidden;
967
+ }
968
+
969
+ .swap:focus-visible,
970
+ .swap:has(.swap-input:focus-visible) {
971
+ outline: none;
972
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
973
+ border-radius: var(--radius-sm);
974
+ }
975
+
976
+ .swap:disabled,
977
+ .swap:has(.swap-input:disabled) {
978
+ cursor: not-allowed;
979
+ opacity: 0.5;
980
+ }
981
+
982
+ .swap-input:disabled {
983
+ cursor: not-allowed;
984
+ }
985
+
986
+ .swap-rotate .swap-on {
987
+ transform: rotate(-90deg) scale(0.8);
988
+ }
989
+
990
+ .swap-rotate .swap-off {
991
+ transform: rotate(0deg) scale(1);
992
+ }
993
+
994
+ .swap-rotate .swap-input:checked ~ .swap-on,
995
+ .swap-rotate[aria-pressed="true"] > .swap-on {
996
+ transform: rotate(0deg) scale(1);
997
+ }
998
+
999
+ .swap-rotate .swap-input:checked ~ .swap-off,
1000
+ .swap-rotate[aria-pressed="true"] > .swap-off {
1001
+ transform: rotate(90deg) scale(0.8);
1002
+ }
1003
+
1004
+ /* Presentation-only override. It intentionally wins over semantic state. */
1005
+ .swap.swap-active > .swap-on {
1006
+ opacity: 1;
1007
+ visibility: visible;
1008
+ transform: rotate(0deg) scale(1);
1009
+ }
1010
+
1011
+ .swap.swap-active > .swap-off {
1012
+ opacity: 0;
1013
+ visibility: hidden;
1014
+ transform: rotate(90deg) scale(0.8);
1015
+ }
1016
+
1017
+ @media (prefers-reduced-motion: reduce) {
1018
+ .swap-on,
1019
+ .swap-off {
1020
+ transition: none;
1021
+ }
1022
+ }
1023
+ }
1024
+
1025
+
724
1026
  /* Card Component */
725
1027
  /**
726
1028
  * Card Component Styles
@@ -2825,12 +3127,106 @@
2825
3127
 
2826
3128
 
2827
3129
 
2828
- /* Navigation Component - includes navbar, menu, breadcrumbs, tabs, pagination, dropdown */
3130
+ /* Navigation Component - retains the legacy Dropdown import contract */
2829
3131
  /**
2830
3132
  * Navigation Component Styles
2831
3133
  * DuskMoonUI - Material Design 3 inspired navigation system
2832
3134
  */
2833
3135
 
3136
+ /* Preserve the Navigation entrypoint's published Dropdown coverage. */
3137
+ /**
3138
+ * Dropdown Component Styles
3139
+ * Native Popover disclosure with logical CSS anchor positioning.
3140
+ */
3141
+
3142
+ @layer components {
3143
+ .dropdown {
3144
+ position: relative;
3145
+ display: inline-block;
3146
+ }
3147
+
3148
+ .dropdown > .dropdown-content[popover] {
3149
+ display: none;
3150
+ position: fixed;
3151
+ inset-block-start: auto;
3152
+ inset-block-end: max(0.5rem, env(safe-area-inset-bottom, 0px));
3153
+ inset-inline-start: auto;
3154
+ inset-inline-end: max(
3155
+ 0.5rem,
3156
+ env(safe-area-inset-left, 0px),
3157
+ env(safe-area-inset-right, 0px)
3158
+ );
3159
+ z-index: 50;
3160
+ min-inline-size: 12rem;
3161
+ max-inline-size: min(24rem, calc(100dvw - 1rem));
3162
+ max-block-size: calc(100dvh - 1rem);
3163
+ margin: 0;
3164
+ padding: 0.5rem;
3165
+ overflow: auto;
3166
+ color: var(--color-on-surface);
3167
+ background-color: var(--color-surface);
3168
+ border: 1px solid var(--color-outline);
3169
+ border-radius: var(--radius-sm);
3170
+ box-shadow: var(--shadow-lg);
3171
+ opacity: 0;
3172
+ visibility: hidden;
3173
+ pointer-events: none;
3174
+ transform: translateY(-0.5rem);
3175
+ transition:
3176
+ opacity 150ms ease-out,
3177
+ transform 150ms ease-out,
3178
+ overlay 150ms ease-out allow-discrete,
3179
+ display 150ms ease-out allow-discrete;
3180
+ }
3181
+
3182
+ .dropdown > .dropdown-content[popover]:popover-open {
3183
+ display: block;
3184
+ opacity: 1;
3185
+ visibility: visible;
3186
+ pointer-events: auto;
3187
+ transform: translateY(0);
3188
+ }
3189
+
3190
+ @starting-style {
3191
+ .dropdown > .dropdown-content[popover]:popover-open {
3192
+ opacity: 0;
3193
+ transform: translateY(-0.5rem);
3194
+ }
3195
+ }
3196
+
3197
+ @supports (position-area: block-end) {
3198
+ .dropdown > .dropdown-content[popover] {
3199
+ inset: auto;
3200
+ margin: 0.25rem;
3201
+ position-area: block-end span-inline-end;
3202
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
3203
+ }
3204
+
3205
+ .dropdown.dropdown-block-start > .dropdown-content[popover] {
3206
+ position-area: block-start span-inline-end;
3207
+ }
3208
+
3209
+ .dropdown.dropdown-block-end > .dropdown-content[popover] {
3210
+ position-area: block-end span-inline-end;
3211
+ }
3212
+
3213
+ .dropdown.dropdown-inline-start > .dropdown-content[popover] {
3214
+ position-area: inline-start span-block-end;
3215
+ }
3216
+
3217
+ .dropdown.dropdown-inline-end > .dropdown-content[popover] {
3218
+ position-area: inline-end span-block-end;
3219
+ }
3220
+ }
3221
+
3222
+ @media (prefers-reduced-motion: reduce) {
3223
+ .dropdown > .dropdown-content[popover] {
3224
+ transition: none;
3225
+ }
3226
+ }
3227
+ }
3228
+
3229
+
2834
3230
  @layer components {
2835
3231
  /* Navbar Base */
2836
3232
  .navbar {
@@ -3417,60 +3813,6 @@
3417
3813
  font-size: 1rem;
3418
3814
  }
3419
3815
 
3420
- /* Dropdown */
3421
- .dropdown {
3422
- position: relative;
3423
- display: inline-block;
3424
- }
3425
-
3426
- .dropdown-content {
3427
- position: absolute;
3428
- z-index: 50;
3429
- min-width: 12rem;
3430
- padding: 0.5rem;
3431
- background-color: var(--color-surface);
3432
- border: 1px solid var(--color-outline);
3433
- border-radius: var(--radius-sm);
3434
- box-shadow: var(--shadow-lg);
3435
- opacity: 0;
3436
- visibility: hidden;
3437
- transform: translateY(-0.5rem);
3438
- transition: all 150ms ease-in-out;
3439
- }
3440
-
3441
- .dropdown:hover .dropdown-content,
3442
- .dropdown:focus-within .dropdown-content,
3443
- .dropdown.dropdown-open .dropdown-content {
3444
- opacity: 1;
3445
- visibility: visible;
3446
- transform: translateY(0);
3447
- }
3448
-
3449
- /* Dropdown Positions */
3450
- .dropdown-end .dropdown-content {
3451
- right: 0;
3452
- }
3453
-
3454
- .dropdown-top .dropdown-content {
3455
- bottom: 100%;
3456
- top: auto;
3457
- margin-bottom: 0.25rem;
3458
- }
3459
-
3460
- .dropdown-left .dropdown-content {
3461
- right: 100%;
3462
- left: auto;
3463
- top: 0;
3464
- margin-right: 0.25rem;
3465
- }
3466
-
3467
- .dropdown-right .dropdown-content {
3468
- left: 100%;
3469
- right: auto;
3470
- top: 0;
3471
- margin-left: 0.25rem;
3472
- }
3473
-
3474
3816
  /* Pagination */
3475
3817
  .pagination {
3476
3818
  display: flex;
@@ -3714,7 +4056,7 @@
3714
4056
  position: relative;
3715
4057
  z-index: 1;
3716
4058
  max-width: 32rem;
3717
- max-height: calc(100vh - 5rem);
4059
+ max-height: calc(100dvh - 5rem);
3718
4060
  padding: 1.5rem;
3719
4061
  background-color: var(--color-surface);
3720
4062
  color: var(--color-on-surface);
@@ -3749,6 +4091,7 @@
3749
4091
  .modal-action,
3750
4092
  .modal-footer {
3751
4093
  display: flex;
4094
+ flex-wrap: wrap;
3752
4095
  justify-content: flex-end;
3753
4096
  gap: 0.5rem;
3754
4097
  margin-top: 1.5rem;
@@ -3922,7 +4265,7 @@
3922
4265
 
3923
4266
  .modal-responsive .modal-box {
3924
4267
  max-width: 100%;
3925
- max-height: 90vh;
4268
+ max-height: 90dvh;
3926
4269
  margin: 0;
3927
4270
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
3928
4271
  }
@@ -3937,7 +4280,7 @@
3937
4280
 
3938
4281
  .drawer-modal .modal-box {
3939
4282
  max-width: 20rem;
3940
- max-height: 100vh;
4283
+ max-height: 100dvh;
3941
4284
  height: 100%;
3942
4285
  margin: 0;
3943
4286
  border-radius: 0;
@@ -12994,9 +13337,10 @@
12994
13337
  margin: auto;
12995
13338
  padding: 0;
12996
13339
  border: none;
12997
- width: 100%;
13340
+ width: calc(100% - 2rem);
12998
13341
  max-width: 28rem;
12999
- max-height: calc(100vh - 4rem);
13342
+ max-height: calc(100dvh - 2rem);
13343
+ box-sizing: border-box;
13000
13344
  background-color: var(--color-surface);
13001
13345
  color: var(--color-on-surface);
13002
13346
  border-radius: var(--radius-2xl);
@@ -13013,7 +13357,7 @@
13013
13357
  .dialog-box {
13014
13358
  display: flex;
13015
13359
  flex-direction: column;
13016
- max-height: calc(100vh - 4rem);
13360
+ max-height: calc(100dvh - 2rem);
13017
13361
  overflow: hidden;
13018
13362
  }
13019
13363
 
@@ -13072,6 +13416,7 @@
13072
13416
  /* Dialog Footer */
13073
13417
  .dialog-footer {
13074
13418
  display: flex;
13419
+ flex-wrap: wrap;
13075
13420
  justify-content: flex-end;
13076
13421
  gap: 0.5rem;
13077
13422
  padding: 1rem 1.5rem 1.5rem;
@@ -13111,6 +13456,30 @@
13111
13456
  margin: 0;
13112
13457
  }
13113
13458
 
13459
+ @media (max-width: 640px) {
13460
+ dialog.dialog {
13461
+ width: calc(100% - 1rem);
13462
+ max-height: calc(100dvh - 1rem);
13463
+ border-radius: var(--radius-lg);
13464
+ }
13465
+
13466
+ .dialog-box {
13467
+ max-height: calc(100dvh - 1rem);
13468
+ }
13469
+
13470
+ .dialog-header {
13471
+ padding: 1rem 1rem 0;
13472
+ }
13473
+
13474
+ .dialog-body {
13475
+ padding: 1rem;
13476
+ }
13477
+
13478
+ .dialog-footer {
13479
+ padding: 0.75rem 1rem 1rem;
13480
+ }
13481
+ }
13482
+
13114
13483
  dialog.dialog.dialog-fullscreen .dialog-box {
13115
13484
  max-height: 100%;
13116
13485
  }
@@ -30,7 +30,7 @@
30
30
  position: relative;
31
31
  z-index: 1;
32
32
  max-width: 32rem;
33
- max-height: calc(100vh - 5rem);
33
+ max-height: calc(100dvh - 5rem);
34
34
  padding: 1.5rem;
35
35
  background-color: var(--color-surface);
36
36
  color: var(--color-on-surface);
@@ -65,6 +65,7 @@
65
65
  .modal-action,
66
66
  .modal-footer {
67
67
  display: flex;
68
+ flex-wrap: wrap;
68
69
  justify-content: flex-end;
69
70
  gap: 0.5rem;
70
71
  margin-top: 1.5rem;
@@ -238,7 +239,7 @@
238
239
 
239
240
  .modal-responsive .modal-box {
240
241
  max-width: 100%;
241
- max-height: 90vh;
242
+ max-height: 90dvh;
242
243
  margin: 0;
243
244
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
244
245
  }
@@ -253,7 +254,7 @@
253
254
 
254
255
  .drawer-modal .modal-box {
255
256
  max-width: 20rem;
256
- max-height: 100vh;
257
+ max-height: 100dvh;
257
258
  height: 100%;
258
259
  margin: 0;
259
260
  border-radius: 0;