@moodlehq/design-system 3.2.0 → 4.1.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
@@ -103,24 +103,219 @@
103
103
  inline-size: 100%;
104
104
  }
105
105
 
106
+ .mds-badge {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ gap: 0;
110
+ padding: var(--mds-spacing-xxs) var(--mds-spacing-xs);
111
+ border-radius: var(--mds-border-radius-sm);
112
+
113
+ font-family: var(--mds-font-family-base);
114
+ font-weight: var(--mds-font-weight-medium);
115
+ font-size: var(--mds-font-size-paragraph-small);
116
+ line-height: var(--mds-line-height-paragraph-xs);
117
+ letter-spacing: var(--mds-letter-spacing-default);
118
+ white-space: nowrap;
119
+ vertical-align: baseline;
120
+ }
121
+
122
+ .mds-badge--has-icon {
123
+ gap: var(--mds-spacing-xxs);
124
+ }
125
+
126
+ /* Normalize icon dimensions to match the badge icon token across <i> and <svg> usage. */
127
+
128
+ .mds-badge > i,
129
+ .mds-badge > svg {
130
+ width: var(--mds-icons-xxs);
131
+ height: var(--mds-icons-xxs);
132
+ font-size: var(--mds-icons-xxs);
133
+ flex-shrink: 0;
134
+ }
135
+
136
+ /* Pill shape overrides the default rounded corners */
137
+
138
+ .mds-badge--pill {
139
+ border-radius: var(--mds-border-radius-pill);
140
+ }
141
+
142
+ /*
143
+ * Per-variant colour rules.
144
+ * Default contrast: solid coloured background with inverse text.
145
+ * Subtle contrast (.mds-badge--subtle): light tinted background, dark feedback text, visible border.
146
+ */
147
+
148
+ .mds-badge--subtle {
149
+ border: var(--mds-stroke-weight-sm) solid transparent;
150
+ }
151
+
152
+ /* --- Primary --- */
153
+
154
+ .mds-badge--primary {
155
+ background-color: var(--mds-bg-feedback-primary-default);
156
+ color: var(--mds-text-inverse);
157
+ }
158
+
159
+ .mds-badge--primary.mds-badge--subtle {
160
+ background-color: var(--mds-bg-feedback-primary-subtle);
161
+ color: var(--mds-text-feedback-primary);
162
+ border-color: var(--mds-border-feedback-primary);
163
+ }
164
+
165
+ /* --- Secondary --- */
166
+
167
+ .mds-badge--secondary {
168
+ background-color: var(--mds-bg-feedback-secondary-default);
169
+ color: var(--mds-text-feedback-secondary);
170
+ }
171
+
172
+ .mds-badge--secondary.mds-badge--subtle {
173
+ background-color: var(--mds-bg-feedback-secondary-subtle);
174
+ color: var(--mds-text-feedback-secondary);
175
+ border-color: var(--mds-border-feedback-secondary);
176
+ }
177
+
178
+ /* --- Success --- */
179
+
180
+ .mds-badge--success {
181
+ background-color: var(--mds-bg-feedback-success-default);
182
+ color: var(--mds-text-inverse);
183
+ }
184
+
185
+ .mds-badge--success.mds-badge--subtle {
186
+ background-color: var(--mds-bg-feedback-success-subtle);
187
+ color: var(--mds-text-feedback-success);
188
+ border-color: var(--mds-border-feedback-success);
189
+ }
190
+
191
+ /* --- Danger --- */
192
+
193
+ .mds-badge--danger {
194
+ background-color: var(--mds-bg-feedback-danger-default);
195
+ color: var(--mds-text-inverse);
196
+ }
197
+
198
+ .mds-badge--danger.mds-badge--subtle {
199
+ background-color: var(--mds-bg-feedback-danger-subtle);
200
+ color: var(--mds-text-feedback-danger);
201
+ border-color: var(--mds-border-feedback-danger);
202
+ }
203
+
204
+ /* --- Warning --- */
205
+
206
+ .mds-badge--warning {
207
+ background-color: var(--mds-bg-feedback-warning-default);
208
+ color: var(--mds-text-feedback-warning);
209
+ }
210
+
211
+ .mds-badge--warning.mds-badge--subtle {
212
+ background-color: var(--mds-bg-feedback-warning-subtle);
213
+ color: var(--mds-text-feedback-warning);
214
+ border-color: var(--mds-border-feedback-warning);
215
+ }
216
+
217
+ /* --- Info --- */
218
+
219
+ .mds-badge--info {
220
+ background-color: var(--mds-bg-feedback-info-default);
221
+ color: var(--mds-text-inverse);
222
+ }
223
+
224
+ .mds-badge--info.mds-badge--subtle {
225
+ background-color: var(--mds-bg-feedback-info-subtle);
226
+ color: var(--mds-text-feedback-info);
227
+ border-color: var(--mds-border-feedback-info);
228
+ }
229
+
106
230
  .mds-btn.btn {
107
231
  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);
