@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,81 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-pagination {
5
+ align-items: center;
6
+ display: flex;
7
+ flex-wrap: wrap;
8
+ gap: var(--pagination-gap);
9
+ }
10
+
11
+ .ds-pagination__list {
12
+ align-items: center;
13
+ display: flex;
14
+ flex-wrap: wrap;
15
+ gap: var(--pagination-gap);
16
+ list-style: none;
17
+ margin: 0;
18
+ padding: 0;
19
+ }
20
+
21
+ .ds-pagination__link,
22
+ .ds-pagination__ellipsis {
23
+ align-items: center;
24
+ border: 0;
25
+ border-radius: var(--pagination-radius);
26
+ display: inline-flex;
27
+ font-family: inherit;
28
+ font-size: var(--pagination-font-size);
29
+ height: var(--pagination-item-size);
30
+ justify-content: center;
31
+ min-width: var(--pagination-item-size);
32
+ padding-inline: var(--space-2);
33
+ }
34
+
35
+ .ds-pagination__link {
36
+ background: var(--pagination-bg);
37
+ color: var(--pagination-fg);
38
+ cursor: pointer;
39
+ text-decoration: none;
40
+ }
41
+
42
+ .ds-pagination__link:hover {
43
+ background: var(--pagination-bg-hover);
44
+ color: var(--pagination-fg-hover);
45
+ }
46
+
47
+ .ds-pagination__link:focus-visible {
48
+ outline: var(--pagination-focus-width) solid var(--pagination-focus-color);
49
+ outline-offset: var(--pagination-focus-offset);
50
+ }
51
+
52
+ .ds-pagination__link[aria-disabled="true"],
53
+ .ds-pagination__link:disabled {
54
+ background: transparent;
55
+ color: var(--pagination-fg-disabled);
56
+ cursor: not-allowed;
57
+ pointer-events: none;
58
+ }
59
+
60
+ .ds-pagination__link[aria-current="page"] {
61
+ background: var(--pagination-bg-current);
62
+ color: var(--pagination-fg-current);
63
+ cursor: default;
64
+ font-weight: var(--weight-semibold);
65
+ }
66
+
67
+ .ds-pagination__ellipsis {
68
+ color: var(--pagination-fg-disabled);
69
+ }
70
+
71
+ .ds-pagination__link--direction {
72
+ gap: var(--space-1-5);
73
+ padding-inline: var(--space-3);
74
+ }
75
+
76
+ @media (max-width: 700px) {
77
+ .ds-pagination__link--direction .ds-pagination__label {
78
+ display: none;
79
+ }
80
+ }
81
+ }
@@ -0,0 +1,134 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ /* Wraps a trigger and its anchored surface. Each wrapper scopes the anchor
5
+ name, so any number of popovers, menus and tooltips can share it. */
6
+ .ds-anchor {
7
+ anchor-name: --ds-anchor;
8
+ anchor-scope: --ds-anchor;
9
+ display: inline-flex;
10
+ }
11
+
12
+ .ds-popover {
13
+ --ds-anchor-gap: var(--popover-gap);
14
+
15
+ background: var(--popover-bg);
16
+ border: 1px solid var(--popover-border);
17
+ border-radius: var(--popover-radius);
18
+ box-shadow: var(--popover-shadow);
19
+ color: var(--popover-fg);
20
+ font-size: var(--text-sm);
21
+ line-height: var(--leading-sm);
22
+ max-width: min(var(--popover-max-width), calc(100vw - var(--space-8)));
23
+ opacity: 0;
24
+ overflow: auto;
25
+ padding: var(--popover-padding);
26
+ transform: scale(var(--popover-scale-from));
27
+ transform-origin: top center;
28
+ transition:
29
+ opacity var(--popover-duration-exit) var(--popover-ease-exit),
30
+ transform var(--popover-duration-exit) var(--popover-ease-exit),
31
+ display var(--popover-duration-exit) allow-discrete,
32
+ overlay var(--popover-duration-exit) allow-discrete;
33
+ }
34
+
35
+ .ds-popover:popover-open {
36
+ opacity: 1;
37
+ transform: none;
38
+ transition:
39
+ opacity var(--popover-duration-enter) var(--popover-ease-enter),
40
+ transform var(--popover-duration-enter) var(--popover-ease-enter),
41
+ display var(--popover-duration-enter) allow-discrete,
42
+ overlay var(--popover-duration-enter) allow-discrete;
43
+ }
44
+
45
+ /* Set by script when the surface opens from the keyboard. */
46
+ .ds-popover[data-instant]:popover-open {
47
+ transition-duration: 0s;
48
+ }
49
+
50
+ @starting-style {
51
+ .ds-popover:popover-open {
52
+ opacity: 0;
53
+ transform: scale(var(--popover-scale-from));
54
+ }
55
+ }
56
+
57
+ /* Anchor positioning. Every surface carries a placement modifier. Without
58
+ support the native popover stays centred in the viewport, which is still
59
+ usable. */
60
+ @supports (position-area: block-end) {
61
+ .ds-popover,
62
+ .ds-tooltip {
63
+ /* Centre on the anchor but never past the viewport edge. Held in a
64
+ variable because the CSS validator predates `safe anchor-center`. */
65
+ --ds-anchor-center: safe anchor-center;
66
+
67
+ inset: auto;
68
+ margin: 0;
69
+ position-anchor: --ds-anchor;
70
+ }
71
+
72
+ .ds-popover--bottom,
73
+ .ds-popover--top,
74
+ .ds-tooltip--bottom,
75
+ .ds-tooltip--top {
76
+ justify-self: var(--ds-anchor-center);
77
+ position-try-fallbacks: flip-block;
78
+ }
79
+
80
+ .ds-popover--bottom,
81
+ .ds-tooltip--bottom {
82
+ margin-block-start: var(--ds-anchor-gap);
83
+ position-area: block-end;
84
+ transform-origin: top center;
85
+ }
86
+
87
+ .ds-popover--top,
88
+ .ds-tooltip--top {
89
+ margin-block-end: var(--ds-anchor-gap);
90
+ position-area: block-start;
91
+ transform-origin: bottom center;
92
+ }
93
+
94
+ .ds-popover--start,
95
+ .ds-popover--end,
96
+ .ds-tooltip--start,
97
+ .ds-tooltip--end {
98
+ align-self: var(--ds-anchor-center);
99
+ position-try-fallbacks: flip-inline;
100
+ }
101
+
102
+ .ds-popover--start,
103
+ .ds-tooltip--start {
104
+ margin-inline-end: var(--ds-anchor-gap);
105
+ position-area: inline-start;
106
+ transform-origin: right center;
107
+ }
108
+
109
+ .ds-popover--end,
110
+ .ds-tooltip--end {
111
+ margin-inline-start: var(--ds-anchor-gap);
112
+ position-area: inline-end;
113
+ transform-origin: left center;
114
+ }
115
+ }
116
+
117
+ @media (prefers-reduced-motion: reduce) {
118
+ .ds-popover,
119
+ .ds-popover:popover-open {
120
+ transform: none;
121
+ transition:
122
+ opacity var(--popover-duration-reduced) var(--popover-ease-exit),
123
+ display var(--popover-duration-reduced) allow-discrete,
124
+ overlay var(--popover-duration-reduced) allow-discrete;
125
+ }
126
+
127
+ @starting-style {
128
+ .ds-popover:popover-open {
129
+ opacity: 0;
130
+ transform: none;
131
+ }
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,95 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-progress {
5
+ --ds-progress-height: var(--progress-height-md);
6
+ --ds-progress-fill: var(--progress-accent);
7
+ display: grid;
8
+ gap: var(--progress-gap);
9
+ width: 100%;
10
+ }
11
+
12
+ .ds-progress--sm {
13
+ --ds-progress-height: var(--progress-height-sm);
14
+ }
15
+
16
+ .ds-progress--success {
17
+ --ds-progress-fill: var(--progress-success);
18
+ }
19
+
20
+ .ds-progress--warning {
21
+ --ds-progress-fill: var(--progress-warning);
22
+ }
23
+
24
+ .ds-progress--danger {
25
+ --ds-progress-fill: var(--progress-danger);
26
+ }
27
+
28
+ .ds-progress__head {
29
+ align-items: baseline;
30
+ display: flex;
31
+ font-size: var(--progress-font-size);
32
+ gap: var(--space-3);
33
+ justify-content: space-between;
34
+ line-height: var(--leading-sm);
35
+ }
36
+
37
+ .ds-progress__label {
38
+ color: var(--progress-label-fg);
39
+ font-weight: var(--weight-medium);
40
+ }
41
+
42
+ .ds-progress__value {
43
+ color: var(--progress-value-fg);
44
+ font-family: var(--progress-value-font);
45
+ font-size: var(--text-xs);
46
+ font-variant-numeric: tabular-nums;
47
+ }
48
+
49
+ .ds-progress__track {
50
+ background: var(--progress-track);
51
+ border-radius: var(--progress-radius);
52
+ height: var(--ds-progress-height);
53
+ overflow: hidden;
54
+ }
55
+
56
+ .ds-progress__bar {
57
+ background: var(--ds-progress-fill);
58
+ border-radius: var(--progress-radius);
59
+ height: 100%;
60
+ transform: scaleX(var(--ds-progress-value, 0));
61
+ transform-origin: left;
62
+ transition: transform var(--progress-duration) var(--progress-ease);
63
+ width: 100%;
64
+ }
65
+
66
+ .ds-progress--indeterminate .ds-progress__bar {
67
+ animation: ds-progress-slide var(--progress-indeterminate-duration)
68
+ var(--progress-ease) infinite;
69
+ transform: none;
70
+ transition: none;
71
+ width: var(--progress-indeterminate-width);
72
+ }
73
+
74
+ @keyframes ds-progress-slide {
75
+ from {
76
+ transform: translateX(-100%);
77
+ }
78
+
79
+ to {
80
+ transform: translateX(var(--progress-indeterminate-travel));
81
+ }
82
+ }
83
+
84
+ @media (prefers-reduced-motion: reduce) {
85
+ .ds-progress__bar {
86
+ transition: none;
87
+ }
88
+
89
+ .ds-progress--indeterminate .ds-progress__bar {
90
+ animation: none;
91
+ background: var(--progress-indicator-static);
92
+ width: 100%;
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,38 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-section {
5
+ border-top: 1px solid var(--section-border);
6
+ margin-block-start: var(--section-margin-top);
7
+ padding-block-start: var(--section-padding-top);
8
+ }
9
+
10
+ .ds-section__head {
11
+ align-items: baseline;
12
+ display: flex;
13
+ gap: var(--section-head-gap);
14
+ justify-content: space-between;
15
+ }
16
+
17
+ .ds-section__title {
18
+ font-size: var(--section-title-size);
19
+ letter-spacing: var(--type-title-sm-tracking);
20
+ line-height: var(--section-title-leading);
21
+ margin-block-end: var(--section-title-margin);
22
+ }
23
+
24
+ .ds-section__index {
25
+ color: var(--section-index-fg);
26
+ font-family: var(--font-mono);
27
+ font-size: var(--section-index-size);
28
+ font-variant-numeric: tabular-nums;
29
+ }
30
+
31
+ .ds-section__intro {
32
+ color: var(--section-intro-fg);
33
+ font-size: var(--section-intro-size);
34
+ line-height: var(--leading-base);
35
+ margin-block-end: var(--section-intro-margin);
36
+ max-width: var(--section-intro-max);
37
+ }
38
+ }
@@ -0,0 +1,246 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-select {
5
+ position: relative;
6
+ width: 100%;
7
+ }
8
+
9
+ .ds-select__control {
10
+ appearance: none;
11
+ background: var(--select-bg);
12
+ border: 1px solid var(--select-border);
13
+ border-radius: var(--select-radius);
14
+ color: var(--select-fg);
15
+ font-family: var(--font-body);
16
+ font-size: var(--text-sm);
17
+ height: var(--select-height);
18
+ line-height: var(--leading-sm);
19
+ padding-inline: var(--select-padding-x) var(--space-10);
20
+ transition:
21
+ border-color var(--duration-fast) var(--ease-standard),
22
+ box-shadow var(--duration-fast) var(--ease-standard);
23
+ width: 100%;
24
+ }
25
+
26
+ .ds-select--sm .ds-select__control {
27
+ height: var(--select-height-sm);
28
+ }
29
+
30
+ .ds-select--lg .ds-select__control {
31
+ font-size: var(--text-base);
32
+ height: var(--select-height-lg);
33
+ }
34
+
35
+ .ds-select__control:hover:not(:disabled) {
36
+ border-color: var(--select-border-hover);
37
+ }
38
+
39
+ .ds-select__control:focus {
40
+ border-color: var(--select-border-focus);
41
+ box-shadow:
42
+ 0 0 0 var(--select-focus-width) var(--select-focus-offset-color),
43
+ 0 0 0 calc(var(--select-focus-width) * 2) var(--select-border-focus);
44
+ outline: 2px solid transparent;
45
+ }
46
+
47
+ .ds-select__control:disabled {
48
+ background: var(--select-bg-disabled);
49
+ color: var(--select-fg-disabled);
50
+ cursor: not-allowed;
51
+ }
52
+
53
+ .ds-select__control.is-invalid {
54
+ border-color: var(--select-border-invalid);
55
+ }
56
+
57
+ .ds-select__anchor {
58
+ position: relative;
59
+ }
60
+
61
+ .ds-select__trigger {
62
+ align-items: center;
63
+ cursor: pointer;
64
+ display: flex;
65
+ gap: var(--space-2);
66
+ justify-content: space-between;
67
+ text-align: start;
68
+ }
69
+
70
+ .ds-select__trigger.is-placeholder .ds-select__value {
71
+ color: var(--select-placeholder);
72
+ }
73
+
74
+ .ds-select__value {
75
+ flex: 1;
76
+ min-width: 0;
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
79
+ white-space: nowrap;
80
+ }
81
+
82
+ .ds-select__chevron {
83
+ color: var(--select-chevron);
84
+ pointer-events: none;
85
+ position: absolute;
86
+ right: var(--select-padding-x);
87
+ top: 50%;
88
+ transform: translateY(-50%);
89
+ transition: transform var(--duration-fast) var(--ease-standard);
90
+ }
91
+
92
+ .ds-select.is-open .ds-select__chevron {
93
+ transform: translateY(-50%) rotate(180deg);
94
+ }
95
+
96
+ .ds-select [data-ds-values] {
97
+ display: none;
98
+ }
99
+
100
+ .ds-select__popup {
101
+ background: var(--select-popup-bg);
102
+ border: 1px solid var(--select-popup-border);
103
+ border-radius: var(--select-popup-radius);
104
+ box-shadow: var(--select-popup-shadow);
105
+ inset-inline: 0;
106
+ max-height: var(--select-popup-max-height);
107
+ overflow-y: auto;
108
+ padding: var(--select-popup-padding);
109
+ position: absolute;
110
+ top: calc(100% + var(--select-popup-gap));
111
+ transform-origin: top center;
112
+ z-index: var(--select-popup-z);
113
+ animation: ds-select-in var(--duration-base) var(--ease-enter);
114
+ }
115
+
116
+ @keyframes ds-select-in {
117
+ from {
118
+ opacity: 0;
119
+ transform: translateY(calc(-1 * var(--space-1))) scale(0.97);
120
+ }
121
+ }
122
+
123
+ .ds-select__popup[hidden] {
124
+ display: none;
125
+ }
126
+
127
+ .ds-select__list {
128
+ display: grid;
129
+ gap: var(--space-0-5);
130
+ list-style: none;
131
+ margin: 0;
132
+ padding: 0;
133
+ }
134
+
135
+ .ds-select__option {
136
+ align-items: center;
137
+ border-radius: var(--select-option-radius);
138
+ color: var(--select-option-fg);
139
+ cursor: pointer;
140
+ display: flex;
141
+ gap: var(--space-3);
142
+ justify-content: space-between;
143
+ padding: var(--select-option-padding-y) var(--select-option-padding-x);
144
+ }
145
+
146
+ .ds-select__option:hover,
147
+ .ds-select__option.is-active {
148
+ background: var(--select-option-bg-hover);
149
+ }
150
+
151
+ .ds-select__option[aria-selected="true"] {
152
+ background: var(--select-option-bg-selected);
153
+ color: var(--select-option-fg-selected);
154
+ }
155
+
156
+ .ds-select__option[aria-disabled="true"] {
157
+ color: var(--select-option-fg-muted);
158
+ cursor: not-allowed;
159
+ }
160
+
161
+ .ds-select__option[aria-disabled="true"]:hover {
162
+ background: transparent;
163
+ }
164
+
165
+ .ds-select__option:focus-visible {
166
+ outline: var(--select-focus-width) solid var(--select-border-focus);
167
+ outline-offset: calc(-1 * var(--select-focus-offset));
168
+ }
169
+
170
+ .ds-select__option-text {
171
+ display: grid;
172
+ gap: var(--space-0-5);
173
+ min-width: 0;
174
+ }
175
+
176
+ .ds-select__option-label {
177
+ font-size: var(--text-sm);
178
+ line-height: var(--leading-sm);
179
+ }
180
+
181
+ .ds-select__option-description {
182
+ color: inherit;
183
+ color: var(--select-option-description);
184
+ font-size: var(--text-sm);
185
+ line-height: var(--leading-sm);
186
+ }
187
+
188
+ .ds-select__indicator {
189
+ align-items: center;
190
+ border: 1px solid var(--select-border);
191
+ border-radius: var(--radius-xs);
192
+ color: transparent;
193
+ display: inline-flex;
194
+ flex: none;
195
+ height: var(--select-indicator-size);
196
+ justify-content: center;
197
+ width: var(--select-indicator-size);
198
+ }
199
+
200
+ .ds-select__option[aria-selected="true"] .ds-select__indicator {
201
+ background: var(--select-indicator-bg);
202
+ border-color: var(--select-indicator-bg);
203
+ color: var(--select-indicator-fg);
204
+ }
205
+
206
+ .ds-select:not(.ds-select--multiple) .ds-select__indicator {
207
+ background: transparent;
208
+ border-color: transparent;
209
+ }
210
+
211
+ .ds-select:not(.ds-select--multiple)
212
+ .ds-select__option[aria-selected="true"]
213
+ .ds-select__indicator {
214
+ background: transparent;
215
+ color: var(--select-option-fg-selected);
216
+ }
217
+
218
+ .ds-select__footer {
219
+ border-top: 1px solid var(--select-popup-footer-border);
220
+ margin-block-start: var(--select-popup-gap);
221
+ padding-block-start: var(--select-popup-gap);
222
+ }
223
+
224
+ .ds-select__done {
225
+ background: transparent;
226
+ border: 0;
227
+ border-radius: var(--select-option-radius);
228
+ color: var(--select-option-fg-selected);
229
+ cursor: pointer;
230
+ font: inherit;
231
+ font-size: var(--text-sm);
232
+ font-weight: var(--weight-medium);
233
+ padding: var(--select-option-padding-y) var(--select-option-padding-x);
234
+ text-align: start;
235
+ width: 100%;
236
+ }
237
+
238
+ .ds-select__done:hover {
239
+ background: var(--select-option-bg-hover);
240
+ }
241
+
242
+ .ds-select__done:focus-visible {
243
+ outline: var(--select-focus-width) solid var(--select-border-focus);
244
+ outline-offset: calc(-1 * var(--select-focus-offset));
245
+ }
246
+ }
@@ -0,0 +1,66 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-skeleton {
5
+ background: var(--skeleton-bg);
6
+ border-radius: var(--skeleton-radius);
7
+ display: block;
8
+ overflow: hidden;
9
+ position: relative;
10
+ }
11
+
12
+ .ds-skeleton::after {
13
+ animation: ds-skeleton-shimmer var(--skeleton-duration) var(--ease-standard)
14
+ infinite;
15
+ background: linear-gradient(
16
+ 90deg,
17
+ transparent,
18
+ var(--skeleton-highlight),
19
+ transparent
20
+ );
21
+ content: "";
22
+ inset: 0;
23
+ position: absolute;
24
+ transform: translateX(-100%);
25
+ }
26
+
27
+ .ds-skeleton--heading {
28
+ border-radius: var(--radius-sm);
29
+ height: var(--skeleton-heading-height);
30
+ width: 42%;
31
+ }
32
+
33
+ .ds-skeleton--text {
34
+ height: var(--skeleton-text-height);
35
+ width: 100%;
36
+ }
37
+
38
+ .ds-skeleton--text:last-child {
39
+ width: 72%;
40
+ }
41
+
42
+ .ds-skeleton--image {
43
+ aspect-ratio: 16 / 9;
44
+ border-radius: var(--skeleton-image-radius);
45
+ width: 100%;
46
+ }
47
+
48
+ .ds-skeleton-stack {
49
+ display: grid;
50
+ gap: var(--skeleton-text-gap);
51
+ }
52
+
53
+ @keyframes ds-skeleton-shimmer {
54
+ to {
55
+ transform: translateX(100%);
56
+ }
57
+ }
58
+
59
+ @media (prefers-reduced-motion: reduce) {
60
+ .ds-skeleton::after {
61
+ animation: none;
62
+ background: var(--skeleton-bg);
63
+ opacity: 0;
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,44 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ @layer components {
4
+ .ds-spinner {
5
+ border: var(--spinner-stroke) solid var(--spinner-track);
6
+ border-radius: var(--radius-full);
7
+ border-top-color: var(--spinner-indicator);
8
+ display: inline-block;
9
+ height: var(--spinner-size-md);
10
+ width: var(--spinner-size-md);
11
+ }
12
+
13
+ .ds-spinner--sm {
14
+ height: var(--spinner-size-sm);
15
+ width: var(--spinner-size-sm);
16
+ }
17
+
18
+ .ds-spinner--lg {
19
+ height: var(--spinner-size-lg);
20
+ width: var(--spinner-size-lg);
21
+ }
22
+
23
+ .ds-spinner--slow {
24
+ animation: ds-spinner-rotate calc(var(--spinner-duration) * 2) linear
25
+ infinite;
26
+ }
27
+
28
+ .ds-spinner {
29
+ animation: ds-spinner-rotate var(--spinner-duration) linear infinite;
30
+ }
31
+
32
+ @keyframes ds-spinner-rotate {
33
+ to {
34
+ transform: rotate(360deg);
35
+ }
36
+ }
37
+
38
+ @media (prefers-reduced-motion: reduce) {
39
+ .ds-spinner,
40
+ .ds-spinner--slow {
41
+ animation-duration: 2.4s;
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,14 @@
1
+ @layer reset, tokens, base, components, motion, utilities;
2
+
3
+ /* Visually hidden, still announced. Shared so components that emit
4
+ .ds-sr-only do not depend on base.css being loaded. */
5
+ @layer components {
6
+ .ds-sr-only {
7
+ clip-path: inset(50%);
8
+ height: 1px;
9
+ overflow: hidden;
10
+ position: absolute;
11
+ white-space: nowrap;
12
+ width: 1px;
13
+ }
14
+ }