@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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @duskmoon-dev/core v1.19.5
2
+ * @duskmoon-dev/core v1.19.6
3
3
  * Built-in DuskMoonUI themes
4
4
  * https://github.com/duskmoon-dev/duskmoonui
5
5
  * @license MIT
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @duskmoon-dev/core v1.19.5
3
- * @duskmoon-dev/css-art v1.19.5
2
+ * @duskmoon-dev/core v1.19.6
3
+ * @duskmoon-dev/css-art v1.19.6
4
4
  * Complete standalone DuskMoonUI styles
5
5
  * https://github.com/duskmoon-dev/duskmoonui
6
6
  * @license MIT
@@ -1695,6 +1695,308 @@ html {
1695
1695
  }
1696
1696
 
1697
1697
 
1698
+ /* Action composition components */
1699
+ /**
1700
+ * FAB / Speed Dial Component Styles
1701
+ *
1702
+ * FAB owns viewport placement and action layout. Pair its trigger and actions
1703
+ * with Button classes for color, interaction, and disabled states.
1704
+ */
1705
+
1706
+ @layer components {
1707
+ .fab {
1708
+ --fab-offset-block: 1rem;
1709
+ --fab-offset-inline: 1rem;
1710
+ --fab-gap: 0.75rem;
1711
+ --fab-size: 3.5rem;
1712
+
1713
+ position: fixed;
1714
+ inset-block-end: calc(var(--fab-offset-block) + env(safe-area-inset-bottom, 0px));
1715
+ inset-inline-end: calc(var(--fab-offset-inline) + env(safe-area-inset-right, 0px));
1716
+ z-index: 40;
1717
+ display: inline-flex;
1718
+ flex-direction: column-reverse;
1719
+ align-items: flex-end;
1720
+ gap: var(--fab-gap);
1721
+ max-inline-size: calc(100dvw - 2 * var(--fab-offset-inline));
1722
+ }
1723
+
1724
+ .fab-start {
1725
+ inset-inline-start: calc(var(--fab-offset-inline) + env(safe-area-inset-left, 0px));
1726
+ inset-inline-end: auto;
1727
+ align-items: flex-start;
1728
+ }
1729
+
1730
+ .fab-contained {
1731
+ position: absolute;
1732
+ }
1733
+
1734
+ .fab-speed-dial {
1735
+ flex-direction: column-reverse;
1736
+ }
1737
+
1738
+ .fab-trigger {
1739
+ min-inline-size: var(--fab-size);
1740
+ min-block-size: var(--fab-size);
1741
+ padding: 0.875rem;
1742
+ border-radius: var(--radius-lg);
1743
+ box-shadow: var(--shadow-lg);
1744
+ }
1745
+
1746
+ .fab-trigger:not(.fab-extended) {
1747
+ inline-size: var(--fab-size);
1748
+ block-size: var(--fab-size);
1749
+ }
1750
+
1751
+ .fab-extended {
1752
+ inline-size: auto;
1753
+ max-inline-size: 100%;
1754
+ min-block-size: var(--fab-size);
1755
+ padding-inline: 1.25rem;
1756
+ border-radius: var(--radius-lg);
1757
+ }
1758
+
1759
+ .fab-actions {
1760
+ align-items: flex-end;
1761
+ flex-direction: column-reverse;
1762
+ gap: var(--fab-gap);
1763
+ max-inline-size: min(22rem, calc(100dvw - 2rem));
1764
+ }
1765
+
1766
+ .fab-start .fab-actions {
1767
+ align-items: flex-start;
1768
+ }
1769
+
1770
+ /* Controlled mode: application code owns .fab-open and all ARIA state. */
1771
+ .fab-controlled > .fab-actions:not([popover]) {
1772
+ display: none;
1773
+ }
1774
+
1775
+ .fab-controlled.fab-open > .fab-actions:not([popover]) {
1776
+ display: flex;
1777
+ }
1778
+
1779
+ /* Native mode: the browser's popover state is the sole authority. */
1780
+ .fab-actions[popover] {
1781
+ display: none;
1782
+ position: fixed;
1783
+ inset-block-start: auto;
1784
+ inset-block-end: calc(
1785
+ var(--fab-offset-block, 1rem) + env(safe-area-inset-bottom, 0px) +
1786
+ var(--fab-size, 3.5rem) + var(--fab-gap, 0.75rem)
1787
+ );
1788
+ inset-inline-start: auto;
1789
+ inset-inline-end: calc(var(--fab-offset-inline, 1rem) + env(safe-area-inset-right, 0px));
1790
+ margin: 0;
1791
+ padding: 0;
1792
+ border: 0;
1793
+ overflow: visible;
1794
+ color: inherit;
1795
+ background: transparent;
1796
+ opacity: 0;
1797
+ visibility: hidden;
1798
+ pointer-events: none;
1799
+ transform: translateY(0.5rem);
1800
+ transition:
1801
+ opacity 150ms ease-out,
1802
+ transform 150ms ease-out,
1803
+ overlay 150ms ease-out allow-discrete,
1804
+ display 150ms ease-out allow-discrete;
1805
+ }
1806
+
1807
+ .fab-start > .fab-actions[popover] {
1808
+ inset-inline-start: calc(var(--fab-offset-inline, 1rem) + env(safe-area-inset-left, 0px));
1809
+ inset-inline-end: auto;
1810
+ }
1811
+
1812
+ .fab-actions[popover]:popover-open {
1813
+ display: flex;
1814
+ opacity: 1;
1815
+ visibility: visible;
1816
+ pointer-events: auto;
1817
+ transform: translateY(0);
1818
+ }
1819
+
1820
+ @starting-style {
1821
+ .fab-actions[popover]:popover-open {
1822
+ opacity: 0;
1823
+ transform: translateY(0.5rem);
1824
+ }
1825
+ }
1826
+
1827
+ @supports (position-area: top) {
1828
+ .fab-actions[popover] {
1829
+ inset: auto;
1830
+ margin: var(--fab-gap, 0.75rem);
1831
+ position-area: top span-left;
1832
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
1833
+ }
1834
+
1835
+ .fab-start > .fab-actions[popover] {
1836
+ inset: auto;
1837
+ position-area: top span-right;
1838
+ }
1839
+ }
1840
+
1841
+ .fab-action {
1842
+ display: inline-flex;
1843
+ align-items: center;
1844
+ justify-content: flex-end;
1845
+ gap: 0.5rem;
1846
+ max-inline-size: 100%;
1847
+ }
1848
+
1849
+ .fab-start .fab-action {
1850
+ flex-direction: row-reverse;
1851
+ }
1852
+
1853
+ .fab-label {
1854
+ max-inline-size: min(16rem, calc(100dvw - 6rem));
1855
+ padding: 0.375rem 0.625rem;
1856
+ overflow-wrap: anywhere;
1857
+ color: var(--color-on-surface);
1858
+ background-color: var(--color-surface-container-high);
1859
+ border: 1px solid var(--color-outline-variant);
1860
+ border-radius: var(--radius-sm);
1861
+ box-shadow: var(--shadow-sm);
1862
+ font-size: 0.8125rem;
1863
+ font-weight: 500;
1864
+ line-height: 1.125rem;
1865
+ }
1866
+
1867
+ @media (max-width: 30rem) {
1868
+ .fab {
1869
+ --fab-offset-block: 0.75rem;
1870
+ --fab-offset-inline: 0.75rem;
1871
+ }
1872
+ }
1873
+
1874
+ @media (prefers-reduced-motion: reduce) {
1875
+ .fab-actions[popover] {
1876
+ transition: none;
1877
+ transform: none;
1878
+ }
1879
+ }
1880
+ }
1881
+
1882
+ /**
1883
+ * Swap Component Styles
1884
+ * Displays one of two non-interactive state indicators.
1885
+ */
1886
+
1887
+ @layer components {
1888
+ .swap {
1889
+ position: relative;
1890
+ display: inline-grid;
1891
+ place-items: center;
1892
+ vertical-align: middle;
1893
+ cursor: pointer;
1894
+ user-select: none;
1895
+ }
1896
+
1897
+ .swap-input {
1898
+ position: absolute;
1899
+ inset: 0;
1900
+ z-index: 1;
1901
+ width: 100%;
1902
+ height: 100%;
1903
+ margin: 0;
1904
+ opacity: 0;
1905
+ cursor: pointer;
1906
+ }
1907
+
1908
+ .swap-on,
1909
+ .swap-off {
1910
+ grid-area: 1 / 1;
1911
+ display: inline-flex;
1912
+ align-items: center;
1913
+ justify-content: center;
1914
+ inline-size: max-content;
1915
+ max-inline-size: 100%;
1916
+ transition: opacity 150ms ease-out, transform 150ms ease-out;
1917
+ }
1918
+
1919
+ .swap-on {
1920
+ opacity: 0;
1921
+ visibility: hidden;
1922
+ pointer-events: none;
1923
+ }
1924
+
1925
+ .swap-off {
1926
+ opacity: 1;
1927
+ visibility: visible;
1928
+ pointer-events: none;
1929
+ }
1930
+
1931
+ .swap-input:checked ~ .swap-on,
1932
+ .swap[aria-pressed="true"] > .swap-on {
1933
+ opacity: 1;
1934
+ visibility: visible;
1935
+ }
1936
+
1937
+ .swap-input:checked ~ .swap-off,
1938
+ .swap[aria-pressed="true"] > .swap-off {
1939
+ opacity: 0;
1940
+ visibility: hidden;
1941
+ }
1942
+
1943
+ .swap:focus-visible,
1944
+ .swap:has(.swap-input:focus-visible) {
1945
+ outline: none;
1946
+ box-shadow: 0 0 0 3px color-mix(in oklch, currentColor 20%, transparent);
1947
+ border-radius: var(--radius-sm);
1948
+ }
1949
+
1950
+ .swap:disabled,
1951
+ .swap:has(.swap-input:disabled) {
1952
+ cursor: not-allowed;
1953
+ opacity: 0.5;
1954
+ }
1955
+
1956
+ .swap-input:disabled {
1957
+ cursor: not-allowed;
1958
+ }
1959
+
1960
+ .swap-rotate .swap-on {
1961
+ transform: rotate(-90deg) scale(0.8);
1962
+ }
1963
+
1964
+ .swap-rotate .swap-off {
1965
+ transform: rotate(0deg) scale(1);
1966
+ }
1967
+
1968
+ .swap-rotate .swap-input:checked ~ .swap-on,
1969
+ .swap-rotate[aria-pressed="true"] > .swap-on {
1970
+ transform: rotate(0deg) scale(1);
1971
+ }
1972
+
1973
+ .swap-rotate .swap-input:checked ~ .swap-off,
1974
+ .swap-rotate[aria-pressed="true"] > .swap-off {
1975
+ transform: rotate(90deg) scale(0.8);
1976
+ }
1977
+
1978
+ /* Presentation-only override. It intentionally wins over semantic state. */
1979
+ .swap.swap-active > .swap-on {
1980
+ opacity: 1;
1981
+ visibility: visible;
1982
+ transform: rotate(0deg) scale(1);
1983
+ }
1984
+
1985
+ .swap.swap-active > .swap-off {
1986
+ opacity: 0;
1987
+ visibility: hidden;
1988
+ transform: rotate(90deg) scale(0.8);
1989
+ }
1990
+
1991
+ @media (prefers-reduced-motion: reduce) {
1992
+ .swap-on,
1993
+ .swap-off {
1994
+ transition: none;
1995
+ }
1996
+ }
1997
+ }
1998
+
1999
+
1698
2000
  /* Card Component */