232
+ border: none;
233
+ border-radius: var(--mds-border-radius-sm);
110
234
  padding: var(--mds-spacing-xs) var(--mds-spacing-sm);
111
235
 
112
236
  color: var(--mds-text-inverse);
113
237
  font-family: var(--mds-font-family-base);
114
238
  font-weight: var(--mds-font-weight-regular);
115
239
  font-size: var(--mds-font-size-paragraph-default);
116
- line-height: var(--mds-line-height-paragraph-small);
240
+ line-height: var(--mds-line-height-paragraph-xs);
117
241
  letter-spacing: var(--mds-letter-spacing-default);
118
242
 
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) */
243
+ /* Keep icon/text spacing consistent with icon variants from the design matrix. */
121
244
  display: inline-flex;
122
245
  align-items: center;
123
- gap: var(--mds-spacing-xxs);
246
+ gap: var(--mds-spacing-xs);
247
+ }
248
+
249
+ /* Icon-only sizing in Figma is not derived from text button size classes. */
250
+
251
+ .mds-btn.btn.mds-btn--icon-only {
252
+ padding: var(--mds-spacing-xs);
253
+ border-radius: var(--mds-border-radius-xl);
254
+ }
255
+
256
+ .mds-btn.btn.mds-btn--icon-only i,
257
+ .mds-btn.btn.mds-btn--icon-only svg {
258
+ inline-size: var(--mds-icons-xs);
259
+ block-size: var(--mds-icons-xs);
260
+ font-size: var(--mds-icons-xs);
261
+ line-height: 1;
262
+ flex-shrink: 0;
263
+ }
264
+
265
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-sm {
266
+ padding: var(--mds-spacing-xxs);
267
+ }
268
+
269
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-sm i,
270
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-sm svg {
271
+ inline-size: var(--mds-icons-xxs);
272
+ block-size: var(--mds-icons-xxs);
273
+ font-size: var(--mds-icons-xxs);
274
+ }
275
+
276
+ .mds-btn.btn.mds-btn--icon-only.mds-btn--size-lg {
277
+ padding: var(--mds-spacing-xs);
278
+ border-radius: var(--mds-border-radius-sm);
279
+ }
280
+
281
+ .mds-btn.btn.mds-btn--size-sm i,
282
+ .mds-btn.btn.mds-btn--size-sm svg {
283
+ inline-size: var(--mds-icons-xxs);
284
+ block-size: var(--mds-icons-xxs);
285
+ font-size: var(--mds-icons-xxs);
286
+ line-height: 1;
287
+ flex-shrink: 0;
288
+ }
289
+
290
+ .mds-btn.btn.mds-btn--size-md i,
291
+ .mds-btn.btn.mds-btn--size-md svg,
292
+ .mds-btn.btn.mds-btn--size-lg i,
293
+ .mds-btn.btn.mds-btn--size-lg svg {
294
+ inline-size: var(--mds-icons-xs);
295
+ block-size: var(--mds-icons-xs);
296
+ font-size: var(--mds-icons-xs);
297
+ line-height: 1;
298
+ flex-shrink: 0;
299
+ }
300
+
301
+ .mds-btn.btn:focus {
302
+ box-shadow: none;
303
+ outline: none;
304
+ }
305
+
306
+ .mds-btn.btn:focus-visible {
307
+ outline: var(--mds-stroke-weight-md) solid var(--mds-focus-default);
308
+ outline-offset: var(--mds-spacing-offset);
309
+ box-shadow: none;
310
+ }
311
+
312
+ .mds-btn.btn:active:focus-visible {
313
+ box-shadow: none;
314
+ }
315
+
316
+ .mds-btn.btn.btn-danger:focus-visible,
317
+ .mds-btn.btn.btn-outline-danger:focus-visible {
318
+ outline: var(--mds-stroke-weight-md) solid var(--mds-focus-danger);
124
319
  }
