@duskmoon-dev/core 1.19.0 → 1.19.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.
package/README.md CHANGED
@@ -442,4 +442,4 @@ See [specs/004-oklch-color-system/quickstart.md](./specs/004-oklch-color-system/
442
442
 
443
443
  MIT
444
444
 
445
- <!-- release 33856237002 -->
445
+ <!-- release 34185365594 -->
@@ -20,6 +20,26 @@
20
20
  visibility: visible;
21
21
  }
22
22
 
23
+ /* Native surfaces keep the browser's closed state and reset UA dialog/popover geometry. */
24
+ :where(.bottomsheet[popover], dialog.bottomsheet) {
25
+ inset: auto;
26
+ margin: 0;
27
+ width: auto;
28
+ height: auto;
29
+ padding: 0;
30
+ border: 0;
31
+ color: var(--color-on-surface);
32
+ max-width: none;
33
+ max-height: none;
34
+ overflow: auto;
35
+ box-sizing: border-box;
36
+ }
37
+
38
+ .bottomsheet[popover]:not(:popover-open),
39
+ dialog.bottomsheet:not([open]) {
40
+ display: none;
41
+ }
42
+
23
43
  /* Base Bottom Sheet */
24
44
  .bottomsheet {
25
45
  position: fixed;
@@ -321,8 +341,57 @@
321
341
  }
322
342
  }
323
343
 
344
+ /* Native state overrides legacy transforms without requiring class toggles. */
345
+ .bottomsheet[popover],
346
+ dialog.bottomsheet {
347
+ transition: transform 300ms ease-out, opacity 300ms ease-out,
348
+ display 300ms allow-discrete, overlay 300ms allow-discrete;
349
+ opacity: 0;
350
+ }
351
+
352
+ .bottomsheet[popover]:popover-open,
353
+ dialog.bottomsheet[open] {
354
+ display: flex;
355
+ transform: translate(0, 0);
356
+ opacity: 1;
357
+ }
358
+
359
+ dialog.bottomsheet::backdrop {
360
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
361
+ opacity: 0;
362
+ transition: opacity 300ms ease-out, display 300ms allow-discrete,
363
+ overlay 300ms allow-discrete;
364
+ }
365
+
366
+ dialog.bottomsheet[open]::backdrop {
367
+ opacity: 1;
368
+ }
369
+
370
+ @starting-style {
371
+ .bottomsheet[popover]:popover-open,
372
+ dialog.bottomsheet[open],
373
+ dialog.bottomsheet[open]::backdrop {
374
+ opacity: 0;
375
+ }
376
+
377
+ .bottomsheet[popover]:popover-open,
378
+ dialog.bottomsheet[open] {
379
+ transform: translateY(100%);
380
+ }
381
+
382
+ @media (min-width: 768px) {
383
+ .bottomsheet-responsive[popover]:popover-open,
384
+ dialog.bottomsheet-responsive[open] {
385
+ transform: translateX(100%);
386
+ }
387
+ }
388
+ }
389
+
324
390
  /* Reduce Motion */
325
391
  @media (prefers-reduced-motion: reduce) {
392
+ .bottomsheet[popover],
393
+ dialog.bottomsheet,
394
+ dialog.bottomsheet::backdrop,
326
395
  .bottomsheet,
327
396
  .bottomsheet-backdrop,
328
397
  .bottomsheet-close,
@@ -20,6 +20,26 @@
20
20
  visibility: visible;
21
21
  }
22
22
 
23
+ /* Native surfaces keep the browser's closed state and reset UA dialog/popover geometry. */
24
+ :where(.drawer[popover], dialog.drawer) {
25
+ inset: auto;
26
+ margin: 0;
27
+ width: auto;
28
+ height: auto;
29
+ padding: 0;
30
+ border: 0;
31
+ color: var(--color-on-surface);
32
+ max-width: none;
33
+ max-height: none;
34
+ overflow: auto;
35
+ box-sizing: border-box;
36
+ }
37
+
38
+ .drawer[popover]:not(:popover-open),
39
+ dialog.drawer:not([open]) {
40
+ display: none;
41
+ }
42
+
23
43
  /* Base Drawer */
