@mk-kit/ui 0.41.0 → 0.43.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.
Files changed (53) hide show
  1. package/README.md +4 -4
  2. package/THIRD_PARTY_NOTICES.md +4 -2
  3. package/fesm2022/mk-kit-ui-block-editor.mjs +4 -2
  4. package/fesm2022/mk-kit-ui-block-editor.mjs.map +1 -1
  5. package/fesm2022/mk-kit-ui-checkbox.mjs +4 -2
  6. package/fesm2022/mk-kit-ui-checkbox.mjs.map +1 -1
  7. package/fesm2022/mk-kit-ui-core.mjs +218 -1
  8. package/fesm2022/mk-kit-ui-core.mjs.map +1 -1
  9. package/fesm2022/mk-kit-ui-data.mjs +801 -16
  10. package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
  11. package/fesm2022/mk-kit-ui-datetime.mjs +90 -52
  12. package/fesm2022/mk-kit-ui-datetime.mjs.map +1 -1
  13. package/fesm2022/mk-kit-ui-directives.mjs +395 -2
  14. package/fesm2022/mk-kit-ui-directives.mjs.map +1 -1
  15. package/fesm2022/mk-kit-ui-dnd.mjs +183 -29
  16. package/fesm2022/mk-kit-ui-dnd.mjs.map +1 -1
  17. package/fesm2022/mk-kit-ui-dynamic-form.mjs +149 -2
  18. package/fesm2022/mk-kit-ui-dynamic-form.mjs.map +1 -1
  19. package/fesm2022/mk-kit-ui-feedback.mjs +1 -1
  20. package/fesm2022/mk-kit-ui-feedback.mjs.map +1 -1
  21. package/fesm2022/mk-kit-ui-forms.mjs +331 -81
  22. package/fesm2022/mk-kit-ui-forms.mjs.map +1 -1
  23. package/fesm2022/mk-kit-ui-icon-extended.mjs +425 -0
  24. package/fesm2022/mk-kit-ui-icon-extended.mjs.map +1 -0
  25. package/fesm2022/mk-kit-ui-icon.mjs +296 -459
  26. package/fesm2022/mk-kit-ui-icon.mjs.map +1 -1
  27. package/fesm2022/mk-kit-ui-query-builder.mjs +1 -1
  28. package/fesm2022/mk-kit-ui-query-builder.mjs.map +1 -1
  29. package/fesm2022/mk-kit-ui-rich-text.mjs +4 -2
  30. package/fesm2022/mk-kit-ui-rich-text.mjs.map +1 -1
  31. package/fesm2022/mk-kit-ui-table.mjs +36 -8
  32. package/fesm2022/mk-kit-ui-table.mjs.map +1 -1
  33. package/fesm2022/mk-kit-ui.mjs +1 -0
  34. package/fesm2022/mk-kit-ui.mjs.map +1 -1
  35. package/package.json +5 -1
  36. package/schematics/migrate-primeng/transform.js +4 -1
  37. package/schematics/ng-add/index.js +30 -2
  38. package/schematics/ng-add/schema.json +6 -0
  39. package/styles/mk-kit.css +604 -0
  40. package/types/mk-kit-ui-block-editor.d.ts +2 -0
  41. package/types/mk-kit-ui-checkbox.d.ts +2 -0
  42. package/types/mk-kit-ui-core.d.ts +119 -2
  43. package/types/mk-kit-ui-data.d.ts +359 -3
  44. package/types/mk-kit-ui-datetime.d.ts +41 -19
  45. package/types/mk-kit-ui-directives.d.ts +234 -3
  46. package/types/mk-kit-ui-dnd.d.ts +96 -14
  47. package/types/mk-kit-ui-dynamic-form.d.ts +44 -1
  48. package/types/mk-kit-ui-forms.d.ts +160 -20
  49. package/types/mk-kit-ui-icon-extended.d.ts +83 -0
  50. package/types/mk-kit-ui-icon.d.ts +100 -17
  51. package/types/mk-kit-ui-rich-text.d.ts +2 -0
  52. package/types/mk-kit-ui-table.d.ts +38 -21
  53. package/types/mk-kit-ui.d.ts +1 -0
package/styles/mk-kit.css CHANGED
@@ -338,6 +338,424 @@
338
338
  --mk-chart-8: #ef4444;
339
339
  }
340
340
 