125
320
 
126
321
  .mds-btn.btn:hover {
@@ -129,7 +324,7 @@
129
324
 
130
325
  .mds-btn.btn:active {
131
326
  background-color: var(--mds-bg-interactive-primary-active);
132
- border: var(--mds-stroke-weight-sm) solid var(--mds-border-translucent);
327
+ box-shadow: none;
133
328
  }
134
329
 
135
330
  .mds-btn.btn:disabled {
@@ -142,7 +337,7 @@
142
337
 
143
338
  .mds-btn.btn.btn-secondary {
144
339
  background-color: var(--mds-bg-interactive-secondary-default);
145
- color: var(--mds-text-default);
340
+ color: var(--mds-text-subtle);
146
341
  }
147
342
 
148
343
  .mds-btn.btn.btn-secondary:hover {
@@ -155,6 +350,7 @@
155
350
 
156
351
  .mds-btn.btn.btn-secondary:disabled {
157
352
  background-color: var(--mds-bg-interactive-secondary-disabled);
353
+ color: var(--mds-text-muted);
158
354
  }
159
355
 
160
356
  /**
@@ -177,104 +373,374 @@
177
373
  background-color: var(--mds-bg-interactive-danger-disabled);
178
374
  }
179
375
 
376
+ /**
377
+ * Ghost variants
378
+ */
379
+
380
+ .mds-btn.btn.btn-ghost {
381
+ background-color: transparent;
382
+ color: var(--mds-text-subtle);
383
+ }
384
+
385
+ .mds-btn.btn.btn-ghost:hover {
386
+ background-color: var(--mds-bg-interactive-secondary-hover);
387
+ color: var(--mds-text-subtle);
388
+ }
389
+
390
+ .mds-btn.btn.btn-ghost:active {
391
+ background-color: var(--mds-bg-interactive-secondary-active);
392
+ color: var(--mds-text-subtle);
393
+ }
394
+
395
+ .mds-btn.btn.btn-ghost:disabled {
396
+ background-color: transparent;
397
+ color: var(--mds-text-muted);
398
+ }
399
+
180
400
  /**
181
401
  * Outline Primary variants
182
402
  */
183
403
 
184
- .mds-btn.btn-outline-primary {
404
+ .mds-btn.btn:is(
405
+ .btn-outline-primary,
406
+ .btn-outline-secondary,
407
+ .btn-outline-danger
408
+ ) {
185
409
  background-color: transparent;
186
- border: var(--mds-stroke-weight-sm) solid
187
- var(--mds-border-interactive-primary-default);
410
+ border: var(--mds-stroke-weight-sm) solid transparent;
411
+ }
412
+
413
+ .mds-btn.btn.btn-outline-primary {
414
+ border-color: var(--mds-border-interactive-primary-default);
188
415
  color: var(--mds-text-link-primary-default);
189
416
  }
190
417
 
191
418
  .mds-btn.btn-outline-primary:hover {
419
+ border-color: var(--mds-bg-interactive-primary-hover);
192
420
  background-color: var(--mds-bg-interactive-primary-hover);
193
421
  color: var(--mds-text-inverse);
194
422
  }
195
423
 
196
424
  .mds-btn.btn-outline-primary:active {
425
+ border-color: var(--mds-bg-interactive-primary-active);
197
426
  background-color: var(--mds-bg-interactive-primary-active);
198
427
  color: var(--mds-text-inverse);
199
428
  }
200
429
 
201
430
  .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);
431
+ border-color: var(--mds-border-interactive-primary-disabled);
432
+ color: var(--mds-text-link-primary-disabled);
206
433
  }
207
434
 
208
435
  /**
209
436
  * Outline Secondary variants
210
437
  */
211
438
 
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);
439
+ .mds-btn.btn.btn-outline-secondary {
440
+ border-color: var(--mds-border-interactive-secondary-default);
441
+ color: var(--mds-text-subtle);
217
442
  }
218
443
 
219
444
  .mds-btn.btn-outline-secondary:hover {
445
+ border-color: var(--mds-border-interactive-secondary-hover);
220
446
  background-color: var(--mds-border-interactive-secondary-hover);
221
447
  color: var(--mds-text-inverse);
222
448
  }
223
449
 
224
450
  .mds-btn.btn-outline-secondary:active {
451
+ border-color: var(--mds-border-interactive-secondary-active);
225
452
  background-color: var(--mds-border-interactive-secondary-active);
226
453
  color: var(--mds-text-inverse);
227
454
  }
228
455
 
229
456
  .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);
