@moodlehq/design-system 3.2.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css CHANGED
@@ -1,4 +1,119 @@
1
- @charset "UTF-8";.mds-activity-icon {
1
+ @charset "UTF-8";.mds-badge {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: 0;
5
+ padding: var(--mds-spacing-xxs) var(--mds-spacing-xs);
6
+ border-radius: var(--mds-border-radius-sm);
7
+
8
+ font-family: var(--mds-font-family-base);
9
+ font-weight: var(--mds-font-weight-medium);
10
+ font-size: var(--mds-font-size-paragraph-small);
11
+ line-height: var(--mds-line-height-paragraph-xs);
12
+ letter-spacing: var(--mds-letter-spacing-default);
13
+ white-space: nowrap;
14
+ vertical-align: baseline;
15
+ }
16
+
17
+ .mds-badge--has-icon {
18
+ gap: var(--mds-spacing-xxs);
19
+ }
20
+
21
+ /* Normalize icon dimensions to match the badge icon token across <i> and <svg> usage. */
22
+ .mds-badge > i,
23
+ .mds-badge > svg {
24
+ width: var(--mds-icons-xxs);
25
+ height: var(--mds-icons-xxs);
26
+ font-size: var(--mds-icons-xxs);
27
+ flex-shrink: 0;
28
+ }
29
+
30
+ /* Pill shape overrides the default rounded corners */
31
+ .mds-badge--pill {
32
+ border-radius: var(--mds-border-radius-pill);
33
+ }
34
+
35
+ /*
36
+ * Per-variant colour rules.
37
+ * Default contrast: solid coloured background with inverse text.
38
+ * Subtle contrast (.mds-badge--subtle): light tinted background, dark feedback text, visible border.
39
+ */
40
+
41
+ .mds-badge--subtle {
42
+ border: var(--mds-stroke-weight-sm) solid transparent;
43
+ }
44
+
45
+ /* --- Primary --- */
46
+ .mds-badge--primary {
47
+ background-color: var(--mds-bg-feedback-primary-default);
48
+ color: var(--mds-text-inverse);
49
+ }
50
+
51
+ .mds-badge--primary.mds-badge--subtle {
52
+ background-color: var(--mds-bg-feedback-primary-subtle);
53
+ color: var(--mds-text-feedback-primary);
54
+ border-color: var(--mds-border-feedback-primary);
55
+ }
56
+
57
+ /* --- Secondary --- */
58
+ .mds-badge--secondary {
59
+ background-color: var(--mds-bg-feedback-secondary-default);
60
+ color: var(--mds-text-feedback-secondary);
61
+ }
62
+
63
+ .mds-badge--secondary.mds-badge--subtle {
64
+ background-color: var(--mds-bg-feedback-secondary-subtle);
65
+ color: var(--mds-text-feedback-secondary);
66
+ border-color: var(--mds-border-feedback-secondary);
67
+ }
68
+
69
+ /* --- Success --- */
70
+ .mds-badge--success {
71
+ background-color: var(--mds-bg-feedback-success-default);
72
+ color: var(--mds-text-inverse);
73
+ }
74
+
75
+ .mds-badge--success.mds-badge--subtle {
76
+ background-color: var(--mds-bg-feedback-success-subtle);
77
+ color: var(--mds-text-feedback-success);
78
+ border-color: var(--mds-border-feedback-success);
79
+ }
80
+
81
+ /* --- Danger --- */
82
+ .mds-badge--danger {
83
+ background-color: var(--mds-bg-feedback-danger-default);
84
+ color: var(--mds-text-inverse);
85
+ }
86
+
87
+ .mds-badge--danger.mds-badge--subtle {
88
+ background-color: var(--mds-bg-feedback-danger-subtle);
89
+ color: var(--mds-text-feedback-danger);
90
+ border-color: var(--mds-border-feedback-danger);
91
+ }
92
+
93
+ /* --- Warning --- */
94
+ .mds-badge--warning {
95
+ background-color: var(--mds-bg-feedback-warning-default);
96
+ color: var(--mds-text-feedback-warning);
97
+ }
98
+
99
+ .mds-badge--warning.mds-badge--subtle {
100
+ background-color: var(--mds-bg-feedback-warning-subtle);
101
+ color: var(--mds-text-feedback-warning);
102
+ border-color: var(--mds-border-feedback-warning);
103
+ }
104
+
105
+ /* --- Info --- */
106
+ .mds-badge--info {
107
+ background-color: var(--mds-bg-feedback-info-default);
108
+ color: var(--mds-text-inverse);
109
+ }
110
+
111
+ .mds-badge--info.mds-badge--subtle {
112
+ background-color: var(--mds-bg-feedback-info-subtle);
113
+ color: var(--mds-text-feedback-info);
114
+ border-color: var(--mds-border-feedback-info);
115
+ }
116
+ .mds-activity-icon {
2
117
  align-items: center;
3
118
  /*
4
119
  * content-box so block-size/inline-size declare the ICON content area.
@@ -103,24 +218,219 @@
103
218
  inline-size: 100%;
104
219
  }
105
220
 
221
+ .mds-badge {
222
+ display: inline-flex;
223
+ align-items: center;
224
+ gap: 0;
225
+ padding: var(--mds-spacing-xxs) var(--mds-spacing-xs);
226
+ border-radius: var(--mds-border-radius-sm);
227
+
228
+ font-family: var(--mds-font-family-base);
229
+ font-weight: var(--mds-font-weight-medium);
230
+ font-size: var(--mds-font-size-paragraph-small);
231
+ line-height: var(--mds-line-height-paragraph-xs);
232
+ letter-spacing: var(--mds-letter-spacing-default);
233
+ white-space: nowrap;
234
+ vertical-align: baseline;
235
+ }
236
+
237
+ .mds-badge--has-icon {
238
+ gap: var(--mds-spacing-xxs);
239
+ }
240
+
241
+ /* Normalize icon dimensions to match the badge icon token across <i> and <svg> usage. */
242
+
243
+ .mds-badge > i,
244
+ .mds-badge > svg {
245
+ width: var(--mds-icons-xxs);
246
+ height: var(--mds-icons-xxs);
247
+ font-size: var(--mds-icons-xxs);
248
+ flex-shrink: 0;
249
+ }
250
+
251
+ /* Pill shape overrides the default rounded corners */
252
+
253
+ .mds-badge--pill {
254
+ border-radius: var(--mds-border-radius-pill);
255
+ }
256
+
257
+ /*
258
+ * Per-variant colour rules.
259
+ * Default contrast: solid coloured background with inverse text.
260
+ * Subtle contrast (.mds-badge--subtle): light tinted background, dark feedback text, visible border.
261
+ */
262
+
263
+ .mds-badge--subtle {
264
+ border: var(--mds-stroke-weight-sm) solid transparent;
265
+ }
266
+
267
+ /* --- Primary --- */
268
+
269
+ .mds-badge--primary {
270
+ background-color: var(--mds-bg-feedback-primary-default);
271
+ color: var(--mds-text-inverse);
272
+ }
273
+
274
+ .mds-badge--primary.mds-badge--subtle {
275
+ background-color: var(--mds-bg-feedback-primary-subtle);
276
+ color: var(--mds-text-feedback-primary);
277
+ border-color: var(--mds-border-feedback-primary);
278
+ }
279
+
280
+ /* --- Secondary --- */
281
+
282
+ .mds-badge--secondary {
283
+ background-color: var(--mds-bg-feedback-secondary-default);
284
+ color: var(--mds-text-feedback-secondary);
285
+ }
286
+
287
+ .mds-badge--secondary.mds-badge--subtle {
288
+ background-color: var(--mds-bg-feedback-secondary-subtle);
289
+ color: var(--mds-text-feedback-secondary);
290
+ border-color: var(--mds-border-feedback-secondary);
291
+ }
292
+
293
+ /* --- Success --- */
294
+
295
+ .mds-badge--success {
296
+ background-color: var(--mds-bg-feedback-success-default);
297
+ color: var(--mds-text-inverse);
298
+ }
299
+
300
+ .mds-badge--success.mds-badge--subtle {
301
+ background-color: var(--mds-bg-feedback-success-subtle);
302
+ color: var(--mds-text-feedback-success);
303
+ border-color: var(--mds-border-feedback-success);
304
+ }
305
+
306
+ /* --- Danger --- */
307
+
308
+ .mds-badge--danger {
309
+ background-color: var(--mds-bg-feedback-danger-default);
310
+ color: var(--mds-text-inverse);
311
+ }
312
+
313
+ .mds-badge--danger.mds-badge--subtle {
314
+ background-color: var(--mds-bg-feedback-danger-subtle);
315
+ color: var(--mds-text-feedback-danger);
316
+ border-color: var(--mds-border-feedback-danger);
317
+ }
318
+
319
+ /* --- Warning --- */
320
+
321
+ .mds-badge--warning {
322
+ background-color: var(--mds-bg-feedback-warning-default);
323
+ color: var(--mds-text-feedback-warning);
324
+ }
325
+
326
+ .mds-badge--warning.mds-badge--subtle {
327
+ background-color: var(--mds-bg-feedback-warning-subtle);
328
+ color: var(--mds-text-feedback-warning);
329
+ border-color: var(--mds-border-feedback-warning);
330
+ }
331
+
332
+ /* --- Info --- */
333
+
334
+ .mds-badge--info {
335
+ background-color: var(--mds-bg-feedback-info-default);
336
+ color: var(--mds-text-inverse);
337
+ }
338
+
339
+ .mds-badge--info.mds-badge--subtle {
340
+ background-color: var(--mds-bg-feedback-info-subtle);
341
+ color: var(--mds-text-feedback-info);
342
+ border-color: var(--mds-border-feedback-info);
343
+ }
344
+
106
345
  .mds-btn.btn {
107
346
  background-color: var(--mds-bg-interactive-primary-default);
108
- border: var(--mds-stroke-weight-sm) solid var(--mds-border-translucent);
109
- border-radius: var(--mds-border-radius-md);
347
+ border: none;
348
+ border-radius: var(--mds-border-radius-sm);
110
349
  padding: var(--mds-spacing-xs) var(--mds-spacing-sm);
111
350
 
112
351
  color: var(--mds-text-inverse);
113
352
  font-family: var(--mds-font-family-base);
114
353
  font-weight: var(--mds-font-weight-regular);
115
354
  font-size: var(--mds-font-size-paragraph-default);
116
- line-height: var(--mds-line-height-paragraph-small);
355
+ line-height: var(--mds-line-height-paragraph-xs);
117
356
  letter-spacing: var(--mds-letter-spacing-default);
118
357
 
119
- /* gap provides consistent spacing between startIcon/endIcon and label text;
120
- has no visual effect when the button contains only a single child (no icon) */
358
+ /* Keep icon/text spacing consistent with icon variants from the design matrix. */
121
359
  display: inline-flex;
122
360
  align-items: center;
123
- gap: var(--mds-spacing-xxs);
361
+ gap: var(--mds-spacing-xs);
362
+ }
363
+
364
+ /* Icon-only sizing in Figma is not derived from text button size classes. */
365
+
366
+ .mds-btn.btn.mds-btn--icon-only {
367
+ padding: var(--mds-spacing-xs);
368
+ border-radius: var(--mds-border-radius-xl);
369
+ }
370
+
371
+ .mds-btn.btn.mds-btn--icon-only i,
372
+ .mds-btn.btn.mds-btn--icon-only svg {
373
+ inline-size: var(--mds-icons-xs);
374
+ block-size: var(--mds-icons-xs);
375
+ font-size: var(--mds-icons-xs);
376
+ line-height: 1;
377
+ flex-shrink: 0;
378
+ }
379
+
380
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-sm {
381
+ padding: var(--mds-spacing-xxs);
382
+ }
383
+
384
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-sm i,
385
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-sm svg {
386
+ inline-size: var(--mds-icons-xxs);
387
+ block-size: var(--mds-icons-xxs);
388
+ font-size: var(--mds-icons-xxs);
389
+ }
390
+
391
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-lg {
392
+ padding: var(--mds-spacing-xs);
393
+ border-radius: var(--mds-border-radius-sm);
394
+ }
395
+
396
+ .mds-btn.btn.mds-btn--size-sm i,
397
+ .mds-btn.btn.mds-btn--size-sm svg {
398
+ inline-size: var(--mds-icons-xxs);
399
+ block-size: var(--mds-icons-xxs);
400
+ font-size: var(--mds-icons-xxs);
401
+ line-height: 1;
402
+ flex-shrink: 0;
403
+ }
404
+
405
+ .mds-btn.btn.mds-btn--size-md i,
406
+ .mds-btn.btn.mds-btn--size-md svg,
407
+ .mds-btn.btn.mds-btn--size-lg i,
408
+ .mds-btn.btn.mds-btn--size-lg svg {
409
+ inline-size: var(--mds-icons-xs);
410
+ block-size: var(--mds-icons-xs);
411
+ font-size: var(--mds-icons-xs);
412
+ line-height: 1;
413
+ flex-shrink: 0;
414
+ }
415
+
416
+ .mds-btn.btn:focus {
417
+ box-shadow: none;
418
+ outline: none;
419
+ }
420
+
421
+ .mds-btn.btn:focus-visible {
422
+ outline: var(--mds-stroke-weight-md) solid var(--mds-focus-default);
423
+ outline-offset: var(--mds-spacing-offset);
424
+ box-shadow: none;
425
+ }
426
+
427
+ .mds-btn.btn:active:focus-visible {
428
+ box-shadow: none;
429
+ }
430
+
431
+ .mds-btn.btn.btn-danger:focus-visible,
432
+ .mds-btn.btn.btn-outline-danger:focus-visible {
433
+ outline: var(--mds-stroke-weight-md) solid var(--mds-focus-danger);
124
434
  }
125
435
 
126
436
  .mds-btn.btn:hover {
@@ -129,7 +439,7 @@
129
439
 
130
440
  .mds-btn.btn:active {
131
441
  background-color: var(--mds-bg-interactive-primary-active);
132
- border: var(--mds-stroke-weight-sm) solid var(--mds-border-translucent);
442
+ box-shadow: none;
133
443
  }
134
444
 
135
445
  .mds-btn.btn:disabled {
@@ -142,7 +452,7 @@
142
452
 
143
453
  .mds-btn.btn.btn-secondary {
144
454
  background-color: var(--mds-bg-interactive-secondary-default);
145
- color: var(--mds-text-default);
455
+ color: var(--mds-text-subtle);
146
456
  }
147
457
 
148
458
  .mds-btn.btn.btn-secondary:hover {
@@ -155,6 +465,7 @@
155
465
 
156
466
  .mds-btn.btn.btn-secondary:disabled {
157
467
  background-color: var(--mds-bg-interactive-secondary-disabled);
468
+ color: var(--mds-text-muted);
158
469
  }
159
470
 
160
471
  /**
@@ -177,104 +488,374 @@
177
488
  background-color: var(--mds-bg-interactive-danger-disabled);
178
489
  }
179
490
 
491
+ /**
492
+ * Ghost variants
493
+ */
494
+
495
+ .mds-btn.btn.btn-ghost {
496
+ background-color: transparent;
497
+ color: var(--mds-text-subtle);
498
+ }
499
+
500
+ .mds-btn.btn.btn-ghost:hover {
501
+ background-color: var(--mds-bg-interactive-secondary-hover);
502
+ color: var(--mds-text-subtle);
503
+ }
504
+
505
+ .mds-btn.btn.btn-ghost:active {
506
+ background-color: var(--mds-bg-interactive-secondary-active);
507
+ color: var(--mds-text-subtle);
508
+ }
509
+
510
+ .mds-btn.btn.btn-ghost:disabled {
511
+ background-color: transparent;
512
+ color: var(--mds-text-muted);
513
+ }
514
+
180
515
  /**
181
516
  * Outline Primary variants
182
517
  */
183
518
 
184
- .mds-btn.btn-outline-primary {
519
+ .mds-btn.btn:is(
520
+ .btn-outline-primary,
521
+ .btn-outline-secondary,
522
+ .btn-outline-danger
523
+ ) {
185
524
  background-color: transparent;
186
- border: var(--mds-stroke-weight-sm) solid
187
- var(--mds-border-interactive-primary-default);
525
+ border: var(--mds-stroke-weight-sm) solid transparent;
526
+ }
527
+
528
+ .mds-btn.btn.btn-outline-primary {
529
+ border-color: var(--mds-border-interactive-primary-default);
188
530
  color: var(--mds-text-link-primary-default);
189
531
  }
190
532
 
191
533
  .mds-btn.btn-outline-primary:hover {
534
+ border-color: var(--mds-bg-interactive-primary-hover);
192
535
  background-color: var(--mds-bg-interactive-primary-hover);
193
536
  color: var(--mds-text-inverse);
194
537
  }
195
538
 
196
539
  .mds-btn.btn-outline-primary:active {
540
+ border-color: var(--mds-bg-interactive-primary-active);
197
541
  background-color: var(--mds-bg-interactive-primary-active);
198
542
  color: var(--mds-text-inverse);
199
543
  }
200
544
 
201
545
  .mds-btn.btn.btn-outline-primary:disabled {
202
- background-color: transparent;
203
- border: var(--mds-stroke-weight-sm) solid
204
- var(--mds-border-interactive-primary-disabled);
205
- color: var(--mds-color-blue-300);
546
+ border-color: var(--mds-border-interactive-primary-disabled);
547
+ color: var(--mds-text-link-primary-disabled);
206
548
  }
207
549
 
208
550
  /**
209
551
  * Outline Secondary variants
210
552
  */
211
553
 
212
- .mds-btn.btn-outline-secondary {
213
- background-color: transparent;
214
- border: var(--mds-stroke-weight-sm) solid
215
- var(--mds-border-interactive-secondary-default);
216
- color: var(--mds-text-muted);
554
+ .mds-btn.btn.btn-outline-secondary {
555
+ border-color: var(--mds-border-interactive-secondary-default);
556
+ color: var(--mds-text-subtle);
217
557
  }
218
558
 
219
559
  .mds-btn.btn-outline-secondary:hover {
560
+ border-color: var(--mds-border-interactive-secondary-hover);
220
561
  background-color: var(--mds-border-interactive-secondary-hover);
221
562
  color: var(--mds-text-inverse);
222
563
  }
223
564
 
224
565
  .mds-btn.btn-outline-secondary:active {
566
+ border-color: var(--mds-border-interactive-secondary-active);
225
567
  background-color: var(--mds-border-interactive-secondary-active);
226
568
  color: var(--mds-text-inverse);
227
569
  }
228
570
 
229
571
  .mds-btn.btn.btn-outline-secondary:disabled {
230
- background-color: transparent;
231
- border: var(--mds-stroke-weight-sm) solid
232
- var(--mds-border-interactive-secondary-disabled);
233
- color: var(--mds-color-gray-500);
572
+ border-color: var(--mds-border-interactive-secondary-disabled);
573
+ color: var(--mds-text-muted);
234
574
  }
235
575
 
236
576
  /**
237
577
  * Outline Danger variants
238
578
  */
239
579
 
240
- .mds-btn.btn-outline-danger {
241
- background-color: transparent;
242
- border: var(--mds-stroke-weight-sm) solid
243
- var(--mds-border-interactive-danger-default);
580
+ .mds-btn.btn.btn-outline-danger {
581
+ border-color: var(--mds-border-interactive-danger-default);
244
582
  color: var(--mds-text-danger);
245
583
  }
246
584
 
247
585
  .mds-btn.btn-outline-danger:hover {
248
- background-color: var(--mds-bg-interactive-danger-default);
586
+ border-color: var(--mds-bg-interactive-danger-hover);
587
+ background-color: var(--mds-bg-interactive-danger-hover);
249
588
  color: var(--mds-text-inverse);
250
589
  }
251
590
 
252
591
  .mds-btn.btn-outline-danger:active {
253
- background-color: var(--mds-bg-interactive-danger-hover);
592
+ border-color: var(--mds-bg-interactive-danger-active);
593
+ background-color: var(--mds-bg-interactive-danger-active);
254
594
  color: var(--mds-text-inverse);
255
595
  }
256
596
 
257
597
  .mds-btn.btn.btn-outline-danger:disabled {
258
- background-color: transparent;
259
- border: var(--mds-stroke-weight-sm) solid
260
- var(--mds-border-interactive-danger-disabled);
261
- color: var(--mds-color-red-300);
598
+ border-color: var(--mds-border-interactive-danger-disabled);
599
+ color: var(--mds-text-danger-disabled);
262
600
  }
263
601
 
264
602
  /**
265
603
  * Size variants
266
604
  */
267
605
 
268
- .mds-btn.btn-sm {
606
+ .mds-btn.mds-btn--size-sm {
269
607
  padding: var(--mds-spacing-xxs) var(--mds-spacing-xs);
608
+ border-radius: var(--mds-border-radius-xs);
609
+ font-weight: var(--mds-font-weight-medium);
610
+ font-size: var(--mds-font-size-paragraph-small);
611
+ }
612
+
613
+ .mds-btn.mds-btn--size-md {
614
+ padding: var(--mds-spacing-xs) var(--mds-spacing-sm);
615
+ font-size: var(--mds-font-size-paragraph-default);
616
+ }
617
+
618
+ .mds-btn.mds-btn--size-lg {
619
+ padding: var(--mds-spacing-sm) var(--mds-spacing-md);
620
+ font-size: var(--mds-font-size-paragraph-default);
621
+ }
622
+
623
+ /* Keep outer geometry aligned with filled variants when outline border is present. */
624
+
625
+ .mds-btn.mds-btn--size-sm:is(
626
+ .btn-outline-primary,
627
+ .btn-outline-secondary,
628
+ .btn-outline-danger
629
+ ) {
630
+ padding: calc(var(--mds-spacing-xxs) - var(--mds-stroke-weight-sm))
631
+ calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm));
632
+ }
633
+
634
+ .mds-btn.mds-btn--size-md:is(
635
+ .btn-outline-primary,
636
+ .btn-outline-secondary,
637
+ .btn-outline-danger
638
+ ) {
639
+ padding: calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm))
640
+ calc(var(--mds-spacing-sm) - var(--mds-stroke-weight-sm));
641
+ }
642
+
643
+ .mds-btn.mds-btn--size-lg:is(
644
+ .btn-outline-primary,
645
+ .btn-outline-secondary,
646
+ .btn-outline-danger
647
+ ) {
648
+ padding: calc(var(--mds-spacing-sm) - var(--mds-stroke-weight-sm))
649
+ calc(var(--mds-spacing-md) - var(--mds-stroke-weight-sm));
650
+ }
651
+
652
+ .mds-btn.mds-btn--icon-only:is(
653
+ .btn-outline-primary,
654
+ .btn-outline-secondary,
655
+ .btn-outline-danger
656
+ ) {
657
+ padding: calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm));
658
+ }
659
+
660
+ .mds-btn.mds-btn--icon-only.mds-btn--size-sm:is(
661
+ .btn-outline-primary,
662
+ .btn-outline-secondary,
663
+ .btn-outline-danger
664
+ ) {
665
+ padding: calc(var(--mds-spacing-xxs) - var(--mds-stroke-weight-sm));
666
+ }
667
+
668
+ .mds-btn.mds-btn--icon-only.mds-btn--size-lg:is(
669
+ .btn-outline-primary,
670
+ .btn-outline-secondary,
671
+ .btn-outline-danger
672
+ ) {
673
+ padding: calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm));
674
+ }
675
+
676
+ .mds-checkbox {
677
+ display: inline-grid;
678
+ grid-template-columns: auto auto;
679
+ align-items: center;
680
+ align-self: start;
681
+ min-height: var(--mds-icons-lg);
682
+ padding: var(--mds-spacing-none);
683
+ column-gap: var(--mds-spacing-xs);
684
+ row-gap: var(--mds-spacing-xxs);
685
+
686
+ font-family: var(--mds-font-family-base);
687
+ font-size: var(--mds-font-size-paragraph-default);
688
+ font-weight: var(--mds-font-weight-regular);
689
+ line-height: var(--mds-line-height-paragraph-xs);
690
+ letter-spacing: var(--mds-letter-spacing-default);
691
+ }
692
+
693
+ .mds-checkbox-input {
694
+ border-radius: var(--mds-border-radius-xs);
695
+ border: var(--mds-stroke-weight-sm) solid
696
+ var(--mds-border-interactive-secondary-default);
697
+ }
698
+
699
+ .mds-checkbox .mds-checkbox-input {
700
+ /* Bootstrap applies float/offset styles to .form-check-input for indented label layouts.
701
+ Match selector specificity and reset float/margins for the grid-based sibling layout. */
702
+ margin: 0;
703
+ float: none;
704
+ background-color: var(--mds-bg-surface-default);
705
+ }
706
+
707
+ .mds-checkbox-input:checked {
708
+ background-color: var(--mds-bg-interactive-primary-default);
709
+ border-color: transparent;
710
+ }
711
+
712
+ .mds-checkbox-input:indeterminate {
713
+ background-color: var(--mds-bg-interactive-primary-default);
714
+ border-color: transparent;
715
+ }
716
+
717
+ .mds-checkbox-input:disabled {
718
+ border-color: var(--mds-border-interactive-secondary-disabled);
719
+ }
720
+
721
+ .mds-checkbox-input:disabled:checked {
722
+ background-color: var(--mds-bg-interactive-primary-disabled);
723
+ border-color: transparent;
724
+ }
725
+
726
+ .mds-checkbox-input:disabled:indeterminate {
727
+ background-color: var(--mds-bg-interactive-primary-disabled);
728
+ border-color: transparent;
729
+ }
730
+
731
+ .mds-checkbox-input.is-invalid {
732
+ border-color: var(--mds-border-interactive-danger-default);
733
+ }
734
+
735
+ .mds-checkbox-input.is-invalid:checked {
736
+ background-color: var(--mds-bg-interactive-danger-default);
737
+ border-color: transparent;
738
+ }
739
+
740
+ .mds-checkbox-input.is-invalid:indeterminate {
741
+ background-color: var(--mds-bg-interactive-danger-default);
742
+ border-color: transparent;
743
+ }
744
+
745
+ .mds-checkbox-input.is-invalid:disabled {
746
+ background-color: var(--mds-bg-interactive-secondary-disabled);
747
+ border-color: var(--mds-border-interactive-secondary-disabled);
748
+ }
749
+
750
+ .mds-checkbox-input.is-invalid:disabled:checked {
751
+ background-color: var(--mds-bg-interactive-primary-disabled);
752
+ border-color: transparent;
753
+ }
754
+
755
+ .mds-checkbox-input.is-invalid:disabled:indeterminate {
756
+ background-color: var(--mds-bg-interactive-primary-disabled);
757
+ border-color: transparent;
758
+ }
759
+
760
+ .mds-checkbox-input:focus,
761
+ .mds-checkbox-input.is-invalid:focus {
762
+ /* Reset Bootstrap's :focus box-shadow; our ring is applied on :focus-visible only */
763
+ box-shadow: none;
764
+ outline: none;
765
+ }
766
+
767
+ /* Bootstrap also sets border-color on :focus. Restore the correct border for each state,
768
+ excluding checked/indeterminate which keep their transparent border. */
769
+
770
+ .mds-checkbox-input:focus:not(:checked):not(:indeterminate) {
771
+ border-color: var(--mds-border-interactive-secondary-default);
772
+ }
773
+
774
+ .mds-checkbox-input.is-invalid:focus:not(:checked):not(:indeterminate) {
775
+ border-color: var(--mds-border-interactive-danger-default);
776
+ }
777
+
778
+ .mds-checkbox-input:focus-visible {
779
+ outline: var(--mds-stroke-weight-md) solid var(--mds-focus-default);
780
+ outline-offset: var(--mds-spacing-offset);
781
+ box-shadow: none;
782
+ }
783
+
784
+ .mds-checkbox-input.is-invalid:focus-visible {
785
+ outline: var(--mds-stroke-weight-md) solid var(--mds-border-feedback-danger);
786
+ outline-offset: var(--mds-spacing-offset);
787
+ box-shadow: none;
788
+ }
789
+
790
+ .mds-checkbox .form-check-label,
791
+ .mds-checkbox .mds-checkbox-label {
792
+ display: flex;
793
+ align-items: center;
794
+ /* In the radio-style sibling layout, the checkbox should align to the label text line,
795
+ not to an expanded label hit area. Keep the label box tight and let htmlFor preserve click behavior. */
796
+ padding: 0;
797
+ color: var(--mds-text-default);
798
+ }
799
+
800
+ .mds-checkbox .mds-checkbox-label-text {
801
+ min-width: 0;
802
+ }
803
+
804
+ .mds-checkbox .mds-checkbox-input:disabled ~ .form-check-label,
805
+ .mds-checkbox .mds-checkbox-input:disabled ~ .mds-checkbox-label {
806
+ color: var(--mds-text-muted);
807
+ }
808
+
809
+ .mds-checkbox .mds-checkbox-input.is-invalid ~ .form-check-label,
810
+ .mds-checkbox .mds-checkbox-input.is-invalid ~ .mds-checkbox-label {
811
+ color: var(--mds-text-danger);
812
+ }
813
+
814
+ /* Disabled takes precedence over invalid — restore muted colour when both are active. */
815
+
816
+ .mds-checkbox .mds-checkbox-input.is-invalid:disabled ~ .form-check-label,
817
+ .mds-checkbox .mds-checkbox-input.is-invalid:disabled ~ .mds-checkbox-label {
818
+ color: var(--mds-text-muted);
819
+ }
820
+
821
+ .mds-checkbox-required {
822
+ color: var(--mds-text-danger);
823
+ margin-inline-start: var(--mds-spacing-xxs);
824
+ }
825
+
826
+ .mds-checkbox .invalid-feedback,
827
+ .mds-checkbox .mds-checkbox-feedback {
828
+ grid-column: 2;
270
829
  font-size: var(--mds-font-size-paragraph-small);
271
- line-height: var(--mds-line-height-paragraph-small);
830
+ font-weight: var(--mds-font-weight-medium);
831
+ line-height: var(--mds-line-height-paragraph-xs);
832
+ }
833
+
834
+ .mds-checkbox .invalid-feedback,
835
+ .mds-checkbox .mds-checkbox-feedback.mds-checkbox-supporting-text {
836
+ margin: 0;
272
837
  }
273
838
 
274
- .mds-btn.btn-lg {
275
- padding: var(--mds-spacing-xs) var(--mds-spacing-md);
276
- font-size: var(--mds-font-size-paragraph-lead);
277
- line-height: var(--mds-line-height-paragraph-default);
839
+ .mds-checkbox .invalid-feedback {
840
+ color: var(--mds-text-danger);
841
+ }
842
+
843
+ /* In the default state supporting text is subtle. In the invalid state use danger to match
844
+ the label colour \u2014 matching Figma where the label container sets the colour for both. */
845
+
846
+ .mds-checkbox .mds-checkbox-feedback.mds-checkbox-supporting-text {
847
+ color: var(--mds-text-subtle);
848
+ }
849
+
850
+ .mds-checkbox
851
+ .mds-checkbox-input.is-invalid
852
+ ~ .mds-checkbox-feedback.mds-checkbox-supporting-text {
853
+ color: var(--mds-text-danger);
854
+ }
855
+
856
+ .mds-checkbox .mds-checkbox-input:disabled ~ .invalid-feedback,
857
+ .mds-checkbox .mds-checkbox-input:disabled ~ .mds-checkbox-feedback {
858
+ opacity: 0.5;
278
859
  }
279
860
 
280
861
  .mds-close-button.btn-close {
@@ -353,7 +934,7 @@
353
934
  font-family: var(--mds-font-family-base, Arial, sans-serif);
354
935
  font-size: var(--mds-font-size-body, 1rem);
355
936
  font-weight: var(--mds-font-weight-regular, 400);
356
- line-height: var(--mds-line-height-paragraph-small, 1.0875rem); /* 108.75% */
937
+ line-height: var(--mds-line-height-paragraph-xs, 0.75rem);
357
938
  letter-spacing: var(--mds-letter-spacing, 0);
358
939
  }
359
940
 
@@ -448,7 +1029,6 @@
448
1029
  .mds-form-check .form-check-label,
449
1030
  .mds-form-check .mds-form-check-label {
450
1031
  color: var(--mds-text-default, #1d2125);
451
- cursor: pointer;
452
1032
  }
453
1033
 
454
1034
  /* Use sibling selector so the label reflects the input's disabled/invalid state */
@@ -456,8 +1036,6 @@
456
1036
  .mds-form-check .mds-form-check-input:disabled ~ .form-check-label,
457
1037
  .mds-form-check .mds-form-check-input:disabled ~ .mds-form-check-label {
458
1038
  color: var(--mds-text-muted);
459
- /* Disabled inputs are not interactive — suppress the pointer cursor on the label */
460
- cursor: default;
461
1039
  }
462
1040
 
463
1041
  .mds-form-check .mds-form-check-input.is-invalid ~ .form-check-label,
@@ -474,6 +1052,7 @@
474
1052
  grid-column: 2;
475
1053
  font-size: var(--mds-font-size-paragraph-small, 0.875rem);
476
1054
  font-weight: var(--mds-font-weight-medium, 500);
1055
+ line-height: var(--mds-line-height-paragraph-xs, 0.75rem);
477
1056
  color: var(--mds-text-danger);
478
1057
  }
479
1058
 
@@ -547,7 +1126,7 @@
547
1126
  --mds-activity-icon-resource-icon: var(--mds-color-cyan-500);
548
1127
  --mds-bg-feedback-danger-light: var(--mds-color-red-50);
549
1128
  --mds-bg-feedback-danger-subtle: var(--mds-color-red-100);
550
- --mds-bg-feedback-info-default: var(--mds-color-cyan-500);
1129
+ --mds-bg-feedback-info-default: var(--mds-color-cyan-600);
551
1130
  --mds-bg-feedback-info-light: var(--mds-color-cyan-50);
552
1131
  --mds-bg-feedback-info-subtle: var(--mds-color-cyan-100);
553
1132
  --mds-bg-feedback-primary-default: var(--mds-color-blue-500);