1699
2001
  /**
1700
2002
  * Card Component Styles
@@ -3799,12 +4101,106 @@ html {
3799
4101
 
3800
4102
 
3801
4103
 
3802
- /* Navigation Component - includes navbar, menu, breadcrumbs, tabs, pagination, dropdown */
4104
+ /* Navigation Component - retains the legacy Dropdown import contract */
3803
4105
  /**
3804
4106
  * Navigation Component Styles
3805
4107
  * DuskMoonUI - Material Design 3 inspired navigation system
3806
4108
  */
3807
4109
 
4110
+ /* Preserve the Navigation entrypoint's published Dropdown coverage. */
4111
+ /**
4112
+ * Dropdown Component Styles
4113
+ * Native Popover disclosure with logical CSS anchor positioning.
4114
+ */
4115
+
4116
+ @layer components {
4117
+ .dropdown {
4118
+ position: relative;
4119
+ display: inline-block;
4120
+ }
4121
+
4122
+ .dropdown > .dropdown-content[popover] {
4123
+ display: none;
4124
+ position: fixed;
4125
+ inset-block-start: auto;
4126
+ inset-block-end: max(0.5rem, env(safe-area-inset-bottom, 0px));
4127
+ inset-inline-start: auto;
4128
+ inset-inline-end: max(
4129
+ 0.5rem,
4130
+ env(safe-area-inset-left, 0px),
4131
+ env(safe-area-inset-right, 0px)
4132
+ );
4133
+ z-index: 50;
4134
+ min-inline-size: 12rem;
4135
+ max-inline-size: min(24rem, calc(100dvw - 1rem));
4136
+ max-block-size: calc(100dvh - 1rem);
4137
+ margin: 0;
4138
+ padding: 0.5rem;
4139
+ overflow: auto;
4140
+ color: var(--color-on-surface);
4141
+ background-color: var(--color-surface);
4142
+ border: 1px solid var(--color-outline);
4143
+ border-radius: var(--radius-sm);
4144
+ box-shadow: var(--shadow-lg);
4145
+ opacity: 0;
4146
+ visibility: hidden;
4147
+ pointer-events: none;
4148
+ transform: translateY(-0.5rem);
4149
+ transition:
4150
+ opacity 150ms ease-out,
4151
+ transform 150ms ease-out,
4152
+ overlay 150ms ease-out allow-discrete,
4153
+ display 150ms ease-out allow-discrete;
4154
+ }
4155
+
4156
+ .dropdown > .dropdown-content[popover]:popover-open {
4157
+ display: block;
4158
+ opacity: 1;
4159
+ visibility: visible;
4160
+ pointer-events: auto;
4161
+ transform: translateY(0);
4162
+ }
4163
+
4164
+ @starting-style {
4165
+ .dropdown > .dropdown-content[popover]:popover-open {
4166
+ opacity: 0;
4167
+ transform: translateY(-0.5rem);
4168
+ }
4169
+ }
4170
+
4171
+ @supports (position-area: block-end) {
4172
+ .dropdown > .dropdown-content[popover] {
4173
+ inset: auto;
4174
+ margin: 0.25rem;
4175
+ position-area: block-end span-inline-end;
4176
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
4177
+ }
4178
+
4179
+ .dropdown.dropdown-block-start > .dropdown-content[popover] {
4180
+ position-area: block-start span-inline-end;
4181
+ }
4182
+
4183
+ .dropdown.dropdown-block-end > .dropdown-content[popover] {
4184
+ position-area: block-end span-inline-end;
4185
+ }
4186
+
4187
+ .dropdown.dropdown-inline-start > .dropdown-content[popover] {
4188
+ position-area: inline-start span-block-end;
4189
+ }
4190
+
4191
+ .dropdown.dropdown-inline-end > .dropdown-content[popover] {
4192
+ position-area: inline-end span-block-end;
4193
+ }
4194
+ }
4195
+
4196
+ @media (prefers-reduced-motion: reduce) {
4197
+ .dropdown > .dropdown-content[popover] {
4198
+ transition: none;
4199
+ }
4200
+ }
4201
+ }
4202
+
4203
+
3808
4204
  @layer components {
3809
4205
  /* Navbar Base */
3810
4206
  .navbar {
@@ -4391,60 +4787,6 @@ html {
4391
4787
  font-size: 1rem;
4392
4788
  }
4393
4789
 
4394
- /* Dropdown */
4395
- .dropdown {
4396
- position: relative;
4397
- display: inline-block;
4398
- }
4399
-
4400
- .dropdown-content {
4401
- position: absolute;
4402
- z-index: 50;
4403
- min-width: 12rem;
4404
- padding: 0.5rem;
4405
- background-color: var(--color-surface);
4406
- border: 1px solid var(--color-outline);
4407
- border-radius: var(--radius-sm);
4408
- box-shadow: var(--shadow-lg);
4409
- opacity: 0;
4410
- visibility: hidden;
4411
- transform: translateY(-0.5rem);
4412
- transition: all 150ms ease-in-out;
4413
- }
4414
-
4415
- .dropdown:hover .dropdown-content,
4416
- .dropdown:focus-within .dropdown-content,
4417
- .dropdown.dropdown-open .dropdown-content {
4418
- opacity: 1;
4419
- visibility: visible;
4420
- transform: translateY(0);
4421
- }
4422
-
4423
- /* Dropdown Positions */
4424
- .dropdown-end .dropdown-content {
4425
- right: 0;
4426
- }
4427
-
4428
- .dropdown-top .dropdown-content {
4429
- bottom: 100%;
4430
- top: auto;
4431
- margin-bottom: 0.25rem;
4432
- }
4433
-
4434
- .dropdown-left .dropdown-content {
4435
- right: 100%;
4436
- left: auto;
4437
- top: 0;
4438
- margin-right: 0.25rem;
4439
- }
4440
-
4441
- .dropdown-right .dropdown-content {
4442
- left: 100%;
4443
- right: auto;
4444
- top: 0;
4445
- margin-left: 0.25rem;
4446
- }
4447
-
4448
4790
  /* Pagination */
4449
4791
  .pagination {
4450
4792
  display: flex;
@@ -4688,7 +5030,7 @@ html {
4688
5030
  position: relative;
4689
5031
  z-index: 1;
4690
5032
  max-width: 32rem;
4691
- max-height: calc(100vh - 5rem);
5033
+ max-height: calc(100dvh - 5rem);
4692
5034
  padding: 1.5rem;
4693
5035
  background-color: var(--color-surface);
4694
5036
  color: var(--color-on-surface);
@@ -4723,6 +5065,7 @@ html {
4723
5065
  .modal-action,
4724
5066
  .modal-footer {
4725
5067
  display: flex;
5068
+ flex-wrap: wrap;
4726
5069
  justify-content: flex-end;
4727
5070
  gap: 0.5rem;
4728
5071
  margin-top: 1.5rem;
@@ -4896,7 +5239,7 @@ html {
4896
5239
 
4897
5240
  .modal-responsive .modal-box {
4898
5241
  max-width: 100%;
4899
- max-height: 90vh;
5242
+ max-height: 90dvh;
4900
5243
  margin: 0;
4901
5244
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
4902
5245
  }
@@ -4911,7 +5254,7 @@ html {
4911
5254
 
4912
5255
  .drawer-modal .modal-box {
4913
5256
  max-width: 20rem;
4914
- max-height: 100vh;
5257
+ max-height: 100dvh;
4915
5258
  height: 100%;
4916
5259
  margin: 0;
4917
5260
  border-radius: 0;
@@ -13968,9 +14311,10 @@ html {
13968
14311
  margin: auto;
13969
14312
  padding: 0;
13970
14313
  border: none;
13971
- width: 100%;
14314
+ width: calc(100% - 2rem);
13972
14315
  max-width: 28rem;
13973
- max-height: calc(100vh - 4rem);
14316
+ max-height: calc(100dvh - 2rem);
14317
+ box-sizing: border-box;
13974
14318
  background-color: var(--color-surface);
13975
14319
  color: var(--color-on-surface);
13976
14320
  border-radius: var(--radius-2xl);
@@ -13987,7 +14331,7 @@ html {
13987
14331
  .dialog-box {
13988
14332
  display: flex;
13989
14333
  flex-direction: column;
13990
- max-height: calc(100vh - 4rem);
14334
+ max-height: calc(100dvh - 2rem);
13991
14335
  overflow: hidden;
13992
14336
  }
13993
14337
 
@@ -14046,6 +14390,7 @@ html {
14046
14390
  /* Dialog Footer */
14047
14391
  .dialog-footer {
14048
14392
  display: flex;
14393
+ flex-wrap: wrap;
14049
14394
  justify-content: flex-end;
14050
14395
  gap: 0.5rem;
14051
14396
  padding: 1rem 1.5rem 1.5rem;
@@ -14085,6 +14430,30 @@ html {
14085
14430
  margin: 0;
14086
14431
  }
14087
14432
 
14433
+ @media (max-width: 640px) {
14434
+ dialog.dialog {
14435
+ width: calc(100% - 1rem);
14436
+ max-height: calc(100dvh - 1rem);
14437
+ border-radius: var(--radius-lg);
14438
+ }
14439
+
14440
+ .dialog-box {
14441
+ max-height: calc(100dvh - 1rem);
14442
+ }
14443
+
14444
+ .dialog-header {
14445
+ padding: 1rem 1rem 0;
14446
+ }
14447
+
14448
+ .dialog-body {
14449
+ padding: 1rem;
14450
+ }
14451
+
14452
+ .dialog-footer {
14453
+ padding: 0.75rem 1rem 1rem;
14454
+ }
14455
+ }
14456
+
14088
14457
  dialog.dialog.dialog-fullscreen .dialog-box {
14089
14458
  max-height: 100%;
14090
14459
  }