457
+ border-color: var(--mds-border-interactive-secondary-disabled);
458
+ color: var(--mds-text-muted);
234
459
  }
235
460
 
236
461
  /**
237
462
  * Outline Danger variants
238
463
  */
239
464
 
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);
465
+ .mds-btn.btn.btn-outline-danger {
466
+ border-color: var(--mds-border-interactive-danger-default);
244
467
  color: var(--mds-text-danger);
245
468
  }
246
469
 
247
470
  .mds-btn.btn-outline-danger:hover {
248
- background-color: var(--mds-bg-interactive-danger-default);
471
+ border-color: var(--mds-bg-interactive-danger-hover);
472
+ background-color: var(--mds-bg-interactive-danger-hover);
249
473
  color: var(--mds-text-inverse);
250
474
  }
251
475
 
252
476
  .mds-btn.btn-outline-danger:active {
253
- background-color: var(--mds-bg-interactive-danger-hover);
477
+ border-color: var(--mds-bg-interactive-danger-active);
478
+ background-color: var(--mds-bg-interactive-danger-active);
254
479
  color: var(--mds-text-inverse);
255
480
  }
256
481
 
257
482
  .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);
483
+ border-color: var(--mds-border-interactive-danger-disabled);
484
+ color: var(--mds-text-danger-disabled);
262
485
  }
263
486
 
264
487
  /**
265
488
  * Size variants
266
489
  */
267
490
 
