@happyvertical/smrt-ui 0.55.21 → 0.55.23
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/dist/components/calendar/DayView.svelte +1 -1
- package/dist/components/data/CollectionList.svelte +1 -1
- package/dist/components/data/ListSortSelect.svelte +1 -1
- package/dist/components/feedback/Alert.svelte +83 -22
- package/dist/components/feedback/LoadingOverlay.svelte +2 -2
- package/dist/components/feedback/PhoneSheet.svelte +1 -1
- package/dist/components/feedback/ToastViewport.svelte +1 -1
- package/dist/components/feedback/WorkingStrip.svelte +4 -4
- package/dist/components/forms/CameraCapture.svelte +1 -1
- package/dist/components/forms/Checkbox.svelte +130 -36
- package/dist/components/forms/Combobox.svelte +2 -2
- package/dist/components/forms/Fieldset.svelte +1 -1
- package/dist/components/forms/FilePicker.svelte +1 -1
- package/dist/components/forms/FormActionBar.svelte +2 -2
- package/dist/components/forms/Input.svelte +66 -61
- package/dist/components/forms/InputGroup.svelte +1 -1
- package/dist/components/forms/Listbox.svelte +1 -1
- package/dist/components/forms/MultiSelect.svelte +2 -2
- package/dist/components/forms/RangeSlider.svelte +1 -1
- package/dist/components/forms/SegmentedControl.svelte +2 -2
- package/dist/components/forms/Select.svelte +67 -61
- package/dist/components/forms/SignaturePad.svelte +1 -1
- package/dist/components/forms/Slider.svelte +1 -1
- package/dist/components/forms/StagedControlReview.svelte +4 -4
- package/dist/components/forms/Switch.svelte +127 -35
- package/dist/components/forms/TagsInput.svelte +1 -1
- package/dist/components/forms/ToggleButton.svelte +1 -1
- package/dist/components/layout/Footer.svelte +1 -1
- package/dist/components/layout/Masthead.svelte +1 -1
- package/dist/components/memberships/MembershipCard.svelte +3 -3
- package/dist/components/nav/FilterChips.svelte +1 -1
- package/dist/components/nav/Tabs.svelte +189 -190
- package/dist/components/nav/Tabs.svelte.d.ts.map +1 -1
- package/dist/components/permissions/PermissionPicker.svelte +4 -4
- package/dist/components/roles/RoleSelector.svelte +2 -2
- package/dist/components/ui/Accordion.svelte +1 -1
- package/dist/components/ui/AccordionItem.svelte +1 -1
- package/dist/components/ui/Badge.svelte +23 -25
- package/dist/components/ui/Button.svelte +101 -115
- package/dist/components/ui/Button.svelte.d.ts +1 -1
- package/dist/components/ui/Card.svelte +44 -57
- package/dist/components/ui/Chip.svelte +65 -60
- package/dist/components/ui/Disclosure.svelte +1 -1
- package/dist/components/ui/IconToggle.svelte +2 -2
- package/dist/styles/unstyled.css +2 -2
- package/dist/svelte/playground/BaseControlsPreview.svelte +2 -2
- package/dist/svelte/playground/CollectionsPreview.svelte +1 -1
- package/dist/svelte/playground/DataTablePreview.svelte +5 -5
- package/dist/svelte/playground/FeedbackPreview.svelte +1 -1
- package/dist/svelte/playground/InteractiveControlsPreview.svelte +1 -1
- package/dist/svelte/playground/StylelessPreview.svelte +35 -2
- package/dist/svelte/playground/StylelessPreview.svelte.d.ts.map +1 -1
- package/dist/themes/README.md +1 -1
- package/dist/themes/components/ColorSchemeToggle.svelte +3 -3
- package/dist/themes/components/ThemeSwitcher.svelte +3 -3
- package/package.json +2 -2
|
@@ -15,67 +15,65 @@ interface Props extends Omit<HTMLAttributes<HTMLSpanElement>, 'class'> {
|
|
|
15
15
|
const { variant = 'default', size = 'md', children, ...rest }: Props = $props();
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
|
-
<span class="
|
|
18
|
+
<span class="smrt-badge__root smrt-badge__{variant} smrt-badge__{size}" {...rest} data-smrt-component="Badge">
|
|
19
19
|
{@render children?.()}
|
|
20
20
|
</span>
|
|
21
21
|
|
|
22
22
|
<style>
|
|
23
23
|
@layer smrt.reset, smrt.structure, smrt.theme;
|
|
24
|
-
@layer smrt.
|
|
25
|
-
.
|
|
24
|
+
@layer smrt.structure {
|
|
25
|
+
.smrt-badge__root {
|
|
26
26
|
display: inline-flex;
|
|
27
27
|
align-items: center;
|
|
28
28
|
justify-content: center;
|
|
29
|
+
white-space: nowrap;
|
|
30
|
+
}
|
|
31
|
+
.smrt-badge__sm {
|
|
32
|
+
padding: var(--smrt-spacing-1) var(--smrt-spacing-2);
|
|
33
|
+
}
|
|
34
|
+
.smrt-badge__md {
|
|
35
|
+
padding: var(--smrt-spacing-1) var(--smrt-spacing-3);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
@layer smrt.theme {
|
|
39
|
+
.smrt-badge__root {
|
|
29
40
|
font-weight: var(--smrt-control-weight);
|
|
30
41
|
border: var(--smrt-hairline);
|
|
31
42
|
border-radius: var(--smrt-radius-full);
|
|
32
|
-
white-space: nowrap;
|
|
33
43
|
}
|
|
34
|
-
|
|
35
|
-
/* Sizes */
|
|
36
|
-
.sm {
|
|
37
|
-
padding: var(--smrt-spacing-1) var(--smrt-spacing-2);
|
|
44
|
+
.smrt-badge__sm {
|
|
38
45
|
font-size: var(--smrt-typography-body-small-size);
|
|
39
46
|
}
|
|
40
|
-
|
|
41
|
-
.md {
|
|
42
|
-
padding: var(--smrt-spacing-1) var(--smrt-spacing-3);
|
|
47
|
+
.smrt-badge__md {
|
|
43
48
|
font-size: var(--smrt-typography-body-medium-size);
|
|
44
49
|
}
|
|
45
|
-
|
|
46
|
-
/* Variants */
|
|
47
|
-
.default {
|
|
50
|
+
.smrt-badge__default {
|
|
48
51
|
background: var(--smrt-color-surface-container-high);
|
|
49
52
|
color: var(--smrt-color-on-surface);
|
|
50
53
|
}
|
|
51
|
-
|
|
52
|
-
.primary {
|
|
54
|
+
.smrt-badge__primary {
|
|
53
55
|
background: var(--smrt-color-primary-container);
|
|
54
56
|
color: var(--smrt-color-on-primary-container);
|
|
55
57
|
}
|
|
56
|
-
|
|
57
|
-
.success {
|
|
58
|
+
.smrt-badge__success {
|
|
58
59
|
background: var(--smrt-color-success-container);
|
|
59
60
|
color: var(--smrt-color-on-success-container);
|
|
60
61
|
}
|
|
61
|
-
|
|
62
|
-
.warning {
|
|
62
|
+
.smrt-badge__warning {
|
|
63
63
|
background: var(--smrt-color-warning-container);
|
|
64
64
|
color: var(--smrt-color-on-warning-container);
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
.error {
|
|
66
|
+
.smrt-badge__error {
|
|
68
67
|
background: var(--smrt-color-error-container);
|
|
69
68
|
color: var(--smrt-color-on-error-container);
|
|
70
69
|
}
|
|
71
|
-
|
|
72
|
-
.info {
|
|
70
|
+
.smrt-badge__info {
|
|
73
71
|
background: var(--smrt-color-primary-container);
|
|
74
72
|
color: var(--smrt-color-on-primary-container);
|
|
75
73
|
}
|
|
76
74
|
/* Forced colors (#3908): system colours where colour alone carries meaning. */
|
|
77
75
|
@media (forced-colors: active) {
|
|
78
|
-
.
|
|
76
|
+
.smrt-badge__root { background: Canvas; color: CanvasText; border-color: CanvasText; }
|
|
79
77
|
}
|
|
80
78
|
}
|
|
81
79
|
</style>
|
|
@@ -29,7 +29,7 @@ export interface Props extends Omit<HTMLButtonAttributes, 'class' | 'href'> {
|
|
|
29
29
|
/** Loading state */
|
|
30
30
|
loading?: boolean;
|
|
31
31
|
/**
|
|
32
|
-
* Extra class(es) appended after the base `button {variant} {size}` styling.
|
|
32
|
+
* Extra class(es) appended after the base `button smrt-button__{variant} smrt-button__{size}` styling.
|
|
33
33
|
* Lets callers adopt Button for custom-styled buttons without losing their
|
|
34
34
|
* own CSS (issue #1589) — the base button styling still applies.
|
|
35
35
|
*/
|
|
@@ -121,10 +121,10 @@ function handleClick(event: MouseEvent) {
|
|
|
121
121
|
{target}
|
|
122
122
|
{rel}
|
|
123
123
|
{download}
|
|
124
|
-
data-density={density} class="
|
|
125
|
-
class:
|
|
126
|
-
class:
|
|
127
|
-
class:loading
|
|
124
|
+
data-density={density} class="smrt-button__root smrt-button__{variant} smrt-button__{size} {className}"
|
|
125
|
+
class:smrt-button__disabled={isDisabled}
|
|
126
|
+
class:smrt-button__full-width={fullWidth}
|
|
127
|
+
class:smrt-button__loading={loading}
|
|
128
128
|
tabindex={isDisabled ? -1 : undefined}
|
|
129
129
|
aria-disabled={isDisabled}
|
|
130
130
|
aria-busy={loading}
|
|
@@ -132,9 +132,9 @@ function handleClick(event: MouseEvent) {
|
|
|
132
132
|
{...linkProps()} data-smrt-component="Button"
|
|
133
133
|
>
|
|
134
134
|
{#if loading}
|
|
135
|
-
<span class="
|
|
135
|
+
<span class="smrt-button__spinner" aria-hidden="true" data-smrt-part="spinner"></span>
|
|
136
136
|
{/if}
|
|
137
|
-
<span class="
|
|
137
|
+
<span class="smrt-button__content" class:smrt-button__loading={loading} data-smrt-part="label">
|
|
138
138
|
{@render children?.()}
|
|
139
139
|
</span>
|
|
140
140
|
</a>
|
|
@@ -143,16 +143,16 @@ function handleClick(event: MouseEvent) {
|
|
|
143
143
|
{type}
|
|
144
144
|
disabled={isDisabled}
|
|
145
145
|
aria-busy={loading}
|
|
146
|
-
data-density={density} class="
|
|
147
|
-
class:
|
|
148
|
-
class:loading
|
|
146
|
+
data-density={density} class="smrt-button__root smrt-button__{variant} smrt-button__{size} {className}"
|
|
147
|
+
class:smrt-button__full-width={fullWidth}
|
|
148
|
+
class:smrt-button__loading={loading}
|
|
149
149
|
onclick={handleClick}
|
|
150
150
|
{...rest} data-smrt-component="Button"
|
|
151
151
|
>
|
|
152
152
|
{#if loading}
|
|
153
|
-
<span class="
|
|
153
|
+
<span class="smrt-button__spinner" aria-hidden="true" data-smrt-part="spinner"></span>
|
|
154
154
|
{/if}
|
|
155
|
-
<span class="
|
|
155
|
+
<span class="smrt-button__content" class:smrt-button__loading={loading} data-smrt-part="label">
|
|
156
156
|
{@render children?.()}
|
|
157
157
|
</span>
|
|
158
158
|
</button>
|
|
@@ -160,171 +160,157 @@ function handleClick(event: MouseEvent) {
|
|
|
160
160
|
|
|
161
161
|
<style>
|
|
162
162
|
@layer smrt.reset, smrt.structure, smrt.theme;
|
|
163
|
-
@layer smrt.
|
|
164
|
-
.
|
|
163
|
+
@layer smrt.structure {
|
|
164
|
+
.smrt-button__root {
|
|
165
165
|
display: inline-flex;
|
|
166
166
|
align-items: center;
|
|
167
167
|
justify-content: center;
|
|
168
168
|
gap: var(--smrt-spacing-2);
|
|
169
169
|
position: relative;
|
|
170
|
+
cursor: pointer;
|
|
171
|
+
}
|
|
172
|
+
.smrt-button__root::after {
|
|
173
|
+
content: '';
|
|
174
|
+
position: absolute;
|
|
175
|
+
inset: 0;
|
|
176
|
+
pointer-events: none;
|
|
177
|
+
}
|
|
178
|
+
.smrt-button__sm {
|
|
179
|
+
padding: var(--smrt-spacing-2) var(--smrt-spacing-3);
|
|
180
|
+
}
|
|
181
|
+
.smrt-button__md {
|
|
182
|
+
padding: var(--smrt-spacing-3) var(--smrt-spacing-4);
|
|
183
|
+
}
|
|
184
|
+
.smrt-button__lg {
|
|
185
|
+
padding: var(--smrt-spacing-4) var(--smrt-spacing-6);
|
|
186
|
+
}
|
|
187
|
+
.smrt-button__full-width {
|
|
188
|
+
width: 100%;
|
|
189
|
+
}
|
|
190
|
+
.smrt-button__loading {
|
|
191
|
+
position: relative;
|
|
192
|
+
}
|
|
193
|
+
.smrt-button__spinner {
|
|
194
|
+
position: absolute;
|
|
195
|
+
left: 50%;
|
|
196
|
+
top: 50%;
|
|
197
|
+
transform: translate(-50%, -50%);
|
|
198
|
+
width: 1em;
|
|
199
|
+
height: 1em;
|
|
200
|
+
}
|
|
201
|
+
.smrt-button__content {
|
|
202
|
+
display: inline-flex;
|
|
203
|
+
align-items: center;
|
|
204
|
+
justify-content: center;
|
|
205
|
+
gap: var(--smrt-spacing-2);
|
|
206
|
+
}
|
|
207
|
+
.smrt-button__content.smrt-button__loading {
|
|
208
|
+
opacity: 0;
|
|
209
|
+
}
|
|
210
|
+
.smrt-button__root:disabled,
|
|
211
|
+
.smrt-button__root.smrt-button__disabled {
|
|
212
|
+
cursor: not-allowed;
|
|
213
|
+
pointer-events: none;
|
|
214
|
+
}
|
|
215
|
+
@media (max-width: 48rem) {
|
|
216
|
+
.smrt-button__root {
|
|
217
|
+
min-block-size: 2.75rem;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
.smrt-button__root[data-density='touch'] {
|
|
221
|
+
--smrt-button-target-min: var(--smrt-touch-target-min);
|
|
222
|
+
}
|
|
223
|
+
.smrt-button__root[data-density='comfortable'] {
|
|
224
|
+
--smrt-button-target-min: 0px;
|
|
225
|
+
}
|
|
226
|
+
.smrt-button__root {
|
|
227
|
+
min-height: max(var(--smrt-control-height), var(--smrt-button-target-min, var(--smrt-control-target-min)));
|
|
228
|
+
min-width: var(--smrt-button-target-min, var(--smrt-control-target-min));
|
|
229
|
+
}
|
|
230
|
+
.smrt-button__root.smrt-button__sm {
|
|
231
|
+
min-height: max(var(--smrt-control-height-small), var(--smrt-button-target-min, var(--smrt-control-target-min)));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
@layer smrt.theme {
|
|
235
|
+
.smrt-button__root {
|
|
170
236
|
font-weight: var(--smrt-control-weight);
|
|
171
237
|
border-radius: var(--smrt-control-radius);
|
|
172
238
|
transition: all var(--smrt-duration-short2) var(--smrt-easing-standard);
|
|
173
|
-
cursor: pointer;
|
|
174
239
|
text-decoration: none;
|
|
175
240
|
border: 1px solid transparent;
|
|
176
241
|
}
|
|
177
|
-
|
|
178
|
-
/* One state layer for every variant: currentColor mixed at the theme's
|
|
179
|
-
state opacity. Per-variant tweaks use --smrt-button-state-* names. */
|
|
180
|
-
.button::after {
|
|
181
|
-
content: '';
|
|
182
|
-
position: absolute;
|
|
183
|
-
inset: 0;
|
|
242
|
+
.smrt-button__root::after {
|
|
184
243
|
border-radius: inherit;
|
|
185
244
|
background: transparent;
|
|
186
|
-
pointer-events: none;
|
|
187
245
|
transition: background-color var(--smrt-duration-short2) var(--smrt-easing-standard);
|
|
188
246
|
}
|
|
189
|
-
|
|
190
|
-
.button:hover:not(:disabled):not(.disabled)::after {
|
|
247
|
+
.smrt-button__root:hover:not(:disabled):not(.smrt-button__disabled)::after {
|
|
191
248
|
background: color-mix(
|
|
192
249
|
in srgb,
|
|
193
250
|
currentColor calc(var(--smrt-state-hover) * 100%),
|
|
194
251
|
transparent
|
|
195
252
|
);
|
|
196
253
|
}
|
|
197
|
-
|
|
198
|
-
.button:active:not(:disabled):not(.disabled)::after {
|
|
254
|
+
.smrt-button__root:active:not(:disabled):not(.smrt-button__disabled)::after {
|
|
199
255
|
background: color-mix(
|
|
200
256
|
in srgb,
|
|
201
257
|
currentColor calc(var(--smrt-state-pressed) * 100%),
|
|
202
258
|
transparent
|
|
203
259
|
);
|
|
204
260
|
}
|
|
205
|
-
|
|
206
|
-
/* Sizes */
|
|
207
|
-
.sm {
|
|
261
|
+
.smrt-button__sm {
|
|
208
262
|
border-radius: var(--smrt-control-radius-small);
|
|
209
|
-
padding: var(--smrt-spacing-2) var(--smrt-spacing-3);
|
|
210
263
|
font-size: var(--smrt-typography-body-medium-size);
|
|
211
264
|
}
|
|
212
|
-
|
|
213
|
-
.md {
|
|
214
|
-
padding: var(--smrt-spacing-3) var(--smrt-spacing-4);
|
|
265
|
+
.smrt-button__md {
|
|
215
266
|
font-size: var(--smrt-typography-body-large-size);
|
|
216
267
|
}
|
|
217
|
-
|
|
218
|
-
.lg {
|
|
219
|
-
padding: var(--smrt-spacing-4) var(--smrt-spacing-6);
|
|
268
|
+
.smrt-button__lg {
|
|
220
269
|
font-size: var(--smrt-typography-title-medium-size);
|
|
221
270
|
}
|
|
222
|
-
|
|
223
|
-
/* Variants */
|
|
224
|
-
.primary {
|
|
271
|
+
.smrt-button__primary {
|
|
225
272
|
background: var(--smrt-color-primary);
|
|
226
273
|
color: var(--smrt-color-on-primary);
|
|
227
274
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
.secondary {
|
|
275
|
+
.smrt-button__secondary {
|
|
231
276
|
background: var(--smrt-surface-control);
|
|
232
277
|
color: var(--smrt-color-primary);
|
|
233
278
|
border-color: var(--smrt-color-primary);
|
|
234
279
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
.ghost {
|
|
280
|
+
.smrt-button__ghost {
|
|
238
281
|
background: transparent;
|
|
239
282
|
color: var(--smrt-color-primary);
|
|
240
283
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
.danger {
|
|
284
|
+
.smrt-button__danger {
|
|
244
285
|
background: var(--smrt-color-error);
|
|
245
286
|
color: var(--smrt-color-on-error);
|
|
246
287
|
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
/* Full width */
|
|
250
|
-
.full-width {
|
|
251
|
-
width: 100%;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/* Loading state */
|
|
255
|
-
.loading {
|
|
256
|
-
position: relative;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
.spinner {
|
|
260
|
-
position: absolute;
|
|
261
|
-
left: 50%;
|
|
262
|
-
top: 50%;
|
|
263
|
-
transform: translate(-50%, -50%);
|
|
264
|
-
width: 1em;
|
|
265
|
-
height: 1em;
|
|
288
|
+
.smrt-button__spinner {
|
|
266
289
|
border: 2px solid currentColor;
|
|
267
290
|
border-right-color: transparent;
|
|
268
291
|
border-radius: var(--smrt-radius-full);
|
|
269
292
|
animation: spin 0.75s linear infinite;
|
|
270
293
|
}
|
|
271
|
-
|
|
272
294
|
@keyframes spin {
|
|
273
|
-
from {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
wrapper itself a flex row, an icon + label (`<Button><svg/>Save</Button>`)
|
|
280
|
-
would render with no gap. Making `.content` a centered flex row lays out
|
|
281
|
-
multi-child buttons (icon+text, label+count) correctly after the #1589
|
|
282
|
-
migration, instead of needing per-button CSS to reach into `.content`. The
|
|
283
|
-
wrapper is shrink-to-fit, so a caller wanting a spread layout must also give
|
|
284
|
-
it width — e.g. a full-width button with
|
|
285
|
-
`.x :global(.content) { width: 100%; justify-content: space-between }`. */
|
|
286
|
-
.content {
|
|
287
|
-
display: inline-flex;
|
|
288
|
-
align-items: center;
|
|
289
|
-
justify-content: center;
|
|
290
|
-
gap: var(--smrt-spacing-2);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
.content.loading {
|
|
294
|
-
opacity: 0;
|
|
295
|
+
from {
|
|
296
|
+
transform: translate(-50%, -50%) rotate(0deg);
|
|
297
|
+
}
|
|
298
|
+
to {
|
|
299
|
+
transform: translate(-50%, -50%) rotate(360deg);
|
|
300
|
+
}
|
|
295
301
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
.button:disabled,
|
|
299
|
-
.button.disabled {
|
|
302
|
+
.smrt-button__root:disabled,
|
|
303
|
+
.smrt-button__root.smrt-button__disabled {
|
|
300
304
|
opacity: var(--smrt-state-disabled);
|
|
301
|
-
cursor: not-allowed;
|
|
302
|
-
pointer-events: none;
|
|
303
305
|
}
|
|
304
|
-
|
|
305
|
-
/* Focus state */
|
|
306
|
-
.button:focus-visible {
|
|
306
|
+
.smrt-button__root:focus-visible {
|
|
307
307
|
outline: var(--smrt-focus-ring-width) solid var(--smrt-focus-ring-color);
|
|
308
308
|
outline-offset: var(--smrt-focus-ring-offset);
|
|
309
309
|
}
|
|
310
|
-
|
|
311
|
-
/* Phones: every size is at least a 44px touch target. */
|
|
312
|
-
@media (max-width: 48rem) {
|
|
313
|
-
.button {
|
|
314
|
-
min-block-size: 2.75rem;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/* Reduced motion */
|
|
319
310
|
@media (prefers-reduced-motion: reduce) {
|
|
320
|
-
.
|
|
311
|
+
.smrt-button__spinner {
|
|
321
312
|
animation: none;
|
|
322
313
|
}
|
|
323
314
|
}
|
|
324
|
-
|
|
325
|
-
.button[data-density='touch'] { --smrt-control-target-min: var(--smrt-touch-target-min); }
|
|
326
|
-
.button[data-density='comfortable'] { --smrt-control-target-min: 0px; }
|
|
327
|
-
.button { min-height: max(var(--smrt-control-height), var(--smrt-control-target-min, 0px)); min-width: var(--smrt-control-target-min, 0px); }
|
|
328
|
-
.button.sm { min-height: max(var(--smrt-control-height-small), var(--smrt-control-target-min, 0px)); }
|
|
329
315
|
}
|
|
330
316
|
</style>
|
|
@@ -24,7 +24,7 @@ export interface Props extends Omit<HTMLButtonAttributes, 'class' | 'href'> {
|
|
|
24
24
|
/** Loading state */
|
|
25
25
|
loading?: boolean;
|
|
26
26
|
/**
|
|
27
|
-
* Extra class(es) appended after the base `button {variant} {size}` styling.
|
|
27
|
+
* Extra class(es) appended after the base `button smrt-button__{variant} smrt-button__{size}` styling.
|
|
28
28
|
* Lets callers adopt Button for custom-styled buttons without losing their
|
|
29
29
|
* own CSS (issue #1589) — the base button styling still applies.
|
|
30
30
|
*/
|
|
@@ -30,22 +30,22 @@ const {
|
|
|
30
30
|
</script>
|
|
31
31
|
|
|
32
32
|
<div
|
|
33
|
-
class="
|
|
34
|
-
class:hoverable
|
|
33
|
+
class="smrt-card__root smrt-card__{variant} smrt-card__padding-{padding}"
|
|
34
|
+
class:smrt-card__hoverable={hoverable}
|
|
35
35
|
{...rest} data-smrt-component="Card"
|
|
36
36
|
>
|
|
37
37
|
{#if header}
|
|
38
|
-
<div class="
|
|
38
|
+
<div class="smrt-card__header" data-smrt-part="header">
|
|
39
39
|
{@render header()}
|
|
40
40
|
</div>
|
|
41
41
|
{/if}
|
|
42
42
|
|
|
43
|
-
<div class="
|
|
43
|
+
<div class="smrt-card__content" data-smrt-part="body">
|
|
44
44
|
{@render children?.()}
|
|
45
45
|
</div>
|
|
46
46
|
|
|
47
47
|
{#if footer}
|
|
48
|
-
<div class="
|
|
48
|
+
<div class="smrt-card__footer" data-smrt-part="footer">
|
|
49
49
|
{@render footer()}
|
|
50
50
|
</div>
|
|
51
51
|
{/if}
|
|
@@ -53,6 +53,38 @@ const {
|
|
|
53
53
|
|
|
54
54
|
<style>
|
|
55
55
|
@layer smrt.reset, smrt.structure, smrt.theme;
|
|
56
|
+
@layer smrt.structure {
|
|
57
|
+
.smrt-card__padding-none .smrt-card__content {
|
|
58
|
+
padding: var(--smrt-spacing-0);
|
|
59
|
+
}
|
|
60
|
+
.smrt-card__padding-sm .smrt-card__content {
|
|
61
|
+
padding: var(--smrt-spacing-4);
|
|
62
|
+
}
|
|
63
|
+
.smrt-card__padding-md .smrt-card__content {
|
|
64
|
+
padding: var(--smrt-spacing-6);
|
|
65
|
+
}
|
|
66
|
+
.smrt-card__padding-lg .smrt-card__content {
|
|
67
|
+
padding: var(--smrt-spacing-8);
|
|
68
|
+
}
|
|
69
|
+
.smrt-card__header {
|
|
70
|
+
padding: var(--smrt-spacing-6);
|
|
71
|
+
}
|
|
72
|
+
.smrt-card__padding-sm .smrt-card__header {
|
|
73
|
+
padding: var(--smrt-spacing-4);
|
|
74
|
+
}
|
|
75
|
+
.smrt-card__padding-lg .smrt-card__header {
|
|
76
|
+
padding: var(--smrt-spacing-8);
|
|
77
|
+
}
|
|
78
|
+
.smrt-card__footer {
|
|
79
|
+
padding: var(--smrt-spacing-6);
|
|
80
|
+
}
|
|
81
|
+
.smrt-card__padding-sm .smrt-card__footer {
|
|
82
|
+
padding: var(--smrt-spacing-4);
|
|
83
|
+
}
|
|
84
|
+
.smrt-card__padding-lg .smrt-card__footer {
|
|
85
|
+
padding: var(--smrt-spacing-8);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
56
88
|
@layer smrt.theme {
|
|
57
89
|
/*
|
|
58
90
|
* Themeable look (app-level custom properties; defaults keep the stock look):
|
|
@@ -62,80 +94,35 @@ const {
|
|
|
62
94
|
* --smrt-card-divider rule between the header/footer and the content
|
|
63
95
|
* The `outlined` variant always draws its outline.
|
|
64
96
|
*/
|
|
65
|
-
.
|
|
97
|
+
.smrt-card__root {
|
|
66
98
|
background: var(--smrt-card-background, var(--smrt-surface-panel));
|
|
67
99
|
border-radius: var(--smrt-radius-medium);
|
|
68
100
|
transition: all var(--smrt-duration-short2) var(--smrt-easing-standard);
|
|
69
101
|
}
|
|
70
|
-
|
|
71
|
-
/* Variants */
|
|
72
|
-
.default {
|
|
102
|
+
.smrt-card__default {
|
|
73
103
|
border: var(--smrt-card-border, var(--smrt-hairline));
|
|
74
104
|
box-shadow: var(--smrt-card-shadow, var(--smrt-inset-highlight));
|
|
75
105
|
}
|
|
76
|
-
|
|
77
|
-
.outlined {
|
|
106
|
+
.smrt-card__outlined {
|
|
78
107
|
border: var(--smrt-hairline-strong);
|
|
79
108
|
box-shadow: var(--smrt-inset-highlight);
|
|
80
109
|
}
|
|
81
|
-
|
|
82
|
-
.elevated {
|
|
110
|
+
.smrt-card__elevated {
|
|
83
111
|
border: var(--smrt-card-border, var(--smrt-hairline));
|
|
84
112
|
box-shadow: var(--smrt-inset-highlight), var(--smrt-elevation-2);
|
|
85
113
|
}
|
|
86
|
-
|
|
87
|
-
/* Hoverable state */
|
|
88
|
-
.hoverable:hover {
|
|
114
|
+
.smrt-card__hoverable:hover {
|
|
89
115
|
box-shadow: var(--smrt-inset-highlight), var(--smrt-elevation-3);
|
|
90
116
|
transform: translateY(-2px);
|
|
91
117
|
}
|
|
92
|
-
|
|
93
|
-
/* Padding */
|
|
94
|
-
.padding-none .card-content {
|
|
95
|
-
padding: var(--smrt-spacing-0);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
.padding-sm .card-content {
|
|
99
|
-
padding: var(--smrt-spacing-4);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
.padding-md .card-content {
|
|
103
|
-
padding: var(--smrt-spacing-6);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.padding-lg .card-content {
|
|
107
|
-
padding: var(--smrt-spacing-8);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/* Header */
|
|
111
|
-
.card-header {
|
|
112
|
-
padding: var(--smrt-spacing-6);
|
|
118
|
+
.smrt-card__header {
|
|
113
119
|
border-bottom: var(--smrt-card-divider, var(--smrt-hairline));
|
|
114
120
|
}
|
|
115
|
-
|
|
116
|
-
.padding-sm .card-header {
|
|
117
|
-
padding: var(--smrt-spacing-4);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.padding-lg .card-header {
|
|
121
|
-
padding: var(--smrt-spacing-8);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/* Footer */
|
|
125
|
-
.card-footer {
|
|
126
|
-
padding: var(--smrt-spacing-6);
|
|
121
|
+
.smrt-card__footer {
|
|
127
122
|
border-top: var(--smrt-card-divider, var(--smrt-hairline));
|
|
128
123
|
background: var(--smrt-surface-sunken);
|
|
129
124
|
border-bottom-left-radius: var(--smrt-radius-medium);
|
|
130
125
|
border-bottom-right-radius: var(--smrt-radius-medium);
|
|
131
126
|
}
|
|
132
|
-
|
|
133
|
-
.padding-sm .card-footer {
|
|
134
|
-
padding: var(--smrt-spacing-4);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
.padding-lg .card-footer {
|
|
138
|
-
padding: var(--smrt-spacing-8);
|
|
139
|
-
}
|
|
140
127
|
}
|
|
141
128
|
</style>
|