@db-vincent/components 0.0.0-stage → 0.1.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 (62) hide show
  1. package/package.json +28 -4
  2. package/src/astro/Accordion.astro +37 -0
  3. package/src/astro/Alert.astro +73 -0
  4. package/src/astro/Badge.astro +23 -0
  5. package/src/astro/Breadcrumbs.astro +45 -0
  6. package/src/astro/Button.astro +125 -0
  7. package/src/astro/Card.astro +63 -0
  8. package/src/astro/Checkbox.astro +61 -0
  9. package/src/astro/Chip.astro +116 -0
  10. package/src/astro/CodeBlock.astro +17 -0
  11. package/src/astro/EmptyState.astro +45 -0
  12. package/src/astro/Example.astro +37 -0
  13. package/src/astro/Grid.astro +50 -0
  14. package/src/astro/GridItem.astro +23 -0
  15. package/src/astro/Icon.astro +52 -0
  16. package/src/astro/Modal.astro +117 -0
  17. package/src/astro/Navbar.astro +756 -0
  18. package/src/astro/PageHeader.astro +34 -0
  19. package/src/astro/Pagination.astro +162 -0
  20. package/src/astro/Radio.astro +58 -0
  21. package/src/astro/RadioGroup.astro +25 -0
  22. package/src/astro/Section.astro +25 -0
  23. package/src/astro/Select.astro +403 -0
  24. package/src/astro/Sidebar.astro +215 -0
  25. package/src/astro/Skeleton.astro +39 -0
  26. package/src/astro/Spinner.astro +19 -0
  27. package/src/astro/Table.astro +254 -0
  28. package/src/astro/TextField.astro +287 -0
  29. package/src/astro/ThemeToggle.astro +66 -0
  30. package/src/astro/Toast.astro +181 -0
  31. package/src/astro/TopBar.astro +29 -0
  32. package/src/data/icons.ts +104 -0
  33. package/src/scripts/toast.ts +531 -0
  34. package/src/styles/accordion.css +77 -0
  35. package/src/styles/alert.css +106 -0
  36. package/src/styles/badge.css +46 -0
  37. package/src/styles/base.css +203 -0
  38. package/src/styles/breadcrumbs.css +52 -0
  39. package/src/styles/button.css +163 -0
  40. package/src/styles/card.css +108 -0
  41. package/src/styles/chip.css +104 -0
  42. package/src/styles/choice.css +137 -0
  43. package/src/styles/code.css +42 -0
  44. package/src/styles/empty.css +57 -0
  45. package/src/styles/example.css +55 -0
  46. package/src/styles/grid.css +62 -0
  47. package/src/styles/input.css +198 -0
  48. package/src/styles/modal.css +143 -0
  49. package/src/styles/motion.css +96 -0
  50. package/src/styles/nav.css +230 -0
  51. package/src/styles/navbar.css +656 -0
  52. package/src/styles/page-header.css +59 -0
  53. package/src/styles/pagination.css +77 -0
  54. package/src/styles/section.css +36 -0
  55. package/src/styles/select.css +235 -0
  56. package/src/styles/skeleton.css +64 -0
  57. package/src/styles/spinner.css +42 -0
  58. package/src/styles/table.css +175 -0
  59. package/src/styles/theme-toggle.css +29 -0
  60. package/src/styles/toast.css +207 -0
  61. package/src/styles/topbar.css +30 -0
  62. package/README.md +0 -3