268
- .mds-btn.btn-sm {
491
+ .mds-btn.mds-btn--size-sm {
269
492
  padding: var(--mds-spacing-xxs) var(--mds-spacing-xs);
493
+ border-radius: var(--mds-border-radius-xs);
494
+ font-weight: var(--mds-font-weight-medium);
495
+ font-size: var(--mds-font-size-paragraph-small);
496
+ }
497
+
498
+ .mds-btn.mds-btn--size-md {
499
+ padding: var(--mds-spacing-xs) var(--mds-spacing-sm);
500
+ font-size: var(--mds-font-size-paragraph-default);
501
+ }
502
+
503
+ .mds-btn.mds-btn--size-lg {
504
+ padding: var(--mds-spacing-sm) var(--mds-spacing-md);
505
+ font-size: var(--mds-font-size-paragraph-default);
506
+ }
507
+
508
+ /* Keep outer geometry aligned with filled variants when outline border is present. */
509
+
510
+ .mds-btn.mds-btn--size-sm:is(
511
+ .btn-outline-primary,
512
+ .btn-outline-secondary,
513
+ .btn-outline-danger
514
+ ) {
515
+ padding: calc(var(--mds-spacing-xxs) - var(--mds-stroke-weight-sm))
516
+ calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm));
517
+ }
518
+
519
+ .mds-btn.mds-btn--size-md:is(
520
+ .btn-outline-primary,
521
+ .btn-outline-secondary,
522
+ .btn-outline-danger
523
+ ) {
524
+ padding: calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm))
525
+ calc(var(--mds-spacing-sm) - var(--mds-stroke-weight-sm));
526
+ }
527
+
528
+ .mds-btn.mds-btn--size-lg:is(
529
+ .btn-outline-primary,
530
+ .btn-outline-secondary,
531
+ .btn-outline-danger
532
+ ) {
533
+ padding: calc(var(--mds-spacing-sm) - var(--mds-stroke-weight-sm))
534
+ calc(var(--mds-spacing-md) - var(--mds-stroke-weight-sm));
535
+ }
536
+
537
+ .mds-btn.mds-btn--icon-only:is(
538
+ .btn-outline-primary,
539
+ .btn-outline-secondary,
540
+ .btn-outline-danger
541
+ ) {
542
+ padding: calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm));
543
+ }
544
+
545
+ .mds-btn.mds-btn--icon-only.mds-btn--size-sm:is(
546
+ .btn-outline-primary,
547
+ .btn-outline-secondary,
548
+ .btn-outline-danger
549
+ ) {
550
+ padding: calc(var(--mds-spacing-xxs) - var(--mds-stroke-weight-sm));
551
+ }
552
+
553
+ .mds-btn.mds-btn--icon-only.mds-btn--size-lg:is(
554
+ .btn-outline-primary,
555
+ .btn-outline-secondary,
556
+ .btn-outline-danger
557
+ ) {
558
+ padding: calc(var(--mds-spacing-xs) - var(--mds-stroke-weight-sm));
559
+ }
560
+
561
+ .mds-checkbox {
562
+ display: inline-grid;
563
+ grid-template-columns: auto auto;
564
+ align-items: center;
565
+ align-self: start;
566
+ min-height: var(--mds-icons-lg);
567
+ padding: var(--mds-spacing-none);
568
+ column-gap: var(--mds-spacing-xs);
569
+ row-gap: var(--mds-spacing-xxs);
570
+
571
+ font-family: var(--mds-font-family-base);
572
+ font-size: var(--mds-font-size-paragraph-default);
573
+ font-weight: var(--mds-font-weight-regular);
574
+ line-height: var(--mds-line-height-paragraph-xs);
575
+ letter-spacing: var(--mds-letter-spacing-default);
576
+ }
577
+
578
+ .mds-checkbox-input {
579
+ border-radius: var(--mds-border-radius-xs);
580
+ border: var(--mds-stroke-weight-sm) solid
581
+ var(--mds-border-interactive-secondary-default);
582
+ }
583
+
584
+ .mds-checkbox .mds-checkbox-input {
585
+ /* Bootstrap applies float/offset styles to .form-check-input for indented label layouts.
586
+ Match selector specificity and reset float/margins for the grid-based sibling layout. */
587
+ margin: 0;
588
+ float: none;
589
+ background-color: var(--mds-bg-surface-default);
590
+ }
591
+
592
+ .mds-checkbox-input:checked {
593
+ background-color: var(--mds-bg-interactive-primary-default);
594
+ border-color: transparent;
595
+ }
596
+
597
+ .mds-checkbox-input:indeterminate {
598
+ background-color: var(--mds-bg-interactive-primary-default);
599
+ border-color: transparent;
600
+ }
601
+
602
+ .mds-checkbox-input:disabled {
603
+ border-color: var(--mds-border-interactive-secondary-disabled);
604
+ }
605
+
606
+ .mds-checkbox-input:disabled:checked {
607
+ background-color: var(--mds-bg-interactive-primary-disabled);
608
+ border-color: transparent;
609
+ }
610
+
611
+ .mds-checkbox-input:disabled:indeterminate {
612
+ background-color: var(--mds-bg-interactive-primary-disabled);
613
+ border-color: transparent;
614
+ }
615
+
616
+ .mds-checkbox-input.is-invalid {
617
+ border-color: var(--mds-border-interactive-danger-default);
618
+ }
619
+
620
+ .mds-checkbox-input.is-invalid:checked {
621
+ background-color: var(--mds-bg-interactive-danger-default);
622
+ border-color: transparent;
623
+ }
624
+
625
+ .mds-checkbox-input.is-invalid:indeterminate {
626
+ background-color: var(--mds-bg-interactive-danger-default);
627
+ border-color: transparent;
628
+ }
629
+
630
+ .mds-checkbox-input.is-invalid:disabled {
631
+ background-color: var(--mds-bg-interactive-secondary-disabled);
632
+ border-color: var(--mds-border-interactive-secondary-disabled);
633
+ }
634
+
635
+ .mds-checkbox-input.is-invalid:disabled:checked {
636
+ background-color: var(--mds-bg-interactive-primary-disabled);
637
+ border-color: transparent;
638
+ }
639
+
640
+ .mds-checkbox-input.is-invalid:disabled:indeterminate {
641
+ background-color: var(--mds-bg-interactive-primary-disabled);
642
+ border-color: transparent;
643
+ }
644
+
645
+ .mds-checkbox-input:focus,
646
+ .mds-checkbox-input.is-invalid:focus {
647
+ /* Reset Bootstrap's :focus box-shadow; our ring is applied on :focus-visible only */
648
+ box-shadow: none;
649
+ outline: none;
650
+ }
651
+
652
+ /* Bootstrap also sets border-color on :focus. Restore the correct border for each state,
653
+ excluding checked/indeterminate which keep their transparent border. */
654
+
655
+ .mds-checkbox-input:focus:not(:checked):not(:indeterminate) {
656
+ border-color: var(--mds-border-interactive-secondary-default);
657
+ }
658
+
659
+ .mds-checkbox-input.is-invalid:focus:not(:checked):not(:indeterminate) {
660
+ border-color: var(--mds-border-interactive-danger-default);
661
+ }
662
+
663
+ .mds-checkbox-input:focus-visible {
664
+ outline: var(--mds-stroke-weight-md) solid var(--mds-focus-default);
665
+ outline-offset: var(--mds-spacing-offset);
666
+ box-shadow: none;
667
+ }
668
+
669
+ .mds-checkbox-input.is-invalid:focus-visible {
670
+ outline: var(--mds-stroke-weight-md) solid var(--mds-border-feedback-danger);
671
+ outline-offset: var(--mds-spacing-offset);
672
+ box-shadow: none;
673
+ }
674
+
675
+ .mds-checkbox .form-check-label,
676
+ .mds-checkbox .mds-checkbox-label {
677
+ display: flex;
678
+ align-items: center;
679
+ /* In the radio-style sibling layout, the checkbox should align to the label text line,
680
+ not to an expanded label hit area. Keep the label box tight and let htmlFor preserve click behavior. */
681
+ padding: 0;
682
+ color: var(--mds-text-default);
683
+ }
684
+
685
+ .mds-checkbox .mds-checkbox-label-text {
686
+ min-width: 0;
687
+ }
688
+
689
+ .mds-checkbox .mds-checkbox-input:disabled ~ .form-check-label,
690
+ .mds-checkbox .mds-checkbox-input:disabled ~ .mds-checkbox-label {
691
+ color: var(--mds-text-muted);
692
+ }
693
+
694
+ .mds-checkbox .mds-checkbox-input.is-invalid ~ .form-check-label,
695
+ .mds-checkbox .mds-checkbox-input.is-invalid ~ .mds-checkbox-label {
696
+ color: var(--mds-text-danger);
697
+ }
698
+
699
+ /* Disabled takes precedence over invalid — restore muted colour when both are active. */
700
+
701
+ .mds-checkbox .mds-checkbox-input.is-invalid:disabled ~ .form-check-label,
702
+ .mds-checkbox .mds-checkbox-input.is-invalid:disabled ~ .mds-checkbox-label {
703
+ color: var(--mds-text-muted);
704
+ }
705
+
706
+ .mds-checkbox-required {
707
+ color: var(--mds-text-danger);
708
+ margin-inline-start: var(--mds-spacing-xxs);
709
+ }
710
+
711
+ .mds-checkbox .invalid-feedback,
712
+ .mds-checkbox .mds-checkbox-feedback {
713
+ grid-column: 2;
270
714
  font-size: var(--mds-font-size-paragraph-small);
271
- line-height: var(--mds-line-height-paragraph-small);
715
+ font-weight: var(--mds-font-weight-medium);
716
+ line-height: var(--mds-line-height-paragraph-xs);
272
717
  }
