@mikedown/core 0.2.0 → 0.4.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 +19 -0
  2. package/README.md +121 -2
  3. package/dist/ai/engines-page.d.ts +137 -0
  4. package/dist/ai/engines-page.js +11 -0
  5. package/dist/ai/engines-page.js.map +1 -0
  6. package/dist/ai/index.d.ts +2722 -0
  7. package/dist/ai/index.js +684 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/ai-ui-QFYFN73D.js +6397 -0
  10. package/dist/ai-ui-QFYFN73D.js.map +1 -0
  11. package/dist/chunk-APPBNQEY.js +216 -0
  12. package/dist/chunk-APPBNQEY.js.map +1 -0
  13. package/dist/chunk-DWXGWVA3.js +5748 -0
  14. package/dist/chunk-DWXGWVA3.js.map +1 -0
  15. package/dist/chunk-GWCRPPCX.js +18 -0
  16. package/dist/chunk-GWCRPPCX.js.map +1 -0
  17. package/dist/chunk-IWCXWUWW.js +6958 -0
  18. package/dist/chunk-IWCXWUWW.js.map +1 -0
  19. package/dist/chunk-L4FO63DF.js +113 -0
  20. package/dist/chunk-L4FO63DF.js.map +1 -0
  21. package/dist/chunk-N4N54LK2.js +39 -0
  22. package/dist/chunk-N4N54LK2.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 +19 -463
  28. package/dist/index.js +7717 -2103
  29. package/dist/index.js.map +1 -1
  30. package/dist/schema-DVfssxQX.d.ts +100 -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 +4562 -108
  40. package/dist/types-2TZErbJr.d.ts +619 -0
  41. package/dist/types-DO8UBybZ.d.ts +741 -0
  42. package/package.json +11 -1
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; }
@@ -438,6 +451,356 @@
438
451
  font-variant-numeric: tabular-nums;
439
452
  }
440
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
+
441
804
  /* MikeDown Editor — Webview Styles */
442
805
 
443
806
  /* Zero-specificity reset so third-party styles inside the editor (KaTeX,
@@ -550,7 +913,7 @@
550
913
  :is(.mikedown-root, .mikedown-portal) #editor h3 { font-size: 1.25em; }
551
914
  :is(.mikedown-root, .mikedown-portal) #editor h4 { font-size: 1.1em; }
552
915
  :is(.mikedown-root, .mikedown-portal) #editor h5 { font-size: 1em; }
553
- :is(.mikedown-root, .mikedown-portal) #editor h6 { font-size: 0.9em; opacity: 0.8; }
916
+ :is(.mikedown-root, .mikedown-portal) #editor h6 { font-size: 0.9em; }
554
917
 
555
918
  :is(.mikedown-root, .mikedown-portal) #editor p {
556
919
  margin-bottom: 1em;
@@ -662,6 +1025,35 @@
662
1025
  opacity: 0.7;
663
1026
  }
664
1027
 
1028
+ /* Inline AI suggestion: inherits the text it continues, only dimmer. A widget
1029
+ decoration, never part of the document. No box of its own, so showing it
1030
+ moves nothing but what wraps after it. */
1031
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-ghost {
1032
+ display: inline;
1033
+ opacity: 0.55;
1034
+ pointer-events: none;
1035
+ -webkit-user-select: none;
1036
+ user-select: none;
1037
+ animation: mikedown-ghost-in 120ms ease-out both;
1038
+ }
1039
+
1040
+ @keyframes mikedown-ghost-in {
1041
+ from { opacity: 0; }
1042
+ to { opacity: 0.55; }
1043
+ }
1044
+
1045
+ @media (prefers-reduced-motion: reduce) {
1046
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-ghost {
1047
+ animation: none;
1048
+ }
1049
+ }
1050
+
1051
+ @media print {
1052
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-ghost {
1053
+ display: none;
1054
+ }
1055
+ }
1056
+
665
1057
  /* ─── Headings ────────────────────────────────────────────────────────────── */
666
1058
 
667
1059
  :is(.mikedown-root, .mikedown-portal) .ProseMirror h1 {
@@ -709,10 +1101,7 @@
709
1101
  }
710
1102
 
711
1103
  :is(.mikedown-root, .mikedown-portal) .ProseMirror h6 {
712
- opacity: 0.75;
713
- text-transform: uppercase;
714
1104
  font-size: 0.85em;
715
- letter-spacing: 0.05em;
716
1105
  }
717
1106
 
718
1107
  /* ─── Lists ───────────────────────────────────────────────────────────────── */
@@ -1217,16 +1606,11 @@
1217
1606
  background: var(--mikedown-selection, rgba(38,79,120,0.4)) !important;
1218
1607
  }
1219
1608
 