341
+ /* -------------------------------------------------------------------------
342
+ * 3b. High-contrast preset — `data-mk-contrast="high"`.
343
+ *
344
+ * The same tokens again, pushed to the ends of the scale: pure text
345
+ * colours, borders that read as lines rather than tints, opaque
346
+ * interaction washes (no low-alpha surfaces), shadows replaced by a crisp
347
+ * outline, darker/lighter tone families so tinted text clears 7:1, and a
348
+ * thicker focus ring.
349
+ *
350
+ * Applied
351
+ * - explicitly, via `[data-mk-contrast="high"]` on <html>
352
+ * (MkThemeService.setContrast('high')) or on ANY subtree — these are
353
+ * plain custom properties, so they inherit;
354
+ * - automatically, from the OS `prefers-contrast: more` setting, unless
355
+ * the app opts out with `data-mk-contrast="normal"`
356
+ * (MkThemeService.setContrast('normal')).
357
+ *
358
+ * Light and dark each have their own set, resolved with the same
359
+ * precedence as the base theme. Windows High Contrast (forced-colors) is
360
+ * a separate mechanism — see the forced-colors block at the end.
361
+ * ---------------------------------------------------------------------- */
362
+ /* Explicit high contrast — light values. Wins over the base light `:root`
363
+ (same specificity, later) and over the OS-dark `:root:not(...)` rule only
364
+ through the dark-specific selectors below. */
365
+ [data-mk-contrast=high] {
366
+ --mk-bg: #ffffff;
367
+ --mk-surface: #ffffff;
368
+ --mk-surface-2: #eef0f3;
369
+ --mk-surface-3: #dfe3e8;
370
+ --mk-surface-inverse: #000000;
371
+ --mk-overlay-scrim: rgba(0, 0, 0, 0.8);
372
+ --mk-text: #000000;
373
+ --mk-text-muted: #1f2933;
374
+ --mk-text-subtle: #2b3440;
375
+ --mk-text-inverse: #ffffff;
376
+ --mk-text-disabled: #4b5563;
377
+ --mk-border: #1a1d23;
378
+ --mk-border-strong: #000000;
379
+ --mk-border-subtle: #56606e;
380
+ --mk-hover-overlay: #dfe3e8;
381
+ --mk-active-overlay: #c9cfd6;
382
+ --mk-selected-bg: #c7d2fe;
383
+ --mk-selected-text: #1e1b4b;
384
+ --mk-primary: #3730a3;
385
+ --mk-primary-hover: #312e81;
386
+ --mk-primary-active: #1e1b4b;
387
+ --mk-primary-contrast: #ffffff;
388
+ --mk-primary-subtle: #e0e7ff;
389
+ --mk-primary-subtle-hover: #c7d2fe;
390
+ --mk-primary-subtle-text: #1e1b4b;
391
+ --mk-success: #166534;
392
+ --mk-success-hover: #14532d;
393
+ --mk-success-contrast: #ffffff;
394
+ --mk-success-subtle: #dcfce7;
395
+ --mk-success-subtle-text: #14532d;
396
+ --mk-warning: #92400e;
397
+ --mk-warning-hover: #78350f;
398
+ --mk-warning-contrast: #ffffff;
399
+ --mk-warning-subtle: #fef3c7;
400
+ --mk-warning-subtle-text: #78350f;
401
+ --mk-danger: #b91c1c;
402
+ --mk-danger-hover: #991b1b;
403
+ --mk-danger-contrast: #ffffff;
404
+ --mk-danger-text: #991b1b;
405
+ --mk-danger-subtle: #fee2e2;
406
+ --mk-danger-subtle-text: #7f1d1d;
407
+ --mk-info: #075985;
408
+ --mk-info-hover: #0c4a6e;
409
+ --mk-info-contrast: #ffffff;
410
+ --mk-info-subtle: #e0f2fe;
411
+ --mk-info-subtle-text: #0c4a6e;
412
+ --mk-neutral-subtle: #e5e8ec;
413
+ --mk-neutral-subtle-hover: #d5d9df;
414
+ --mk-neutral-subtle-text: #000000;
415
+ --mk-focus-ring: #000000;
416
+ --mk-focus-ring-width: 3px;
417
+ --mk-shadow-xs: 0 0 0 1px #000000;
418
+ --mk-shadow-sm: 0 0 0 1px #000000;
419
+ --mk-shadow-md: 0 0 0 1px #000000;
420
+ --mk-shadow-lg: 0 0 0 2px #000000;
421
+ --mk-shadow-xl: 0 0 0 2px #000000;
422
+ --mk-skeleton-base: #d5d9df;
423
+ --mk-skeleton-shine: #eef0f3;
424
+ --mk-scrollbar-thumb: #4b5563;
425
+ --mk-scrollbar-thumb-hover: #1f2933;
426
+ --mk-code-bg: #eef0f3;
427
+ }
428
+
429
+ /* High contrast under OS dark (no explicit light override), whether the
430
+ attribute sits on <html> or on a subtree. */
431
+ @media (prefers-color-scheme: dark) {
432
+ :root:not([data-mk-theme=light])[data-mk-contrast=high],
433
+ :root:not([data-mk-theme=light]) [data-mk-contrast=high] {
434
+ --mk-bg: #000000;
435
+ --mk-surface: #000000;
436
+ --mk-surface-2: #14181d;
437
+ --mk-surface-3: #1f252c;
438
+ --mk-surface-inverse: #ffffff;
439
+ --mk-overlay-scrim: rgba(0, 0, 0, 0.85);
440
+ --mk-text: #ffffff;
441
+ --mk-text-muted: #e6edf3;
442
+ --mk-text-subtle: #d0d7de;
443
+ --mk-text-disabled: #9aa5b1;
444
+ --mk-text-inverse: #000000;
445
+ --mk-border: #e6edf3;
446
+ --mk-border-strong: #ffffff;
447
+ --mk-border-subtle: #9aa5b1;
448
+ --mk-hover-overlay: #2a323c;
449
+ --mk-active-overlay: #3a444f;
450
+ --mk-selected-bg: #312e81;
451
+ --mk-selected-text: #ffffff;
452
+ --mk-primary: #a5b4fc;
453
+ --mk-primary-hover: #c7d2fe;
454
+ --mk-primary-active: #e0e7ff;
455
+ --mk-primary-contrast: #000000;
456
+ --mk-primary-subtle: #1e1b4b;
457
+ --mk-primary-subtle-hover: #312e81;
458
+ --mk-primary-subtle-text: #e0e7ff;
459
+ --mk-success: #4ade80;
460
+ --mk-success-hover: #86efac;
461
+ --mk-success-contrast: #052e13;
462
+ --mk-success-subtle: #052e13;
463
+ --mk-success-subtle-text: #bbf7d0;
464
+ --mk-warning: #fbbf24;
465
+ --mk-warning-hover: #fcd34d;
466
+ --mk-warning-contrast: #2a1a02;
467
+ --mk-warning-subtle: #2a1a02;
468
+ --mk-warning-subtle-text: #fde68a;
469
+ --mk-danger: #f87171;
470
+ --mk-danger-hover: #fca5a5;
471
+ --mk-danger-contrast: #000000;
472
+ --mk-danger-text: #fca5a5;
473
+ --mk-danger-subtle: #2c1416;
474
+ --mk-danger-subtle-text: #fecaca;
475
+ --mk-info: #7dd3fc;
476
+ --mk-info-hover: #bae6fd;
477
+ --mk-info-contrast: #04222e;
478
+ --mk-info-subtle: #0c2733;
479
+ --mk-info-subtle-text: #e0f2fe;
480
+ --mk-neutral-subtle: #1f252c;
481
+ --mk-neutral-subtle-hover: #2a323c;
482
+ --mk-neutral-subtle-text: #ffffff;
483
+ --mk-focus-ring: #ffffff;
484
+ --mk-focus-ring-width: 3px;
485
+ --mk-shadow-xs: 0 0 0 1px #ffffff;
486
+ --mk-shadow-sm: 0 0 0 1px #ffffff;
487
+ --mk-shadow-md: 0 0 0 1px #ffffff;
488
+ --mk-shadow-lg: 0 0 0 2px #ffffff;
489
+ --mk-shadow-xl: 0 0 0 2px #ffffff;
490
+ --mk-skeleton-base: #2a323c;
491
+ --mk-skeleton-shine: #3a444f;
492
+ --mk-scrollbar-thumb: #9aa5b1;
493
+ --mk-scrollbar-thumb-hover: #e6edf3;
494
+ --mk-code-bg: #14181d;
495
+ }
496
+ }
497
+ /* High contrast under explicit dark. */
498
+ [data-mk-theme=dark][data-mk-contrast=high],
499
+ [data-mk-theme=dark] [data-mk-contrast=high] {
500
+ --mk-bg: #000000;
501
+ --mk-surface: #000000;
502
+ --mk-surface-2: #14181d;
503
+ --mk-surface-3: #1f252c;
504
+ --mk-surface-inverse: #ffffff;
505
+ --mk-overlay-scrim: rgba(0, 0, 0, 0.85);
506
+ --mk-text: #ffffff;
507
+ --mk-text-muted: #e6edf3;
508
+ --mk-text-subtle: #d0d7de;
509
+ --mk-text-disabled: #9aa5b1;
510
+ --mk-text-inverse: #000000;
511
+ --mk-border: #e6edf3;
512
+ --mk-border-strong: #ffffff;
513
+ --mk-border-subtle: #9aa5b1;
514
+ --mk-hover-overlay: #2a323c;
515
+ --mk-active-overlay: #3a444f;
516
+ --mk-selected-bg: #312e81;
517
+ --mk-selected-text: #ffffff;
518
+ --mk-primary: #a5b4fc;
519
+ --mk-primary-hover: #c7d2fe;
520
+ --mk-primary-active: #e0e7ff;
521
+ --mk-primary-contrast: #000000;
522
+ --mk-primary-subtle: #1e1b4b;
523
+ --mk-primary-subtle-hover: #312e81;
524
+ --mk-primary-subtle-text: #e0e7ff;
525
+ --mk-success: #4ade80;
526
+ --mk-success-hover: #86efac;
527
+ --mk-success-contrast: #052e13;
528
+ --mk-success-subtle: #052e13;
529
+ --mk-success-subtle-text: #bbf7d0;
530
+ --mk-warning: #fbbf24;
531
+ --mk-warning-hover: #fcd34d;
532
+ --mk-warning-contrast: #2a1a02;
533
+ --mk-warning-subtle: #2a1a02;
534
+ --mk-warning-subtle-text: #fde68a;
535
+ --mk-danger: #f87171;
536
+ --mk-danger-hover: #fca5a5;
537
+ --mk-danger-contrast: #000000;
538
+ --mk-danger-text: #fca5a5;
539
+ --mk-danger-subtle: #2c1416;
540
+ --mk-danger-subtle-text: #fecaca;
541
+ --mk-info: #7dd3fc;
542
+ --mk-info-hover: #bae6fd;
543
+ --mk-info-contrast: #04222e;
544
+ --mk-info-subtle: #0c2733;
545
+ --mk-info-subtle-text: #e0f2fe;
546
+ --mk-neutral-subtle: #1f252c;
547
+ --mk-neutral-subtle-hover: #2a323c;
548
+ --mk-neutral-subtle-text: #ffffff;
549
+ --mk-focus-ring: #ffffff;
550
+ --mk-focus-ring-width: 3px;
551
+ --mk-shadow-xs: 0 0 0 1px #ffffff;
552
+ --mk-shadow-sm: 0 0 0 1px #ffffff;
553
+ --mk-shadow-md: 0 0 0 1px #ffffff;
554
+ --mk-shadow-lg: 0 0 0 2px #ffffff;
555
+ --mk-shadow-xl: 0 0 0 2px #ffffff;
556
+ --mk-skeleton-base: #2a323c;
557
+ --mk-skeleton-shine: #3a444f;
558
+ --mk-scrollbar-thumb: #9aa5b1;
559
+ --mk-scrollbar-thumb-hover: #e6edf3;
560
+ --mk-code-bg: #14181d;
561
+ }
562
+
563
+ /* OS "increase contrast" — same preset, unless the app opted out. */
564
+ @media (prefers-contrast: more) {
565
+ :root:not([data-mk-contrast=normal]) {
566
+ --mk-bg: #ffffff;
567
+ --mk-surface: #ffffff;
568
+ --mk-surface-2: #eef0f3;
569
+ --mk-surface-3: #dfe3e8;
570
+ --mk-surface-inverse: #000000;
571
+ --mk-overlay-scrim: rgba(0, 0, 0, 0.8);
572
+ --mk-text: #000000;
573
+ --mk-text-muted: #1f2933;
574
+ --mk-text-subtle: #2b3440;
575
+ --mk-text-inverse: #ffffff;
576
+ --mk-text-disabled: #4b5563;
577
+ --mk-border: #1a1d23;
578
+ --mk-border-strong: #000000;
579
+ --mk-border-subtle: #56606e;
580
+ --mk-hover-overlay: #dfe3e8;
581
+ --mk-active-overlay: #c9cfd6;
582
+ --mk-selected-bg: #c7d2fe;
583
+ --mk-selected-text: #1e1b4b;
584
+ --mk-primary: #3730a3;
585
+ --mk-primary-hover: #312e81;
586
+ --mk-primary-active: #1e1b4b;
587
+ --mk-primary-contrast: #ffffff;
588
+ --mk-primary-subtle: #e0e7ff;
589
+ --mk-primary-subtle-hover: #c7d2fe;
590
+ --mk-primary-subtle-text: #1e1b4b;
591
+ --mk-success: #166534;
592
+ --mk-success-hover: #14532d;
593
+ --mk-success-contrast: #ffffff;
594
+ --mk-success-subtle: #dcfce7;
595
+ --mk-success-subtle-text: #14532d;
596
+ --mk-warning: #92400e;
597
+ --mk-warning-hover: #78350f;
598
+ --mk-warning-contrast: #ffffff;
599
+ --mk-warning-subtle: #fef3c7;
600
+ --mk-warning-subtle-text: #78350f;
601
+ --mk-danger: #b91c1c;
602
+ --mk-danger-hover: #991b1b;
603
+ --mk-danger-contrast: #ffffff;
604
+ --mk-danger-text: #991b1b;
605
+ --mk-danger-subtle: #fee2e2;
606
+ --mk-danger-subtle-text: #7f1d1d;
607
+ --mk-info: #075985;
608
+ --mk-info-hover: #0c4a6e;
609
+ --mk-info-contrast: #ffffff;
610
+ --mk-info-subtle: #e0f2fe;
611
+ --mk-info-subtle-text: #0c4a6e;
612
+ --mk-neutral-subtle: #e5e8ec;
613
+ --mk-neutral-subtle-hover: #d5d9df;
614
+ --mk-neutral-subtle-text: #000000;
615
+ --mk-focus-ring: #000000;
616
+ --mk-focus-ring-width: 3px;
617
+ --mk-shadow-xs: 0 0 0 1px #000000;
618
+ --mk-shadow-sm: 0 0 0 1px #000000;
619
+ --mk-shadow-md: 0 0 0 1px #000000;
620
+ --mk-shadow-lg: 0 0 0 2px #000000;
621
+ --mk-shadow-xl: 0 0 0 2px #000000;
622
+ --mk-skeleton-base: #d5d9df;
623
+ --mk-skeleton-shine: #eef0f3;
624
+ --mk-scrollbar-thumb: #4b5563;
625
+ --mk-scrollbar-thumb-hover: #1f2933;
626
+ --mk-code-bg: #eef0f3;
627
+ }
628
+ }
629
+ @media (prefers-contrast: more) and (prefers-color-scheme: dark) {
630
+ :root:not([data-mk-theme=light]):not([data-mk-contrast=normal]) {
631
+ --mk-bg: #000000;
632
+ --mk-surface: #000000;
633
+ --mk-surface-2: #14181d;
634
+ --mk-surface-3: #1f252c;
635
+ --mk-surface-inverse: #ffffff;
636
+ --mk-overlay-scrim: rgba(0, 0, 0, 0.85);
637
+ --mk-text: #ffffff;
638
+ --mk-text-muted: #e6edf3;
639
+ --mk-text-subtle: #d0d7de;
640
+ --mk-text-disabled: #9aa5b1;
641
+ --mk-text-inverse: #000000;
642
+ --mk-border: #e6edf3;
643
+ --mk-border-strong: #ffffff;
644
+ --mk-border-subtle: #9aa5b1;
645
+ --mk-hover-overlay: #2a323c;
646
+ --mk-active-overlay: #3a444f;
647
+ --mk-selected-bg: #312e81;
648
+ --mk-selected-text: #ffffff;
649
+ --mk-primary: #a5b4fc;
650
+ --mk-primary-hover: #c7d2fe;
651
+ --mk-primary-active: #e0e7ff;
652
+ --mk-primary-contrast: #000000;
653
+ --mk-primary-subtle: #1e1b4b;
654
+ --mk-primary-subtle-hover: #312e81;
655
+ --mk-primary-subtle-text: #e0e7ff;
656
+ --mk-success: #4ade80;
657
+ --mk-success-hover: #86efac;
658
+ --mk-success-contrast: #052e13;
659
+ --mk-success-subtle: #052e13;
660
+ --mk-success-subtle-text: #bbf7d0;
661
+ --mk-warning: #fbbf24;
662
+ --mk-warning-hover: #fcd34d;
663
+ --mk-warning-contrast: #2a1a02;
664
+ --mk-warning-subtle: #2a1a02;
665
+ --mk-warning-subtle-text: #fde68a;
666
+ --mk-danger: #f87171;
667
+ --mk-danger-hover: #fca5a5;
668
+ --mk-danger-contrast: #000000;
669
+ --mk-danger-text: #fca5a5;
670
+ --mk-danger-subtle: #2c1416;
671
+ --mk-danger-subtle-text: #fecaca;
672
+ --mk-info: #7dd3fc;
673
+ --mk-info-hover: #bae6fd;
674
+ --mk-info-contrast: #04222e;
675
+ --mk-info-subtle: #0c2733;
676
+ --mk-info-subtle-text: #e0f2fe;
677
+ --mk-neutral-subtle: #1f252c;
678
+ --mk-neutral-subtle-hover: #2a323c;
679
+ --mk-neutral-subtle-text: #ffffff;
680
+ --mk-focus-ring: #ffffff;
681
+ --mk-focus-ring-width: 3px;
682
+ --mk-shadow-xs: 0 0 0 1px #ffffff;
683
+ --mk-shadow-sm: 0 0 0 1px #ffffff;
684
+ --mk-shadow-md: 0 0 0 1px #ffffff;
685
+ --mk-shadow-lg: 0 0 0 2px #ffffff;
686
+ --mk-shadow-xl: 0 0 0 2px #ffffff;
687
+ --mk-skeleton-base: #2a323c;
688
+ --mk-skeleton-shine: #3a444f;
689
+ --mk-scrollbar-thumb: #9aa5b1;
690
+ --mk-scrollbar-thumb-hover: #e6edf3;
691
+ --mk-code-bg: #14181d;
692
+ }
693
+ }
694
+ @media (prefers-contrast: more) {
695
+ :root[data-mk-theme=dark]:not([data-mk-contrast=normal]) {
696
+ --mk-bg: #000000;
697
+ --mk-surface: #000000;
698
+ --mk-surface-2: #14181d;
699
+ --mk-surface-3: #1f252c;
700
+ --mk-surface-inverse: #ffffff;
701
+ --mk-overlay-scrim: rgba(0, 0, 0, 0.85);
702
+ --mk-text: #ffffff;
703
+ --mk-text-muted: #e6edf3;
704
+ --mk-text-subtle: #d0d7de;
705
+ --mk-text-disabled: #9aa5b1;
706
+ --mk-text-inverse: #000000;
707
+ --mk-border: #e6edf3;
708
+ --mk-border-strong: #ffffff;
709
+ --mk-border-subtle: #9aa5b1;
710
+ --mk-hover-overlay: #2a323c;
711
+ --mk-active-overlay: #3a444f;
712
+ --mk-selected-bg: #312e81;
713
+ --mk-selected-text: #ffffff;
714
+ --mk-primary: #a5b4fc;
715
+ --mk-primary-hover: #c7d2fe;
716
+ --mk-primary-active: #e0e7ff;
717
+ --mk-primary-contrast: #000000;
718
+ --mk-primary-subtle: #1e1b4b;
719
+ --mk-primary-subtle-hover: #312e81;
720
+ --mk-primary-subtle-text: #e0e7ff;
721
+ --mk-success: #4ade80;
722
+ --mk-success-hover: #86efac;
723
+ --mk-success-contrast: #052e13;
724
+ --mk-success-subtle: #052e13;
725
+ --mk-success-subtle-text: #bbf7d0;
726
+ --mk-warning: #fbbf24;
727
+ --mk-warning-hover: #fcd34d;
728
+ --mk-warning-contrast: #2a1a02;
729
+ --mk-warning-subtle: #2a1a02;
730
+ --mk-warning-subtle-text: #fde68a;
731
+ --mk-danger: #f87171;
732
+ --mk-danger-hover: #fca5a5;
733
+ --mk-danger-contrast: #000000;
734
+ --mk-danger-text: #fca5a5;
735
+ --mk-danger-subtle: #2c1416;
736
+ --mk-danger-subtle-text: #fecaca;
737
+ --mk-info: #7dd3fc;
738
+ --mk-info-hover: #bae6fd;
739
+ --mk-info-contrast: #04222e;
740
+ --mk-info-subtle: #0c2733;
741
+ --mk-info-subtle-text: #e0f2fe;
742
+ --mk-neutral-subtle: #1f252c;
743
+ --mk-neutral-subtle-hover: #2a323c;
744
+ --mk-neutral-subtle-text: #ffffff;
745
+ --mk-focus-ring: #ffffff;
746
+ --mk-focus-ring-width: 3px;
747
+ --mk-shadow-xs: 0 0 0 1px #ffffff;
748
+ --mk-shadow-sm: 0 0 0 1px #ffffff;
749
+ --mk-shadow-md: 0 0 0 1px #ffffff;
750
+ --mk-shadow-lg: 0 0 0 2px #ffffff;
751
+ --mk-shadow-xl: 0 0 0 2px #ffffff;
752
+ --mk-skeleton-base: #2a323c;
753
+ --mk-skeleton-shine: #3a444f;
754
+ --mk-scrollbar-thumb: #9aa5b1;
755
+ --mk-scrollbar-thumb-hover: #e6edf3;
756
+ --mk-code-bg: #14181d;
757
+ }
758
+ }
341
759
  /* -------------------------------------------------------------------------
342
760
  * 4. Base / reset — opt-in via the `mk-scope` class or applied globally.
343
761
  * Kept minimal and non-destructive.
@@ -381,6 +799,139 @@ body.mk-app {
381
799
  border: 0;
382
800
  }
383
801
 
802
+ /* Badge overlay — the element `[mkBadgeOverlay]` appends to its host. Lives
803
+ here because a directive has no stylesheet of its own. Anchored with
804
+ LOGICAL insets so `end` flips in RTL; the half-outset `translate` flips with
805
+ it via `:dir(rtl)`. The ring (`box-shadow`) separates the badge from the
806
+ host it overlaps. */
807
+ .mk-badge-overlay {
808
+ --_main: var(--mk-primary);
809
+ --_contrast: var(--mk-primary-contrast);
810
+ --_dx: 50%;
811
+ --_dy: -50%;
812
+ position: absolute;
813
+ inset-block-start: 0;
814
+ inset-inline-end: 0;
815
+ z-index: 1;
816
+ box-sizing: border-box;
817
+ display: inline-flex;
818
+ align-items: center;
819
+ justify-content: center;
820
+ min-width: 1.125rem;
821
+ height: 1.125rem;
822
+ padding: 0 var(--mk-space-1);
823
+ border-radius: var(--mk-radius-pill);
824
+ background-color: var(--_main);
825
+ color: var(--_contrast);
826
+ box-shadow: 0 0 0 var(--mk-border-width-strong) var(--mk-surface);
827
+ font-family: var(--mk-font-sans);
828
+ font-size: var(--mk-font-size-xs);
829
+ font-weight: var(--mk-font-weight-medium);
830
+ line-height: 1;
831
+ white-space: nowrap;
832
+ pointer-events: none;
833
+ transform: translate(var(--_dx), var(--_dy));
834
+ transition: background-color var(--mk-duration-fast) var(--mk-ease-standard), transform var(--mk-duration-fast) var(--mk-ease-standard);
835
+ }
836
+
837
+ .mk-badge-overlay[data-tone=primary] {
838
+ --_main: var(--mk-primary);
839
+ --_hover: var(--mk-primary-hover);
840
+ --_active: var(--mk-primary-active);
841
+ --_contrast: var(--mk-primary-contrast);
842
+ --_subtle: var(--mk-primary-subtle);
843
+ --_subtle-text: var(--mk-primary-subtle-text);
844
+ }
845
+
846
+ .mk-badge-overlay[data-tone=success] {
847
+ --_main: var(--mk-success);
848
+ --_hover: var(--mk-success-hover);
849
+ --_active: var(--mk-success-hover);
850
+ --_contrast: var(--mk-success-contrast);
851
+ --_subtle: var(--mk-success-subtle);
852
+ --_subtle-text: var(--mk-success-subtle-text);
853
+ }
854
+
855
+ .mk-badge-overlay[data-tone=warning] {
856
+ --_main: var(--mk-warning);
857
+ --_hover: var(--mk-warning-hover);
858
+ --_active: var(--mk-warning-hover);
859
+ --_contrast: var(--mk-warning-contrast);
860
+ --_subtle: var(--mk-warning-subtle);
861
+ --_subtle-text: var(--mk-warning-subtle-text);
862
+ }
863
+
864
+ .mk-badge-overlay[data-tone=danger] {
865
+ --_main: var(--mk-danger);
866
+ --_hover: var(--mk-danger-hover);
867
+ --_active: var(--mk-danger-hover);
868
+ --_contrast: var(--mk-danger-contrast);
869
+ --_subtle: var(--mk-danger-subtle);
870
+ --_subtle-text: var(--mk-danger-subtle-text);
871
+ }
872
+
873
+ .mk-badge-overlay[data-tone=info] {
874
+ --_main: var(--mk-info);
875
+ --_hover: var(--mk-info-hover);
876
+ --_active: var(--mk-info-hover);
877
+ --_contrast: var(--mk-info-contrast);
878
+ --_subtle: var(--mk-info-subtle);
879
+ --_subtle-text: var(--mk-info-subtle-text);
880
+ }
881
+
882
+ .mk-badge-overlay[data-tone=neutral] {
883
+ --_main: var(--mk-surface-inverse);
884
+ --_hover: var(--mk-surface-inverse);
885
+ --_active: var(--mk-surface-inverse);
886
+ --_contrast: var(--mk-text-inverse);
887
+ --_subtle: var(--mk-neutral-subtle);
888
+ --_subtle-text: var(--mk-neutral-subtle-text);
889
+ }
890
+
891
+ .mk-badge-overlay[data-position=top-start] {
892
+ inset-inline-end: auto;
893
+ inset-inline-start: 0;
894
+ --_dx: -50%;
895
+ }
896
+
897
+ .mk-badge-overlay[data-position=bottom-end] {
898
+ inset-block-start: auto;
899
+ inset-block-end: 0;
900
+ --_dy: 50%;
901
+ }
902
+
903
+ .mk-badge-overlay[data-position=bottom-start] {
904
+ inset-block-start: auto;
905
+ inset-block-end: 0;
906
+ inset-inline-end: auto;
907
+ inset-inline-start: 0;
908
+ --_dx: -50%;
909
+ --_dy: 50%;
910
+ }
911
+
912
+ /* RTL: `end` is now the left edge, so the outset points the other way. */
913
+ .mk-badge-overlay:dir(rtl) {
914
+ --_dx: -50%;
915
+ }
916
+
917
+ .mk-badge-overlay[data-position=top-start]:dir(rtl),
918
+ .mk-badge-overlay[data-position=bottom-start]:dir(rtl) {
919
+ --_dx: 50%;
920
+ }
921
+
922
+ .mk-badge-overlay--dot {
923
+ width: 0.625rem;
924
+ height: 0.625rem;
925
+ min-width: 0;
926
+ padding: 0;
927
+ border-radius: var(--mk-radius-circle);
928
+ }
929
+
930
+ @media (prefers-reduced-motion: reduce) {
931
+ .mk-badge-overlay {
932
+ transition: none;
933
+ }
934
+ }
384
935
  /* Print helpers: `.mk-print-hidden` drops page chrome (toolbars, filters)
385
936
  from paper; `.mk-print-only` shows something (a title, a date) only there.
386
937
  Components ship their own `@media print` rules — mk-table prints as one
@@ -419,6 +970,13 @@ body.mk-app {
419
970
  cursor: grabbing;
420
971
  }
421
972
 
973
+ /* A focusable handle (<button mkDragHandle>) is the keyboard target of its
974
+ * item, so it needs the library focus ring like any other control. */
975
+ .mk-drag-handle:focus-visible {
976
+ outline: var(--mk-focus-ring-width) solid var(--mk-focus-ring);
977
+ outline-offset: var(--mk-focus-ring-offset);
978
+ }
979
+
422
980
  /* Themed scrollbars (progressive enhancement) */