273
718
 
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);
719
+ .mds-checkbox .invalid-feedback,
720
+ .mds-checkbox .mds-checkbox-feedback.mds-checkbox-supporting-text {
721
+ margin: 0;
722
+ }
723
+
724
+ .mds-checkbox .invalid-feedback {
725
+ color: var(--mds-text-danger);
726
+ }
727
+
728
+ /* In the default state supporting text is subtle. In the invalid state use danger to match
729
+ the label colour \u2014 matching Figma where the label container sets the colour for both. */
730
+
731
+ .mds-checkbox .mds-checkbox-feedback.mds-checkbox-supporting-text {
732
+ color: var(--mds-text-subtle);
733
+ }
734
+
735
+ .mds-checkbox
736
+ .mds-checkbox-input.is-invalid
737
+ ~ .mds-checkbox-feedback.mds-checkbox-supporting-text {
738
+ color: var(--mds-text-danger);
739
+ }
740
+
741
+ .mds-checkbox .mds-checkbox-input:disabled ~ .invalid-feedback,
742
+ .mds-checkbox .mds-checkbox-input:disabled ~ .mds-checkbox-feedback {
743
+ opacity: 0.5;
278
744
  }
279
745
 
280
746
  .mds-close-button.btn-close {
@@ -353,7 +819,7 @@
353
819
  font-family: var(--mds-font-family-base, Arial, sans-serif);
354
820
  font-size: var(--mds-font-size-body, 1rem);
355
821
  font-weight: var(--mds-font-weight-regular, 400);
356
- line-height: var(--mds-line-height-paragraph-small, 1.0875rem); /* 108.75% */
822
+ line-height: var(--mds-line-height-paragraph-xs, 0.75rem);
357
823
  letter-spacing: var(--mds-letter-spacing, 0);
358
824
  }
