@duskmoon-dev/core 1.19.4 → 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.
Files changed (42) hide show
  1. package/README.md +1 -1
  2. package/dist/components/alert.css +81 -3
  3. package/dist/components/dialog.css +29 -3
  4. package/dist/components/dropdown.css +91 -0
  5. package/dist/components/fab.css +182 -0
  6. package/dist/components/index.css +1119 -232
  7. package/dist/components/loading.css +105 -0
  8. package/dist/components/modal.css +66 -4
  9. package/dist/components/navigation.css +94 -54
  10. package/dist/components/progress.css +74 -0
  11. package/dist/components/radial-progress.css +47 -0
  12. package/dist/components/skeleton.css +13 -1
  13. package/dist/components/snackbar.css +48 -18
  14. package/dist/components/swap.css +116 -0
  15. package/dist/components/toast.css +188 -34
  16. package/dist/components/tooltip.css +2 -47
  17. package/dist/esm/components/alert.js +81 -3
  18. package/dist/esm/components/dialog.js +29 -3
  19. package/dist/esm/components/dropdown.d.ts +5 -0
  20. package/dist/esm/components/dropdown.js +100 -0
  21. package/dist/esm/components/fab.d.ts +5 -0
  22. package/dist/esm/components/fab.js +191 -0
  23. package/dist/esm/components/loading.d.ts +5 -0
  24. package/dist/esm/components/loading.js +114 -0
  25. package/dist/esm/components/modal.js +66 -4
  26. package/dist/esm/components/navigation.js +94 -54
  27. package/dist/esm/components/progress.js +74 -0
  28. package/dist/esm/components/radial-progress.d.ts +5 -0
  29. package/dist/esm/components/radial-progress.js +56 -0
  30. package/dist/esm/components/skeleton.js +13 -1
  31. package/dist/esm/components/snackbar.js +48 -18
  32. package/dist/esm/components/swap.d.ts +5 -0
  33. package/dist/esm/components/swap.js +125 -0
  34. package/dist/esm/components/toast.js +188 -34
  35. package/dist/esm/components/tooltip.js +2 -47
  36. package/dist/index.css +1119 -232
  37. package/dist/index.min.css +1 -1
  38. package/dist/standalone/duskmoonui-themes.css +1 -1
  39. package/dist/standalone/duskmoonui.css +1120 -233
  40. package/dist/standalone/duskmoonui.js +25 -9
  41. package/dist/standalone/duskmoonui.mjs +25 -9
  42. package/package.json +31 -1
@@ -7,8 +7,11 @@ export const css = `/**
7
7
  @layer components {
8
8
  /* Base Alert */
9
9
  .alert {
10
- display: flex;
11
- align-items: flex-start;
10
+ display: grid;
11
+ grid-template-columns: auto minmax(0, 1fr) auto auto;
12
+ grid-template-areas:
13
+ "icon content actions close";
14
+ align-items: center;
12
15
  gap: 0.75rem;
13
16
  padding: 1rem;
14
17
  border-radius: var(--radius-sm);
@@ -19,6 +22,7 @@ export const css = `/**
19
22
 
20
23
  /* Alert Icon */