24
44
  .drawer {
25
45
  position: fixed;
@@ -358,8 +378,65 @@
358
378
  border-radius: 0;
359
379
  }
360
380
 
381
+ /* Native state overrides legacy transforms without requiring class toggles. */
382
+ .drawer[popover],
383
+ dialog.drawer {
384
+ transition: transform 300ms ease-out, opacity 300ms ease-out,
385
+ display 300ms allow-discrete, overlay 300ms allow-discrete;
386
+ opacity: 0;
387
+ }
388
+
389
+ .drawer[popover]:popover-open,
390
+ dialog.drawer[open] {
391
+ display: flex;
392
+ transform: translate(0, 0);
393
+ opacity: 1;
394
+ }
395
+
396
+ dialog.drawer::backdrop {
397
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
398
+ opacity: 0;
399
+ transition: opacity 300ms ease-out, display 300ms allow-discrete,
400
+ overlay 300ms allow-discrete;
401
+ }
402
+
403
+ dialog.drawer[open]::backdrop {
404
+ opacity: 1;
405
+ }
406
+
407
+ @starting-style {
408
+ .drawer[popover]:popover-open,
409
+ dialog.drawer[open],
410
+ dialog.drawer[open]::backdrop {
411
+ opacity: 0;
412
+ }
413
+
414
+ .drawer-left[popover]:popover-open,
415
+ dialog.drawer-left[open] {
416
+ transform: translateX(-100%);
417
+ }
418
+
419
+ .drawer-right[popover]:popover-open,
420
+ dialog.drawer-right[open] {
421
+ transform: translateX(100%);
422
+ }
423
+
424
+ .drawer-top[popover]:popover-open,
425
+ dialog.drawer-top[open] {
426
+ transform: translateY(-100%);
427
+ }
428
+
429
+ .drawer-bottom[popover]:popover-open,
430
+ dialog.drawer-bottom[open] {
431
+ transform: translateY(100%);
432
+ }
433
+ }
434
+
361
435
  /* Reduce Motion */
362
436
  @media (prefers-reduced-motion: reduce) {
437
+ .drawer[popover],
438
+ dialog.drawer,
439
+ dialog.drawer::backdrop,
363
440
  .drawer,
364
441
  .drawer-backdrop,
365
442
  .drawer-close,
@@ -1998,6 +1998,65 @@
1998
1998
  gap: 0.25rem;
1999
1999
  }
2000
2000
 