359
825
 
@@ -448,7 +914,6 @@
448
914
  .mds-form-check .form-check-label,
449
915
  .mds-form-check .mds-form-check-label {
450
916
  color: var(--mds-text-default, #1d2125);
451
- cursor: pointer;
452
917
  }
453
918
 
454
919
  /* Use sibling selector so the label reflects the input's disabled/invalid state */
@@ -456,8 +921,6 @@
456
921
  .mds-form-check .mds-form-check-input:disabled ~ .form-check-label,
457
922
  .mds-form-check .mds-form-check-input:disabled ~ .mds-form-check-label {
458
923
  color: var(--mds-text-muted);
459
- /* Disabled inputs are not interactive — suppress the pointer cursor on the label */
460
- cursor: default;
461
924
  }
462
925
 
463
926
  .mds-form-check .mds-form-check-input.is-invalid ~ .form-check-label,
@@ -474,6 +937,7 @@
474
937
  grid-column: 2;
475
938
  font-size: var(--mds-font-size-paragraph-small, 0.875rem);
476
939
  font-weight: var(--mds-font-weight-medium, 500);
940
+ line-height: var(--mds-line-height-paragraph-xs, 0.75rem);
477
941
  color: var(--mds-text-danger);
478
942
  }
479
943
 
@@ -547,13 +1011,13 @@
547
1011
  --mds-activity-icon-resource-icon: var(--mds-color-cyan-500);