21
24
  .alert-icon {
25
+ grid-area: icon;
22
26
  display: flex;
23
27
  align-items: center;
24
28
  justify-content: center;
@@ -26,10 +30,12 @@ export const css = `/**
26
30
  height: 1.5rem;
27
31
  font-size: 1.25rem;
28
32
  flex-shrink: 0;
33
+ align-self: start;
29
34
  }
30
35
 
31
36
  /* Alert Content */
32
37
  .alert-content {
38
+ grid-area: content;
33
39
  display: flex;
34
40
  flex-direction: column;
35
41
  gap: 0.25rem;
@@ -37,13 +43,42 @@ export const css = `/**
37
43
  min-width: 0;
38
44
  }
39
45
 
46
+ .alert-content > p {
47
+ margin: 0;
48
+ }
49
+
50
+ /* Keep the compact single-message form vertically balanced against global typography margins. */
51
+ .alert > p {
52
+ margin: 0;
53
+ }
54
+
55
+ .alert-horizontal { display: grid; }
56
+ .alert-actions-end { grid-template-areas: "icon content actions close"; }
57
+ .alert-actions-bottom {
58
+ grid-template-columns: auto minmax(0, 1fr) auto;
59
+ grid-template-areas:
60
+ "icon content close"
61
+ ". actions .";
62
+ }
63
+
64
+ .alert-actions-bottom .alert-actions {
65
+ justify-self: start;
66
+ margin-top: 0.5rem;
67
+ }
68
+ .alert-vertical {
69
+ display: flex;
70
+ flex-direction: column;
71
+ }
72
+
40
73
  .alert-title {
74
+ margin: 0;
41
75
  font-size: 0.875rem;
42
76
  font-weight: 600;
43
77
  line-height: 1.25rem;
44
78
  }
45
79
 
46
80
  .alert-description {
81
+ margin: 0;
47
82
  font-size: 0.875rem;
48
83
  line-height: 1.25rem;
49
84
  opacity: 0.9;
@@ -51,6 +86,7 @@ export const css = `/**
51
86
 
52
87
  /* Alert Close Button */
53
88
  .alert-close {
89
+ grid-area: close;
54
90
  display: flex;
55
91
  align-items: center;
56
92
  justify-content: center;
@@ -264,6 +300,7 @@ export const css = `/**
264
300
  /* Dismissible */
265
301
  .alert-dismissible {
266
302
  padding-right: 2.5rem;
303
+ padding-inline-end: 2.5rem;
267
304
  position: relative;
268
305
  }
269
306
 
@@ -271,6 +308,7 @@ export const css = `/**
271
308
  position: absolute;
272
309
  top: 0.75rem;
273
310
  right: 0.75rem;
311
+ inset-inline-end: 0.75rem;
274
312
  }
275
313
 
276
314
  /* Compact */
@@ -290,11 +328,25 @@ export const css = `/**
290
328
  font-size: 0.8125rem;
291
329
  }
292
330
 
331
+ .alert-comfortable {
332
+ padding: 1.25rem;
333
+ gap: 1rem;
334
+ }
335
+
293
336
  /* Alert Actions */
294
337
  .alert-actions {
338
+ grid-area: actions;
295
339
  display: flex;
296
340
  gap: 0.5rem;
297
- margin-top: 0.5rem;
341
+ margin-top: 0;
342
+ flex-wrap: wrap;
343
+ align-self: center;
344
+ justify-self: end;
345
+ }
346
+
347
+ .alert-vertical .alert-actions {
348
+ align-self: stretch;
349
+ width: 100%;
298
350
  }
299
351
 
300
352
  .alert-filled .alert-actions .btn-text {
@@ -318,6 +370,32 @@ export const css = `/**
318
370
  transition: none;
319
371
  }
320
372
  }
373
+
374
+ @media (max-width: 32rem) {
375
+ .alert:not(.alert-vertical) .alert-content,
376
+ .alert-horizontal .alert-content {
377
+ flex-basis: min(100%, 18rem);
378
+ }
379
+ .alert:not(.alert-vertical),
380
+ .alert-horizontal {
381
+ grid-template-columns: auto minmax(0, 1fr) auto;
382
+ grid-template-areas:
383
+ "icon content close"
384
+ ". actions actions";
385
+ }
386
+ .alert:not(.alert-vertical).alert-actions-end,
387
+ .alert-horizontal.alert-actions-end {
388
+ grid-template-columns: auto minmax(0, 1fr) auto;
389
+ grid-template-areas:
390
+ "icon content close"
391
+ ". actions actions";
392
+ }
393
+ .alert:not(.alert-vertical) .alert-actions,
394
+ .alert-horizontal .alert-actions {
395
+ justify-self: start;
396
+ margin-top: 0.5rem;
397
+ }
398
+ }
321
399
  }
322
400
  `;
323
401
 
@@ -12,9 +12,10 @@ export const css = `/**
12
12
  margin: auto;
13
13
  padding: 0;
14
14
  border: none;
15
- width: 100%;
15
+ width: calc(100% - 2rem);
16
16
  max-width: 28rem;
17
- max-height: calc(100vh - 4rem);
17
+ max-height: calc(100dvh - 2rem);
18
+ box-sizing: border-box;
18
19
  background-color: var(--color-surface);
19
20
  color: var(--color-on-surface);
20
21
  border-radius: var(--radius-2xl);
@@ -31,7 +32,7 @@ export const css = `/**
31
32
  .dialog-box {
32
33
  display: flex;
33
34
  flex-direction: column;
34
- max-height: calc(100vh - 4rem);
35
+ max-height: calc(100dvh - 2rem);
35
36
  overflow: hidden;
36
37
  }
37
38
 
@@ -90,6 +91,7 @@ export const css = `/**
90
91
  /* Dialog Footer */
91
92
  .dialog-footer {
92
93
  display: flex;
94
+ flex-wrap: wrap;
93
95
  justify-content: flex-end;
94
96
  gap: 0.5rem;
95
97
  padding: 1rem 1.5rem 1.5rem;
@@ -129,6 +131,30 @@ export const css = `/**
129
131
  margin: 0;
130
132
  }
131
133
 
134
+ @media (max-width: 640px) {
135
+ dialog.dialog {
136
+ width: calc(100% - 1rem);
137
+ max-height: calc(100dvh - 1rem);
138
+ border-radius: var(--radius-lg);
139
+ }
140
+
141
+ .dialog-box {
142
+ max-height: calc(100dvh - 1rem);
143
+ }
144
+
145
+ .dialog-header {
146
+ padding: 1rem 1rem 0;
147
+ }
148
+
149
+ .dialog-body {
150
+ padding: 1rem;
151
+ }
152
+
153
+ .dialog-footer {
154
+ padding: 0.75rem 1rem 1rem;
155
+ }
156
+ }
157
+
132
158
  dialog.dialog.dialog-fullscreen .dialog-box {
133
159
  max-height: 100%;
134
160
  }
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for dropdown
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;
@@ -0,0 +1,100 @@
1
+ // Auto-generated from dropdown.css
2
+ export const css = `/**
3
+ * Dropdown Component Styles
4
+ * Native Popover disclosure with logical CSS anchor positioning.
5
+ */
6
+
7
+ @layer components {
8
+ .dropdown {
9
+ position: relative;
10
+ display: inline-block;
11
+ }
12
+
13
+ .dropdown > .dropdown-content[popover] {
14
+ display: none;
15
+ position: fixed;
16
+ inset-block-start: auto;
17
+ inset-block-end: max(0.5rem, env(safe-area-inset-bottom, 0px));
18
+ inset-inline-start: auto;
19
+ inset-inline-end: max(
20
+ 0.5rem,
21
+ env(safe-area-inset-left, 0px),
22
+ env(safe-area-inset-right, 0px)
23
+ );
24
+ z-index: 50;
25
+ min-inline-size: 12rem;
26
+ max-inline-size: min(24rem, calc(100dvw - 1rem));
27
+ max-block-size: calc(100dvh - 1rem);
28
+ margin: 0;
29
+ padding: 0.5rem;
30
+ overflow: auto;
31
+ color: var(--color-on-surface);
32
+ background-color: var(--color-surface);
33
+ border: 1px solid var(--color-outline);
34
+ border-radius: var(--radius-sm);
35
+ box-shadow: var(--shadow-lg);
36
+ opacity: 0;
37
+ visibility: hidden;
38
+ pointer-events: none;
39
+ transform: translateY(-0.5rem);
40
+ transition:
41
+ opacity 150ms ease-out,
42
+ transform 150ms ease-out,
43
+ overlay 150ms ease-out allow-discrete,
44
+ display 150ms ease-out allow-discrete;
45
+ }
46
+
47
+ .dropdown > .dropdown-content[popover]:popover-open {
48
+ display: block;
49
+ opacity: 1;
50
+ visibility: visible;
51
+ pointer-events: auto;
52
+ transform: translateY(0);
53
+ }
54
+
55
+ @starting-style {
56
+ .dropdown > .dropdown-content[popover]:popover-open {
57
+ opacity: 0;
58
+ transform: translateY(-0.5rem);
59
+ }
60
+ }
61
+
62
+ @supports (position-area: block-end) {
63
+ .dropdown > .dropdown-content[popover] {
64
+ inset: auto;
65
+ margin: 0.25rem;
66
+ position-area: block-end span-inline-end;
67
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
68
+ }
69
+
70
+ .dropdown.dropdown-block-start > .dropdown-content[popover] {
71
+ position-area: block-start span-inline-end;
72
+ }
73
+
74
+ .dropdown.dropdown-block-end > .dropdown-content[popover] {
75
+ position-area: block-end span-inline-end;
76
+ }
77
+
78
+ .dropdown.dropdown-inline-start > .dropdown-content[popover] {
79
+ position-area: inline-start span-block-end;
80
+ }
81
+
82
+ .dropdown.dropdown-inline-end > .dropdown-content[popover] {
83
+ position-area: inline-end span-block-end;
84
+ }
85
+ }
86
+
87
+ @media (prefers-reduced-motion: reduce) {
88
+ .dropdown > .dropdown-content[popover] {
89
+ transition: none;
90
+ }
91
+ }
92
+ }
93
+ `;
94
+
95
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
96
+ if (sheet) {
97
+ sheet.replaceSync(css);
98
+ }
99
+ export const styles = sheet;
100
+ export default sheet;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for fab
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;
@@ -0,0 +1,191 @@
1
+ // Auto-generated from fab.css
2
+ export const css = `/**
3
+ * FAB / Speed Dial Component Styles
4
+ *
5
+ * FAB owns viewport placement and action layout. Pair its trigger and actions
6
+ * with Button classes for color, interaction, and disabled states.
7
+ */
8
+
9
+ @layer components {
10
+ .fab {
11
+ --fab-offset-block: 1rem;
12
+ --fab-offset-inline: 1rem;
13
+ --fab-gap: 0.75rem;
14
+ --fab-size: 3.5rem;
15
+
16
+ position: fixed;
17
+ inset-block-end: calc(var(--fab-offset-block) + env(safe-area-inset-bottom, 0px));
18
+ inset-inline-end: calc(var(--fab-offset-inline) + env(safe-area-inset-right, 0px));
19
+ z-index: 40;
20
+ display: inline-flex;
21
+ flex-direction: column-reverse;
22
+ align-items: flex-end;
23
+ gap: var(--fab-gap);
24
+ max-inline-size: calc(100dvw - 2 * var(--fab-offset-inline));
25
+ }
26
+
27
+ .fab-start {
28
+ inset-inline-start: calc(var(--fab-offset-inline) + env(safe-area-inset-left, 0px));
29
+ inset-inline-end: auto;
30
+ align-items: flex-start;
31
+ }
32
+
33
+ .fab-contained {
34
+ position: absolute;
35
+ }
36
+
37
+ .fab-speed-dial {
38
+ flex-direction: column-reverse;
39
+ }
40
+
41
+ .fab-trigger {
42
+ min-inline-size: var(--fab-size);
43
+ min-block-size: var(--fab-size);
44
+ padding: 0.875rem;
45
+ border-radius: var(--radius-lg);
46
+ box-shadow: var(--shadow-lg);
47
+ }
48
+
49
+ .fab-trigger:not(.fab-extended) {
50
+ inline-size: var(--fab-size);
51
+ block-size: var(--fab-size);
52
+ }
53
+
54
+ .fab-extended {
55
+ inline-size: auto;
56
+ max-inline-size: 100%;
57
+ min-block-size: var(--fab-size);
58
+ padding-inline: 1.25rem;
59
+ border-radius: var(--radius-lg);
60
+ }
61
+
62
+ .fab-actions {
63
+ align-items: flex-end;
64
+ flex-direction: column-reverse;
65
+ gap: var(--fab-gap);
66
+ max-inline-size: min(22rem, calc(100dvw - 2rem));
67
+ }
68
+
69
+ .fab-start .fab-actions {
70
+ align-items: flex-start;
71
+ }
72
+
73
+ /* Controlled mode: application code owns .fab-open and all ARIA state. */
74
+ .fab-controlled > .fab-actions:not([popover]) {
75
+ display: none;
76
+ }
77
+
78
+ .fab-controlled.fab-open > .fab-actions:not([popover]) {
79
+ display: flex;
80
+ }
81
+
82
+ /* Native mode: the browser's popover state is the sole authority. */
83
+ .fab-actions[popover] {
84
+ display: none;
85
+ position: fixed;
86
+ inset-block-start: auto;
87
+ inset-block-end: calc(
88
+ var(--fab-offset-block, 1rem) + env(safe-area-inset-bottom, 0px) +
89
+ var(--fab-size, 3.5rem) + var(--fab-gap, 0.75rem)
90
+ );
91
+ inset-inline-start: auto;
92
+ inset-inline-end: calc(var(--fab-offset-inline, 1rem) + env(safe-area-inset-right, 0px));
93
+ margin: 0;
94
+ padding: 0;
95
+ border: 0;
96
+ overflow: visible;
97
+ color: inherit;
98
+ background: transparent;
99
+ opacity: 0;
100
+ visibility: hidden;
101
+ pointer-events: none;
102
+ transform: translateY(0.5rem);
103
+ transition:
104
+ opacity 150ms ease-out,
105
+ transform 150ms ease-out,
106
+ overlay 150ms ease-out allow-discrete,
107
+ display 150ms ease-out allow-discrete;
108
+ }
109
+
110
+ .fab-start > .fab-actions[popover] {
111
+ inset-inline-start: calc(var(--fab-offset-inline, 1rem) + env(safe-area-inset-left, 0px));
112
+ inset-inline-end: auto;
113
+ }
114
+
115
+ .fab-actions[popover]:popover-open {
116
+ display: flex;
117
+ opacity: 1;
118
+ visibility: visible;
119
+ pointer-events: auto;
120
+ transform: translateY(0);
121
+ }
122
+
123
+ @starting-style {
124
+ .fab-actions[popover]:popover-open {
125
+ opacity: 0;
126
+ transform: translateY(0.5rem);
127
+ }
128
+ }
129
+
130
+ @supports (position-area: top) {
131
+ .fab-actions[popover] {
132
+ inset: auto;
133
+ margin: var(--fab-gap, 0.75rem);
134
+ position-area: top span-left;
135
+ position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;
136
+ }
137
+
138
+ .fab-start > .fab-actions[popover] {
139
+ inset: auto;
140
+ position-area: top span-right;
141
+ }
142
+ }
143
+
144
+ .fab-action {
145
+ display: inline-flex;
146
+ align-items: center;
147
+ justify-content: flex-end;
148
+ gap: 0.5rem;
149
+ max-inline-size: 100%;
150
+ }
151
+
152
+ .fab-start .fab-action {
153
+ flex-direction: row-reverse;
154
+ }
155
+
156
+ .fab-label {
157
+ max-inline-size: min(16rem, calc(100dvw - 6rem));
158
+ padding: 0.375rem 0.625rem;
159
+ overflow-wrap: anywhere;
160
+ color: var(--color-on-surface);
161
+ background-color: var(--color-surface-container-high);
162
+ border: 1px solid var(--color-outline-variant);
163
+ border-radius: var(--radius-sm);
164
+ box-shadow: var(--shadow-sm);
165
+ font-size: 0.8125rem;
166
+ font-weight: 500;
167
+ line-height: 1.125rem;
168
+ }
169
+
170
+ @media (max-width: 30rem) {
171
+ .fab {
172
+ --fab-offset-block: 0.75rem;
173
+ --fab-offset-inline: 0.75rem;
174
+ }
175
+ }
176
+
177
+ @media (prefers-reduced-motion: reduce) {
178
+ .fab-actions[popover] {
179
+ transition: none;
180
+ transform: none;
181
+ }
182
+ }
183
+ }
184
+ `;
185
+
186
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
187
+ if (sheet) {
188
+ sheet.replaceSync(css);
189
+ }
190
+ export const styles = sheet;
191
+ export default sheet;
@@ -0,0 +1,5 @@
1
+ // Auto-generated type declaration for loading
2
+ export declare const css: string;
3
+ export declare const styles: CSSStyleSheet | null;
4
+ declare const sheet: CSSStyleSheet | null;
5
+ export default sheet;
@@ -0,0 +1,114 @@
1
+ // Auto-generated from loading.css
2
+ export const css = `/**
3
+ * Loading Component Styles
4
+ * CSS-only activity indicators. State, aria-busy, and disabling remain consumer-owned.
5
+ */
6
+
7
+ @layer components {
8
+ .loading {
9
+ --loading-size: 1.25rem;
10
+ display: inline-flex;
11
+ width: var(--loading-size);
12
+ height: var(--loading-size);
13
+ flex: 0 0 var(--loading-size);
14
+ color: currentColor;
15
+ vertical-align: middle;
16
+ }
17
+
18
+ .loading-spinner {
19
+ border: max(2px, calc(var(--loading-size) / 8)) solid color-mix(in oklch, currentColor 25%, transparent);
20
+ border-top-color: currentColor;
21
+ border-radius: var(--radius-full);
22
+ animation: loading-spin 800ms linear infinite;
23
+ }
24
+
25
+ .loading-dots,
26
+ .loading-bars {
27
+ align-items: center;
28
+ justify-content: center;
29
+ gap: max(2px, calc(var(--loading-size) / 8));
30
+ }
31
+
32
+ .loading-dots::before,
33
+ .loading-dots::after,
34
+ .loading-bars::before,
35
+ .loading-bars::after {
36
+ content: "";
37
+ display: block;
38
+ background: currentColor;
39
+ }
40
+
41
+ .loading-dots::before,
42
+ .loading-dots::after {
43
+ width: 25%;
44
+ height: 25%;
45
+ border-radius: var(--radius-full);
46
+ box-shadow: calc(var(--loading-size) / 3) 0 currentColor;
47
+ animation: loading-dots 900ms ease-in-out infinite;
48
+ }
49
+
50
+ .loading-dots::after {
51
+ display: none;
52
+ }
53
+
54
+ .loading-bars {
55
+ padding-inline: 10%;
56
+ }
57
+
58
+ .loading-bars::before,
59
+ .loading-bars::after {
60
+ width: 18%;
61
+ height: 65%;
62
+ border-radius: var(--radius-xs);
63
+ box-shadow: calc(var(--loading-size) / 3) 0 currentColor, calc(var(--loading-size) * 2 / 3) 0 currentColor;
64
+ animation: loading-bars 900ms ease-in-out infinite;
65
+ }
66
+
67
+ .loading-bars::after {
68
+ display: none;
69
+ }
70
+
71
+ .loading-xs { --loading-size: 0.75rem; }
72
+ .loading-sm { --loading-size: 1rem; }
73
+ .loading-md { --loading-size: 1.25rem; }
74
+ .loading-lg { --loading-size: 1.75rem; }
75
+ .loading-xl { --loading-size: 2.5rem; }
76
+
77
+ .loading-primary { color: var(--color-primary); }
78
+ .loading-secondary { color: var(--color-secondary); }
79
+ .loading-tertiary { color: var(--color-tertiary); }
80
+ .loading-info { color: var(--color-info); }
81
+ .loading-success { color: var(--color-success); }
82
+ .loading-warning { color: var(--color-warning); }
83
+ .loading-error { color: var(--color-error); }
84
+
85
+ @keyframes loading-spin {
86
+ to { transform: rotate(360deg); }
87
+ }
88
+
89
+ @keyframes loading-dots {
90
+ 0%, 100% { opacity: 0.35; transform: scale(0.75); }
91
+ 50% { opacity: 1; transform: scale(1); }
92
+ }
93
+
94
+ @keyframes loading-bars {
95
+ 0%, 100% { opacity: 0.35; transform: scaleY(0.65); }
96
+ 50% { opacity: 1; transform: scaleY(1); }
97
+ }
98
+
99
+ @media (prefers-reduced-motion: reduce) {
100
+ .loading-spinner,
101
+ .loading-dots::before,
102
+ .loading-bars::before {
103
+ animation: none;
104
+ }
105
+ }
106
+ }
107
+ `;
108
+
109
+ const sheet = typeof CSSStyleSheet !== 'undefined' ? new CSSStyleSheet() : null;
110
+ if (sheet) {
111
+ sheet.replaceSync(css);
112
+ }
113
+ export const styles = sheet;
114
+ export default sheet;