423
981
  .mk-app * {
424
982
  scrollbar-color: var(--mk-scrollbar-thumb) transparent;
@@ -651,6 +1209,52 @@ body.mk-app {
651
1209
  outlines) is left to the system palette on purpose.
652
1210
  ========================================================================== */
653
1211
  @media (forced-colors: active) {
1212
+ /* --- Tokens → system colours -------------------------------------------
1213
+ Forced colours already replace author colours on every element that is
1214
+ not opted out, so most of this is moot; it matters for the components
1215
+ below that set `forced-color-adjust: none` and for anything (a canvas
1216
+ chart, an SVG fill) that reads a token directly. Keeping the tokens on
1217
+ the system palette means those spots follow the user's scheme too. */
1218
+ :root,
1219
+ [data-mk-theme=dark],
1220
+ [data-mk-contrast=high] {
1221
+ --mk-bg: Canvas;
1222
+ --mk-surface: Canvas;
1223
+ --mk-surface-2: Canvas;
1224
+ --mk-surface-3: Canvas;
1225
+ --mk-surface-inverse: CanvasText;
1226
+ --mk-text: CanvasText;
1227
+ --mk-text-muted: CanvasText;
1228
+ --mk-text-subtle: CanvasText;
1229
+ --mk-text-inverse: Canvas;
1230
+ --mk-text-disabled: GrayText;
1231
+ --mk-border: CanvasText;
1232
+ --mk-border-strong: CanvasText;
1233
+ --mk-border-subtle: CanvasText;
1234
+ --mk-hover-overlay: transparent;
1235
+ --mk-active-overlay: transparent;
1236
+ --mk-selected-bg: Highlight;
1237
+ --mk-selected-text: HighlightText;
1238
+ --mk-primary: ButtonText;
1239
+ --mk-primary-hover: ButtonText;
1240
+ --mk-primary-active: ButtonText;
1241
+ --mk-primary-contrast: ButtonFace;
1242
+ --mk-focus-ring: Highlight;
1243
+ --mk-focus-ring-width: 3px;
1244
+ --mk-shadow-xs: none;
1245
+ --mk-shadow-sm: none;
1246
+ --mk-shadow-md: none;
1247
+ --mk-shadow-lg: none;
1248
+ --mk-shadow-xl: none;
1249
+ }
1250
+ /* --- Badge overlay: a background-only element would vanish -------------- */
1251
+ .mk-badge-overlay {
1252
+ forced-color-adjust: none;
1253
+ background-color: Highlight;
1254
+ color: HighlightText;
1255
+ border: 1px solid CanvasText;
1256
+ box-shadow: 0 0 0 2px Canvas;
1257
+ }
654
1258
  /* --- Selection & active states: Highlight on HighlightText -------------- */
655
1259
  .mk-select__option--selected,
656
1260
  .mk-cmdk__option--active,
@@ -192,6 +192,8 @@ declare class MkBlockEditor implements ControlValueAccessor {
192
192
  readonly htmlChange: _angular_core.OutputEmitterRef<string>;
193
193
  protected readonly cvaDisabled: _angular_core.WritableSignal<boolean>;
194
194
  /** Invalid visual, forced by the `invalid` input. */
195
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
196
+ private readonly fieldTouched;
195
197
  protected readonly isInvalid: _angular_core.Signal<boolean>;
196
198
  private onChange;
197
199
  private onTouched;
@@ -19,6 +19,8 @@ import { MkSize, MkTone } from '@mk-kit/ui/core';
19
19
  */
20
20
  declare class MkCheckbox implements ControlValueAccessor, Validator {
21
21
  private readonly field;
22
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
23
+ private readonly fieldTouched;
22
24
  /** Two-way checked state. */
23
25
  readonly checked: _angular_core.ModelSignal<boolean>;
24
26
  /** Two-way indeterminate ("mixed") state; cleared when the user toggles. */