548
1012
  --mds-bg-feedback-danger-light: var(--mds-color-red-50);
549
1013
  --mds-bg-feedback-danger-subtle: var(--mds-color-red-100);
550
- --mds-bg-feedback-info-default: var(--mds-color-cyan-500);
1014
+ --mds-bg-feedback-info-default: var(--mds-color-cyan-600);
551
1015
  --mds-bg-feedback-info-light: var(--mds-color-cyan-50);
552
1016
  --mds-bg-feedback-info-subtle: var(--mds-color-cyan-100);
553
1017
  --mds-bg-feedback-primary-default: var(--mds-color-blue-500);
554
1018
  --mds-bg-feedback-primary-light: var(--mds-color-blue-50);
555
1019
  --mds-bg-feedback-primary-subtle: var(--mds-color-blue-100);
556
- --mds-bg-feedback-secondary-default: var(--mds-color-gray-400);
1020
+ --mds-bg-feedback-secondary-default: var(--mds-color-gray-300);
557
1021
  --mds-bg-feedback-secondary-subtle: var(--mds-color-gray-100);
558
1022
  --mds-bg-feedback-success-default: var(--mds-color-green-500);
559
1023
  --mds-bg-feedback-success-light: var(--mds-color-green-50);
@@ -571,9 +1035,9 @@
571
1035
  --mds-bg-interactive-primary-default-light: var(--mds-color-blue-50);
572
1036
  --mds-bg-interactive-primary-disabled: var(--mds-color-blue-200);
573
1037
  --mds-bg-interactive-primary-hover: var(--mds-color-blue-600);
574
- --mds-bg-interactive-secondary-default: var(--mds-color-gray-400);
1038
+ --mds-bg-interactive-secondary-default: var(--mds-color-gray-300);
575
1039
  --mds-bg-interactive-secondary-disabled: var(--mds-color-gray-200);
576
- --mds-bg-interactive-secondary-hover: var(--mds-color-gray-300);
1040
+ --mds-bg-interactive-secondary-hover: var(--mds-color-gray-400);
577
1041
  --mds-bg-surface-default: var(--mds-color-gray-white);
578
1042
  --mds-bg-surface-strong: var(--mds-color-gray-200);
579
1043
  --mds-bg-surface-subtle: var(--mds-color-gray-100);
@@ -589,7 +1053,7 @@
589
1053
  --mds-border-interactive-primary-active: var(--mds-color-blue-600);
590
1054
  --mds-border-interactive-primary-disabled: var(--mds-color-blue-300);
591
1055
  --mds-border-interactive-secondary-active: var(--mds-color-gray-700);
592
- --mds-border-interactive-secondary-default: var(--mds-color-gray-600);
1056
+ --mds-border-interactive-secondary-default: var(--mds-color-gray-500);
593
1057
  --mds-border-interactive-secondary-disabled: var(--mds-color-gray-500);
594
1058
  --mds-border-interactive-secondary-hover: var(--mds-color-gray-600);
595
1059
  --mds-border-subtle: var(--mds-color-gray-200);
@@ -751,7 +1215,7 @@
751
1215
  --mds-scale-1700: 6rem;
752
1216
  --mds-scale-1800: 50rem;
753
1217
  --mds-typography-font-family-monospace: Menlo;
754
- --mds-typography-font-family-sans-serif: Roboto;
1218
+ --mds-typography-font-family-sans-serif: Noto sans;
755
1219
  --mds-typography-font-size-0: 0rem;
756
1220
  --mds-typography-font-size-1: 1rem;
757
1221
  --mds-typography-font-size-2: 2rem;