1220
- /* Column resize handle */
1221
- :is(.mikedown-root, .mikedown-portal) .ProseMirror .column-resize-handle {
1222
- position: absolute;
1223
- right: -2px;
1224
- top: 0;
1225
- bottom: 0;
1226
- width: 4px;
1227
- background: var(--mikedown-focus-ring);
1228
- pointer-events: none;
1229
- border-radius: 2px;
1609
+ /* Select Table: the whole table as a node selection */
1610
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror table.ProseMirror-selectednode,
1611
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .tableWrapper.ProseMirror-selectednode table {
1612
+ outline: 2px solid var(--mikedown-focus-ring);
1613
+ outline-offset: 1px;
1230
1614
  }
1231
1615
 
1232
1616
  /* ═══ images.css ═══ */
@@ -1574,8 +1958,11 @@
1574
1958
 
1575
1959
  /* Frontmatter Block */
1576
1960
 
1961
+ /* In flow above the document inside the scrolling container, with the same
1962
+ column as #editor. */
1577
1963
  :is(.mikedown-root, .mikedown-portal) .frontmatter-block {
1578
- margin-bottom: 1em;
1964
+ max-width: var(--mikedown-content-width, 100%);
1965
+ margin: 0 auto 1em;
1579
1966
  border: 1px solid var(--mikedown-border, rgba(128,128,128,0.2));
1580
1967
  border-radius: var(--mikedown-radius, 6px);
1581
1968
  overflow: hidden;
@@ -1615,8 +2002,8 @@
1615
2002
  font-family: var(--mikedown-font-mono, monospace);
1616
2003
  font-size: 0.85em;
1617
2004
  line-height: 1.5;
1618
- white-space: pre;
1619
- overflow-x: auto;
2005
+ white-space: pre-wrap;
2006
+ overflow-wrap: anywhere;
1620
2007
  outline: none;
1621
2008
  background: transparent;
1622
2009
  color: var(--mikedown-text);
@@ -1789,29 +2176,92 @@
1789
2176
  margin-bottom: 0.25em;
1790
2177
  }
1791
2178
 
1792
- /* ═══ links.css ═══ */
1793
- /* Link Navigation & Anchor System */
2179
+ /* ═══ toc.css ═══ */
2180
+ /* Table of contents block (see toc-node.ts). */
1794
2181
 
1795
- /* Link styles */
1796
- :is(.mikedown-root, .mikedown-portal) .ProseMirror a {
1797
- color: var(--mikedown-link, #4e9de0);
1798
- text-decoration: none;
1799
- border-bottom: 1px solid color-mix(in srgb, var(--mikedown-link, #4e9de0) 35%, transparent);
1800
- transition: color 0.12s ease, border-color 0.12s ease;
1801
- cursor: text;
2182
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc {
2183
+ margin: 1em 0;
2184
+ padding: 0.6em 1em 0.7em;
2185
+ border: 1px solid var(--mikedown-divider);
2186
+ border-radius: var(--mikedown-radius-sm);
2187
+ font-size: 0.95em;
2188
+ cursor: default;
1802
2189
  }
1803
- :is(.mikedown-root, .mikedown-portal) .ProseMirror a:hover {
1804
- color: var(--mikedown-link-hover, #6aafee);
1805
- border-bottom-color: var(--mikedown-link-hover, #6aafee);
2190
+
2191
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc.ProseMirror-selectednode {
2192
+ outline: 2px solid var(--mikedown-focus-ring);
2193
+ outline-offset: 1px;
1806
2194
  }
1807
2195
 
1808
- /* Cmd+Click hint cursor */
1809
- .mikedown-root.cmd-held .ProseMirror a {
1810
- cursor: pointer;
1811
- border-bottom-style: dashed;
2196
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc-title {
2197
+ margin-bottom: 0.3em;
2198
+ font-size: 0.8em;
2199
+ font-weight: 600;
2200
+ letter-spacing: 0.04em;
2201
+ text-transform: uppercase;
2202
+ color: var(--mikedown-text-muted);
1812
2203
  }
1813
2204
 
1814
- /* Link tooltip */
2205
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc ul {
2206
+ margin: 0;
2207
+ padding-left: 1.2em;
2208
+ list-style: none;
2209
+ }
2210
+
2211
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc > ul {
2212
+ padding-left: 0;
2213
+ }
2214
+
2215
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc li {
2216
+ margin: 0.15em 0;
2217
+ }
2218
+
2219
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc a {
2220
+ color: var(--mikedown-link);
2221
+ text-decoration: none;
2222
+ cursor: pointer;
2223
+ }
2224
+
2225
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc a:hover {
2226
+ text-decoration: underline;
2227
+ }
2228
+
2229
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc-empty {
2230
+ margin: 0;
2231
+ color: var(--mikedown-text-muted);
2232
+ font-style: italic;
2233
+ }
2234
+
2235
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror .mikedown-toc-raw {
2236
+ margin: 0;
2237
+ font-family: var(--mikedown-font-mono);
2238
+ font-size: 0.9em;
2239
+ white-space: pre-wrap;
2240
+ }
2241
+
2242
+ /* ═══ links.css ═══ */
2243
+ /* Link Navigation & Anchor System */
2244
+
2245
+ /* Link styles */
2246
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror a {
2247
+ color: var(--mikedown-link, #4e9de0);
2248
+ text-decoration: none;
2249
+ border-bottom: 1px solid color-mix(in srgb, var(--mikedown-link, #4e9de0) 35%, transparent);
2250
+ transition: color 0.12s ease, border-color 0.12s ease;
2251
+ cursor: text;
2252
+ }
2253
+ :is(.mikedown-root, .mikedown-portal) .ProseMirror a:hover {
2254
+ color: var(--mikedown-link-hover, #6aafee);
2255
+ border-bottom-color: var(--mikedown-link-hover, #6aafee);
2256
+ }
2257
+
2258
+ /* Cmd+Click hint cursor */
2259
+ .mikedown-root.cmd-held .ProseMirror a {
2260
+ cursor: pointer;
2261
+ border-bottom-style: dashed;
2262
+ }
2263
+
2264
+ /* Link tooltip */
1815
2265
  :is(.mikedown-root, .mikedown-portal) .mikedown-link-tooltip {
1816
2266
  display: none;
1817
2267
  position: fixed;
@@ -2172,6 +2622,12 @@
2172
2622
  margin-bottom: 8px;
2173
2623
  }
2174
2624
 
2625
+ :is(.mikedown-root, .mikedown-portal) .tp-grid:focus-visible,
2626
+ :is(.mikedown-root, .mikedown-portal) .tp-ok:focus-visible {
2627
+ outline: 2px solid var(--mikedown-focus-ring, #007fd4);
2628
+ outline-offset: 2px;
2629
+ }
2630
+
2175
2631
  :is(.mikedown-root, .mikedown-portal) .tp-cell {
2176
2632
  width: 18px;
2177
2633
  height: 18px;
@@ -2335,28 +2791,38 @@
2335
2791
  display: flex;
2336
2792
  align-items: center;
2337
2793
  justify-content: center;
2338
- width: 16px;
2339
- height: 16px;
2340
- font-size: 10px;
2341
- color: var(--mikedown-text);
2794
+ width: 18px;
2795
+ height: 18px;
2796
+ /* The grip icon is drawn in currentColor: muted text works on both themes,
2797
+ and the raised surface plus an edge keep it visible on a page-coloured
2798
+ background. */
2799
+ color: var(--mikedown-text-muted, var(--mikedown-text));
2342
2800
  opacity: 0;
2343
2801
  cursor: grab;
2344
- border-radius: 3px;
2802
+ border-radius: 4px;
2803
+ border: 1px solid color-mix(in srgb, var(--mikedown-text-muted, #888) 40%, transparent);
2804
+ box-sizing: border-box;
2345
2805
  user-select: none;
2346
- background: var(--mikedown-surface-raised, transparent);
2347
- transition: opacity 0.15s ease, background 0.1s ease;
2806
+ background: var(--mikedown-surface-raised, var(--mikedown-surface, transparent));
2807
+ transition: opacity 0.15s ease, background 0.1s ease, color 0.1s ease;
2808
+ pointer-events: none;
2809
+ }
2810
+
2811
+ :is(.mikedown-root, .mikedown-portal) .td-handle svg {
2812
+ display: block;
2348
2813
  pointer-events: none;
2349
2814
  }
2350
2815
 
2351
2816
  /* Handles are on document.body, not siblings of the table, so we use a
2352
2817
  class toggled by JS instead of a sibling combinator. */
2353
2818
  :is(.mikedown-root, .mikedown-portal) .td-handles-visible .td-handle {
2354
- opacity: 0.5;
2819
+ opacity: 0.85;
2355
2820
  pointer-events: auto;
2356
2821
  }
2357
2822
 
2358
2823
  :is(.mikedown-root, .mikedown-portal) .td-handles-visible .td-handle:hover {
2359
2824
  opacity: 1;
2825
+ color: var(--mikedown-text);
2360
2826
  background: var(--mikedown-hover, rgba(90,93,94,0.31));
2361
2827
  }
2362
2828
 
@@ -2393,32 +2859,46 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2393
2859
  width: 2px;
2394
2860
  }
2395
2861
 
2396
- /* Multi-Cell Selection */
2397
-
2398
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-selected,
2399
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-selected {
2400
- background: color-mix(in srgb, var(--mikedown-focus-ring, #007fd4) 15%, transparent) !important;
2401
- position: relative;
2862
+ /* Hover "+" strips: add a column (right of the header row) or a row (under
2863
+ the last row). They exist only while the pointer is over or near a table. */
2864
+ :is(.mikedown-root, .mikedown-portal) .td-add {
2865
+ position: fixed;
2866
+ z-index: 898;
2867
+ display: flex;
2868
+ align-items: center;
2869
+ justify-content: center;
2870
+ box-sizing: border-box;
2871
+ color: var(--mikedown-text-muted, var(--mikedown-text));
2872
+ background: color-mix(in srgb, var(--mikedown-text-muted, #888) 12%, transparent);
2873
+ border: 1px dashed color-mix(in srgb, var(--mikedown-text-muted, #888) 45%, transparent);
2874
+ border-radius: 4px;
2875
+ cursor: pointer;
2876
+ user-select: none;
2877
+ opacity: 0.8;
2878
+ animation: mikedown-td-add-in 0.12s ease-out;
2879
+ transition: background 0.1s ease, color 0.1s ease, opacity 0.1s ease;
2402
2880
  }
2403
2881
 
2404
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-top,
2405
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-top {
2406
- border-top: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2882
+ :is(.mikedown-root, .mikedown-portal) .td-add:hover {
2883
+ opacity: 1;
2884
+ color: var(--mikedown-accent-text, #fff);
2885
+ background: var(--mikedown-accent, #0e639c);
2886
+ border-style: solid;
2887
+ border-color: var(--mikedown-accent, #0e639c);
2407
2888
  }
2408
2889
 
2409
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-bottom,
2410
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-bottom {
2411
- border-bottom: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2890
+ @keyframes mikedown-td-add-in {
2891
+ from { opacity: 0; }
2892
+ to { opacity: 0.8; }
2412
2893
  }
2413
2894
 
2414
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-left,
2415
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-left {
2416
- border-left: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2895
+ @media (prefers-reduced-motion: reduce) {
2896
+ :is(.mikedown-root, .mikedown-portal) .td-add { animation: none; }
2417
2897
  }
2418
2898
 
2419
- :is(.mikedown-root, .mikedown-portal) .ProseMirror td.mikedown-cell-border-right,
2420
- :is(.mikedown-root, .mikedown-portal) .ProseMirror th.mikedown-cell-border-right {
2421
- border-right: 2px solid var(--mikedown-focus-ring, #007fd4) !important;
2899
+ /* No strips while a row or column is being dragged. */
2900
+ body.td-dragging :is(.mikedown-root, .mikedown-portal) .td-add {
2901
+ display: none;
2422
2902
  }
2423
2903
 
2424
2904
  /* ═══ tasklist.css ═══ */
@@ -2711,6 +3191,60 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2711
3191
  text-overflow: ellipsis;
2712
3192
  }
2713
3193
 
3194
+ /* A muted note under the label (e.g. why the item is disabled). It takes its
3195
+ own line so a long reason never squeezes the label; the item's tooltip has
3196
+ the same text. */
3197
+ :is(.mikedown-root, .mikedown-portal) .tdd-item:has(> .tdd-item-hint) {
3198
+ flex-wrap: wrap;
3199
+ height: auto;
3200
+ min-height: 28px;
3201
+ padding-top: 4px;
3202
+ padding-bottom: 4px;
3203
+ row-gap: 0;
3204
+ }
3205
+
3206
+ :is(.mikedown-root, .mikedown-portal) .tdd-item-hint {
3207
+ flex: 1 0 100%;
3208
+ /* Under the label: past the icon (18px) and the gap (8px). */
3209
+ padding-left: 26px;
3210
+ font-size: 11px;
3211
+ line-height: 1.35;
3212
+ white-space: normal;
3213
+ color: var(--mikedown-text-muted);
3214
+ }
3215
+
3216
+ /* Status row: a note, not an action. Warning icon, label, muted detail line. */
3217
+ :is(.mikedown-root, .mikedown-portal) .tdd-status {
3218
+ display: grid;
3219
+ grid-template-columns: 18px 1fr;
3220
+ column-gap: 8px;
3221
+ align-items: start;
3222
+ padding: 6px 10px;
3223
+ margin: 0 4px;
3224
+ border-radius: 4px;
3225
+ font-size: 12px;
3226
+ line-height: 1.35;
3227
+ color: var(--mikedown-text);
3228
+ background: color-mix(in srgb, var(--mikedown-warning, #b26a00) 12%, transparent);
3229
+ cursor: default;
3230
+ user-select: text;
3231
+ }
3232
+
3233
+ :is(.mikedown-root, .mikedown-portal) .tdd-status-icon {
3234
+ display: flex;
3235
+ align-items: center;
3236
+ height: 1.35em;
3237
+ color: var(--mikedown-warning, #b26a00);
3238
+ }
3239
+
3240
+ :is(.mikedown-root, .mikedown-portal) .tdd-status-detail {
3241
+ grid-column: 2;
3242
+ font-size: 11px;
3243
+ white-space: normal;
3244
+ overflow-wrap: anywhere;
3245
+ color: var(--mikedown-text-muted);
3246
+ }
3247
+
2714
3248
  /* Active indicator — small dot on the left */
2715
3249
  :is(.mikedown-root, .mikedown-portal) .tdd-item-active-indicator {
2716
3250
  display: none;
@@ -2791,6 +3325,40 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2791
3325
  :is(.mikedown-root, .mikedown-portal) #toolbar-dropdown { forced-color-adjust: auto; }
2792
3326
  }
2793
3327
 
3328
+ /* Segmented row: a labelled radio group (the AI menu's Thinking row). */
3329
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-row {
3330
+ display: flex;
3331
+ align-items: center;
3332
+ padding: 3px 8px 5px;
3333
+ }
3334
+
3335
+ /* A segmented row's announcement ("Thinking: High"): read out, never shown. */
3336
+ :is(.mikedown-root, .mikedown-portal) .tdd-sr {
3337
+ position: absolute;
3338
+ width: 1px;
3339
+ height: 1px;
3340
+ overflow: hidden;
3341
+ clip: rect(0 0 0 0);
3342
+ white-space: nowrap;
3343
+ }
3344
+
3345
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-row > .tdd-seg {
3346
+ display: inline-flex;
3347
+ align-items: center;
3348
+ margin-left: 0;
3349
+ white-space: nowrap;
3350
+ }
3351
+
3352
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-btn {
3353
+ cursor: pointer;
3354
+ outline: none;
3355
+ }
3356
+
3357
+ :is(.mikedown-root, .mikedown-portal) .tdd-seg-btn.tdd-focused {
3358
+ outline: 2px solid var(--mikedown-focus-ring);
3359
+ outline-offset: 0;
3360
+ }
3361
+
2794
3362
  /* ═══ outline-sidebar.css ═══ */
2795
3363
  /* ─── In-Editor Document Sidebar ─────────────────────────────────────────── */
2796
3364
  /* Hosts (top-to-bottom): optional Properties section, Outline, Backlinks,
@@ -2949,6 +3517,8 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2949
3517
 
2950
3518
  /* ─── Header buttons: position toggle + pin (Outline header only) ────────── */
2951
3519
 
3520
+ :is(.mikedown-root, .mikedown-portal) .outline-fold-all,
3521
+ :is(.mikedown-root, .mikedown-portal) .outline-unfold-all,
2952
3522
  :is(.mikedown-root, .mikedown-portal) .outline-position-toggle,
2953
3523
  :is(.mikedown-root, .mikedown-portal) .outline-pin {
2954
3524
  width: 22px;
@@ -2966,6 +3536,8 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
2966
3536
  transition: background-color 0.12s ease, opacity 0.12s ease, color 0.12s ease;
2967
3537
  }
2968
3538
 
3539
+ :is(.mikedown-root, .mikedown-portal) .outline-fold-all:hover,
3540
+ :is(.mikedown-root, .mikedown-portal) .outline-unfold-all:hover,
2969
3541
  :is(.mikedown-root, .mikedown-portal) .outline-position-toggle:hover,
2970
3542
  :is(.mikedown-root, .mikedown-portal) .outline-pin:hover {
2971
3543
  opacity: 1;
@@ -3028,12 +3600,55 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
3028
3600
  opacity: 1;
3029
3601
  }
3030
3602
 
3031
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-1 { padding-left: 10px; }
3032
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-2 { padding-left: 22px; }
3033
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-3 { padding-left: 34px; }
3034
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-4 { padding-left: 46px; }
3035
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-5 { padding-left: 58px; }
3036
- :is(.mikedown-root, .mikedown-portal) .outline-item.level-6 { padding-left: 70px; }
3603
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-1 { padding-left: 24px; }
3604
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-2 { padding-left: 36px; }
3605
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-3 { padding-left: 48px; }
3606
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-4 { padding-left: 60px; }
3607
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-5 { padding-left: 72px; }
3608
+ :is(.mikedown-root, .mikedown-portal) .outline-item.level-6 { padding-left: 84px; }
3609
+
3610
+ /* Fold chevron: sits in the 14px gutter just before the heading text. */
3611
+ :is(.mikedown-root, .mikedown-portal) .outline-row {
3612
+ position: relative;
3613
+ }
3614
+
3615
+ :is(.mikedown-root, .mikedown-portal) .outline-fold {
3616
+ position: absolute;
3617
+ top: 0;
3618
+ bottom: 0;
3619
+ z-index: 1;
3620
+ width: 14px;
3621
+ padding: 0;
3622
+ background: transparent;
3623
+ border: 0;
3624
+ border-radius: 3px;
3625
+ color: var(--mikedown-text, #d4d4d4);
3626
+ font-size: 10px;
3627
+ line-height: 1;
3628
+ opacity: 0.55;
3629
+ cursor: pointer;
3630
+ }
3631
+
3632
+ :is(.mikedown-root, .mikedown-portal) .outline-fold-icon {
3633
+ display: inline-block;
3634
+ transition: transform 120ms ease-out;
3635
+ }
3636
+
3637
+ :is(.mikedown-root, .mikedown-portal) .outline-fold:hover {
3638
+ opacity: 1;
3639
+ background-color: var(--mikedown-hover, rgba(127, 127, 127, 0.18));
3640
+ }
3641
+
3642
+ :is(.mikedown-root, .mikedown-portal) .outline-row.folded .outline-fold-icon {
3643
+ transform: rotate(-90deg);
3644
+ }
3645
+
3646
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-1 .outline-fold { left: 10px; }
3647
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-2 .outline-fold { left: 22px; }
3648
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-3 .outline-fold { left: 34px; }
3649
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-4 .outline-fold { left: 46px; }
3650
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-5 .outline-fold { left: 58px; }
3651
+ :is(.mikedown-root, .mikedown-portal) .outline-row.level-6 .outline-fold { left: 70px; }
3037
3652
 
3038
3653
  /* ─── Backlink items ─────────────────────────────────────────────────────── */
3039
3654
 
@@ -3430,70 +4045,293 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
3430
4045
  color: var(--mikedown-text, #d4d4d4);
3431
4046
  }
3432
4047
 
3433
- /* ─── Footer strip ───────────────────────────────────────────────────────── */
4048
+ /* ─── Properties suggestions (AI) ────────────────────────────────────────── */
3434
4049
 
3435
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer {
4050
+ /* Suggest (sparkle) at the right of the Properties header; aria-disabled with
4051
+ the router's reason as its tooltip when nothing can serve it. */
4052
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn {
4053
+ width: 22px;
4054
+ height: 22px;
4055
+ display: inline-flex;
4056
+ align-items: center;
4057
+ justify-content: center;
3436
4058
  flex: 0 0 auto;
3437
- padding: 6px 12px;
3438
- border-top: 1px solid var(--mikedown-divider, #3c3c3c);
3439
- font-size: 10.5px;
3440
- opacity: 0.75;
3441
- color: var(--mikedown-text-muted, #a0a0a0);
3442
- font-variant-numeric: tabular-nums;
4059
+ background: transparent;
4060
+ border: 1px solid transparent;
4061
+ border-radius: 3px;
4062
+ color: var(--mikedown-icon, #d4d4d4);
4063
+ opacity: 0.55;
4064
+ cursor: pointer;
4065
+ padding: 0;
4066
+ transition: background-color 0.12s ease, opacity 0.12s ease;
4067
+ }
4068
+
4069
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn[hidden] {
4070
+ display: none;
4071
+ }
4072
+
4073
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn:hover:not(.disabled),
4074
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn:focus-visible {
4075
+ opacity: 1;
4076
+ background-color: var(--mikedown-hover, rgba(127, 127, 127, 0.18));
4077
+ }
4078
+
4079
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.disabled {
4080
+ opacity: 0.3;
4081
+ cursor: default;
4082
+ }
4083
+
4084
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest {
3443
4085
  display: flex;
3444
4086
  flex-direction: column;
3445
- gap: 2px;
4087
+ gap: 6px;
4088
+ /* Same inset as .properties-row, so chips line up with the keys above. */
4089
+ padding: 4px 10px 6px;
4090
+ font-size: 11px;
4091
+ color: var(--mikedown-text, #d4d4d4);
3446
4092
  }
3447
4093
 
3448
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row {
3449
- white-space: nowrap;
3450
- overflow: hidden;
3451
- text-overflow: ellipsis;
4094
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest[hidden] {
4095
+ display: none;
3452
4096
  }
3453
4097
 
3454
- /* Rows wrapper is rebuilt each render; it lays out as if the rows were direct
3455
- children of the footer column. */
3456
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-rows {
3457
- display: contents;
4098
+ /* Running: a thin indeterminate line, then the engine badge text. */
4099
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-progress {
4100
+ position: relative;
4101
+ height: 2px;
4102
+ overflow: hidden;
4103
+ border-radius: 1px;
4104
+ background-color: color-mix(in srgb, var(--mikedown-focus-ring, #007fd4) 18%, transparent);
3458
4105
  }
3459
4106
 
3460
- /* Persistent live region for the dismiss confirmation. Empty most of the
3461
- time; the negative margin cancels the footer's row gap so it adds no
3462
- height while empty. */
3463
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status {
3464
- white-space: normal;
4107
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-progress::after {
4108
+ content: '';
4109
+ position: absolute;
4110
+ inset: 0 auto 0 0;
4111
+ width: 35%;
4112
+ background-color: var(--mikedown-focus-ring, #007fd4);
4113
+ animation: mikedown-suggest-progress 1.1s ease-in-out infinite;
3465
4114
  }
3466
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status:empty {
3467
- margin-top: -2px;
4115
+
4116
+ @keyframes mikedown-suggest-progress {
4117
+ from { transform: translateX(-100%); }
4118
+ to { transform: translateX(300%); }
3468
4119
  }
3469
4120
 
3470
- /* ─── Support MikeDown footer link (review appeal M6) ─────────────────────
3471
- Metrics and the link group each draw a leading middle dot. The items
3472
- wrapper is shifted left by one separator width and clipped by the row, so
3473
- the item that starts a line never shows its dot. When the sidebar is too
3474
- narrow the whole link group wraps to its own line. */
3475
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row--with-support {
3476
- white-space: normal;
3477
- text-overflow: clip;
4121
+ @media (prefers-reduced-motion: reduce) {
4122
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-progress::after {
4123
+ animation: none;
4124
+ width: 100%;
4125
+ opacity: 0.5;
4126
+ }
3478
4127
  }
3479
4128
 
3480
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-items {
3481
- --sidebar-footer-sep: 0.95em;
4129
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-status {
3482
4130
  display: flex;
3483
- flex-wrap: wrap;
3484
4131
  align-items: center;
3485
- row-gap: 2px;
3486
- margin-left: calc(-1 * var(--sidebar-footer-sep));
4132
+ gap: 6px;
4133
+ min-width: 0;
4134
+ color: var(--mikedown-text-muted, #a0a0a0);
3487
4135
  }
3488
4136
 
3489
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-item {
4137
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-message {
4138
+ flex: 1 1 auto;
4139
+ min-width: 0;
4140
+ overflow: hidden;
4141
+ text-overflow: ellipsis;
3490
4142
  white-space: nowrap;
3491
4143
  }
3492
4144
 
3493
- :is(.mikedown-root, .mikedown-portal) .sidebar-footer-item::before {
3494
- content: '·';
3495
- display: inline-block;
3496
- width: var(--sidebar-footer-sep);
4145
+ /* Why the disabled Suggest cannot run: wraps (it can be a sentence or two). */
4146
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-reason {
4147
+ flex: 1 1 auto;
4148
+ min-width: 0;
4149
+ line-height: 1.4;
4150
+ }
4151
+
4152
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-error {
4153
+ color: var(--mikedown-danger, #f48771);
4154
+ line-height: 1.4;
4155
+ }
4156
+
4157
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-note {
4158
+ color: var(--mikedown-warning, #b26a00);
4159
+ line-height: 1.4;
4160
+ }
4161
+
4162
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-actions {
4163
+ display: flex;
4164
+ gap: 8px;
4165
+ }
4166
+
4167
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-action {
4168
+ background: transparent;
4169
+ border: 0;
4170
+ padding: 0;
4171
+ font: inherit;
4172
+ color: var(--mikedown-link, #3794ff);
4173
+ cursor: pointer;
4174
+ }
4175
+
4176
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-action:hover {
4177
+ text-decoration: underline;
4178
+ }
4179
+
4180
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-chips {
4181
+ display: flex;
4182
+ flex-wrap: wrap;
4183
+ gap: 4px;
4184
+ min-width: 0;
4185
+ }
4186
+
4187
+ /* Suggested chips: the tag pill look with a dashed outline. */
4188
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip {
4189
+ padding: 0 2px 0 0;
4190
+ background-color: transparent;
4191
+ border: 1px dashed color-mix(in srgb, var(--mikedown-text, #d4d4d4) 45%, transparent);
4192
+ }
4193
+
4194
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag {
4195
+ background-color: color-mix(in srgb, var(--mikedown-link, #3794ff) 8%, transparent);
4196
+ border-color: color-mix(in srgb, var(--mikedown-link, #3794ff) 60%, transparent);
4197
+ }
4198
+
4199
+ /* The `#` sits inside the apply button, not before it. */
4200
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag::before {
4201
+ content: none;
4202
+ }
4203
+
4204
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag .properties-pill-text::before {
4205
+ content: '#';
4206
+ opacity: 0.6;
4207
+ }
4208
+
4209
+ /* Title and description: one line, ellipsis, the full text in the tooltip. */
4210
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip:is([data-kind="title"], [data-kind="description"]) {
4211
+ flex: 1 1 100%;
4212
+ }
4213
+
4214
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-apply {
4215
+ display: inline-flex;
4216
+ align-items: center;
4217
+ gap: 4px;
4218
+ min-width: 0;
4219
+ flex: 1 1 auto;
4220
+ padding: 1px 2px 1px 6px;
4221
+ background: transparent;
4222
+ border: 0;
4223
+ border-radius: inherit;
4224
+ font: inherit;
4225
+ color: inherit;
4226
+ text-align: left;
4227
+ cursor: pointer;
4228
+ }
4229
+
4230
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip:hover {
4231
+ border-style: solid;
4232
+ background-color: var(--mikedown-hover, rgba(127, 127, 127, 0.18));
4233
+ }
4234
+
4235
+ :is(.mikedown-root, .mikedown-portal) .properties-pill.properties-suggest-chip.tag:hover {
4236
+ background-color: color-mix(in srgb, var(--mikedown-link, #3794ff) 22%, transparent);
4237
+ }
4238
+
4239
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-apply:focus-visible,
4240
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-chip .properties-pill-x:focus-visible {
4241
+ outline: 1px solid var(--mikedown-focus-ring, #007fd4);
4242
+ outline-offset: 1px;
4243
+ }
4244
+
4245
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-key {
4246
+ flex: 0 0 auto;
4247
+ font-size: 9.5px;
4248
+ text-transform: uppercase;
4249
+ letter-spacing: 0.04em;
4250
+ color: var(--mikedown-text-muted, #a0a0a0);
4251
+ }
4252
+
4253
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-new {
4254
+ flex: 0 0 auto;
4255
+ padding: 0 3px;
4256
+ border-radius: 3px;
4257
+ font-size: 8.5px;
4258
+ line-height: 1.4;
4259
+ text-transform: uppercase;
4260
+ letter-spacing: 0.04em;
4261
+ color: var(--mikedown-accent-text, #ffffff);
4262
+ background-color: var(--mikedown-accent, var(--mikedown-focus-ring, #0e639c));
4263
+ }
4264
+
4265
+ /* Suggested chips always show their dismiss (×). */
4266
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-chip .properties-pill-x {
4267
+ display: inline-block;
4268
+ flex: 0 0 auto;
4269
+ }
4270
+
4271
+ /* ─── Footer strip ───────────────────────────────────────────────────────── */
4272
+
4273
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer {
4274
+ flex: 0 0 auto;
4275
+ padding: 6px 12px;
4276
+ border-top: 1px solid var(--mikedown-divider, #3c3c3c);
4277
+ font-size: 10.5px;
4278
+ opacity: 0.75;
4279
+ color: var(--mikedown-text-muted, #a0a0a0);
4280
+ font-variant-numeric: tabular-nums;
4281
+ display: flex;
4282
+ flex-direction: column;
4283
+ gap: 2px;
4284
+ }
4285
+
4286
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row {
4287
+ white-space: nowrap;
4288
+ overflow: hidden;
4289
+ text-overflow: ellipsis;
4290
+ }
4291
+
4292
+ /* Rows wrapper is rebuilt each render; it lays out as if the rows were direct
4293
+ children of the footer column. */
4294
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-rows {
4295
+ display: contents;
4296
+ }
4297
+
4298
+ /* Persistent live region for the dismiss confirmation. Empty most of the
4299
+ time; the negative margin cancels the footer's row gap so it adds no
4300
+ height while empty. */
4301
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status {
4302
+ white-space: normal;
4303
+ }
4304
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-status:empty {
4305
+ margin-top: -2px;
4306
+ }
4307
+
4308
+ /* ─── Support MikeDown footer link (review appeal M6) ─────────────────────
4309
+ Metrics and the link group each draw a leading middle dot. The items
4310
+ wrapper is shifted left by one separator width and clipped by the row, so
4311
+ the item that starts a line never shows its dot. When the sidebar is too
4312
+ narrow the whole link group wraps to its own line. */
4313
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-row--with-support {
4314
+ white-space: normal;
4315
+ text-overflow: clip;
4316
+ }
4317
+
4318
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-items {
4319
+ --sidebar-footer-sep: 0.95em;
4320
+ display: flex;
4321
+ flex-wrap: wrap;
4322
+ align-items: center;
4323
+ row-gap: 2px;
4324
+ margin-left: calc(-1 * var(--sidebar-footer-sep));
4325
+ }
4326
+
4327
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-item {
4328
+ white-space: nowrap;
4329
+ }
4330
+
4331
+ :is(.mikedown-root, .mikedown-portal) .sidebar-footer-item::before {
4332
+ content: '·';
4333
+ display: inline-block;
4334
+ width: var(--sidebar-footer-sep);
3497
4335
  text-align: center;
3498
4336
  }
3499
4337
 
@@ -4730,3 +5568,3619 @@ body.td-dragging :is(.mikedown-root, .mikedown-portal) * {
4730
5568
  :is(.mikedown-root, .mikedown-portal) .settings-content { padding: 14px 16px; }
4731
5569
  :is(.mikedown-root, .mikedown-portal) .settings-footer { padding: 10px 16px; }
4732
5570
  }
5571
+
5572
+ /* In-modal confirm ("Discard unsaved changes?" before Customize Toolbar…). */
5573
+ :is(.mikedown-root, .mikedown-portal) .settings-modal { position: relative; }
5574
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-backdrop {
5575
+ position: absolute;
5576
+ inset: 0;
5577
+ z-index: 10;
5578
+ display: flex;
5579
+ align-items: center;
5580
+ justify-content: center;
5581
+ padding: 16px;
5582
+ background: rgba(0, 0, 0, 0.28);
5583
+ }
5584
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm {
5585
+ width: min(360px, 100%);
5586
+ padding: 16px 18px 14px;
5587
+ background: var(--mikedown-surface-raised, #252526);
5588
+ border: 1px solid var(--settings-border);
5589
+ border-radius: 8px;
5590
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
5591
+ }
5592
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-title {
5593
+ font-size: 14px;
5594
+ font-weight: 600;
5595
+ margin-bottom: 6px;
5596
+ }
5597
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-text {
5598
+ color: var(--settings-muted);
5599
+ margin-bottom: 14px;
5600
+ }
5601
+ :is(.mikedown-root, .mikedown-portal) .settings-confirm-actions {
5602
+ display: flex;
5603
+ justify-content: flex-end;
5604
+ gap: 8px;
5605
+ }
5606
+
5607
+ /* ═══ ai.css ═══ */
5608
+ /* MikeDown — AI settings tab (ai-settings.ts, a summary), the AI Engines
5609
+ * page (ai-engines-page.ts, an overlay from editor.ts), the Express engine
5610
+ * form (ai-engine-form.ts) and the sidebar AI chip.
5611
+ *
5612
+ * Both the tab and the page are built from the Settings modal's own rows and
5613
+ * groups (settings-modal.css); this file only adds what those do not have:
5614
+ * the page shell (header, list pane, detail pane, narrow layout), engine
5615
+ * rows (glyph, local/cloud pill, status dot, switch), the quick-start cards,
5616
+ * the Express form (sheet, models combobox, Advanced fold), the full models
5617
+ * table with capability chips, route pickers and notes. Loaded after
5618
+ * settings-modal.css so it can lean on the --settings-* tokens, which the
5619
+ * page frame gets here as well.
5620
+ */
5621
+
5622
+ /* The page lives outside .settings-modal: it gets the modal's tokens too. */
5623
+ :is(.mikedown-root, .mikedown-portal) .ai-page-frame {
5624
+ --settings-fg: var(--mikedown-text, #d4d4d4);
5625
+ --settings-muted: var(--mikedown-text-muted, rgba(128, 128, 128, 0.9));
5626
+ --settings-border: var(--mikedown-border, rgba(128, 128, 128, 0.35));
5627
+ --settings-divider: var(--mikedown-border, rgba(128, 128, 128, 0.2));
5628
+ --settings-control-border: var(--mikedown-input-border, rgba(128, 128, 128, 0.35));
5629
+ --settings-hover-bg: var(--mikedown-hover, rgba(128, 128, 128, 0.15));
5630
+ --settings-active-bg: var(--mikedown-selected-bg, #0e639c);
5631
+ --settings-active-fg: var(--mikedown-selected-text, #ffffff);
5632
+ --settings-focus: var(--mikedown-focus-ring, #007fd4);
5633
+ }
5634
+
5635
+ :is(.mikedown-root, .mikedown-portal) :is(.settings-modal, .ai-page-frame) {
5636
+ --ai-ok: var(--mikedown-success, #2e7d32);
5637
+ --ai-error: var(--mikedown-danger, #c62828);
5638
+ --ai-warn: var(--mikedown-warning, #b26a00);
5639
+ --ai-info: var(--mikedown-info, #1e70d6);
5640
+ --ai-local: var(--mikedown-success, #2e7d32);
5641
+ --ai-cloud: var(--mikedown-info, #1e70d6);
5642
+ --ai-tile-bg: var(--mikedown-active, rgba(128, 128, 128, 0.18));
5643
+ --ai-row-hover: var(--mikedown-hover, rgba(128, 128, 128, 0.08));
5644
+ --ai-ease: cubic-bezier(0.2, 0, 0, 1);
5645
+ }
5646
+
5647
+ /* Screen-reader-only live region for probe results. */
5648
+ :is(.mikedown-root, .mikedown-portal) .ai-live {
5649
+ position: absolute;
5650
+ width: 1px;
5651
+ height: 1px;
5652
+ margin: -1px;
5653
+ padding: 0;
5654
+ overflow: hidden;
5655
+ clip: rect(0 0 0 0);
5656
+ white-space: nowrap;
5657
+ border: 0;
5658
+ }
5659
+
5660
+ :is(.mikedown-root, .mikedown-portal) .ai-mono {
5661
+ font-family: var(--mikedown-font-mono, ui-monospace, monospace);
5662
+ font-size: 12px;
5663
+ }
5664
+
5665
+ :is(.mikedown-root, .mikedown-portal) .ai-muted {
5666
+ font-size: 12px;
5667
+ color: var(--settings-muted);
5668
+ }
5669
+
5670
+ /* ── Notes (warnings, info, inline results) ─────────────────────────────── */
5671
+
5672
+ :is(.mikedown-root, .mikedown-portal) .ai-note {
5673
+ display: flex;
5674
+ align-items: flex-start;
5675
+ gap: 6px;
5676
+ font-size: 12px;
5677
+ line-height: 1.45;
5678
+ color: var(--settings-muted);
5679
+ }
5680
+ :is(.mikedown-root, .mikedown-portal) .ai-note-icon {
5681
+ display: inline-flex;
5682
+ flex-shrink: 0;
5683
+ margin-top: 2px;
5684
+ }
5685
+ :is(.mikedown-root, .mikedown-portal) .ai-note--warning .ai-note-icon { color: var(--ai-warn); }
5686
+ :is(.mikedown-root, .mikedown-portal) .ai-note--error { color: var(--ai-error); }
5687
+ :is(.mikedown-root, .mikedown-portal) .ai-note--ok .ai-note-icon { color: var(--ai-ok); }
5688
+ :is(.mikedown-root, .mikedown-portal) .ai-note--info .ai-note-icon { color: var(--ai-info); }
5689
+
5690
+ /* Notes and errors span both columns of an inline row (and stay left). */
5691
+ :is(.mikedown-root, .mikedown-portal) .settings-row--inline > .ai-row-note,
5692
+ :is(.mikedown-root, .mikedown-portal) .settings-row--inline > .ai-locality-note,
5693
+ :is(.mikedown-root, .mikedown-portal) .settings-row--inline > .ai-field-error { justify-self: stretch; }
5694
+ :is(.mikedown-root, .mikedown-portal) .ai-row-note,
5695
+ :is(.mikedown-root, .mikedown-portal) .ai-locality-note,
5696
+ :is(.mikedown-root, .mikedown-portal) .ai-field-error {
5697
+ grid-column: 1 / -1;
5698
+ }
5699
+ :is(.mikedown-root, .mikedown-portal) .ai-locality-note:empty,
5700
+ :is(.mikedown-root, .mikedown-portal) .ai-field-error:empty { display: none; }
5701
+
5702
+ :is(.mikedown-root, .mikedown-portal) .ai-field-error {
5703
+ font-size: 12px;
5704
+ color: var(--ai-error);
5705
+ }
5706
+ :is(.mikedown-root, .mikedown-portal) .settings-input[aria-invalid="true"] {
5707
+ border-color: var(--ai-error);
5708
+ }
5709
+
5710
+ /* A result appears with a short fade and rise, so a probe that comes back
5711
+ reads as an answer rather than a layout jump. */
5712
+ :is(.mikedown-root, .mikedown-portal) .ai-result {
5713
+ animation: ai-arrive 220ms var(--ai-ease);
5714
+ }
5715
+ @keyframes ai-arrive {
5716
+ from { opacity: 0; transform: translateY(-2px); }
5717
+ to { opacity: 1; transform: none; }
5718
+ }
5719
+
5720
+ /* ── Pills, tags, glyphs ─────────────────────────────────────────────────── */
5721
+
5722
+ :is(.mikedown-root, .mikedown-portal) .ai-pill {
5723
+ display: inline-flex;
5724
+ align-items: center;
5725
+ gap: 3px;
5726
+ padding: 0 6px;
5727
+ height: 17px;
5728
+ border-radius: 9px;
5729
+ font-size: 10.5px;
5730
+ font-weight: 500;
5731
+ letter-spacing: 0.01em;
5732
+ white-space: nowrap;
5733
+ border: 1px solid transparent;
5734
+ flex-shrink: 0;
5735
+ }
5736
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--local {
5737
+ color: var(--ai-local);
5738
+ background: color-mix(in srgb, var(--ai-local) 12%, transparent);
5739
+ }
5740
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--cloud {
5741
+ color: var(--ai-cloud);
5742
+ background: color-mix(in srgb, var(--ai-cloud) 12%, transparent);
5743
+ }
5744
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--mismatch {
5745
+ border-color: var(--ai-warn);
5746
+ border-style: dashed;
5747
+ }
5748
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--blocked {
5749
+ color: var(--settings-muted);
5750
+ border-color: var(--settings-control-border);
5751
+ }
5752
+ :is(.mikedown-root, .mikedown-portal) .ai-pill--soon {
5753
+ color: var(--settings-muted);
5754
+ border-color: var(--settings-control-border);
5755
+ font-weight: 400;
5756
+ }
5757
+
5758
+ :is(.mikedown-root, .mikedown-portal) .ai-tag {
5759
+ font-size: 10.5px;
5760
+ padding: 0 5px;
5761
+ line-height: 16px;
5762
+ border-radius: 3px;
5763
+ color: var(--settings-muted);
5764
+ background: var(--ai-tile-bg);
5765
+ white-space: nowrap;
5766
+ }
5767
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--loaded {
5768
+ color: var(--ai-ok);
5769
+ background: color-mix(in srgb, var(--ai-ok) 12%, transparent);
5770
+ }
5771
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--loaded::before {
5772
+ content: '';
5773
+ display: inline-block;
5774
+ width: 5px;
5775
+ height: 5px;
5776
+ margin-right: 4px;
5777
+ border-radius: 50%;
5778
+ background: currentColor;
5779
+ vertical-align: 1px;
5780
+ }
5781
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--missing { font-style: italic; }
5782
+
5783
+ /* Kind tile: a rounded square like an extension icon. */
5784
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph {
5785
+ display: inline-flex;
5786
+ align-items: center;
5787
+ justify-content: center;
5788
+ width: 30px;
5789
+ height: 30px;
5790
+ border-radius: 7px;
5791
+ background: var(--ai-tile-bg);
5792
+ color: var(--mikedown-text-ui, var(--settings-fg));
5793
+ font-size: 12px;
5794
+ font-weight: 650;
5795
+ letter-spacing: -0.02em;
5796
+ flex-shrink: 0;
5797
+ user-select: none;
5798
+ }
5799
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="lmstudio"] { background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 16%, transparent); }
5800
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="ollama"] { background: color-mix(in srgb, var(--mikedown-text, #888) 14%, transparent); }
5801
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="anthropic"] { background: color-mix(in srgb, #d97757 22%, transparent); }
5802
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="openai"] { background: color-mix(in srgb, #10a37f 20%, transparent); }
5803
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="vscode-lm"] { background: color-mix(in srgb, var(--mikedown-text, #888) 10%, transparent); }
5804
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph[data-kind="unknown"] { border: 1px dashed var(--settings-control-border); background: transparent; }
5805
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph--sm {
5806
+ width: 20px;
5807
+ height: 20px;
5808
+ border-radius: 5px;
5809
+ font-size: 9.5px;
5810
+ }
5811
+ :is(.mikedown-root, .mikedown-portal) .ai-glyph--sm svg { width: 12px; height: 12px; }
5812
+
5813
+ /* ── Controls ────────────────────────────────────────────────────────────── */
5814
+
5815
+ /* Switch: a checkbox with role="switch". */
5816
+ :is(.mikedown-root, .mikedown-portal) .ai-switch {
5817
+ appearance: none;
5818
+ -webkit-appearance: none;
5819
+ position: relative;
5820
+ width: 28px;
5821
+ height: 16px;
5822
+ margin: 0;
5823
+ flex-shrink: 0;
5824
+ border-radius: 8px;
5825
+ background: var(--settings-control-border);
5826
+ cursor: pointer;
5827
+ transition: background 160ms var(--ai-ease);
5828
+ }
5829
+ :is(.mikedown-root, .mikedown-portal) .ai-switch::after {
5830
+ content: '';
5831
+ position: absolute;
5832
+ top: 2px;
5833
+ left: 2px;
5834
+ width: 12px;
5835
+ height: 12px;
5836
+ border-radius: 50%;
5837
+ background: var(--mikedown-surface-raised, #fff);
5838
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
5839
+ transition: transform 160ms var(--ai-ease);
5840
+ }
5841
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:checked { background: var(--mikedown-accent, #3f51b5); }
5842
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:checked::after { transform: translateX(12px); background: var(--mikedown-accent-text, #fff); }
5843
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:disabled { opacity: 0.45; cursor: default; }
5844
+
5845
+ :is(.mikedown-root, .mikedown-portal) .ai-icon-btn {
5846
+ display: inline-flex;
5847
+ align-items: center;
5848
+ justify-content: center;
5849
+ width: 26px;
5850
+ height: 26px;
5851
+ padding: 0;
5852
+ border: none;
5853
+ border-radius: var(--mikedown-radius-sm, 4px);
5854
+ background: transparent;
5855
+ color: var(--settings-muted);
5856
+ cursor: pointer;
5857
+ flex-shrink: 0;
5858
+ font-family: inherit;
5859
+ }
5860
+ :is(.mikedown-root, .mikedown-portal) .ai-icon-btn:hover {
5861
+ background: var(--settings-hover-bg);
5862
+ color: var(--settings-fg);
5863
+ }
5864
+
5865
+ :is(.mikedown-root, .mikedown-portal) .ai-default-btn.is-on svg { color: #e3a008; }
5866
+ /* The default engine's head: a label, not a button (Q3); another engine's "Use by default" moves it. */
5867
+ :is(.mikedown-root, .mikedown-portal) .ai-default-badge {
5868
+ display: inline-flex;
5869
+ align-items: center;
5870
+ gap: 4px;
5871
+ padding: 0 4px;
5872
+ font-size: 12px;
5873
+ color: var(--settings-fg);
5874
+ outline: none;
5875
+ }
5876
+ :is(.mikedown-root, .mikedown-portal) .ai-default-badge svg { width: 14px; height: 14px; color: #e3a008; }
5877
+ :is(.mikedown-root, .mikedown-portal) .ai-delete-btn:hover { color: var(--ai-error); }
5878
+
5879
+ :is(.mikedown-root, .mikedown-portal) .settings-btn:has(svg) {
5880
+ display: inline-flex;
5881
+ align-items: center;
5882
+ gap: 5px;
5883
+ }
5884
+ :is(.mikedown-root, .mikedown-portal) .settings-btn[aria-disabled="true"],
5885
+ :is(.mikedown-root, .mikedown-portal) .settings-btn:disabled {
5886
+ opacity: 0.55;
5887
+ cursor: default;
5888
+ }
5889
+ :is(.mikedown-root, .mikedown-portal) .ai-btn--danger {
5890
+ color: var(--ai-error);
5891
+ border-color: color-mix(in srgb, var(--ai-error) 55%, transparent);
5892
+ }
5893
+ :is(.mikedown-root, .mikedown-portal) .ai-btn--danger:hover {
5894
+ background: color-mix(in srgb, var(--ai-error) 12%, transparent);
5895
+ }
5896
+
5897
+
5898
+ :is(.mikedown-root, .mikedown-portal) .ai-switch:focus-visible,
5899
+ :is(.mikedown-root, .mikedown-portal) .ai-icon-btn:focus-visible,
5900
+ :is(.mikedown-root, .mikedown-portal) .ai-chip:focus-visible,
5901
+ :is(.mikedown-root, .mikedown-portal) .ai-model-check:focus-visible,
5902
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label:focus-visible {
5903
+ outline: 1px solid var(--settings-focus);
5904
+ outline-offset: 1px;
5905
+ }
5906
+
5907
+ /* ── Engines list ────────────────────────────────────────────────────────── */
5908
+
5909
+ :is(.mikedown-root, .mikedown-portal) .ai-engines {
5910
+ border: 1px solid var(--settings-divider);
5911
+ border-radius: var(--mikedown-radius, 6px);
5912
+ overflow: hidden;
5913
+ }
5914
+
5915
+ :is(.mikedown-root, .mikedown-portal) .ai-engine + .ai-engine { border-top: 1px solid var(--settings-divider); }
5916
+
5917
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-head {
5918
+ display: flex;
5919
+ align-items: center;
5920
+ gap: 12px;
5921
+ padding: 10px 10px 10px 12px;
5922
+ min-height: 34px;
5923
+ }
5924
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-head:hover { background: var(--ai-row-hover); }
5925
+
5926
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-glyph { display: inline-flex; }
5927
+ :is(.mikedown-root, .mikedown-portal) .ai-engine.is-disabled .ai-engine-glyph,
5928
+ :is(.mikedown-root, .mikedown-portal) .ai-engine.is-disabled .ai-engine-main { opacity: 0.55; }
5929
+
5930
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-main {
5931
+ flex: 1;
5932
+ min-width: 0;
5933
+ display: flex;
5934
+ flex-direction: column;
5935
+ gap: 2px;
5936
+ cursor: pointer;
5937
+ }
5938
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-title {
5939
+ display: flex;
5940
+ flex-wrap: wrap;
5941
+ align-items: center;
5942
+ gap: 3px 6px;
5943
+ min-width: 0;
5944
+ }
5945
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-name {
5946
+ font-weight: 600;
5947
+ color: var(--settings-fg);
5948
+ overflow: hidden;
5949
+ text-overflow: ellipsis;
5950
+ white-space: nowrap;
5951
+ min-width: 0;
5952
+ }
5953
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-sub {
5954
+ font-size: 12px;
5955
+ color: var(--settings-muted);
5956
+ overflow: hidden;
5957
+ text-overflow: ellipsis;
5958
+ white-space: nowrap;
5959
+ }
5960
+
5961
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-actions {
5962
+ display: flex;
5963
+ align-items: center;
5964
+ gap: 4px;
5965
+ flex-shrink: 0;
5966
+ }
5967
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-actions .ai-switch { margin: 0 6px; }
5968
+
5969
+ /* Status dot: hollow ring never probed, green ok, red failed, a soft pulse
5970
+ while a probe runs. Colour changes ease so a result lands calmly. */
5971
+ :is(.mikedown-root, .mikedown-portal) .ai-status {
5972
+ display: inline-flex;
5973
+ align-items: center;
5974
+ gap: 6px;
5975
+ min-width: 74px;
5976
+ justify-content: flex-end;
5977
+ margin-right: 4px;
5978
+ font-size: 11.5px;
5979
+ color: var(--settings-muted);
5980
+ font-variant-numeric: tabular-nums;
5981
+ white-space: nowrap;
5982
+ }
5983
+ :is(.mikedown-root, .mikedown-portal) .ai-status-dot {
5984
+ width: 8px;
5985
+ height: 8px;
5986
+ border-radius: 50%;
5987
+ box-sizing: border-box;
5988
+ border: 1.5px solid var(--settings-muted);
5989
+ background: transparent;
5990
+ transition: background-color 240ms var(--ai-ease), border-color 240ms var(--ai-ease), box-shadow 240ms var(--ai-ease);
5991
+ }
5992
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="ok"] .ai-status-dot {
5993
+ background: var(--ai-ok);
5994
+ border-color: var(--ai-ok);
5995
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-ok) 18%, transparent);
5996
+ }
5997
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="error"] .ai-status-dot {
5998
+ background: var(--ai-error);
5999
+ border-color: var(--ai-error);
6000
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-error) 16%, transparent);
6001
+ }
6002
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="error"] { color: var(--ai-error); }
6003
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="busy"] .ai-status-dot {
6004
+ border-color: var(--ai-warn);
6005
+ background: var(--ai-warn);
6006
+ animation: ai-pulse 1s ease-in-out infinite;
6007
+ }
6008
+ :is(.mikedown-root, .mikedown-portal) .ai-status-text { transition: color 240ms var(--ai-ease); }
6009
+ @keyframes ai-pulse {
6010
+ 0%, 100% { opacity: 1; }
6011
+ 50% { opacity: 0.35; }
6012
+ }
6013
+
6014
+ /* A request running in this editor: the toolbar AI button's sparkle and the
6015
+ sidebar's Suggest sparkle pulse like the status dot (U5). No layout change. */
6016
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar button.is-ai-running svg,
6017
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.is-running svg {
6018
+ animation: ai-pulse 1s ease-in-out infinite;
6019
+ }
6020
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.is-running {
6021
+ opacity: 1;
6022
+ cursor: progress;
6023
+ }
6024
+ @media (prefers-reduced-motion: reduce) {
6025
+ :is(.mikedown-root, .mikedown-portal) .mikedown-toolbar button.is-ai-running svg,
6026
+ :is(.mikedown-root, .mikedown-portal) .properties-suggest-btn.is-running svg {
6027
+ animation: none;
6028
+ opacity: 0.55;
6029
+ }
6030
+ }
6031
+
6032
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-issues {
6033
+ display: flex;
6034
+ flex-direction: column;
6035
+ gap: 4px;
6036
+ padding: 0 12px 10px 54px;
6037
+ }
6038
+
6039
+ :is(.mikedown-root, .mikedown-portal) .ai-confirm {
6040
+ display: flex;
6041
+ align-items: center;
6042
+ gap: 8px;
6043
+ flex-wrap: wrap;
6044
+ margin: 0 10px 10px 54px;
6045
+ padding: 8px 10px;
6046
+ border-radius: var(--mikedown-radius-sm, 4px);
6047
+ background: color-mix(in srgb, var(--ai-error) 8%, transparent);
6048
+ animation: ai-arrive 160ms var(--ai-ease);
6049
+ }
6050
+ :is(.mikedown-root, .mikedown-portal) .ai-confirm-text {
6051
+ flex: 1;
6052
+ min-width: 180px;
6053
+ font-size: 12px;
6054
+ color: var(--settings-fg);
6055
+ }
6056
+
6057
+ /* ── Add engine: quick-start cards ───────────────────────────────────────── */
6058
+
6059
+ :is(.mikedown-root, .mikedown-portal) .ai-cards {
6060
+ display: flex;
6061
+ flex-direction: column;
6062
+ gap: 18px;
6063
+ }
6064
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-group {
6065
+ display: flex;
6066
+ flex-direction: column;
6067
+ gap: 6px;
6068
+ }
6069
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-heading {
6070
+ display: flex;
6071
+ align-items: center;
6072
+ gap: 6px;
6073
+ font-size: 12px;
6074
+ font-weight: 600;
6075
+ color: var(--settings-fg);
6076
+ }
6077
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-heading svg { color: var(--settings-muted); }
6078
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-explainer {
6079
+ margin-bottom: 4px;
6080
+ font-size: 12px;
6081
+ line-height: 1.45;
6082
+ color: var(--settings-muted);
6083
+ }
6084
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-grid {
6085
+ display: grid;
6086
+ grid-template-columns: repeat(auto-fill, minmax(196px, 1fr));
6087
+ gap: 8px;
6088
+ }
6089
+ :is(.mikedown-root, .mikedown-portal) .ai-card {
6090
+ display: flex;
6091
+ align-items: center;
6092
+ gap: 10px;
6093
+ min-width: 0;
6094
+ padding: 9px 11px;
6095
+ border: 1px solid var(--settings-divider);
6096
+ border-radius: var(--mikedown-radius, 6px);
6097
+ background: var(--mikedown-surface-raised, transparent);
6098
+ color: var(--settings-fg);
6099
+ font: inherit;
6100
+ text-align: left;
6101
+ cursor: pointer;
6102
+ transition: border-color 120ms var(--ai-ease), background-color 120ms var(--ai-ease), transform 120ms var(--ai-ease);
6103
+ }
6104
+ :is(.mikedown-root, .mikedown-portal) .ai-card:hover {
6105
+ border-color: var(--settings-control-border);
6106
+ background: var(--ai-row-hover);
6107
+ }
6108
+ :is(.mikedown-root, .mikedown-portal) .ai-card:active { transform: translateY(1px); }
6109
+ :is(.mikedown-root, .mikedown-portal) .ai-card:focus-visible {
6110
+ outline: 1px solid var(--settings-focus);
6111
+ outline-offset: 1px;
6112
+ }
6113
+ :is(.mikedown-root, .mikedown-portal) .ai-card-text {
6114
+ display: flex;
6115
+ flex-direction: column;
6116
+ gap: 1px;
6117
+ min-width: 0;
6118
+ }
6119
+ :is(.mikedown-root, .mikedown-portal) .ai-card-name {
6120
+ font-size: 12.5px;
6121
+ font-weight: 600;
6122
+ overflow: hidden;
6123
+ text-overflow: ellipsis;
6124
+ white-space: nowrap;
6125
+ }
6126
+ :is(.mikedown-root, .mikedown-portal) .ai-card-caption {
6127
+ font-size: 11.5px;
6128
+ line-height: 1.35;
6129
+ color: var(--settings-muted);
6130
+ }
6131
+
6132
+ /* Local detection: Running leads, Not running steps back, Added is done. */
6133
+ :is(.mikedown-root, .mikedown-portal) .ai-card-state {
6134
+ display: inline-flex;
6135
+ align-items: center;
6136
+ gap: 5px;
6137
+ margin-top: 3px;
6138
+ font-size: 11px;
6139
+ color: var(--settings-muted);
6140
+ font-variant-numeric: tabular-nums;
6141
+ }
6142
+ :is(.mikedown-root, .mikedown-portal) .ai-card-dot {
6143
+ width: 7px;
6144
+ height: 7px;
6145
+ border-radius: 50%;
6146
+ flex-shrink: 0;
6147
+ background: var(--ai-ok);
6148
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-ok) 18%, transparent);
6149
+ }
6150
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="running"] {
6151
+ border-color: color-mix(in srgb, var(--ai-ok) 55%, var(--settings-divider));
6152
+ background: color-mix(in srgb, var(--ai-ok) 6%, var(--mikedown-surface-raised, transparent));
6153
+ }
6154
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="running"]:hover {
6155
+ border-color: var(--ai-ok);
6156
+ background: color-mix(in srgb, var(--ai-ok) 10%, var(--mikedown-surface-raised, transparent));
6157
+ }
6158
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="running"] .ai-card-state { color: var(--settings-fg); }
6159
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="stopped"] { background: transparent; }
6160
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="stopped"] .ai-card-name { font-weight: 500; }
6161
+ :is(.mikedown-root, .mikedown-portal) .ai-card[data-state="added"] {
6162
+ background: transparent;
6163
+ border-style: dashed;
6164
+ }
6165
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-detect {
6166
+ display: flex;
6167
+ align-items: baseline;
6168
+ gap: 10px;
6169
+ min-height: 18px;
6170
+ margin-top: 2px;
6171
+ font-size: 12px;
6172
+ color: var(--settings-muted);
6173
+ }
6174
+ :is(.mikedown-root, .mikedown-portal) .ai-cards-detect-text:empty { display: none; }
6175
+
6176
+ /* Empty state on the summary tab: an invitation, not an error. */
6177
+ :is(.mikedown-root, .mikedown-portal) .ai-summary-empty {
6178
+ display: flex;
6179
+ flex-direction: column;
6180
+ gap: 3px;
6181
+ padding: 14px 16px;
6182
+ border: 1px dashed var(--settings-control-border);
6183
+ border-radius: var(--mikedown-radius, 6px);
6184
+ }
6185
+ :is(.mikedown-root, .mikedown-portal) .ai-empty-title {
6186
+ font-size: 13px;
6187
+ font-weight: 600;
6188
+ color: var(--settings-fg);
6189
+ }
6190
+ :is(.mikedown-root, .mikedown-portal) .ai-empty-text {
6191
+ max-width: 460px;
6192
+ font-size: 12px;
6193
+ line-height: 1.5;
6194
+ color: var(--settings-muted);
6195
+ }
6196
+
6197
+ /* Cloud consents list on the AI tab: one line per stored answer. */
6198
+ :is(.mikedown-root, .mikedown-portal) .ai-consents-list {
6199
+ display: flex;
6200
+ flex-direction: column;
6201
+ gap: 6px;
6202
+ margin: 0;
6203
+ padding: 0;
6204
+ list-style: none;
6205
+ }
6206
+ :is(.mikedown-root, .mikedown-portal) .ai-consent {
6207
+ display: flex;
6208
+ align-items: center;
6209
+ justify-content: space-between;
6210
+ gap: 12px;
6211
+ font-size: 13px;
6212
+ color: var(--settings-fg);
6213
+ }
6214
+ :is(.mikedown-root, .mikedown-portal) .ai-consent-text { min-width: 0; overflow-wrap: anywhere; }
6215
+ :is(.mikedown-root, .mikedown-portal) .ai-consents-empty {
6216
+ font-size: 12px;
6217
+ color: var(--settings-muted);
6218
+ }
6219
+
6220
+ /* ── Express engine form (ai-engine-form.ts) ─────────────────────────────── */
6221
+
6222
+ /* One calm column like a macOS "Add Account" sheet: labels on the left,
6223
+ controls on the right, a short caption under a control when it helps. */
6224
+ :is(.mikedown-root, .mikedown-portal) .ai-form {
6225
+ display: flex;
6226
+ flex-direction: column;
6227
+ gap: 14px;
6228
+ animation: ai-arrive 180ms var(--ai-ease);
6229
+ }
6230
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet {
6231
+ display: flex;
6232
+ flex-direction: column;
6233
+ gap: 14px;
6234
+ padding: 16px 18px;
6235
+ border: 1px solid var(--settings-divider);
6236
+ border-radius: 8px;
6237
+ background: var(--mikedown-surface-raised, transparent);
6238
+ }
6239
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet--advanced { background: transparent; }
6240
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-row {
6241
+ display: grid;
6242
+ grid-template-columns: 112px minmax(0, 1fr);
6243
+ align-items: start;
6244
+ column-gap: 14px;
6245
+ }
6246
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-row--block { display: block; }
6247
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-label {
6248
+ padding-top: 6px;
6249
+ text-align: right;
6250
+ font-size: 12.5px;
6251
+ color: var(--settings-fg);
6252
+ }
6253
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-body {
6254
+ display: flex;
6255
+ flex-direction: column;
6256
+ gap: 5px;
6257
+ min-width: 0;
6258
+ }
6259
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-input { width: 100%; }
6260
+ :is(.mikedown-root, .mikedown-portal) .ai-caption {
6261
+ font-size: 11.5px;
6262
+ line-height: 1.45;
6263
+ color: var(--settings-muted);
6264
+ }
6265
+ :is(.mikedown-root, .mikedown-portal) .ai-url { display: flex; flex-direction: column; gap: 4px; }
6266
+ :is(.mikedown-root, .mikedown-portal) .ai-locality { display: flex; flex-direction: column; gap: 6px; }
6267
+
6268
+ :is(.mikedown-root, .mikedown-portal) .ai-key {
6269
+ display: flex;
6270
+ align-items: center;
6271
+ gap: 6px;
6272
+ }
6273
+ :is(.mikedown-root, .mikedown-portal) .ai-key .settings-input--medium { flex: 0 1 130px; width: 130px; min-width: 90px; }
6274
+ :is(.mikedown-root, .mikedown-portal) .ai-key-state {
6275
+ display: inline-flex;
6276
+ align-items: center;
6277
+ gap: 4px;
6278
+ color: var(--ai-ok);
6279
+ font-weight: 500;
6280
+ white-space: nowrap;
6281
+ }
6282
+
6283
+ :is(.mikedown-root, .mikedown-portal) .ai-enabled-line {
6284
+ display: flex;
6285
+ align-items: center;
6286
+ gap: 10px;
6287
+ min-height: 28px;
6288
+ }
6289
+
6290
+ :is(.mikedown-root, .mikedown-portal) .ai-default {
6291
+ display: flex;
6292
+ flex-wrap: wrap;
6293
+ align-items: center;
6294
+ gap: 8px 14px;
6295
+ }
6296
+ :is(.mikedown-root, .mikedown-portal) select.ai-default-select { min-width: 0; max-width: 100%; flex: 1 1 200px; }
6297
+ :is(.mikedown-root, .mikedown-portal) .ai-thinking {
6298
+ display: inline-flex;
6299
+ align-items: center;
6300
+ gap: 7px;
6301
+ font-size: 12px;
6302
+ color: var(--settings-muted);
6303
+ }
6304
+ :is(.mikedown-root, .mikedown-portal) .ai-thinking select { max-width: 150px; }
6305
+
6306
+ /* Text buttons: Fetch models, Retry, Type a model id. */
6307
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn {
6308
+ display: inline-flex;
6309
+ align-items: center;
6310
+ gap: 5px;
6311
+ padding: 2px 4px;
6312
+ margin: -2px -4px;
6313
+ border: none;
6314
+ border-radius: var(--mikedown-radius-sm, 4px);
6315
+ background: none;
6316
+ color: var(--mikedown-link, var(--mikedown-accent, #3f51b5));
6317
+ font: inherit;
6318
+ font-size: 12px;
6319
+ cursor: pointer;
6320
+ }
6321
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn:hover:not(:disabled) { text-decoration: underline; }
6322
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn:disabled,
6323
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn[aria-disabled="true"] { color: var(--settings-muted); cursor: default; text-decoration: none; }
6324
+ :is(.mikedown-root, .mikedown-portal) .ai-link-btn:focus-visible {
6325
+ outline: 1px solid var(--settings-focus);
6326
+ outline-offset: 1px;
6327
+ }
6328
+ :is(.mikedown-root, .mikedown-portal) .ai-type-btn,
6329
+ :is(.mikedown-root, .mikedown-portal) .ai-show-all { align-self: flex-start; margin-top: 2px; }
6330
+
6331
+ /* Models picker: a head line, the combobox field, then the inline listbox. */
6332
+ :is(.mikedown-root, .mikedown-portal) .ai-picker {
6333
+ display: flex;
6334
+ flex-direction: column;
6335
+ gap: 8px;
6336
+ }
6337
+ :is(.mikedown-root, .mikedown-portal) .ai-picker-head {
6338
+ display: flex;
6339
+ align-items: baseline;
6340
+ gap: 10px;
6341
+ }
6342
+ :is(.mikedown-root, .mikedown-portal) .ai-picker-label {
6343
+ display: inline-flex;
6344
+ align-items: center;
6345
+ gap: 7px;
6346
+ font-size: 12.5px;
6347
+ font-weight: 600;
6348
+ color: var(--settings-fg);
6349
+ }
6350
+ :is(.mikedown-root, .mikedown-portal) .ai-picker-head .ai-models-count { flex: 1; }
6351
+
6352
+ :is(.mikedown-root, .mikedown-portal) .ai-spinner {
6353
+ width: 11px;
6354
+ height: 11px;
6355
+ border-radius: 50%;
6356
+ border: 1.5px solid color-mix(in srgb, var(--settings-muted) 35%, transparent);
6357
+ border-top-color: var(--mikedown-accent, #3f51b5);
6358
+ animation: ai-spin 700ms linear infinite;
6359
+ }
6360
+ @keyframes ai-spin { to { transform: rotate(360deg); } }
6361
+
6362
+ :is(.mikedown-root, .mikedown-portal) .ai-combo { position: relative; }
6363
+ :is(.mikedown-root, .mikedown-portal) .ai-combo-icon {
6364
+ position: absolute;
6365
+ left: 9px;
6366
+ top: 50%;
6367
+ transform: translateY(-50%);
6368
+ display: inline-flex;
6369
+ color: var(--settings-muted);
6370
+ pointer-events: none;
6371
+ }
6372
+ :is(.mikedown-root, .mikedown-portal) .ai-combo-input { padding-left: 28px; }
6373
+
6374
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox,
6375
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-items {
6376
+ list-style: none;
6377
+ margin: 0;
6378
+ padding: 0;
6379
+ }
6380
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox {
6381
+ max-height: 248px;
6382
+ overflow-y: auto;
6383
+ padding: 4px;
6384
+ border: 1px solid var(--settings-divider);
6385
+ border-radius: 6px;
6386
+ outline: none;
6387
+ }
6388
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox:focus-visible { border-color: var(--settings-focus); }
6389
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-group + .ai-listbox-group { margin-top: 6px; }
6390
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-heading {
6391
+ padding: 4px 8px 3px;
6392
+ font-size: 10.5px;
6393
+ font-weight: 600;
6394
+ letter-spacing: 0.04em;
6395
+ text-transform: uppercase;
6396
+ color: var(--settings-muted);
6397
+ }
6398
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox-empty {
6399
+ padding: 10px 8px;
6400
+ font-size: 12px;
6401
+ color: var(--settings-muted);
6402
+ }
6403
+ :is(.mikedown-root, .mikedown-portal) .ai-option {
6404
+ display: flex;
6405
+ align-items: center;
6406
+ gap: 9px;
6407
+ min-height: 28px;
6408
+ padding: 3px 8px;
6409
+ border-radius: 4px;
6410
+ cursor: pointer;
6411
+ user-select: none;
6412
+ }
6413
+ :is(.mikedown-root, .mikedown-portal) .ai-option:hover { background: var(--ai-row-hover); }
6414
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-active {
6415
+ background: var(--settings-hover-bg);
6416
+ box-shadow: inset 0 0 0 1px var(--settings-focus);
6417
+ }
6418
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-missing { opacity: 0.5; }
6419
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-unusable { opacity: 0.5; cursor: default; }
6420
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-unusable:hover { background: none; }
6421
+ :is(.mikedown-root, .mikedown-portal) .ai-option-check {
6422
+ display: inline-flex;
6423
+ align-items: center;
6424
+ justify-content: center;
6425
+ flex-shrink: 0;
6426
+ width: 15px;
6427
+ height: 15px;
6428
+ box-sizing: border-box;
6429
+ border: 1px solid var(--settings-control-border);
6430
+ border-radius: 4px;
6431
+ color: transparent;
6432
+ transition: background-color 120ms var(--ai-ease), border-color 120ms var(--ai-ease);
6433
+ }
6434
+ :is(.mikedown-root, .mikedown-portal) .ai-option-check svg { width: 11px; height: 11px; }
6435
+ :is(.mikedown-root, .mikedown-portal) .ai-option.is-on .ai-option-check {
6436
+ border-color: var(--mikedown-accent, #3f51b5);
6437
+ background: var(--mikedown-accent, #3f51b5);
6438
+ color: var(--mikedown-accent-text, #fff);
6439
+ }
6440
+ /* Single choice (the setup form): a radio dot instead of a check. */
6441
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox--single .ai-option-check { border-radius: 50%; }
6442
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox--single .ai-option-check svg { display: none; }
6443
+ :is(.mikedown-root, .mikedown-portal) .ai-listbox--single .ai-option.is-on .ai-option-check {
6444
+ background: var(--mikedown-accent-text, #fff);
6445
+ border-width: 4.5px;
6446
+ }
6447
+ :is(.mikedown-root, .mikedown-portal) .ai-option-names {
6448
+ display: flex;
6449
+ flex-direction: column;
6450
+ flex: 1;
6451
+ min-width: 0;
6452
+ }
6453
+ :is(.mikedown-root, .mikedown-portal) .ai-option-name {
6454
+ font-size: 12.5px;
6455
+ color: var(--settings-fg);
6456
+ overflow: hidden;
6457
+ text-overflow: ellipsis;
6458
+ white-space: nowrap;
6459
+ }
6460
+ :is(.mikedown-root, .mikedown-portal) .ai-option-id {
6461
+ font-family: var(--mikedown-font-mono, monospace);
6462
+ font-size: 10.5px;
6463
+ color: var(--settings-muted);
6464
+ overflow: hidden;
6465
+ text-overflow: ellipsis;
6466
+ white-space: nowrap;
6467
+ }
6468
+ :is(.mikedown-root, .mikedown-portal) .ai-option-tags { display: flex; gap: 4px; flex-shrink: 0; }
6469
+
6470
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note {
6471
+ display: flex;
6472
+ align-items: flex-start;
6473
+ gap: 10px;
6474
+ animation: ai-arrive 220ms var(--ai-ease);
6475
+ }
6476
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note .ai-note { flex: 1; }
6477
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note .ai-link-btn { margin-top: -1px; }
6478
+
6479
+ :is(.mikedown-root, .mikedown-portal) .ai-form-actions {
6480
+ display: flex;
6481
+ flex-wrap: wrap;
6482
+ align-items: center;
6483
+ gap: 8px 12px;
6484
+ }
6485
+ :is(.mikedown-root, .mikedown-portal) .ai-form-actions .ai-result { flex-basis: 100%; }
6486
+
6487
+ /* Advanced: a quiet disclosure, not a second form. */
6488
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure {
6489
+ align-self: flex-start;
6490
+ display: inline-flex;
6491
+ align-items: center;
6492
+ gap: 6px;
6493
+ padding: 3px 6px;
6494
+ margin-left: -6px;
6495
+ border: none;
6496
+ border-radius: var(--mikedown-radius-sm, 4px);
6497
+ background: none;
6498
+ color: var(--settings-muted);
6499
+ font: inherit;
6500
+ font-size: 12px;
6501
+ cursor: pointer;
6502
+ }
6503
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure:hover { color: var(--settings-fg); background: var(--ai-row-hover); }
6504
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure:focus-visible {
6505
+ outline: 1px solid var(--settings-focus);
6506
+ outline-offset: 1px;
6507
+ }
6508
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure svg { transition: transform 160ms var(--ai-ease); }
6509
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure[aria-expanded="true"] { color: var(--settings-fg); }
6510
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure[aria-expanded="true"] svg { transform: rotate(90deg); }
6511
+ :is(.mikedown-root, .mikedown-portal) .ai-advanced {
6512
+ display: flex;
6513
+ flex-direction: column;
6514
+ gap: 14px;
6515
+ margin-top: -6px;
6516
+ animation: ai-arrive 180ms var(--ai-ease);
6517
+ }
6518
+ :is(.mikedown-root, .mikedown-portal) .ai-advanced[hidden] { display: none; }
6519
+
6520
+ :is(.mikedown-root, .mikedown-portal) .ai-thinking-select.settings-input--small { width: auto; }
6521
+
6522
+ /* ── Models ──────────────────────────────────────────────────────────────── */
6523
+
6524
+ :is(.mikedown-root, .mikedown-portal) .ai-models {
6525
+ display: flex;
6526
+ flex-direction: column;
6527
+ gap: 8px;
6528
+ }
6529
+ :is(.mikedown-root, .mikedown-portal) .ai-models-head {
6530
+ display: flex;
6531
+ align-items: baseline;
6532
+ gap: 8px;
6533
+ }
6534
+ :is(.mikedown-root, .mikedown-portal) .ai-models-count {
6535
+ font-size: 11.5px;
6536
+ color: var(--settings-muted);
6537
+ }
6538
+ :is(.mikedown-root, .mikedown-portal) .ai-models-empty {
6539
+ font-size: 12px;
6540
+ color: var(--settings-muted);
6541
+ padding: 10px 12px;
6542
+ border: 1px dashed var(--settings-control-border);
6543
+ border-radius: var(--mikedown-radius-sm, 4px);
6544
+ }
6545
+
6546
+ :is(.mikedown-root, .mikedown-portal) .ai-model-list {
6547
+ border: 1px solid var(--settings-divider);
6548
+ border-radius: var(--mikedown-radius-sm, 4px);
6549
+ max-height: 360px;
6550
+ overflow-y: auto;
6551
+ }
6552
+ :is(.mikedown-root, .mikedown-portal) .ai-model {
6553
+ display: flex;
6554
+ flex-direction: column;
6555
+ gap: 6px;
6556
+ padding: 8px 10px;
6557
+ transition: opacity 160ms var(--ai-ease);
6558
+ }
6559
+ :is(.mikedown-root, .mikedown-portal) .ai-model + .ai-model { border-top: 1px solid var(--settings-divider); }
6560
+ :is(.mikedown-root, .mikedown-portal) .ai-model.is-missing { opacity: 0.55; }
6561
+ :is(.mikedown-root, .mikedown-portal) .ai-model.is-off .ai-chips { opacity: 0.6; }
6562
+
6563
+ :is(.mikedown-root, .mikedown-portal) .ai-model-top {
6564
+ display: flex;
6565
+ align-items: center;
6566
+ gap: 8px;
6567
+ min-width: 0;
6568
+ }
6569
+ :is(.mikedown-root, .mikedown-portal) .ai-model-check {
6570
+ margin: 0;
6571
+ width: 14px;
6572
+ height: 14px;
6573
+ flex-shrink: 0;
6574
+ accent-color: var(--mikedown-accent, #3f51b5);
6575
+ cursor: pointer;
6576
+ }
6577
+ :is(.mikedown-root, .mikedown-portal) .ai-model-names {
6578
+ flex: 1;
6579
+ min-width: 0;
6580
+ display: flex;
6581
+ flex-direction: column;
6582
+ }
6583
+ /* Label field reads as text until hovered or focused. */
6584
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label {
6585
+ box-sizing: border-box;
6586
+ width: 100%;
6587
+ min-width: 0;
6588
+ padding: 2px 5px;
6589
+ margin-left: -5px;
6590
+ border: 1px solid transparent;
6591
+ border-radius: 3px;
6592
+ background: transparent;
6593
+ color: var(--settings-fg);
6594
+ font: inherit;
6595
+ font-size: 12.5px;
6596
+ font-weight: 500;
6597
+ text-overflow: ellipsis;
6598
+ }
6599
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label::placeholder {
6600
+ color: var(--settings-fg);
6601
+ opacity: 0.9;
6602
+ font-family: var(--mikedown-font-mono, monospace);
6603
+ font-size: 12px;
6604
+ }
6605
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label:hover { border-color: var(--settings-control-border); }
6606
+ :is(.mikedown-root, .mikedown-portal) .ai-model-label:focus {
6607
+ border-color: var(--settings-focus);
6608
+ background: var(--mikedown-input-bg, transparent);
6609
+ outline: none;
6610
+ }
6611
+ :is(.mikedown-root, .mikedown-portal) .ai-model-id {
6612
+ font-family: var(--mikedown-font-mono, monospace);
6613
+ font-size: 11px;
6614
+ color: var(--settings-muted);
6615
+ overflow: hidden;
6616
+ text-overflow: ellipsis;
6617
+ white-space: nowrap;
6618
+ }
6619
+ :is(.mikedown-root, .mikedown-portal) .ai-model-tags {
6620
+ display: flex;
6621
+ gap: 4px;
6622
+ flex-shrink: 0;
6623
+ }
6624
+ :is(.mikedown-root, .mikedown-portal) .ai-model-right {
6625
+ display: flex;
6626
+ align-items: center;
6627
+ gap: 2px;
6628
+ flex-shrink: 0;
6629
+ }
6630
+ :is(.mikedown-root, .mikedown-portal) .ai-model-context {
6631
+ display: inline-flex;
6632
+ align-items: center;
6633
+ gap: 4px;
6634
+ margin-right: 4px;
6635
+ }
6636
+ :is(.mikedown-root, .mikedown-portal) .ai-context-input {
6637
+ width: 72px;
6638
+ text-align: right;
6639
+ font-variant-numeric: tabular-nums;
6640
+ }
6641
+ :is(.mikedown-root, .mikedown-portal) .ai-context-unit {
6642
+ font-size: 10.5px;
6643
+ color: var(--settings-muted);
6644
+ }
6645
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-btn {
6646
+ font-family: var(--mikedown-font-mono, monospace);
6647
+ font-size: 11px;
6648
+ width: auto;
6649
+ padding: 0 6px;
6650
+ }
6651
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-btn.has-value { color: var(--mikedown-accent, #3f51b5); }
6652
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-btn[aria-expanded="true"] { background: var(--settings-hover-bg); color: var(--settings-fg); }
6653
+
6654
+ /* Capability chips: pressed chips are filled; the source tag sits at the end. */
6655
+ :is(.mikedown-root, .mikedown-portal) .ai-chips {
6656
+ display: flex;
6657
+ flex-wrap: wrap;
6658
+ align-items: center;
6659
+ gap: 4px;
6660
+ padding-left: 22px;
6661
+ }
6662
+ :is(.mikedown-root, .mikedown-portal) .ai-chip {
6663
+ padding: 0 7px;
6664
+ height: 19px;
6665
+ border-radius: 10px;
6666
+ border: 1px solid var(--settings-control-border);
6667
+ background: transparent;
6668
+ color: var(--settings-muted);
6669
+ font: inherit;
6670
+ font-size: 11px;
6671
+ line-height: 17px;
6672
+ cursor: pointer;
6673
+ transition: background-color 120ms var(--ai-ease), color 120ms var(--ai-ease), border-color 120ms var(--ai-ease);
6674
+ }
6675
+ :is(.mikedown-root, .mikedown-portal) .ai-chip:hover { border-color: var(--settings-fg); color: var(--settings-fg); }
6676
+ :is(.mikedown-root, .mikedown-portal) .ai-chip.is-on {
6677
+ border-color: transparent;
6678
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 18%, transparent);
6679
+ color: var(--settings-fg);
6680
+ }
6681
+ :is(.mikedown-root, .mikedown-portal) .ai-source {
6682
+ margin-left: 4px;
6683
+ font-size: 10.5px;
6684
+ color: var(--settings-muted);
6685
+ font-style: italic;
6686
+ }
6687
+ :is(.mikedown-root, .mikedown-portal) .ai-source--user { color: var(--mikedown-accent, #3f51b5); font-style: normal; }
6688
+
6689
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides {
6690
+ display: flex;
6691
+ flex-direction: column;
6692
+ gap: 4px;
6693
+ padding-left: 22px;
6694
+ animation: ai-arrive 160ms var(--ai-ease);
6695
+ }
6696
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides-text {
6697
+ resize: vertical;
6698
+ min-height: 54px;
6699
+ }
6700
+
6701
+ :is(.mikedown-root, .mikedown-portal) .ai-model-add {
6702
+ display: flex;
6703
+ gap: 6px;
6704
+ align-items: center;
6705
+ }
6706
+
6707
+ /* ── Routing and features ────────────────────────────────────────────────── */
6708
+
6709
+ :is(.mikedown-root, .mikedown-portal) .settings-row.ai-section[hidden] { display: none; }
6710
+
6711
+ :is(.mikedown-root, .mikedown-portal) .ai-routing {
6712
+ display: flex;
6713
+ flex-direction: column;
6714
+ gap: 10px;
6715
+ }
6716
+ :is(.mikedown-root, .mikedown-portal) .ai-subhead {
6717
+ margin-top: 4px;
6718
+ font-size: 11.5px;
6719
+ font-weight: 600;
6720
+ color: var(--settings-muted);
6721
+ }
6722
+ :is(.mikedown-root, .mikedown-portal) select.ai-route-select { max-width: 260px; }
6723
+ :is(.mikedown-root, .mikedown-portal) .ai-task-row .settings-desc { font-size: 11.5px; }
6724
+
6725
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-controls {
6726
+ display: flex;
6727
+ align-items: center;
6728
+ gap: 10px;
6729
+ }
6730
+ :is(.mikedown-root, .mikedown-portal) .ai-feature.is-planned .settings-row-text { opacity: 0.55; }
6731
+
6732
+ /* "Advanced: task per feature" under the switches (U8): folded, quiet. */
6733
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-tasks-toggle { margin-top: 8px; }
6734
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-tasks { margin-top: 2px; gap: 8px; }
6735
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-tasks > .settings-desc { font-size: 11.5px; }
6736
+ :is(.mikedown-root, .mikedown-portal) .ai-feature-task { justify-content: space-between; gap: 10px; }
6737
+
6738
+ /* Inline suggestions' options under its switch: the same quiet fold. */
6739
+ :is(.mikedown-root, .mikedown-portal) .settings-group > .settings-row.ai-ghost-options-box { padding: 0 0 8px; gap: 2px; border-top: none; }
6740
+ :is(.mikedown-root, .mikedown-portal) .settings-row.ai-ghost-options-box[hidden] { display: none; }
6741
+ :is(.mikedown-root, .mikedown-portal) .ai-ghost-options-toggle { justify-self: start; }
6742
+ :is(.mikedown-root, .mikedown-portal) .ai-ghost-options { margin-top: 2px; }
6743
+
6744
+ /* The master switch carries the tab: a touch more presence. */
6745
+ :is(.mikedown-root, .mikedown-portal) .ai-master .settings-label { font-size: 13.5px; }
6746
+
6747
+ :is(.mikedown-root, .mikedown-portal) .settings-row--check .ai-row-note { margin-top: -2px; }
6748
+
6749
+ /* ── Narrow content pane ─────────────────────────────────────────────────── */
6750
+
6751
+ @container settings-content (max-width: 520px) {
6752
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-top { flex-wrap: wrap; }
6753
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions { width: 100%; padding-left: 58px; }
6754
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions .ai-status { margin-right: auto; justify-content: flex-start; min-width: 0; }
6755
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet { padding: 12px; }
6756
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-row { grid-template-columns: minmax(0, 1fr); row-gap: 4px; }
6757
+ :is(.mikedown-root, .mikedown-portal) .ai-sheet-label { padding-top: 0; text-align: left; font-weight: 500; }
6758
+ :is(.mikedown-root, .mikedown-portal) .ai-model-top { flex-wrap: wrap; }
6759
+ :is(.mikedown-root, .mikedown-portal) .ai-chips { padding-left: 0; }
6760
+ }
6761
+
6762
+ @media (prefers-reduced-motion: reduce) {
6763
+ :is(.mikedown-root, .mikedown-portal) .ai-result,
6764
+ :is(.mikedown-root, .mikedown-portal) .ai-confirm,
6765
+ :is(.mikedown-root, .mikedown-portal) .ai-form,
6766
+ :is(.mikedown-root, .mikedown-portal) .ai-advanced,
6767
+ :is(.mikedown-root, .mikedown-portal) .ai-page-frame,
6768
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="detail"] .ai-page-detail,
6769
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-scrim,
6770
+ :is(.mikedown-root, .mikedown-portal) .ai-fetch-note,
6771
+ :is(.mikedown-root, .mikedown-portal) .ai-overrides,
6772
+ :is(.mikedown-root, .mikedown-portal) .ai-status[data-state="busy"] .ai-status-dot { animation: none; }
6773
+ :is(.mikedown-root, .mikedown-portal) .ai-switch,
6774
+ :is(.mikedown-root, .mikedown-portal) .ai-switch::after,
6775
+ :is(.mikedown-root, .mikedown-portal) .ai-status-dot,
6776
+ :is(.mikedown-root, .mikedown-portal) .ai-card,
6777
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option,
6778
+ :is(.mikedown-root, .mikedown-portal) .ai-option-check,
6779
+ :is(.mikedown-root, .mikedown-portal) .ai-disclosure svg { transition: none; }
6780
+ :is(.mikedown-root, .mikedown-portal) .ai-spinner { animation-duration: 2s; }
6781
+ }
6782
+
6783
+ /* ── AI tab: the summary ─────────────────────────────────────────────────── */
6784
+
6785
+ /* Compact rows: name, pill, dot and switch on one quiet line. */
6786
+ :is(.mikedown-root, .mikedown-portal) .ai-engines--compact .ai-engine-head {
6787
+ gap: 10px;
6788
+ padding: 7px 10px 7px 12px;
6789
+ min-height: 0;
6790
+ }
6791
+ :is(.mikedown-root, .mikedown-portal) .ai-engines--compact .ai-status { min-width: 0; margin-right: 6px; }
6792
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-open {
6793
+ padding: 0;
6794
+ border: none;
6795
+ background: none;
6796
+ color: inherit;
6797
+ font: inherit;
6798
+ text-align: left;
6799
+ }
6800
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-open:hover .ai-engine-name { text-decoration: underline; text-underline-offset: 2px; }
6801
+ :is(.mikedown-root, .mikedown-portal) .ai-engine-open:focus-visible {
6802
+ outline: 1px solid var(--settings-focus);
6803
+ outline-offset: 2px;
6804
+ border-radius: 2px;
6805
+ }
6806
+
6807
+ /* Compact status: the dot alone; the label stays for screen readers. */
6808
+ :is(.mikedown-root, .mikedown-portal) .ai-status--compact { min-width: 0; margin-right: 0; }
6809
+ :is(.mikedown-root, .mikedown-portal) .ai-status--compact .ai-status-text {
6810
+ position: absolute;
6811
+ width: 1px;
6812
+ height: 1px;
6813
+ overflow: hidden;
6814
+ clip: rect(0 0 0 0);
6815
+ white-space: nowrap;
6816
+ }
6817
+
6818
+ /* "Default model oMLX · Qwen 3.8 Flash Next Change…" */
6819
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line {
6820
+ display: flex;
6821
+ flex-wrap: wrap;
6822
+ align-items: baseline;
6823
+ gap: 4px 10px;
6824
+ margin-top: 10px;
6825
+ padding: 0 2px;
6826
+ font-size: 12.5px;
6827
+ }
6828
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line-label { color: var(--settings-muted); }
6829
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line-value {
6830
+ min-width: 0;
6831
+ font-weight: 600;
6832
+ color: var(--settings-fg);
6833
+ overflow-wrap: anywhere;
6834
+ }
6835
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line-value.is-none { font-weight: 500; color: var(--ai-warn); }
6836
+ :is(.mikedown-root, .mikedown-portal) .ai-route-line .ai-row-note { flex-basis: 100%; }
6837
+ :is(.mikedown-root, .mikedown-portal) .ai-summary-actions {
6838
+ display: flex;
6839
+ gap: 8px;
6840
+ margin-top: 12px;
6841
+ }
6842
+
6843
+ /* ── AI Engines page (ai-engines-page.ts) ────────────────────────────────── */
6844
+
6845
+ /* Full window, above the Settings modal (1050) when opened from it. */
6846
+ :is(.mikedown-root, .mikedown-portal) #mikedown-ai-page-overlay {
6847
+ position: fixed;
6848
+ inset: 0;
6849
+ z-index: 1060;
6850
+ display: flex;
6851
+ }
6852
+ :is(.mikedown-root, .mikedown-portal) .ai-page-frame {
6853
+ flex: 1;
6854
+ display: flex;
6855
+ min-width: 0;
6856
+ min-height: 0;
6857
+ background: var(--mikedown-surface, #1e1e1e);
6858
+ color: var(--settings-fg);
6859
+ font-family: var(--mikedown-font-ui, system-ui, -apple-system, sans-serif);
6860
+ font-size: 13px;
6861
+ line-height: 1.4;
6862
+ animation: ai-page-in 180ms var(--ai-ease);
6863
+ }
6864
+ @keyframes ai-page-in {
6865
+ from { opacity: 0; }
6866
+ to { opacity: 1; }
6867
+ }
6868
+ :is(.mikedown-root, .mikedown-portal) .ai-page {
6869
+ position: relative;
6870
+ flex: 1;
6871
+ display: flex;
6872
+ flex-direction: column;
6873
+ min-width: 0;
6874
+ min-height: 0;
6875
+ }
6876
+
6877
+ /* Header: Back on the left, the title centred, Done on the right. */
6878
+ :is(.mikedown-root, .mikedown-portal) .ai-page-header {
6879
+ display: grid;
6880
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
6881
+ align-items: center;
6882
+ gap: 12px;
6883
+ padding: 9px 16px;
6884
+ border-bottom: 1px solid var(--mikedown-divider, var(--settings-divider));
6885
+ background: var(--mikedown-surface-toolbar, var(--mikedown-surface, transparent));
6886
+ flex-shrink: 0;
6887
+ }
6888
+ :is(.mikedown-root, .mikedown-portal) .ai-page-back {
6889
+ justify-self: start;
6890
+ display: inline-flex;
6891
+ align-items: center;
6892
+ gap: 3px;
6893
+ padding: 4px 8px 4px 4px;
6894
+ border: none;
6895
+ border-radius: var(--mikedown-radius-sm, 4px);
6896
+ background: none;
6897
+ color: var(--mikedown-link, var(--settings-fg));
6898
+ font: inherit;
6899
+ cursor: pointer;
6900
+ }
6901
+ :is(.mikedown-root, .mikedown-portal) .ai-page-back:hover { background: var(--settings-hover-bg); }
6902
+ :is(.mikedown-root, .mikedown-portal) .ai-page-back:focus-visible,
6903
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn:focus-visible {
6904
+ outline: 1px solid var(--settings-focus);
6905
+ outline-offset: -1px;
6906
+ }
6907
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title {
6908
+ margin: 0;
6909
+ font-size: 14px;
6910
+ font-weight: 600;
6911
+ color: var(--settings-fg);
6912
+ white-space: nowrap;
6913
+ }
6914
+ :is(.mikedown-root, .mikedown-portal) .ai-page-done { justify-self: end; min-width: 72px; }
6915
+
6916
+ :is(.mikedown-root, .mikedown-portal) .ai-page-body {
6917
+ flex: 1;
6918
+ display: flex;
6919
+ min-height: 0;
6920
+ }
6921
+ /* The page toggles its parts with `hidden` (the list and detail while the
6922
+ wizard shows); the display rules above would otherwise beat it, and the
6923
+ hidden body would split the height with the wizard. */
6924
+ :is(.mikedown-root, .mikedown-portal) .ai-page > [hidden] { display: none; }
6925
+
6926
+ /* Left pane: a quiet source list. */
6927
+ :is(.mikedown-root, .mikedown-portal) .ai-page-nav {
6928
+ width: 284px;
6929
+ flex-shrink: 0;
6930
+ display: flex;
6931
+ flex-direction: column;
6932
+ gap: 12px;
6933
+ padding: 14px 10px;
6934
+ overflow-y: auto;
6935
+ border-right: 1px solid var(--mikedown-divider, var(--settings-divider));
6936
+ background: var(--mikedown-surface-toolbar, transparent);
6937
+ }
6938
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-group { display: flex; flex-direction: column; gap: 2px; }
6939
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-group--tools {
6940
+ padding-top: 12px;
6941
+ border-top: 1px solid var(--mikedown-divider, var(--settings-divider));
6942
+ }
6943
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-heading {
6944
+ padding: 0 8px 6px;
6945
+ font-size: 11px;
6946
+ font-weight: 600;
6947
+ letter-spacing: 0.04em;
6948
+ text-transform: uppercase;
6949
+ color: var(--settings-muted);
6950
+ }
6951
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-empty {
6952
+ padding: 4px 8px 2px;
6953
+ font-size: 12px;
6954
+ color: var(--settings-muted);
6955
+ }
6956
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-list { display: flex; flex-direction: column; gap: 2px; }
6957
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item { position: relative; display: flex; }
6958
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn {
6959
+ display: flex;
6960
+ align-items: center;
6961
+ gap: 10px;
6962
+ width: 100%;
6963
+ min-width: 0;
6964
+ padding: 7px 8px;
6965
+ border: none;
6966
+ border-radius: var(--mikedown-radius, 6px);
6967
+ background: none;
6968
+ color: var(--settings-fg);
6969
+ font: inherit;
6970
+ text-align: left;
6971
+ cursor: pointer;
6972
+ transition: background-color 120ms var(--ai-ease);
6973
+ }
6974
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn:hover { background: var(--ai-row-hover); }
6975
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn[aria-current="true"] {
6976
+ background: var(--settings-active-bg);
6977
+ color: var(--settings-active-fg);
6978
+ outline: 1px solid var(--mikedown-contrast-border, transparent);
6979
+ outline-offset: -1px;
6980
+ }
6981
+ /* Room for the switch, which sits over the row's right end. */
6982
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item .ai-nav-btn { padding-right: 48px; }
6983
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item > .ai-switch {
6984
+ position: absolute;
6985
+ top: 50%;
6986
+ right: 10px;
6987
+ transform: translateY(-50%);
6988
+ }
6989
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item.is-disabled .ai-glyph,
6990
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-item.is-disabled .ai-nav-text { opacity: 0.55; }
6991
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-text {
6992
+ flex: 1;
6993
+ display: flex;
6994
+ flex-direction: column;
6995
+ gap: 1px;
6996
+ min-width: 0;
6997
+ }
6998
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-name-line {
6999
+ display: flex;
7000
+ align-items: center;
7001
+ gap: 6px;
7002
+ min-width: 0;
7003
+ }
7004
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-name {
7005
+ min-width: 0;
7006
+ overflow: hidden;
7007
+ font-weight: 600;
7008
+ text-overflow: ellipsis;
7009
+ white-space: nowrap;
7010
+ }
7011
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-sub {
7012
+ overflow: hidden;
7013
+ font-size: 11.5px;
7014
+ color: var(--settings-muted);
7015
+ text-overflow: ellipsis;
7016
+ white-space: nowrap;
7017
+ }
7018
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-sub-line {
7019
+ display: flex;
7020
+ align-items: center;
7021
+ gap: 6px;
7022
+ min-width: 0;
7023
+ }
7024
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn[aria-current="true"] .ai-nav-sub { color: inherit; opacity: 0.72; }
7025
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn .ai-pill { flex-shrink: 0; }
7026
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-star { display: inline-flex; flex-shrink: 0; color: #e3a008; }
7027
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-star svg { width: 11px; height: 11px; }
7028
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-icon {
7029
+ display: inline-flex;
7030
+ align-items: center;
7031
+ justify-content: center;
7032
+ width: 30px;
7033
+ height: 30px;
7034
+ flex-shrink: 0;
7035
+ border-radius: 7px;
7036
+ background: var(--ai-tile-bg);
7037
+ color: var(--settings-muted);
7038
+ }
7039
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn[aria-current="true"] .ai-nav-icon { color: inherit; }
7040
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn--add .ai-nav-icon { background: transparent; border: 1px dashed var(--settings-control-border); }
7041
+ :is(.mikedown-root, .mikedown-portal) .ai-nav-btn--add .ai-nav-name { font-weight: 500; }
7042
+
7043
+ /* Right pane: one thing at a time, in a readable column. Named like the
7044
+ modal's content pane so the same narrow-width rules apply. */
7045
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail {
7046
+ flex: 1;
7047
+ min-width: 0;
7048
+ overflow-y: auto;
7049
+ container: settings-content / inline-size;
7050
+ }
7051
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-head,
7052
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-body {
7053
+ box-sizing: border-box;
7054
+ max-width: 780px;
7055
+ margin: 0 auto;
7056
+ padding: 0 32px;
7057
+ }
7058
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-head {
7059
+ display: flex;
7060
+ flex-direction: column;
7061
+ gap: 10px;
7062
+ padding-top: 26px;
7063
+ padding-bottom: 18px;
7064
+ }
7065
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-body { padding-bottom: 48px; }
7066
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail[data-kind="routing"] .ai-detail-head,
7067
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail[data-kind="add"] .ai-detail-head { flex-direction: row; align-items: center; gap: 14px; }
7068
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-top {
7069
+ display: flex;
7070
+ align-items: center;
7071
+ gap: 14px;
7072
+ }
7073
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-glyph .ai-glyph {
7074
+ width: 44px;
7075
+ height: 44px;
7076
+ border-radius: 10px;
7077
+ font-size: 15px;
7078
+ }
7079
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-glyph .ai-glyph svg { width: 20px; height: 20px; }
7080
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-icon {
7081
+ display: inline-flex;
7082
+ align-items: center;
7083
+ justify-content: center;
7084
+ width: 44px;
7085
+ height: 44px;
7086
+ flex-shrink: 0;
7087
+ border-radius: 10px;
7088
+ background: var(--ai-tile-bg);
7089
+ color: var(--settings-muted);
7090
+ }
7091
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-icon svg { width: 20px; height: 20px; }
7092
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-main {
7093
+ flex: 1;
7094
+ display: flex;
7095
+ flex-direction: column;
7096
+ gap: 3px;
7097
+ min-width: 0;
7098
+ }
7099
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-title-line {
7100
+ display: flex;
7101
+ flex-wrap: wrap;
7102
+ align-items: center;
7103
+ gap: 4px 8px;
7104
+ min-width: 0;
7105
+ }
7106
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-title {
7107
+ margin: 0;
7108
+ min-width: 0;
7109
+ overflow-wrap: anywhere;
7110
+ font-size: 18px;
7111
+ font-weight: 600;
7112
+ letter-spacing: -0.01em;
7113
+ color: var(--settings-fg);
7114
+ }
7115
+ /* Only ever focused by the page (a new local server, the narrow layout's push), as the wizard's title. */
7116
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-title:is(:focus, :focus-visible) { outline: none; }
7117
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-sub {
7118
+ max-width: 560px;
7119
+ font-size: 12.5px;
7120
+ line-height: 1.45;
7121
+ color: var(--settings-muted);
7122
+ }
7123
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions {
7124
+ display: flex;
7125
+ align-items: center;
7126
+ gap: 6px;
7127
+ flex-shrink: 0;
7128
+ }
7129
+ :is(.mikedown-root, .mikedown-portal) .ai-detail-actions .ai-status { min-width: 0; margin-right: 6px; }
7130
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-engine-issues { padding: 0 0 0 58px; }
7131
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-confirm { margin: 0 0 0 58px; }
7132
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail select.ai-route-select { max-width: 340px; }
7133
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-cards-grid { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); }
7134
+
7135
+ /* One column under 720 px: the list, or the pushed detail. */
7136
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-page-nav {
7137
+ flex: 1;
7138
+ width: auto;
7139
+ border-right: none;
7140
+ padding: 12px;
7141
+ }
7142
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="list"] .ai-page-detail,
7143
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="detail"] .ai-page-nav { display: none; }
7144
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow[data-view="detail"] .ai-page-detail { animation: ai-push 200ms var(--ai-ease); }
7145
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-page-header { padding: 8px 10px; }
7146
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-detail-head,
7147
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-detail-body { padding-left: 16px; padding-right: 16px; }
7148
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-detail-head { padding-top: 18px; }
7149
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-nav-btn { padding-top: 9px; padding-bottom: 9px; }
7150
+ @keyframes ai-push {
7151
+ from { opacity: 0; transform: translateX(14px); }
7152
+ to { opacity: 1; transform: none; }
7153
+ }
7154
+
7155
+ /* "Discard changes?": a small sheet over a dimmed page. */
7156
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-scrim {
7157
+ position: absolute;
7158
+ inset: 0;
7159
+ z-index: 2;
7160
+ display: flex;
7161
+ align-items: flex-start;
7162
+ justify-content: center;
7163
+ padding-top: 72px;
7164
+ background: color-mix(in srgb, var(--mikedown-surface, #000) 55%, transparent);
7165
+ animation: ai-arrive 160ms var(--ai-ease);
7166
+ }
7167
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm {
7168
+ display: flex;
7169
+ flex-direction: column;
7170
+ gap: 8px;
7171
+ box-sizing: border-box;
7172
+ width: min(380px, calc(100% - 32px));
7173
+ padding: 18px 20px 16px;
7174
+ border: 1px solid var(--settings-border);
7175
+ border-radius: var(--mikedown-radius-lg, 10px);
7176
+ background: var(--mikedown-surface-raised, #252526);
7177
+ box-shadow: 0 12px 40px var(--mikedown-shadow, rgba(0, 0, 0, 0.4));
7178
+ }
7179
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-title { font-size: 14px; font-weight: 600; color: var(--settings-fg); }
7180
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-text { font-size: 12.5px; line-height: 1.5; color: var(--settings-muted); }
7181
+ :is(.mikedown-root, .mikedown-portal) .ai-page-confirm-actions {
7182
+ display: flex;
7183
+ justify-content: flex-end;
7184
+ gap: 8px;
7185
+ margin-top: 8px;
7186
+ }
7187
+
7188
+ /* ── Sidebar footer chip ─────────────────────────────────────────────────── */
7189
+
7190
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip {
7191
+ display: inline-flex;
7192
+ align-items: center;
7193
+ gap: 5px;
7194
+ align-self: flex-start;
7195
+ max-width: 100%;
7196
+ margin: 0 0 1px -5px;
7197
+ padding: 1px 6px 1px 5px;
7198
+ border: 1px solid transparent;
7199
+ border-radius: 9px;
7200
+ background: none;
7201
+ color: inherit;
7202
+ font: inherit;
7203
+ line-height: 1.5;
7204
+ cursor: pointer;
7205
+ text-align: left;
7206
+ }
7207
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[hidden] { display: none; }
7208
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip:hover {
7209
+ background: var(--mikedown-hover, rgba(128, 128, 128, 0.12));
7210
+ color: var(--mikedown-text-ui, inherit);
7211
+ }
7212
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip:focus-visible {
7213
+ outline: 1px solid var(--mikedown-focus-ring, #007fd4);
7214
+ outline-offset: 0;
7215
+ }
7216
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-glyph { display: inline-flex; flex-shrink: 0; }
7217
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-text {
7218
+ min-width: 0;
7219
+ overflow: hidden;
7220
+ text-overflow: ellipsis;
7221
+ white-space: nowrap;
7222
+ }
7223
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="local"] .sidebar-ai-glyph { color: var(--mikedown-success, #2e7d32); }
7224
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="cloud"] .sidebar-ai-glyph { color: var(--mikedown-info, #1e70d6); }
7225
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="none"] .sidebar-ai-glyph { color: var(--mikedown-warning, #b26a00); }
7226
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip[data-tone="cloud"] {
7227
+ border-color: color-mix(in srgb, var(--mikedown-info, #1e70d6) 35%, transparent);
7228
+ }
7229
+ :is(.mikedown-root, .mikedown-portal) .sidebar-ai-chip.is-warn .sidebar-ai-glyph { color: var(--mikedown-warning, #b26a00); }
7230
+
7231
+ /* ── Experimental marking (ai-settings-dom.ts) ───────────────────────────── */
7232
+
7233
+ /* The pill beside an AI title: the Settings nav item, the AI tab, the page, the first-run panel. */
7234
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-badge {
7235
+ display: inline-flex;
7236
+ align-items: center;
7237
+ flex-shrink: 0;
7238
+ height: 16px;
7239
+ padding: 0 6px;
7240
+ border-radius: 8px;
7241
+ font-size: 10px;
7242
+ font-weight: 600;
7243
+ letter-spacing: 0.02em;
7244
+ line-height: 1;
7245
+ white-space: nowrap;
7246
+ /* Body text on an amber tint: amber text this small fails contrast. */
7247
+ color: var(--settings-fg, var(--mikedown-text-ui, var(--mikedown-text)));
7248
+ background: color-mix(in srgb, var(--mikedown-warning, #b26a00) 20%, transparent);
7249
+ border: 1px solid color-mix(in srgb, var(--mikedown-warning, #b26a00) 55%, transparent);
7250
+ }
7251
+ :is(.mikedown-root, .mikedown-portal) .settings-tab .ai-experimental-badge { margin-left: 2px; }
7252
+ :is(.mikedown-root, .mikedown-portal) .settings-tab[aria-selected="true"] .ai-experimental-badge {
7253
+ color: inherit;
7254
+ background: color-mix(in srgb, currentColor 18%, transparent);
7255
+ border-color: color-mix(in srgb, currentColor 45%, transparent);
7256
+ }
7257
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-head {
7258
+ display: flex;
7259
+ align-items: center;
7260
+ gap: 8px;
7261
+ }
7262
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-title {
7263
+ font-size: 13px;
7264
+ font-weight: 600;
7265
+ }
7266
+ :is(.mikedown-root, .mikedown-portal) .ai-disclaimer {
7267
+ margin: 6px 0 0;
7268
+ font-size: 12px;
7269
+ line-height: 1.5;
7270
+ color: var(--settings-muted, var(--mikedown-text-muted));
7271
+ }
7272
+
7273
+ /* Top of the AI tab. */
7274
+ :is(.mikedown-root, .mikedown-portal) .ai-experimental-intro {
7275
+ padding: 2px 2px 12px;
7276
+ margin-bottom: 4px;
7277
+ border-bottom: 1px solid var(--settings-divider, var(--mikedown-border));
7278
+ }
7279
+
7280
+ /* AI Engines page: the badge beside the title, the disclaimer under the header. */
7281
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title-line {
7282
+ display: flex;
7283
+ align-items: center;
7284
+ gap: 8px;
7285
+ min-width: 0;
7286
+ }
7287
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title-note {
7288
+ overflow: hidden;
7289
+ font-size: 12px;
7290
+ color: var(--settings-muted);
7291
+ text-overflow: ellipsis;
7292
+ white-space: nowrap;
7293
+ }
7294
+ :is(.mikedown-root, .mikedown-portal) .ai-page-disclaimer {
7295
+ margin: 0;
7296
+ padding: 8px 16px;
7297
+ border-bottom: 1px solid var(--mikedown-divider, var(--settings-divider));
7298
+ flex-shrink: 0;
7299
+ }
7300
+
7301
+ /* ── Privacy card (ai-settings-dom.ts#privacyCard) ────────────────────────
7302
+ A quiet note like the disclaimer: muted text, a cloud glyph, no warning. */
7303
+
7304
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-card {
7305
+ font-size: 12px;
7306
+ line-height: 1.45;
7307
+ color: var(--settings-muted, var(--mikedown-text-muted));
7308
+ padding: 8px 10px;
7309
+ border: 1px solid var(--settings-divider, var(--mikedown-border));
7310
+ border-radius: var(--mikedown-radius-sm, 4px);
7311
+ min-width: 0;
7312
+ }
7313
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-head,
7314
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary {
7315
+ display: flex;
7316
+ align-items: center;
7317
+ gap: 6px;
7318
+ color: var(--settings-fg, inherit);
7319
+ font-weight: 600;
7320
+ }
7321
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary {
7322
+ cursor: pointer;
7323
+ list-style: none;
7324
+ font-weight: 500;
7325
+ }
7326
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary::-webkit-details-marker { display: none; }
7327
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary::after {
7328
+ content: '';
7329
+ width: 5px;
7330
+ height: 5px;
7331
+ margin-left: 2px;
7332
+ border-right: 1.5px solid currentColor;
7333
+ border-bottom: 1.5px solid currentColor;
7334
+ transform: rotate(-45deg);
7335
+ opacity: 0.7;
7336
+ }
7337
+ :is(.mikedown-root, .mikedown-portal) details[open] > .ai-privacy-summary::after { transform: rotate(45deg); }
7338
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-summary:focus-visible {
7339
+ outline: 1px solid var(--settings-focus);
7340
+ outline-offset: 2px;
7341
+ border-radius: 2px;
7342
+ }
7343
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-glyph {
7344
+ display: inline-flex;
7345
+ flex-shrink: 0;
7346
+ color: var(--ai-info, currentColor);
7347
+ }
7348
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-body { margin-top: 6px; }
7349
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-lines {
7350
+ margin: 0;
7351
+ padding-left: 18px;
7352
+ }
7353
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-lines li + li { margin-top: 2px; }
7354
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-policy,
7355
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-extra { margin: 6px 0 0; }
7356
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-link { margin: 0; padding: 0; text-decoration: underline; }
7357
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-link:focus-visible {
7358
+ outline: 1px solid var(--settings-focus);
7359
+ outline-offset: 1px;
7360
+ }
7361
+ :is(.mikedown-root, .mikedown-portal) .ai-form-privacy { margin-bottom: 10px; }
7362
+ :is(.mikedown-root, .mikedown-portal) .settings-row--check .ai-privacy-card.ai-row-note { margin-top: 6px; }
7363
+
7364
+ /* The one-line version (first-run panel). */
7365
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line {
7366
+ display: flex;
7367
+ align-items: flex-start;
7368
+ gap: 6px;
7369
+ margin: 8px 0 0;
7370
+ font-size: 12px;
7371
+ line-height: 1.45;
7372
+ color: var(--settings-muted, var(--mikedown-text-muted));
7373
+ }
7374
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line .ai-privacy-glyph { margin-top: 2px; }
7375
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line .ai-link-btn { margin: 0; padding: 0; }
7376
+ :is(.mikedown-root, .mikedown-portal) .ai-privacy-line[hidden] { display: none; }
7377
+
7378
+ /* ── Allow cloud engines over the cloud cards (ai-engines-page.ts) ───────── */
7379
+
7380
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access {
7381
+ display: flex;
7382
+ flex-direction: column;
7383
+ gap: 6px;
7384
+ margin-bottom: 4px;
7385
+ }
7386
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-row {
7387
+ display: flex;
7388
+ align-items: flex-start;
7389
+ gap: 10px;
7390
+ }
7391
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-row .ai-switch { margin-top: 1px; flex-shrink: 0; }
7392
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-text {
7393
+ display: flex;
7394
+ flex-direction: column;
7395
+ gap: 1px;
7396
+ min-width: 0;
7397
+ font-size: 12px;
7398
+ line-height: 1.45;
7399
+ }
7400
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-label {
7401
+ font-weight: 500;
7402
+ color: var(--settings-fg);
7403
+ cursor: pointer;
7404
+ }
7405
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-access-line { color: var(--settings-muted); }
7406
+
7407
+ /* A cloud engine's head while Allow cloud is off: the note and its button. */
7408
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-off {
7409
+ display: flex;
7410
+ align-items: center;
7411
+ gap: 10px;
7412
+ flex-wrap: wrap;
7413
+ padding: 0 12px 10px 54px;
7414
+ }
7415
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-cloud-off { padding: 0 0 10px 58px; }
7416
+ :is(.mikedown-root, .mikedown-portal) .ai-cloud-off .ai-note { flex: 1; min-width: 180px; }
7417
+
7418
+ /* The key hint as a link under the key field, and a variable's name. */
7419
+ :is(.mikedown-root, .mikedown-portal) .ai-key-link { margin: 0; padding: 0; text-decoration: underline; }
7420
+ :is(.mikedown-root, .mikedown-portal) .ai-key-env { font-family: var(--mikedown-font-mono, monospace); font-size: 11px; }
7421
+
7422
+ /* ── Toolbar first-run panel (ai-toolbar.ts) ─────────────────────────────── */
7423
+
7424
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run {
7425
+ --settings-fg: var(--mikedown-text-ui, var(--mikedown-text, #d4d4d4));
7426
+ --settings-muted: var(--mikedown-text-muted, rgba(128, 128, 128, 0.9));
7427
+ --settings-hover-bg: var(--mikedown-hover, rgba(128, 128, 128, 0.15));
7428
+ --settings-control-border: var(--mikedown-input-border, rgba(128, 128, 128, 0.35));
7429
+ --settings-focus: var(--mikedown-focus-ring, #007fd4);
7430
+ position: fixed;
7431
+ z-index: 1001;
7432
+ width: 340px;
7433
+ max-width: calc(100vw - 16px);
7434
+ box-sizing: border-box;
7435
+ padding: 14px 16px;
7436
+ background: var(--mikedown-surface-raised);
7437
+ color: var(--settings-fg);
7438
+ border: 1px solid var(--mikedown-border);
7439
+ border-radius: var(--mikedown-radius, 6px);
7440
+ box-shadow: 0 6px 20px var(--mikedown-shadow, rgba(0, 0, 0, 0.25));
7441
+ font-size: 13px;
7442
+ }
7443
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run .ai-disclaimer { margin-top: 8px; }
7444
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-verbs {
7445
+ margin: 6px 0 0;
7446
+ font-size: 12.5px;
7447
+ line-height: 1.45;
7448
+ }
7449
+ /* The disclaimer: one sentence, the full notice behind a link. */
7450
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run .ai-first-run-notice-toggle { margin-left: 2px; }
7451
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run .ai-first-run-notice-full[hidden] { display: none; }
7452
+ /* Detection and setup progress: text-sized, never louder than the copy. */
7453
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status {
7454
+ --ai-ok: var(--mikedown-success, #2e7d32);
7455
+ --ai-error: var(--mikedown-danger, #c62828);
7456
+ display: flex;
7457
+ align-items: baseline;
7458
+ gap: 7px;
7459
+ margin-top: 10px;
7460
+ font-size: 12px;
7461
+ line-height: 1.45;
7462
+ color: var(--settings-muted);
7463
+ }
7464
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status[hidden] { display: none; }
7465
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status[data-state="found"] { color: var(--settings-fg); }
7466
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-status[data-state="error"] { color: var(--ai-error); }
7467
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-dot {
7468
+ position: relative;
7469
+ top: -1px;
7470
+ width: 7px;
7471
+ height: 7px;
7472
+ border-radius: 50%;
7473
+ flex-shrink: 0;
7474
+ background: var(--ai-ok);
7475
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ai-ok) 18%, transparent);
7476
+ }
7477
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-actions {
7478
+ display: flex;
7479
+ align-items: center;
7480
+ justify-content: flex-end;
7481
+ flex-wrap: wrap;
7482
+ gap: 8px;
7483
+ margin-top: 14px;
7484
+ }
7485
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-other {
7486
+ margin: 0 auto 0 -4px;
7487
+ padding: 2px 4px;
7488
+ }
7489
+ :is(.mikedown-root, .mikedown-portal) .ai-first-run-other[hidden] { display: none; }
7490
+
7491
+ /* ── Size tags in the models picker (local models, by this machine) ─────── */
7492
+
7493
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--fits {
7494
+ color: var(--ai-ok);
7495
+ background: color-mix(in srgb, var(--ai-ok) 12%, transparent);
7496
+ }
7497
+ :is(.mikedown-root, .mikedown-portal) .ai-tag--tight {
7498
+ color: var(--ai-warn);
7499
+ background: color-mix(in srgb, var(--ai-warn) 12%, transparent);
7500
+ }
7501
+
7502
+ /* ── Setup wizard (ai-setup-wizard.ts), the page's 'wizard' section ─────── */
7503
+
7504
+ /* The header line: Skip in Done's place, and the step dots beside the title. */
7505
+ :is(.mikedown-root, .mikedown-portal) .ai-page-header > [hidden],
7506
+ :is(.mikedown-root, .mikedown-portal) .ai-page-title-line > [hidden] { display: none; }
7507
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-steps {
7508
+ display: inline-flex;
7509
+ align-items: center;
7510
+ gap: 5px;
7511
+ margin-left: 4px;
7512
+ }
7513
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-dot {
7514
+ width: 6px;
7515
+ height: 6px;
7516
+ border-radius: 50%;
7517
+ background: var(--settings-control-border);
7518
+ }
7519
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-dot.is-done { background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 45%, transparent); }
7520
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-dot.is-current { background: var(--mikedown-accent, #3f51b5); }
7521
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-steps-text {
7522
+ margin-left: 3px;
7523
+ font-size: 11.5px;
7524
+ color: var(--settings-muted);
7525
+ font-variant-numeric: tabular-nums;
7526
+ }
7527
+
7528
+ /* One readable column, centred, like a sheet. */
7529
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard {
7530
+ flex: 1;
7531
+ min-height: 0;
7532
+ overflow-y: auto;
7533
+ container: settings-content / inline-size;
7534
+ }
7535
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-column {
7536
+ box-sizing: border-box;
7537
+ display: flex;
7538
+ flex-direction: column;
7539
+ gap: 18px;
7540
+ max-width: 640px;
7541
+ margin: 0 auto;
7542
+ padding: 32px 32px 48px;
7543
+ animation: ai-arrive 180ms var(--ai-ease);
7544
+ }
7545
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-wizard-column { padding: 20px 16px 40px; }
7546
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-head {
7547
+ display: flex;
7548
+ flex-direction: column;
7549
+ gap: 4px;
7550
+ }
7551
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-title {
7552
+ margin: 0;
7553
+ font-size: 18px;
7554
+ font-weight: 600;
7555
+ letter-spacing: -0.01em;
7556
+ color: var(--settings-fg);
7557
+ overflow-wrap: anywhere;
7558
+ }
7559
+ /* tabindex -1: only code moves focus here (for screen readers), so no ring, even where :focus-visible would match. */
7560
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-title:is(:focus, :focus-visible) { outline: none; }
7561
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-lede {
7562
+ margin: 0;
7563
+ max-width: 540px;
7564
+ font-size: 12.5px;
7565
+ line-height: 1.5;
7566
+ color: var(--settings-muted);
7567
+ }
7568
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-quiet {
7569
+ margin: 0;
7570
+ font-size: 12px;
7571
+ line-height: 1.5;
7572
+ color: var(--settings-muted);
7573
+ }
7574
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-quiet .ai-link-btn { margin: 0; padding: 0; }
7575
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-scanning {
7576
+ display: flex;
7577
+ align-items: center;
7578
+ gap: 8px;
7579
+ padding: 14px 0;
7580
+ font-size: 12.5px;
7581
+ color: var(--settings-muted);
7582
+ }
7583
+
7584
+ /* Step 1: the choices, as large rows. The lead one carries the accent (or
7585
+ the running green, like a running server's card). */
7586
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-options {
7587
+ display: flex;
7588
+ flex-direction: column;
7589
+ gap: 8px;
7590
+ }
7591
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option {
7592
+ display: flex;
7593
+ align-items: center;
7594
+ gap: 12px;
7595
+ width: 100%;
7596
+ min-width: 0;
7597
+ padding: 12px 14px;
7598
+ border: 1px solid var(--settings-divider);
7599
+ border-radius: var(--mikedown-radius, 6px);
7600
+ background: var(--mikedown-surface-raised, transparent);
7601
+ color: var(--settings-fg);
7602
+ font: inherit;
7603
+ text-align: left;
7604
+ cursor: pointer;
7605
+ transition: border-color 120ms var(--ai-ease), background-color 120ms var(--ai-ease), transform 120ms var(--ai-ease);
7606
+ }
7607
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option:hover {
7608
+ border-color: var(--settings-control-border);
7609
+ background: var(--ai-row-hover);
7610
+ }
7611
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option:active { transform: translateY(1px); }
7612
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option:focus-visible {
7613
+ outline: 1px solid var(--settings-focus);
7614
+ outline-offset: 1px;
7615
+ }
7616
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead {
7617
+ border-color: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 55%, var(--settings-divider));
7618
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 6%, var(--mikedown-surface-raised, transparent));
7619
+ }
7620
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead:hover { border-color: var(--mikedown-accent, #3f51b5); }
7621
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead[data-state="running"] {
7622
+ border-color: color-mix(in srgb, var(--ai-ok) 55%, var(--settings-divider));
7623
+ background: color-mix(in srgb, var(--ai-ok) 6%, var(--mikedown-surface-raised, transparent));
7624
+ }
7625
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option.is-lead[data-state="running"]:hover { border-color: var(--ai-ok); }
7626
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option[aria-busy="true"] { cursor: progress; }
7627
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-glyph .ai-glyph {
7628
+ width: 36px;
7629
+ height: 36px;
7630
+ border-radius: 9px;
7631
+ font-size: 13px;
7632
+ }
7633
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-glyph-cloud { color: var(--settings-muted); }
7634
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-glyph-cloud svg { width: 16px; height: 16px; }
7635
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-text {
7636
+ flex: 1;
7637
+ display: flex;
7638
+ flex-direction: column;
7639
+ gap: 2px;
7640
+ min-width: 0;
7641
+ }
7642
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-name {
7643
+ display: flex;
7644
+ align-items: center;
7645
+ gap: 7px;
7646
+ font-size: 13px;
7647
+ font-weight: 600;
7648
+ font-variant-numeric: tabular-nums;
7649
+ }
7650
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-caption {
7651
+ font-size: 12px;
7652
+ line-height: 1.45;
7653
+ color: var(--settings-muted);
7654
+ }
7655
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-option-chevron {
7656
+ display: inline-flex;
7657
+ flex-shrink: 0;
7658
+ color: var(--settings-muted);
7659
+ }
7660
+
7661
+ /* Cards and servers (steps 1 and 2). */
7662
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-group {
7663
+ display: flex;
7664
+ flex-direction: column;
7665
+ gap: 8px;
7666
+ }
7667
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard .ai-cards-grid { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
7668
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard .ai-card.is-selected {
7669
+ border-color: var(--mikedown-accent, #3f51b5);
7670
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 7%, var(--mikedown-surface-raised, transparent));
7671
+ }
7672
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-servers {
7673
+ display: grid;
7674
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
7675
+ gap: 8px;
7676
+ }
7677
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-server {
7678
+ display: flex;
7679
+ flex-direction: column;
7680
+ gap: 4px;
7681
+ min-width: 0;
7682
+ }
7683
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-install {
7684
+ padding: 0 4px;
7685
+ font-size: 11.5px;
7686
+ line-height: 1.45;
7687
+ color: var(--settings-muted);
7688
+ }
7689
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-link { margin: 0; padding: 0; text-decoration: underline; }
7690
+
7691
+ /* Advanced: local, folded. */
7692
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-advanced {
7693
+ display: flex;
7694
+ flex-direction: column;
7695
+ gap: 8px;
7696
+ padding-top: 14px;
7697
+ border-top: 1px solid var(--settings-divider);
7698
+ }
7699
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-advanced-panel {
7700
+ display: flex;
7701
+ flex-direction: column;
7702
+ align-items: flex-start;
7703
+ gap: 8px;
7704
+ padding-left: 20px;
7705
+ animation: ai-arrive 180ms var(--ai-ease);
7706
+ }
7707
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-advanced-panel[hidden] { display: none; }
7708
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-hardware {
7709
+ margin: 0;
7710
+ max-width: 540px;
7711
+ font-size: 12.5px;
7712
+ line-height: 1.5;
7713
+ color: var(--settings-fg);
7714
+ }
7715
+
7716
+ /* Step 2: the form under the cards, and the note over a cloud key field. */
7717
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-form {
7718
+ display: flex;
7719
+ flex-direction: column;
7720
+ gap: 10px;
7721
+ }
7722
+ /* Normal text on a faint accent tint, so it reads in light and dark themes alike. */
7723
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription {
7724
+ margin-left: 126px;
7725
+ padding: 8px 10px;
7726
+ border: 1px solid color-mix(in srgb, var(--mikedown-accent, #3f51b5) 30%, transparent);
7727
+ border-radius: var(--mikedown-radius-sm, 4px);
7728
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 7%, transparent);
7729
+ font-size: 12px;
7730
+ line-height: 1.5;
7731
+ color: var(--settings-fg);
7732
+ }
7733
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription-text { margin: 0; }
7734
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription-links { margin: 4px 0 0; }
7735
+ @container settings-content (max-width: 520px) {
7736
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-subscription { margin-left: 0; }
7737
+ }
7738
+
7739
+ /* The step's one primary action, bottom right like a sheet. */
7740
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-footer {
7741
+ display: flex;
7742
+ align-items: center;
7743
+ justify-content: flex-end;
7744
+ gap: 12px;
7745
+ padding-top: 4px;
7746
+ }
7747
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-hint {
7748
+ flex: 1;
7749
+ text-align: right;
7750
+ font-size: 12px;
7751
+ color: var(--settings-muted);
7752
+ }
7753
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-next { min-width: 88px; }
7754
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-next[aria-disabled="true"] { opacity: 0.5; cursor: default; }
7755
+
7756
+ /* Step 3: done. */
7757
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-done-icon {
7758
+ display: inline-flex;
7759
+ align-items: center;
7760
+ justify-content: center;
7761
+ width: 40px;
7762
+ height: 40px;
7763
+ margin-bottom: 6px;
7764
+ border-radius: 50%;
7765
+ color: var(--ai-ok);
7766
+ background: color-mix(in srgb, var(--ai-ok) 14%, transparent);
7767
+ }
7768
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-done-icon svg { width: 18px; height: 18px; }
7769
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-model {
7770
+ display: flex;
7771
+ align-items: center;
7772
+ gap: 10px;
7773
+ }
7774
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-model-label { font-size: 12.5px; color: var(--settings-fg); }
7775
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-model-select { max-width: 340px; }
7776
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-privacy {
7777
+ display: flex;
7778
+ align-items: flex-start;
7779
+ gap: 7px;
7780
+ margin: 0;
7781
+ max-width: 560px;
7782
+ font-size: 12.5px;
7783
+ line-height: 1.5;
7784
+ color: var(--settings-muted);
7785
+ }
7786
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-privacy .ai-privacy-glyph { margin-top: 3px; }
7787
+
7788
+ /* ── Setup wizard: cloud statement and hidden disclaimer (ai-setup-wizard.ts) ── */
7789
+
7790
+ :is(.mikedown-root, .mikedown-portal) .ai-page-disclaimer[hidden] { display: none; }
7791
+ :is(.mikedown-root, .mikedown-portal) .ai-wizard-cloud-line {
7792
+ margin: 0;
7793
+ font-size: 12px;
7794
+ line-height: 1.45;
7795
+ color: var(--settings-muted, var(--mikedown-text-muted));
7796
+ }
7797
+
7798
+ /* ── AI Activity panel (ai-activity-panel.ts) ─────────────────────────────────
7799
+ In the AI Engines page's shell. A request list crossed with an output pane:
7800
+ proportional type for labels, monospace for anything raw, no chrome beyond
7801
+ the hairlines the page already has. */
7802
+
7803
+ :is(.mikedown-root, .mikedown-portal) .ai-activity:focus { outline: none; }
7804
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-header-actions {
7805
+ justify-self: end;
7806
+ display: flex;
7807
+ align-items: center;
7808
+ gap: 6px;
7809
+ min-width: 0;
7810
+ }
7811
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-action {
7812
+ padding: 3px 10px;
7813
+ background: var(--mikedown-button-bg, transparent);
7814
+ color: var(--mikedown-button-text, var(--settings-fg));
7815
+ }
7816
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-action:hover { background: var(--mikedown-button-hover, var(--settings-hover-bg)); }
7817
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-action:disabled,
7818
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-action:disabled:hover {
7819
+ background: var(--mikedown-button-bg, transparent);
7820
+ opacity: 0.5;
7821
+ cursor: default;
7822
+ }
7823
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-inline-status {
7824
+ overflow: hidden;
7825
+ font-size: 12px;
7826
+ color: var(--settings-muted);
7827
+ text-overflow: ellipsis;
7828
+ white-space: nowrap;
7829
+ }
7830
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-inline-status[data-level="ok"] { color: var(--ai-ok); }
7831
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-inline-status[data-level="error"] { color: var(--ai-error); }
7832
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-banner {
7833
+ margin: 0;
7834
+ padding: 7px 16px;
7835
+ border-bottom: 1px solid var(--mikedown-divider, var(--settings-divider));
7836
+ font-size: 12px;
7837
+ line-height: 1.45;
7838
+ color: var(--settings-muted);
7839
+ flex-shrink: 0;
7840
+ }
7841
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-body {
7842
+ flex: 1;
7843
+ display: flex;
7844
+ min-height: 0;
7845
+ }
7846
+
7847
+ /* The list: dense enough to scan, like a network panel. */
7848
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-master {
7849
+ width: clamp(320px, 38%, 420px);
7850
+ flex-shrink: 0;
7851
+ display: flex;
7852
+ flex-direction: column;
7853
+ min-height: 0;
7854
+ border-right: 1px solid var(--mikedown-divider, var(--settings-divider));
7855
+ background: var(--mikedown-surface-toolbar, transparent);
7856
+ }
7857
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-list-head {
7858
+ display: flex;
7859
+ align-items: baseline;
7860
+ justify-content: space-between;
7861
+ gap: 8px;
7862
+ padding: 12px 16px 6px;
7863
+ flex-shrink: 0;
7864
+ }
7865
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-list-label {
7866
+ font-size: 11px;
7867
+ font-weight: 600;
7868
+ letter-spacing: 0.04em;
7869
+ text-transform: uppercase;
7870
+ color: var(--settings-muted);
7871
+ }
7872
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-list-count {
7873
+ font-size: 11px;
7874
+ font-variant-numeric: tabular-nums;
7875
+ color: var(--settings-muted);
7876
+ }
7877
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-list {
7878
+ flex: 1;
7879
+ min-height: 0;
7880
+ display: flex;
7881
+ flex-direction: column;
7882
+ gap: 1px;
7883
+ padding: 0 8px 10px;
7884
+ overflow-y: auto;
7885
+ /* The panel keeps the scroll position itself when a row lands on top. */
7886
+ overflow-anchor: none;
7887
+ }
7888
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row {
7889
+ display: grid;
7890
+ grid-template-columns: 14px minmax(0, 1fr) auto;
7891
+ align-items: center;
7892
+ gap: 2px 6px;
7893
+ flex-shrink: 0;
7894
+ padding: 6px 8px;
7895
+ border-radius: var(--mikedown-radius-sm, 4px);
7896
+ color: var(--settings-fg);
7897
+ cursor: pointer;
7898
+ transition: background-color 120ms var(--ai-ease);
7899
+ }
7900
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row:hover { background: var(--ai-row-hover); }
7901
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[aria-selected="true"] {
7902
+ background: var(--settings-active-bg);
7903
+ color: var(--settings-active-fg);
7904
+ outline: 1px solid var(--mikedown-contrast-border, transparent);
7905
+ outline-offset: -1px;
7906
+ }
7907
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row:focus:not(:focus-visible) { outline: none; }
7908
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row:focus-visible {
7909
+ outline: 1px solid var(--settings-focus);
7910
+ outline-offset: -1px;
7911
+ }
7912
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row > .ai-activity-dot { justify-self: center; }
7913
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-head,
7914
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-sub {
7915
+ display: flex;
7916
+ align-items: center;
7917
+ gap: 6px;
7918
+ min-width: 0;
7919
+ }
7920
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-sub { grid-column: 2; }
7921
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-feature {
7922
+ min-width: 0;
7923
+ overflow: hidden;
7924
+ font-size: 12.5px;
7925
+ font-weight: 500;
7926
+ text-overflow: ellipsis;
7927
+ white-space: nowrap;
7928
+ }
7929
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-status {
7930
+ flex-shrink: 0;
7931
+ font-size: 11px;
7932
+ white-space: nowrap;
7933
+ }
7934
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[data-status="error"] .ai-activity-row-status { color: var(--ai-error); }
7935
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[data-status="fallback"] .ai-activity-row-status { color: var(--ai-warn); }
7936
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[data-status="streaming"] .ai-activity-row-status { color: var(--ai-info); }
7937
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[data-status="cancelled"] .ai-activity-row-status { color: var(--settings-muted); }
7938
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-when,
7939
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-tokens {
7940
+ justify-self: end;
7941
+ font-family: var(--mikedown-font-mono, ui-monospace, monospace);
7942
+ font-size: 11px;
7943
+ font-variant-numeric: tabular-nums;
7944
+ color: var(--settings-muted);
7945
+ white-space: nowrap;
7946
+ }
7947
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-when {
7948
+ display: flex;
7949
+ gap: 10px;
7950
+ }
7951
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-engine {
7952
+ min-width: 0;
7953
+ overflow: hidden;
7954
+ font-size: 11.5px;
7955
+ color: var(--settings-muted);
7956
+ text-overflow: ellipsis;
7957
+ white-space: nowrap;
7958
+ }
7959
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-locality { display: inline-flex; flex-shrink: 0; }
7960
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row-locality:empty { display: none; }
7961
+ /* On the selected fill, everything follows its text color (a theme's fill can be saturated). */
7962
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[aria-selected="true"] :is(.ai-activity-row-status, .ai-activity-row-when, .ai-activity-row-tokens, .ai-activity-row-engine) {
7963
+ color: inherit;
7964
+ opacity: 0.78;
7965
+ }
7966
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[aria-selected="true"] .ai-pill {
7967
+ color: inherit;
7968
+ background: color-mix(in srgb, currentColor 14%, transparent);
7969
+ }
7970
+
7971
+ /* The status dot. Shape as well as color: cancelled is a hollow ring. */
7972
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-dot {
7973
+ display: inline-block;
7974
+ width: 8px;
7975
+ height: 8px;
7976
+ flex-shrink: 0;
7977
+ box-sizing: border-box;
7978
+ border: 1.5px solid var(--settings-muted);
7979
+ border-radius: 50%;
7980
+ background: transparent;
7981
+ }
7982
+ :is(.mikedown-root, .mikedown-portal) [data-status="ok"] > .ai-activity-dot { background: var(--ai-ok); border-color: var(--ai-ok); }
7983
+ :is(.mikedown-root, .mikedown-portal) [data-status="error"] > .ai-activity-dot { background: var(--ai-error); border-color: var(--ai-error); }
7984
+ :is(.mikedown-root, .mikedown-portal) [data-status="fallback"] > .ai-activity-dot { background: var(--ai-warn); border-color: var(--ai-warn); }
7985
+ :is(.mikedown-root, .mikedown-portal) [data-status="streaming"] > .ai-activity-dot {
7986
+ background: var(--ai-info);
7987
+ border-color: var(--ai-info);
7988
+ animation: ai-pulse 1s ease-in-out infinite;
7989
+ }
7990
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row[aria-selected="true"] > .ai-activity-dot {
7991
+ box-shadow: 0 0 0 1px color-mix(in srgb, currentColor 35%, transparent);
7992
+ }
7993
+
7994
+ /* The request: one readable column that can hold long raw text. */
7995
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail {
7996
+ flex: 1;
7997
+ min-width: 0;
7998
+ overflow-y: auto;
7999
+ }
8000
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail:focus:not(:focus-visible) { outline: none; }
8001
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail:focus-visible {
8002
+ outline: 1px solid var(--settings-focus);
8003
+ outline-offset: -1px;
8004
+ }
8005
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail-inner {
8006
+ box-sizing: border-box;
8007
+ display: flex;
8008
+ flex-direction: column;
8009
+ gap: 16px;
8010
+ max-width: 920px;
8011
+ margin: 0 auto;
8012
+ padding: 18px 24px 40px;
8013
+ }
8014
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail-head {
8015
+ display: flex;
8016
+ flex-direction: column;
8017
+ gap: 5px;
8018
+ }
8019
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail-title-row {
8020
+ display: flex;
8021
+ flex-wrap: wrap;
8022
+ align-items: center;
8023
+ gap: 6px 10px;
8024
+ }
8025
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail-title {
8026
+ margin: 0;
8027
+ font-size: 14px;
8028
+ font-weight: 600;
8029
+ color: var(--settings-fg);
8030
+ }
8031
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-status {
8032
+ display: inline-flex;
8033
+ align-items: center;
8034
+ gap: 5px;
8035
+ font-size: 12px;
8036
+ color: var(--settings-muted);
8037
+ }
8038
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-status[data-status="error"] { color: var(--ai-error); }
8039
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-detail-actions {
8040
+ display: flex;
8041
+ align-items: center;
8042
+ gap: 6px;
8043
+ min-width: 0;
8044
+ margin-left: auto;
8045
+ }
8046
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-route {
8047
+ display: flex;
8048
+ flex-wrap: wrap;
8049
+ align-items: center;
8050
+ gap: 2px 8px;
8051
+ font-size: 12.5px;
8052
+ color: var(--settings-fg);
8053
+ }
8054
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-route-model {
8055
+ font-family: var(--mikedown-font-mono, ui-monospace, monospace);
8056
+ font-size: 12px;
8057
+ color: var(--settings-muted);
8058
+ overflow-wrap: anywhere;
8059
+ }
8060
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-thinking {
8061
+ font-size: 12px;
8062
+ color: var(--settings-muted);
8063
+ }
8064
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-notes {
8065
+ display: flex;
8066
+ flex-direction: column;
8067
+ gap: 6px;
8068
+ }
8069
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-notes:empty { display: none; }
8070
+
8071
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-section {
8072
+ display: flex;
8073
+ flex-direction: column;
8074
+ gap: 8px;
8075
+ }
8076
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-section-head {
8077
+ display: flex;
8078
+ align-items: center;
8079
+ gap: 8px;
8080
+ min-width: 0;
8081
+ }
8082
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-section-toggle {
8083
+ align-self: auto;
8084
+ flex-shrink: 0;
8085
+ font-weight: 600;
8086
+ color: var(--settings-fg);
8087
+ }
8088
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-section-summary {
8089
+ overflow: hidden;
8090
+ font-size: 11.5px;
8091
+ font-variant-numeric: tabular-nums;
8092
+ color: var(--settings-muted);
8093
+ text-overflow: ellipsis;
8094
+ white-space: nowrap;
8095
+ }
8096
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-section-body {
8097
+ display: flex;
8098
+ flex-direction: column;
8099
+ gap: 8px;
8100
+ }
8101
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-section-body[hidden],
8102
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-block[hidden] { display: none; }
8103
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-block {
8104
+ overflow: hidden;
8105
+ border: 1px solid var(--mikedown-divider, var(--settings-divider));
8106
+ border-radius: var(--mikedown-radius-sm, 4px);
8107
+ background: var(--mikedown-code-bg, transparent);
8108
+ }
8109
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-block-caption {
8110
+ display: flex;
8111
+ align-items: baseline;
8112
+ justify-content: space-between;
8113
+ gap: 8px;
8114
+ padding: 4px 10px;
8115
+ border-bottom: 1px solid var(--mikedown-divider, var(--settings-divider));
8116
+ }
8117
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-message-role {
8118
+ font-size: 10.5px;
8119
+ font-weight: 600;
8120
+ letter-spacing: 0.04em;
8121
+ text-transform: uppercase;
8122
+ color: var(--settings-muted);
8123
+ }
8124
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-block-size {
8125
+ font-size: 11px;
8126
+ font-variant-numeric: tabular-nums;
8127
+ color: var(--settings-muted);
8128
+ }
8129
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-text {
8130
+ margin: 0;
8131
+ padding: 8px 10px;
8132
+ background: none;
8133
+ font-family: var(--mikedown-font-mono, ui-monospace, monospace);
8134
+ font-size: 12px;
8135
+ line-height: 1.5;
8136
+ color: var(--mikedown-text, var(--settings-fg));
8137
+ tab-size: 4;
8138
+ white-space: pre-wrap;
8139
+ overflow-wrap: anywhere;
8140
+ user-select: text;
8141
+ }
8142
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-meta {
8143
+ display: grid;
8144
+ grid-template-columns: max-content minmax(0, 1fr);
8145
+ gap: 2px 14px;
8146
+ margin: 0;
8147
+ font-size: 12px;
8148
+ line-height: 1.5;
8149
+ }
8150
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-meta dt { color: var(--settings-muted); }
8151
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-meta dd {
8152
+ margin: 0;
8153
+ min-width: 0;
8154
+ font-variant-numeric: tabular-nums;
8155
+ color: var(--settings-fg);
8156
+ overflow-wrap: anywhere;
8157
+ }
8158
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-meta dd.is-raw {
8159
+ font-family: var(--mikedown-font-mono, ui-monospace, monospace);
8160
+ font-size: 11.5px;
8161
+ }
8162
+
8163
+ /* Nothing recorded: the list and detail give way to one quiet message. */
8164
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-empty {
8165
+ flex: 1;
8166
+ display: flex;
8167
+ flex-direction: column;
8168
+ align-items: center;
8169
+ justify-content: center;
8170
+ gap: 6px;
8171
+ min-height: 0;
8172
+ padding: 32px 24px 96px;
8173
+ text-align: center;
8174
+ }
8175
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-empty-title {
8176
+ font-size: 14px;
8177
+ font-weight: 600;
8178
+ color: var(--settings-fg);
8179
+ }
8180
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-empty-text {
8181
+ max-width: 460px;
8182
+ margin: 0;
8183
+ font-size: 12.5px;
8184
+ line-height: 1.5;
8185
+ color: var(--settings-muted);
8186
+ }
8187
+
8188
+ /* One column: the list or the request, as on the AI Engines page. */
8189
+ :is(.mikedown-root, .mikedown-portal) .ai-activity.is-narrow .ai-activity-master {
8190
+ width: auto;
8191
+ flex: 1;
8192
+ border-right: none;
8193
+ }
8194
+ :is(.mikedown-root, .mikedown-portal) .ai-activity.is-narrow[data-view="list"] .ai-activity-detail,
8195
+ :is(.mikedown-root, .mikedown-portal) .ai-activity.is-narrow[data-view="detail"] .ai-activity-master { display: none; }
8196
+ :is(.mikedown-root, .mikedown-portal) .ai-activity.is-narrow .ai-activity-detail-inner { padding: 14px 16px 32px; }
8197
+ :is(.mikedown-root, .mikedown-portal) .ai-activity.is-narrow .ai-page-header { padding: 8px 10px; }
8198
+
8199
+ /* The AI tab's "Open" beside the AI Activity switch. */
8200
+ :is(.mikedown-root, .mikedown-portal) .settings-row--inline.ai-activity-setting { grid-template-columns: minmax(0, 1fr) auto auto; }
8201
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-open { margin: 0; flex-shrink: 0; }
8202
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-open[hidden] { display: none; }
8203
+
8204
+ @media (prefers-reduced-motion: reduce) {
8205
+ :is(.mikedown-root, .mikedown-portal) [data-status="streaming"] > .ai-activity-dot { animation: none; }
8206
+ :is(.mikedown-root, .mikedown-portal) .ai-activity-row { transition: none; }
8207
+ }
8208
+
8209
+ /* ── Documentation bases (ai-docs-page.ts) ───────────────────────────────── */
8210
+
8211
+ :is(.mikedown-root, .mikedown-portal) .ai-docs,
8212
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-list-view,
8213
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form {
8214
+ display: flex;
8215
+ flex-direction: column;
8216
+ gap: 10px;
8217
+ }
8218
+ :is(.mikedown-root, .mikedown-portal) .ai-docs { gap: 14px; }
8219
+ :is(.mikedown-root, .mikedown-portal) .ai-docs > [hidden] { display: none; }
8220
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail[data-kind="bases"] .ai-detail-head { flex-direction: row; align-items: center; gap: 14px; }
8221
+
8222
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-bar,
8223
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-actions,
8224
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-adders,
8225
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-path {
8226
+ display: flex;
8227
+ align-items: center;
8228
+ gap: 8px;
8229
+ flex-wrap: wrap;
8230
+ }
8231
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-status {
8232
+ flex: 1;
8233
+ min-width: 0;
8234
+ font-size: 12px;
8235
+ color: var(--settings-muted);
8236
+ }
8237
+
8238
+ /* One base: a row of the settings group, flat, with its folders under the name. */
8239
+ :is(.mikedown-root, .mikedown-portal) .settings-group > .settings-row.ai-docs-base { gap: 6px; }
8240
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-base-head {
8241
+ display: flex;
8242
+ align-items: center;
8243
+ justify-content: space-between;
8244
+ gap: 12px;
8245
+ min-width: 0;
8246
+ }
8247
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-base-title {
8248
+ display: flex;
8249
+ align-items: center;
8250
+ gap: 8px;
8251
+ flex-wrap: wrap;
8252
+ min-width: 0;
8253
+ }
8254
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-base-name {
8255
+ min-width: 0;
8256
+ font-size: 13px;
8257
+ font-weight: 600;
8258
+ color: var(--settings-fg);
8259
+ overflow-wrap: anywhere;
8260
+ }
8261
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-base-actions {
8262
+ display: flex;
8263
+ align-items: center;
8264
+ gap: 6px;
8265
+ flex-shrink: 0;
8266
+ }
8267
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-base.is-disabled .ai-docs-base-title,
8268
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-base.is-disabled .ai-docs-roots { opacity: 0.55; }
8269
+
8270
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-roots,
8271
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-roots {
8272
+ display: flex;
8273
+ flex-direction: column;
8274
+ gap: 6px;
8275
+ min-width: 0;
8276
+ margin: 0;
8277
+ padding: 0;
8278
+ list-style: none;
8279
+ }
8280
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-roots:empty { display: none; }
8281
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-root {
8282
+ display: flex;
8283
+ flex-direction: column;
8284
+ gap: 3px;
8285
+ min-width: 0;
8286
+ }
8287
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-root {
8288
+ display: flex;
8289
+ align-items: center;
8290
+ justify-content: space-between;
8291
+ gap: 8px;
8292
+ min-width: 0;
8293
+ }
8294
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-path {
8295
+ min-width: 0;
8296
+ color: var(--settings-muted);
8297
+ overflow: hidden;
8298
+ text-overflow: ellipsis;
8299
+ white-space: nowrap;
8300
+ }
8301
+
8302
+ /* Health: small quiet tags, as under a setting in VS Code. Only a warning takes colour. */
8303
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-chips {
8304
+ display: flex;
8305
+ flex-wrap: wrap;
8306
+ gap: 4px;
8307
+ min-width: 0;
8308
+ }
8309
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-chip {
8310
+ display: inline-flex;
8311
+ align-items: center;
8312
+ gap: 3px;
8313
+ max-width: 100%;
8314
+ padding: 0 6px;
8315
+ min-height: 17px;
8316
+ border: 1px solid transparent;
8317
+ border-radius: var(--mikedown-radius-sm, 4px);
8318
+ background: var(--ai-row-hover);
8319
+ font-size: 11px;
8320
+ line-height: 15px;
8321
+ color: var(--settings-muted);
8322
+ overflow-wrap: anywhere;
8323
+ }
8324
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-chip svg { flex-shrink: 0; width: 11px; height: 11px; }
8325
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-chip--warn {
8326
+ background: color-mix(in srgb, var(--ai-warn) 10%, transparent);
8327
+ color: var(--ai-warn);
8328
+ }
8329
+
8330
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form .settings-input:not(.ai-docs-number) { min-width: 0; }
8331
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form .settings-row--inline > .settings-input { width: 260px; max-width: 100%; }
8332
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-path .settings-input { flex: 1; width: auto; min-width: 160px; }
8333
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-form-error:empty { display: none; }
8334
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-number { width: 72px; }
8335
+ :is(.mikedown-root, .mikedown-portal) .ai-docs-select.settings-input { width: auto; }
8336
+
8337
+ :is(.mikedown-root, .mikedown-portal) .ai-page-detail .ai-docs-base .ai-confirm { margin: 2px 0 0; }
8338
+
8339
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-docs-base-head { flex-wrap: wrap; }
8340
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-docs-path { white-space: normal; overflow-wrap: anywhere; }
8341
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-docs-form .settings-row--inline { grid-template-columns: minmax(0, 1fr); }
8342
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-docs-form .settings-row--inline > .settings-input { width: 100%; justify-self: stretch; }
8343
+ :is(.mikedown-root, .mikedown-portal) .ai-page.is-narrow .ai-docs-form .settings-row--inline > .ai-switch { justify-self: start; }
8344
+
8345
+ /* ── The chat panel (ai-chat-panel.ts): docked inside the editor ─────────── */
8346
+
8347
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-dock {
8348
+ --settings-fg: var(--mikedown-text, #d4d4d4);
8349
+ --settings-muted: var(--mikedown-text-muted, rgba(128, 128, 128, 0.9));
8350
+ --settings-divider: var(--mikedown-border, rgba(128, 128, 128, 0.2));
8351
+ --settings-focus: var(--mikedown-focus-ring, #007fd4);
8352
+ --ai-ok: var(--mikedown-success, #2e7d32);
8353
+ --ai-error: var(--mikedown-danger, #c62828);
8354
+ --ai-warn: var(--mikedown-warning, #b26a00);
8355
+ --ai-ease: cubic-bezier(0.2, 0, 0, 1);
8356
+ --ai-chat-quiet: var(--mikedown-hover, rgba(128, 128, 128, 0.1));
8357
+ position: absolute;
8358
+ top: 40px;
8359
+ right: 0;
8360
+ bottom: 0;
8361
+ left: 0;
8362
+ z-index: 95;
8363
+ display: flex;
8364
+ background: var(--mikedown-surface, #1e1e1e);
8365
+ color: var(--settings-fg);
8366
+ font-family: var(--mikedown-font-ui, system-ui, -apple-system, sans-serif);
8367
+ font-size: 13px;
8368
+ line-height: 1.5;
8369
+ }
8370
+ .mikedown-root.mikedown-no-toolbar .ai-chat-dock { top: 0; }
8371
+ .mikedown-root.ai-chat-docked .ai-chat-dock {
8372
+ left: auto;
8373
+ width: var(--mikedown-ai-chat-width, 380px);
8374
+ border-left: 1px solid var(--mikedown-divider, var(--settings-divider));
8375
+ }
8376
+ .mikedown-root.ai-chat-docked .mikedown-editor-container,
8377
+ .mikedown-root.ai-chat-docked .mikedown-source-container {
8378
+ right: var(--mikedown-ai-chat-width, 380px);
8379
+ }
8380
+ /* A sidebar on the right sits beside the panel, not under it. */
8381
+ .mikedown-root.ai-chat-docked.mikedown-outline-right .mikedown-outline-sidebar {
8382
+ right: var(--mikedown-ai-chat-width, 380px);
8383
+ }
8384
+ .mikedown-root.ai-chat-docked.mikedown-outline-open.mikedown-outline-right .mikedown-editor-container {
8385
+ right: calc(var(--mikedown-ai-chat-width, 380px) + var(--mikedown-outline-width, 200px));
8386
+ }
8387
+ .mikedown-root.ai-chat-docked.mikedown-outline-right .mikedown-outline-toggle {
8388
+ right: calc(var(--mikedown-ai-chat-width, 380px) + 8px);
8389
+ }
8390
+ .mikedown-root.ai-chat-docked .mikedown-find-replace-bar {
8391
+ right: calc(var(--mikedown-ai-chat-width, 380px) + 20px);
8392
+ }
8393
+ @media print {
8394
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-dock { display: none; }
8395
+ }
8396
+
8397
+ :is(.mikedown-root, .mikedown-portal) .ai-chat {
8398
+ flex: 1;
8399
+ display: flex;
8400
+ flex-direction: column;
8401
+ min-width: 0;
8402
+ min-height: 0;
8403
+ }
8404
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-spacer { flex: 1; }
8405
+
8406
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-header {
8407
+ display: flex;
8408
+ align-items: center;
8409
+ gap: 6px;
8410
+ min-height: 36px;
8411
+ padding: 4px 6px 4px 14px;
8412
+ flex-shrink: 0;
8413
+ }
8414
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-title {
8415
+ margin: 0;
8416
+ font-size: 13px;
8417
+ font-weight: 600;
8418
+ color: var(--settings-fg);
8419
+ }
8420
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-icon {
8421
+ display: inline-flex;
8422
+ align-items: center;
8423
+ justify-content: center;
8424
+ width: 26px;
8425
+ height: 26px;
8426
+ padding: 0;
8427
+ border: 0;
8428
+ border-radius: var(--mikedown-radius-sm, 4px);
8429
+ background: none;
8430
+ color: var(--settings-muted);
8431
+ cursor: pointer;
8432
+ }
8433
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-icon:hover { background: var(--ai-chat-quiet); color: var(--settings-fg); }
8434
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-icon[hidden] { display: none; }
8435
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-status {
8436
+ font-size: 11.5px;
8437
+ color: var(--settings-muted);
8438
+ overflow-wrap: anywhere;
8439
+ }
8440
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-status[data-level="error"] { color: var(--ai-error); }
8441
+
8442
+ /* The conversation. */
8443
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-log {
8444
+ flex: 1;
8445
+ min-height: 0;
8446
+ overflow-y: auto;
8447
+ padding: 6px 14px 14px;
8448
+ outline: none;
8449
+ }
8450
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-empty {
8451
+ margin-top: 18vh;
8452
+ padding: 0 16px;
8453
+ text-align: center;
8454
+ color: var(--settings-muted);
8455
+ }
8456
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-empty[hidden] { display: none; }
8457
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-empty-title { font-weight: 600; color: var(--settings-fg); }
8458
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-empty-text { margin: 4px 0 0; font-size: 12px; }
8459
+
8460
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-turn {
8461
+ display: flex;
8462
+ flex-direction: column;
8463
+ gap: 10px;
8464
+ margin-top: 16px;
8465
+ }
8466
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-turn:first-of-type { margin-top: 6px; }
8467
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-question {
8468
+ align-self: flex-end;
8469
+ max-width: 88%;
8470
+ padding: 6px 11px;
8471
+ border-radius: 12px;
8472
+ background: var(--mikedown-active, var(--ai-chat-quiet));
8473
+ white-space: pre-wrap;
8474
+ overflow-wrap: anywhere;
8475
+ }
8476
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-reply {
8477
+ display: flex;
8478
+ flex-direction: column;
8479
+ gap: 6px;
8480
+ min-width: 0;
8481
+ }
8482
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-answer {
8483
+ white-space: pre-wrap;
8484
+ overflow-wrap: anywhere;
8485
+ }
8486
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-answer.is-cancelled { color: var(--settings-muted); }
8487
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-turn--arrived .ai-chat-reply {
8488
+ animation: ai-chat-arrive 200ms var(--ai-ease);
8489
+ }
8490
+ @keyframes ai-chat-arrive {
8491
+ from { opacity: 0.35; transform: translateY(3px); }
8492
+ to { opacity: 1; transform: none; }
8493
+ }
8494
+
8495
+ /* A citation: its number and `file › heading`. The full path is in the hover title. */
8496
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-chip {
8497
+ display: inline-flex;
8498
+ align-items: baseline;
8499
+ gap: 4px;
8500
+ max-width: min(100%, 26em);
8501
+ margin: 0 1px;
8502
+ padding: 0 7px 0 3px;
8503
+ border: 1px solid var(--mikedown-divider, var(--settings-divider));
8504
+ border-radius: 999px;
8505
+ background: none;
8506
+ color: var(--mikedown-link, var(--settings-fg));
8507
+ font: inherit;
8508
+ font-size: 11.5px;
8509
+ line-height: 1.55;
8510
+ white-space: nowrap;
8511
+ vertical-align: baseline;
8512
+ transition: background-color 120ms ease-out;
8513
+ }
8514
+ :is(.mikedown-root, .mikedown-portal) button.ai-chat-chip { cursor: pointer; }
8515
+ :is(.mikedown-root, .mikedown-portal) button.ai-chat-chip:hover { background: var(--ai-chat-quiet); }
8516
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-chip-n {
8517
+ min-width: 1.35em;
8518
+ border-radius: 999px;
8519
+ background: var(--ai-chat-quiet);
8520
+ color: var(--settings-muted);
8521
+ font-variant-numeric: tabular-nums;
8522
+ text-align: center;
8523
+ }
8524
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-chip-label {
8525
+ overflow: hidden;
8526
+ text-overflow: ellipsis;
8527
+ }
8528
+
8529
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-notes { display: flex; flex-direction: column; gap: 1px; }
8530
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-note {
8531
+ font-size: 11.5px;
8532
+ color: var(--settings-muted);
8533
+ }
8534
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-actions {
8535
+ display: flex;
8536
+ flex-wrap: wrap;
8537
+ align-items: center;
8538
+ gap: 2px 4px;
8539
+ margin-left: -6px;
8540
+ }
8541
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-action,
8542
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-link {
8543
+ padding: 2px 6px;
8544
+ border: 0;
8545
+ border-radius: var(--mikedown-radius-sm, 4px);
8546
+ background: none;
8547
+ color: var(--settings-muted);
8548
+ font: inherit;
8549
+ font-size: 12px;
8550
+ cursor: pointer;
8551
+ }
8552
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-action:hover,
8553
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-link:hover { background: var(--ai-chat-quiet); color: var(--settings-fg); }
8554
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-link { color: var(--mikedown-link, var(--settings-muted)); }
8555
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-route {
8556
+ display: inline-flex;
8557
+ align-items: center;
8558
+ gap: 4px;
8559
+ max-width: 40%;
8560
+ padding-right: 2px;
8561
+ font-size: 11px;
8562
+ color: var(--settings-muted);
8563
+ }
8564
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-route-icon { display: inline-flex; flex-shrink: 0; }
8565
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-route-name {
8566
+ overflow: hidden;
8567
+ white-space: nowrap;
8568
+ text-overflow: ellipsis;
8569
+ }
8570
+
8571
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-progress {
8572
+ display: flex;
8573
+ align-items: center;
8574
+ gap: 7px;
8575
+ font-size: 12px;
8576
+ color: var(--settings-muted);
8577
+ }
8578
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-dot {
8579
+ width: 6px;
8580
+ height: 6px;
8581
+ flex-shrink: 0;
8582
+ border-radius: 50%;
8583
+ background: currentColor;
8584
+ animation: ai-chat-pulse 1.2s ease-in-out infinite;
8585
+ }
8586
+ @keyframes ai-chat-pulse {
8587
+ 50% { opacity: 0.25; }
8588
+ }
8589
+
8590
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-notice {
8591
+ display: flex;
8592
+ flex-direction: column;
8593
+ gap: 4px;
8594
+ padding: 8px 10px;
8595
+ border-radius: 8px;
8596
+ background: var(--ai-chat-quiet);
8597
+ }
8598
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-notice-title { font-weight: 600; overflow-wrap: anywhere; }
8599
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-notice .ai-chat-actions { margin: 2px 0 0 -6px; }
8600
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-notice .ai-chat-action { color: var(--mikedown-link, var(--settings-fg)); }
8601
+
8602
+ /* The composer. */
8603
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-composer {
8604
+ display: flex;
8605
+ flex-direction: column;
8606
+ gap: 6px;
8607
+ padding: 8px 12px 12px;
8608
+ flex-shrink: 0;
8609
+ }
8610
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-off[hidden],
8611
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-scope[hidden],
8612
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-bases[hidden] { display: none; }
8613
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-scope {
8614
+ display: inline-flex;
8615
+ align-self: flex-start;
8616
+ padding: 2px;
8617
+ border-radius: 7px;
8618
+ background: var(--ai-chat-quiet);
8619
+ }
8620
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-seg { position: relative; display: inline-flex; cursor: pointer; }
8621
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-seg input {
8622
+ position: absolute;
8623
+ inset: 0;
8624
+ margin: 0;
8625
+ opacity: 0;
8626
+ cursor: inherit;
8627
+ }
8628
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-seg span {
8629
+ padding: 1px 9px;
8630
+ border-radius: 5px;
8631
+ font-size: 12px;
8632
+ color: var(--settings-muted);
8633
+ transition: background-color 120ms ease-out, color 120ms ease-out;
8634
+ }
8635
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-seg input:checked + span {
8636
+ background: var(--mikedown-surface, #1e1e1e);
8637
+ color: var(--settings-fg);
8638
+ box-shadow: 0 0 0 1px var(--mikedown-divider, var(--settings-divider));
8639
+ }
8640
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-seg input:focus-visible + span {
8641
+ outline: 1px solid var(--settings-focus);
8642
+ outline-offset: 1px;
8643
+ }
8644
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-seg input:disabled + span { opacity: 0.6; }
8645
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-bases {
8646
+ padding-left: 2px;
8647
+ font-size: 11.5px;
8648
+ color: var(--settings-muted);
8649
+ overflow: hidden;
8650
+ white-space: nowrap;
8651
+ text-overflow: ellipsis;
8652
+ }
8653
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-bases .ai-chat-link { padding: 0 2px; font-size: inherit; }
8654
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-box {
8655
+ display: flex;
8656
+ align-items: flex-end;
8657
+ gap: 4px;
8658
+ padding: 5px 5px 5px 10px;
8659
+ border: 1px solid var(--mikedown-input-border, var(--settings-divider));
8660
+ border-radius: 10px;
8661
+ background: var(--mikedown-input-bg, transparent);
8662
+ transition: border-color 120ms ease-out;
8663
+ }
8664
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-box:focus-within { border-color: var(--settings-focus); }
8665
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-input {
8666
+ flex: 1;
8667
+ min-width: 0;
8668
+ max-height: 136px;
8669
+ padding: 3px 0;
8670
+ border: 0;
8671
+ outline: none;
8672
+ resize: none;
8673
+ background: none;
8674
+ color: var(--settings-fg);
8675
+ font: inherit;
8676
+ }
8677
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-input::placeholder { color: var(--settings-muted); }
8678
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-send {
8679
+ display: inline-flex;
8680
+ align-items: center;
8681
+ justify-content: center;
8682
+ width: 26px;
8683
+ height: 26px;
8684
+ flex-shrink: 0;
8685
+ padding: 0;
8686
+ border: 0;
8687
+ border-radius: 7px;
8688
+ background: var(--mikedown-selected-bg, #0e639c);
8689
+ color: var(--mikedown-selected-text, #ffffff);
8690
+ cursor: pointer;
8691
+ }
8692
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-send[hidden] { display: none; }
8693
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-send:disabled { background: var(--ai-chat-quiet); color: var(--settings-muted); cursor: default; }
8694
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-send--cancel { background: var(--ai-chat-quiet); color: var(--settings-fg); }
8695
+ :is(.mikedown-root, .mikedown-portal) :is(.ai-chat-icon, .ai-chat-send, .ai-chat-action, .ai-chat-link, .ai-chat-chip):focus-visible,
8696
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-log:focus-visible {
8697
+ outline: 1px solid var(--settings-focus);
8698
+ outline-offset: -1px;
8699
+ }
8700
+ @media (prefers-reduced-motion: reduce) {
8701
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-turn--arrived .ai-chat-reply,
8702
+ :is(.mikedown-root, .mikedown-portal) .ai-chat-dot { animation: none; }
8703
+ }
8704
+
8705
+ /* ═══ ai-rewrite.css ═══ */
8706
+ /* MikeDown — selection rewrite (ai-rewrite.ts): the target highlight and
8707
+ * the preview popover. Overlays live in the portal and
8708
+ * read only --mikedown-* tokens.
8709
+ */
8710
+
8711
+ /* ── Target highlight (PM inline decoration, CM mark) ───────────────────── */
8712
+
8713
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite-target {
8714
+ background: color-mix(in srgb, var(--mikedown-accent, #3f51b5) 16%, transparent);
8715
+ box-shadow: 0 1px 0 color-mix(in srgb, var(--mikedown-accent, #3f51b5) 55%, transparent);
8716
+ border-radius: 2px;
8717
+ }
8718
+
8719
+ /* ── Popover ────────────────────────────────────────────────────────────── */
8720
+
8721
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite {
8722
+ position: fixed;
8723
+ z-index: 995;
8724
+ display: flex;
8725
+ flex-direction: column;
8726
+ width: 440px;
8727
+ max-width: calc(100vw - 16px);
8728
+ max-height: min(70vh, 520px);
8729
+ border: 1px solid var(--mikedown-border, rgba(15, 15, 20, 0.1));
8730
+ border-radius: var(--mikedown-radius-lg, 12px);
8731
+ background: var(--mikedown-surface-raised, #fff);
8732
+ color: var(--mikedown-text-ui, #3a3a3d);
8733
+ 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));
8734
+ font-family: var(--mikedown-font-ui, system-ui, sans-serif);
8735
+ font-size: 13px;
8736
+ line-height: 1.45;
8737
+ overflow: hidden;
8738
+ animation: mikedown-ai-fade 0.14s ease-out;
8739
+ }
8740
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite:focus { outline: none; }
8741
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="split"]:is([data-phase="running"], [data-phase="done"]) { width: 680px; }
8742
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite [hidden] { display: none !important; }
8743
+
8744
+ @keyframes mikedown-ai-fade {
8745
+ from { opacity: 0; transform: translateY(2px); }
8746
+ to { opacity: 1; transform: none; }
8747
+ }
8748
+
8749
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-head {
8750
+ display: flex;
8751
+ align-items: center;
8752
+ gap: 8px;
8753
+ min-height: 36px;
8754
+ padding: 6px 6px 6px 12px;
8755
+ border-bottom: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8756
+ }
8757
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-spark { display: inline-flex; flex-shrink: 0; color: var(--mikedown-accent, #3f51b5); }
8758
+ /* A long title ("Translate · Spanish · Whole document") gives way: it
8759
+ ellipsizes, and the thinking dial and Close never shrink, so nothing is
8760
+ pushed past the edge. */
8761
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-title {
8762
+ flex: 0 1000 auto;
8763
+ min-width: 6em;
8764
+ font-weight: 600;
8765
+ white-space: nowrap;
8766
+ overflow: hidden;
8767
+ text-overflow: ellipsis;
8768
+ }
8769
+
8770
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge {
8771
+ display: inline-flex;
8772
+ align-items: center;
8773
+ gap: 4px;
8774
+ flex: 0 1 auto;
8775
+ /* Never narrower than the glyph, locality and engine; only the model name
8776
+ gives way, and only when the badge alone is wider than the footer. */
8777
+ min-width: min-content;
8778
+ max-width: 100%;
8779
+ margin-left: auto;
8780
+ padding: 1px 8px 1px 6px;
8781
+ border: 1px solid transparent;
8782
+ border-radius: 10px;
8783
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
8784
+ color: var(--mikedown-text-muted, #6f6f74);
8785
+ font-size: 11.5px;
8786
+ line-height: 16px;
8787
+ white-space: nowrap;
8788
+ }
8789
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-glyph { display: inline-flex; flex-shrink: 0; }
8790
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-text {
8791
+ display: grid;
8792
+ grid-template-columns: auto minmax(3ch, auto);
8793
+ min-width: 0;
8794
+ }
8795
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-model { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
8796
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge[data-where="local"] .ai-rw-badge-glyph { color: var(--mikedown-success, #2e7d32); }
8797
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge[data-where="cloud"] { border-color: color-mix(in srgb, var(--mikedown-info, #1e70d6) 35%, transparent); }
8798
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge[data-where="cloud"] .ai-rw-badge-glyph { color: var(--mikedown-info, #1e70d6); }
8799
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge.is-pending { opacity: 0.75; }
8800
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-fallback { color: var(--mikedown-warning, #b26a00); }
8801
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-head .ai-rw-think[hidden] + .ai-rw-icon-btn { margin-left: auto; }
8802
+
8803
+ /* Thinking dial: a segmented pill, right of the title (also the AI menu's Thinking row). */
8804
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think {
8805
+ display: inline-flex;
8806
+ align-items: center;
8807
+ flex-shrink: 0;
8808
+ margin-left: auto;
8809
+ padding: 1px;
8810
+ border: 1px solid transparent;
8811
+ border-radius: 10px;
8812
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
8813
+ color: var(--mikedown-text-muted, #6f6f74);
8814
+ font-size: 11.5px;
8815
+ line-height: 16px;
8816
+ white-space: nowrap;
8817
+ }
8818
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think[hidden] { display: none; }
8819
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-label { padding: 0 4px 0 6px; }
8820
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-seg {
8821
+ padding: 0 6px;
8822
+ border: 0;
8823
+ border-radius: 9px;
8824
+ background: none;
8825
+ color: inherit;
8826
+ font: inherit;
8827
+ line-height: inherit;
8828
+ cursor: pointer;
8829
+ }
8830
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-seg:hover { color: var(--mikedown-text-ui, #3a3a3d); }
8831
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-seg:is([aria-pressed="true"], [aria-checked="true"]) {
8832
+ background: var(--mikedown-surface-raised, #fff);
8833
+ color: var(--mikedown-text-ui, #3a3a3d);
8834
+ box-shadow: 0 0 0 1px var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8835
+ }
8836
+
8837
+ /* Summary kind: TL;DR ⇄ Outline, the dial's pill beside the title. */
8838
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind {
8839
+ display: inline-flex;
8840
+ align-items: center;
8841
+ flex-shrink: 0;
8842
+ padding: 1px;
8843
+ border-radius: 10px;
8844
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
8845
+ color: var(--mikedown-text-muted, #6f6f74);
8846
+ font-size: 11.5px;
8847
+ line-height: 16px;
8848
+ white-space: nowrap;
8849
+ }
8850
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind[hidden] { display: none; }
8851
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind-seg {
8852
+ padding: 0 7px;
8853
+ border: 0;
8854
+ border-radius: 9px;
8855
+ background: none;
8856
+ color: inherit;
8857
+ font: inherit;
8858
+ line-height: inherit;
8859
+ cursor: pointer;
8860
+ }
8861
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind-seg:hover { color: var(--mikedown-text-ui, #3a3a3d); }
8862
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-kind-seg[aria-pressed="true"] {
8863
+ background: var(--mikedown-surface-raised, #fff);
8864
+ color: var(--mikedown-text-ui, #3a3a3d);
8865
+ box-shadow: 0 0 0 1px var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8866
+ }
8867
+
8868
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-icon-btn {
8869
+ display: inline-flex;
8870
+ align-items: center;
8871
+ justify-content: center;
8872
+ width: 24px;
8873
+ height: 24px;
8874
+ flex-shrink: 0;
8875
+ border: 0;
8876
+ border-radius: var(--mikedown-radius-sm, 6px);
8877
+ background: none;
8878
+ color: var(--mikedown-text-muted, #6f6f74);
8879
+ cursor: pointer;
8880
+ }
8881
+ :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); }
8882
+
8883
+ /* Choices (hotkey, Custom prompt…): one row per group, a short label on the
8884
+ * left and a thin rule between rows, then the custom prompt. */
8885
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-choose { display: flex; flex-direction: column; gap: 10px; padding: 12px; overflow: auto; }
8886
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-menu { display: flex; flex-direction: column; }
8887
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group {
8888
+ display: grid;
8889
+ grid-template-columns: 76px 1fr;
8890
+ align-items: start;
8891
+ gap: 8px;
8892
+ padding: 6px 0;
8893
+ }
8894
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group + .ai-rw-group { border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08)); }
8895
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group:first-child { padding-top: 0; }
8896
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-group-label {
8897
+ padding-top: 5px;
8898
+ color: var(--mikedown-text-muted, #6f6f74);
8899
+ font-size: 11px;
8900
+ font-weight: 500;
8901
+ letter-spacing: 0.02em;
8902
+ text-transform: uppercase;
8903
+ }
8904
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-chips { display: flex; flex-wrap: wrap; gap: 6px; }
8905
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-chip {
8906
+ height: 26px;
8907
+ padding: 0 11px;
8908
+ border: 1px solid var(--mikedown-input-border, rgba(15, 15, 20, 0.16));
8909
+ border-radius: 13px;
8910
+ background: none;
8911
+ color: var(--mikedown-text-ui, #3a3a3d);
8912
+ font: inherit;
8913
+ cursor: pointer;
8914
+ }
8915
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-chip:hover { background: var(--mikedown-hover, rgba(55, 53, 47, 0.06)); }
8916
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-form { display: flex; gap: 6px; }
8917
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-input {
8918
+ flex: 1;
8919
+ min-width: 0;
8920
+ height: 30px;
8921
+ padding: 0 10px;
8922
+ border: 1px solid var(--mikedown-input-border, rgba(15, 15, 20, 0.16));
8923
+ border-radius: var(--mikedown-radius-sm, 6px);
8924
+ background: var(--mikedown-input-bg, #fff);
8925
+ color: var(--mikedown-text-ui, #3a3a3d);
8926
+ font: inherit;
8927
+ }
8928
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-input:focus { outline: none; border-color: var(--mikedown-focus-ring, rgba(63, 81, 181, 0.55)); }
8929
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-input::placeholder { color: var(--mikedown-text-muted, #6f6f74); }
8930
+
8931
+ /* Second-level picker (Translate…, Reading level…). */
8932
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker { display: flex; flex-direction: column; gap: 8px; min-height: 0; }
8933
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-head { display: flex; align-items: center; gap: 4px; margin: -4px 0 0 -4px; }
8934
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-title { font-weight: 600; }
8935
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-list {
8936
+ display: flex;
8937
+ flex-direction: column;
8938
+ max-height: 260px;
8939
+ overflow: auto;
8940
+ }
8941
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option {
8942
+ display: flex;
8943
+ align-items: center;
8944
+ gap: 6px;
8945
+ width: 100%;
8946
+ min-height: 28px;
8947
+ padding: 0 10px 0 6px;
8948
+ border: 0;
8949
+ border-radius: var(--mikedown-radius-sm, 6px);
8950
+ background: none;
8951
+ color: var(--mikedown-text-ui, #3a3a3d);
8952
+ font: inherit;
8953
+ text-align: left;
8954
+ cursor: pointer;
8955
+ }
8956
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option:hover { background: var(--mikedown-hover, rgba(55, 53, 47, 0.06)); }
8957
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option-check { display: inline-flex; width: 14px; flex-shrink: 0; color: var(--mikedown-accent, #3f51b5); visibility: hidden; }
8958
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option[aria-checked="true"] .ai-rw-option-check { visibility: visible; }
8959
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option--other .ai-rw-option-label { color: var(--mikedown-text-muted, #6f6f74); }
8960
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-option-sep {
8961
+ flex-shrink: 0;
8962
+ height: 1px;
8963
+ margin: 4px 6px;
8964
+ background: var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8965
+ }
8966
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-picker-foot {
8967
+ padding-top: 8px;
8968
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
8969
+ }
8970
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-toggle { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
8971
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-toggle input { margin: 0; accent-color: var(--mikedown-accent, #3f51b5); }
8972
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-toggle:has(input:disabled) { cursor: default; color: var(--mikedown-text-muted, #6f6f74); }
8973
+
8974
+ /* Preview: one pane, or old and new side by side for a multi-line selection. */
8975
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-body {
8976
+ display: grid;
8977
+ grid-template-columns: 1fr;
8978
+ min-height: 0;
8979
+ flex: 1;
8980
+ }
8981
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="single"] .ai-rw-pane--old { display: none; }
8982
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="split"] .ai-rw-body { grid-template-columns: 1fr 1fr; }
8983
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-pane { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
8984
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-pane--old { border-right: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08)); }
8985
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-label {
8986
+ padding: 8px 14px 0;
8987
+ color: var(--mikedown-text-muted, #6f6f74);
8988
+ font-size: 11px;
8989
+ font-weight: 500;
8990
+ letter-spacing: 0.02em;
8991
+ text-transform: uppercase;
8992
+ }
8993
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="single"] .ai-rw-label { display: none; }
8994
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-text {
8995
+ padding: 8px 14px 12px;
8996
+ max-height: 300px;
8997
+ overflow: auto;
8998
+ color: var(--mikedown-text, #2b2b2b);
8999
+ font-family: var(--mikedown-font-family, var(--mikedown-font-ui, system-ui, sans-serif));
9000
+ font-size: 13.5px;
9001
+ line-height: 1.55;
9002
+ white-space: pre-wrap;
9003
+ overflow-wrap: anywhere;
9004
+ }
9005
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-pane--old .ai-rw-text { color: var(--mikedown-text-muted, #6f6f74); }
9006
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out[data-placeholder]::before {
9007
+ content: attr(data-placeholder);
9008
+ color: var(--mikedown-text-muted, #6f6f74);
9009
+ }
9010
+
9011
+ /* The rendered preview (ai-markdown-preview.ts). Plain prose keeps the raw text's look:
9012
+ paragraphs hold their own newlines and a blank line between them. */
9013
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out { display: block; }
9014
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out > :first-child { margin-top: 0; }
9015
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out > :last-child { margin-bottom: 0; }
9016
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-p,
9017
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h,
9018
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list,
9019
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-quote,
9020
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-pre { margin: 0 0 0.7em; }
9021
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list { padding-left: 1.5em; }
9022
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list .ai-rw-md-list { margin: 0.2em 0 0; }
9023
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-list > li { margin: 0.15em 0; }
9024
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h { font-weight: 600; }
9025
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h[data-level="1"] { font-size: 1.15em; }
9026
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-h[data-level="2"] { font-size: 1.08em; }
9027
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-quote {
9028
+ padding-left: 10px;
9029
+ border-left: 2px solid var(--mikedown-divider, rgba(15, 15, 20, 0.16));
9030
+ color: var(--mikedown-text-muted, #6f6f74);
9031
+ }
9032
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-md-pre {
9033
+ padding: 6px 8px;
9034
+ border-radius: 6px;
9035
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
9036
+ overflow: auto;
9037
+ }
9038
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out code {
9039
+ font-family: var(--mikedown-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
9040
+ font-size: 0.92em;
9041
+ }
9042
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-out :not(pre) > code {
9043
+ padding: 0 4px;
9044
+ border-radius: 4px;
9045
+ background: var(--mikedown-hover, rgba(55, 53, 47, 0.06));
9046
+ }
9047
+ :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; }
9048
+ :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)); }
9049
+ /* A grid item drops its trailing space; keep the "·" separator's. */
9050
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-badge-engine { white-space: pre; }
9051
+
9052
+ /* A calm caret: a slow fade, not a hard blink, only while streaming. */
9053
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-caret {
9054
+ display: none;
9055
+ width: 2px;
9056
+ height: 1.05em;
9057
+ margin-left: 1px;
9058
+ border-radius: 1px;
9059
+ vertical-align: -0.15em;
9060
+ background: var(--mikedown-accent, #3f51b5);
9061
+ }
9062
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-phase="running"] .ai-rw-caret {
9063
+ display: inline-block;
9064
+ animation: mikedown-ai-caret 1.2s ease-in-out infinite;
9065
+ }
9066
+ @keyframes mikedown-ai-caret {
9067
+ 0%, 100% { opacity: 0.85; }
9068
+ 50% { opacity: 0.2; }
9069
+ }
9070
+ @media (prefers-reduced-motion: reduce) {
9071
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-phase="running"] .ai-rw-caret { animation: none; opacity: 0.6; }
9072
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite { animation: none; }
9073
+ }
9074
+
9075
+ /* Errors. */
9076
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error { display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; padding: 12px 14px; }
9077
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-icon { display: inline-flex; padding-top: 1px; color: var(--mikedown-warning, #b26a00); }
9078
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-title { font-weight: 600; color: var(--mikedown-text-ui, #3a3a3d); }
9079
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-message { color: var(--mikedown-text-ui, #3a3a3d); }
9080
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-detail { margin-top: 2px; color: var(--mikedown-text-muted, #6f6f74); font-size: 12px; overflow-wrap: anywhere; }
9081
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-more { margin-top: 4px; }
9082
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-more > summary { color: var(--mikedown-text-muted, #6f6f74); font-size: 12px; cursor: pointer; }
9083
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-error-actions { grid-column: 2; display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
9084
+
9085
+ /* Structure check: a quiet warning line above the footer; Accept stays on. */
9086
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-warn {
9087
+ display: flex;
9088
+ align-items: flex-start;
9089
+ gap: 6px;
9090
+ padding: 6px 14px;
9091
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
9092
+ color: var(--mikedown-warning, #b26a00);
9093
+ font-size: 12px;
9094
+ }
9095
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-warn-icon { display: inline-flex; padding-top: 2px; flex-shrink: 0; }
9096
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-warn-text { overflow-wrap: anywhere; }
9097
+
9098
+ /* Title candidates (choose mode) and the effect hint under them. */
9099
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-titles-box { display: flex; flex-direction: column; gap: 6px; padding: 8px 8px 10px; }
9100
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-titles { display: flex; flex-direction: column; }
9101
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-title-option { min-height: 32px; padding: 4px 10px; }
9102
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-title-option .ai-rw-option-label { overflow-wrap: anywhere; }
9103
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-titles-hint { padding: 0 10px; color: var(--mikedown-text-muted, #6f6f74); font-size: 12px; }
9104
+
9105
+ /* Coverage: the document was cut to fit the model's context. */
9106
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-coverage {
9107
+ padding: 6px 14px;
9108
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
9109
+ color: var(--mikedown-text-muted, #6f6f74);
9110
+ font-size: 12px;
9111
+ }
9112
+
9113
+ /* Footer: the actions, then the engine badge on the right. A badge that
9114
+ does not fit beside them wraps to its own line before it ellipsizes. */
9115
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-foot {
9116
+ display: flex;
9117
+ flex-wrap: wrap;
9118
+ align-items: center;
9119
+ gap: 6px;
9120
+ padding: 8px 10px;
9121
+ border-top: 1px solid var(--mikedown-divider, rgba(15, 15, 20, 0.08));
9122
+ }
9123
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-note { color: var(--mikedown-warning, #b26a00); font-size: 12px; }
9124
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-stats {
9125
+ margin-left: auto;
9126
+ color: var(--mikedown-text-muted, #6f6f74);
9127
+ font-size: 11.5px;
9128
+ font-variant-numeric: tabular-nums;
9129
+ white-space: nowrap;
9130
+ cursor: default;
9131
+ }
9132
+ /* The stats take the push to the right; the badge sits beside them. */
9133
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-stats:not([hidden]) + .ai-rw-badge { margin-left: 0; }
9134
+
9135
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn {
9136
+ height: 26px;
9137
+ padding: 0 11px;
9138
+ border: 1px solid var(--mikedown-button-border, transparent);
9139
+ border-radius: var(--mikedown-radius-sm, 6px);
9140
+ background: var(--mikedown-button-bg, #f1f1ef);
9141
+ color: var(--mikedown-button-text, #2b2b2b);
9142
+ font: inherit;
9143
+ font-size: 12.5px;
9144
+ cursor: pointer;
9145
+ white-space: nowrap;
9146
+ }
9147
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn:hover { background: var(--mikedown-button-hover, #e7e7e4); }
9148
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn--primary {
9149
+ background: var(--mikedown-accent, #3f51b5);
9150
+ color: var(--mikedown-accent-text, #fff);
9151
+ }
9152
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn--primary:hover { background: var(--mikedown-accent-hover, #3546a0); }
9153
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn[aria-disabled="true"] { opacity: 0.5; cursor: default; }
9154
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn[aria-disabled="true"]:hover { background: var(--mikedown-button-bg, #f1f1ef); }
9155
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-btn--primary[aria-disabled="true"]:hover { background: var(--mikedown-accent, #3f51b5); }
9156
+ /* Explain (read-only): the note previews as the quote Insert below adds. */
9157
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="readOnly"] .ai-rw-pane--new .ai-rw-text {
9158
+ margin: 10px 14px 12px;
9159
+ padding: 0 0 0 12px;
9160
+ border-left: 3px solid var(--mikedown-quote-border, rgba(150, 150, 150, 0.5));
9161
+ }
9162
+ /* Summary (insert): the preview reads like the block it inserts. */
9163
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="insert"] .ai-rw-text { max-height: 360px; }
9164
+ /* Whole-document translate: more room for the new text (there is no old pane). */
9165
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="replaceDocument"] { max-height: min(80vh, 640px); }
9166
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-output="replaceDocument"] .ai-rw-text { max-height: 420px; }
9167
+
9168
+ :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 {
9169
+ outline: 2px solid var(--mikedown-focus-ring, rgba(63, 81, 181, 0.55));
9170
+ outline-offset: 1px;
9171
+ }
9172
+
9173
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-sr {
9174
+ position: absolute;
9175
+ width: 1px;
9176
+ height: 1px;
9177
+ overflow: hidden;
9178
+ clip: rect(0 0 0 0);
9179
+ white-space: nowrap;
9180
+ }
9181
+
9182
+ @media (max-width: 520px) {
9183
+ :is(.mikedown-root, .mikedown-portal) .mikedown-ai-rewrite[data-layout="split"] .ai-rw-body { grid-template-columns: 1fr; }
9184
+ :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)); }
9185
+ :is(.mikedown-root, .mikedown-portal) .ai-rw-think-label { display: none; }
9186
+ }