@db-vincent/components 0.0.0-stage → 0.1.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.
Files changed (86) 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/Avatar.astro +88 -0
  5. package/src/astro/AvatarGroup.astro +63 -0
  6. package/src/astro/Badge.astro +23 -0
  7. package/src/astro/Breadcrumbs.astro +45 -0
  8. package/src/astro/Button.astro +125 -0
  9. package/src/astro/Card.astro +63 -0
  10. package/src/astro/Checkbox.astro +61 -0
  11. package/src/astro/Chip.astro +135 -0
  12. package/src/astro/CodeBlock.astro +17 -0
  13. package/src/astro/Drawer.astro +30 -0
  14. package/src/astro/EmptyState.astro +45 -0
  15. package/src/astro/Example.astro +37 -0
  16. package/src/astro/Grid.astro +56 -0
  17. package/src/astro/GridItem.astro +25 -0
  18. package/src/astro/Icon.astro +52 -0
  19. package/src/astro/Menu.astro +151 -0
  20. package/src/astro/MenuItem.astro +57 -0
  21. package/src/astro/Modal.astro +124 -0
  22. package/src/astro/Navbar.astro +756 -0
  23. package/src/astro/PageHeader.astro +34 -0
  24. package/src/astro/Pagination.astro +212 -0
  25. package/src/astro/Popover.astro +51 -0
  26. package/src/astro/Progress.astro +71 -0
  27. package/src/astro/Radio.astro +58 -0
  28. package/src/astro/RadioGroup.astro +25 -0
  29. package/src/astro/Section.astro +25 -0
  30. package/src/astro/Select.astro +420 -0
  31. package/src/astro/Sidebar.astro +215 -0
  32. package/src/astro/Skeleton.astro +41 -0
  33. package/src/astro/Spinner.astro +20 -0
  34. package/src/astro/Stepper.astro +82 -0
  35. package/src/astro/Switch.astro +78 -0
  36. package/src/astro/Table.astro +268 -0
  37. package/src/astro/Tabs.astro +83 -0
  38. package/src/astro/TextField.astro +305 -0
  39. package/src/astro/ThemeToggle.astro +66 -0
  40. package/src/astro/Toast.astro +181 -0
  41. package/src/astro/Tooltip.astro +54 -0
  42. package/src/astro/TopBar.astro +29 -0
  43. package/src/data/icons.ts +120 -0
  44. package/src/scripts/avatar.ts +33 -0
  45. package/src/scripts/menu.ts +218 -0
  46. package/src/scripts/tabs.ts +127 -0
  47. package/src/scripts/toast.ts +565 -0
  48. package/src/scripts/tooltip.ts +127 -0
  49. package/src/styles/accordion.css +79 -0
  50. package/src/styles/alert.css +108 -0
  51. package/src/styles/avatar.css +131 -0
  52. package/src/styles/badge.css +48 -0
  53. package/src/styles/base.css +205 -0
  54. package/src/styles/breadcrumbs.css +54 -0
  55. package/src/styles/button.css +174 -0
  56. package/src/styles/card.css +112 -0
  57. package/src/styles/chip.css +106 -0
  58. package/src/styles/choice.css +143 -0
  59. package/src/styles/code.css +44 -0
  60. package/src/styles/empty.css +59 -0
  61. package/src/styles/example.css +57 -0
  62. package/src/styles/grid.css +64 -0
  63. package/src/styles/input.css +208 -0
  64. package/src/styles/menu.css +151 -0
  65. package/src/styles/modal.css +285 -0
  66. package/src/styles/motion.css +114 -0
  67. package/src/styles/nav.css +232 -0
  68. package/src/styles/navbar.css +658 -0
  69. package/src/styles/page-header.css +62 -0
  70. package/src/styles/pagination.css +81 -0
  71. package/src/styles/popover.css +134 -0
  72. package/src/styles/progress.css +95 -0
  73. package/src/styles/section.css +38 -0
  74. package/src/styles/select.css +246 -0
  75. package/src/styles/skeleton.css +66 -0
  76. package/src/styles/spinner.css +44 -0
  77. package/src/styles/sr-only.css +14 -0
  78. package/src/styles/stepper.css +169 -0
  79. package/src/styles/switch.css +143 -0
  80. package/src/styles/table.css +177 -0
  81. package/src/styles/tabs.css +120 -0
  82. package/src/styles/theme-toggle.css +31 -0
  83. package/src/styles/toast.css +225 -0
  84. package/src/styles/tooltip.css +63 -0
  85. package/src/styles/topbar.css +32 -0
  86. package/README.md +0 -3
