@sparqjs/site-ui 0.2.2

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/sparq.css ADDED
@@ -0,0 +1,1961 @@
1
+ @charset "UTF-8";
2
+ :root {
3
+ /* 原始色板。主题只需覆盖语义变量即可,组件不直接使用这些原始值。 */
4
+ --sparq-color-blue-600: #2561ef;
5
+ --sparq-color-blue-700: #1d4ed8;
6
+ --sparq-color-red-600: #d63939;
7
+ --sparq-color-red-700: #b42323;
8
+ --sparq-color-green-600: #2fb344;
9
+ --sparq-color-green-700: #207a31;
10
+ --sparq-color-amber-600: #f59f00;
11
+ --sparq-color-amber-800: #845400;
12
+ /* 主操作色。站点主题可以覆盖这一组变量,组件不直接绑定具体品牌色。 */
13
+ --sparq-primary: var(--sparq-color-blue-600);
14
+ --sparq-primary-strong: var(--sparq-color-blue-700);
15
+ --sparq-primary-soft: #e9f2fc;
16
+ --sparq-danger: var(--sparq-color-red-600);
17
+ --sparq-danger-strong: var(--sparq-color-red-700);
18
+ --sparq-danger-soft: #fcebec;
19
+ --sparq-success: var(--sparq-color-green-600);
20
+ --sparq-success-strong: var(--sparq-color-green-700);
21
+ --sparq-success-soft: #eaf7ec;
22
+ --sparq-warning: var(--sparq-color-amber-600);
23
+ --sparq-warning-strong: var(--sparq-color-amber-800);
24
+ --sparq-warning-soft: #fff5db;
25
+ /* 表面与文字语义。控件默认继承页面字体,仅定义可复用的视觉层级。 */
26
+ --sparq-bg: #f5f7fb;
27
+ --sparq-surface: #ffffff;
28
+ --sparq-surface-subtle: #f1f3f5;
29
+ --sparq-text: #49566c;
30
+ --sparq-title: #182433;
31
+ --sparq-muted: #667382;
32
+ --sparq-inverse-text: #ffffff;
33
+ --sparq-border: #dce1e7;
34
+ --sparq-border-strong: #b8c1cc;
35
+ /* 组件尺度。四点间距和稳定控件高度用于避免不同页面各自创建尺寸。 */
36
+ --sparq-spacing-1: 0.25rem;
37
+ --sparq-spacing-2: 0.5rem;
38
+ --sparq-spacing-3: 0.75rem;
39
+ --sparq-spacing-4: 1rem;
40
+ --sparq-spacing-5: 1.5rem;
41
+ --sparq-spacing-6: 2rem;
42
+ --sparq-spacing-7: 3rem;
43
+ --sparq-spacing-8: 4rem;
44
+ --sparq-control-height: 2.75rem;
45
+ --sparq-control-height-sm: 2.5rem;
46
+ --sparq-control-height-lg: 3rem;
47
+ --sparq-radius-sm: 0.25rem;
48
+ --sparq-radius-md: 0.5rem;
49
+ --sparq-radius-lg: 0.75rem;
50
+ /* 浮层和交互。组件通过同一焦点、阴影和层级语义保持行为一致。 */
51
+ --sparq-focus-ring: 0 0 0 3px rgb(37 99 235 / 18%);
52
+ --sparq-shadow-sm: 0 1px 2px rgb(24 36 51 / 5%);
53
+ --sparq-shadow-menu: 0 0.5rem 1.5rem rgb(24 36 51 / 12%);
54
+ --sparq-shadow-dialog: 0 1rem 3rem rgb(24 36 51 / 20%);
55
+ --sparq-overlay: rgb(24 36 51 / 56%);
56
+ --sparq-z-dropdown: 900;
57
+ --sparq-z-dialog: 1000;
58
+ --sparq-z-toast: 1100;
59
+ --sparq-motion-fast: 160ms;
60
+ --sparq-motion-base: 220ms;
61
+ --sparq-content-width: 80rem;
62
+ /* 字体规范。正文优先使用系统无衬线字体,等宽字体只用于代码和标识。 */
63
+ --sparq-font-family: Inter, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
64
+ --sparq-font-family-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
65
+ --sparq-font-size-sm: 0.8125rem;
66
+ --sparq-font-size-body: 0.875rem;
67
+ --sparq-font-size-lg: 1rem;
68
+ --sparq-font-size-title: 1.125rem;
69
+ --sparq-font-weight-normal: 400;
70
+ --sparq-font-weight-medium: 500;
71
+ --sparq-font-weight-semibold: 600;
72
+ --sparq-line-height-body: 1.5;
73
+ /* 图标规范。图标继承文字颜色,不单独表达业务状态。 */
74
+ --sparq-icon-size-sm: 0.875rem;
75
+ --sparq-icon-size: 1rem;
76
+ --sparq-icon-size-lg: 1.25rem;
77
+ --sparq-icon-stroke: 1.75;
78
+ /* Button 组件令牌。状态和尺寸由组件层统一管理。 */
79
+ --sparq-button-radius: var(--sparq-radius-sm);
80
+ --sparq-button-height: 2.5rem;
81
+ --sparq-button-padding-inline: 1rem;
82
+ --sparq-button-font-size: 0.875rem;
83
+ --sparq-button-font-weight: var(--sparq-font-weight-medium);
84
+ --sparq-button-shadow: 0 1px 2px rgb(24 36 51 / 8%);
85
+ }
86
+
87
+ .sparq-visually-hidden {
88
+ position: absolute;
89
+ width: 1px;
90
+ height: 1px;
91
+ padding: 0;
92
+ margin: -1px;
93
+ overflow: hidden;
94
+ clip: rect(0, 0, 0, 0);
95
+ white-space: nowrap;
96
+ border: 0;
97
+ }
98
+
99
+ body {
100
+ font-family: var(--sparq-font-family);
101
+ font-size: var(--sparq-font-size-body);
102
+ font-weight: var(--sparq-font-weight-normal);
103
+ line-height: var(--sparq-line-height-body);
104
+ }
105
+
106
+ code,
107
+ kbd,
108
+ pre {
109
+ font-family: var(--sparq-font-family-mono);
110
+ }
111
+
112
+ .sparq-button[hidden],
113
+ .sparq-control[hidden],
114
+ .sparq-select[hidden],
115
+ .sparq-textarea[hidden],
116
+ .sparq-dialog[hidden],
117
+ .sparq-dropdown__menu[hidden],
118
+ .sparq-alert[hidden],
119
+ .sparq-empty[hidden],
120
+ .sparq-progress-group[hidden],
121
+ .sparq-progress[hidden],
122
+ .sparq-spinner[hidden],
123
+ .sparq-skeleton[hidden],
124
+ .sparq-toast[hidden] {
125
+ display: none;
126
+ }
127
+
128
+ @media (prefers-reduced-motion: reduce) {
129
+ .sparq-button,
130
+ .sparq-control,
131
+ .sparq-select,
132
+ .sparq-textarea,
133
+ .sparq-dialog,
134
+ .sparq-dropdown__menu,
135
+ .sparq-toast,
136
+ .sparq-skeleton {
137
+ transition-duration: 0.01ms;
138
+ }
139
+ }
140
+ .sparq-container {
141
+ width: min(100% - 2rem, var(--sparq-content-width));
142
+ margin-inline: auto;
143
+ }
144
+
145
+ .sparq-stack {
146
+ display: flex;
147
+ min-width: 0;
148
+ flex-direction: column;
149
+ gap: var(--sparq-stack-gap, var(--sparq-spacing-4));
150
+ }
151
+
152
+ .sparq-cluster {
153
+ display: flex;
154
+ min-width: 0;
155
+ flex-wrap: wrap;
156
+ align-items: var(--sparq-cluster-align, center);
157
+ justify-content: var(--sparq-cluster-justify, flex-start);
158
+ gap: var(--sparq-cluster-gap, var(--sparq-spacing-3));
159
+ }
160
+
161
+ .sparq-grid {
162
+ display: grid;
163
+ min-width: 0;
164
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--sparq-grid-min, 16rem)), 1fr));
165
+ gap: var(--sparq-grid-gap, var(--sparq-spacing-5));
166
+ }
167
+
168
+ .sparq-sidebar-layout {
169
+ display: grid;
170
+ min-width: 0;
171
+ grid-template-columns: minmax(0, 1fr);
172
+ gap: var(--sparq-sidebar-gap, var(--sparq-spacing-5));
173
+ }
174
+
175
+ @media (min-width: 48rem) {
176
+ .sparq-container {
177
+ width: min(100% - 3rem, var(--sparq-content-width));
178
+ }
179
+ .sparq-sidebar-layout {
180
+ grid-template-columns: var(--sparq-sidebar-width, 16rem) minmax(0, 1fr);
181
+ }
182
+ }
183
+ .sparq-button {
184
+ display: inline-flex;
185
+ box-sizing: border-box;
186
+ min-width: 0;
187
+ height: var(--sparq-button-height);
188
+ align-items: center;
189
+ justify-content: center;
190
+ gap: var(--sparq-spacing-2);
191
+ padding: var(--sparq-spacing-2) var(--sparq-button-padding-inline);
192
+ border: 1px solid var(--sparq-primary);
193
+ border-radius: var(--sparq-button-radius);
194
+ color: var(--sparq-inverse-text);
195
+ background: var(--sparq-primary);
196
+ font: inherit;
197
+ font-size: var(--sparq-button-font-size);
198
+ font-weight: var(--sparq-button-font-weight);
199
+ line-height: var(--sparq-line-height-body);
200
+ text-align: center;
201
+ text-decoration: none;
202
+ box-shadow: var(--sparq-button-shadow);
203
+ cursor: pointer;
204
+ touch-action: manipulation;
205
+ transition: color var(--sparq-motion-fast) ease-out, background-color var(--sparq-motion-fast) ease-out, border-color var(--sparq-motion-fast) ease-out, box-shadow var(--sparq-motion-fast) ease-out;
206
+ }
207
+
208
+ .sparq-button:active:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
209
+ box-shadow: inset 0 1px 2px rgba(24, 36, 51, 0.14);
210
+ transform: translateY(1px);
211
+ }
212
+
213
+ .sparq-button:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
214
+ border-color: var(--sparq-primary-strong);
215
+ background: var(--sparq-primary-strong);
216
+ }
217
+
218
+ .sparq-button:focus-visible {
219
+ outline: 0;
220
+ box-shadow: var(--sparq-focus-ring);
221
+ }
222
+
223
+ .sparq-button:disabled,
224
+ .sparq-button[aria-disabled=true] {
225
+ opacity: 0.45;
226
+ cursor: not-allowed;
227
+ }
228
+
229
+ .sparq-button--secondary {
230
+ border-color: var(--sparq-border-strong);
231
+ color: var(--sparq-title);
232
+ background: var(--sparq-surface);
233
+ }
234
+
235
+ .sparq-button--secondary:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
236
+ border-color: var(--sparq-primary);
237
+ color: var(--sparq-primary-strong);
238
+ background: var(--sparq-primary-soft);
239
+ }
240
+
241
+ .sparq-button--danger {
242
+ border-color: var(--sparq-danger);
243
+ color: var(--sparq-inverse-text);
244
+ background: var(--sparq-danger);
245
+ }
246
+
247
+ .sparq-button--danger:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
248
+ border-color: var(--sparq-danger-strong);
249
+ background: var(--sparq-danger-strong);
250
+ }
251
+
252
+ .sparq-button--success {
253
+ border-color: var(--sparq-success);
254
+ color: var(--sparq-inverse-text);
255
+ background: var(--sparq-success);
256
+ }
257
+
258
+ .sparq-button--success:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
259
+ border-color: var(--sparq-success-strong);
260
+ background: var(--sparq-success-strong);
261
+ }
262
+
263
+ .sparq-button--warning {
264
+ border-color: var(--sparq-warning);
265
+ color: var(--sparq-title);
266
+ background: var(--sparq-warning);
267
+ }
268
+
269
+ .sparq-button--warning:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
270
+ border-color: var(--sparq-warning-strong);
271
+ background: var(--sparq-warning-strong);
272
+ }
273
+
274
+ .sparq-button--dark {
275
+ border-color: var(--sparq-title);
276
+ color: var(--sparq-inverse-text);
277
+ background: var(--sparq-title);
278
+ }
279
+
280
+ .sparq-button--dark:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
281
+ border-color: var(--sparq-text);
282
+ background: var(--sparq-text);
283
+ }
284
+
285
+ .sparq-button--light {
286
+ border-color: var(--sparq-border);
287
+ color: var(--sparq-title);
288
+ background: var(--sparq-surface-subtle);
289
+ }
290
+
291
+ .sparq-button--light:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
292
+ border-color: var(--sparq-border-strong);
293
+ background: var(--sparq-surface);
294
+ }
295
+
296
+ .sparq-button--outline {
297
+ border-color: var(--sparq-primary);
298
+ color: var(--sparq-primary-strong);
299
+ background: transparent;
300
+ box-shadow: none;
301
+ }
302
+
303
+ .sparq-button--outline:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
304
+ color: var(--sparq-primary-strong);
305
+ background: var(--sparq-primary-soft);
306
+ }
307
+
308
+ .sparq-button--ghost {
309
+ border-color: transparent;
310
+ color: var(--sparq-title);
311
+ background: transparent;
312
+ box-shadow: none;
313
+ }
314
+
315
+ .sparq-button--ghost:hover:not(:disabled, [aria-disabled=true], [aria-busy=true]) {
316
+ border-color: transparent;
317
+ color: var(--sparq-primary-strong);
318
+ background: var(--sparq-primary-soft);
319
+ }
320
+
321
+ .sparq-button--sm {
322
+ height: 2rem;
323
+ padding: var(--sparq-spacing-1) 0.75rem;
324
+ font-size: var(--sparq-font-size-sm);
325
+ }
326
+
327
+ .sparq-button--sm.sparq-button--icon {
328
+ width: 2rem;
329
+ flex-basis: 2rem;
330
+ }
331
+
332
+ .sparq-button--lg {
333
+ height: 3rem;
334
+ padding-inline: 1.25rem;
335
+ font-size: var(--sparq-font-size-lg);
336
+ }
337
+
338
+ .sparq-button--lg.sparq-button--icon {
339
+ width: 3rem;
340
+ flex-basis: 3rem;
341
+ }
342
+
343
+ .sparq-button--block {
344
+ width: 100%;
345
+ }
346
+
347
+ .sparq-button--icon {
348
+ width: var(--sparq-button-height);
349
+ flex: 0 0 var(--sparq-button-height);
350
+ padding: 0;
351
+ }
352
+
353
+ .sparq-button--circle {
354
+ border-radius: 999px;
355
+ }
356
+
357
+ .sparq-button--circle.sparq-button--icon {
358
+ border-radius: 50%;
359
+ }
360
+
361
+ .sparq-button svg {
362
+ width: var(--sparq-icon-size);
363
+ height: var(--sparq-icon-size);
364
+ flex: 0 0 auto;
365
+ }
366
+
367
+ .sparq-button[aria-busy=true]::before {
368
+ width: 0.875rem;
369
+ height: 0.875rem;
370
+ flex: 0 0 auto;
371
+ border: 2px solid currentColor;
372
+ border-right-color: transparent;
373
+ border-radius: 50%;
374
+ animation: sparq-button-spin 700ms linear infinite;
375
+ content: "";
376
+ }
377
+
378
+ .sparq-button[aria-busy=true] {
379
+ cursor: wait;
380
+ }
381
+
382
+ .sparq-button--icon[aria-busy=true] {
383
+ gap: 0;
384
+ }
385
+
386
+ .sparq-button--icon[aria-busy=true] svg {
387
+ display: none;
388
+ }
389
+
390
+ @keyframes sparq-button-spin {
391
+ to {
392
+ transform: rotate(360deg);
393
+ }
394
+ }
395
+ @media (prefers-reduced-motion: reduce) {
396
+ .sparq-button[aria-busy=true]::before {
397
+ animation-duration: 1400ms;
398
+ }
399
+ }
400
+ .sparq-field,
401
+ .sparq-form {
402
+ display: flex;
403
+ min-width: 0;
404
+ }
405
+
406
+ .sparq-field {
407
+ flex-direction: column;
408
+ align-content: start;
409
+ gap: var(--sparq-spacing-2);
410
+ }
411
+
412
+ .sparq-form {
413
+ flex-direction: column;
414
+ gap: var(--sparq-spacing-4);
415
+ }
416
+
417
+ .sparq-label {
418
+ display: block;
419
+ min-height: 1.1875rem;
420
+ margin: 0;
421
+ color: var(--sparq-title);
422
+ font-size: 0.875rem;
423
+ font-weight: 600;
424
+ line-height: 1.35;
425
+ }
426
+
427
+ .sparq-control,
428
+ .sparq-select,
429
+ .sparq-textarea {
430
+ box-sizing: border-box;
431
+ width: 100%;
432
+ min-width: 0;
433
+ min-height: var(--sparq-control-height);
434
+ padding: var(--sparq-spacing-2) var(--sparq-spacing-3);
435
+ border: 1px solid var(--sparq-border-strong);
436
+ border-radius: var(--sparq-radius-sm);
437
+ color: var(--sparq-title);
438
+ background: var(--sparq-surface);
439
+ font: inherit;
440
+ font-size: 0.875rem;
441
+ line-height: 1.35;
442
+ box-shadow: var(--sparq-shadow-sm);
443
+ transition: border-color var(--sparq-motion-fast) ease-out, box-shadow var(--sparq-motion-fast) ease-out, background-color var(--sparq-motion-fast) ease-out;
444
+ }
445
+
446
+ .sparq-select {
447
+ padding-right: 2.25rem;
448
+ background-image: linear-gradient(45deg, transparent 50%, var(--sparq-primary) 50%), linear-gradient(135deg, var(--sparq-primary) 50%, transparent 50%);
449
+ background-position: calc(100% - 1rem) 50%, calc(100% - 0.7rem) 50%;
450
+ background-repeat: no-repeat;
451
+ background-size: 0.35rem 0.35rem;
452
+ appearance: none;
453
+ }
454
+
455
+ .sparq-select option {
456
+ color: var(--sparq-text);
457
+ background: var(--sparq-surface);
458
+ }
459
+
460
+ .sparq-control--plain {
461
+ border-color: transparent;
462
+ background: transparent;
463
+ box-shadow: none;
464
+ }
465
+
466
+ .sparq-control--plain:hover,
467
+ .sparq-control--plain:focus {
468
+ border-color: transparent;
469
+ background: transparent;
470
+ box-shadow: none;
471
+ }
472
+
473
+ .sparq-textarea {
474
+ min-height: 6rem;
475
+ resize: vertical;
476
+ }
477
+
478
+ .sparq-control--sm,
479
+ .sparq-select--sm {
480
+ min-height: var(--sparq-control-height-sm);
481
+ }
482
+
483
+ .sparq-control--lg,
484
+ .sparq-select--lg {
485
+ min-height: var(--sparq-control-height-lg);
486
+ }
487
+
488
+ .sparq-control::placeholder,
489
+ .sparq-textarea::placeholder {
490
+ color: var(--sparq-muted);
491
+ opacity: 1;
492
+ }
493
+
494
+ .sparq-control:hover,
495
+ .sparq-select:hover,
496
+ .sparq-textarea:hover {
497
+ border-color: var(--sparq-primary);
498
+ }
499
+
500
+ .sparq-control:focus,
501
+ .sparq-select:focus,
502
+ .sparq-textarea:focus {
503
+ border-color: var(--sparq-primary);
504
+ outline: 0;
505
+ box-shadow: var(--sparq-focus-ring);
506
+ }
507
+
508
+ .sparq-control:disabled,
509
+ .sparq-select:disabled,
510
+ .sparq-textarea:disabled {
511
+ color: var(--sparq-muted);
512
+ background: var(--sparq-surface-subtle);
513
+ opacity: 0.72;
514
+ cursor: not-allowed;
515
+ }
516
+
517
+ .sparq-control[readonly],
518
+ .sparq-textarea[readonly] {
519
+ border-style: dashed;
520
+ background: var(--sparq-surface-subtle);
521
+ }
522
+
523
+ .sparq-control[aria-invalid=true],
524
+ .sparq-select[aria-invalid=true],
525
+ .sparq-textarea[aria-invalid=true] {
526
+ border-color: var(--sparq-danger);
527
+ }
528
+
529
+ .sparq-field-help,
530
+ .sparq-field-error {
531
+ margin: 0;
532
+ font-size: 0.75rem;
533
+ line-height: 1.5;
534
+ }
535
+
536
+ .sparq-field-help {
537
+ color: var(--sparq-muted);
538
+ }
539
+
540
+ .sparq-field-error {
541
+ color: var(--sparq-danger-strong);
542
+ }
543
+
544
+ .sparq-check,
545
+ .sparq-radio {
546
+ display: inline-flex;
547
+ min-width: 0;
548
+ align-items: flex-start;
549
+ gap: var(--sparq-spacing-2);
550
+ color: var(--sparq-text);
551
+ font-size: 0.875rem;
552
+ cursor: pointer;
553
+ }
554
+
555
+ .sparq-check > input,
556
+ .sparq-radio > input,
557
+ .sparq-choice-input {
558
+ width: 1.125rem;
559
+ height: 1.125rem;
560
+ flex: 0 0 auto;
561
+ margin: 0.2rem 0 0;
562
+ accent-color: var(--sparq-primary);
563
+ cursor: pointer;
564
+ }
565
+
566
+ .sparq-check > input:focus-visible,
567
+ .sparq-radio > input:focus-visible,
568
+ .sparq-choice-input:focus-visible {
569
+ outline: 2px solid var(--sparq-primary);
570
+ outline-offset: 2px;
571
+ }
572
+
573
+ .sparq-choice-input:disabled {
574
+ opacity: 0.45;
575
+ cursor: not-allowed;
576
+ }
577
+
578
+ .sparq-switch {
579
+ display: inline-flex;
580
+ min-width: 0;
581
+ align-items: center;
582
+ gap: var(--sparq-spacing-2);
583
+ color: var(--sparq-text);
584
+ font-size: 0.875rem;
585
+ cursor: pointer;
586
+ }
587
+
588
+ .sparq-switch > input,
589
+ .sparq-switch-input {
590
+ position: relative;
591
+ width: 2.5rem;
592
+ height: 1.5rem;
593
+ flex: 0 0 auto;
594
+ margin: 0;
595
+ appearance: none;
596
+ border: 1px solid var(--sparq-border-strong);
597
+ border-radius: 999px;
598
+ background: var(--sparq-surface-subtle);
599
+ cursor: pointer;
600
+ transition: border-color var(--sparq-motion-fast) ease-out, background-color var(--sparq-motion-fast) ease-out;
601
+ }
602
+
603
+ .sparq-switch > input::after,
604
+ .sparq-switch-input::after {
605
+ position: absolute;
606
+ top: 0.1875rem;
607
+ left: 0.1875rem;
608
+ width: 1rem;
609
+ height: 1rem;
610
+ border-radius: 50%;
611
+ background: var(--sparq-muted);
612
+ content: "";
613
+ transition: background-color var(--sparq-motion-fast) ease-out, transform var(--sparq-motion-fast) ease-out;
614
+ }
615
+
616
+ .sparq-switch > input:checked,
617
+ .sparq-switch-input:checked {
618
+ border-color: var(--sparq-primary);
619
+ background: var(--sparq-primary);
620
+ }
621
+
622
+ .sparq-switch > input:checked::after,
623
+ .sparq-switch-input:checked::after {
624
+ background: var(--sparq-inverse-text);
625
+ transform: translateX(1rem);
626
+ }
627
+
628
+ .sparq-switch > input:focus-visible,
629
+ .sparq-switch-input:focus-visible {
630
+ outline: 0;
631
+ box-shadow: var(--sparq-focus-ring);
632
+ }
633
+
634
+ .sparq-switch > input:disabled,
635
+ .sparq-switch-input:disabled {
636
+ opacity: 0.45;
637
+ cursor: not-allowed;
638
+ }
639
+
640
+ .sparq-input-group {
641
+ display: flex;
642
+ min-width: 0;
643
+ align-items: stretch;
644
+ border-radius: var(--sparq-radius-sm);
645
+ transition: box-shadow var(--sparq-motion-fast) ease-out;
646
+ }
647
+
648
+ .sparq-input-group:focus-within {
649
+ box-shadow: var(--sparq-focus-ring);
650
+ }
651
+
652
+ .sparq-input-group > .sparq-control:hover,
653
+ .sparq-input-group > .sparq-select:hover {
654
+ border-color: var(--sparq-border-strong);
655
+ }
656
+
657
+ .sparq-input-icon {
658
+ display: flex;
659
+ box-sizing: border-box;
660
+ min-width: 0;
661
+ min-height: var(--sparq-control-height);
662
+ align-items: center;
663
+ gap: var(--sparq-spacing-2);
664
+ padding-inline: var(--sparq-spacing-3);
665
+ border: 1px solid var(--sparq-border-strong);
666
+ border-radius: var(--sparq-radius-sm);
667
+ color: var(--sparq-muted);
668
+ background: var(--sparq-surface);
669
+ box-shadow: var(--sparq-shadow-sm);
670
+ transition: border-color var(--sparq-motion-fast) ease-out, box-shadow var(--sparq-motion-fast) ease-out;
671
+ }
672
+
673
+ .sparq-input-icon:focus-within {
674
+ border-color: var(--sparq-primary);
675
+ box-shadow: var(--sparq-focus-ring);
676
+ }
677
+
678
+ .sparq-input-icon:focus-within > .sparq-control {
679
+ border-color: transparent;
680
+ box-shadow: none;
681
+ }
682
+
683
+ .sparq-input-icon > .sparq-control--plain:hover,
684
+ .sparq-input-icon > .sparq-control--plain:focus {
685
+ border-color: transparent;
686
+ box-shadow: none;
687
+ }
688
+
689
+ .sparq-input-icon > svg {
690
+ width: 1rem;
691
+ height: 1rem;
692
+ flex: 0 0 auto;
693
+ }
694
+
695
+ .sparq-input-icon > .sparq-control {
696
+ flex: 1 1 auto;
697
+ height: 100%;
698
+ min-height: 0;
699
+ padding-block: 0;
700
+ }
701
+
702
+ .sparq-input-group > .sparq-control,
703
+ .sparq-input-group > .sparq-select,
704
+ .sparq-input-group > .sparq-button,
705
+ .sparq-input-group > .sparq-input-addon {
706
+ border-radius: 0;
707
+ }
708
+
709
+ .sparq-input-group > .sparq-button,
710
+ .sparq-input-group > .sparq-input-addon {
711
+ box-sizing: border-box;
712
+ min-height: var(--sparq-control-height);
713
+ }
714
+
715
+ .sparq-input-group > * + * {
716
+ margin-left: -1px;
717
+ }
718
+
719
+ .sparq-input-group:focus-within > * {
720
+ border-color: var(--sparq-primary);
721
+ }
722
+
723
+ .sparq-input-group:focus-within > .sparq-control:focus,
724
+ .sparq-input-group:focus-within > .sparq-select:focus {
725
+ border-color: var(--sparq-primary);
726
+ box-shadow: none;
727
+ }
728
+
729
+ .sparq-input-group:focus-within > .sparq-control:hover,
730
+ .sparq-input-group:focus-within > .sparq-select:hover {
731
+ border-color: var(--sparq-primary);
732
+ }
733
+
734
+ .sparq-input-group > .sparq-control:focus,
735
+ .sparq-input-group > .sparq-select:focus,
736
+ .sparq-input-group > .sparq-button:focus-visible {
737
+ position: relative;
738
+ z-index: 1;
739
+ }
740
+
741
+ .sparq-input-group > .sparq-control,
742
+ .sparq-input-group > .sparq-select {
743
+ flex: 1 1 auto;
744
+ }
745
+
746
+ .sparq-input-group > :first-child {
747
+ border-radius: var(--sparq-radius-sm) 0 0 var(--sparq-radius-sm);
748
+ }
749
+
750
+ .sparq-input-group > :last-child {
751
+ border-radius: 0 var(--sparq-radius-sm) var(--sparq-radius-sm) 0;
752
+ }
753
+
754
+ .sparq-form-actions {
755
+ display: flex;
756
+ flex-wrap: wrap;
757
+ align-items: center;
758
+ justify-content: flex-end;
759
+ gap: var(--sparq-spacing-3);
760
+ }
761
+
762
+ .sparq-form-row {
763
+ display: flex;
764
+ flex-wrap: wrap;
765
+ align-items: flex-start;
766
+ min-width: 0;
767
+ gap: var(--sparq-form-row-gap, var(--sparq-spacing-4));
768
+ }
769
+
770
+ .sparq-form-row > .sparq-field {
771
+ flex: 1 1 14rem;
772
+ }
773
+
774
+ .sparq-form-row--columns-1 > .sparq-field,
775
+ .sparq-form-row--one > .sparq-field {
776
+ flex-grow: 0;
777
+ min-width: 0;
778
+ flex-basis: 100%;
779
+ }
780
+
781
+ .sparq-form-row--columns-2 > .sparq-field,
782
+ .sparq-form-row--two > .sparq-field {
783
+ flex-grow: 0;
784
+ min-width: 0;
785
+ flex-basis: calc((100% - var(--sparq-form-row-gap, var(--sparq-spacing-4))) / 2);
786
+ }
787
+
788
+ .sparq-form-row--columns-3 > .sparq-field {
789
+ flex-grow: 0;
790
+ min-width: 0;
791
+ flex-basis: calc((100% - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4))) / 3);
792
+ }
793
+
794
+ .sparq-form-row--columns-4 > .sparq-field {
795
+ flex-grow: 0;
796
+ min-width: 0;
797
+ flex-basis: calc((100% - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4))) / 4);
798
+ }
799
+
800
+ .sparq-form-row--columns-5 > .sparq-field {
801
+ flex-grow: 0;
802
+ min-width: 0;
803
+ flex-basis: calc((100% - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4))) / 5);
804
+ }
805
+
806
+ .sparq-form-row--columns-6 > .sparq-field {
807
+ flex-grow: 0;
808
+ min-width: 0;
809
+ flex-basis: calc((100% - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4)) - var(--sparq-form-row-gap, var(--sparq-spacing-4))) / 6);
810
+ }
811
+
812
+ .sparq-field--horizontal {
813
+ flex-direction: row;
814
+ flex-wrap: wrap;
815
+ align-items: center;
816
+ column-gap: var(--sparq-spacing-3);
817
+ row-gap: var(--sparq-spacing-2);
818
+ }
819
+
820
+ .sparq-field--horizontal > .sparq-label {
821
+ flex: 0 0 var(--sparq-form-label-width, 8rem);
822
+ text-align: var(--sparq-form-label-align, start);
823
+ }
824
+
825
+ .sparq-field--horizontal > :not(.sparq-label):not(.sparq-field-help):not(.sparq-field-error) {
826
+ flex: 1 1 0;
827
+ min-width: 0;
828
+ }
829
+
830
+ .sparq-field--horizontal > .sparq-field-help,
831
+ .sparq-field--horizontal > .sparq-field-error {
832
+ flex: 0 0 calc(100% - var(--sparq-form-label-width, 8rem) - var(--sparq-spacing-3));
833
+ margin-left: calc(var(--sparq-form-label-width, 8rem) + var(--sparq-spacing-3));
834
+ }
835
+
836
+ @media (max-width: 39.99rem) {
837
+ .sparq-form-row--columns-1 > .sparq-field,
838
+ .sparq-form-row--columns-2 > .sparq-field,
839
+ .sparq-form-row--columns-3 > .sparq-field,
840
+ .sparq-form-row--columns-4 > .sparq-field,
841
+ .sparq-form-row--columns-5 > .sparq-field,
842
+ .sparq-form-row--columns-6 > .sparq-field,
843
+ .sparq-form-row--one > .sparq-field,
844
+ .sparq-form-row--two > .sparq-field {
845
+ flex-basis: 100%;
846
+ }
847
+ .sparq-field--horizontal > .sparq-label,
848
+ .sparq-field--horizontal > :not(.sparq-label):not(.sparq-field-help):not(.sparq-field-error),
849
+ .sparq-field--horizontal > .sparq-field-help,
850
+ .sparq-field--horizontal > .sparq-field-error {
851
+ flex-basis: 100%;
852
+ margin-left: 0;
853
+ }
854
+ }
855
+ .sparq-fieldset {
856
+ display: flex;
857
+ flex-direction: column;
858
+ min-width: 0;
859
+ gap: var(--sparq-spacing-3);
860
+ padding: 0;
861
+ margin: 0;
862
+ border: 0;
863
+ }
864
+
865
+ .sparq-fieldset > legend {
866
+ padding: 0;
867
+ margin-bottom: var(--sparq-spacing-2);
868
+ color: var(--sparq-title);
869
+ font-weight: 600;
870
+ }
871
+
872
+ .sparq-required {
873
+ color: var(--sparq-danger-strong);
874
+ }
875
+
876
+ .sparq-input-addon {
877
+ display: inline-flex;
878
+ min-height: var(--sparq-control-height);
879
+ align-items: center;
880
+ padding-inline: var(--sparq-spacing-3);
881
+ border: 1px solid var(--sparq-border-strong);
882
+ color: var(--sparq-muted);
883
+ background: var(--sparq-surface-subtle);
884
+ font-size: 0.875rem;
885
+ white-space: nowrap;
886
+ }
887
+
888
+ .sparq-input-group > .sparq-input-addon {
889
+ border-radius: 0;
890
+ }
891
+
892
+ .sparq-range {
893
+ width: 100%;
894
+ min-height: var(--sparq-control-height);
895
+ margin: 0;
896
+ accent-color: var(--sparq-primary);
897
+ cursor: pointer;
898
+ }
899
+
900
+ .sparq-range:focus-visible {
901
+ outline: 0;
902
+ box-shadow: var(--sparq-focus-ring);
903
+ }
904
+
905
+ .sparq-range:disabled {
906
+ opacity: 0.45;
907
+ cursor: not-allowed;
908
+ }
909
+
910
+ .sparq-file {
911
+ padding: 0.375rem;
912
+ }
913
+
914
+ .sparq-file::file-selector-button {
915
+ min-height: 2rem;
916
+ padding-inline: var(--sparq-spacing-3);
917
+ margin-right: var(--sparq-spacing-3);
918
+ border: 1px solid var(--sparq-border-strong);
919
+ border-radius: var(--sparq-radius-sm);
920
+ color: var(--sparq-title);
921
+ background: var(--sparq-surface-subtle);
922
+ font: inherit;
923
+ font-weight: 600;
924
+ cursor: pointer;
925
+ }
926
+
927
+ .sparq-error-summary {
928
+ padding: var(--sparq-spacing-4);
929
+ border: 1px solid var(--sparq-danger);
930
+ border-radius: var(--sparq-radius-sm);
931
+ color: var(--sparq-text);
932
+ background: var(--sparq-danger-soft);
933
+ }
934
+
935
+ .sparq-error-summary > :first-child {
936
+ margin-top: 0;
937
+ }
938
+
939
+ .sparq-error-summary > :last-child {
940
+ margin-bottom: 0;
941
+ }
942
+
943
+ .sparq-error-summary a {
944
+ color: var(--sparq-danger-strong);
945
+ font-weight: 600;
946
+ }
947
+
948
+ .sparq-alert {
949
+ display: grid;
950
+ grid-template-columns: auto minmax(0, 1fr) auto;
951
+ align-items: start;
952
+ gap: var(--sparq-spacing-3);
953
+ padding: var(--sparq-spacing-3) var(--sparq-spacing-4);
954
+ border: 1px solid var(--sparq-border);
955
+ border-left-width: 3px;
956
+ border-radius: var(--sparq-radius-sm);
957
+ color: var(--sparq-text);
958
+ background: var(--sparq-surface-subtle);
959
+ font-size: 0.875rem;
960
+ line-height: 1.5;
961
+ }
962
+
963
+ .sparq-alert--info {
964
+ border-color: var(--sparq-primary);
965
+ color: var(--sparq-primary-strong);
966
+ background: var(--sparq-primary-soft);
967
+ }
968
+
969
+ .sparq-alert--success {
970
+ border-color: var(--sparq-success);
971
+ color: var(--sparq-success-strong);
972
+ background: var(--sparq-success-soft);
973
+ }
974
+
975
+ .sparq-alert--warning {
976
+ border-color: var(--sparq-warning);
977
+ color: var(--sparq-warning-strong);
978
+ background: var(--sparq-warning-soft);
979
+ }
980
+
981
+ .sparq-alert--danger {
982
+ border-color: var(--sparq-danger);
983
+ color: var(--sparq-danger-strong);
984
+ background: var(--sparq-danger-soft);
985
+ }
986
+
987
+ .sparq-alert__icon {
988
+ display: inline-flex;
989
+ width: var(--sparq-icon-size-lg);
990
+ height: var(--sparq-icon-size-lg);
991
+ align-items: center;
992
+ justify-content: center;
993
+ margin-top: 0.0625rem;
994
+ color: currentColor;
995
+ }
996
+
997
+ .sparq-alert__icon > svg {
998
+ width: 100%;
999
+ height: 100%;
1000
+ }
1001
+
1002
+ .sparq-alert > svg {
1003
+ width: var(--sparq-icon-size-lg);
1004
+ height: var(--sparq-icon-size-lg);
1005
+ margin-top: 0.0625rem;
1006
+ }
1007
+
1008
+ .sparq-alert__content {
1009
+ min-width: 0;
1010
+ }
1011
+
1012
+ .sparq-alert__title,
1013
+ .sparq-alert__message {
1014
+ margin: 0;
1015
+ }
1016
+
1017
+ .sparq-alert__title {
1018
+ color: currentColor;
1019
+ font-size: 0.875rem;
1020
+ font-weight: var(--sparq-font-weight-semibold);
1021
+ }
1022
+
1023
+ .sparq-alert__message {
1024
+ overflow-wrap: anywhere;
1025
+ }
1026
+
1027
+ .sparq-alert__title + .sparq-alert__message {
1028
+ margin-top: var(--sparq-spacing-1);
1029
+ }
1030
+
1031
+ .sparq-alert__actions {
1032
+ display: flex;
1033
+ grid-column: 2/-1;
1034
+ flex-wrap: wrap;
1035
+ align-items: center;
1036
+ gap: var(--sparq-spacing-2);
1037
+ margin-top: var(--sparq-spacing-1);
1038
+ }
1039
+
1040
+ .sparq-alert__close {
1041
+ display: inline-flex;
1042
+ width: 2rem;
1043
+ height: 2rem;
1044
+ align-items: center;
1045
+ justify-content: center;
1046
+ padding: 0;
1047
+ border: 0;
1048
+ border-radius: var(--sparq-radius-sm);
1049
+ color: currentColor;
1050
+ background: transparent;
1051
+ font: inherit;
1052
+ cursor: pointer;
1053
+ }
1054
+
1055
+ .sparq-alert__close:hover {
1056
+ background: rgba(255, 255, 255, 0.52);
1057
+ }
1058
+
1059
+ .sparq-alert__close:focus-visible {
1060
+ outline: 0;
1061
+ box-shadow: var(--sparq-focus-ring);
1062
+ }
1063
+
1064
+ .sparq-empty {
1065
+ display: flex;
1066
+ flex-direction: column;
1067
+ align-items: center;
1068
+ gap: var(--sparq-spacing-3);
1069
+ padding: var(--sparq-spacing-7) var(--sparq-spacing-5);
1070
+ color: var(--sparq-muted);
1071
+ text-align: center;
1072
+ }
1073
+
1074
+ .sparq-empty--compact {
1075
+ padding: var(--sparq-spacing-5) var(--sparq-spacing-4);
1076
+ }
1077
+
1078
+ .sparq-empty__icon {
1079
+ display: inline-flex;
1080
+ width: 3rem;
1081
+ height: 3rem;
1082
+ align-items: center;
1083
+ justify-content: center;
1084
+ color: var(--sparq-muted);
1085
+ }
1086
+
1087
+ .sparq-empty__icon > svg {
1088
+ width: 100%;
1089
+ height: 100%;
1090
+ }
1091
+
1092
+ .sparq-empty__title,
1093
+ .sparq-empty__message {
1094
+ margin: 0;
1095
+ }
1096
+
1097
+ .sparq-empty__title {
1098
+ color: var(--sparq-title);
1099
+ font-size: var(--sparq-font-size-lg);
1100
+ font-weight: var(--sparq-font-weight-semibold);
1101
+ }
1102
+
1103
+ .sparq-empty__message {
1104
+ max-width: 32rem;
1105
+ overflow-wrap: anywhere;
1106
+ line-height: var(--sparq-line-height-body);
1107
+ }
1108
+
1109
+ .sparq-empty__actions {
1110
+ display: flex;
1111
+ flex-wrap: wrap;
1112
+ justify-content: center;
1113
+ gap: var(--sparq-spacing-2);
1114
+ margin-top: var(--sparq-spacing-1);
1115
+ }
1116
+
1117
+ @media (max-width: 39.99rem) {
1118
+ .sparq-alert {
1119
+ grid-template-columns: auto minmax(0, 1fr);
1120
+ }
1121
+ .sparq-alert__close {
1122
+ grid-column: 2;
1123
+ grid-row: 1;
1124
+ justify-self: end;
1125
+ }
1126
+ .sparq-alert__actions {
1127
+ grid-column: 1/-1;
1128
+ }
1129
+ }
1130
+ .sparq-card {
1131
+ min-width: 0;
1132
+ overflow: hidden;
1133
+ border: 1px solid var(--sparq-border);
1134
+ border-radius: var(--sparq-radius-md);
1135
+ color: var(--sparq-text);
1136
+ background: var(--sparq-surface);
1137
+ box-shadow: var(--sparq-shadow-sm);
1138
+ }
1139
+
1140
+ .sparq-card__header,
1141
+ .sparq-card__body,
1142
+ .sparq-card__footer {
1143
+ padding: var(--sparq-spacing-4) var(--sparq-spacing-5);
1144
+ }
1145
+
1146
+ .sparq-card__header,
1147
+ .sparq-card__footer {
1148
+ display: flex;
1149
+ min-width: 0;
1150
+ align-items: center;
1151
+ flex-wrap: wrap;
1152
+ justify-content: space-between;
1153
+ gap: var(--sparq-spacing-3);
1154
+ }
1155
+
1156
+ .sparq-card__header {
1157
+ border-bottom: 1px solid var(--sparq-border);
1158
+ }
1159
+
1160
+ .sparq-card__footer {
1161
+ border-top: 1px solid var(--sparq-border);
1162
+ background: var(--sparq-surface-subtle);
1163
+ }
1164
+
1165
+ .sparq-card__title {
1166
+ margin: 0;
1167
+ color: var(--sparq-title);
1168
+ font-size: 1rem;
1169
+ font-weight: 600;
1170
+ }
1171
+
1172
+ .sparq-card__subtitle {
1173
+ margin: var(--sparq-spacing-1) 0 0;
1174
+ color: var(--sparq-muted);
1175
+ font-size: 0.8125rem;
1176
+ }
1177
+
1178
+ .sparq-card__body > :first-child {
1179
+ margin-top: 0;
1180
+ }
1181
+
1182
+ .sparq-card__body > :last-child {
1183
+ margin-bottom: 0;
1184
+ }
1185
+
1186
+ .sparq-badge {
1187
+ display: inline-flex;
1188
+ min-height: 1.5rem;
1189
+ align-items: center;
1190
+ gap: var(--sparq-spacing-1);
1191
+ padding: 0.125rem var(--sparq-spacing-2);
1192
+ border: 1px solid var(--sparq-border-strong);
1193
+ border-radius: var(--sparq-radius-sm);
1194
+ color: var(--sparq-text);
1195
+ background: var(--sparq-surface-subtle);
1196
+ font-size: 0.75rem;
1197
+ font-weight: 600;
1198
+ line-height: 1.25;
1199
+ white-space: nowrap;
1200
+ }
1201
+
1202
+ .sparq-badge--primary {
1203
+ border-color: var(--sparq-primary);
1204
+ color: var(--sparq-primary-strong);
1205
+ background: var(--sparq-primary-soft);
1206
+ }
1207
+
1208
+ .sparq-badge--success {
1209
+ border-color: var(--sparq-success);
1210
+ color: var(--sparq-success-strong);
1211
+ background: var(--sparq-success-soft);
1212
+ }
1213
+
1214
+ .sparq-badge--warning {
1215
+ border-color: var(--sparq-warning);
1216
+ color: var(--sparq-warning-strong);
1217
+ background: var(--sparq-warning-soft);
1218
+ }
1219
+
1220
+ .sparq-badge--danger {
1221
+ border-color: var(--sparq-danger);
1222
+ color: var(--sparq-danger-strong);
1223
+ background: var(--sparq-danger-soft);
1224
+ }
1225
+
1226
+ .sparq-badge--dot::before {
1227
+ width: 0.375rem;
1228
+ height: 0.375rem;
1229
+ flex: 0 0 auto;
1230
+ border-radius: 50%;
1231
+ background: currentColor;
1232
+ content: "";
1233
+ }
1234
+
1235
+ .sparq-avatar {
1236
+ display: inline-grid;
1237
+ width: 2.5rem;
1238
+ height: 2.5rem;
1239
+ flex: 0 0 auto;
1240
+ place-items: center;
1241
+ overflow: hidden;
1242
+ border: 1px solid var(--sparq-border);
1243
+ border-radius: var(--sparq-radius-sm);
1244
+ color: var(--sparq-primary-strong);
1245
+ background: var(--sparq-primary-soft);
1246
+ font-size: 0.875rem;
1247
+ font-weight: 600;
1248
+ }
1249
+
1250
+ .sparq-avatar--sm {
1251
+ width: 2rem;
1252
+ height: 2rem;
1253
+ font-size: 0.75rem;
1254
+ }
1255
+
1256
+ .sparq-avatar--lg {
1257
+ width: 3rem;
1258
+ height: 3rem;
1259
+ font-size: 1rem;
1260
+ }
1261
+
1262
+ .sparq-avatar--circle {
1263
+ border-radius: 50%;
1264
+ }
1265
+
1266
+ .sparq-avatar > img {
1267
+ width: 100%;
1268
+ height: 100%;
1269
+ object-fit: cover;
1270
+ }
1271
+
1272
+ @media (max-width: 39.99rem) {
1273
+ .sparq-card__header,
1274
+ .sparq-card__body,
1275
+ .sparq-card__footer {
1276
+ padding-inline: var(--sparq-spacing-4);
1277
+ }
1278
+ }
1279
+ .sparq-breadcrumb {
1280
+ display: flex;
1281
+ min-width: 0;
1282
+ flex-wrap: wrap;
1283
+ align-items: center;
1284
+ gap: var(--sparq-spacing-2);
1285
+ padding: 0;
1286
+ margin: 0;
1287
+ color: var(--sparq-muted);
1288
+ font-size: 0.8125rem;
1289
+ list-style: none;
1290
+ }
1291
+
1292
+ .sparq-breadcrumb > li {
1293
+ display: inline-flex;
1294
+ min-width: 0;
1295
+ align-items: center;
1296
+ gap: var(--sparq-spacing-2);
1297
+ }
1298
+
1299
+ .sparq-breadcrumb > li + li::before {
1300
+ color: var(--sparq-border-strong);
1301
+ content: "/";
1302
+ }
1303
+
1304
+ .sparq-breadcrumb a {
1305
+ color: var(--sparq-primary-strong);
1306
+ text-decoration: none;
1307
+ }
1308
+
1309
+ .sparq-breadcrumb a:hover {
1310
+ text-decoration: underline;
1311
+ }
1312
+
1313
+ .sparq-breadcrumb a:focus-visible {
1314
+ border-radius: var(--sparq-radius-sm);
1315
+ outline: 0;
1316
+ box-shadow: var(--sparq-focus-ring);
1317
+ }
1318
+
1319
+ .sparq-breadcrumb [aria-current=page] {
1320
+ overflow: hidden;
1321
+ color: var(--sparq-text);
1322
+ text-overflow: ellipsis;
1323
+ white-space: nowrap;
1324
+ }
1325
+
1326
+ .sparq-tabs {
1327
+ display: flex;
1328
+ min-width: 0;
1329
+ gap: var(--sparq-spacing-5);
1330
+ padding: 0;
1331
+ margin: 0;
1332
+ overflow-x: auto;
1333
+ border-bottom: 1px solid var(--sparq-border);
1334
+ list-style: none;
1335
+ scrollbar-width: thin;
1336
+ }
1337
+
1338
+ .sparq-tabs__item {
1339
+ display: inline-flex;
1340
+ min-height: var(--sparq-control-height);
1341
+ flex: 0 0 auto;
1342
+ align-items: center;
1343
+ gap: var(--sparq-spacing-2);
1344
+ padding: 0;
1345
+ border: 0;
1346
+ border-bottom: 2px solid transparent;
1347
+ color: var(--sparq-muted);
1348
+ background: transparent;
1349
+ font: inherit;
1350
+ font-size: 0.875rem;
1351
+ font-weight: 600;
1352
+ text-decoration: none;
1353
+ cursor: pointer;
1354
+ }
1355
+
1356
+ .sparq-tabs__item:hover,
1357
+ .sparq-tabs__item[aria-current=page],
1358
+ .sparq-tabs__item[aria-selected=true],
1359
+ .sparq-tabs__item.is-active {
1360
+ border-bottom-color: var(--sparq-primary);
1361
+ color: var(--sparq-primary-strong);
1362
+ }
1363
+
1364
+ .sparq-tabs__item:focus-visible {
1365
+ outline: 0;
1366
+ box-shadow: inset 0 0 0 2px var(--sparq-primary);
1367
+ }
1368
+
1369
+ .sparq-pagination {
1370
+ display: flex;
1371
+ min-width: 0;
1372
+ flex-wrap: wrap;
1373
+ gap: var(--sparq-spacing-1);
1374
+ padding: 0;
1375
+ margin: 0;
1376
+ list-style: none;
1377
+ }
1378
+
1379
+ .sparq-pagination__item {
1380
+ display: inline-flex;
1381
+ min-width: var(--sparq-control-height-sm);
1382
+ min-height: var(--sparq-control-height-sm);
1383
+ align-items: center;
1384
+ justify-content: center;
1385
+ padding-inline: var(--sparq-spacing-2);
1386
+ border: 1px solid var(--sparq-border-strong);
1387
+ border-radius: var(--sparq-radius-sm);
1388
+ color: var(--sparq-text);
1389
+ background: var(--sparq-surface);
1390
+ font-size: 0.875rem;
1391
+ text-decoration: none;
1392
+ }
1393
+
1394
+ .sparq-pagination__item:hover {
1395
+ border-color: var(--sparq-primary);
1396
+ color: var(--sparq-primary-strong);
1397
+ background: var(--sparq-primary-soft);
1398
+ }
1399
+
1400
+ .sparq-pagination__item:focus-visible {
1401
+ outline: 0;
1402
+ box-shadow: var(--sparq-focus-ring);
1403
+ }
1404
+
1405
+ .sparq-pagination__item[aria-current=page] {
1406
+ border-color: var(--sparq-primary);
1407
+ color: var(--sparq-inverse-text);
1408
+ background: var(--sparq-primary);
1409
+ }
1410
+
1411
+ .sparq-pagination__item[aria-disabled=true] {
1412
+ opacity: 0.45;
1413
+ pointer-events: none;
1414
+ }
1415
+
1416
+ .sparq-button-group {
1417
+ display: inline-flex;
1418
+ min-width: 0;
1419
+ align-items: stretch;
1420
+ }
1421
+
1422
+ .sparq-button-group > .sparq-button {
1423
+ border-radius: 0;
1424
+ }
1425
+
1426
+ .sparq-button-group > .sparq-button + .sparq-button {
1427
+ margin-left: -1px;
1428
+ }
1429
+
1430
+ .sparq-button-group > .sparq-button:first-child {
1431
+ border-radius: var(--sparq-radius-sm) 0 0 var(--sparq-radius-sm);
1432
+ }
1433
+
1434
+ .sparq-button-group > .sparq-button:last-child {
1435
+ border-radius: 0 var(--sparq-radius-sm) var(--sparq-radius-sm) 0;
1436
+ }
1437
+
1438
+ .sparq-toolbar {
1439
+ display: flex;
1440
+ min-width: 0;
1441
+ flex-wrap: wrap;
1442
+ align-items: center;
1443
+ justify-content: space-between;
1444
+ gap: var(--sparq-spacing-3);
1445
+ }
1446
+
1447
+ @media (max-width: 39.99rem) {
1448
+ .sparq-pagination__item {
1449
+ min-width: var(--sparq-control-height);
1450
+ min-height: var(--sparq-control-height);
1451
+ }
1452
+ }
1453
+ .sparq-progress {
1454
+ width: 100%;
1455
+ height: 0.5rem;
1456
+ overflow: hidden;
1457
+ border-radius: var(--sparq-radius-sm);
1458
+ background: var(--sparq-surface-subtle);
1459
+ }
1460
+
1461
+ .sparq-progress--sm {
1462
+ height: 0.25rem;
1463
+ }
1464
+
1465
+ .sparq-progress--lg {
1466
+ height: 0.75rem;
1467
+ }
1468
+
1469
+ .sparq-progress__bar {
1470
+ width: var(--sparq-progress-value, 0%);
1471
+ height: 100%;
1472
+ border-radius: inherit;
1473
+ background: var(--sparq-primary);
1474
+ transition: width var(--sparq-motion-base) ease-out;
1475
+ }
1476
+
1477
+ .sparq-progress--success .sparq-progress__bar {
1478
+ background: var(--sparq-success);
1479
+ }
1480
+
1481
+ .sparq-progress--warning .sparq-progress__bar {
1482
+ background: var(--sparq-warning);
1483
+ }
1484
+
1485
+ .sparq-progress--danger .sparq-progress__bar {
1486
+ background: var(--sparq-danger);
1487
+ }
1488
+
1489
+ .sparq-progress--indeterminate .sparq-progress__bar {
1490
+ width: 40%;
1491
+ animation: sparq-progress-indeterminate 1.2s ease-in-out infinite;
1492
+ }
1493
+
1494
+ .sparq-progress-group {
1495
+ display: flex;
1496
+ min-width: 0;
1497
+ flex-direction: column;
1498
+ gap: var(--sparq-spacing-2);
1499
+ }
1500
+
1501
+ .sparq-progress__header {
1502
+ display: flex;
1503
+ min-width: 0;
1504
+ align-items: center;
1505
+ justify-content: space-between;
1506
+ gap: var(--sparq-spacing-3);
1507
+ color: var(--sparq-text);
1508
+ font-size: var(--sparq-font-size-sm);
1509
+ }
1510
+
1511
+ .sparq-progress__label {
1512
+ min-width: 0;
1513
+ overflow-wrap: anywhere;
1514
+ }
1515
+
1516
+ .sparq-progress__value {
1517
+ flex: 0 0 auto;
1518
+ color: var(--sparq-muted);
1519
+ font-variant-numeric: tabular-nums;
1520
+ }
1521
+
1522
+ .sparq-progress[aria-busy=true] .sparq-progress__bar {
1523
+ width: 40%;
1524
+ animation: sparq-progress-indeterminate 1.2s ease-in-out infinite;
1525
+ }
1526
+
1527
+ .sparq-spinner {
1528
+ display: inline-block;
1529
+ width: 1.25rem;
1530
+ height: 1.25rem;
1531
+ flex: 0 0 auto;
1532
+ border: 2px solid currentColor;
1533
+ border-right-color: transparent;
1534
+ border-radius: 50%;
1535
+ color: var(--sparq-primary);
1536
+ animation: sparq-spinner-rotate 700ms linear infinite;
1537
+ }
1538
+
1539
+ .sparq-spinner--sm {
1540
+ width: 1rem;
1541
+ height: 1rem;
1542
+ }
1543
+
1544
+ .sparq-spinner--lg {
1545
+ width: 2rem;
1546
+ height: 2rem;
1547
+ border-width: 3px;
1548
+ }
1549
+
1550
+ .sparq-spinner--muted {
1551
+ color: var(--sparq-muted);
1552
+ }
1553
+
1554
+ .sparq-spinner--success {
1555
+ color: var(--sparq-success);
1556
+ }
1557
+
1558
+ .sparq-spinner--danger {
1559
+ color: var(--sparq-danger);
1560
+ }
1561
+
1562
+ .sparq-skeleton {
1563
+ display: block;
1564
+ width: 100%;
1565
+ min-height: 1rem;
1566
+ overflow: hidden;
1567
+ border-radius: var(--sparq-radius-sm);
1568
+ background: var(--sparq-surface-subtle);
1569
+ color: transparent;
1570
+ }
1571
+
1572
+ .sparq-skeleton::after {
1573
+ display: block;
1574
+ width: 45%;
1575
+ height: 100%;
1576
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.72), transparent);
1577
+ animation: sparq-skeleton-shimmer 1.4s ease-in-out infinite;
1578
+ transform: translateX(-100%);
1579
+ content: "";
1580
+ }
1581
+
1582
+ .sparq-skeleton--text {
1583
+ height: 0.75rem;
1584
+ }
1585
+
1586
+ .sparq-skeleton--heading {
1587
+ width: min(16rem, 70%);
1588
+ height: 1.25rem;
1589
+ }
1590
+
1591
+ .sparq-skeleton--circle {
1592
+ width: 2.5rem;
1593
+ height: 2.5rem;
1594
+ min-height: 0;
1595
+ border-radius: 50%;
1596
+ }
1597
+
1598
+ .sparq-skeleton--button {
1599
+ width: 7rem;
1600
+ height: var(--sparq-button-height);
1601
+ }
1602
+
1603
+ @keyframes sparq-progress-indeterminate {
1604
+ from {
1605
+ transform: translateX(-100%);
1606
+ }
1607
+ to {
1608
+ transform: translateX(250%);
1609
+ }
1610
+ }
1611
+ @keyframes sparq-spinner-rotate {
1612
+ to {
1613
+ transform: rotate(360deg);
1614
+ }
1615
+ }
1616
+ @keyframes sparq-skeleton-shimmer {
1617
+ to {
1618
+ transform: translateX(225%);
1619
+ }
1620
+ }
1621
+ @media (prefers-reduced-motion: reduce) {
1622
+ .sparq-spinner {
1623
+ animation-duration: 1400ms;
1624
+ }
1625
+ .sparq-skeleton::after {
1626
+ animation: none;
1627
+ }
1628
+ .sparq-progress--indeterminate .sparq-progress__bar {
1629
+ width: 100%;
1630
+ animation: none;
1631
+ opacity: 0.55;
1632
+ transform: none;
1633
+ }
1634
+ }
1635
+ .sparq-dropdown {
1636
+ position: relative;
1637
+ display: inline-flex;
1638
+ }
1639
+
1640
+ .sparq-dropdown__menu {
1641
+ position: absolute;
1642
+ top: calc(100% + var(--sparq-spacing-2));
1643
+ left: 0;
1644
+ z-index: var(--sparq-z-dropdown);
1645
+ display: grid;
1646
+ width: max-content;
1647
+ min-width: 12rem;
1648
+ max-width: min(20rem, 100vw - 2rem);
1649
+ padding: var(--sparq-spacing-2);
1650
+ border: 1px solid var(--sparq-border);
1651
+ border-radius: var(--sparq-radius-md);
1652
+ color: var(--sparq-text);
1653
+ background: var(--sparq-surface);
1654
+ box-shadow: var(--sparq-shadow-menu);
1655
+ }
1656
+
1657
+ .sparq-dropdown--end .sparq-dropdown__menu {
1658
+ right: 0;
1659
+ left: auto;
1660
+ }
1661
+
1662
+ .sparq-dropdown__item {
1663
+ display: flex;
1664
+ width: 100%;
1665
+ min-height: 2.5rem;
1666
+ align-items: center;
1667
+ gap: var(--sparq-spacing-2);
1668
+ padding: var(--sparq-spacing-2) var(--sparq-spacing-3);
1669
+ border: 0;
1670
+ border-radius: var(--sparq-radius-sm);
1671
+ color: var(--sparq-text);
1672
+ background: transparent;
1673
+ font: inherit;
1674
+ font-size: 0.875rem;
1675
+ text-align: left;
1676
+ text-decoration: none;
1677
+ cursor: pointer;
1678
+ }
1679
+
1680
+ .sparq-dropdown__item:hover,
1681
+ .sparq-dropdown__item:focus-visible {
1682
+ color: var(--sparq-title);
1683
+ background: var(--sparq-surface-subtle);
1684
+ outline: 0;
1685
+ }
1686
+
1687
+ .sparq-dropdown__item--danger {
1688
+ color: var(--sparq-danger-strong);
1689
+ }
1690
+
1691
+ .sparq-dropdown__item[aria-disabled=true],
1692
+ .sparq-dropdown__item:disabled {
1693
+ opacity: 0.45;
1694
+ pointer-events: none;
1695
+ }
1696
+
1697
+ .sparq-dropdown__header {
1698
+ padding: var(--sparq-spacing-2) var(--sparq-spacing-3);
1699
+ color: var(--sparq-muted);
1700
+ font-size: 0.75rem;
1701
+ font-weight: 600;
1702
+ }
1703
+
1704
+ .sparq-dropdown__divider {
1705
+ height: 1px;
1706
+ margin: var(--sparq-spacing-2) calc(var(--sparq-spacing-2) * -1);
1707
+ border: 0;
1708
+ background: var(--sparq-border);
1709
+ }
1710
+
1711
+ .sparq-toast-region {
1712
+ position: fixed;
1713
+ top: var(--sparq-spacing-4);
1714
+ right: var(--sparq-spacing-4);
1715
+ z-index: var(--sparq-z-toast);
1716
+ display: grid;
1717
+ width: min(24rem, 100vw - 2rem);
1718
+ gap: var(--sparq-spacing-3);
1719
+ pointer-events: none;
1720
+ }
1721
+
1722
+ .sparq-toast {
1723
+ position: relative;
1724
+ display: grid;
1725
+ grid-template-columns: minmax(0, 1fr) auto;
1726
+ gap: var(--sparq-spacing-3);
1727
+ padding: var(--sparq-spacing-4);
1728
+ border: 1px solid var(--sparq-border);
1729
+ border-left: 3px solid var(--sparq-primary);
1730
+ border-radius: var(--sparq-radius-md);
1731
+ color: var(--sparq-text);
1732
+ background: var(--sparq-surface);
1733
+ box-shadow: var(--sparq-shadow-menu);
1734
+ pointer-events: auto;
1735
+ animation: sparq-toast-enter var(--sparq-motion-base) ease-out;
1736
+ }
1737
+
1738
+ .sparq-toast__timer {
1739
+ position: absolute;
1740
+ top: 0;
1741
+ right: 0;
1742
+ left: 0;
1743
+ height: 0.125rem;
1744
+ overflow: hidden;
1745
+ border-radius: var(--sparq-radius-md) var(--sparq-radius-md) 0 0;
1746
+ color: var(--sparq-primary);
1747
+ pointer-events: none;
1748
+ }
1749
+
1750
+ .sparq-toast__timer::after {
1751
+ display: block;
1752
+ width: 100%;
1753
+ height: 100%;
1754
+ border-radius: inherit;
1755
+ background: currentColor;
1756
+ content: "";
1757
+ transform-origin: left center;
1758
+ animation: sparq-toast-timer var(--sparq-toast-duration) linear forwards;
1759
+ }
1760
+
1761
+ .sparq-toast[data-sparq-toast-paused] .sparq-toast__timer::after {
1762
+ animation-play-state: paused;
1763
+ }
1764
+
1765
+ .sparq-toast--success {
1766
+ border-left-color: var(--sparq-success);
1767
+ }
1768
+
1769
+ .sparq-toast--success .sparq-toast__timer {
1770
+ color: var(--sparq-success);
1771
+ }
1772
+
1773
+ .sparq-toast--warning {
1774
+ border-left-color: var(--sparq-warning);
1775
+ }
1776
+
1777
+ .sparq-toast--warning .sparq-toast__timer {
1778
+ color: var(--sparq-warning);
1779
+ }
1780
+
1781
+ .sparq-toast--danger {
1782
+ border-left-color: var(--sparq-danger);
1783
+ }
1784
+
1785
+ .sparq-toast--danger .sparq-toast__timer {
1786
+ color: var(--sparq-danger);
1787
+ }
1788
+
1789
+ .sparq-toast__content {
1790
+ min-width: 0;
1791
+ }
1792
+
1793
+ .sparq-toast__title,
1794
+ .sparq-toast__message {
1795
+ margin: 0;
1796
+ }
1797
+
1798
+ .sparq-toast__title {
1799
+ color: var(--sparq-title);
1800
+ font-size: 0.875rem;
1801
+ font-weight: 600;
1802
+ }
1803
+
1804
+ .sparq-toast__message {
1805
+ margin-top: var(--sparq-spacing-1);
1806
+ overflow-wrap: anywhere;
1807
+ font-size: 0.8125rem;
1808
+ line-height: 1.5;
1809
+ }
1810
+
1811
+ .sparq-toast__actions {
1812
+ display: flex;
1813
+ grid-column: 1/-1;
1814
+ align-items: center;
1815
+ gap: var(--sparq-spacing-2);
1816
+ }
1817
+
1818
+ .sparq-toast__close {
1819
+ align-self: start;
1820
+ display: inline-grid;
1821
+ width: 2rem;
1822
+ min-height: 2rem;
1823
+ padding: 0;
1824
+ border: 0;
1825
+ border-radius: var(--sparq-radius-sm);
1826
+ color: var(--sparq-muted);
1827
+ background: transparent;
1828
+ font: inherit;
1829
+ font-size: 0.75rem;
1830
+ cursor: pointer;
1831
+ }
1832
+
1833
+ .sparq-toast__close > svg {
1834
+ width: var(--sparq-icon-size-sm);
1835
+ height: var(--sparq-icon-size-sm);
1836
+ margin: auto;
1837
+ }
1838
+
1839
+ .sparq-toast__close:hover,
1840
+ .sparq-toast__close:focus-visible {
1841
+ color: var(--sparq-title);
1842
+ background: var(--sparq-surface-subtle);
1843
+ outline: 0;
1844
+ }
1845
+
1846
+ .sparq-toast__close:focus-visible {
1847
+ box-shadow: var(--sparq-focus-ring);
1848
+ }
1849
+
1850
+ @keyframes sparq-toast-enter {
1851
+ from {
1852
+ opacity: 0;
1853
+ transform: translateY(-0.5rem);
1854
+ }
1855
+ }
1856
+ @keyframes sparq-toast-timer {
1857
+ from {
1858
+ transform: scaleX(1);
1859
+ }
1860
+ to {
1861
+ transform: scaleX(0);
1862
+ }
1863
+ }
1864
+ @media (max-width: 39.99rem) {
1865
+ .sparq-dropdown__item,
1866
+ .sparq-toast__close {
1867
+ min-height: var(--sparq-control-height);
1868
+ }
1869
+ .sparq-toast-region {
1870
+ top: var(--sparq-spacing-2);
1871
+ right: var(--sparq-spacing-2);
1872
+ width: calc(100vw - 1rem);
1873
+ }
1874
+ }
1875
+ @media (prefers-reduced-motion: reduce) {
1876
+ .sparq-toast {
1877
+ animation: none;
1878
+ }
1879
+ .sparq-toast__timer {
1880
+ display: none;
1881
+ }
1882
+ }
1883
+ .sparq-dialog {
1884
+ z-index: var(--sparq-z-dialog);
1885
+ width: min(32rem, 100% - 2rem);
1886
+ max-height: calc(100dvh - 3rem);
1887
+ padding: 0;
1888
+ overflow: hidden;
1889
+ border: 1px solid var(--sparq-border);
1890
+ border-radius: var(--sparq-radius-md);
1891
+ color: var(--sparq-text);
1892
+ background: var(--sparq-surface);
1893
+ box-shadow: var(--sparq-shadow-dialog);
1894
+ overscroll-behavior: contain;
1895
+ }
1896
+
1897
+ .sparq-dialog--sm {
1898
+ width: min(25rem, 100% - 2rem);
1899
+ }
1900
+
1901
+ .sparq-dialog--lg {
1902
+ width: min(42rem, 100% - 2rem);
1903
+ }
1904
+
1905
+ .sparq-dialog::backdrop {
1906
+ background: var(--sparq-overlay);
1907
+ backdrop-filter: blur(1px);
1908
+ }
1909
+
1910
+ .sparq-dialog__header,
1911
+ .sparq-dialog__footer {
1912
+ display: flex;
1913
+ align-items: center;
1914
+ gap: var(--sparq-spacing-3);
1915
+ padding: var(--sparq-spacing-4) var(--sparq-spacing-5);
1916
+ background: var(--sparq-surface);
1917
+ }
1918
+
1919
+ .sparq-dialog__header {
1920
+ position: sticky;
1921
+ top: 0;
1922
+ z-index: 1;
1923
+ justify-content: space-between;
1924
+ border-bottom: 1px solid var(--sparq-border);
1925
+ }
1926
+
1927
+ .sparq-dialog__header h2 {
1928
+ margin: 0;
1929
+ font-size: 1.125rem;
1930
+ }
1931
+
1932
+ .sparq-dialog__body {
1933
+ max-height: calc(100dvh - 10rem);
1934
+ padding: var(--sparq-spacing-5);
1935
+ overflow: auto;
1936
+ overflow-wrap: anywhere;
1937
+ }
1938
+
1939
+ .sparq-dialog__footer {
1940
+ justify-content: flex-end;
1941
+ border-top: 1px solid var(--sparq-border);
1942
+ }
1943
+
1944
+ .sparq-confirm__message {
1945
+ margin: 0;
1946
+ color: var(--sparq-text);
1947
+ }
1948
+
1949
+ @media (max-width: 39.99rem) {
1950
+ .sparq-dialog,
1951
+ .sparq-dialog--sm,
1952
+ .sparq-dialog--lg {
1953
+ width: calc(100% - 1rem);
1954
+ max-height: calc(100dvh - 1rem);
1955
+ }
1956
+ .sparq-dialog__header,
1957
+ .sparq-dialog__body,
1958
+ .sparq-dialog__footer {
1959
+ padding: var(--sparq-spacing-4);
1960
+ }
1961
+ }