@mikedown/core 0.1.0 → 0.3.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 (42) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +183 -3
  3. package/dist/ai/engines-page.d.ts +130 -0
  4. package/dist/ai/engines-page.js +10 -0
  5. package/dist/ai/engines-page.js.map +1 -0
  6. package/dist/ai/index.d.ts +1531 -0
  7. package/dist/ai/index.js +395 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/ai-ui-C7ENTWWU.js +3370 -0
  10. package/dist/ai-ui-C7ENTWWU.js.map +1 -0
  11. package/dist/chunk-7A5HEPLK.js +4910 -0
  12. package/dist/chunk-7A5HEPLK.js.map +1 -0
  13. package/dist/chunk-GWCRPPCX.js +18 -0
  14. package/dist/chunk-GWCRPPCX.js.map +1 -0
  15. package/dist/chunk-JZWKEBCI.js +3899 -0
  16. package/dist/chunk-JZWKEBCI.js.map +1 -0
  17. package/dist/chunk-L4FO63DF.js +113 -0
  18. package/dist/chunk-L4FO63DF.js.map +1 -0
  19. package/dist/chunk-LXZG7IKN.js +39 -0
  20. package/dist/chunk-LXZG7IKN.js.map +1 -0
  21. package/dist/chunk-QDVY7WW6.js +165 -0
  22. package/dist/chunk-QDVY7WW6.js.map +1 -0
  23. package/dist/chunk-QWKT57TR.js +62 -0
  24. package/dist/chunk-QWKT57TR.js.map +1 -0
  25. package/dist/chunk-TSP7BAV3.js +22 -0
  26. package/dist/chunk-TSP7BAV3.js.map +1 -0
  27. package/dist/index.d.ts +62 -441
  28. package/dist/index.js +6871 -1247
  29. package/dist/index.js.map +1 -1
  30. package/dist/schema-DYzxkuSb.d.ts +46 -0
  31. package/dist/shared/anchoring.js +4 -16
  32. package/dist/shared/anchoring.js.map +1 -1
  33. package/dist/shared/imagePaste.js +3 -57
  34. package/dist/shared/imagePaste.js.map +1 -1
  35. package/dist/shared/sha1.js +3 -57
  36. package/dist/shared/sha1.js.map +1 -1
  37. package/dist/shared/wordCount.js +4 -12
  38. package/dist/shared/wordCount.js.map +1 -1
  39. package/dist/styles.css +3700 -94
  40. package/dist/types-CgEeIUhi.d.ts +432 -0
  41. package/dist/types-CsVNVSNY.d.ts +597 -0
  42. package/package.json +17 -2
package/dist/styles.css CHANGED
@@ -342,6 +342,19 @@
342
342
  align-self: stretch;
343
343
  }
344
344
 
345
+ /* A group of buttons that moves and overflows as one (the zoom control).
346
+ Laid out like the toolbar itself, so it looks the same as loose buttons. */
347
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar .toolbar-group {
348
+ display: flex;
349
+ align-items: center;
350
+ gap: 1px;
351
+ }
352
+ /* A flexible spacer: shrinks to nothing before any button has to overflow. */
353
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar .toolbar-spacer {
354
+ flex: 1 1 0;
355
+ min-width: 0;
356
+ }
357
+
345
358
  /* High contrast / forced-colors mode */
346
359
  @media (forced-colors: active) {
347
360
  :is(.mikedown-root, .mikedown-portal) .ProseMirror a { color: LinkText; }
@@ -378,6 +391,19 @@
378
391
  overflow: visible;
379
392
  }
380
393
 
394
+ /* Buttons that don't fit move into the More (⋯) menu, from the right
395
+ (layoutToolbarOverflow in toolbar-overflow.ts), so the toolbar stays one
396
+ row at phone widths. More sits at the right edge while it is shown. */
397
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar .toolbar-overflowed {
398
+ display: none !important;
399
+ }
400
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar button.toolbar-more {
401
+ margin-left: auto;
402
+ }
403
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar button.toolbar-more[hidden] {
404
+ display: none;
405
+ }
406
+
381
407
  :is(.mikedown-root, .mikedown-portal) .condensed-dropdown-trigger {
382
408
  display: inline-flex !important;
383
409
  align-items: center;
@@ -425,6 +451,356 @@
425
451
  font-variant-numeric: tabular-nums;
426
452
  }
427
453
 