@@ -0,0 +1,64 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-grid {
5
+ display: grid;
6
+ gap: var(--grid-gap);
7
+ grid-template-columns: repeat(var(--grid-columns, 12), minmax(0, 1fr));
8
+ }
9
+
10
+ .ds-grid--gap-sm {
11
+ gap: var(--grid-gap-sm);
12
+ }
13
+
14
+ .ds-grid--gap-lg {
15
+ gap: var(--grid-gap-lg);
16
+ }
17
+
18
+ .ds-grid--auto {
19
+ grid-template-columns: repeat(
20
+ auto-fit,
21
+ minmax(min(var(--grid-min, 16rem), 100%), 1fr)
22
+ );
23
+ }
24
+
25
+ .ds-grid--masonry {
26
+ columns: var(--grid-masonry-columns, 3);
27
+ column-gap: var(--grid-gap);
28
+ display: block;
29
+ }
30
+
31
+ .ds-grid--masonry > * {
32
+ break-inside: avoid;
33
+ margin-block-end: var(--grid-gap);
34
+ }
35
+
36
+ .ds-grid__item {
37
+ grid-column: span var(--grid-item-span, 1);
38
+ min-width: 0;
39
+ }
40
+
41
+ .ds-grid__container {
42
+ margin-inline: auto;
43
+ max-width: var(--grid-container);
44
+ padding-inline: var(--grid-gutter);
45
+ width: 100%;
46
+ }
47
+
48
+ @media (max-width: 700px) {
49
+ .ds-grid {
50
+ grid-template-columns: repeat(
51
+ var(--grid-columns-phone, 1),
52
+ minmax(0, 1fr)
53
+ );
54
+ }
55
+
56
+ .ds-grid--masonry {
57
+ columns: 1;
58
+ }
59
+
60
+ .ds-grid__item {
61
+ grid-column: span var(--grid-item-span-phone, 1);
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,208 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-field {
5
+ display: grid;
6
+ gap: var(--space-1-5);
7
+ width: 100%;
8
+ }
9
+
10
+ .ds-field__label {
11
+ color: var(--input-label-fg);
12
+ font-family: var(--input-font);
13
+ font-size: var(--text-sm);
14
+ font-weight: var(--weight-medium);
15
+ line-height: var(--leading-sm);
16
+ }
17
+
18
+ .ds-field__optional {
19
+ color: var(--input-hint-fg);
20
+ font-weight: var(--weight-regular);
21
+ }
22
+
23
+ .ds-field__required {
24
+ color: var(--input-required-fg);
25
+ }
26
+
27
+ .ds-field__control {
28
+ position: relative;
29
+ }
30
+
31
+ .ds-input {
32
+ background: var(--input-bg);
33
+ border: 1px solid var(--input-border);
34
+ border-radius: var(--input-radius);
35
+ color: var(--input-fg);
36
+ font-family: var(--input-font);
37
+ font-size: var(--input-font-size);
38
+ height: var(--input-height-md);
39
+ line-height: var(--leading-sm);
40
+ padding: var(--input-padding-y) var(--input-padding-x);
41
+ transition:
42
+ border-color var(--duration-fast) var(--ease-standard),
43
+ box-shadow var(--duration-fast) var(--ease-standard),
44
+ background-color var(--duration-fast) var(--ease-standard);
45
+ width: 100%;
46
+ }
47
+
48
+ .ds-input::placeholder {
49
+ color: var(--input-placeholder);
50
+ opacity: 1;
51
+ }
52
+
53
+ .ds-input:hover:not(:disabled):not(:focus) {
54
+ background: var(--input-bg-hover);
55
+ border-color: var(--input-border-hover);
56
+ }
57
+
58
+ .ds-input:focus {
59
+ border-color: var(--input-border-focus);
60
+ box-shadow:
61
+ 0 0 0 var(--input-focus-width) var(--input-bg),
62
+ 0 0 0 calc(var(--input-focus-width) * 2) var(--input-ring-focus);
63
+ outline: 2px solid transparent;
64
+ }
65
+
66
+ .ds-input--sm {
67
+ height: var(--input-height-sm);
68
+ }
69
+
70
+ .ds-input--lg {
71
+ height: var(--input-height-lg);
72
+ }
73
+
74
+ .ds-input--with-state {
75
+ padding-inline-end: var(--space-10);
76
+ }
77
+
78
+ .ds-input.is-invalid {
79
+ border-color: var(--input-border-invalid);
80
+ }
81
+
82
+ .ds-input.is-invalid:focus {
83
+ box-shadow:
84
+ 0 0 0 var(--input-focus-width) var(--input-bg),
85
+ 0 0 0 calc(var(--input-focus-width) * 2) var(--input-ring-invalid);
86
+ }
87
+
88
+ .ds-input.is-valid {
89
+ border-color: var(--input-border-valid);
90
+ }
91
+
92
+ .ds-input:disabled {
93
+ background: var(--input-bg-disabled);
94
+ border-color: var(--input-border);
95
+ color: var(--input-fg-disabled);
96
+ cursor: not-allowed;
97
+ }
98
+
99
+ .ds-input:disabled::placeholder {
100
+ color: var(--input-fg-disabled);
101
+ }
102
+
103
+ textarea.ds-input {
104
+ height: auto;
105
+ min-height: var(--space-24);
106
+ resize: vertical;
107
+ }
108
+
109
+ textarea.ds-input--resize-none {
110
+ resize: none;
111
+ }
112
+
113
+ textarea.ds-input--resize-both {
114
+ resize: both;
115
+ }
116
+
117
+ .ds-field__hint,
118
+ .ds-field__error {
119
+ align-items: flex-start;
120
+ display: flex;
121
+ font-family: var(--input-font);
122
+ font-size: var(--text-sm);
123
+ gap: var(--space-1);
124
+ line-height: var(--leading-sm);
125
+ }
126
+
127
+ .ds-field__hint {
128
+ color: var(--input-hint-fg);
129
+ }
130
+
131
+ .ds-field__error {
132
+ color: var(--input-error-fg);
133
+ font-weight: var(--weight-medium);
134
+ }
135
+
136
+ .ds-field__error[hidden],
137
+ .ds-field__hint[hidden] {
138
+ display: none;
139
+ }
140
+
141
+ .ds-field__count {
142
+ color: var(--input-count-fg);
143
+ font-family: var(--font-mono);
144
+ font-size: var(--text-xs);
145
+ font-variant-numeric: tabular-nums;
146
+ justify-self: end;
147
+ }
148
+
149
+ .ds-field__state {
150
+ align-items: center;
151
+ color: var(--input-border-valid);
152
+ display: inline-flex;
153
+ height: var(--space-4);
154
+ position: absolute;
155
+ right: var(--input-padding-x);
156
+ top: 50%;
157
+ transform: translateY(-50%);
158
+ width: var(--space-4);
159
+ }
160
+
161
+ .ds-field--reveal .ds-field__state {
162
+ right: calc(var(--input-padding-x) + var(--space-7));
163
+ }
164
+
165
+ .ds-field--reveal .ds-input {
166
+ padding-inline-end: calc(var(--space-10) + var(--space-2));
167
+ }
168
+
169
+ .ds-field--reveal .ds-input--with-state {
170
+ padding-inline-end: calc(var(--space-10) + var(--space-6));
171
+ }
172
+
173
+ .ds-field__reveal {
174
+ align-items: center;
175
+ background: transparent;
176
+ border: 0;
177
+ border-radius: var(--radius-sm);
178
+ color: var(--input-reveal-fg);
179
+ cursor: pointer;
180
+ display: inline-flex;
181
+ height: var(--space-7);
182
+ justify-content: center;
183
+ position: absolute;
184
+ right: calc(var(--input-padding-x) - var(--space-1));
185
+ top: 50%;
186
+ transform: translateY(-50%);
187
+ width: var(--space-7);
188
+ }
189
+
190
+ .ds-field__reveal:hover:not(:disabled) {
191
+ background: var(--input-reveal-bg-hover);
192
+ color: var(--input-reveal-fg-hover);
193
+ }
194
+
195
+ .ds-field__reveal:focus-visible {
196
+ outline: var(--input-focus-width) solid var(--input-ring-focus);
197
+ outline-offset: calc(var(--input-focus-offset) - 2px);
198
+ }
199
+
200
+ .ds-field__reveal:disabled {
201
+ color: var(--input-fg-disabled);
202
+ cursor: not-allowed;
203
+ }
204
+
205
+ .ds-field__reveal [hidden] {
206
+ display: none;
207
+ }
208
+ }
@@ -0,0 +1,151 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ /* The surface, animation and anchoring come from popover.css. */
4
+ @layer components {
5
+ .ds-menu {
6
+ max-height: min(var(--menu-max-height), calc(100dvh - var(--space-8)));
7
+ min-width: var(--menu-min-width);
8
+ overflow-y: auto;
9
+ padding: var(--menu-padding);
10
+ }
11
+
12
+ /* Focus lands on the surface after a pointer open so no row looks chosen;
13
+ the rows draw the focus ring as soon as it moves. */
14
+ .ds-menu:focus-visible {
15
+ outline: 0;
16
+ }
17
+
18
+ /* Menus align to the trigger's start edge instead of centring on it. */
19
+ @supports (position-area: block-end) {
20
+ .ds-menu.ds-popover--bottom,
21
+ .ds-menu.ds-popover--top {
22
+ justify-self: normal;
23
+ position-try-fallbacks:
24
+ flip-block,
25
+ flip-inline,
26
+ flip-block flip-inline;
27
+ }
28
+
29
+ .ds-menu.ds-popover--bottom {
30
+ position-area: block-end span-inline-end;
31
+ transform-origin: top left;
32
+ }
33
+
34
+ .ds-menu.ds-popover--top {
35
+ position-area: block-start span-inline-end;
36
+ transform-origin: bottom left;
37
+ }
38
+
39
+ .ds-menu.ds-popover--start,
40
+ .ds-menu.ds-popover--end {
41
+ align-self: normal;
42
+ position-try-fallbacks:
43
+ flip-inline,
44
+ flip-block,
45
+ flip-block flip-inline;
46
+ }
47
+
48
+ .ds-menu.ds-popover--start {
49
+ position-area: inline-start span-block-end;
50
+ transform-origin: top right;
51
+ }
52
+
53
+ .ds-menu.ds-popover--end {
54
+ position-area: inline-end span-block-end;
55
+ transform-origin: top left;
56
+ }
57
+ }
58
+
59
+ .ds-menu__item {
60
+ align-items: center;
61
+ background: transparent;
62
+ border: 0;
63
+ border-radius: var(--menu-item-radius);
64
+ color: var(--menu-item-fg);
65
+ cursor: pointer;
66
+ display: flex;
67
+ font-family: var(--font-body);
68
+ font-size: var(--menu-item-font-size);
69
+ gap: var(--menu-item-gap);
70
+ line-height: var(--menu-item-line-height);
71
+ padding: var(--menu-item-padding-y) var(--menu-item-padding-x);
72
+ text-align: start;
73
+ text-decoration: none;
74
+ width: 100%;
75
+ }
76
+
77
+ .ds-menu__item:focus {
78
+ background: var(--menu-item-bg-active);
79
+ outline: 0;
80
+ }
81
+
82
+ @media (hover: hover) and (pointer: fine) {
83
+ .ds-menu__item:hover {
84
+ background: var(--menu-item-bg-active);
85
+ }
86
+ }
87
+
88
+ .ds-menu__item:focus-visible {
89
+ outline: var(--menu-focus-width) solid var(--menu-focus-color);
90
+ outline-offset: var(--menu-focus-offset);
91
+ }
92
+
93
+ .ds-menu__item[aria-disabled="true"] {
94
+ color: var(--menu-item-fg-disabled);
95
+ cursor: not-allowed;
96
+ }
97
+
98
+ .ds-menu__item--danger {
99
+ color: var(--menu-item-danger-fg);
100
+ }
101
+
102
+ .ds-menu__item--danger:focus {
103
+ background: var(--menu-item-danger-bg-active);
104
+ }
105
+
106
+ @media (hover: hover) and (pointer: fine) {
107
+ .ds-menu__item--danger:hover:not([aria-disabled="true"]) {
108
+ background: var(--menu-item-danger-bg-active);
109
+ }
110
+ }
111
+
112
+ .ds-menu__icon {
113
+ color: var(--menu-icon-fg);
114
+ display: inline-flex;
115
+ flex: none;
116
+ }
117
+
118
+ .ds-menu__item--danger .ds-menu__icon {
119
+ color: inherit;
120
+ }
121
+
122
+ .ds-menu__item[aria-disabled="true"] .ds-menu__icon {
123
+ color: inherit;
124
+ }
125
+
126
+ .ds-menu__indicator {
127
+ color: var(--menu-indicator-fg);
128
+ display: inline-flex;
129
+ flex: none;
130
+ height: var(--menu-indicator-size);
131
+ width: var(--menu-indicator-size);
132
+ }
133
+
134
+ .ds-menu__item[aria-checked="false"] .ds-menu__indicator > * {
135
+ visibility: hidden;
136
+ }
137
+
138
+ .ds-menu__label {
139
+ color: var(--menu-label-fg);
140
+ font-size: var(--menu-label-font-size);
141
+ font-weight: var(--weight-medium);
142
+ line-height: var(--leading-xs);
143
+ padding: var(--menu-item-padding-y) var(--menu-item-padding-x);
144
+ }
145
+
146
+ .ds-menu__separator {
147
+ border-block-start: 1px solid var(--menu-separator);
148
+ height: 0;
149
+ margin-block: var(--space-1);
150
+ }
151
+ }
@@ -0,0 +1,285 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ /* showModal() makes the page inert but does not stop it scrolling. */
5
+ html:has(.ds-modal[open]) {
6
+ overflow: hidden;
7
+ scrollbar-gutter: stable;
8
+ }
9
+
10
+ .ds-modal {
11
+ background: var(--modal-bg);
12
+ border: 1px solid var(--modal-border);
13
+ border-radius: var(--modal-radius);
14
+ box-shadow: var(--modal-shadow);
15
+ color: var(--modal-fg);
16
+ margin: auto;
17
+ max-height: calc(100dvh - var(--space-8));
18
+ max-width: var(--modal-max-width-md);
19
+ opacity: 0;
20
+ overflow: auto;
21
+ padding: 0;
22
+ transform: scale(0.98);
23
+ transition:
24
+ opacity 120ms var(--ease-standard),
25
+ transform 120ms var(--ease-standard),
26
+ display 120ms allow-discrete,
27
+ overlay 120ms allow-discrete;
28
+ width: calc(100% - var(--space-8));
29
+ }
30
+
31
+ .ds-modal[open] {
32
+ opacity: 1;
33
+ transform: none;
34
+ transition:
35
+ opacity 200ms var(--ease-enter),
36
+ transform 200ms var(--ease-enter),
37
+ display 200ms allow-discrete,
38
+ overlay 200ms allow-discrete;
39
+ }
40
+
41
+ .ds-modal::backdrop {
42
+ background: var(--modal-backdrop);
43
+ opacity: 0;
44
+ transition:
45
+ opacity 180ms var(--ease-standard),
46
+ display 180ms allow-discrete,
47
+ overlay 180ms allow-discrete;
48
+ }
49
+
50
+ .ds-modal[open]::backdrop {
51
+ opacity: 1;
52
+ }
53
+
54
+ /* Edge-anchored dialogs (drawer: start, end, bottom) slide in from the edge
55
+ they sit on. Enter is slower than exit. */
56
+ .ds-modal--drawer {
57
+ --ds-modal-from: translateY(100%);
58
+
59
+ opacity: 1;
60
+ transform: var(--ds-modal-from);
61
+ transition:
62
+ transform var(--modal-drawer-duration-exit) var(--ease-standard),
63
+ display var(--modal-drawer-duration-exit) allow-discrete,
64
+ overlay var(--modal-drawer-duration-exit) allow-discrete;
65
+ }
66
+
67
+ .ds-modal--drawer[open] {
68
+ transform: none;
69
+ transition:
70
+ transform var(--modal-drawer-duration-enter) var(--ease-drawer),
71
+ display var(--modal-drawer-duration-enter) allow-discrete,
72
+ overlay var(--modal-drawer-duration-enter) allow-discrete;
73
+ }
74
+
75
+ /* Header and footer stay put; the body scrolls. */
76
+ .ds-modal--drawer {
77
+ border-radius: 0;
78
+ margin-block: 0;
79
+ max-width: 100%;
80
+ overflow: hidden;
81
+ }
82
+
83
+ /* Bottom: full-width sheet, top corners rounded, capped height so the page
84
+ stays visible behind it. */
85
+ .ds-modal--bottom {
86
+ border-start-end-radius: var(--modal-radius);
87
+ border-start-start-radius: var(--modal-radius);
88
+ margin-block: auto 0;
89
+ max-height: 90dvh;
90
+ max-width: var(--modal-max-width-lg);
91
+ width: 100%;
92
+ }
93
+
94
+ /* Start and end: full height, pinned to one inline edge. */
95
+ .ds-modal--start,
96
+ .ds-modal--end {
97
+ height: 100dvh;
98
+ max-height: 100dvh;
99
+ width: min(var(--modal-drawer-width-md), calc(100% - var(--space-8)));
100
+ }
101
+
102
+ .ds-modal--start.ds-modal--sm,
103
+ .ds-modal--end.ds-modal--sm {
104
+ width: min(var(--modal-drawer-width-sm), calc(100% - var(--space-8)));
105
+ }
106
+
107
+ .ds-modal--start.ds-modal--lg,
108
+ .ds-modal--end.ds-modal--lg {
109
+ width: min(var(--modal-drawer-width-lg), calc(100% - var(--space-8)));
110
+ }
111
+
112
+ .ds-modal--drawer[open] {
113
+ display: flex;
114
+ flex-direction: column;
115
+ }
116
+
117
+ .ds-modal--drawer .ds-modal__header,
118
+ .ds-modal--drawer .ds-modal__footer {
119
+ flex: none;
120
+ }
121
+
122
+ .ds-modal--drawer .ds-modal__body {
123
+ flex: 1;
124
+ min-height: 0;
125
+ overflow: auto;
126
+ }
127
+
128
+ .ds-modal--start {
129
+ --ds-modal-from: translateX(-100%);
130
+
131
+ border-start-end-radius: var(--modal-radius);
132
+ border-end-end-radius: var(--modal-radius);
133
+ margin-inline: 0 auto;
134
+ }
135
+
136
+ .ds-modal--end {
137
+ --ds-modal-from: translateX(100%);
138
+
139
+ border-start-start-radius: var(--modal-radius);
140
+ border-end-start-radius: var(--modal-radius);
141
+ margin-inline: auto 0;
142
+ }
143
+
144
+ .ds-modal--start:dir(rtl) {
145
+ --ds-modal-from: translateX(100%);
146
+ }
147
+
148
+ .ds-modal--end:dir(rtl) {
149
+ --ds-modal-from: translateX(-100%);
150
+ }
151
+
152
+ @starting-style {
153
+ .ds-modal[open] {
154
+ opacity: 0;
155
+ transform: translateY(var(--space-2)) scale(0.97);
156
+ }
157
+
158
+ .ds-modal[open]::backdrop {
159
+ opacity: 0;
160
+ }
161
+
162
+ .ds-modal--drawer[open] {
163
+ opacity: 1;
164
+ transform: var(--ds-modal-from);
165
+ }
166
+ }
167
+
168
+ @media (max-width: 699px) {
169
+ .ds-modal--bottom {
170
+ max-width: 100%;
171
+ }
172
+ }
173
+
174
+ .ds-modal--sm {
175
+ max-width: var(--modal-max-width-sm);
176
+ }
177
+
178
+ .ds-modal--lg {
179
+ max-width: var(--modal-max-width-lg);
180
+ }
181
+
182
+ .ds-modal__header {
183
+ align-items: flex-start;
184
+ display: flex;
185
+ gap: var(--modal-gap);
186
+ justify-content: space-between;
187
+ padding: var(--modal-padding) var(--modal-padding) 0;
188
+ }
189
+
190
+ .ds-modal__title {
191
+ color: var(--modal-title-fg);
192
+ font-size: var(--text-lg);
193
+ font-weight: var(--weight-semibold);
194
+ letter-spacing: var(--type-heading-tracking);
195
+ line-height: var(--leading-lg);
196
+ }
197
+
198
+ .ds-modal__description {
199
+ color: var(--modal-body-fg);
200
+ font-size: var(--text-sm);
201
+ max-width: none;
202
+ line-height: var(--leading-base);
203
+ margin-block-start: var(--space-2);
204
+ }
205
+
206
+ .ds-modal__close {
207
+ align-items: center;
208
+ background: transparent;
209
+ border: 0;
210
+ border-radius: var(--radius-sm);
211
+ color: var(--modal-close-fg);
212
+ display: inline-flex;
213
+ flex: none;
214
+ height: var(--space-8);
215
+ justify-content: center;
216
+ margin: calc(-1 * var(--space-1));
217
+ width: var(--space-8);
218
+ }
219
+
220
+ .ds-modal__close:hover {
221
+ background: var(--modal-close-bg-hover);
222
+ }
223
+
224
+ .ds-modal__close:focus-visible {
225
+ outline: var(--modal-focus-width) solid var(--modal-focus-color);
226
+ outline-offset: var(--modal-focus-offset);
227
+ }
228
+
229
+ .ds-modal__body {
230
+ color: var(--modal-body-fg);
231
+ font-size: var(--text-sm);
232
+ line-height: var(--leading-base);
233
+ padding: var(--modal-gap) var(--modal-padding) var(--modal-padding);
234
+ }
235
+
236
+ .ds-modal__footer {
237
+ align-items: center;
238
+ background: var(--modal-footer-bg);
239
+ border-top: 1px solid var(--modal-border);
240
+ border-end-end-radius: inherit;
241
+ border-end-start-radius: inherit;
242
+ display: flex;
243
+ gap: var(--space-3);
244
+ justify-content: flex-end;
245
+ padding: var(--space-4) var(--modal-padding);
246
+ }
247
+
248
+ @media (prefers-reduced-motion: reduce) {
249
+ .ds-modal::backdrop {
250
+ transition-duration: 120ms;
251
+ }
252
+
253
+ .ds-modal,
254
+ .ds-modal[open] {
255
+ transform: none;
256
+ transition-duration: 120ms;
257
+ }
258
+
259
+ .ds-modal--drawer {
260
+ opacity: 0;
261
+ transform: none;
262
+ transition:
263
+ opacity 120ms var(--ease-standard),
264
+ display 120ms allow-discrete,
265
+ overlay 120ms allow-discrete;
266
+ }
267
+
268
+ .ds-modal--drawer[open] {
269
+ opacity: 1;
270
+ transform: none;
271
+ transition:
272
+ opacity 120ms var(--ease-standard),
273
+ display 120ms allow-discrete,
274
+ overlay 120ms allow-discrete;
275
+ }
276
+
277
+ @starting-style {
278
+ .ds-modal[open],
279
+ .ds-modal--drawer[open] {
280
+ opacity: 0;
281
+ transform: none;
282
+ }
283
+ }
284
+ }
285
+ }