2001
+ /* Native floating menu. Keep closed popovers hidden despite the base flex layout. */
2002
+ .menu[popover] {
2003
+ display: none;
2004
+ position: absolute;
2005
+ inset: auto;
2006
+ margin: 0.5rem;
2007
+ min-width: 12rem;
2008
+ max-width: calc(100vw - 1rem);
2009
+ max-height: calc(100dvh - 1rem);
2010
+ overflow: auto;
2011
+ color: var(--color-on-surface);
2012
+ background-color: var(--color-surface-container);
2013
+ border: 1px solid var(--color-outline-variant);
2014
+ border-radius: var(--radius-md);
2015
+ box-shadow: var(--shadow-lg);
2016
+ position-area: bottom;
2017
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
2018
+ opacity: 0;
2019
+ transform: scale(0.95);
2020
+ transition:
2021
+ opacity 150ms ease-out,
2022
+ transform 150ms ease-out,
2023
+ overlay 150ms ease-out allow-discrete,
2024
+ display 150ms ease-out allow-discrete;
2025
+ }
2026
+
2027
+ .menu[popover]:popover-open {
2028
+ display: flex;
2029
+ opacity: 1;
2030
+ transform: scale(1);
2031
+ }
2032
+
2033
+ @starting-style {
2034
+ .menu[popover]:popover-open {
2035
+ opacity: 0;
2036
+ transform: scale(0.95);
2037
+ }
2038
+ }
2039
+
2040
+ .menu[popover]::backdrop {
2041
+ background-color: transparent;
2042
+ }
2043
+
2044
+ .menu-top[popover] {
2045
+ position-area: top;
2046
+ }
2047
+
2048
+ .menu-bottom[popover] {
2049
+ position-area: bottom;
2050
+ }
2051
+
2052
+ .menu-left[popover] {
2053
+ position-area: left;
2054
+ }
2055
+
2056
+ .menu-right[popover] {
2057
+ position-area: right;
2058
+ }
2059
+
2001
2060
  .menu li {
2002
2061
  display: flex;
2003
2062
  flex-shrink: 0;
@@ -2676,6 +2735,10 @@
2676
2735
 
2677
2736
  /* Reduce Motion */
2678
2737
  @media (prefers-reduced-motion: reduce) {
2738
+ .menu li > a,
2739
+ .menu li > button,
2740
+ .menu-item,
2741
+ .menu[popover],
2679
2742
  .pagination-item,
2680
2743
  .pagination-prev,
2681
2744
  .pagination-next {
@@ -16547,6 +16610,26 @@
16547
16610
  visibility: visible;
16548
16611
  }
16549
16612
 
16613
+ /* Native surfaces keep the browser's closed state and reset UA dialog/popover geometry. */
16614
+ :where(.drawer[popover], dialog.drawer) {
16615
+ inset: auto;
16616
+ margin: 0;
16617
+ width: auto;
16618
+ height: auto;
16619
+ padding: 0;
16620
+ border: 0;
16621
+ color: var(--color-on-surface);
16622
+ max-width: none;
16623
+ max-height: none;
16624
+ overflow: auto;
16625
+ box-sizing: border-box;
16626
+ }
16627
+
16628
+ .drawer[popover]:not(:popover-open),
16629
+ dialog.drawer:not([open]) {
16630
+ display: none;
16631
+ }
16632
+
16550
16633
  /* Base Drawer */
16551
16634
  .drawer {
16552
16635
  position: fixed;
@@ -16885,8 +16968,65 @@
16885
16968
  border-radius: 0;
16886
16969
  }
16887
16970
 
16971
+ /* Native state overrides legacy transforms without requiring class toggles. */
16972
+ .drawer[popover],
16973
+ dialog.drawer {
16974
+ transition: transform 300ms ease-out, opacity 300ms ease-out,
16975
+ display 300ms allow-discrete, overlay 300ms allow-discrete;
16976
+ opacity: 0;
16977
+ }
16978
+
16979
+ .drawer[popover]:popover-open,
16980
+ dialog.drawer[open] {
16981
+ display: flex;
16982
+ transform: translate(0, 0);
16983
+ opacity: 1;
16984
+ }
16985
+
16986
+ dialog.drawer::backdrop {
16987
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
16988
+ opacity: 0;
16989
+ transition: opacity 300ms ease-out, display 300ms allow-discrete,
16990
+ overlay 300ms allow-discrete;
16991
+ }
16992
+
16993
+ dialog.drawer[open]::backdrop {
16994
+ opacity: 1;
16995
+ }
16996
+
16997
+ @starting-style {
16998
+ .drawer[popover]:popover-open,
16999
+ dialog.drawer[open],
17000
+ dialog.drawer[open]::backdrop {
17001
+ opacity: 0;
17002
+ }
17003
+
17004
+ .drawer-left[popover]:popover-open,
17005
+ dialog.drawer-left[open] {
17006
+ transform: translateX(-100%);
17007
+ }
17008
+
17009
+ .drawer-right[popover]:popover-open,
17010
+ dialog.drawer-right[open] {
17011
+ transform: translateX(100%);
17012
+ }
17013
+
17014
+ .drawer-top[popover]:popover-open,
17015
+ dialog.drawer-top[open] {
17016
+ transform: translateY(-100%);
17017
+ }
17018
+
17019
+ .drawer-bottom[popover]:popover-open,
17020
+ dialog.drawer-bottom[open] {
17021
+ transform: translateY(100%);
17022
+ }
17023
+ }
17024
+
16888
17025
  /* Reduce Motion */
16889
17026
  @media (prefers-reduced-motion: reduce) {
17027
+ .drawer[popover],
17028
+ dialog.drawer,
17029
+ dialog.drawer::backdrop,
16890
17030
  .drawer,
16891
17031
  .drawer-backdrop,
16892
17032
  .drawer-close,
@@ -17750,6 +17890,26 @@
17750
17890
  visibility: visible;
17751
17891
  }
17752
17892
 
17893
+ /* Native surfaces keep the browser's closed state and reset UA dialog/popover geometry. */
17894
+ :where(.bottomsheet[popover], dialog.bottomsheet) {
17895
+ inset: auto;
17896
+ margin: 0;
17897
+ width: auto;
17898
+ height: auto;
17899
+ padding: 0;
17900
+ border: 0;
17901
+ color: var(--color-on-surface);
17902
+ max-width: none;
17903
+ max-height: none;
17904
+ overflow: auto;
17905
+ box-sizing: border-box;
17906
+ }
17907
+
17908
+ .bottomsheet[popover]:not(:popover-open),
17909
+ dialog.bottomsheet:not([open]) {
17910
+ display: none;
17911
+ }
17912
+
17753
17913
  /* Base Bottom Sheet */
17754
17914
  .bottomsheet {
17755
17915
  position: fixed;
@@ -18051,8 +18211,57 @@
18051
18211
  }
18052
18212
  }
18053
18213
 
18214
+ /* Native state overrides legacy transforms without requiring class toggles. */
18215
+ .bottomsheet[popover],
18216
+ dialog.bottomsheet {
18217
+ transition: transform 300ms ease-out, opacity 300ms ease-out,
18218
+ display 300ms allow-discrete, overlay 300ms allow-discrete;
18219
+ opacity: 0;
18220
+ }
18221
+
18222
+ .bottomsheet[popover]:popover-open,
18223
+ dialog.bottomsheet[open] {
18224
+ display: flex;
18225
+ transform: translate(0, 0);
18226
+ opacity: 1;
18227
+ }
18228
+
18229
+ dialog.bottomsheet::backdrop {
18230
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
18231
+ opacity: 0;
18232
+ transition: opacity 300ms ease-out, display 300ms allow-discrete,
18233
+ overlay 300ms allow-discrete;
18234
+ }
18235
+
18236
+ dialog.bottomsheet[open]::backdrop {
18237
+ opacity: 1;
18238
+ }
18239
+
18240
+ @starting-style {
18241
+ .bottomsheet[popover]:popover-open,
18242
+ dialog.bottomsheet[open],
18243
+ dialog.bottomsheet[open]::backdrop {
18244
+ opacity: 0;
18245
+ }
18246
+
18247
+ .bottomsheet[popover]:popover-open,
18248
+ dialog.bottomsheet[open] {
18249
+ transform: translateY(100%);
18250
+ }
18251
+
18252
+ @media (min-width: 768px) {
18253
+ .bottomsheet-responsive[popover]:popover-open,
18254
+ dialog.bottomsheet-responsive[open] {
18255
+ transform: translateX(100%);
18256
+ }
18257
+ }
18258
+ }
18259
+
18054
18260
  /* Reduce Motion */
18055
18261
  @media (prefers-reduced-motion: reduce) {
18262
+ .bottomsheet[popover],
18263
+ dialog.bottomsheet,
18264
+ dialog.bottomsheet::backdrop,
18056
18265
  .bottomsheet,
18057
18266
  .bottomsheet-backdrop,
18058
18267
  .bottomsheet-close,
@@ -103,6 +103,65 @@
103
103
  gap: 0.25rem;
104
104
  }
105
105
 
106
+ /* Native floating menu. Keep closed popovers hidden despite the base flex layout. */
107
+ .menu[popover] {
108
+ display: none;
109
+ position: absolute;
110
+ inset: auto;
111
+ margin: 0.5rem;
112
+ min-width: 12rem;
113
+ max-width: calc(100vw - 1rem);
114
+ max-height: calc(100dvh - 1rem);
115
+ overflow: auto;
116
+ color: var(--color-on-surface);
117
+ background-color: var(--color-surface-container);
118
+ border: 1px solid var(--color-outline-variant);
119
+ border-radius: var(--radius-md);
120
+ box-shadow: var(--shadow-lg);
121
+ position-area: bottom;
122
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
123
+ opacity: 0;
124
+ transform: scale(0.95);
125
+ transition:
126
+ opacity 150ms ease-out,
127
+ transform 150ms ease-out,
128
+ overlay 150ms ease-out allow-discrete,
129
+ display 150ms ease-out allow-discrete;
130
+ }
131
+
132
+ .menu[popover]:popover-open {
133
+ display: flex;
134
+ opacity: 1;
135
+ transform: scale(1);
136
+ }
137
+
138
+ @starting-style {
139
+ .menu[popover]:popover-open {
140
+ opacity: 0;
141
+ transform: scale(0.95);
142
+ }
143
+ }
144
+
145
+ .menu[popover]::backdrop {
146
+ background-color: transparent;
147
+ }
148
+
149
+ .menu-top[popover] {
150
+ position-area: top;
151
+ }
152
+
153
+ .menu-bottom[popover] {
154
+ position-area: bottom;
155
+ }
156
+
157
+ .menu-left[popover] {
158
+ position-area: left;
159
+ }
160
+
161
+ .menu-right[popover] {
162
+ position-area: right;
163
+ }
164
+
106
165
  .menu li {
107
166
  display: flex;
108
167
  flex-shrink: 0;
@@ -781,6 +840,10 @@
781
840
 
782
841
  /* Reduce Motion */
783
842
  @media (prefers-reduced-motion: reduce) {
843
+ .menu li > a,
844
+ .menu li > button,
845
+ .menu-item,
846
+ .menu[popover],
784
847
  .pagination-item,
785
848
  .pagination-prev,
786
849
  .pagination-next {
@@ -21,6 +21,26 @@ export const css = `/**
21
21
  visibility: visible;
22
22
  }
23
23
 
24
+ /* Native surfaces keep the browser's closed state and reset UA dialog/popover geometry. */
25
+ :where(.bottomsheet[popover], dialog.bottomsheet) {
26
+ inset: auto;
27
+ margin: 0;
28
+ width: auto;
29
+ height: auto;
30
+ padding: 0;
31
+ border: 0;
32
+ color: var(--color-on-surface);
33
+ max-width: none;
34
+ max-height: none;
35
+ overflow: auto;
36
+ box-sizing: border-box;
37
+ }
38
+
39
+ .bottomsheet[popover]:not(:popover-open),
40
+ dialog.bottomsheet:not([open]) {
41
+ display: none;
42
+ }
43
+
24
44
  /* Base Bottom Sheet */
25
45
  .bottomsheet {
26
46
  position: fixed;
@@ -322,8 +342,57 @@ export const css = `/**
322
342
  }
323
343
  }
324
344
 
345
+ /* Native state overrides legacy transforms without requiring class toggles. */
346
+ .bottomsheet[popover],
347
+ dialog.bottomsheet {
348
+ transition: transform 300ms ease-out, opacity 300ms ease-out,
349
+ display 300ms allow-discrete, overlay 300ms allow-discrete;
350
+ opacity: 0;
351
+ }
352
+
353
+ .bottomsheet[popover]:popover-open,
354
+ dialog.bottomsheet[open] {
355
+ display: flex;
356
+ transform: translate(0, 0);
357
+ opacity: 1;
358
+ }
359
+
360
+ dialog.bottomsheet::backdrop {
361
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
362
+ opacity: 0;
363
+ transition: opacity 300ms ease-out, display 300ms allow-discrete,
364
+ overlay 300ms allow-discrete;
365
+ }
366
+
367
+ dialog.bottomsheet[open]::backdrop {
368
+ opacity: 1;
369
+ }
370
+
371
+ @starting-style {
372
+ .bottomsheet[popover]:popover-open,
373
+ dialog.bottomsheet[open],
374
+ dialog.bottomsheet[open]::backdrop {
375
+ opacity: 0;
376
+ }
377
+
378
+ .bottomsheet[popover]:popover-open,
379
+ dialog.bottomsheet[open] {
380
+ transform: translateY(100%);
381
+ }
382
+
383
+ @media (min-width: 768px) {
384
+ .bottomsheet-responsive[popover]:popover-open,
385
+ dialog.bottomsheet-responsive[open] {
386
+ transform: translateX(100%);
387
+ }
388
+ }
389
+ }
390
+
325
391
  /* Reduce Motion */
326
392
  @media (prefers-reduced-motion: reduce) {
393
+ .bottomsheet[popover],
394
+ dialog.bottomsheet,
395
+ dialog.bottomsheet::backdrop,
327
396
  .bottomsheet,
328
397
  .bottomsheet-backdrop,
329
398
  .bottomsheet-close,
@@ -21,6 +21,26 @@ export const css = `/**
21
21
  visibility: visible;
22
22
  }
23
23
 
24
+ /* Native surfaces keep the browser's closed state and reset UA dialog/popover geometry. */
25
+ :where(.drawer[popover], dialog.drawer) {
26
+ inset: auto;
27
+ margin: 0;
28
+ width: auto;
29
+ height: auto;
30
+ padding: 0;
31
+ border: 0;
32
+ color: var(--color-on-surface);
33
+ max-width: none;
34
+ max-height: none;
35
+ overflow: auto;
36
+ box-sizing: border-box;
37
+ }
38
+
39
+ .drawer[popover]:not(:popover-open),
40
+ dialog.drawer:not([open]) {
41
+ display: none;
42
+ }
43
+
24
44
  /* Base Drawer */
25
45
  .drawer {
26
46
  position: fixed;
@@ -359,8 +379,65 @@ export const css = `/**
359
379
  border-radius: 0;
360
380
  }
361
381
 
382
+ /* Native state overrides legacy transforms without requiring class toggles. */
383
+ .drawer[popover],
384
+ dialog.drawer {
385
+ transition: transform 300ms ease-out, opacity 300ms ease-out,
386
+ display 300ms allow-discrete, overlay 300ms allow-discrete;
387
+ opacity: 0;
388
+ }
389
+
390
+ .drawer[popover]:popover-open,
391
+ dialog.drawer[open] {
392
+ display: flex;
393
+ transform: translate(0, 0);
394
+ opacity: 1;
395
+ }
396
+
397
+ dialog.drawer::backdrop {
398
+ background-color: color-mix(in srgb, var(--color-scrim) 50%, transparent);
399
+ opacity: 0;
400
+ transition: opacity 300ms ease-out, display 300ms allow-discrete,
401
+ overlay 300ms allow-discrete;
402
+ }
403
+
404
+ dialog.drawer[open]::backdrop {
405
+ opacity: 1;
406
+ }
407
+
408
+ @starting-style {
409
+ .drawer[popover]:popover-open,
410
+ dialog.drawer[open],
411
+ dialog.drawer[open]::backdrop {
412
+ opacity: 0;
413
+ }
414
+
415
+ .drawer-left[popover]:popover-open,
416
+ dialog.drawer-left[open] {
417
+ transform: translateX(-100%);
418
+ }
419
+
420
+ .drawer-right[popover]:popover-open,
421
+ dialog.drawer-right[open] {
422
+ transform: translateX(100%);
423
+ }
424
+
425
+ .drawer-top[popover]:popover-open,
426
+ dialog.drawer-top[open] {
427
+ transform: translateY(-100%);
428
+ }
429
+
430
+ .drawer-bottom[popover]:popover-open,
431
+ dialog.drawer-bottom[open] {
432
+ transform: translateY(100%);
433
+ }
434
+ }
435
+
362
436
  /* Reduce Motion */
363
437
  @media (prefers-reduced-motion: reduce) {
438
+ .drawer[popover],
439
+ dialog.drawer,
440
+ dialog.drawer::backdrop,
364
441
  .drawer,
365
442
  .drawer-backdrop,
366
443
  .drawer-close,