454
+ /* ── Customize Toolbar (edit mode, toolbar-customize.ts) ──────────────────────
455
+ The live toolbar wraps instead of overflowing, every item but Text Format,
456
+ Settings and More can be dragged, and a quiet tray under it holds the
457
+ unused items. Ghost and insertion line are fixed-position chrome in the root. */
458
+
459
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing {
460
+ flex-wrap: wrap;
461
+ height: auto;
462
+ min-height: 40px;
463
+ padding-top: 2px;
464
+ padding-bottom: 2px;
465
+ row-gap: 2px;
466
+ box-shadow: inset 0 -2px 0 var(--mikedown-accent, #3f51b5);
467
+ }
468
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > * {
469
+ touch-action: none;
470
+ }
471
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-item-movable {
472
+ cursor: grab;
473
+ border-radius: var(--mikedown-radius-sm, 4px);
474
+ transition: background 120ms ease, box-shadow 120ms ease, opacity 120ms ease;
475
+ }
476
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-item-movable button {
477
+ cursor: grab;
478
+ }
479
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-item-movable:hover {
480
+ box-shadow: inset 0 0 0 1px var(--mikedown-input-border, rgba(128, 128, 128, 0.35));
481
+ }
482
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-item-fixed,
483
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-item-fixed button {
484
+ cursor: default;
485
+ }
486
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing button.toolbar-item-fixed:hover {
487
+ background: transparent;
488
+ }
489
+ /* The item being dragged stays in place, faded, until it is dropped. */
490
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-item-dragging {
491
+ opacity: 0.35;
492
+ }
493
+ /* Keyboard (D11). The ring and the picked-up state use the accent, solid,
494
+ which keeps 3:1 against the toolbar in both built-in themes (the default
495
+ focus ring is translucent); the VS Code theme maps the ring to focusBorder. */
496
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > :focus {
497
+ outline: none;
498
+ }
499
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > :focus-visible,
500
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > .toolbar-item-grabbed {
501
+ outline: 2px solid var(--mikedown-toolbar-edit-focus, var(--mikedown-accent, #3f51b5));
502
+ outline-offset: 1px;
503
+ }
504
+ /* Picked up with Space: tinted, lifted, a little larger. */
505
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > .toolbar-item-grabbed {
506
+ position: relative;
507
+ z-index: 1;
508
+ border-radius: var(--mikedown-radius-sm, 4px);
509
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 18%, var(--mikedown-surface-toolbar, transparent));
510
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.22), 0 1px 3px rgba(0, 0, 0, 0.12);
511
+ translate: 0 -1px;
512
+ scale: 1.02;
513
+ transition: translate 120ms ease, scale 120ms ease, box-shadow 120ms ease, background 120ms ease;
514
+ }
515
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > .toolbar-item-grabbed,
516
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > .toolbar-item-grabbed button {
517
+ cursor: grabbing;
518
+ }
519
+ /* No hover tooltip on the item being moved by keyboard. */
520
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > .toolbar-item-grabbed[data-tip]::after {
521
+ display: none;
522
+ }
523
+
524
+ /* A separator is 1px wide: give it a grab area in edit mode. */
525
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-separator {
526
+ width: 11px;
527
+ padding: 0 5px;
528
+ margin: 6px 0;
529
+ background-clip: content-box;
530
+ }
531
+ /* A flexible spacer is invisible until you customize: then a dashed box with ⇔. */
532
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-spacer {
533
+ min-width: 40px;
534
+ height: 26px;
535
+ margin: 3px 2px;
536
+ display: flex;
537
+ align-items: center;
538
+ justify-content: center;
539
+ border: 1px dashed var(--mikedown-input-border, rgba(128, 128, 128, 0.5));
540
+ color: var(--mikedown-text-muted, #888);
541
+ font-family: var(--mikedown-font-ui, system-ui, sans-serif);
542
+ font-size: 13px;
543
+ line-height: 1;
544
+ }
545
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-spacer::before {
546
+ content: '⇔';
547
+ }
548
+ /* No hover tooltips while something is being dragged. */
549
+ .mikedown-root.toolbar-drag-active .mikedown-toolbar button[data-tip]::after {
550
+ display: none;
551
+ }
552
+ .mikedown-root.toolbar-drag-active,
553
+ .mikedown-root.toolbar-drag-active * {
554
+ cursor: grabbing !important;
555
+ }
556
+
557
+ /* The tray: a quiet panel under the (possibly wrapped) toolbar. `top` is set
558
+ from the toolbar's height. */
559
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-tray {
560
+ position: absolute;
561
+ top: 40px;
562
+ left: 0;
563
+ right: 0;
564
+ z-index: 99;
565
+ display: flex;
566
+ flex-direction: column;
567
+ gap: 8px;
568
+ max-height: 60%;
569
+ overflow-y: auto;
570
+ padding: 10px 12px;
571
+ background: var(--mikedown-surface-toolbar, #252526);
572
+ border-bottom: 1px solid var(--mikedown-divider, #3c3c3c);
573
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12);
574
+ font-family: var(--mikedown-font-ui, system-ui, sans-serif);
575
+ font-size: 12px;
576
+ line-height: 1.3;
577
+ color: var(--mikedown-text-ui, #cccccc);
578
+ user-select: none;
579
+ transition: background 120ms ease, box-shadow 120ms ease;
580
+ animation: mikedown-tray-in 120ms ease-out;
581
+ }
582
+ @keyframes mikedown-tray-in {
583
+ from { opacity: 0; transform: translateY(-4px); }
584
+ to { opacity: 1; transform: none; }
585
+ }
586
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-tray.is-drop-target {
587
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 7%, var(--mikedown-surface-toolbar, #252526));
588
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--mikedown-accent, #3f51b5) 55%, transparent), 0 6px 16px rgba(0, 0, 0, 0.12);
589
+ }
590
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-heading {
591
+ font-size: 11px;
592
+ font-weight: 600;
593
+ letter-spacing: 0.02em;
594
+ color: var(--mikedown-text-muted, #999);
595
+ }
596
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-items {
597
+ display: flex;
598
+ flex-wrap: wrap;
599
+ gap: 6px;
600
+ }
601
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-item {
602
+ display: flex;
603
+ flex-direction: column;
604
+ align-items: center;
605
+ justify-content: flex-start;
606
+ gap: 4px;
607
+ width: 84px;
608
+ min-height: 62px;
609
+ padding: 7px 4px 6px;
610
+ border: 1px solid var(--mikedown-border, rgba(128, 128, 128, 0.25));
611
+ border-radius: var(--mikedown-radius-sm, 4px);
612
+ background: var(--mikedown-surface, transparent);
613
+ color: var(--mikedown-text-ui, #cccccc);
614
+ font: inherit;
615
+ cursor: grab;
616
+ touch-action: none;
617
+ transition: background 120ms ease, border-color 120ms ease, opacity 120ms ease;
618
+ }
619
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-item:hover {
620
+ background: var(--mikedown-hover, rgba(128, 128, 128, 0.12));
621
+ border-color: var(--mikedown-input-border, rgba(128, 128, 128, 0.4));
622
+ }
623
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-item:focus-visible,
624
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-reset:focus-visible,
625
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-done:focus-visible {
626
+ outline: 2px solid var(--mikedown-toolbar-edit-focus, var(--mikedown-accent, #3f51b5));
627
+ outline-offset: 1px;
628
+ }
629
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-item.toolbar-item-dragging {
630
+ opacity: 0.35;
631
+ }
632
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-label {
633
+ font-size: 11px;
634
+ text-align: center;
635
+ color: var(--mikedown-text-muted, #999);
636
+ overflow-wrap: anywhere;
637
+ }
638
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-footer {
639
+ display: flex;
640
+ align-items: center;
641
+ gap: 12px;
642
+ }
643
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-hint {
644
+ flex: 1 1 auto;
645
+ color: var(--mikedown-text-muted, #999);
646
+ font-size: 11px;
647
+ }
648
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-reset {
649
+ background: none;
650
+ border: none;
651
+ padding: 4px 2px;
652
+ font: inherit;
653
+ color: var(--mikedown-link, #3794ff);
654
+ cursor: pointer;
655
+ border-radius: 2px;
656
+ }
657
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-reset:hover:not(:disabled) {
658
+ text-decoration: underline;
659
+ }
660
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-reset:disabled {
661
+ color: var(--mikedown-text-muted, #999);
662
+ opacity: 0.6;
663
+ cursor: default;
664
+ }
665
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-done {
666
+ padding: 5px 18px;
667
+ border: 1px solid var(--mikedown-button-border, transparent);
668
+ border-radius: var(--mikedown-radius-sm, 4px);
669
+ background: var(--mikedown-accent, #0e639c);
670
+ color: var(--mikedown-accent-text, #ffffff);
671
+ font: inherit;
672
+ font-size: 12px;
673
+ font-weight: 500;
674
+ cursor: pointer;
675
+ transition: background 120ms ease;
676
+ }
677
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-done:hover {
678
+ background: var(--mikedown-accent-hover, #1177bb);
679
+ }
680
+ /* Screen reader only: the tray's live region (keyboard moves, adds and removals). */
681
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-status {
682
+ position: absolute;
683
+ width: 1px;
684
+ height: 1px;
685
+ overflow: hidden;
686
+ clip: rect(0 0 0 0);
687
+ white-space: nowrap;
688
+ }
689
+
690
+ /* Item pictures in tray tiles and the drag ghost: icons only, toolbar sizes. */
691
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview {
692
+ display: inline-flex;
693
+ align-items: center;
694
+ justify-content: center;
695
+ gap: 1px;
696
+ min-height: 28px;
697
+ color: var(--mikedown-icon, #c5c5c5);
698
+ font-family: var(--mikedown-font-ui, system-ui, sans-serif);
699
+ pointer-events: none;
700
+ }
701
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview-btn {
702
+ display: inline-flex;
703
+ align-items: center;
704
+ justify-content: center;
705
+ gap: 2px;
706
+ min-width: 24px;
707
+ padding: 0 3px;
708
+ font-size: 13px;
709
+ line-height: 1;
710
+ }
711
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview-btn svg {
712
+ width: 18px;
713
+ height: 18px;
714
+ }
715
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview-btn .condensed-btn-label {
716
+ font-weight: 600;
717
+ }
718
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview-btn .condensed-chevron svg {
719
+ width: 10px;
720
+ height: 10px;
721
+ }
722
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview-sep {
723
+ display: block;
724
+ width: 1px;
725
+ height: 22px;
726
+ background: var(--mikedown-text-muted, #999);
727
+ opacity: 0.6;
728
+ }
729
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview-spacer {
730
+ display: flex;
731
+ align-items: center;
732
+ justify-content: center;
733
+ width: 44px;
734
+ height: 22px;
735
+ border: 1px dashed var(--mikedown-input-border, rgba(128, 128, 128, 0.5));
736
+ border-radius: 3px;
737
+ font-size: 13px;
738
+ color: var(--mikedown-text-muted, #999);
739
+ }
740
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-preview-spacer::before {
741
+ content: '⇔';
742
+ }
743
+
744
+ /* The ghost: the item lifted off the toolbar, following the pointer. */
745
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-ghost {
746
+ position: fixed;
747
+ z-index: 10000;
748
+ pointer-events: none;
749
+ padding: 4px 6px;
750
+ border-radius: var(--mikedown-radius-sm, 4px);
751
+ background: var(--mikedown-surface-raised, #252526);
752
+ border: 1px solid var(--mikedown-border, rgba(128, 128, 128, 0.3));
753
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22), 0 1px 3px rgba(0, 0, 0, 0.12);
754
+ scale: 1.02;
755
+ opacity: 0.95;
756
+ animation: mikedown-ghost-lift 120ms ease-out;
757
+ }
758
+ @keyframes mikedown-ghost-lift {
759
+ from { scale: 1; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); }
760
+ to { scale: 1.02; box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22), 0 1px 3px rgba(0, 0, 0, 0.12); }
761
+ }
762
+
763
+ /* The insertion line: where a drop would land on the toolbar. */
764
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-drop-line {
765
+ position: fixed;
766
+ z-index: 10001;
767
+ width: 2px;
768
+ border-radius: 1px;
769
+ background: var(--mikedown-accent, #3f51b5);
770
+ pointer-events: none;
771
+ }
772
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-drop-line[hidden] {
773
+ display: none;
774
+ }
775
+
776
+ @media (prefers-reduced-motion: reduce) {
777
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-tray,
778
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-ghost {
779
+ animation: none;
780
+ }
781
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-ghost { scale: 1; }
782
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > .toolbar-item-grabbed {
783
+ translate: none;
784
+ scale: none;
785
+ transition: none;
786
+ }
787
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing .toolbar-item-movable,
788
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-item,
789
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-done,
790
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-tray {
791
+ transition: none;
792
+ }
793
+ }
794
+
795
+ @media (forced-colors: active) {
796
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-drop-line { background: Highlight; }
797
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar-tray.is-drop-target { outline: 2px dashed Highlight; }
798
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > :focus-visible,
799
+ :is(.mikedown-root, .mikedown-portal) .toolbar-tray-item:focus-visible { outline-color: Highlight; }
800
+ /* Tints vanish in forced colors: a thicker double ring marks the picked-up item. */
801
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar.toolbar-editing > .toolbar-item-grabbed { outline: 4px double Highlight; }
802
+ }
803
+
428
804
  /* MikeDown Editor — Webview Styles */
429
805
 
430
806
  /* Zero-specificity reset so third-party styles inside the editor (KaTeX,
@@ -708,6 +1084,12 @@
708
1084
  padding-left: 1.5em;
709
1085
  margin: 0.5em 0;
710
1086
  }
1087
+ /* Markers are set explicitly so a page reset (Tailwind preflight's
1088
+ `ul, ol { list-style: none }`) cannot strip them. Task lists override this. */
1089
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul { list-style-type: disc; }
1090
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul ul { list-style-type: circle; }
1091
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul ul ul { list-style-type: square; }
1092
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ol { list-style-type: decimal; }
711
1093
  :is(.mikedown-root, .mikedown-portal) .ProseMirror li {
712
1094
  margin: 0.15em 0;
713
1095
  }
@@ -918,19 +1300,83 @@
918
1300
  margin-top: 0.2em;
919
1301
  }
920
1302
 
1303
+ /* The checkbox is drawn by hand so its click target can be 24 by 24px (WCAG
1304
+ 2.5.8) while the box still looks 14px: the input is 24px square, a -5px
1305
+ margin keeps the old 14px footprint in the line, and ::before draws the box
1306
+ inside it (::after the tick). */
921
1307
  :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"] {
1308
+ appearance: none;
1309
+ -webkit-appearance: none;
1310
+ position: relative;
1311
+ display: block;
1312
+ width: 24px;
1313
+ height: 24px;
1314
+ margin: -5px;
1315
+ border: 0;
1316
+ background: transparent;
922
1317
  cursor: pointer;
923
- width: 14px;
924
- height: 14px;
925
- accent-color: var(--mikedown-link, #3794ff);
1318
+ }
1319
+
1320
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"]::before {
1321
+ content: '';
1322
+ position: absolute;
1323
+ inset: 5px;
1324
+ border: 1.5px solid var(--mikedown-text-muted, #6f6f74);
1325
+ border-radius: 3px;
1326
+ background: var(--mikedown-input-bg, transparent);
1327
+ }
1328
+
1329
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"]:checked::before {
1330
+ border-color: var(--mikedown-link, #3794ff);
1331
+ background: var(--mikedown-link, #3794ff);
1332
+ }
1333
+
1334
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"]:checked::after {
1335
+ content: '';
1336
+ position: absolute;
1337
+ left: 10px;
1338
+ top: 7px;
1339
+ width: 4px;
1340
+ height: 8px;
1341
+ border: solid var(--mikedown-surface, #ffffff);
1342
+ border-width: 0 2px 2px 0;
1343
+ transform: rotate(45deg);
1344
+ }
1345
+
1346
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"]:focus-visible {
1347
+ outline: none;
1348
+ }
1349
+
1350
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"]:focus-visible::before {
1351
+ outline: 2px solid var(--mikedown-focus-ring, #3794ff);
1352
+ outline-offset: 1px;
1353
+ }
1354
+
1355
+ /* Forced colors repaint the hand-drawn box, which would hide the checked
1356
+ state; use the native control there. */
1357
+ @media (forced-colors: active) {
1358
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"] {
1359
+ appearance: auto;
1360
+ -webkit-appearance: checkbox;
1361
+ width: 14px;
1362
+ height: 14px;
1363
+ margin: 0;
1364
+ }
1365
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"]::before,
1366
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > label input[type="checkbox"]::after {
1367
+ content: none;
1368
+ }
926
1369
  }
927
1370
 
928
1371
  :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li > div {
929
1372
  flex: 1;
930
1373
  }
931
1374
 
1375
+ /* Done items: muted text plus a strikethrough. A muted color rather than
1376
+ opacity, so the text keeps at least 4.5:1 contrast (opacity 0.6 left it at
1377
+ about 3.9:1 on white). */
932
1378
  :is(.mikedown-root, .mikedown-portal) .ProseMirror ul[data-type="taskList"] li[data-checked="true"] > div {
933
- opacity: 0.6;
1379
+ color: var(--mikedown-text-muted, #6f6f74);
934
1380
  text-decoration: line-through;
935
1381
  }
936
1382
 
@@ -1134,16 +1580,11 @@
1134
1580
  background: var(--mikedown-selection, rgba(38,79,120,0.4)) !important;
1135
1581
  }
1136
1582
 
1137
- /* Column resize handle */
1138
- :is(.mikedown-root, .mikedown-portal) .ProseMirror .column-resize-handle {
1139
- position: absolute;
1140
- right: -2px;
1141
- top: 0;
1142
- bottom: 0;
1143
- width: 4px;
1144
- background: var(--mikedown-focus-ring);
1145
- pointer-events: none;
1146
- border-radius: 2px;
1583
+ /* Select Table: the whole table as a node selection */
1584
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror table.ProseMirror-selectednode,
1585
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .tableWrapper.ProseMirror-selectednode table {
1586
+ outline: 2px solid var(--mikedown-focus-ring);
1587
+ outline-offset: 1px;
1147
1588
  }
1148
1589
 
1149
1590
  /* ═══ images.css ═══ */
@@ -1491,8 +1932,11 @@
1491
1932
 
1492
1933
  /* Frontmatter Block */
1493
1934
 
1935
+ /* In flow above the document inside the scrolling container, with the same
1936
+ column as #editor. */
1494
1937
  :is(.mikedown-root, .mikedown-portal) .frontmatter-block {
1495
- margin-bottom: 1em;
1938
+ max-width: var(--mikedown-content-width, 100%);
1939
+ margin: 0 auto 1em;
1496
1940
  border: 1px solid var(--mikedown-border, rgba(128,128,128,0.2));
1497
1941
  border-radius: var(--mikedown-radius, 6px);
1498
1942
  overflow: hidden;
@@ -1532,8 +1976,8 @@
1532
1976
  font-family: var(--mikedown-font-mono, monospace);
1533
1977
  font-size: 0.85em;
1534
1978
  line-height: 1.5;
1535
- white-space: pre;
1536
- overflow-x: auto;
1979
+ white-space: pre-wrap;
1980
+ overflow-wrap: anywhere;
1537
1981
  outline: none;
1538
1982
  background: transparent;
1539
1983
  color: var(--mikedown-text);
@@ -1706,13 +2150,76 @@
1706
2150
  margin-bottom: 0.25em;
1707
2151
  }
1708
2152
 
1709
- /* ═══ links.css ═══ */
1710
- /* Link Navigation & Anchor System */
2153
+ /* ═══ toc.css ═══ */
2154
+ /* Table of contents block (see toc-node.ts). */
1711
2155
 
1712
- /* Link styles */
1713
- :is(.mikedown-root, .mikedown-portal) .ProseMirror a {
1714
- color: var(--mikedown-link, #4e9de0);
1715
- text-decoration: none;
2156
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc {
2157
+ margin: 1em 0;
2158
+ padding: 0.6em 1em 0.7em;
2159
+ border: 1px solid var(--mikedown-divider);
2160
+ border-radius: var(--mikedown-radius-sm);
2161
+ font-size: 0.95em;
2162
+ cursor: default;
2163
+ }
2164
+
2165
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc.ProseMirror-selectednode {
2166
+ outline: 2px solid var(--mikedown-focus-ring);
2167
+ outline-offset: 1px;
2168
+ }
2169
+
2170
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc-title {
2171
+ margin-bottom: 0.3em;
2172
+ font-size: 0.8em;
2173
+ font-weight: 600;
2174
+ letter-spacing: 0.04em;
2175
+ text-transform: uppercase;
2176
+ color: var(--mikedown-text-muted);
2177
+ }
2178
+
2179
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc ul {
2180
+ margin: 0;
2181
+ padding-left: 1.2em;
2182
+ list-style: none;
2183
+ }
2184
+
2185
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc > ul {
2186
+ padding-left: 0;
2187
+ }
2188
+
2189
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc li {
2190
+ margin: 0.15em 0;
2191
+ }
2192
+
2193
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc a {
2194
+ color: var(--mikedown-link);
2195
+ text-decoration: none;
2196
+ cursor: pointer;
2197
+ }
2198
+
2199
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc a:hover {
2200
+ text-decoration: underline;
2201
+ }
2202
+
2203
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc-empty {
2204
+ margin: 0;
2205
+ color: var(--mikedown-text-muted);
2206
+ font-style: italic;
2207
+ }
2208
+
2209
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc-raw {
2210
+ margin: 0;
2211
+ font-family: var(--mikedown-font-mono);
2212
+ font-size: 0.9em;
2213
+ white-space: pre-wrap;
2214
+ }
2215
+
2216
+ /* ═══ links.css ═══ */
2217
+ /* Link Navigation & Anchor System */
2218
+
2219
+ /* Link styles */
2220
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror a {
2221
+ color: var(--mikedown-link, #4e9de0);
2222
+ text-decoration: none;
1716
2223
  border-bottom: 1px solid color-mix(in srgb, var(--mikedown-link, #4e9de0) 35%, transparent);
1717
2224
  transition: color 0.12s ease, border-color 0.12s ease;
1718
2225
  cursor: text;
@@ -2089,6 +2596,12 @@
2089
2596
  margin-bottom: 8px;
2090
2597
  }
2091
2598
 
2599
+ :is(.mikedown-root, .mikedown-portal) .tp-grid:focus-visible,
2600
+ :is(.mikedown-root, .mikedown-portal) .tp-ok:focus-visible {
2601
+ outline: 2px solid var(--mikedown-focus-ring, #007fd4);
2602
+ outline-offset: 2px;
2603
+ }
2604
+
2092
2605
  :is(.mikedown-root, .mikedown-portal) .tp-cell {
2093
2606
  width: 18px;
2094
2607
  height: 18px;
@@ -2168,7 +2681,9 @@
2168
2681
  z-index: 999;
2169
2682
  display: inline-flex;
2170
2683
  flex-direction: row;
2171
- flex-wrap: nowrap;
2684
+ /* Wraps to a second row on a phone instead of running off the screen. */
2685
+ flex-wrap: wrap;
2686
+ max-width: calc(100vw - 8px);
2172
2687
  align-items: center;
2173
2688
  gap: 2px;
2174
2689
  background: var(--mikedown-surface-raised, var(--mikedown-surface));
@@ -2250,28 +2765,38 @@
2250
2765
  display: flex;
2251
2766
  align-items: center;
2252
2767
  justify-content: center;
2253
- width: 16px;
2254
- height: 16px;
2255
- font-size: 10px;
2256
- color: var(--mikedown-text);
2768
+ width: 18px;
2769
+ height: 18px;
2770
+ /* The grip icon is drawn in currentColor: muted text works on both themes,
2771
+ and the raised surface plus an edge keep it visible on a page-coloured
2772
+ background. */
2773
+ color: var(--mikedown-text-muted, var(--mikedown-text));
2257
2774
  opacity: 0;
2258
2775
  cursor: grab;
2259
- border-radius: 3px;
2776
+ border-radius: 4px;
2777
+ border: 1px solid color-mix(in srgb, var(--mikedown-text-muted, #888) 40%, transparent);
2778
+ box-sizing: border-box;
2260
2779
  user-select: none;
2261
- background: var(--mikedown-surface-raised, transparent);
2262
- transition: opacity 0.15s ease, background 0.1s ease;
2780
+ background: var(--mikedown-surface-raised, var(--mikedown-surface, transparent));
2781
+ transition: opacity 0.15s ease, background 0.1s ease, color 0.1s ease;
2782
+ pointer-events: none;
2783
+ }
2784
+
2785
+ :is(.mikedown-root, .mikedown-portal) .td-handle svg {
2786
+ display: block;
2263
2787
  pointer-events: none;
2264
2788
  }
2265
2789
 
2266
2790
  /* Handles are on document.body, not siblings of the table, so we use a
2267
2791
  class toggled by JS instead of a sibling combinator. */
2268
2792
  :is(.mikedown-root, .mikedown-portal) .td-handles-visible .td-handle {
2269
- opacity: 0.5;
2793
+ opacity: 0.85;
2270
2794
  pointer-events: auto;
2271
2795
  }
2272
2796
 
2273
2797
  :is(.mikedown-root, .mikedown-portal) .td-handles-visible .td-handle:hover {
2274
2798
  opacity: 1;
2799
+ color: var(--mikedown-text);
2275
2800
  background: var(--mikedown-hover, rgba(90,93,94,0.31));
2276
2801
  }
2277
2802
 
@@ -2308,32 +2833,46 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2308
2833
  width: 2px;
2309
2834
  }
2310
2835
 
2311
- /* Multi-Cell Selection */
2312
-
2313
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-selected,
2314
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-selected {
2315
- background: color-mix(in srgb, var(--mikedown-focus-ring, #007fd4) 15%, transparent) !important;
2316
- position: relative;
2836
+ /* Hover "+" strips: add a column (right of the header row) or a row (under
2837
+ the last row). They exist only while the pointer is over or near a table. */
2838
+ :is(.mikedown-root, .mikedown-portal) .td-add {
2839
+ position: fixed;
2840
+ z-index: 898;
2841
+ display: flex;
2842
+ align-items: center;
2843
+ justify-content: center;
2844
+ box-sizing: border-box;
2845
+ color: var(--mikedown-text-muted, var(--mikedown-text));
2846
+ background: color-mix(in srgb, var(--mikedown-text-muted, #888) 12%, transparent);
2847
+ border: 1px dashed color-mix(in srgb, var(--mikedown-text-muted, #888) 45%, transparent);
2848
+ border-radius: 4px;
2849
+ cursor: pointer;
2850
+ user-select: none;
2851
+ opacity: 0.8;
2852
+ animation: mikedown-td-add-in 0.12s ease-out;
2853
+ transition: background 0.1s ease, color 0.1s ease, opacity 0.1s ease;
2317
2854
  }
2318
2855
 
2319
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-top,
2320
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-top {
2321
- border-top: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2856
+ :is(.mikedown-root, .mikedown-portal) .td-add:hover {
2857
+ opacity: 1;
2858
+ color: var(--mikedown-accent-text, #fff);
2859
+ background: var(--mikedown-accent, #0e639c);
2860
+ border-style: solid;
2861
+ border-color: var(--mikedown-accent, #0e639c);
2322
2862
  }
2323
2863
 
2324
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-bottom,
2325
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-bottom {
2326
- border-bottom: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2864
+ @keyframes mikedown-td-add-in {
2865
+ from { opacity: 0; }
2866
+ to { opacity: 0.8; }
2327
2867
  }
2328
2868
 
2329
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-left,
2330
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-left {
2331
- border-left: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2869
+ @media (prefers-reduced-motion: reduce) {
2870
+ :is(.mikedown-root, .mikedown-portal) .td-add { animation: none; }
2332
2871
  }
2333
2872
 
2334
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-right,
2335
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-right {
2336
- border-right: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2873
+ /* No strips while a row or column is being dragged. */
2874
+ body.td-dragging :is(.mikedown-root, .mikedown-portal) .td-add {
2875
+ display: none;
2337
2876
  }
2338
2877
 
2339
2878
  /* ═══ tasklist.css ═══ */
@@ -2600,6 +3139,12 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2600
3139
  outline-offset: -2px;
2601
3140
  }
2602
3141
 
3142
+ /* Disabled item (e.g. an overflowed Zoom In at the maximum size). */
3143
+ :is(.mikedown-root, .mikedown-portal) .tdd-item.tdd-disabled {
3144
+ opacity: 0.4;
3145
+ cursor: default;
3146
+ }
3147
+
2603
3148
  :is(.mikedown-root, .mikedown-portal) .tdd-item-icon {
2604
3149
  display: inline-flex;
2605
3150
  align-items: center;
@@ -2620,6 +3165,60 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2620
3165
  text-overflow: ellipsis;
2621
3166
  }
2622
3167
 
3168
+ /* A muted note under the label (e.g. why the item is disabled). It takes its
3169
+ own line so a long reason never squeezes the label; the item's tooltip has
3170
+ the same text. */
3171
+ :is(.mikedown-root, .mikedown-portal) .tdd-item:has(> .tdd-item-hint) {
3172
+ flex-wrap: wrap;
3173
+ height: auto;
3174
+ min-height: 28px;
3175
+ padding-top: 4px;
3176
+ padding-bottom: 4px;
3177
+ row-gap: 0;
3178
+ }
3179
+
3180
+ :is(.mikedown-root, .mikedown-portal) .tdd-item-hint {
3181
+ flex: 1 0 100%;
3182
+ /* Under the label: past the icon (18px) and the gap (8px). */
3183
+ padding-left: 26px;
3184
+ font-size: 11px;
3185
+ line-height: 1.35;
3186
+ white-space: normal;
3187
+ color: var(--mikedown-text-muted);
3188
+ }
3189
+
3190
+ /* Status row: a note, not an action. Warning icon, label, muted detail line. */
3191
+ :is(.mikedown-root, .mikedown-portal) .tdd-status {
3192
+ display: grid;
3193
+ grid-template-columns: 18px 1fr;
3194
+ column-gap: 8px;
3195
+ align-items: start;
3196
+ padding: 6px 10px;
3197
+ margin: 0 4px;
3198
+ border-radius: 4px;
3199
+ font-size: 12px;
3200
+ line-height: 1.35;
3201
+ color: var(--mikedown-text);
3202
+ background: color-mix(in srgb, var(--mikedown-warning, #b26a00) 12%, transparent);
3203
+ cursor: default;
3204
+ user-select: text;
3205
+ }
3206
+
3207
+ :is(.mikedown-root, .mikedown-portal) .tdd-status-icon {
3208
+ display: flex;
3209
+ align-items: center;
3210
+ height: 1.35em;
3211
+ color: var(--mikedown-warning, #b26a00);
3212
+ }
3213
+
3214
+ :is(.mikedown-root, .mikedown-portal) .tdd-status-detail {
3215
+ grid-column: 2;
3216
+ font-size: 11px;
3217
+ white-space: normal;
3218
+ overflow-wrap: anywhere;
3219
+ color: var(--mikedown-text-muted);
3220
+ }
3221
+
2623
3222
  /* Active indicator — small dot on the left */
2624
3223
  :is(.mikedown-root, .mikedown-portal) .tdd-item-active-indicator {
2625
3224
  display: none;
@@ -2700,6 +3299,40 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2700
3299
  :is(.mikedown-root, .mikedown-portal) #toolbar-dropdown { forced-color-adjust: auto; }
2701
3300
  }
2702
3301
 
3302
+ /* Segmented row: a labelled radio group (the AI menu's Thinking row). */
3303
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-row {
3304
+ display: flex;
3305
+ align-items: center;
3306
+ padding: 3px 8px 5px;
3307
+ }
3308
+
3309
+ /* A segmented row's announcement ("Thinking: High"): read out, never shown. */
3310
+ :is(.mikedown-root, .mikedown-portal) .tdd-sr {
3311
+ position: absolute;
3312
+ width: 1px;
3313
+ height: 1px;
3314
+ overflow: hidden;
3315
+ clip: rect(0 0 0 0);
3316
+ white-space: nowrap;
3317
+ }
3318
+
3319
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-row > .tdd-seg {
3320
+ display: inline-flex;
3321
+ align-items: center;
3322
+ margin-left: 0;
3323
+ white-space: nowrap;
3324
+ }
3325
+
3326
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-btn {
3327
+ cursor: pointer;
3328
+ outline: none;
3329
+ }
3330
+
3331
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-btn.tdd-focused {
3332
+ outline: 2px solid var(--mikedown-focus-ring);
3333
+ outline-offset: 0;
3334
+ }
3335
+
2703
3336
  /* ═══ outline-sidebar.css ═══ */
2704
3337
  /* ─── In-Editor Document Sidebar ─────────────────────────────────────────── */
2705
3338
  /* Hosts (top-to-bottom): optional Properties section, Outline, Backlinks,
@@ -2858,6 +3491,8 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2858
3491
 
2859
3492
  /* ─── Header buttons: position toggle + pin (Outline header only) ────────── */
2860
3493
 
3494
+ :is(.mikedown-root, .mikedown-portal) .outline-fold-all,
3495
+ :is(.mikedown-root, .mikedown-portal) .outline-unfold-all,
2861
3496
  :is(.mikedown-root, .mikedown-portal) .outline-position-toggle,
2862
3497
  :is(.mikedown-root, .mikedown-portal) .outline-pin {
2863
3498
  width: 22px;
@@ -2875,6 +3510,8 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2875
3510
  transition: background-color 0.12s ease, opacity 0.12s ease, color 0.12s ease;
2876
3511
  }
2877
3512
 
3513
+ :is(.mikedown-root, .mikedown-portal) .outline-fold-all:hover,
3514
+ :is(.mikedown-root, .mikedown-portal) .outline-unfold-all:hover,
2878
3515
  :is(.mikedown-root, .mikedown-portal) .outline-position-toggle:hover,
2879
3516
  :is(.mikedown-root, .mikedown-portal) .outline-pin:hover {
2880
3517
  opacity: 1;
@@ -2937,12 +3574,55 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2937
3574
  opacity: 1;
2938
3575
  }
2939
3576
 
2940
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-1 { padding-left: 10px; }
2941
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-2 { padding-left: 22px; }
2942
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-3 { padding-left: 34px; }
2943
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-4 { padding-left: 46px; }
2944
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-5 { padding-left: 58px; }
2945
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-6 { padding-left: 70px; }
3577
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-1 { padding-left: 24px; }
3578
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-2 { padding-left: 36px; }
3579
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-3 { padding-left: 48px; }
3580
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-4 { padding-left: 60px; }
3581
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-5 { padding-left: 72px; }
3582
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-6 { padding-left: 84px; }
3583
+
3584
+ /* Fold chevron: sits in the 14px gutter just before the heading text. */
3585
+ :is(.mikedown-root, .mikedown-portal) .outline-row {
3586
+ position: relative;
3587
+ }
3588
+
3589
+ :is(.mikedown-root, .mikedown-portal) .outline-fold {
3590
+ position: absolute;
3591
+ top: 0;
3592
+ bottom: 0;
3593
+ z-index: 1;
3594
+ width: 14px;
3595
+ padding: 0;
3596
+ background: transparent;
3597
+ border: 0;
3598
+ border-radius: 3px;
3599
+ color: var(--mikedown-text, #d4d4d4);
3600
+ font-size: 10px;
3601
+ line-height: 1;
3602
+ opacity: 0.55;
3603
+ cursor: pointer;
3604
+ }
3605
+
3606
+ :is(.mikedown-root, .mikedown-portal) .outline-fold-icon {
3607
+ display: inline-block;
3608
+ transition: transform 120ms ease-out;
3609
+ }
3610
+
3611
+ :is(.mikedown-root, .mikedown-portal) .outline-fold:hover {
3612
+ opacity: 1;
3613
+ background-color: var(--mikedown-hover, rgba(127, 127, 127, 0.18));
3614
+ }
3615
+
3616
+ :is(.mikedown-root, .mikedown-portal) .outline-row.folded .outline-fold-icon {
3617
+ transform: rotate(-90deg);
3618
+ }
3619
+
3620
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-1 .outline-fold { left: 10px; }
3621
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-2 .outline-fold { left: 22px; }
3622
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-3 .outline-fold { left: 34px; }
3623
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-4 .outline-fold { left: 46px; }
3624
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-5 .outline-fold { left: 58px; }
3625
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-6 .outline-fold { left: 70px; }
2946
3626
 
2947
3627
  /* ─── Backlink items ─────────────────────────────────────────────────────── */
2948
3628
 
@@ -3339,63 +4019,286 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
3339
4019
  color: var(--mikedown-text, #d4d4d4);
3340
4020
  }
3341
4021
 
3342
- /* ─── Footer strip ───────────────────────────────────────────────────────── */
4022
+ /* ─── Properties suggestions (AI) ────────────────────────────────────────── */
3343
4023
 
3344
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer {
4024
+ /* Suggest (sparkle) at the right of the Properties header; aria-disabled with
4025
+ the router's reason as its tooltip when nothing can serve it. */
4026
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn {
4027
+ width: 22px;
4028
+ height: 22px;
4029
+ display: inline-flex;
4030
+ align-items: center;
4031
+ justify-content: center;
3345
4032
  flex: 0 0 auto;
3346
- padding: 6px 12px;
3347
- border-top: 1px solid var(--mikedown-divider, #3c3c3c);
3348
- font-size: 10.5px;
3349
- opacity: 0.75;
3350
- color: var(--mikedown-text-muted, #a0a0a0);
3351
- font-variant-numeric: tabular-nums;
4033
+ background: transparent;
4034
+ border: 1px solid transparent;
4035
+ border-radius: 3px;
4036
+ color: var(--mikedown-icon, #d4d4d4);
4037
+ opacity: 0.55;
4038
+ cursor: pointer;
4039
+ padding: 0;
4040
+ transition: background-color 0.12s ease, opacity 0.12s ease;
4041
+ }
4042
+
4043
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn[hidden] {
4044
+ display: none;
4045
+ }
4046
+
4047
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn:hover:not(.disabled),
4048
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn:focus-visible {
4049
+ opacity: 1;
4050
+ background-color: var(--mikedown-hover, rgba(127, 127, 127, 0.18));
4051
+ }
4052
+
4053
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.disabled {
4054
+ opacity: 0.3;
4055
+ cursor: default;
4056
+ }
4057
+
4058
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest {
3352
4059
  display: flex;
3353
4060
  flex-direction: column;
3354
- gap: 2px;
4061
+ gap: 6px;
4062
+ /* Same inset as .properties-row, so chips line up with the keys above. */
4063
+ padding: 4px 10px 6px;
4064
+ font-size: 11px;
4065
+ color: var(--mikedown-text, #d4d4d4);
3355
4066
  }
3356
4067
 
3357
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row {
3358
- white-space: nowrap;
3359
- overflow: hidden;
3360
- text-overflow: ellipsis;
4068
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest[hidden] {
4069
+ display: none;
3361
4070
  }
3362
4071
 
3363
- /* Rows wrapper is rebuilt each render; it lays out as if the rows were direct
3364
- children of the footer column. */
3365
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-rows {
3366
- display: contents;
4072
+ /* Running: a thin indeterminate line, then the engine badge text. */
4073
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-progress {
4074
+ position: relative;
4075
+ height: 2px;
4076
+ overflow: hidden;
4077
+ border-radius: 1px;
4078
+ background-color: color-mix(in srgb, var(--mikedown-focus-ring, #007fd4) 18%, transparent);
3367
4079
  }
3368
4080
 
3369
- /* Persistent live region for the dismiss confirmation. Empty most of the
3370
- time; the negative margin cancels the footer's row gap so it adds no
3371
- height while empty. */
3372
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status {
3373
- white-space: normal;
4081
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-progress::after {
4082
+ content: '';
4083
+ position: absolute;
4084
+ inset: 0 auto 0 0;
4085
+ width: 35%;
4086
+ background-color: var(--mikedown-focus-ring, #007fd4);
4087
+ animation: mikedown-suggest-progress 1.1s ease-in-out infinite;
3374
4088
  }
3375
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status:empty {
3376
- margin-top: -2px;
4089
+
4090
+ @keyframes mikedown-suggest-progress {
4091
+ from { transform: translateX(-100%); }
4092
+ to { transform: translateX(300%); }
3377
4093
  }
3378
4094
 
3379
- /* ─── Support MikeDown footer link (review appeal M6) ─────────────────────
3380
- Metrics and the link group each draw a leading middle dot. The items
3381
- wrapper is shifted left by one separator width and clipped by the row, so
3382
- the item that starts a line never shows its dot. When the sidebar is too
3383
- narrow the whole link group wraps to its own line. */
3384
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row--with-support {
3385
- white-space: normal;
3386
- text-overflow: clip;
4095
+ @media (prefers-reduced-motion: reduce) {
4096
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-progress::after {
4097
+ animation: none;
4098
+ width: 100%;
4099
+ opacity: 0.5;
4100
+ }
3387
4101
  }
3388
4102
 
3389
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-items {
3390
- --sidebar-footer-sep: 0.95em;
4103
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-status {
3391
4104
  display: flex;
3392
- flex-wrap: wrap;
3393
4105
  align-items: center;
3394
- row-gap: 2px;
3395
- margin-left: calc(-1 * var(--sidebar-footer-sep));
4106
+ gap: 6px;
4107
+ min-width: 0;
4108
+ color: var(--mikedown-text-muted, #a0a0a0);
3396
4109
  }
3397
4110
 
3398
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-item {
4111
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-message {
4112
+ flex: 1 1 auto;
4113
+ min-width: 0;
4114
+ overflow: hidden;
4115
+ text-overflow: ellipsis;
4116
+ white-space: nowrap;
4117
+ }
4118
+
4119
+ /* Why the disabled Suggest cannot run: wraps (it can be a sentence or two). */
4120
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-reason {
4121
+ flex: 1 1 auto;
4122
+ min-width: 0;
4123
+ line-height: 1.4;
4124
+ }
4125
+
4126
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-error {
4127
+ color: var(--mikedown-danger, #f48771);
4128
+ line-height: 1.4;
4129
+ }
4130
+
4131
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-note {
4132
+ color: var(--mikedown-warning, #b26a00);
4133
+ line-height: 1.4;
4134
+ }
4135
+
4136
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-actions {
4137
+ display: flex;
4138
+ gap: 8px;
4139
+ }
4140
+
4141
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-action {
4142
+ background: transparent;
4143
+ border: 0;
4144
+ padding: 0;
4145
+ font: inherit;
4146
+ color: var(--mikedown-link, #3794ff);
4147
+ cursor: pointer;
4148
+ }
4149
+
4150
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-action:hover {
4151
+ text-decoration: underline;
4152
+ }
4153
+
4154
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-chips {
4155
+ display: flex;
4156
+ flex-wrap: wrap;
4157
+ gap: 4px;
4158
+ min-width: 0;
4159
+ }
4160
+
4161
+ /* Suggested chips: the tag pill look with a dashed outline. */
4162
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip {
4163
+ padding: 0 2px 0 0;
4164
+ background-color: transparent;
4165
+ border: 1px dashed color-mix(in srgb, var(--mikedown-text, #d4d4d4) 45%, transparent);
4166
+ }
4167
+
4168
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag {
4169
+ background-color: color-mix(in srgb, var(--mikedown-link, #3794ff) 8%, transparent);
4170
+ border-color: color-mix(in srgb, var(--mikedown-link, #3794ff) 60%, transparent);
4171
+ }
4172
+
4173
+ /* The `#` sits inside the apply button, not before it. */
4174
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag::before {
4175
+ content: none;
4176
+ }
4177
+
4178
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag .properties-pill-text::before {
4179
+ content: '#';
4180
+ opacity: 0.6;
4181
+ }
4182
+
4183
+ /* Title and description: one line, ellipsis, the full text in the tooltip. */
4184
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip:is([data-kind="title"], [data-kind="description"]) {
4185
+ flex: 1 1 100%;
4186
+ }
4187
+
4188
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-apply {
4189
+ display: inline-flex;
4190
+ align-items: center;
4191
+ gap: 4px;
4192
+ min-width: 0;
4193
+ flex: 1 1 auto;
4194
+ padding: 1px 2px 1px 6px;
4195
+ background: transparent;
4196
+ border: 0;
4197
+ border-radius: inherit;
4198
+ font: inherit;
4199
+ color: inherit;
4200
+ text-align: left;
4201
+ cursor: pointer;
4202
+ }
4203
+
4204
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip:hover {
4205
+ border-style: solid;
4206
+ background-color: var(--mikedown-hover, rgba(127, 127, 127, 0.18));
4207
+ }
4208
+
4209
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag:hover {
4210
+ background-color: color-mix(in srgb, var(--mikedown-link, #3794ff) 22%, transparent);
4211
+ }
4212
+
4213
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-apply:focus-visible,
4214
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-chip .properties-pill-x:focus-visible {
4215
+ outline: 1px solid var(--mikedown-focus-ring, #007fd4);
4216
+ outline-offset: 1px;
4217
+ }
4218
+
4219
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-key {
4220
+ flex: 0 0 auto;
4221
+ font-size: 9.5px;
4222
+ text-transform: uppercase;
4223
+ letter-spacing: 0.04em;
4224
+ color: var(--mikedown-text-muted, #a0a0a0);
4225
+ }
4226
+
4227
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-new {
4228
+ flex: 0 0 auto;
4229
+ padding: 0 3px;
4230
+ border-radius: 3px;
4231
+ font-size: 8.5px;
4232
+ line-height: 1.4;
4233
+ text-transform: uppercase;
4234
+ letter-spacing: 0.04em;
4235
+ color: var(--mikedown-accent-text, #ffffff);
4236
+ background-color: var(--mikedown-accent, var(--mikedown-focus-ring, #0e639c));
4237
+ }
4238
+
4239
+ /* Suggested chips always show their dismiss (×). */
4240
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-chip .properties-pill-x {
4241
+ display: inline-block;
4242
+ flex: 0 0 auto;
4243
+ }
4244
+
4245
+ /* ─── Footer strip ───────────────────────────────────────────────────────── */
4246
+
4247
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer {
4248
+ flex: 0 0 auto;
4249
+ padding: 6px 12px;
4250
+ border-top: 1px solid var(--mikedown-divider, #3c3c3c);
4251
+ font-size: 10.5px;
4252
+ opacity: 0.75;
4253
+ color: var(--mikedown-text-muted, #a0a0a0);
4254
+ font-variant-numeric: tabular-nums;
4255
+ display: flex;
4256
+ flex-direction: column;
4257
+ gap: 2px;
4258
+ }
4259
+
4260
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row {
4261
+ white-space: nowrap;
4262
+ overflow: hidden;
4263
+ text-overflow: ellipsis;
4264
+ }
4265
+
4266
+ /* Rows wrapper is rebuilt each render; it lays out as if the rows were direct
4267
+ children of the footer column. */
4268
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-rows {
4269
+ display: contents;
4270
+ }
4271
+
4272
+ /* Persistent live region for the dismiss confirmation. Empty most of the
4273
+ time; the negative margin cancels the footer's row gap so it adds no
4274
+ height while empty. */
4275
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status {
4276
+ white-space: normal;
4277
+ }
4278
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status:empty {
4279
+ margin-top: -2px;
4280
+ }
4281
+
4282
+ /* ─── Support MikeDown footer link (review appeal M6) ─────────────────────
4283
+ Metrics and the link group each draw a leading middle dot. The items
4284
+ wrapper is shifted left by one separator width and clipped by the row, so
4285
+ the item that starts a line never shows its dot. When the sidebar is too
4286
+ narrow the whole link group wraps to its own line. */
4287
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row--with-support {
4288
+ white-space: normal;
4289
+ text-overflow: clip;
4290
+ }
4291
+
4292
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-items {
4293
+ --sidebar-footer-sep: 0.95em;
4294
+ display: flex;
4295
+ flex-wrap: wrap;
4296
+ align-items: center;
4297
+ row-gap: 2px;
4298
+ margin-left: calc(-1 * var(--sidebar-footer-sep));
4299
+ }
4300
+
4301
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-item {
3399
4302
  white-space: nowrap;
3400
4303
  }
3401
4304
 
@@ -4639,3 +5542,2706 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
4639
5542
  :is(.mikedown-root, .mikedown-portal) .settings-content { padding: 14px 16px; }
4640
5543
  :is(.mikedown-root, .mikedown-portal) .settings-footer { padding: 10px 16px; }
4641
5544
  }
5545
+
5546
+ /* In-modal confirm ("Discard unsaved changes?" before Customize Toolbar…). */
5547
+ :is(.mikedown-root, .mikedown-portal) .settings-modal { position: relative; }
5548
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-backdrop {
5549
+ position: absolute;
5550
+ inset: 0;
5551
+ z-index: 10;
5552
+ display: flex;
5553
+ align-items: center;
5554
+ justify-content: center;
5555
+ padding: 16px;
5556
+ background: rgba(0, 0, 0, 0.28);
5557
+ }
5558
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm {
5559
+ width: min(360px, 100%);
5560
+ padding: 16px 18px 14px;
5561
+ background: var(--mikedown-surface-raised, #252526);
5562
+ border: 1px solid var(--settings-border);
5563
+ border-radius: 8px;
5564
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
5565
+ }
5566
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-title {
5567
+ font-size: 14px;
5568
+ font-weight: 600;
5569
+ margin-bottom: 6px;
5570
+ }
5571
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-text {
5572
+ color: var(--settings-muted);
5573
+ margin-bottom: 14px;
5574
+ }
5575
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-actions {
5576
+ display: flex;
5577
+ justify-content: flex-end;
5578
+ gap: 8px;
5579
+ }
5580
+
5581
+ /* ═══ ai.css ═══ */
5582
+ /* MikeDown — AI settings tab (ai-settings.ts, a summary), the AI Engines
5583
+ * page (ai-engines-page.ts, an overlay from editor.ts), the Express engine
5584
+ * form (ai-engine-form.ts) and the sidebar AI chip.
5585
+ *
5586
+ * Both the tab and the page are built from the Settings modal's own rows and
5587
+ * groups (settings-modal.css); this file only adds what those do not have:
5588
+ * the page shell (header, list pane, detail pane, narrow layout), engine
5589
+ * rows (glyph, local/cloud pill, status dot, switch), the quick-start cards,
5590
+ * the Express form (sheet, models combobox, Advanced fold), the full models
5591
+ * table with capability chips, route pickers and notes. Loaded after
5592
+ * settings-modal.css so it can lean on the --settings-* tokens, which the
5593
+ * page frame gets here as well.
5594
+ */
5595
+
5596
+ /* The page lives outside .settings-modal: it gets the modal's tokens too. */
5597
+ :is(.mikedown-root, .mikedown-portal) .ai-page-frame {
5598
+ --settings-fg: var(--mikedown-text, #d4d4d4);
5599
+ --settings-muted: var(--mikedown-text-muted, rgba(128, 128, 128, 0.9));
5600
+ --settings-border: var(--mikedown-border, rgba(128, 128, 128, 0.35));
5601
+ --settings-divider: var(--mikedown-border, rgba(128, 128, 128, 0.2));
5602
+ --settings-control-border: var(--mikedown-input-border, rgba(128, 128, 128, 0.35));
5603
+ --settings-hover-bg: var(--mikedown-hover, rgba(128, 128, 128, 0.15));
5604
+ --settings-active-bg: var(--mikedown-selected-bg, #0e639c);
5605
+ --settings-active-fg: var(--mikedown-selected-text, #ffffff);
5606
+ --settings-focus: var(--mikedown-focus-ring, #007fd4);
5607
+ }
5608
+
5609
+ :is(.mikedown-root, .mikedown-portal) :is(.settings-modal, .ai-page-frame) {
5610
+ --ai-ok: var(--mikedown-success, #2e7d32);
5611
+ --ai-error: var(--mikedown-danger, #c62828);
5612
+ --ai-warn: var(--mikedown-warning, #b26a00);
5613
+ --ai-info: var(--mikedown-info, #1e70d6);
5614
+ --ai-local: var(--mikedown-success, #2e7d32);
5615
+ --ai-cloud: var(--mikedown-info, #1e70d6);
5616
+ --ai-tile-bg: var(--mikedown-active, rgba(128, 128, 128, 0.18));
5617
+ --ai-row-hover: var(--mikedown-hover, rgba(128, 128, 128, 0.08));
5618
+ --ai-ease: cubic-bezier(0.2, 0, 0, 1);
5619
+ }
5620
+
5621
+ /* Screen-reader-only live region for probe results. */
5622
+ :is(.mikedown-root, .mikedown-portal) .ai-live {
5623
+ position: absolute;
5624
+ width: 1px;
5625
+ height: 1px;
5626
+ margin: -1px;
5627
+ padding: 0;
5628
+ overflow: hidden;
5629
+ clip: rect(0 0 0 0);
5630
+ white-space: nowrap;
5631
+ border: 0;
5632
+ }
5633
+
5634
+ :is(.mikedown-root, .mikedown-portal) .ai-mono {
5635
+ font-family: var(--mikedown-font-mono, ui-monospace, monospace);
5636
+ font-size: 12px;
5637
+ }
5638
+
5639
+ :is(.mikedown-root, .mikedown-portal) .ai-muted {
5640
+ font-size: 12px;
5641
+ color: var(--settings-muted);
5642
+ }
5643
+
5644
+ /* ── Notes (warnings, info, inline results) ─────────────────────────────── */
5645
+
5646
+ :is(.mikedown-root, .mikedown-portal) .ai-note {
5647
+ display: flex;
5648
+ align-items: flex-start;
5649
+ gap: 6px;
5650
+ font-size: 12px;
5651
+ line-height: 1.45;
5652
+ color: var(--settings-muted);
5653
+ }
5654
+ :is(.mikedown-root, .mikedown-portal) .ai-note-icon {
5655
+ display: inline-flex;
5656
+ flex-shrink: 0;
5657
+ margin-top: 2px;
5658
+ }
5659
+ :is(.mikedown-root, .mikedown-portal) .ai-note--warning .ai-note-icon { color: var(--ai-warn); }
5660
+ :is(.mikedown-root, .mikedown-portal) .ai-note--error { color: var(--ai-error); }
5661
+ :is(.mikedown-root, .mikedown-portal) .ai-note--ok .ai-note-icon { color: var(--ai-ok); }
5662
+ :is(.mikedown-root, .mikedown-portal) .ai-note--info .ai-note-icon { color: var(--ai-info); }
5663
+
5664
+ /* Notes and errors span both columns of an inline row (and stay left). */
5665
+ :is(.mikedown-root, .mikedown-portal) .settings-row--inline > .ai-row-note,
5666
+ :is(.mikedown-root, .mikedown-portal) .settings-row--inline > .ai-locality-note,
5667
+ :is(.mikedown-root, .mikedown-portal) .settings-row--inline > .ai-field-error { justify-self: stretch; }
5668
+ :is(.mikedown-root, .mikedown-portal) .ai-row-note,
5669
+ :is(.mikedown-root, .mikedown-portal) .ai-locality-note,
5670
+ :is(.mikedown-root, .mikedown-portal) .ai-field-error {
5671
+ grid-column: 1 / -1;
5672
+ }
5673
+ :is(.mikedown-root, .mikedown-portal) .ai-locality-note:empty,
5674
+ :is(.mikedown-root, .mikedown-portal) .ai-field-error:empty { display: none; }
5675
+
5676
+ :is(.mikedown-root, .mikedown-portal) .ai-field-error {
5677
+ font-size: 12px;
5678
+ color: var(--ai-error);
5679
+ }
5680
+ :is(.mikedown-root, .mikedown-portal) .settings-input[aria-invalid="true"] {
5681
+ border-color: var(--ai-error);
5682
+ }
5683
+
5684
+ /* A result appears with a short fade and rise, so a probe that comes back
5685
+ reads as an answer rather than a layout jump. */
5686
+ :is(.mikedown-root, .mikedown-portal) .ai-result {
5687
+ animation: ai-arrive 220ms var(--ai-ease);
5688
+ }
5689
+ @keyframes ai-arrive {
5690
+ from { opacity: 0; transform: translateY(-2px); }
5691
+ to { opacity: 1; transform: none; }
5692
+ }
5693
+
5694
+ /* ── Pills, tags, glyphs ─────────────────────────────────────────────────── */
5695
+
5696
+ :is(.mikedown-root, .mikedown-portal) .ai-pill {
5697
+ display: inline-flex;
5698
+ align-items: center;
5699
+ gap: 3px;
5700
+ padding: 0 6px;
5701
+ height: 17px;
5702
+ border-radius: 9px;
5703
+ font-size: 10.5px;
5704
+ font-weight: 500;
5705
+ letter-spacing: 0.01em;
5706
+ white-space: nowrap;
5707
+ border: 1px solid transparent;
5708
+ flex-shrink: 0;
5709
+ }
5710
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--local {
5711
+ color: var(--ai-local);
5712
+ background: color-mix(in srgb, var(--ai-local) 12%, transparent);
5713
+ }
5714
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--cloud {
5715
+ color: var(--ai-cloud);
5716
+ background: color-mix(in srgb, var(--ai-cloud) 12%, transparent);
5717
+ }
5718
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--mismatch {
5719
+ border-color: var(--ai-warn);
5720
+ border-style: dashed;
5721
+ }
5722
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--blocked {
5723
+ color: var(--settings-muted);
5724
+ border-color: var(--settings-control-border);
5725
+ }
5726
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--soon {
5727
+ color: var(--settings-muted);
5728
+ border-color: var(--settings-control-border);
5729
+ font-weight: 400;
5730
+ }
5731
+
5732
+ :is(.mikedown-root, .mikedown-portal) .ai-tag {
5733
+ font-size: 10.5px;
5734
+ padding: 0 5px;
5735
+ line-height: 16px;
5736
+ border-radius: 3px;
5737
+ color: var(--settings-muted);
5738
+ background: var(--ai-tile-bg);
5739
+ white-space: nowrap;
5740
+ }
5741
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--loaded {
5742
+ color: var(--ai-ok);
5743
+ background: color-mix(in srgb, var(--ai-ok) 12%, transparent);
5744
+ }
5745
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--loaded::before {
5746
+ content: '';
5747
+ display: inline-block;
5748
+ width: 5px;
5749
+ height: 5px;
5750
+ margin-right: 4px;
5751
+ border-radius: 50%;
5752
+ background: currentColor;
5753
+ vertical-align: 1px;
5754
+ }
5755
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--missing { font-style: italic; }
5756
+
5757
+ /* Kind tile: a rounded square like an extension icon. */
5758
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph {
5759
+ display: inline-flex;
5760
+ align-items: center;
5761
+ justify-content: center;
5762
+ width: 30px;
5763
+ height: 30px;
5764
+ border-radius: 7px;
5765
+ background: var(--ai-tile-bg);
5766
+ color: var(--mikedown-text-ui, var(--settings-fg));
5767
+ font-size: 12px;
5768
+ font-weight: 650;
5769
+ letter-spacing: -0.02em;
5770
+ flex-shrink: 0;
5771
+ user-select: none;
5772
+ }
5773
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="lmstudio"] { background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 16%, transparent); }
5774
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="ollama"] { background: color-mix(in srgb, var(--mikedown-text, #888) 14%, transparent); }
5775
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="anthropic"] { background: color-mix(in srgb, #d97757 22%, transparent); }
5776
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="openai"] { background: color-mix(in srgb, #10a37f 20%, transparent); }
5777
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="vscode-lm"] { background: color-mix(in srgb, var(--mikedown-text, #888) 10%, transparent); }
5778
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="unknown"] { border: 1px dashed var(--settings-control-border); background: transparent; }
5779
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph--sm {
5780
+ width: 20px;
5781
+ height: 20px;
5782
+ border-radius: 5px;
5783
+ font-size: 9.5px;
5784
+ }
5785
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph--sm svg { width: 12px; height: 12px; }
5786
+
5787
+ /* ── Controls ────────────────────────────────────────────────────────────── */
5788
+
5789
+ /* Switch: a checkbox with role="switch". */
5790
+ :is(.mikedown-root, .mikedown-portal) .ai-switch {
5791
+ appearance: none;
5792
+ -webkit-appearance: none;
5793
+ position: relative;
5794
+ width: 28px;
5795
+ height: 16px;
5796
+ margin: 0;
5797
+ flex-shrink: 0;
5798
+ border-radius: 8px;
5799
+ background: var(--settings-control-border);
5800
+ cursor: pointer;
5801
+ transition: background 160ms var(--ai-ease);
5802
+ }
5803
+ :is(.mikedown-root, .mikedown-portal) .ai-switch::after {
5804
+ content: '';
5805
+ position: absolute;
5806
+ top: 2px;
5807
+ left: 2px;
5808
+ width: 12px;
5809
+ height: 12px;
5810
+ border-radius: 50%;
5811
+ background: var(--mikedown-surface-raised, #fff);
5812
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
5813
+ transition: transform 160ms var(--ai-ease);
5814
+ }
5815
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:checked { background: var(--mikedown-accent, #3f51b5); }
5816
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:checked::after { transform: translateX(12px); background: var(--mikedown-accent-text, #fff); }
5817
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:disabled { opacity: 0.45; cursor: default; }
5818
+
5819
+ :is(.mikedown-root, .mikedown-portal) .ai-icon-btn {
5820
+ display: inline-flex;
5821
+ align-items: center;
5822
+ justify-content: center;
5823
+ width: 26px;
5824
+ height: 26px;
5825
+ padding: 0;
5826
+ border: none;
5827
+ border-radius: var(--mikedown-radius-sm, 4px);
5828
+ background: transparent;
5829
+ color: var(--settings-muted);
5830
+ cursor: pointer;
5831
+ flex-shrink: 0;
5832
+ font-family: inherit;
5833
+ }
5834
+ :is(.mikedown-root, .mikedown-portal) .ai-icon-btn:hover {
5835
+ background: var(--settings-hover-bg);
5836
+ color: var(--settings-fg);
5837
+ }
5838
+
5839
+ :is(.mikedown-root, .mikedown-portal) .ai-default-btn.is-on svg { color: #e3a008; }
5840
+ /* The default engine's head: a label, not a button (Q3); another engine's "Use by default" moves it. */
5841
+ :is(.mikedown-root, .mikedown-portal) .ai-default-badge {
5842
+ display: inline-flex;
5843
+ align-items: center;
5844
+ gap: 4px;
5845
+ padding: 0 4px;
5846
+ font-size: 12px;
5847
+ color: var(--settings-fg);
5848
+ outline: none;
5849
+ }
5850
+ :is(.mikedown-root, .mikedown-portal) .ai-default-badge svg { width: 14px; height: 14px; color: #e3a008; }
5851
+ :is(.mikedown-root, .mikedown-portal) .ai-delete-btn:hover { color: var(--ai-error); }
5852
+
5853
+ :is(.mikedown-root, .mikedown-portal) .settings-btn:has(svg) {
5854
+ display: inline-flex;
5855
+ align-items: center;
5856
+ gap: 5px;
5857
+ }
5858
+ :is(.mikedown-root, .mikedown-portal) .settings-btn[aria-disabled="true"],
5859
+ :is(.mikedown-root, .mikedown-portal) .settings-btn:disabled {
5860
+ opacity: 0.55;
5861
+ cursor: default;
5862
+ }
5863
+ :is(.mikedown-root, .mikedown-portal) .ai-btn--danger {
5864
+ color: var(--ai-error);
5865
+ border-color: color-mix(in srgb, var(--ai-error) 55%, transparent);
5866
+ }
5867
+ :is(.mikedown-root, .mikedown-portal) .ai-btn--danger:hover {
5868
+ background: color-mix(in srgb, var(--ai-error) 12%, transparent);
5869
+ }
5870
+
5871
+
5872
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:focus-visible,
5873
+ :is(.mikedown-root, .mikedown-portal) .ai-icon-btn:focus-visible,
5874
+ :is(.mikedown-root, .mikedown-portal) .ai-chip:focus-visible,
5875
+ :is(.mikedown-root, .mikedown-portal) .ai-model-check:focus-visible,
5876
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label:focus-visible {
5877
+ outline: 1px solid var(--settings-focus);
5878
+ outline-offset: 1px;
5879
+ }
5880
+
5881
+ /* ── Engines list ────────────────────────────────────────────────────────── */
5882
+
5883
+ :is(.mikedown-root, .mikedown-portal) .ai-engines {
5884
+ border: 1px solid var(--settings-divider);
5885
+ border-radius: var(--mikedown-radius, 6px);
5886
+ overflow: hidden;
5887
+ }
5888
+
5889
+ :is(.mikedown-root, .mikedown-portal) .ai-engine + .ai-engine { border-top: 1px solid var(--settings-divider); }
5890
+
5891
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-head {
5892
+ display: flex;
5893
+ align-items: center;
5894
+ gap: 12px;
5895
+ padding: 10px 10px 10px 12px;
5896
+ min-height: 34px;
5897
+ }
5898
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-head:hover { background: var(--ai-row-hover); }
5899
+
5900
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-glyph { display: inline-flex; }
5901
+ :is(.mikedown-root, .mikedown-portal) .ai-engine.is-disabled .ai-engine-glyph,
5902
+ :is(.mikedown-root, .mikedown-portal) .ai-engine.is-disabled .ai-engine-main { opacity: 0.55; }
5903
+
5904
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-main {
5905
+ flex: 1;
5906
+ min-width: 0;
5907
+ display: flex;
5908
+ flex-direction: column;
5909
+ gap: 2px;
5910
+ cursor: pointer;
5911
+ }
5912
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-title {
5913
+ display: flex;
5914
+ flex-wrap: wrap;
5915
+ align-items: center;
5916
+ gap: 3px 6px;
5917
+ min-width: 0;
5918
+ }
5919
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-name {
5920
+ font-weight: 600;
5921
+ color: var(--settings-fg);
5922
+ overflow: hidden;
5923
+ text-overflow: ellipsis;
5924
+ white-space: nowrap;
5925
+ min-width: 0;
5926
+ }
5927
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-sub {
5928
+ font-size: 12px;
5929
+ color: var(--settings-muted);
5930
+ overflow: hidden;
5931
+ text-overflow: ellipsis;
5932
+ white-space: nowrap;
5933
+ }
5934
+
5935
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-actions {
5936
+ display: flex;
5937
+ align-items: center;
5938
+ gap: 4px;
5939
+ flex-shrink: 0;
5940
+ }
5941
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-actions .ai-switch { margin: 0 6px; }
5942
+
5943
+ /* Status dot: hollow ring never probed, green ok, red failed, a soft pulse
5944
+ while a probe runs. Colour changes ease so a result lands calmly. */
5945
+ :is(.mikedown-root, .mikedown-portal) .ai-status {
5946
+ display: inline-flex;
5947
+ align-items: center;
5948
+ gap: 6px;
5949
+ min-width: 74px;
5950
+ justify-content: flex-end;
5951
+ margin-right: 4px;
5952
+ font-size: 11.5px;
5953
+ color: var(--settings-muted);
5954
+ font-variant-numeric: tabular-nums;
5955
+ white-space: nowrap;
5956
+ }
5957
+ :is(.mikedown-root, .mikedown-portal) .ai-status-dot {
5958
+ width: 8px;
5959
+ height: 8px;
5960
+ border-radius: 50%;
5961
+ box-sizing: border-box;
5962
+ border: 1.5px solid var(--settings-muted);
5963
+ background: transparent;
5964
+ transition: background-color 240ms var(--ai-ease), border-color 240ms var(--ai-ease), box-shadow 240ms var(--ai-ease);
5965
+ }
5966
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="ok"] .ai-status-dot {
5967
+ background: var(--ai-ok);
5968
+ border-color: var(--ai-ok);
5969
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-ok) 18%, transparent);
5970
+ }
5971
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="error"] .ai-status-dot {
5972
+ background: var(--ai-error);
5973
+ border-color: var(--ai-error);
5974
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-error) 16%, transparent);
5975
+ }
5976
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="error"] { color: var(--ai-error); }
5977
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="busy"] .ai-status-dot {
5978
+ border-color: var(--ai-warn);
5979
+ background: var(--ai-warn);
5980
+ animation: ai-pulse 1s ease-in-out infinite;
5981
+ }
5982
+ :is(.mikedown-root, .mikedown-portal) .ai-status-text { transition: color 240ms var(--ai-ease); }
5983
+ @keyframes ai-pulse {
5984
+ 0%, 100% { opacity: 1; }
5985
+ 50% { opacity: 0.35; }
5986
+ }
5987
+
5988
+ /* A request running in this editor: the toolbar AI button's sparkle and the
5989
+ sidebar's Suggest sparkle pulse like the status dot (U5). No layout change. */
5990
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar button.is-ai-running svg,
5991
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.is-running svg {
5992
+ animation: ai-pulse 1s ease-in-out infinite;
5993
+ }
5994
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.is-running {
5995
+ opacity: 1;
5996
+ cursor: progress;
5997
+ }
5998
+ @media (prefers-reduced-motion: reduce) {
5999
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar button.is-ai-running svg,
6000
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.is-running svg {
6001
+ animation: none;
6002
+ opacity: 0.55;
6003
+ }
6004
+ }
6005
+
6006
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-issues {
6007
+ display: flex;
6008
+ flex-direction: column;
6009
+ gap: 4px;
6010
+ padding: 0 12px 10px 54px;
6011
+ }
6012
+
6013
+ :is(.mikedown-root, .mikedown-portal) .ai-confirm {
6014
+ display: flex;
6015
+ align-items: center;
6016
+ gap: 8px;
6017
+ flex-wrap: wrap;
6018
+ margin: 0 10px 10px 54px;
6019
+ padding: 8px 10px;
6020
+ border-radius: var(--mikedown-radius-sm, 4px);
6021
+ background: color-mix(in srgb, var(--ai-error) 8%, transparent);
6022
+ animation: ai-arrive 160ms var(--ai-ease);
6023
+ }
6024
+ :is(.mikedown-root, .mikedown-portal) .ai-confirm-text {
6025
+ flex: 1;
6026
+ min-width: 180px;
6027
+ font-size: 12px;
6028
+ color: var(--settings-fg);
6029
+ }
6030
+
6031
+ /* ── Add engine: quick-start cards ───────────────────────────────────────── */
6032
+
6033
+ :is(.mikedown-root, .mikedown-portal) .ai-cards {
6034
+ display: flex;
6035
+ flex-direction: column;
6036
+ gap: 18px;
6037
+ }
6038
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-group {
6039
+ display: flex;
6040
+ flex-direction: column;
6041
+ gap: 6px;
6042
+ }
6043
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-heading {
6044
+ display: flex;
6045
+ align-items: center;
6046
+ gap: 6px;
6047
+ font-size: 12px;
6048
+ font-weight: 600;
6049
+ color: var(--settings-fg);
6050
+ }
6051
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-heading svg { color: var(--settings-muted); }
6052
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-explainer {
6053
+ margin-bottom: 4px;
6054
+ font-size: 12px;
6055
+ line-height: 1.45;
6056
+ color: var(--settings-muted);
6057
+ }
6058
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-grid {
6059
+ display: grid;
6060
+ grid-template-columns: repeat(auto-fill, minmax(196px, 1fr));
6061
+ gap: 8px;
6062
+ }
6063
+ :is(.mikedown-root, .mikedown-portal) .ai-card {
6064
+ display: flex;
6065
+ align-items: center;
6066
+ gap: 10px;
6067
+ min-width: 0;
6068
+ padding: 9px 11px;
6069
+ border: 1px solid var(--settings-divider);
6070
+ border-radius: var(--mikedown-radius, 6px);
6071
+ background: var(--mikedown-surface-raised, transparent);
6072
+ color: var(--settings-fg);
6073
+ font: inherit;
6074
+ text-align: left;
6075
+ cursor: pointer;
6076
+ transition: border-color 120ms var(--ai-ease), background-color 120ms var(--ai-ease), transform 120ms var(--ai-ease);
6077
+ }
6078
+ :is(.mikedown-root, .mikedown-portal) .ai-card:hover {
6079
+ border-color: var(--settings-control-border);
6080
+ background: var(--ai-row-hover);
6081
+ }
6082
+ :is(.mikedown-root, .mikedown-portal) .ai-card:active { transform: translateY(1px); }
6083
+ :is(.mikedown-root, .mikedown-portal) .ai-card:focus-visible {
6084
+ outline: 1px solid var(--settings-focus);
6085
+ outline-offset: 1px;
6086
+ }
6087
+ :is(.mikedown-root, .mikedown-portal) .ai-card-text {
6088
+ display: flex;
6089
+ flex-direction: column;
6090
+ gap: 1px;
6091
+ min-width: 0;
6092
+ }
6093
+ :is(.mikedown-root, .mikedown-portal) .ai-card-name {
6094
+ font-size: 12.5px;
6095
+ font-weight: 600;
6096
+ overflow: hidden;
6097
+ text-overflow: ellipsis;
6098
+ white-space: nowrap;
6099
+ }
6100
+ :is(.mikedown-root, .mikedown-portal) .ai-card-caption {
6101
+ font-size: 11.5px;
6102
+ line-height: 1.35;
6103
+ color: var(--settings-muted);
6104
+ }
6105
+
6106
+ /* Local detection: Running leads, Not running steps back, Added is done. */
6107
+ :is(.mikedown-root, .mikedown-portal) .ai-card-state {
6108
+ display: inline-flex;
6109
+ align-items: center;
6110
+ gap: 5px;
6111
+ margin-top: 3px;
6112
+ font-size: 11px;
6113
+ color: var(--settings-muted);
6114
+ font-variant-numeric: tabular-nums;
6115
+ }
6116
+ :is(.mikedown-root, .mikedown-portal) .ai-card-dot {
6117
+ width: 7px;
6118
+ height: 7px;
6119
+ border-radius: 50%;
6120
+ flex-shrink: 0;
6121
+ background: var(--ai-ok);
6122
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-ok) 18%, transparent);
6123
+ }
6124
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="running"] {
6125
+ border-color: color-mix(in srgb, var(--ai-ok) 55%, var(--settings-divider));
6126
+ background: color-mix(in srgb, var(--ai-ok) 6%, var(--mikedown-surface-raised, transparent));
6127
+ }
6128
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="running"]:hover {
6129
+ border-color: var(--ai-ok);
6130
+ background: color-mix(in srgb, var(--ai-ok) 10%, var(--mikedown-surface-raised, transparent));
6131
+ }
6132
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="running"] .ai-card-state { color: var(--settings-fg); }
6133
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="stopped"] { background: transparent; }
6134
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="stopped"] .ai-card-name { font-weight: 500; }
6135
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="added"] {
6136
+ background: transparent;
6137
+ border-style: dashed;
6138
+ }
6139
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-detect {
6140
+ display: flex;
6141
+ align-items: baseline;
6142
+ gap: 10px;
6143
+ min-height: 18px;
6144
+ margin-top: 2px;
6145
+ font-size: 12px;
6146
+ color: var(--settings-muted);
6147
+ }
6148
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-detect-text:empty { display: none; }
6149
+
6150
+ /* Empty state on the summary tab: an invitation, not an error. */
6151
+ :is(.mikedown-root, .mikedown-portal) .ai-summary-empty {
6152
+ display: flex;
6153
+ flex-direction: column;
6154
+ gap: 3px;
6155
+ padding: 14px 16px;
6156
+ border: 1px dashed var(--settings-control-border);
6157
+ border-radius: var(--mikedown-radius, 6px);
6158
+ }
6159
+ :is(.mikedown-root, .mikedown-portal) .ai-empty-title {
6160
+ font-size: 13px;
6161
+ font-weight: 600;
6162
+ color: var(--settings-fg);
6163
+ }
6164
+ :is(.mikedown-root, .mikedown-portal) .ai-empty-text {
6165
+ max-width: 460px;
6166
+ font-size: 12px;
6167
+ line-height: 1.5;
6168
+ color: var(--settings-muted);
6169
+ }
6170
+
6171
+ /* Cloud consents list on the AI tab: one line per stored answer. */
6172
+ :is(.mikedown-root, .mikedown-portal) .ai-consents-list {
6173
+ display: flex;
6174
+ flex-direction: column;
6175
+ gap: 6px;
6176
+ margin: 0;
6177
+ padding: 0;
6178
+ list-style: none;
6179
+ }
6180
+ :is(.mikedown-root, .mikedown-portal) .ai-consent {
6181
+ display: flex;
6182
+ align-items: center;
6183
+ justify-content: space-between;
6184
+ gap: 12px;
6185
+ font-size: 13px;
6186
+ color: var(--settings-fg);
6187
+ }
6188
+ :is(.mikedown-root, .mikedown-portal) .ai-consent-text { min-width: 0; overflow-wrap: anywhere; }
6189
+ :is(.mikedown-root, .mikedown-portal) .ai-consents-empty {
6190
+ font-size: 12px;
6191
+ color: var(--settings-muted);
6192
+ }
6193
+
6194
+ /* ── Express engine form (ai-engine-form.ts) ─────────────────────────────── */
6195
+
6196
+ /* One calm column like a macOS "Add Account" sheet: labels on the left,
6197
+ controls on the right, a short caption under a control when it helps. */
6198
+ :is(.mikedown-root, .mikedown-portal) .ai-form {
6199
+ display: flex;
6200
+ flex-direction: column;
6201
+ gap: 14px;
6202
+ animation: ai-arrive 180ms var(--ai-ease);
6203
+ }
6204
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet {
6205
+ display: flex;
6206
+ flex-direction: column;
6207
+ gap: 14px;
6208
+ padding: 16px 18px;
6209
+ border: 1px solid var(--settings-divider);
6210
+ border-radius: 8px;
6211
+ background: var(--mikedown-surface-raised, transparent);
6212
+ }
6213
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet--advanced { background: transparent; }
6214
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-row {
6215
+ display: grid;
6216
+ grid-template-columns: 112px minmax(0, 1fr);
6217
+ align-items: start;
6218
+ column-gap: 14px;
6219
+ }
6220
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-row--block { display: block; }
6221
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-label {
6222
+ padding-top: 6px;
6223
+ text-align: right;
6224
+ font-size: 12.5px;
6225
+ color: var(--settings-fg);
6226
+ }
6227
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-body {
6228
+ display: flex;
6229
+ flex-direction: column;
6230
+ gap: 5px;
6231
+ min-width: 0;
6232
+ }
6233
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-input { width: 100%; }
6234
+ :is(.mikedown-root, .mikedown-portal) .ai-caption {
6235
+ font-size: 11.5px;
6236
+ line-height: 1.45;
6237
+ color: var(--settings-muted);
6238
+ }
6239
+ :is(.mikedown-root, .mikedown-portal) .ai-url { display: flex; flex-direction: column; gap: 4px; }
6240
+ :is(.mikedown-root, .mikedown-portal) .ai-locality { display: flex; flex-direction: column; gap: 6px; }
6241
+
6242
+ :is(.mikedown-root, .mikedown-portal) .ai-key {
6243
+ display: flex;
6244
+ align-items: center;
6245
+ gap: 6px;
6246
+ }
6247
+ :is(.mikedown-root, .mikedown-portal) .ai-key .settings-input--medium { flex: 0 1 130px; width: 130px; min-width: 90px; }
6248
+ :is(.mikedown-root, .mikedown-portal) .ai-key-state {
6249
+ display: inline-flex;
6250
+ align-items: center;
6251
+ gap: 4px;
6252
+ color: var(--ai-ok);
6253
+ font-weight: 500;
6254
+ white-space: nowrap;
6255
+ }
6256
+
6257
+ :is(.mikedown-root, .mikedown-portal) .ai-enabled-line {
6258
+ display: flex;
6259
+ align-items: center;
6260
+ gap: 10px;
6261
+ min-height: 28px;
6262
+ }
6263
+
6264
+ :is(.mikedown-root, .mikedown-portal) .ai-default {
6265
+ display: flex;
6266
+ flex-wrap: wrap;
6267
+ align-items: center;
6268
+ gap: 8px 14px;
6269
+ }
6270
+ :is(.mikedown-root, .mikedown-portal) select.ai-default-select { min-width: 0; max-width: 100%; flex: 1 1 200px; }
6271
+ :is(.mikedown-root, .mikedown-portal) .ai-thinking {
6272
+ display: inline-flex;
6273
+ align-items: center;
6274
+ gap: 7px;
6275
+ font-size: 12px;
6276
+ color: var(--settings-muted);
6277
+ }
6278
+ :is(.mikedown-root, .mikedown-portal) .ai-thinking select { max-width: 150px; }
6279
+
6280
+ /* Text buttons: Fetch models, Retry, Type a model id. */
6281
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn {
6282
+ display: inline-flex;
6283
+ align-items: center;
6284
+ gap: 5px;
6285
+ padding: 2px 4px;
6286
+ margin: -2px -4px;
6287
+ border: none;
6288
+ border-radius: var(--mikedown-radius-sm, 4px);
6289
+ background: none;
6290
+ color: var(--mikedown-link, var(--mikedown-accent, #3f51b5));
6291
+ font: inherit;
6292
+ font-size: 12px;
6293
+ cursor: pointer;
6294
+ }
6295
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn:hover:not(:disabled) { text-decoration: underline; }
6296
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn:disabled,
6297
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn[aria-disabled="true"] { color: var(--settings-muted); cursor: default; text-decoration: none; }
6298
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn:focus-visible {
6299
+ outline: 1px solid var(--settings-focus);
6300
+ outline-offset: 1px;
6301
+ }
6302
+ :is(.mikedown-root, .mikedown-portal) .ai-type-btn,
6303
+ :is(.mikedown-root, .mikedown-portal) .ai-show-all { align-self: flex-start; margin-top: 2px; }
6304
+
6305
+ /* Models picker: a head line, the combobox field, then the inline listbox. */
6306
+ :is(.mikedown-root, .mikedown-portal) .ai-picker {
6307
+ display: flex;
6308
+ flex-direction: column;
6309
+ gap: 8px;
6310
+ }
6311
+ :is(.mikedown-root, .mikedown-portal) .ai-picker-head {
6312
+ display: flex;
6313
+ align-items: baseline;
6314
+ gap: 10px;
6315
+ }
6316
+ :is(.mikedown-root, .mikedown-portal) .ai-picker-label {
6317
+ display: inline-flex;
6318
+ align-items: center;
6319
+ gap: 7px;
6320
+ font-size: 12.5px;
6321
+ font-weight: 600;
6322
+ color: var(--settings-fg);
6323
+ }
6324
+ :is(.mikedown-root, .mikedown-portal) .ai-picker-head .ai-models-count { flex: 1; }
6325
+
6326
+ :is(.mikedown-root, .mikedown-portal) .ai-spinner {
6327
+ width: 11px;
6328
+ height: 11px;
6329
+ border-radius: 50%;
6330
+ border: 1.5px solid color-mix(in srgb, var(--settings-muted) 35%, transparent);
6331
+ border-top-color: var(--mikedown-accent, #3f51b5);
6332
+ animation: ai-spin 700ms linear infinite;
6333
+ }
6334
+ @keyframes ai-spin { to { transform: rotate(360deg); } }
6335
+
6336
+ :is(.mikedown-root, .mikedown-portal) .ai-combo { position: relative; }
6337
+ :is(.mikedown-root, .mikedown-portal) .ai-combo-icon {
6338
+ position: absolute;
6339
+ left: 9px;
6340
+ top: 50%;
6341
+ transform: translateY(-50%);
6342
+ display: inline-flex;
6343
+ color: var(--settings-muted);
6344
+ pointer-events: none;
6345
+ }
6346
+ :is(.mikedown-root, .mikedown-portal) .ai-combo-input { padding-left: 28px; }
6347
+
6348
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox,
6349
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-items {
6350
+ list-style: none;
6351
+ margin: 0;
6352
+ padding: 0;
6353
+ }
6354
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox {
6355
+ max-height: 248px;
6356
+ overflow-y: auto;
6357
+ padding: 4px;
6358
+ border: 1px solid var(--settings-divider);
6359
+ border-radius: 6px;
6360
+ outline: none;
6361
+ }
6362
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox:focus-visible { border-color: var(--settings-focus); }
6363
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-group + .ai-listbox-group { margin-top: 6px; }
6364
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-heading {
6365
+ padding: 4px 8px 3px;
6366
+ font-size: 10.5px;
6367
+ font-weight: 600;
6368
+ letter-spacing: 0.04em;
6369
+ text-transform: uppercase;
6370
+ color: var(--settings-muted);
6371
+ }
6372
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-empty {
6373
+ padding: 10px 8px;
6374
+ font-size: 12px;
6375
+ color: var(--settings-muted);
6376
+ }
6377
+ :is(.mikedown-root, .mikedown-portal) .ai-option {
6378
+ display: flex;
6379
+ align-items: center;
6380
+ gap: 9px;
6381
+ min-height: 28px;
6382
+ padding: 3px 8px;
6383
+ border-radius: 4px;
6384
+ cursor: pointer;
6385
+ user-select: none;
6386
+ }
6387
+ :is(.mikedown-root, .mikedown-portal) .ai-option:hover { background: var(--ai-row-hover); }
6388
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-active {
6389
+ background: var(--settings-hover-bg);
6390
+ box-shadow: inset 0 0 0 1px var(--settings-focus);
6391
+ }
6392
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-missing { opacity: 0.5; }
6393
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-unusable { opacity: 0.5; cursor: default; }
6394
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-unusable:hover { background: none; }
6395
+ :is(.mikedown-root, .mikedown-portal) .ai-option-check {
6396
+ display: inline-flex;
6397
+ align-items: center;
6398
+ justify-content: center;
6399
+ flex-shrink: 0;
6400
+ width: 15px;
6401
+ height: 15px;
6402
+ box-sizing: border-box;
6403
+ border: 1px solid var(--settings-control-border);
6404
+ border-radius: 4px;
6405
+ color: transparent;
6406
+ transition: background-color 120ms var(--ai-ease), border-color 120ms var(--ai-ease);
6407
+ }
6408
+ :is(.mikedown-root, .mikedown-portal) .ai-option-check svg { width: 11px; height: 11px; }
6409
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-on .ai-option-check {
6410
+ border-color: var(--mikedown-accent, #3f51b5);
6411
+ background: var(--mikedown-accent, #3f51b5);
6412
+ color: var(--mikedown-accent-text, #fff);
6413
+ }
6414
+ /* Single choice (the setup form): a radio dot instead of a check. */
6415
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox--single .ai-option-check { border-radius: 50%; }
6416
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox--single .ai-option-check svg { display: none; }
6417
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox--single .ai-option.is-on .ai-option-check {
6418
+ background: var(--mikedown-accent-text, #fff);
6419
+ border-width: 4.5px;
6420
+ }
6421
+ :is(.mikedown-root, .mikedown-portal) .ai-option-names {
6422
+ display: flex;
6423
+ flex-direction: column;
6424
+ flex: 1;
6425
+ min-width: 0;
6426
+ }
6427
+ :is(.mikedown-root, .mikedown-portal) .ai-option-name {
6428
+ font-size: 12.5px;
6429
+ color: var(--settings-fg);
6430
+ overflow: hidden;
6431
+ text-overflow: ellipsis;
6432
+ white-space: nowrap;
6433
+ }
6434
+ :is(.mikedown-root, .mikedown-portal) .ai-option-id {
6435
+ font-family: var(--mikedown-font-mono, monospace);
6436
+ font-size: 10.5px;
6437
+ color: var(--settings-muted);
6438
+ overflow: hidden;
6439
+ text-overflow: ellipsis;
6440
+ white-space: nowrap;
6441
+ }
6442
+ :is(.mikedown-root, .mikedown-portal) .ai-option-tags { display: flex; gap: 4px; flex-shrink: 0; }
6443
+
6444
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note {
6445
+ display: flex;
6446
+ align-items: flex-start;
6447
+ gap: 10px;
6448
+ animation: ai-arrive 220ms var(--ai-ease);
6449
+ }
6450
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note .ai-note { flex: 1; }
6451
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note .ai-link-btn { margin-top: -1px; }
6452
+
6453
+ :is(.mikedown-root, .mikedown-portal) .ai-form-actions {
6454
+ display: flex;
6455
+ flex-wrap: wrap;
6456
+ align-items: center;
6457
+ gap: 8px 12px;
6458
+ }
6459
+ :is(.mikedown-root, .mikedown-portal) .ai-form-actions .ai-result { flex-basis: 100%; }
6460
+
6461
+ /* Advanced: a quiet disclosure, not a second form. */
6462
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure {
6463
+ align-self: flex-start;
6464
+ display: inline-flex;
6465
+ align-items: center;
6466
+ gap: 6px;
6467
+ padding: 3px 6px;
6468
+ margin-left: -6px;
6469
+ border: none;
6470
+ border-radius: var(--mikedown-radius-sm, 4px);
6471
+ background: none;
6472
+ color: var(--settings-muted);
6473
+ font: inherit;
6474
+ font-size: 12px;
6475
+ cursor: pointer;
6476
+ }
6477
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure:hover { color: var(--settings-fg); background: var(--ai-row-hover); }
6478
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure:focus-visible {
6479
+ outline: 1px solid var(--settings-focus);
6480
+ outline-offset: 1px;
6481
+ }
6482
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure svg { transition: transform 160ms var(--ai-ease); }
6483
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure[aria-expanded="true"] { color: var(--settings-fg); }
6484
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure[aria-expanded="true"] svg { transform: rotate(90deg); }
6485
+ :is(.mikedown-root, .mikedown-portal) .ai-advanced {
6486
+ display: flex;
6487
+ flex-direction: column;
6488
+ gap: 14px;
6489
+ margin-top: -6px;
6490
+ animation: ai-arrive 180ms var(--ai-ease);
6491
+ }
6492
+ :is(.mikedown-root, .mikedown-portal) .ai-advanced[hidden] { display: none; }
6493
+
6494
+ :is(.mikedown-root, .mikedown-portal) .ai-thinking-select.settings-input--small { width: auto; }
6495
+
6496
+ /* ── Models ──────────────────────────────────────────────────────────────── */
6497
+
6498
+ :is(.mikedown-root, .mikedown-portal) .ai-models {
6499
+ display: flex;
6500
+ flex-direction: column;
6501
+ gap: 8px;
6502
+ }
6503
+ :is(.mikedown-root, .mikedown-portal) .ai-models-head {
6504
+ display: flex;
6505
+ align-items: baseline;
6506
+ gap: 8px;
6507
+ }
6508
+ :is(.mikedown-root, .mikedown-portal) .ai-models-count {
6509
+ font-size: 11.5px;
6510
+ color: var(--settings-muted);
6511
+ }
6512
+ :is(.mikedown-root, .mikedown-portal) .ai-models-empty {
6513
+ font-size: 12px;
6514
+ color: var(--settings-muted);
6515
+ padding: 10px 12px;
6516
+ border: 1px dashed var(--settings-control-border);
6517
+ border-radius: var(--mikedown-radius-sm, 4px);
6518
+ }
6519
+
6520
+ :is(.mikedown-root, .mikedown-portal) .ai-model-list {
6521
+ border: 1px solid var(--settings-divider);
6522
+ border-radius: var(--mikedown-radius-sm, 4px);
6523
+ max-height: 360px;
6524
+ overflow-y: auto;
6525
+ }
6526
+ :is(.mikedown-root, .mikedown-portal) .ai-model {
6527
+ display: flex;
6528
+ flex-direction: column;
6529
+ gap: 6px;
6530
+ padding: 8px 10px;
6531
+ transition: opacity 160ms var(--ai-ease);
6532
+ }
6533
+ :is(.mikedown-root, .mikedown-portal) .ai-model + .ai-model { border-top: 1px solid var(--settings-divider); }
6534
+ :is(.mikedown-root, .mikedown-portal) .ai-model.is-missing { opacity: 0.55; }
6535
+ :is(.mikedown-root, .mikedown-portal) .ai-model.is-off .ai-chips { opacity: 0.6; }
6536
+
6537
+ :is(.mikedown-root, .mikedown-portal) .ai-model-top {
6538
+ display: flex;
6539
+ align-items: center;
6540
+ gap: 8px;
6541
+ min-width: 0;
6542
+ }
6543
+ :is(.mikedown-root, .mikedown-portal) .ai-model-check {
6544
+ margin: 0;
6545
+ width: 14px;
6546
+ height: 14px;
6547
+ flex-shrink: 0;
6548
+ accent-color: var(--mikedown-accent, #3f51b5);
6549
+ cursor: pointer;
6550
+ }
6551
+ :is(.mikedown-root, .mikedown-portal) .ai-model-names {
6552
+ flex: 1;
6553
+ min-width: 0;
6554
+ display: flex;
6555
+ flex-direction: column;
6556
+ }
6557
+ /* Label field reads as text until hovered or focused. */
6558
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label {
6559
+ box-sizing: border-box;
6560
+ width: 100%;
6561
+ min-width: 0;
6562
+ padding: 2px 5px;
6563
+ margin-left: -5px;
6564
+ border: 1px solid transparent;
6565
+ border-radius: 3px;
6566
+ background: transparent;
6567
+ color: var(--settings-fg);
6568
+ font: inherit;
6569
+ font-size: 12.5px;
6570
+ font-weight: 500;
6571
+ text-overflow: ellipsis;
6572
+ }
6573
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label::placeholder {
6574
+ color: var(--settings-fg);
6575
+ opacity: 0.9;
6576
+ font-family: var(--mikedown-font-mono, monospace);
6577
+ font-size: 12px;
6578
+ }
6579
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label:hover { border-color: var(--settings-control-border); }
6580
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label:focus {
6581
+ border-color: var(--settings-focus);
6582
+ background: var(--mikedown-input-bg, transparent);
6583
+ outline: none;
6584
+ }
6585
+ :is(.mikedown-root, .mikedown-portal) .ai-model-id {
6586
+ font-family: var(--mikedown-font-mono, monospace);
6587
+ font-size: 11px;
6588
+ color: var(--settings-muted);
6589
+ overflow: hidden;
6590
+ text-overflow: ellipsis;
6591
+ white-space: nowrap;
6592
+ }
6593
+ :is(.mikedown-root, .mikedown-portal) .ai-model-tags {
6594
+ display: flex;
6595
+ gap: 4px;
6596
+ flex-shrink: 0;
6597
+ }
6598
+ :is(.mikedown-root, .mikedown-portal) .ai-model-right {
6599
+ display: flex;
6600
+ align-items: center;
6601
+ gap: 2px;
6602
+ flex-shrink: 0;
6603
+ }
6604
+ :is(.mikedown-root, .mikedown-portal) .ai-model-context {
6605
+ display: inline-flex;
6606
+ align-items: center;
6607
+ gap: 4px;
6608
+ margin-right: 4px;
6609
+ }
6610
+ :is(.mikedown-root, .mikedown-portal) .ai-context-input {
6611
+ width: 72px;
6612
+ text-align: right;
6613
+ font-variant-numeric: tabular-nums;
6614
+ }
6615
+ :is(.mikedown-root, .mikedown-portal) .ai-context-unit {
6616
+ font-size: 10.5px;
6617
+ color: var(--settings-muted);
6618
+ }
6619
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-btn {
6620
+ font-family: var(--mikedown-font-mono, monospace);
6621
+ font-size: 11px;
6622
+ width: auto;
6623
+ padding: 0 6px;
6624
+ }
6625
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-btn.has-value { color: var(--mikedown-accent, #3f51b5); }
6626
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-btn[aria-expanded="true"] { background: var(--settings-hover-bg); color: var(--settings-fg); }
6627
+
6628
+ /* Capability chips: pressed chips are filled; the source tag sits at the end. */
6629
+ :is(.mikedown-root, .mikedown-portal) .ai-chips {
6630
+ display: flex;
6631
+ flex-wrap: wrap;
6632
+ align-items: center;
6633
+ gap: 4px;
6634
+ padding-left: 22px;
6635
+ }
6636
+ :is(.mikedown-root, .mikedown-portal) .ai-chip {
6637
+ padding: 0 7px;
6638
+ height: 19px;
6639
+ border-radius: 10px;
6640
+ border: 1px solid var(--settings-control-border);
6641
+ background: transparent;
6642
+ color: var(--settings-muted);
6643
+ font: inherit;
6644
+ font-size: 11px;
6645
+ line-height: 17px;
6646
+ cursor: pointer;
6647
+ transition: background-color 120ms var(--ai-ease), color 120ms var(--ai-ease), border-color 120ms var(--ai-ease);
6648
+ }
6649
+ :is(.mikedown-root, .mikedown-portal) .ai-chip:hover { border-color: var(--settings-fg); color: var(--settings-fg); }
6650
+ :is(.mikedown-root, .mikedown-portal) .ai-chip.is-on {
6651
+ border-color: transparent;
6652
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 18%, transparent);
6653
+ color: var(--settings-fg);
6654
+ }
6655
+ :is(.mikedown-root, .mikedown-portal) .ai-source {
6656
+ margin-left: 4px;
6657
+ font-size: 10.5px;
6658
+ color: var(--settings-muted);
6659
+ font-style: italic;
6660
+ }
6661
+ :is(.mikedown-root, .mikedown-portal) .ai-source--user { color: var(--mikedown-accent, #3f51b5); font-style: normal; }
6662
+
6663
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides {
6664
+ display: flex;
6665
+ flex-direction: column;
6666
+ gap: 4px;
6667
+ padding-left: 22px;
6668
+ animation: ai-arrive 160ms var(--ai-ease);
6669
+ }
6670
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-text {
6671
+ resize: vertical;
6672
+ min-height: 54px;
6673
+ }
6674
+
6675
+ :is(.mikedown-root, .mikedown-portal) .ai-model-add {
6676
+ display: flex;
6677
+ gap: 6px;
6678
+ align-items: center;
6679
+ }
6680
+
6681
+ /* ── Routing and features ────────────────────────────────────────────────── */
6682
+
6683
+ :is(.mikedown-root, .mikedown-portal) .settings-row.ai-section[hidden] { display: none; }
6684
+
6685
+ :is(.mikedown-root, .mikedown-portal) .ai-routing {
6686
+ display: flex;
6687
+ flex-direction: column;
6688
+ gap: 10px;
6689
+ }
6690
+ :is(.mikedown-root, .mikedown-portal) .ai-subhead {
6691
+ margin-top: 4px;
6692
+ font-size: 11.5px;
6693
+ font-weight: 600;
6694
+ color: var(--settings-muted);
6695
+ }
6696
+ :is(.mikedown-root, .mikedown-portal) select.ai-route-select { max-width: 260px; }
6697
+ :is(.mikedown-root, .mikedown-portal) .ai-task-row .settings-desc { font-size: 11.5px; }
6698
+
6699
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-controls {
6700
+ display: flex;
6701
+ align-items: center;
6702
+ gap: 10px;
6703
+ }
6704
+ :is(.mikedown-root, .mikedown-portal) .ai-feature.is-planned .settings-row-text { opacity: 0.55; }
6705
+
6706
+ /* "Advanced: task per feature" under the switches (U8): folded, quiet. */
6707
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-tasks-toggle { margin-top: 8px; }
6708
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-tasks { margin-top: 2px; gap: 8px; }
6709
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-tasks > .settings-desc { font-size: 11.5px; }
6710
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-task { justify-content: space-between; gap: 10px; }
6711
+
6712
+ /* The master switch carries the tab: a touch more presence. */
6713
+ :is(.mikedown-root, .mikedown-portal) .ai-master .settings-label { font-size: 13.5px; }
6714
+
6715
+ :is(.mikedown-root, .mikedown-portal) .settings-row--check .ai-row-note { margin-top: -2px; }
6716
+
6717
+ /* ── Narrow content pane ─────────────────────────────────────────────────── */
6718
+
6719
+ @container settings-content (max-width: 520px) {
6720
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-top { flex-wrap: wrap; }
6721
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions { width: 100%; padding-left: 58px; }
6722
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions .ai-status { margin-right: auto; justify-content: flex-start; min-width: 0; }
6723
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet { padding: 12px; }
6724
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-row { grid-template-columns: minmax(0, 1fr); row-gap: 4px; }
6725
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-label { padding-top: 0; text-align: left; font-weight: 500; }
6726
+ :is(.mikedown-root, .mikedown-portal) .ai-model-top { flex-wrap: wrap; }
6727
+ :is(.mikedown-root, .mikedown-portal) .ai-chips { padding-left: 0; }
6728
+ }
6729
+
6730
+ @media (prefers-reduced-motion: reduce) {
6731
+ :is(.mikedown-root, .mikedown-portal) .ai-result,
6732
+ :is(.mikedown-root, .mikedown-portal) .ai-confirm,
6733
+ :is(.mikedown-root, .mikedown-portal) .ai-form,
6734
+ :is(.mikedown-root, .mikedown-portal) .ai-advanced,
6735
+ :is(.mikedown-root, .mikedown-portal) .ai-page-frame,
6736
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="detail"] .ai-page-detail,
6737
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-scrim,
6738
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note,
6739
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides,
6740
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="busy"] .ai-status-dot { animation: none; }
6741
+ :is(.mikedown-root, .mikedown-portal) .ai-switch,
6742
+ :is(.mikedown-root, .mikedown-portal) .ai-switch::after,
6743
+ :is(.mikedown-root, .mikedown-portal) .ai-status-dot,
6744
+ :is(.mikedown-root, .mikedown-portal) .ai-card,
6745
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option,
6746
+ :is(.mikedown-root, .mikedown-portal) .ai-option-check,
6747
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure svg { transition: none; }
6748
+ :is(.mikedown-root, .mikedown-portal) .ai-spinner { animation-duration: 2s; }
6749
+ }
6750
+
6751
+ /* ── AI tab: the summary ─────────────────────────────────────────────────── */
6752
+
6753
+ /* Compact rows: name, pill, dot and switch on one quiet line. */
6754
+ :is(.mikedown-root, .mikedown-portal) .ai-engines--compact .ai-engine-head {
6755
+ gap: 10px;
6756
+ padding: 7px 10px 7px 12px;
6757
+ min-height: 0;
6758
+ }
6759
+ :is(.mikedown-root, .mikedown-portal) .ai-engines--compact .ai-status { min-width: 0; margin-right: 6px; }
6760
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-open {
6761
+ padding: 0;
6762
+ border: none;
6763
+ background: none;
6764
+ color: inherit;
6765
+ font: inherit;
6766
+ text-align: left;
6767
+ }
6768
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-open:hover .ai-engine-name { text-decoration: underline; text-underline-offset: 2px; }
6769
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-open:focus-visible {
6770
+ outline: 1px solid var(--settings-focus);
6771
+ outline-offset: 2px;
6772
+ border-radius: 2px;
6773
+ }
6774
+
6775
+ /* Compact status: the dot alone; the label stays for screen readers. */
6776
+ :is(.mikedown-root, .mikedown-portal) .ai-status--compact { min-width: 0; margin-right: 0; }
6777
+ :is(.mikedown-root, .mikedown-portal) .ai-status--compact .ai-status-text {
6778
+ position: absolute;
6779
+ width: 1px;
6780
+ height: 1px;
6781
+ overflow: hidden;
6782
+ clip: rect(0 0 0 0);
6783
+ white-space: nowrap;
6784
+ }
6785
+
6786
+ /* "Default model oMLX · Qwen 3.8 Flash Next Change…" */
6787
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line {
6788
+ display: flex;
6789
+ flex-wrap: wrap;
6790
+ align-items: baseline;
6791
+ gap: 4px 10px;
6792
+ margin-top: 10px;
6793
+ padding: 0 2px;
6794
+ font-size: 12.5px;
6795
+ }
6796
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line-label { color: var(--settings-muted); }
6797
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line-value {
6798
+ min-width: 0;
6799
+ font-weight: 600;
6800
+ color: var(--settings-fg);
6801
+ overflow-wrap: anywhere;
6802
+ }
6803
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line-value.is-none { font-weight: 500; color: var(--ai-warn); }
6804
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line .ai-row-note { flex-basis: 100%; }
6805
+ :is(.mikedown-root, .mikedown-portal) .ai-summary-actions {
6806
+ display: flex;
6807
+ gap: 8px;
6808
+ margin-top: 12px;
6809
+ }
6810
+
6811
+ /* ── AI Engines page (ai-engines-page.ts) ────────────────────────────────── */
6812
+
6813
+ /* Full window, above the Settings modal (1050) when opened from it. */
6814
+ :is(.mikedown-root, .mikedown-portal) #mikedown-ai-page-overlay {
6815
+ position: fixed;
6816
+ inset: 0;
6817
+ z-index: 1060;
6818
+ display: flex;
6819
+ }
6820
+ :is(.mikedown-root, .mikedown-portal) .ai-page-frame {
6821
+ flex: 1;
6822
+ display: flex;
6823
+ min-width: 0;
6824
+ min-height: 0;
6825
+ background: var(--mikedown-surface, #1e1e1e);
6826
+ color: var(--settings-fg);
6827
+ font-family: var(--mikedown-font-ui, system-ui, -apple-system, sans-serif);
6828
+ font-size: 13px;
6829
+ line-height: 1.4;
6830
+ animation: ai-page-in 180ms var(--ai-ease);
6831
+ }
6832
+ @keyframes ai-page-in {
6833
+ from { opacity: 0; }
6834
+ to { opacity: 1; }
6835
+ }
6836
+ :is(.mikedown-root, .mikedown-portal) .ai-page {
6837
+ position: relative;
6838
+ flex: 1;
6839
+ display: flex;
6840
+ flex-direction: column;
6841
+ min-width: 0;
6842
+ min-height: 0;
6843
+ }
6844
+
6845
+ /* Header: Back on the left, the title centred, Done on the right. */
6846
+ :is(.mikedown-root, .mikedown-portal) .ai-page-header {
6847
+ display: grid;
6848
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
6849
+ align-items: center;
6850
+ gap: 12px;
6851
+ padding: 9px 16px;
6852
+ border-bottom: 1px solid var(--mikedown-divider, var(--settings-divider));
6853
+ background: var(--mikedown-surface-toolbar, var(--mikedown-surface, transparent));
6854
+ flex-shrink: 0;
6855
+ }
6856
+ :is(.mikedown-root, .mikedown-portal) .ai-page-back {
6857
+ justify-self: start;
6858
+ display: inline-flex;
6859
+ align-items: center;
6860
+ gap: 3px;
6861
+ padding: 4px 8px 4px 4px;
6862
+ border: none;
6863
+ border-radius: var(--mikedown-radius-sm, 4px);
6864
+ background: none;
6865
+ color: var(--mikedown-link, var(--settings-fg));
6866
+ font: inherit;
6867
+ cursor: pointer;
6868
+ }
6869
+ :is(.mikedown-root, .mikedown-portal) .ai-page-back:hover { background: var(--settings-hover-bg); }
6870
+ :is(.mikedown-root, .mikedown-portal) .ai-page-back:focus-visible,
6871
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn:focus-visible {
6872
+ outline: 1px solid var(--settings-focus);
6873
+ outline-offset: -1px;
6874
+ }
6875
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title {
6876
+ margin: 0;
6877
+ font-size: 14px;
6878
+ font-weight: 600;
6879
+ color: var(--settings-fg);
6880
+ white-space: nowrap;
6881
+ }
6882
+ :is(.mikedown-root, .mikedown-portal) .ai-page-done { justify-self: end; min-width: 72px; }
6883
+
6884
+ :is(.mikedown-root, .mikedown-portal) .ai-page-body {
6885
+ flex: 1;
6886
+ display: flex;
6887
+ min-height: 0;
6888
+ }
6889
+ /* The page toggles its parts with `hidden` (the list and detail while the
6890
+ wizard shows); the display rules above would otherwise beat it, and the
6891
+ hidden body would split the height with the wizard. */
6892
+ :is(.mikedown-root, .mikedown-portal) .ai-page > [hidden] { display: none; }
6893
+
6894
+ /* Left pane: a quiet source list. */
6895
+ :is(.mikedown-root, .mikedown-portal) .ai-page-nav {
6896
+ width: 284px;
6897
+ flex-shrink: 0;
6898
+ display: flex;
6899
+ flex-direction: column;
6900
+ gap: 12px;
6901
+ padding: 14px 10px;
6902
+ overflow-y: auto;
6903
+ border-right: 1px solid var(--mikedown-divider, var(--settings-divider));
6904
+ background: var(--mikedown-surface-toolbar, transparent);
6905
+ }
6906
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-group { display: flex; flex-direction: column; gap: 2px; }
6907
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-group--tools {
6908
+ padding-top: 12px;
6909
+ border-top: 1px solid var(--mikedown-divider, var(--settings-divider));
6910
+ }
6911
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-heading {
6912
+ padding: 0 8px 6px;
6913
+ font-size: 11px;
6914
+ font-weight: 600;
6915
+ letter-spacing: 0.04em;
6916
+ text-transform: uppercase;
6917
+ color: var(--settings-muted);
6918
+ }
6919
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-empty {
6920
+ padding: 4px 8px 2px;
6921
+ font-size: 12px;
6922
+ color: var(--settings-muted);
6923
+ }
6924
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-list { display: flex; flex-direction: column; gap: 2px; }
6925
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item { position: relative; display: flex; }
6926
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn {
6927
+ display: flex;
6928
+ align-items: center;
6929
+ gap: 10px;
6930
+ width: 100%;
6931
+ min-width: 0;
6932
+ padding: 7px 8px;
6933
+ border: none;
6934
+ border-radius: var(--mikedown-radius, 6px);
6935
+ background: none;
6936
+ color: var(--settings-fg);
6937
+ font: inherit;
6938
+ text-align: left;
6939
+ cursor: pointer;
6940
+ transition: background-color 120ms var(--ai-ease);
6941
+ }
6942
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn:hover { background: var(--ai-row-hover); }
6943
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn[aria-current="true"] {
6944
+ background: var(--settings-active-bg);
6945
+ color: var(--settings-active-fg);
6946
+ outline: 1px solid var(--mikedown-contrast-border, transparent);
6947
+ outline-offset: -1px;
6948
+ }
6949
+ /* Room for the switch, which sits over the row's right end. */
6950
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item .ai-nav-btn { padding-right: 48px; }
6951
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item > .ai-switch {
6952
+ position: absolute;
6953
+ top: 50%;
6954
+ right: 10px;
6955
+ transform: translateY(-50%);
6956
+ }
6957
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item.is-disabled .ai-glyph,
6958
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item.is-disabled .ai-nav-text { opacity: 0.55; }
6959
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-text {
6960
+ flex: 1;
6961
+ display: flex;
6962
+ flex-direction: column;
6963
+ gap: 1px;
6964
+ min-width: 0;
6965
+ }
6966
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-name-line {
6967
+ display: flex;
6968
+ align-items: center;
6969
+ gap: 6px;
6970
+ min-width: 0;
6971
+ }
6972
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-name {
6973
+ min-width: 0;
6974
+ overflow: hidden;
6975
+ font-weight: 600;
6976
+ text-overflow: ellipsis;
6977
+ white-space: nowrap;
6978
+ }
6979
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-sub {
6980
+ overflow: hidden;
6981
+ font-size: 11.5px;
6982
+ color: var(--settings-muted);
6983
+ text-overflow: ellipsis;
6984
+ white-space: nowrap;
6985
+ }
6986
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-sub-line {
6987
+ display: flex;
6988
+ align-items: center;
6989
+ gap: 6px;
6990
+ min-width: 0;
6991
+ }
6992
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn[aria-current="true"] .ai-nav-sub { color: inherit; opacity: 0.72; }
6993
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn .ai-pill { flex-shrink: 0; }
6994
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-star { display: inline-flex; flex-shrink: 0; color: #e3a008; }
6995
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-star svg { width: 11px; height: 11px; }
6996
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-icon {
6997
+ display: inline-flex;
6998
+ align-items: center;
6999
+ justify-content: center;
7000
+ width: 30px;
7001
+ height: 30px;
7002
+ flex-shrink: 0;
7003
+ border-radius: 7px;
7004
+ background: var(--ai-tile-bg);
7005
+ color: var(--settings-muted);
7006
+ }
7007
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn[aria-current="true"] .ai-nav-icon { color: inherit; }
7008
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn--add .ai-nav-icon { background: transparent; border: 1px dashed var(--settings-control-border); }
7009
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn--add .ai-nav-name { font-weight: 500; }
7010
+
7011
+ /* Right pane: one thing at a time, in a readable column. Named like the
7012
+ modal's content pane so the same narrow-width rules apply. */
7013
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail {
7014
+ flex: 1;
7015
+ min-width: 0;
7016
+ overflow-y: auto;
7017
+ container: settings-content / inline-size;
7018
+ }
7019
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-head,
7020
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-body {
7021
+ box-sizing: border-box;
7022
+ max-width: 780px;
7023
+ margin: 0 auto;
7024
+ padding: 0 32px;
7025
+ }
7026
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-head {
7027
+ display: flex;
7028
+ flex-direction: column;
7029
+ gap: 10px;
7030
+ padding-top: 26px;
7031
+ padding-bottom: 18px;
7032
+ }
7033
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-body { padding-bottom: 48px; }
7034
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail[data-kind="routing"] .ai-detail-head,
7035
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail[data-kind="add"] .ai-detail-head { flex-direction: row; align-items: center; gap: 14px; }
7036
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-top {
7037
+ display: flex;
7038
+ align-items: center;
7039
+ gap: 14px;
7040
+ }
7041
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-glyph .ai-glyph {
7042
+ width: 44px;
7043
+ height: 44px;
7044
+ border-radius: 10px;
7045
+ font-size: 15px;
7046
+ }
7047
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-glyph .ai-glyph svg { width: 20px; height: 20px; }
7048
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-icon {
7049
+ display: inline-flex;
7050
+ align-items: center;
7051
+ justify-content: center;
7052
+ width: 44px;
7053
+ height: 44px;
7054
+ flex-shrink: 0;
7055
+ border-radius: 10px;
7056
+ background: var(--ai-tile-bg);
7057
+ color: var(--settings-muted);
7058
+ }
7059
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-icon svg { width: 20px; height: 20px; }
7060
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-main {
7061
+ flex: 1;
7062
+ display: flex;
7063
+ flex-direction: column;
7064
+ gap: 3px;
7065
+ min-width: 0;
7066
+ }
7067
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-title-line {
7068
+ display: flex;
7069
+ flex-wrap: wrap;
7070
+ align-items: center;
7071
+ gap: 4px 8px;
7072
+ min-width: 0;
7073
+ }
7074
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-title {
7075
+ margin: 0;
7076
+ min-width: 0;
7077
+ overflow-wrap: anywhere;
7078
+ font-size: 18px;
7079
+ font-weight: 600;
7080
+ letter-spacing: -0.01em;
7081
+ color: var(--settings-fg);
7082
+ }
7083
+ /* Only ever focused by the page (a new local server, the narrow layout's push), as the wizard's title. */
7084
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-title:is(:focus, :focus-visible) { outline: none; }
7085
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-sub {
7086
+ max-width: 560px;
7087
+ font-size: 12.5px;
7088
+ line-height: 1.45;
7089
+ color: var(--settings-muted);
7090
+ }
7091
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions {
7092
+ display: flex;
7093
+ align-items: center;
7094
+ gap: 6px;
7095
+ flex-shrink: 0;
7096
+ }
7097
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions .ai-status { min-width: 0; margin-right: 6px; }
7098
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-engine-issues { padding: 0 0 0 58px; }
7099
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-confirm { margin: 0 0 0 58px; }
7100
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail select.ai-route-select { max-width: 340px; }
7101
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-cards-grid { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); }
7102
+
7103
+ /* One column under 720 px: the list, or the pushed detail. */
7104
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-page-nav {
7105
+ flex: 1;
7106
+ width: auto;
7107
+ border-right: none;
7108
+ padding: 12px;
7109
+ }
7110
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="list"] .ai-page-detail,
7111
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="detail"] .ai-page-nav { display: none; }
7112
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="detail"] .ai-page-detail { animation: ai-push 200ms var(--ai-ease); }
7113
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-page-header { padding: 8px 10px; }
7114
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-detail-head,
7115
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-detail-body { padding-left: 16px; padding-right: 16px; }
7116
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-detail-head { padding-top: 18px; }
7117
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-nav-btn { padding-top: 9px; padding-bottom: 9px; }
7118
+ @keyframes ai-push {
7119
+ from { opacity: 0; transform: translateX(14px); }
7120
+ to { opacity: 1; transform: none; }
7121
+ }
7122
+
7123
+ /* "Discard changes?": a small sheet over a dimmed page. */
7124
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-scrim {
7125
+ position: absolute;
7126
+ inset: 0;
7127
+ z-index: 2;
7128
+ display: flex;
7129
+ align-items: flex-start;
7130
+ justify-content: center;
7131
+ padding-top: 72px;
7132
+ background: color-mix(in srgb, var(--mikedown-surface, #000) 55%, transparent);
7133
+ animation: ai-arrive 160ms var(--ai-ease);
7134
+ }
7135
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm {
7136
+ display: flex;
7137
+ flex-direction: column;
7138
+ gap: 8px;
7139
+ box-sizing: border-box;
7140
+ width: min(380px, calc(100% - 32px));
7141
+ padding: 18px 20px 16px;
7142
+ border: 1px solid var(--settings-border);
7143
+ border-radius: var(--mikedown-radius-lg, 10px);
7144
+ background: var(--mikedown-surface-raised, #252526);
7145
+ box-shadow: 0 12px 40px var(--mikedown-shadow, rgba(0, 0, 0, 0.4));
7146
+ }
7147
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-title { font-size: 14px; font-weight: 600; color: var(--settings-fg); }
7148
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-text { font-size: 12.5px; line-height: 1.5; color: var(--settings-muted); }
7149
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-actions {
7150
+ display: flex;
7151
+ justify-content: flex-end;
7152
+ gap: 8px;
7153
+ margin-top: 8px;
7154
+ }
7155
+
7156
+ /* ── Sidebar footer chip ─────────────────────────────────────────────────── */
7157
+
7158
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip {
7159
+ display: inline-flex;
7160
+ align-items: center;
7161
+ gap: 5px;
7162
+ align-self: flex-start;
7163
+ max-width: 100%;
7164
+ margin: 0 0 1px -5px;
7165
+ padding: 1px 6px 1px 5px;
7166
+ border: 1px solid transparent;
7167
+ border-radius: 9px;
7168
+ background: none;
7169
+ color: inherit;
7170
+ font: inherit;
7171
+ line-height: 1.5;
7172
+ cursor: pointer;
7173
+ text-align: left;
7174
+ }
7175
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[hidden] { display: none; }
7176
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip:hover {
7177
+ background: var(--mikedown-hover, rgba(128, 128, 128, 0.12));
7178
+ color: var(--mikedown-text-ui, inherit);
7179
+ }
7180
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip:focus-visible {
7181
+ outline: 1px solid var(--mikedown-focus-ring, #007fd4);
7182
+ outline-offset: 0;
7183
+ }
7184
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-glyph { display: inline-flex; flex-shrink: 0; }
7185
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-text {
7186
+ min-width: 0;
7187
+ overflow: hidden;
7188
+ text-overflow: ellipsis;
7189
+ white-space: nowrap;
7190
+ }
7191
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="local"] .sidebar-ai-glyph { color: var(--mikedown-success, #2e7d32); }
7192
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="cloud"] .sidebar-ai-glyph { color: var(--mikedown-info, #1e70d6); }
7193
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="none"] .sidebar-ai-glyph { color: var(--mikedown-warning, #b26a00); }
7194
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="cloud"] {
7195
+ border-color: color-mix(in srgb, var(--mikedown-info, #1e70d6) 35%, transparent);
7196
+ }
7197
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip.is-warn .sidebar-ai-glyph { color: var(--mikedown-warning, #b26a00); }
7198
+
7199
+ /* ── Experimental marking (ai-settings-dom.ts) ───────────────────────────── */
7200
+
7201
+ /* The pill beside an AI title: the Settings nav item, the AI tab, the page, the first-run panel. */
7202
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-badge {
7203
+ display: inline-flex;
7204
+ align-items: center;
7205
+ flex-shrink: 0;
7206
+ height: 16px;
7207
+ padding: 0 6px;
7208
+ border-radius: 8px;
7209
+ font-size: 10px;
7210
+ font-weight: 600;
7211
+ letter-spacing: 0.02em;
7212
+ line-height: 1;
7213
+ white-space: nowrap;
7214
+ /* Body text on an amber tint: amber text this small fails contrast. */
7215
+ color: var(--settings-fg, var(--mikedown-text-ui, var(--mikedown-text)));
7216
+ background: color-mix(in srgb, var(--mikedown-warning, #b26a00) 20%, transparent);
7217
+ border: 1px solid color-mix(in srgb, var(--mikedown-warning, #b26a00) 55%, transparent);
7218
+ }
7219
+ :is(.mikedown-root, .mikedown-portal) .settings-tab .ai-experimental-badge { margin-left: 2px; }
7220
+ :is(.mikedown-root, .mikedown-portal) .settings-tab[aria-selected="true"] .ai-experimental-badge {
7221
+ color: inherit;
7222
+ background: color-mix(in srgb, currentColor 18%, transparent);
7223
+ border-color: color-mix(in srgb, currentColor 45%, transparent);
7224
+ }
7225
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-head {
7226
+ display: flex;
7227
+ align-items: center;
7228
+ gap: 8px;
7229
+ }
7230
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-title {
7231
+ font-size: 13px;
7232
+ font-weight: 600;
7233
+ }
7234
+ :is(.mikedown-root, .mikedown-portal) .ai-disclaimer {
7235
+ margin: 6px 0 0;
7236
+ font-size: 12px;
7237
+ line-height: 1.5;
7238
+ color: var(--settings-muted, var(--mikedown-text-muted));
7239
+ }
7240
+
7241
+ /* Top of the AI tab. */
7242
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-intro {
7243
+ padding: 2px 2px 12px;
7244
+ margin-bottom: 4px;
7245
+ border-bottom: 1px solid var(--settings-divider, var(--mikedown-border));
7246
+ }
7247
+
7248
+ /* AI Engines page: the badge beside the title, the disclaimer under the header. */
7249
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title-line {
7250
+ display: flex;
7251
+ align-items: center;
7252
+ gap: 8px;
7253
+ min-width: 0;
7254
+ }
7255
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title-note {
7256
+ overflow: hidden;
7257
+ font-size: 12px;
7258
+ color: var(--settings-muted);
7259
+ text-overflow: ellipsis;
7260
+ white-space: nowrap;
7261
+ }
7262
+ :is(.mikedown-root, .mikedown-portal) .ai-page-disclaimer {
7263
+ margin: 0;
7264
+ padding: 8px 16px;
7265
+ border-bottom: 1px solid var(--mikedown-divider, var(--settings-divider));
7266
+ flex-shrink: 0;
7267
+ }
7268
+
7269
+ /* ── Privacy card (ai-settings-dom.ts#privacyCard) ────────────────────────
7270
+ A quiet note like the disclaimer: muted text, a cloud glyph, no warning. */
7271
+
7272
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-card {
7273
+ font-size: 12px;
7274
+ line-height: 1.45;
7275
+ color: var(--settings-muted, var(--mikedown-text-muted));
7276
+ padding: 8px 10px;
7277
+ border: 1px solid var(--settings-divider, var(--mikedown-border));
7278
+ border-radius: var(--mikedown-radius-sm, 4px);
7279
+ min-width: 0;
7280
+ }
7281
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-head,
7282
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary {
7283
+ display: flex;
7284
+ align-items: center;
7285
+ gap: 6px;
7286
+ color: var(--settings-fg, inherit);
7287
+ font-weight: 600;
7288
+ }
7289
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary {
7290
+ cursor: pointer;
7291
+ list-style: none;
7292
+ font-weight: 500;
7293
+ }
7294
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary::-webkit-details-marker { display: none; }
7295
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary::after {
7296
+ content: '';
7297
+ width: 5px;
7298
+ height: 5px;
7299
+ margin-left: 2px;
7300
+ border-right: 1.5px solid currentColor;
7301
+ border-bottom: 1.5px solid currentColor;
7302
+ transform: rotate(-45deg);
7303
+ opacity: 0.7;
7304
+ }
7305
+ :is(.mikedown-root, .mikedown-portal) details[open] > .ai-privacy-summary::after { transform: rotate(45deg); }
7306
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary:focus-visible {
7307
+ outline: 1px solid var(--settings-focus);
7308
+ outline-offset: 2px;
7309
+ border-radius: 2px;
7310
+ }
7311
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-glyph {
7312
+ display: inline-flex;
7313
+ flex-shrink: 0;
7314
+ color: var(--ai-info, currentColor);
7315
+ }
7316
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-body { margin-top: 6px; }
7317
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-lines {
7318
+ margin: 0;
7319
+ padding-left: 18px;
7320
+ }
7321
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-lines li + li { margin-top: 2px; }
7322
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-policy,
7323
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-extra { margin: 6px 0 0; }
7324
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-link { margin: 0; padding: 0; text-decoration: underline; }
7325
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-link:focus-visible {
7326
+ outline: 1px solid var(--settings-focus);
7327
+ outline-offset: 1px;
7328
+ }
7329
+ :is(.mikedown-root, .mikedown-portal) .ai-form-privacy { margin-bottom: 10px; }
7330
+ :is(.mikedown-root, .mikedown-portal) .settings-row--check .ai-privacy-card.ai-row-note { margin-top: 6px; }
7331
+
7332
+ /* The one-line version (first-run panel). */
7333
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line {
7334
+ display: flex;
7335
+ align-items: flex-start;
7336
+ gap: 6px;
7337
+ margin: 8px 0 0;
7338
+ font-size: 12px;
7339
+ line-height: 1.45;
7340
+ color: var(--settings-muted, var(--mikedown-text-muted));
7341
+ }
7342
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line .ai-privacy-glyph { margin-top: 2px; }
7343
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line .ai-link-btn { margin: 0; padding: 0; }
7344
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line[hidden] { display: none; }
7345
+
7346
+ /* ── Allow cloud engines over the cloud cards (ai-engines-page.ts) ───────── */
7347
+
7348
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access {
7349
+ display: flex;
7350
+ flex-direction: column;
7351
+ gap: 6px;
7352
+ margin-bottom: 4px;
7353
+ }
7354
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-row {
7355
+ display: flex;
7356
+ align-items: flex-start;
7357
+ gap: 10px;
7358
+ }
7359
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-row .ai-switch { margin-top: 1px; flex-shrink: 0; }
7360
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-text {
7361
+ display: flex;
7362
+ flex-direction: column;
7363
+ gap: 1px;
7364
+ min-width: 0;
7365
+ font-size: 12px;
7366
+ line-height: 1.45;
7367
+ }
7368
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-label {
7369
+ font-weight: 500;
7370
+ color: var(--settings-fg);
7371
+ cursor: pointer;
7372
+ }
7373
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-line { color: var(--settings-muted); }
7374
+
7375
+ /* A cloud engine's head while Allow cloud is off: the note and its button. */
7376
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-off {
7377
+ display: flex;
7378
+ align-items: center;
7379
+ gap: 10px;
7380
+ flex-wrap: wrap;
7381
+ padding: 0 12px 10px 54px;
7382
+ }
7383
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-cloud-off { padding: 0 0 10px 58px; }
7384
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-off .ai-note { flex: 1; min-width: 180px; }
7385
+
7386
+ /* The key hint as a link under the key field, and a variable's name. */
7387
+ :is(.mikedown-root, .mikedown-portal) .ai-key-link { margin: 0; padding: 0; text-decoration: underline; }
7388
+ :is(.mikedown-root, .mikedown-portal) .ai-key-env { font-family: var(--mikedown-font-mono, monospace); font-size: 11px; }
7389
+
7390
+ /* ── Toolbar first-run panel (ai-toolbar.ts) ─────────────────────────────── */
7391
+
7392
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run {
7393
+ --settings-fg: var(--mikedown-text-ui, var(--mikedown-text, #d4d4d4));
7394
+ --settings-muted: var(--mikedown-text-muted, rgba(128, 128, 128, 0.9));
7395
+ --settings-hover-bg: var(--mikedown-hover, rgba(128, 128, 128, 0.15));
7396
+ --settings-control-border: var(--mikedown-input-border, rgba(128, 128, 128, 0.35));
7397
+ --settings-focus: var(--mikedown-focus-ring, #007fd4);
7398
+ position: fixed;
7399
+ z-index: 1001;
7400
+ width: 340px;
7401
+ max-width: calc(100vw - 16px);
7402
+ box-sizing: border-box;
7403
+ padding: 14px 16px;
7404
+ background: var(--mikedown-surface-raised);
7405
+ color: var(--settings-fg);
7406
+ border: 1px solid var(--mikedown-border);
7407
+ border-radius: var(--mikedown-radius, 6px);
7408
+ box-shadow: 0 6px 20px var(--mikedown-shadow, rgba(0, 0, 0, 0.25));
7409
+ font-size: 13px;
7410
+ }
7411
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run .ai-disclaimer { margin-top: 8px; }
7412
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-verbs {
7413
+ margin: 6px 0 0;
7414
+ font-size: 12.5px;
7415
+ line-height: 1.45;
7416
+ }
7417
+ /* The disclaimer: one sentence, the full notice behind a link. */
7418
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run .ai-first-run-notice-toggle { margin-left: 2px; }
7419
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run .ai-first-run-notice-full[hidden] { display: none; }
7420
+ /* Detection and setup progress: text-sized, never louder than the copy. */
7421
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status {
7422
+ --ai-ok: var(--mikedown-success, #2e7d32);
7423
+ --ai-error: var(--mikedown-danger, #c62828);
7424
+ display: flex;
7425
+ align-items: baseline;
7426
+ gap: 7px;
7427
+ margin-top: 10px;
7428
+ font-size: 12px;
7429
+ line-height: 1.45;
7430
+ color: var(--settings-muted);
7431
+ }
7432
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status[hidden] { display: none; }
7433
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status[data-state="found"] { color: var(--settings-fg); }
7434
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status[data-state="error"] { color: var(--ai-error); }
7435
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-dot {
7436
+ position: relative;
7437
+ top: -1px;
7438
+ width: 7px;
7439
+ height: 7px;
7440
+ border-radius: 50%;
7441
+ flex-shrink: 0;
7442
+ background: var(--ai-ok);
7443
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-ok) 18%, transparent);
7444
+ }
7445
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-actions {
7446
+ display: flex;
7447
+ align-items: center;
7448
+ justify-content: flex-end;
7449
+ flex-wrap: wrap;
7450
+ gap: 8px;
7451
+ margin-top: 14px;
7452
+ }
7453
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-other {
7454
+ margin: 0 auto 0 -4px;
7455
+ padding: 2px 4px;
7456
+ }
7457
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-other[hidden] { display: none; }
7458
+
7459
+ /* ── Size tags in the models picker (local models, by this machine) ─────── */
7460
+
7461
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--fits {
7462
+ color: var(--ai-ok);
7463
+ background: color-mix(in srgb, var(--ai-ok) 12%, transparent);
7464
+ }
7465
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--tight {
7466
+ color: var(--ai-warn);
7467
+ background: color-mix(in srgb, var(--ai-warn) 12%, transparent);
7468
+ }
7469
+
7470
+ /* ── Setup wizard (ai-setup-wizard.ts), the page's 'wizard' section ─────── */
7471
+
7472
+ /* The header line: Skip in Done's place, and the step dots beside the title. */
7473
+ :is(.mikedown-root, .mikedown-portal) .ai-page-header > [hidden],
7474
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title-line > [hidden] { display: none; }
7475
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-steps {
7476
+ display: inline-flex;
7477
+ align-items: center;
7478
+ gap: 5px;
7479
+ margin-left: 4px;
7480
+ }
7481
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-dot {
7482
+ width: 6px;
7483
+ height: 6px;
7484
+ border-radius: 50%;
7485
+ background: var(--settings-control-border);
7486
+ }
7487
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-dot.is-done { background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 45%, transparent); }
7488
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-dot.is-current { background: var(--mikedown-accent, #3f51b5); }
7489
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-steps-text {
7490
+ margin-left: 3px;
7491
+ font-size: 11.5px;
7492
+ color: var(--settings-muted);
7493
+ font-variant-numeric: tabular-nums;
7494
+ }
7495
+
7496
+ /* One readable column, centred, like a sheet. */
7497
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard {
7498
+ flex: 1;
7499
+ min-height: 0;
7500
+ overflow-y: auto;
7501
+ container: settings-content / inline-size;
7502
+ }
7503
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-column {
7504
+ box-sizing: border-box;
7505
+ display: flex;
7506
+ flex-direction: column;
7507
+ gap: 18px;
7508
+ max-width: 640px;
7509
+ margin: 0 auto;
7510
+ padding: 32px 32px 48px;
7511
+ animation: ai-arrive 180ms var(--ai-ease);
7512
+ }
7513
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-wizard-column { padding: 20px 16px 40px; }
7514
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-head {
7515
+ display: flex;
7516
+ flex-direction: column;
7517
+ gap: 4px;
7518
+ }
7519
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-title {
7520
+ margin: 0;
7521
+ font-size: 18px;
7522
+ font-weight: 600;
7523
+ letter-spacing: -0.01em;
7524
+ color: var(--settings-fg);
7525
+ overflow-wrap: anywhere;
7526
+ }
7527
+ /* tabindex -1: only code moves focus here (for screen readers), so no ring, even where :focus-visible would match. */
7528
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-title:is(:focus, :focus-visible) { outline: none; }
7529
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-lede {
7530
+ margin: 0;
7531
+ max-width: 540px;
7532
+ font-size: 12.5px;
7533
+ line-height: 1.5;
7534
+ color: var(--settings-muted);
7535
+ }
7536
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-quiet {
7537
+ margin: 0;
7538
+ font-size: 12px;
7539
+ line-height: 1.5;
7540
+ color: var(--settings-muted);
7541
+ }
7542
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-quiet .ai-link-btn { margin: 0; padding: 0; }
7543
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-scanning {
7544
+ display: flex;
7545
+ align-items: center;
7546
+ gap: 8px;
7547
+ padding: 14px 0;
7548
+ font-size: 12.5px;
7549
+ color: var(--settings-muted);
7550
+ }
7551
+
7552
+ /* Step 1: the choices, as large rows. The lead one carries the accent (or
7553
+ the running green, like a running server's card). */
7554
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-options {
7555
+ display: flex;
7556
+ flex-direction: column;
7557
+ gap: 8px;
7558
+ }
7559
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option {
7560
+ display: flex;
7561
+ align-items: center;
7562
+ gap: 12px;
7563
+ width: 100%;
7564
+ min-width: 0;
7565
+ padding: 12px 14px;
7566
+ border: 1px solid var(--settings-divider);
7567
+ border-radius: var(--mikedown-radius, 6px);
7568
+ background: var(--mikedown-surface-raised, transparent);
7569
+ color: var(--settings-fg);
7570
+ font: inherit;
7571
+ text-align: left;
7572
+ cursor: pointer;
7573
+ transition: border-color 120ms var(--ai-ease), background-color 120ms var(--ai-ease), transform 120ms var(--ai-ease);
7574
+ }
7575
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option:hover {
7576
+ border-color: var(--settings-control-border);
7577
+ background: var(--ai-row-hover);
7578
+ }
7579
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option:active { transform: translateY(1px); }
7580
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option:focus-visible {
7581
+ outline: 1px solid var(--settings-focus);
7582
+ outline-offset: 1px;
7583
+ }
7584
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead {
7585
+ border-color: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 55%, var(--settings-divider));
7586
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 6%, var(--mikedown-surface-raised, transparent));
7587
+ }
7588
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead:hover { border-color: var(--mikedown-accent, #3f51b5); }
7589
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead[data-state="running"] {
7590
+ border-color: color-mix(in srgb, var(--ai-ok) 55%, var(--settings-divider));
7591
+ background: color-mix(in srgb, var(--ai-ok) 6%, var(--mikedown-surface-raised, transparent));
7592
+ }
7593
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead[data-state="running"]:hover { border-color: var(--ai-ok); }
7594
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option[aria-busy="true"] { cursor: progress; }
7595
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-glyph .ai-glyph {
7596
+ width: 36px;
7597
+ height: 36px;
7598
+ border-radius: 9px;
7599
+ font-size: 13px;
7600
+ }
7601
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-glyph-cloud { color: var(--settings-muted); }
7602
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-glyph-cloud svg { width: 16px; height: 16px; }
7603
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-text {
7604
+ flex: 1;
7605
+ display: flex;
7606
+ flex-direction: column;
7607
+ gap: 2px;
7608
+ min-width: 0;
7609
+ }
7610
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-name {
7611
+ display: flex;
7612
+ align-items: center;
7613
+ gap: 7px;
7614
+ font-size: 13px;
7615
+ font-weight: 600;
7616
+ font-variant-numeric: tabular-nums;
7617
+ }
7618
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-caption {
7619
+ font-size: 12px;
7620
+ line-height: 1.45;
7621
+ color: var(--settings-muted);
7622
+ }
7623
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-chevron {
7624
+ display: inline-flex;
7625
+ flex-shrink: 0;
7626
+ color: var(--settings-muted);
7627
+ }
7628
+
7629
+ /* Cards and servers (steps 1 and 2). */
7630
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-group {
7631
+ display: flex;
7632
+ flex-direction: column;
7633
+ gap: 8px;
7634
+ }
7635
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard .ai-cards-grid { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
7636
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard .ai-card.is-selected {
7637
+ border-color: var(--mikedown-accent, #3f51b5);
7638
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 7%, var(--mikedown-surface-raised, transparent));
7639
+ }
7640
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-servers {
7641
+ display: grid;
7642
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
7643
+ gap: 8px;
7644
+ }
7645
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-server {
7646
+ display: flex;
7647
+ flex-direction: column;
7648
+ gap: 4px;
7649
+ min-width: 0;
7650
+ }
7651
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-install {
7652
+ padding: 0 4px;
7653
+ font-size: 11.5px;
7654
+ line-height: 1.45;
7655
+ color: var(--settings-muted);
7656
+ }
7657
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-link { margin: 0; padding: 0; text-decoration: underline; }
7658
+
7659
+ /* Advanced: local, folded. */
7660
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-advanced {
7661
+ display: flex;
7662
+ flex-direction: column;
7663
+ gap: 8px;
7664
+ padding-top: 14px;
7665
+ border-top: 1px solid var(--settings-divider);
7666
+ }
7667
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-advanced-panel {
7668
+ display: flex;
7669
+ flex-direction: column;
7670
+ align-items: flex-start;
7671
+ gap: 8px;
7672
+ padding-left: 20px;
7673
+ animation: ai-arrive 180ms var(--ai-ease);
7674
+ }
7675
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-advanced-panel[hidden] { display: none; }
7676
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-hardware {
7677
+ margin: 0;
7678
+ max-width: 540px;
7679
+ font-size: 12.5px;
7680
+ line-height: 1.5;
7681
+ color: var(--settings-fg);
7682
+ }
7683
+
7684
+ /* Step 2: the form under the cards, and the note over a cloud key field. */
7685
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-form {
7686
+ display: flex;
7687
+ flex-direction: column;
7688
+ gap: 10px;
7689
+ }
7690
+ /* Normal text on a faint accent tint, so it reads in light and dark themes alike. */
7691
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription {
7692
+ margin-left: 126px;
7693
+ padding: 8px 10px;
7694
+ border: 1px solid color-mix(in srgb, var(--mikedown-accent, #3f51b5) 30%, transparent);
7695
+ border-radius: var(--mikedown-radius-sm, 4px);
7696
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 7%, transparent);
7697
+ font-size: 12px;
7698
+ line-height: 1.5;
7699
+ color: var(--settings-fg);
7700
+ }
7701
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription-text { margin: 0; }
7702
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription-links { margin: 4px 0 0; }
7703
+ @container settings-content (max-width: 520px) {
7704
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription { margin-left: 0; }
7705
+ }
7706
+
7707
+ /* The step's one primary action, bottom right like a sheet. */
7708
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-footer {
7709
+ display: flex;
7710
+ align-items: center;
7711
+ justify-content: flex-end;
7712
+ gap: 12px;
7713
+ padding-top: 4px;
7714
+ }
7715
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-hint {
7716
+ flex: 1;
7717
+ text-align: right;
7718
+ font-size: 12px;
7719
+ color: var(--settings-muted);
7720
+ }
7721
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-next { min-width: 88px; }
7722
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-next[aria-disabled="true"] { opacity: 0.5; cursor: default; }
7723
+
7724
+ /* Step 3: done. */
7725
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-done-icon {
7726
+ display: inline-flex;
7727
+ align-items: center;
7728
+ justify-content: center;
7729
+ width: 40px;
7730
+ height: 40px;
7731
+ margin-bottom: 6px;
7732
+ border-radius: 50%;
7733
+ color: var(--ai-ok);
7734
+ background: color-mix(in srgb, var(--ai-ok) 14%, transparent);
7735
+ }
7736
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-done-icon svg { width: 18px; height: 18px; }
7737
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-model {
7738
+ display: flex;
7739
+ align-items: center;
7740
+ gap: 10px;
7741
+ }
7742
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-model-label { font-size: 12.5px; color: var(--settings-fg); }
7743
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-model-select { max-width: 340px; }
7744
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-privacy {
7745
+ display: flex;
7746
+ align-items: flex-start;
7747
+ gap: 7px;
7748
+ margin: 0;
7749
+ max-width: 560px;
7750
+ font-size: 12.5px;
7751
+ line-height: 1.5;
7752
+ color: var(--settings-muted);
7753
+ }
7754
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-privacy .ai-privacy-glyph { margin-top: 3px; }
7755
+
7756
+ /* ── Setup wizard: cloud statement and hidden disclaimer (ai-setup-wizard.ts) ── */
7757
+
7758
+ :is(.mikedown-root, .mikedown-portal) .ai-page-disclaimer[hidden] { display: none; }
7759
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-cloud-line {
7760
+ margin: 0;
7761
+ font-size: 12px;
7762
+ line-height: 1.45;
7763
+ color: var(--settings-muted, var(--mikedown-text-muted));
7764
+ }
7765
+
7766
+ /* ═══ ai-rewrite.css ═══ */
7767
+ /* MikeDown — selection rewrite (ai-rewrite.ts): the target highlight and
7768
+ * the preview popover. Overlays live in the portal and
7769
+ * read only --mikedown-* tokens.
7770
+ */
7771
+
7772
+ /* ── Target highlight (PM inline decoration, CM mark) ───────────────────── */
7773
+
7774
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite-target {
7775
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 16%, transparent);
7776
+ box-shadow: 0 1px 0 color-mix(in srgb, var(--mikedown-accent, #3f51b5) 55%, transparent);
7777
+ border-radius: 2px;
7778
+ }
7779
+
7780
+ /* ── Popover ────────────────────────────────────────────────────────────── */
7781
+
7782
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite {
7783
+ position: fixed;
7784
+ z-index: 995;
7785
+ display: flex;
7786
+ flex-direction: column;
7787
+ width: 440px;
7788
+ max-width: calc(100vw - 16px);
7789
+ max-height: min(70vh, 520px);
7790
+ border: 1px solid var(--mikedown-border, rgba(15, 15, 20, 0.1));
7791
+ border-radius: var(--mikedown-radius-lg, 12px);
7792
+ background: var(--mikedown-surface-raised, #fff);
7793
+ color: var(--mikedown-text-ui, #3a3a3d);
7794
+ box-shadow: 0 12px 36px var(--mikedown-shadow, rgba(15, 15, 20, 0.12)), 0 0 1px var(--mikedown-shadow, rgba(15, 15, 20, 0.12));
7795
+ font-family: var(--mikedown-font-ui, system-ui, sans-serif);
7796
+ font-size: 13px;
7797
+ line-height: 1.45;
7798
+ overflow: hidden;
7799
+ animation: mikedown-ai-fade 0.14s ease-out;
7800
+ }
7801
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite:focus { outline: none; }
7802
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="split"]:is([data-phase="running"], [data-phase="done"]) { width: 680px; }
7803
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite [hidden] { display: none !important; }
7804
+
7805
+ @keyframes mikedown-ai-fade {
7806
+ from { opacity: 0; transform: translateY(2px); }
7807
+ to { opacity: 1; transform: none; }
7808
+ }
7809
+
7810
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-head {
7811
+ display: flex;
7812
+ align-items: center;
7813
+ gap: 8px;
7814
+ min-height: 36px;
7815
+ padding: 6px 6px 6px 12px;
7816
+ border-bottom: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
7817
+ }
7818
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-spark { display: inline-flex; flex-shrink: 0; color: var(--mikedown-accent, #3f51b5); }
7819
+ /* A long title ("Translate · Spanish · Whole document") gives way: it
7820
+ ellipsizes, and the thinking dial and Close never shrink, so nothing is
7821
+ pushed past the edge. */
7822
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-title {
7823
+ flex: 0 1000 auto;
7824
+ min-width: 6em;
7825
+ font-weight: 600;
7826
+ white-space: nowrap;
7827
+ overflow: hidden;
7828
+ text-overflow: ellipsis;
7829
+ }
7830
+
7831
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge {
7832
+ display: inline-flex;
7833
+ align-items: center;
7834
+ gap: 4px;
7835
+ flex: 0 1 auto;
7836
+ /* Never narrower than the glyph, locality and engine; only the model name
7837
+ gives way, and only when the badge alone is wider than the footer. */
7838
+ min-width: min-content;
7839
+ max-width: 100%;
7840
+ margin-left: auto;
7841
+ padding: 1px 8px 1px 6px;
7842
+ border: 1px solid transparent;
7843
+ border-radius: 10px;
7844
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
7845
+ color: var(--mikedown-text-muted, #6f6f74);
7846
+ font-size: 11.5px;
7847
+ line-height: 16px;
7848
+ white-space: nowrap;
7849
+ }
7850
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-glyph { display: inline-flex; flex-shrink: 0; }
7851
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-text {
7852
+ display: grid;
7853
+ grid-template-columns: auto minmax(3ch, auto);
7854
+ min-width: 0;
7855
+ }
7856
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-model { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
7857
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge[data-where="local"] .ai-rw-badge-glyph { color: var(--mikedown-success, #2e7d32); }
7858
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge[data-where="cloud"] { border-color: color-mix(in srgb, var(--mikedown-info, #1e70d6) 35%, transparent); }
7859
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge[data-where="cloud"] .ai-rw-badge-glyph { color: var(--mikedown-info, #1e70d6); }
7860
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge.is-pending { opacity: 0.75; }
7861
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-fallback { color: var(--mikedown-warning, #b26a00); }
7862
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-head .ai-rw-think[hidden] + .ai-rw-icon-btn { margin-left: auto; }
7863
+
7864
+ /* Thinking dial: a segmented pill, right of the title (also the AI menu's Thinking row). */
7865
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think {
7866
+ display: inline-flex;
7867
+ align-items: center;
7868
+ flex-shrink: 0;
7869
+ margin-left: auto;
7870
+ padding: 1px;
7871
+ border: 1px solid transparent;
7872
+ border-radius: 10px;
7873
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
7874
+ color: var(--mikedown-text-muted, #6f6f74);
7875
+ font-size: 11.5px;
7876
+ line-height: 16px;
7877
+ white-space: nowrap;
7878
+ }
7879
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think[hidden] { display: none; }
7880
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-label { padding: 0 4px 0 6px; }
7881
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-seg {
7882
+ padding: 0 6px;
7883
+ border: 0;
7884
+ border-radius: 9px;
7885
+ background: none;
7886
+ color: inherit;
7887
+ font: inherit;
7888
+ line-height: inherit;
7889
+ cursor: pointer;
7890
+ }
7891
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-seg:hover { color: var(--mikedown-text-ui, #3a3a3d); }
7892
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-seg:is([aria-pressed="true"], [aria-checked="true"]) {
7893
+ background: var(--mikedown-surface-raised, #fff);
7894
+ color: var(--mikedown-text-ui, #3a3a3d);
7895
+ box-shadow: 0 0 0 1px var(--mikedown-divider, rgba(15, 15, 20, 0.08));
7896
+ }
7897
+
7898
+ /* Summary kind: TL;DR ⇄ Outline, the dial's pill beside the title. */
7899
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind {
7900
+ display: inline-flex;
7901
+ align-items: center;
7902
+ flex-shrink: 0;
7903
+ padding: 1px;
7904
+ border-radius: 10px;
7905
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
7906
+ color: var(--mikedown-text-muted, #6f6f74);
7907
+ font-size: 11.5px;
7908
+ line-height: 16px;
7909
+ white-space: nowrap;
7910
+ }
7911
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind[hidden] { display: none; }
7912
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind-seg {
7913
+ padding: 0 7px;
7914
+ border: 0;
7915
+ border-radius: 9px;
7916
+ background: none;
7917
+ color: inherit;
7918
+ font: inherit;
7919
+ line-height: inherit;
7920
+ cursor: pointer;
7921
+ }
7922
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind-seg:hover { color: var(--mikedown-text-ui, #3a3a3d); }
7923
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind-seg[aria-pressed="true"] {
7924
+ background: var(--mikedown-surface-raised, #fff);
7925
+ color: var(--mikedown-text-ui, #3a3a3d);
7926
+ box-shadow: 0 0 0 1px var(--mikedown-divider, rgba(15, 15, 20, 0.08));
7927
+ }
7928
+
7929
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-icon-btn {
7930
+ display: inline-flex;
7931
+ align-items: center;
7932
+ justify-content: center;
7933
+ width: 24px;
7934
+ height: 24px;
7935
+ flex-shrink: 0;
7936
+ border: 0;
7937
+ border-radius: var(--mikedown-radius-sm, 6px);
7938
+ background: none;
7939
+ color: var(--mikedown-text-muted, #6f6f74);
7940
+ cursor: pointer;
7941
+ }
7942
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-icon-btn:hover { background: var(--mikedown-hover, rgba(55, 53, 47, 0.06)); color: var(--mikedown-text-ui, #3a3a3d); }
7943
+
7944
+ /* Choices (hotkey, Custom prompt…): one row per group, a short label on the
7945
+ * left and a thin rule between rows, then the custom prompt. */
7946
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-choose { display: flex; flex-direction: column; gap: 10px; padding: 12px; overflow: auto; }
7947
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-menu { display: flex; flex-direction: column; }
7948
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group {
7949
+ display: grid;
7950
+ grid-template-columns: 76px 1fr;
7951
+ align-items: start;
7952
+ gap: 8px;
7953
+ padding: 6px 0;
7954
+ }
7955
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group + .ai-rw-group { border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08)); }
7956
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group:first-child { padding-top: 0; }
7957
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group-label {
7958
+ padding-top: 5px;
7959
+ color: var(--mikedown-text-muted, #6f6f74);
7960
+ font-size: 11px;
7961
+ font-weight: 500;
7962
+ letter-spacing: 0.02em;
7963
+ text-transform: uppercase;
7964
+ }
7965
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-chips { display: flex; flex-wrap: wrap; gap: 6px; }
7966
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-chip {
7967
+ height: 26px;
7968
+ padding: 0 11px;
7969
+ border: 1px solid var(--mikedown-input-border, rgba(15, 15, 20, 0.16));
7970
+ border-radius: 13px;
7971
+ background: none;
7972
+ color: var(--mikedown-text-ui, #3a3a3d);
7973
+ font: inherit;
7974
+ cursor: pointer;
7975
+ }
7976
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-chip:hover { background: var(--mikedown-hover, rgba(55, 53, 47, 0.06)); }
7977
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-form { display: flex; gap: 6px; }
7978
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-input {
7979
+ flex: 1;
7980
+ min-width: 0;
7981
+ height: 30px;
7982
+ padding: 0 10px;
7983
+ border: 1px solid var(--mikedown-input-border, rgba(15, 15, 20, 0.16));
7984
+ border-radius: var(--mikedown-radius-sm, 6px);
7985
+ background: var(--mikedown-input-bg, #fff);
7986
+ color: var(--mikedown-text-ui, #3a3a3d);
7987
+ font: inherit;
7988
+ }
7989
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-input:focus { outline: none; border-color: var(--mikedown-focus-ring, rgba(63, 81, 181, 0.55)); }
7990
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-input::placeholder { color: var(--mikedown-text-muted, #6f6f74); }
7991
+
7992
+ /* Second-level picker (Translate…, Reading level…). */
7993
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker { display: flex; flex-direction: column; gap: 8px; min-height: 0; }
7994
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-head { display: flex; align-items: center; gap: 4px; margin: -4px 0 0 -4px; }
7995
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-title { font-weight: 600; }
7996
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-list {
7997
+ display: flex;
7998
+ flex-direction: column;
7999
+ max-height: 260px;
8000
+ overflow: auto;
8001
+ }
8002
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option {
8003
+ display: flex;
8004
+ align-items: center;
8005
+ gap: 6px;
8006
+ width: 100%;
8007
+ min-height: 28px;
8008
+ padding: 0 10px 0 6px;
8009
+ border: 0;
8010
+ border-radius: var(--mikedown-radius-sm, 6px);
8011
+ background: none;
8012
+ color: var(--mikedown-text-ui, #3a3a3d);
8013
+ font: inherit;
8014
+ text-align: left;
8015
+ cursor: pointer;
8016
+ }
8017
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option:hover { background: var(--mikedown-hover, rgba(55, 53, 47, 0.06)); }
8018
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option-check { display: inline-flex; width: 14px; flex-shrink: 0; color: var(--mikedown-accent, #3f51b5); visibility: hidden; }
8019
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option[aria-checked="true"] .ai-rw-option-check { visibility: visible; }
8020
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option--other .ai-rw-option-label { color: var(--mikedown-text-muted, #6f6f74); }
8021
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option-sep {
8022
+ flex-shrink: 0;
8023
+ height: 1px;
8024
+ margin: 4px 6px;
8025
+ background: var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8026
+ }
8027
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-foot {
8028
+ padding-top: 8px;
8029
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8030
+ }
8031
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-toggle { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
8032
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-toggle input { margin: 0; accent-color: var(--mikedown-accent, #3f51b5); }
8033
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-toggle:has(input:disabled) { cursor: default; color: var(--mikedown-text-muted, #6f6f74); }
8034
+
8035
+ /* Preview: one pane, or old and new side by side for a multi-line selection. */
8036
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-body {
8037
+ display: grid;
8038
+ grid-template-columns: 1fr;
8039
+ min-height: 0;
8040
+ flex: 1;
8041
+ }
8042
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="single"] .ai-rw-pane--old { display: none; }
8043
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="split"] .ai-rw-body { grid-template-columns: 1fr 1fr; }
8044
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-pane { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
8045
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-pane--old { border-right: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08)); }
8046
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-label {
8047
+ padding: 8px 14px 0;
8048
+ color: var(--mikedown-text-muted, #6f6f74);
8049
+ font-size: 11px;
8050
+ font-weight: 500;
8051
+ letter-spacing: 0.02em;
8052
+ text-transform: uppercase;
8053
+ }
8054
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="single"] .ai-rw-label { display: none; }
8055
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-text {
8056
+ padding: 8px 14px 12px;
8057
+ max-height: 300px;
8058
+ overflow: auto;
8059
+ color: var(--mikedown-text, #2b2b2b);
8060
+ font-family: var(--mikedown-font-family, var(--mikedown-font-ui, system-ui, sans-serif));
8061
+ font-size: 13.5px;
8062
+ line-height: 1.55;
8063
+ white-space: pre-wrap;
8064
+ overflow-wrap: anywhere;
8065
+ }
8066
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-pane--old .ai-rw-text { color: var(--mikedown-text-muted, #6f6f74); }
8067
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out[data-placeholder]::before {
8068
+ content: attr(data-placeholder);
8069
+ color: var(--mikedown-text-muted, #6f6f74);
8070
+ }
8071
+
8072
+ /* The rendered preview (ai-markdown-preview.ts). Plain prose keeps the raw text's look:
8073
+ paragraphs hold their own newlines and a blank line between them. */
8074
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out { display: block; }
8075
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out > :first-child { margin-top: 0; }
8076
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out > :last-child { margin-bottom: 0; }
8077
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-p,
8078
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h,
8079
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list,
8080
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-quote,
8081
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-pre { margin: 0 0 0.7em; }
8082
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list { padding-left: 1.5em; }
8083
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list .ai-rw-md-list { margin: 0.2em 0 0; }
8084
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list > li { margin: 0.15em 0; }
8085
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h { font-weight: 600; }
8086
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h[data-level="1"] { font-size: 1.15em; }
8087
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h[data-level="2"] { font-size: 1.08em; }
8088
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-quote {
8089
+ padding-left: 10px;
8090
+ border-left: 2px solid var(--mikedown-divider, rgba(15, 15, 20, 0.16));
8091
+ color: var(--mikedown-text-muted, #6f6f74);
8092
+ }
8093
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-pre {
8094
+ padding: 6px 8px;
8095
+ border-radius: 6px;
8096
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
8097
+ overflow: auto;
8098
+ }
8099
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out code {
8100
+ font-family: var(--mikedown-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
8101
+ font-size: 0.92em;
8102
+ }
8103
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out :not(pre) > code {
8104
+ padding: 0 4px;
8105
+ border-radius: 4px;
8106
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
8107
+ }
8108
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-link { text-decoration: underline; text-decoration-color: var(--mikedown-divider, rgba(15, 15, 20, 0.3)); text-underline-offset: 2px; }
8109
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-hr { margin: 0.7em 0; border: 0; border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.12)); }
8110
+ /* A grid item drops its trailing space; keep the "·" separator's. */
8111
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-engine { white-space: pre; }
8112
+
8113
+ /* A calm caret: a slow fade, not a hard blink, only while streaming. */
8114
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-caret {
8115
+ display: none;
8116
+ width: 2px;
8117
+ height: 1.05em;
8118
+ margin-left: 1px;
8119
+ border-radius: 1px;
8120
+ vertical-align: -0.15em;
8121
+ background: var(--mikedown-accent, #3f51b5);
8122
+ }
8123
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-phase="running"] .ai-rw-caret {
8124
+ display: inline-block;
8125
+ animation: mikedown-ai-caret 1.2s ease-in-out infinite;
8126
+ }
8127
+ @keyframes mikedown-ai-caret {
8128
+ 0%, 100% { opacity: 0.85; }
8129
+ 50% { opacity: 0.2; }
8130
+ }
8131
+ @media (prefers-reduced-motion: reduce) {
8132
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-phase="running"] .ai-rw-caret { animation: none; opacity: 0.6; }
8133
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite { animation: none; }
8134
+ }
8135
+
8136
+ /* Errors. */
8137
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error { display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; padding: 12px 14px; }
8138
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-icon { display: inline-flex; padding-top: 1px; color: var(--mikedown-warning, #b26a00); }
8139
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-title { font-weight: 600; color: var(--mikedown-text-ui, #3a3a3d); }
8140
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-message { color: var(--mikedown-text-ui, #3a3a3d); }
8141
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-detail { margin-top: 2px; color: var(--mikedown-text-muted, #6f6f74); font-size: 12px; overflow-wrap: anywhere; }
8142
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-more { margin-top: 4px; }
8143
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-more > summary { color: var(--mikedown-text-muted, #6f6f74); font-size: 12px; cursor: pointer; }
8144
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-actions { grid-column: 2; display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
8145
+
8146
+ /* Structure check: a quiet warning line above the footer; Accept stays on. */
8147
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-warn {
8148
+ display: flex;
8149
+ align-items: flex-start;
8150
+ gap: 6px;
8151
+ padding: 6px 14px;
8152
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8153
+ color: var(--mikedown-warning, #b26a00);
8154
+ font-size: 12px;
8155
+ }
8156
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-warn-icon { display: inline-flex; padding-top: 2px; flex-shrink: 0; }
8157
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-warn-text { overflow-wrap: anywhere; }
8158
+
8159
+ /* Title candidates (choose mode) and the effect hint under them. */
8160
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-titles-box { display: flex; flex-direction: column; gap: 6px; padding: 8px 8px 10px; }
8161
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-titles { display: flex; flex-direction: column; }
8162
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-title-option { min-height: 32px; padding: 4px 10px; }
8163
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-title-option .ai-rw-option-label { overflow-wrap: anywhere; }
8164
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-titles-hint { padding: 0 10px; color: var(--mikedown-text-muted, #6f6f74); font-size: 12px; }
8165
+
8166
+ /* Coverage: the document was cut to fit the model's context. */
8167
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-coverage {
8168
+ padding: 6px 14px;
8169
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8170
+ color: var(--mikedown-text-muted, #6f6f74);
8171
+ font-size: 12px;
8172
+ }
8173
+
8174
+ /* Footer: the actions, then the engine badge on the right. A badge that
8175
+ does not fit beside them wraps to its own line before it ellipsizes. */
8176
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-foot {
8177
+ display: flex;
8178
+ flex-wrap: wrap;
8179
+ align-items: center;
8180
+ gap: 6px;
8181
+ padding: 8px 10px;
8182
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8183
+ }
8184
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-note { color: var(--mikedown-warning, #b26a00); font-size: 12px; }
8185
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-stats {
8186
+ margin-left: auto;
8187
+ color: var(--mikedown-text-muted, #6f6f74);
8188
+ font-size: 11.5px;
8189
+ font-variant-numeric: tabular-nums;
8190
+ white-space: nowrap;
8191
+ cursor: default;
8192
+ }
8193
+ /* The stats take the push to the right; the badge sits beside them. */
8194
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-stats:not([hidden]) + .ai-rw-badge { margin-left: 0; }
8195
+
8196
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn {
8197
+ height: 26px;
8198
+ padding: 0 11px;
8199
+ border: 1px solid var(--mikedown-button-border, transparent);
8200
+ border-radius: var(--mikedown-radius-sm, 6px);
8201
+ background: var(--mikedown-button-bg, #f1f1ef);
8202
+ color: var(--mikedown-button-text, #2b2b2b);
8203
+ font: inherit;
8204
+ font-size: 12.5px;
8205
+ cursor: pointer;
8206
+ white-space: nowrap;
8207
+ }
8208
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn:hover { background: var(--mikedown-button-hover, #e7e7e4); }
8209
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn--primary {
8210
+ background: var(--mikedown-accent, #3f51b5);
8211
+ color: var(--mikedown-accent-text, #fff);
8212
+ }
8213
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn--primary:hover { background: var(--mikedown-accent-hover, #3546a0); }
8214
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn[aria-disabled="true"] { opacity: 0.5; cursor: default; }
8215
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn[aria-disabled="true"]:hover { background: var(--mikedown-button-bg, #f1f1ef); }
8216
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn--primary[aria-disabled="true"]:hover { background: var(--mikedown-accent, #3f51b5); }
8217
+ /* Explain (read-only): the note previews as the quote Insert below adds. */
8218
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="readOnly"] .ai-rw-pane--new .ai-rw-text {
8219
+ margin: 10px 14px 12px;
8220
+ padding: 0 0 0 12px;
8221
+ border-left: 3px solid var(--mikedown-quote-border, rgba(150, 150, 150, 0.5));
8222
+ }
8223
+ /* Summary (insert): the preview reads like the block it inserts. */
8224
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="insert"] .ai-rw-text { max-height: 360px; }
8225
+ /* Whole-document translate: more room for the new text (there is no old pane). */
8226
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="replaceDocument"] { max-height: min(80vh, 640px); }
8227
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="replaceDocument"] .ai-rw-text { max-height: 420px; }
8228
+
8229
+ :is(.mikedown-root, .mikedown-portal) :is(.ai-rw-btn, .ai-rw-chip, .ai-rw-icon-btn, .ai-rw-option, .ai-rw-think-seg, .ai-rw-kind-seg):focus-visible {
8230
+ outline: 2px solid var(--mikedown-focus-ring, rgba(63, 81, 181, 0.55));
8231
+ outline-offset: 1px;
8232
+ }
8233
+
8234
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-sr {
8235
+ position: absolute;
8236
+ width: 1px;
8237
+ height: 1px;
8238
+ overflow: hidden;
8239
+ clip: rect(0 0 0 0);
8240
+ white-space: nowrap;
8241
+ }
8242
+
8243
+ @media (max-width: 520px) {
8244
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="split"] .ai-rw-body { grid-template-columns: 1fr; }
8245
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-pane--old { border-right: 0; border-bottom: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08)); }
8246
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-label { display: none; }
8247
+ }