@@ -0,0 +1,137 @@
1
+ @layer components {
2
+ .ds-choice {
3
+ align-items: flex-start;
4
+ cursor: pointer;
5
+ display: inline-flex;
6
+ gap: var(--checkbox-gap);
7
+ position: relative;
8
+ }
9
+
10
+ .ds-choice__input {
11
+ height: var(--checkbox-size);
12
+ inset-block-start: var(--space-0-5);
13
+ margin: 0;
14
+ opacity: 0;
15
+ position: absolute;
16
+ width: var(--checkbox-size);
17
+ }
18
+
19
+ .ds-choice__box {
20
+ align-items: center;
21
+ background: var(--checkbox-bg);
22
+ border: 1px solid var(--checkbox-border);
23
+ border-radius: var(--checkbox-radius);
24
+ color: transparent;
25
+ display: inline-flex;
26
+ flex: none;
27
+ height: var(--checkbox-size);
28
+ justify-content: center;
29
+ margin-block-start: var(--space-0-5);
30
+ transition:
31
+ background-color var(--duration-fast) var(--ease-standard),
32
+ border-color var(--duration-fast) var(--ease-standard);
33
+ width: var(--checkbox-size);
34
+ }
35
+
36
+ .ds-choice__box svg {
37
+ height: 80%;
38
+ stroke-width: 3;
39
+ width: 80%;
40
+ }
41
+
42
+ .ds-choice:hover .ds-choice__input:not(:disabled) + .ds-choice__box {
43
+ background: var(--checkbox-bg-hover);
44
+ border-color: var(--checkbox-border-checked);
45
+ }
46
+
47
+ .ds-choice__input:checked + .ds-choice__box {
48
+ background: var(--checkbox-bg-checked);
49
+ border-color: var(--checkbox-border-checked);
50
+ color: var(--checkbox-fg-check);
51
+ }
52
+
53
+ .ds-choice__input:focus-visible + .ds-choice__box {
54
+ outline: var(--checkbox-focus-width) solid var(--checkbox-focus-color);
55
+ outline-offset: var(--checkbox-focus-offset);
56
+ }
57
+
58
+ .ds-choice__input:disabled + .ds-choice__box {
59
+ background: var(--checkbox-bg-disabled);
60
+ border-color: var(--checkbox-border);
61
+ cursor: not-allowed;
62
+ }
63
+
64
+ .ds-choice__input:checked:disabled + .ds-choice__box {
65
+ color: var(--checkbox-fg-disabled);
66
+ }
67
+
68
+ .ds-choice:has(.ds-choice__input:disabled) {
69
+ cursor: not-allowed;
70
+ }
71
+
72
+ .ds-choice__label {
73
+ color: var(--checkbox-label-fg);
74
+ font-size: var(--text-sm);
75
+ line-height: var(--leading-sm);
76
+ }
77
+
78
+ .ds-choice:has(.ds-choice__input:disabled) .ds-choice__label {
79
+ color: var(--checkbox-label-fg-disabled);
80
+ }
81
+
82
+ .ds-choice__description {
83
+ color: var(--color-text-tertiary);
84
+ display: block;
85
+ font-size: var(--text-sm);
86
+ line-height: var(--leading-sm);
87
+ margin-block-start: var(--space-0-5);
88
+ }
89
+
90
+ .ds-choice--radio .ds-choice__box {
91
+ border-radius: var(--radius-full);
92
+ }
93
+
94
+ .ds-choice--radio .ds-choice__input:checked + .ds-choice__box {
95
+ background: var(--radio-bg-checked);
96
+ border-color: var(--radio-border-checked);
97
+ }
98
+
99
+ .ds-choice--radio .ds-choice__box::after {
100
+ background: var(--radio-dot);
101
+ border-radius: var(--radius-full);
102
+ content: "";
103
+ height: var(--radio-dot-size);
104
+ transform: scale(0);
105
+ transition: transform var(--duration-fast) var(--ease-standard);
106
+ width: var(--radio-dot-size);
107
+ }
108
+
109
+ .ds-choice--radio .ds-choice__input:checked + .ds-choice__box::after {
110
+ transform: scale(1);
111
+ }
112
+
113
+ .ds-choice--radio .ds-choice__input:disabled + .ds-choice__box {
114
+ background: var(--radio-bg-disabled);
115
+ }
116
+
117
+ .ds-choice-group {
118
+ border: 0;
119
+ display: grid;
120
+ gap: var(--space-3);
121
+ padding: 0;
122
+ }
123
+
124
+ .ds-choice-group__legend {
125
+ color: var(--color-text-primary);
126
+ font-size: var(--text-sm);
127
+ font-weight: var(--weight-medium);
128
+ margin-block-end: var(--space-2);
129
+ padding: 0;
130
+ }
131
+
132
+ .ds-choice-group__hint {
133
+ color: var(--color-text-secondary);
134
+ font-size: var(--text-sm);
135
+ margin-block-end: var(--space-3);
136
+ }
137
+ }
@@ -0,0 +1,42 @@
1
+ @layer components {
2
+ .ds-code {
3
+ margin: 0;
4
+ max-width: 100%;
5
+ min-width: 0;
6
+ }
7
+
8
+ .ds-code__label {
9
+ color: var(--code-label-fg);
10
+ font-family: var(--font-body);
11
+ font-size: var(--code-label-size);
12
+ font-weight: var(--type-overline-weight);
13
+ letter-spacing: var(--type-overline-tracking);
14
+ text-transform: uppercase;
15
+ margin-block-end: var(--code-label-margin);
16
+ }
17
+
18
+ .ds-code__pre {
19
+ background: var(--code-bg);
20
+ border: 1px solid var(--code-border);
21
+ border-radius: var(--code-radius);
22
+ color: var(--code-fg);
23
+ font-family: var(--font-mono);
24
+ font-size: var(--code-font-size);
25
+ line-height: var(--code-line-height);
26
+ margin: 0;
27
+ max-width: 100%;
28
+ overflow-x: auto;
29
+ padding: var(--code-padding);
30
+ scrollbar-color: var(--code-scrollbar) transparent;
31
+ scrollbar-width: thin;
32
+ tab-size: 2;
33
+ white-space: pre;
34
+ }
35
+
36
+ .ds-code__pre code {
37
+ background: none;
38
+ border-radius: 0;
39
+ font-size: inherit;
40
+ padding: 0;
41
+ }
42
+ }
@@ -0,0 +1,57 @@
1
+ @layer components {
2
+ .ds-empty {
3
+ align-items: center;
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--empty-gap);
7
+ padding: var(--empty-padding);
8
+ text-align: center;
9
+ }
10
+
11
+ .ds-empty--dashed {
12
+ border: 1px dashed var(--empty-dashed-border);
13
+ border-radius: var(--empty-radius);
14
+ }
15
+
16
+ .ds-empty__icon {
17
+ align-items: center;
18
+ background: var(--empty-icon-bg);
19
+ border-radius: var(--radius-full);
20
+ color: var(--empty-icon-fg);
21
+ display: inline-flex;
22
+ height: var(--empty-icon-size);
23
+ justify-content: center;
24
+ margin-block-end: var(--space-2);
25
+ width: var(--empty-icon-size);
26
+ }
27
+
28
+ .ds-empty__skeleton {
29
+ display: grid;
30
+ gap: var(--empty-skeleton-gap);
31
+ max-width: var(--empty-skeleton-width);
32
+ width: 100%;
33
+ }
34
+
35
+ .ds-empty__title {
36
+ color: var(--empty-title-fg);
37
+ font-size: var(--empty-title-size);
38
+ font-weight: var(--weight-semibold);
39
+ letter-spacing: var(--type-heading-tracking);
40
+ line-height: var(--leading-lg);
41
+ }
42
+
43
+ .ds-empty__body {
44
+ color: var(--empty-body-fg);
45
+ font-size: var(--empty-body-size);
46
+ line-height: var(--leading-base);
47
+ max-width: var(--empty-max-width);
48
+ }
49
+
50
+ .ds-empty__actions {
51
+ display: flex;
52
+ flex-wrap: wrap;
53
+ gap: var(--space-3);
54
+ justify-content: center;
55
+ margin-block-start: var(--space-2);
56
+ }
57
+ }
@@ -0,0 +1,55 @@
1
+ @layer components {
2
+ .ds-example {
3
+ display: grid;
4
+ gap: var(--example-gap);
5
+ grid-template-columns: minmax(0, 1fr);
6
+ margin: 0;
7
+ min-width: 0;
8
+ }
9
+
10
+ .ds-example + .ds-example {
11
+ margin-block-start: var(--space-8);
12
+ }
13
+
14
+ .ds-example__caption {
15
+ align-items: baseline;
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ gap: var(--space-2) var(--space-3);
19
+ justify-content: space-between;
20
+ }
21
+
22
+ .ds-example__title {
23
+ color: var(--example-label-fg);
24
+ font-family: var(--font-body);
25
+ font-size: var(--type-overline-size);
26
+ font-weight: var(--type-overline-weight);
27
+ letter-spacing: var(--type-overline-tracking);
28
+ text-transform: uppercase;
29
+ }
30
+
31
+ .ds-example__description {
32
+ color: var(--example-description-fg);
33
+ font-size: var(--text-sm);
34
+ }
35
+
36
+ .ds-example__preview {
37
+ background: var(--example-bg);
38
+ border: 1px solid var(--example-border);
39
+ border-radius: var(--example-radius);
40
+ min-height: var(--example-preview-min);
41
+ min-width: 0;
42
+ padding: var(--example-padding);
43
+ }
44
+
45
+ @media (max-width: 699px) {
46
+ .ds-example__preview {
47
+ padding: var(--space-4);
48
+ }
49
+ }
50
+
51
+ .ds-example__preview--flush {
52
+ overflow: hidden;
53
+ padding: 0;
54
+ }
55
+ }
@@ -0,0 +1,62 @@
1
+ @layer components {
2
+ .ds-grid {
3
+ display: grid;
4
+ gap: var(--grid-gap);
5
+ grid-template-columns: repeat(var(--grid-columns, 12), minmax(0, 1fr));
6
+ }
7
+
8
+ .ds-grid--gap-sm {
9
+ gap: var(--grid-gap-sm);
10
+ }
11
+
12
+ .ds-grid--gap-lg {
13
+ gap: var(--grid-gap-lg);
14
+ }
15
+
16
+ .ds-grid--auto {
17
+ grid-template-columns: repeat(
18
+ auto-fit,
19
+ minmax(min(var(--grid-min, 16rem), 100%), 1fr)
20
+ );
21
+ }
22
+
23
+ .ds-grid--masonry {
24
+ columns: var(--grid-masonry-columns, 3);
25
+ column-gap: var(--grid-gap);
26
+ display: block;
27
+ }
28
+
29
+ .ds-grid--masonry > * {
30
+ break-inside: avoid;
31
+ margin-block-end: var(--grid-gap);
32
+ }
33
+
34
+ .ds-grid__item {
35
+ grid-column: span var(--grid-item-span, 1);
36
+ min-width: 0;
37
+ }
38
+
39
+ .ds-grid__container {
40
+ margin-inline: auto;
41
+ max-width: var(--grid-container);
42
+ padding-inline: var(--grid-gutter);
43
+ width: 100%;
44
+ }
45
+
46
+ @media (max-width: 700px) {
47
+ .ds-grid {
48
+ grid-template-columns: repeat(
49
+ var(--grid-columns-phone, 1),
50
+ minmax(0, 1fr)
51
+ );
52
+ }
53
+
54
+ .ds-grid--masonry {
55
+ columns: 1;
56
+ }
57
+
58
+ .ds-grid__item {
59
+ grid-column: span var(--grid-item-span-phone, 1);
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,198 @@
1
+ @layer components {
2
+ .ds-field {
3
+ display: grid;
4
+ gap: var(--space-1-5);
5
+ width: 100%;
6
+ }
7
+
8
+ .ds-field__label {
9
+ color: var(--input-label-fg);
10
+ font-family: var(--input-font);
11
+ font-size: var(--text-sm);
12
+ font-weight: var(--weight-medium);
13
+ line-height: var(--leading-sm);
14
+ }
15
+
16
+ .ds-field__optional {
17
+ color: var(--input-hint-fg);
18
+ font-weight: var(--weight-regular);
19
+ }
20
+
21
+ .ds-field__required {
22
+ color: var(--input-required-fg);
23
+ }
24
+
25
+ .ds-field__control {
26
+ position: relative;
27
+ }
28
+
29
+ .ds-input {
30
+ background: var(--input-bg);
31
+ border: 1px solid var(--input-border);
32
+ border-radius: var(--input-radius);
33
+ color: var(--input-fg);
34
+ font-family: var(--input-font);
35
+ font-size: var(--input-font-size);
36
+ height: var(--input-height-md);
37
+ line-height: var(--leading-sm);
38
+ padding: var(--input-padding-y) var(--input-padding-x);
39
+ transition:
40
+ border-color var(--duration-fast) var(--ease-standard),
41
+ box-shadow var(--duration-fast) var(--ease-standard),
42
+ background-color var(--duration-fast) var(--ease-standard);
43
+ width: 100%;
44
+ }
45
+
46
+ .ds-input::placeholder {
47
+ color: var(--input-placeholder);
48
+ opacity: 1;
49
+ }
50
+
51
+ .ds-input:hover:not(:disabled):not(:focus) {
52
+ background: var(--input-bg-hover);
53
+ border-color: var(--input-border-hover);
54
+ }
55
+
56
+ .ds-input:focus {
57
+ border-color: var(--input-border-focus);
58
+ box-shadow:
59
+ 0 0 0 var(--input-focus-width) var(--input-bg),
60
+ 0 0 0 calc(var(--input-focus-width) * 2) var(--input-ring-focus);
61
+ outline: none;
62
+ }
63
+
64
+ .ds-input--sm {
65
+ height: var(--input-height-sm);
66
+ }
67
+
68
+ .ds-input--lg {
69
+ height: var(--input-height-lg);
70
+ }
71
+
72
+ .ds-input--with-state {
73
+ padding-inline-end: var(--space-10);
74
+ }
75
+
76
+ .ds-input.is-invalid {
77
+ border-color: var(--input-border-invalid);
78
+ }
79
+
80
+ .ds-input.is-invalid:focus {
81
+ box-shadow:
82
+ 0 0 0 var(--input-focus-width) var(--input-bg),
83
+ 0 0 0 calc(var(--input-focus-width) * 2) var(--input-ring-invalid);
84
+ }
85
+
86
+ .ds-input.is-valid {
87
+ border-color: var(--input-border-valid);
88
+ }
89
+
90
+ .ds-input:disabled {
91
+ background: var(--input-bg-disabled);
92
+ border-color: var(--input-border);
93
+ color: var(--input-fg-disabled);
94
+ cursor: not-allowed;
95
+ }
96
+
97
+ .ds-input:disabled::placeholder {
98
+ color: var(--input-fg-disabled);
99
+ }
100
+
101
+ textarea.ds-input {
102
+ height: auto;
103
+ min-height: var(--space-24);
104
+ resize: vertical;
105
+ }
106
+
107
+ .ds-field__hint,
108
+ .ds-field__error {
109
+ align-items: flex-start;
110
+ display: flex;
111
+ font-family: var(--input-font);
112
+ font-size: var(--text-sm);
113
+ gap: var(--space-1);
114
+ line-height: var(--leading-sm);
115
+ }
116
+
117
+ .ds-field__hint {
118
+ color: var(--input-hint-fg);
119
+ }
120
+
121
+ .ds-field__error {
122
+ color: var(--input-error-fg);
123
+ font-weight: var(--weight-medium);
124
+ }
125
+
126
+ .ds-field__error[hidden],
127
+ .ds-field__hint[hidden] {
128
+ display: none;
129
+ }
130
+
131
+ .ds-field__count {
132
+ color: var(--input-count-fg);
133
+ font-family: var(--font-mono);
134
+ font-size: var(--text-xs);
135
+ font-variant-numeric: tabular-nums;
136
+ justify-self: end;
137
+ }
138
+
139
+ .ds-field__state {
140
+ align-items: center;
141
+ color: var(--input-border-valid);
142
+ display: inline-flex;
143
+ height: var(--space-4);
144
+ position: absolute;
145
+ right: var(--input-padding-x);
146
+ top: 50%;
147
+ transform: translateY(-50%);
148
+ width: var(--space-4);
149
+ }
150
+
151
+ .ds-field--reveal .ds-field__state {
152
+ right: calc(var(--input-padding-x) + var(--space-7));
153
+ }
154
+
155
+ .ds-field--reveal .ds-input {
156
+ padding-inline-end: calc(var(--space-10) + var(--space-2));
157
+ }
158
+
159
+ .ds-field--reveal .ds-input--with-state {
160
+ padding-inline-end: calc(var(--space-10) + var(--space-6));
161
+ }
162
+
163
+ .ds-field__reveal {
164
+ align-items: center;
165
+ background: transparent;
166
+ border: 0;
167
+ border-radius: var(--radius-sm);
168
+ color: var(--input-reveal-fg);
169
+ cursor: pointer;
170
+ display: inline-flex;
171
+ height: var(--space-7);
172
+ justify-content: center;
173
+ position: absolute;
174
+ right: calc(var(--input-padding-x) - var(--space-1));
175
+ top: 50%;
176
+ transform: translateY(-50%);
177
+ width: var(--space-7);
178
+ }
179
+
180
+ .ds-field__reveal:hover:not(:disabled) {
181
+ background: var(--input-reveal-bg-hover);
182
+ color: var(--input-reveal-fg-hover);
183
+ }
184
+
185
+ .ds-field__reveal:focus-visible {
186
+ outline: var(--input-focus-width) solid var(--input-ring-focus);
187
+ outline-offset: calc(var(--input-focus-offset) - 2px);
188
+ }
189
+
190
+ .ds-field__reveal:disabled {
191
+ color: var(--input-fg-disabled);
192
+ cursor: not-allowed;
193
+ }
194
+
195
+ .ds-field__reveal [hidden] {
196
+ display: none;
197
+ }
198
+ }
@@ -0,0 +1,143 @@
1
+ @layer components {
2
+ .ds-modal {
3
+ background: var(--modal-bg);
4
+ border: 1px solid var(--modal-border);
5
+ border-radius: var(--modal-radius);
6
+ box-shadow: var(--modal-shadow);
7
+ color: var(--modal-fg);
8
+ margin: auto;
9
+ max-height: calc(100dvh - var(--space-8));
10
+ max-width: var(--modal-max-width-md);
11
+ overflow: auto;
12
+ padding: 0;
13
+ width: calc(100% - var(--space-8));
14
+ }
15
+
16
+ .ds-modal::backdrop {
17
+ background: var(--modal-backdrop);
18
+ }
19
+
20
+ .ds-modal--sheet {
21
+ border-end-start-radius: 0;
22
+ border-end-end-radius: 0;
23
+ margin-block: auto 0;
24
+ max-height: 90dvh;
25
+ max-width: var(--modal-max-width-lg);
26
+ width: 100%;
27
+ }
28
+
29
+ @media (max-width: 699px) {
30
+ .ds-modal--sheet {
31
+ max-width: 100%;
32
+ }
33
+ }
34
+
35
+ .ds-modal[open] {
36
+ animation: ds-modal-in var(--duration-base) var(--ease-enter);
37
+ }
38
+
39
+ .ds-modal--sheet[open] {
40
+ animation: ds-sheet-in var(--duration-base) var(--ease-enter);
41
+ }
42
+
43
+ .ds-modal--sm {
44
+ max-width: var(--modal-max-width-sm);
45
+ }
46
+
47
+ .ds-modal--lg {
48
+ max-width: var(--modal-max-width-lg);
49
+ }
50
+
51
+ .ds-modal__header {
52
+ align-items: flex-start;
53
+ display: flex;
54
+ gap: var(--modal-gap);
55
+ justify-content: space-between;
56
+ padding: var(--modal-padding) var(--modal-padding) 0;
57
+ }
58
+
59
+ .ds-modal__title {
60
+ color: var(--modal-title-fg);
61
+ font-size: var(--text-lg);
62
+ font-weight: var(--weight-semibold);
63
+ letter-spacing: var(--type-heading-tracking);
64
+ line-height: var(--leading-lg);
65
+ }
66
+
67
+ .ds-modal__description {
68
+ color: var(--modal-body-fg);
69
+ font-size: var(--text-sm);
70
+ max-width: none;
71
+ line-height: var(--leading-base);
72
+ margin-block-start: var(--space-2);
73
+ }
74
+
75
+ .ds-modal__close {
76
+ align-items: center;
77
+ background: transparent;
78
+ border: 0;
79
+ border-radius: var(--radius-sm);
80
+ color: var(--modal-close-fg);
81
+ display: inline-flex;
82
+ flex: none;
83
+ height: var(--space-8);
84
+ justify-content: center;
85
+ margin: calc(-1 * var(--space-1));
86
+ width: var(--space-8);
87
+ }
88
+
89
+ .ds-modal__close:hover {
90
+ background: var(--modal-close-bg-hover);
91
+ }
92
+
93
+ .ds-modal__close:focus-visible {
94
+ outline: var(--modal-focus-width) solid var(--modal-focus-color);
95
+ outline-offset: var(--modal-focus-offset);
96
+ }
97
+
98
+ .ds-modal__body {
99
+ color: var(--modal-body-fg);
100
+ font-size: var(--text-sm);
101
+ line-height: var(--leading-base);
102
+ padding: var(--modal-gap) var(--modal-padding) var(--modal-padding);
103
+ }
104
+
105
+ .ds-modal__footer {
106
+ align-items: center;
107
+ background: var(--modal-footer-bg);
108
+ border-top: 1px solid var(--modal-border);
109
+ border-end-end-radius: inherit;
110
+ border-end-start-radius: inherit;
111
+ display: flex;
112
+ gap: var(--space-3);
113
+ justify-content: flex-end;
114
+ padding: var(--space-4) var(--modal-padding);
115
+ }
116
+
117
+ @keyframes ds-modal-in {
118
+ from {
119
+ opacity: 0;
120
+ transform: translateY(var(--space-2)) scale(0.985);
121
+ }
122
+ to {
123
+ opacity: 1;
124
+ transform: none;
125
+ }
126
+ }
127
+
128
+ @keyframes ds-sheet-in {
129
+ from {
130
+ transform: translateY(100%);
131
+ }
132
+ to {
133
+ transform: none;
134
+ }
135
+ }
136
+
137
+ @media (prefers-reduced-motion: reduce) {
138
+ .ds-modal[open],
139
+ .ds-modal--sheet[open] {
140
+ animation: none;
141
+ }
142
+ }
143
+ }