@materialwebunofficial/antigravity-themes 1.0.4 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/themes/matte.css CHANGED
@@ -28,101 +28,7 @@
28
28
  ========================================================================== */
29
29
 
30
30
 
31
- /* 00 — Tokens -------------------------------------------------------------- */
32
- :root[data-agy-theme="matte"] {
33
- /* Surfaces, back to front (neutral, no blue cast) */
34
- --m-window: #0e0e10; /* window frame, title bar, sidebar */
35
- --m-panel: #151517; /* the conversation panel */
36
- --m-raised: #1c1c1f; /* composer, user message, cards, menus */
37
- --m-high: #26262a; /* highlight inside raised things, tooltips */
38
- --m-inset: #111113; /* code */
39
-
40
- /* Hairlines and states (alpha white, reads the same on every surface) */
41
- --m-line: rgb(255 255 255 / 0.075);
42
- --m-line-2: rgb(255 255 255 / 0.11);
43
- --m-line-3: rgb(255 255 255 / 0.18);
44
- --m-hover: rgb(255 255 255 / 0.045);
45
- --m-select: rgb(255 255 255 / 0.08);
46
-
47
- /* Text — contrast on --m-panel */
48
- --m-text-max: #f2f2f3;
49
- --m-text: #dcdcde; /* 13.4:1 */
50
- --m-text-2: #a3a3a8; /* 7.0:1 */
51
- --m-text-3: #86868c; /* 4.9:1 */
52
-
53
- /* The one bright thing */
54
- --m-primary: #ededee;
55
- --m-primary-ink: #111113;
56
- --m-strong: #ffffff; /* one step past --m-primary (button hover) */
57
-
58
- /* Status, the Context card's segments, and the remaining literals */
59
- --m-success: #6fbf8b;
60
- --m-warning: #d9a35b;
61
- --m-error: #e06c6c;
62
- --m-blue: #7aa2f7;
63
- --m-amber: #e5a84b;
64
- --m-teal: #73daca;
65
- --m-selection: rgb(255 255 255 / 0.16);
66
- --m-lineno: #5c5c60;
67
- --m-scroll: rgb(255 255 255 / 0.10);
68
- --m-scroll-2: rgb(255 255 255 / 0.18);
69
- --m-scroll-3: rgb(255 255 255 / 0.24);
70
- --m-find: rgb(217 163 91 / 0.24);
71
- --m-find-current: rgb(217 163 91 / 0.55);
72
- --m-find-border: rgb(217 163 91 / 0.85);
73
- --m-shadow: rgb(0 0 0 / 0.7);
74
- --m-shadow-menu: rgb(0 0 0 / 0.75);
75
-
76
- --m-font-ui: "Segoe UI Variable Text", "Segoe UI", system-ui, sans-serif;
77
- --m-font-display: "Segoe UI Variable Display", "Segoe UI Variable Text", "Segoe UI", system-ui, sans-serif;
78
- --m-font-mono: "Cascadia Mono", "Cascadia Code", Consolas, monospace;
79
- }
80
-
81
- /* Light mode: the app's own setting (System / Light / Dark, marked on
82
- <body>), mirrored by theme-host.js as data-agy-mode. Same structure,
83
- inverted: a light gray window holds a near-white panel, raised things are
84
- white and carry the hairline, lines and states are alpha black, and the
85
- one strong thing is the near-black send button. Every rule reads these
86
- tokens, so nothing else changes. Contrast on --m-panel. */
87
- :root[data-agy-theme="matte"][data-agy-mode="light"] {
88
- --m-window: #ebebed;
89
- --m-panel: #f8f8f9;
90
- --m-raised: #ffffff;
91
- --m-high: #e7e7ea;
92
- --m-inset: #f1f1f3;
93
-
94
- --m-line: rgb(0 0 0 / 0.08);
95
- --m-line-2: rgb(0 0 0 / 0.12);
96
- --m-line-3: rgb(0 0 0 / 0.22);
97
- --m-hover: rgb(0 0 0 / 0.04);
98
- --m-select: rgb(0 0 0 / 0.07);
99
-
100
- --m-text-max: #0b0b0d;
101
- --m-text: #1d1d20; /* 15.8:1 */
102
- --m-text-2: #4b4b51; /* 8.2:1 */
103
- --m-text-3: #626268; /* 5.7:1, 5.1:1 on the window */
104
-
105
- --m-primary: #18181b;
106
- --m-primary-ink: #f6f6f7;
107
- --m-strong: #000000;
108
-
109
- --m-success: #277045;
110
- --m-warning: #94560a;
111
- --m-error: #b3373a;
112
- --m-blue: #3a63c4;
113
- --m-amber: #a86a12;
114
- --m-teal: #1f7f71;
115
- --m-selection: rgb(0 0 0 / 0.12);
116
- --m-lineno: #8e8e94;
117
- --m-scroll: rgb(0 0 0 / 0.14);
118
- --m-scroll-2: rgb(0 0 0 / 0.24);
119
- --m-scroll-3: rgb(0 0 0 / 0.32);
120
- --m-find: rgb(168 106 18 / 0.18);
121
- --m-find-current: rgb(168 106 18 / 0.40);
122
- --m-find-border: rgb(168 106 18 / 0.8);
123
- --m-shadow: rgb(0 0 0 / 0.16);
124
- --m-shadow-menu: rgb(0 0 0 / 0.18);
125
- }
31
+ /* 00 — Tokens: matte-tokens.css (loaded before this file) ------------------- */
126
32
 
127
33
 
128
34
  /* 01 — Bridge: app tokens (inline on <html>, hence !important) ------------ */
@@ -281,33 +187,50 @@
281
187
 
282
188
 
283
189
  /* 10 — Frame: one rounded panel in a darker window ------------------------- */
284
- /* The content pane (Tailwind class group/pane, one per pane) becomes the
285
- panel. Re-pointing --background (and Tailwind's resolved
286
- --color-background) here makes every bg-background / var(--background)
287
- layer inside the panel match it: the pinned user-message band, the fade
288
- above the composer, sticky headers. */
289
- :root[data-agy-theme="matte"] .group\/pane,
290
- :root[data-agy-theme="matte"] .agy-sheet:not(:has(.group\/pane)) .browser-hole-opaque {
190
+ /* Since the November update the app lays the panel out itself (.agy-sheet,
191
+ with --card-gap, --card-radius, --card-edge and --shell-canvas), so the
192
+ theme only sets those variables: the app's margins, its sidebar-closed gap
193
+ and its split panes keep working.
194
+ No outline (--card-edge is the hairline the app draws around the panel):
195
+ flush against the sidebar a 1px ring read as the very divider the user
196
+ asked to remove (live v4.0). Tone alone (#151517 on #0e0e10) marks the
197
+ panel; the gap lets its corners read as a card. */
198
+ :root[data-agy-theme="matte"] .agy-inset-shell {
199
+ --shell-canvas: var(--m-window);
200
+ --card-gap: 8px;
201
+ --card-radius: 14px;
202
+ --card-edge: transparent;
203
+ --sash-line: var(--m-line-3);
204
+ --sash-glow: transparent;
205
+ }
206
+ /* Re-pointing --background (and Tailwind's resolved --color-background) in
207
+ the panel makes every bg-background / var(--background) layer inside it
208
+ match: the pinned user-message band, the fade above the composer, sticky
209
+ headers. */
210
+ :root[data-agy-theme="matte"] .agy-sheet [data-main-content-body],
211
+ :root[data-agy-theme="matte"] .agy-inset-shell [data-side-panel-body],
212
+ :root[data-agy-theme="matte"] [data-testid="sidecar-iframe-slot"] { /* a sidecar's frame is mounted over its pane, not in it */
291
213
  --background: var(--m-panel);
292
214
  --color-background: var(--m-panel);
293
- width: auto;
294
- height: calc(100% - 8px);
295
- /* No outline: flush against the sidebar its 1px ring read as the very
296
- divider the user asked to remove (live v4.0). Tone alone (#151517 on
297
- #0e0e10) marks the panel; a 6px gap lets its corners read as a card. */
298
- margin: 0 8px 8px 6px;
299
- border-radius: 14px;
300
- background: var(--m-panel);
301
- overflow: hidden;
302
215
  }
303
216
  :root[data-agy-theme="matte"] .agy-sheet {
304
217
  background-image: none !important;
305
218
  }
306
219
 
307
- /* Full-height 1px divider between sidebar and panel (holds the resize sash,
308
- so it keeps its box; only the line goes). Tailwind class hook. */
309
- :root[data-agy-theme="matte"] .bg-border.flex-shrink-0.z-30.h-full {
310
- background: var(--m-window);
220
+ /* The right-hand pane (terminal, task output, files, Swarm): its tab strip
221
+ stays on the window like the conversation's title row, and the content
222
+ below it is a second rounded panel, a gap apart (the app joins the two
223
+ along a hairline). */
224
+ :root[data-agy-theme="matte"] [data-active-tab-id] {
225
+ border-bottom-color: transparent;
226
+ }
227
+ :root[data-agy-theme="matte"] .agy-sheet[data-side-panel-docked] [data-main-content-body] {
228
+ --card-gap-right: calc(var(--card-gap) / 2);
229
+ border-radius: var(--card-radius);
230
+ }
231
+ :root[data-agy-theme="matte"] .agy-sheet[data-side-panel-docked] [data-side-panel-body] {
232
+ --card-gap-left: calc(var(--card-gap) / 2);
233
+ border-radius: var(--card-radius);
311
234
  }
312
235
 
313
236
  /* Inactive webview occlusion guard: prevent GPU compositor bleeding */
@@ -318,21 +241,6 @@ webview[style*="opacity: 0.005"] {
318
241
  pointer-events: none !important;
319
242
  }
320
243
 
321
- /* The right-hand pane (terminal, task output, files): its tab strip stays
322
- on the window like the conversation's title row, and the content below
323
- it becomes the same rounded panel. Markup (2.26):
324
- flex-col > [data-active-tab-id] (tab strip, border-b) + .flex-grow */
325
- :root[data-agy-theme="matte"] [data-active-tab-id] {
326
- border-bottom-color: transparent;
327
- }
328
- :root[data-agy-theme="matte"] [data-active-tab-id] + .flex-grow {
329
- --background: var(--m-panel);
330
- --color-background: var(--m-panel);
331
- margin: 0 8px 8px 0;
332
- border-radius: 14px;
333
- background: var(--m-panel);
334
- }
335
-
336
244
 
337
245
  /* 20 — Sidebar ------------------------------------------------------------- */
338
246
  /* Row hover is the app's own hover:bg-sidebar-muted: it also sets --row-bg,
@@ -366,8 +274,10 @@ webview[style*="opacity: 0.005"] {
366
274
  :root[data-agy-theme="matte"] [role="article"] a:hover {
367
275
  text-decoration-color: var(--m-text-2);
368
276
  }
369
- /* Fenced code: the card inside <pre> (bg-muted) sits darker than the panel */
370
- :root[data-agy-theme="matte"] [role="article"] pre > div {
277
+ /* Fenced code: the block (bg-muted, the one code-tools.js marks .agy-code;
278
+ a pre > div before 2.31) sits darker than the panel, its hairline kept */
279
+ :root[data-agy-theme="matte"] [role="article"] pre > div,
280
+ :root[data-agy-theme="matte"] .agy-code {
371
281
  border-radius: 12px;
372
282
  background: var(--m-inset);
373
283
  --agy-lineno: var(--m-lineno); /* code-tools.js line numbers */
@@ -456,6 +366,425 @@ webview[style*="opacity: 0.005"] {
456
366
  backdrop-filter: none;
457
367
  }
458
368
 
369
+ /* 60 — Dialogs & Settings: an inspector ------------------------------------ */
370
+ /* Not cards: Settings reads like a matte inspector. A darker index column,
371
+ then plain rows on the panel, ruled by hairlines, under small uppercase
372
+ group labels; compact 28px controls in raised gray with a hairline; the
373
+ switch is the one thing that turns bright. Selectors go through
374
+ .agy-dialog to outrank the app's glass rules (body[data-newux-theme]). */
375
+ :root[data-agy-theme="matte"] .agy-dialog {
376
+ border: 1px solid var(--m-line-2) !important;
377
+ border-radius: 14px !important;
378
+ background: var(--m-panel);
379
+ box-shadow: 0 24px 64px -16px var(--m-shadow) !important;
380
+ color: var(--m-text);
381
+ }
382
+ :root[data-agy-theme="matte"] .settings-modal-backdrop {
383
+ background: rgb(0 0 0 / 0.55);
384
+ }
385
+ :root[data-agy-theme="matte"] .agy-dialog > button[aria-label="Close"] {
386
+ border-radius: 6px !important;
387
+ color: var(--m-text-3);
388
+ }
389
+ :root[data-agy-theme="matte"] .agy-dialog > button[aria-label="Close"]:hover {
390
+ background: var(--m-hover);
391
+ color: var(--m-text);
392
+ }
393
+ :root[data-agy-theme="matte"] .settings-modal-container .bg-background {
394
+ background: transparent;
395
+ }
396
+
397
+ /* index column */
398
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] {
399
+ border-right: 1px solid var(--m-line);
400
+ background: var(--m-window);
401
+ font-family: var(--m-font-ui);
402
+ }
403
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] > div:first-child {
404
+ gap: 1px;
405
+ padding: 16px 0 12px;
406
+ }
407
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] .px-4 {
408
+ padding: 0 18px;
409
+ }
410
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] .px-4.mt-2 {
411
+ margin-top: 16px;
412
+ }
413
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] :is(h1, h2) {
414
+ margin-bottom: 6px;
415
+ font-size: 10.5px;
416
+ font-weight: 600;
417
+ letter-spacing: 0.09em;
418
+ text-transform: uppercase;
419
+ color: var(--m-text-3);
420
+ }
421
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] .mx-2 {
422
+ margin: 0 10px;
423
+ }
424
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"] {
425
+ min-height: 30px;
426
+ padding: 0 8px;
427
+ border-radius: 6px;
428
+ color: var(--m-text-2);
429
+ font-size: 13px;
430
+ }
431
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"] span {
432
+ color: inherit;
433
+ }
434
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"]:hover {
435
+ background: var(--m-hover);
436
+ color: var(--m-text);
437
+ }
438
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"].bg-sidebar-secondary {
439
+ background: var(--m-select);
440
+ box-shadow: inset 2px 0 0 var(--m-primary);
441
+ color: var(--m-text-max);
442
+ font-weight: 500;
443
+ }
444
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] button.mx-4 {
445
+ margin: 2px 18px 0;
446
+ color: var(--m-text-3);
447
+ font-size: 12px;
448
+ text-decoration: none;
449
+ }
450
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] button.mx-4:hover {
451
+ color: var(--m-text);
452
+ }
453
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] > .border-t {
454
+ border-color: var(--m-line);
455
+ }
456
+ :root[data-agy-theme="matte"] [data-testid="settings-sidebar"] > .border-t > button > div:first-child {
457
+ background: var(--m-high);
458
+ color: var(--m-text);
459
+ }
460
+
461
+ /* page: a display-face title over a hairline, uppercase group labels */
462
+ :root[data-agy-theme="matte"] .settings-modal-container .p-6.max-w-2xl {
463
+ gap: 20px;
464
+ padding: 30px 36px 40px;
465
+ }
466
+ :root[data-agy-theme="matte"] .settings-modal-container .p-6.max-w-2xl > div:first-child {
467
+ margin-bottom: 4px;
468
+ padding-bottom: 18px;
469
+ border-bottom: 1px solid var(--m-line);
470
+ }
471
+ :root[data-agy-theme="matte"] .settings-modal-container h2.text-2xl {
472
+ font-family: var(--m-font-display);
473
+ font-size: 22px;
474
+ font-weight: 600;
475
+ letter-spacing: -0.01em;
476
+ color: var(--m-text-max);
477
+ }
478
+ :root[data-agy-theme="matte"] .settings-modal-container h2.text-2xl + div {
479
+ font-size: 13px;
480
+ color: var(--m-text-3);
481
+ }
482
+ :root[data-agy-theme="matte"] .settings-modal-container h3 {
483
+ font-size: 10.5px;
484
+ font-weight: 600;
485
+ letter-spacing: 0.09em;
486
+ text-transform: uppercase;
487
+ color: var(--m-text-3);
488
+ }
489
+ :root[data-agy-theme="matte"] .settings-modal-container .leading-relaxed {
490
+ font-size: 12px;
491
+ color: var(--m-text-3);
492
+ }
493
+
494
+ /* rows: no box, hairlines between and around */
495
+ :root[data-agy-theme="matte"] .agy-dialog .agy-card {
496
+ border: 0;
497
+ border-block: 1px solid var(--m-line);
498
+ border-radius: 0;
499
+ background: transparent;
500
+ --color-border: var(--m-line);
501
+ }
502
+ :root[data-agy-theme="matte"] .agy-dialog .agy-card .py-2.px-3 {
503
+ min-height: 52px;
504
+ padding: 11px 2px;
505
+ font-size: 13px;
506
+ font-weight: 500;
507
+ color: var(--m-text);
508
+ }
509
+ :root[data-agy-theme="matte"] .agy-dialog .agy-card .text-sm {
510
+ font-size: 12px;
511
+ font-weight: 400;
512
+ color: var(--m-text-3);
513
+ }
514
+ :root[data-agy-theme="matte"] .agy-dialog .agy-card > button:hover {
515
+ background: var(--m-hover);
516
+ }
517
+ :root[data-agy-theme="matte"] .agy-dialog [data-testid="settings-row-badge"] {
518
+ padding: 1px 5px;
519
+ border: 0;
520
+ border-radius: 4px;
521
+ background: var(--m-high);
522
+ color: var(--m-text-2);
523
+ font-family: var(--m-font-mono);
524
+ font-size: 10.5px;
525
+ font-weight: 500;
526
+ }
527
+ :root[data-agy-theme="matte"] .agy-dialog code {
528
+ border-color: var(--m-line);
529
+ border-radius: 4px;
530
+ background: var(--m-inset);
531
+ font-family: var(--m-font-mono);
532
+ }
533
+
534
+ /* controls: 28px, raised gray with a hairline, 6px corners */
535
+ :root[data-agy-theme="matte"] .agy-dialog :is(.agy-button-sm, .agy-button-md).bg-secondary,
536
+ :root[data-agy-theme="matte"] .agy-dialog .agy-select-trigger {
537
+ height: 28px;
538
+ padding: 0 10px;
539
+ border: 1px solid var(--m-line-2) !important;
540
+ border-radius: 6px !important;
541
+ background: var(--m-raised);
542
+ color: var(--m-text);
543
+ font-size: 12.5px;
544
+ font-weight: 500;
545
+ transition: background-color 80ms linear, border-color 80ms linear;
546
+ }
547
+ :root[data-agy-theme="matte"] .agy-dialog :is(.agy-button-sm, .agy-button-md).bg-secondary:hover,
548
+ :root[data-agy-theme="matte"] .agy-dialog .agy-select-trigger:hover {
549
+ border-color: var(--m-line-3) !important;
550
+ background: var(--m-high);
551
+ color: var(--m-text-max);
552
+ }
553
+ :root[data-agy-theme="matte"] .agy-dialog .agy-select-trigger[aria-expanded="true"] {
554
+ border-color: var(--m-line-3) !important;
555
+ background: var(--m-high);
556
+ }
557
+ :root[data-agy-theme="matte"] .agy-dialog .agy-select-trigger svg {
558
+ opacity: 0.6;
559
+ }
560
+ :root[data-agy-theme="matte"] .agy-dialog :is(a, button:not([role])).bg-primary {
561
+ padding: 4px 12px;
562
+ border-radius: 6px !important;
563
+ background: var(--m-primary);
564
+ color: var(--m-primary-ink);
565
+ font-size: 12.5px;
566
+ }
567
+ :root[data-agy-theme="matte"] .agy-dialog :is(a, button:not([role])).bg-primary:hover {
568
+ background: var(--m-strong);
569
+ }
570
+ :root[data-agy-theme="matte"] .agy-dialog [data-testid="delete-project-button"] {
571
+ border: 1px solid color-mix(in srgb, var(--m-error) 55%, transparent);
572
+ border-radius: 6px !important;
573
+ background: transparent;
574
+ color: var(--m-error);
575
+ }
576
+ :root[data-agy-theme="matte"] .agy-dialog [data-testid="delete-project-button"]:hover {
577
+ background: color-mix(in srgb, var(--m-error) 12%, transparent);
578
+ }
579
+ :root[data-agy-theme="matte"] .agy-dialog :is(.agy-button-sm.text-link, button.self-start.rounded-md) {
580
+ color: var(--m-text-2);
581
+ }
582
+ :root[data-agy-theme="matte"] .agy-dialog :is(.agy-button-sm.text-link, button.self-start.rounded-md):hover {
583
+ background: transparent;
584
+ color: var(--m-text-max);
585
+ text-decoration: underline;
586
+ text-underline-offset: 3px;
587
+ }
588
+ :root[data-agy-theme="matte"] .agy-dialog :is(.agy-button-icon-sm, .agy-button-icon):not(.bg-secondary) {
589
+ border-radius: 5px !important;
590
+ color: var(--m-text-3);
591
+ }
592
+ :root[data-agy-theme="matte"] .agy-dialog :is(.agy-button-icon-sm, .agy-button-icon):not(.bg-secondary):hover {
593
+ background: var(--m-hover);
594
+ color: var(--m-text);
595
+ }
596
+ /* key caps: mono, a hairline, a heavier bottom edge */
597
+ :root[data-agy-theme="matte"] .agy-dialog .agy-button-xs.border {
598
+ height: 24px;
599
+ padding: 0 7px;
600
+ border: 1px solid var(--m-line-2);
601
+ border-bottom-width: 2px;
602
+ border-radius: 5px !important;
603
+ background: var(--m-raised);
604
+ color: var(--m-text);
605
+ font-family: var(--m-font-mono);
606
+ font-size: 11.5px;
607
+ }
608
+ :root[data-agy-theme="matte"] .agy-dialog .agy-button-xs.border:hover {
609
+ border-color: var(--m-line-3);
610
+ }
611
+
612
+ /* segmented control: an inset well, the chosen segment raised */
613
+ :root[data-agy-theme="matte"] .agy-dialog [data-slot="toggle-group"] {
614
+ height: 30px;
615
+ padding: 2px;
616
+ gap: 2px;
617
+ border: 1px solid var(--m-line) !important;
618
+ border-radius: 8px;
619
+ background: var(--m-inset) !important;
620
+ box-shadow: none !important;
621
+ }
622
+ :root[data-agy-theme="matte"] .agy-dialog [data-slot="toggle-group"] > button {
623
+ padding: 0 10px;
624
+ border-radius: 6px;
625
+ color: var(--m-text-3) !important;
626
+ font-size: 12.5px;
627
+ box-shadow: none !important;
628
+ }
629
+ :root[data-agy-theme="matte"] .agy-dialog [data-slot="toggle-group"] > button:hover {
630
+ color: var(--m-text) !important;
631
+ }
632
+ :root[data-agy-theme="matte"] .agy-dialog [data-slot="toggle-group"] > button[data-pressed] {
633
+ background: var(--m-high) !important;
634
+ color: var(--m-text-max) !important;
635
+ box-shadow: inset 0 0 0 1px var(--m-line-2) !important;
636
+ }
637
+
638
+ /* switch: 30 x 18, gray off, the bright primary on */
639
+ :root[data-agy-theme="matte"] [role="switch"].rounded-full {
640
+ width: 30px;
641
+ height: 18px;
642
+ padding: 0;
643
+ border: 0;
644
+ background: var(--m-high) !important;
645
+ box-shadow: inset 0 0 0 1px var(--m-line-2);
646
+ }
647
+ :root[data-agy-theme="matte"] [role="switch"].rounded-full:is([aria-checked="true"], [data-checked]) {
648
+ background: var(--m-primary) !important;
649
+ box-shadow: none;
650
+ }
651
+ :root[data-agy-theme="matte"] [role="switch"].rounded-full > span {
652
+ width: 14px;
653
+ height: 14px;
654
+ background: var(--m-text-3);
655
+ box-shadow: none !important;
656
+ transform: translateX(2px) !important;
657
+ transition: transform 120ms ease-out, background-color 80ms linear;
658
+ }
659
+ :root[data-agy-theme="matte"] [role="switch"].rounded-full:is([aria-checked="true"], [data-checked]) > span {
660
+ background: var(--m-primary-ink);
661
+ transform: translateX(14px) !important;
662
+ }
663
+
664
+ /* slider: a 2px line, a small round knob */
665
+ :root[data-agy-theme="matte"] .agy-dialog input[type="range"] {
666
+ --primary: var(--m-primary);
667
+ --secondary: var(--m-line-2);
668
+ height: 2px;
669
+ }
670
+ :root[data-agy-theme="matte"] .agy-dialog input[type="range"]::-webkit-slider-thumb {
671
+ width: 12px;
672
+ height: 12px;
673
+ background: var(--m-primary);
674
+ }
675
+
676
+ /* option cards */
677
+ :root[data-agy-theme="matte"] .agy-dialog [role="radio"].rounded-xl {
678
+ border: 1px solid var(--m-line-2);
679
+ border-radius: 10px;
680
+ background: transparent;
681
+ box-shadow: none;
682
+ color: var(--m-text);
683
+ }
684
+ :root[data-agy-theme="matte"] .agy-dialog [role="radio"].rounded-xl:hover {
685
+ background: var(--m-hover);
686
+ }
687
+ :root[data-agy-theme="matte"] .agy-dialog [role="radio"].rounded-xl:is([data-checked], [aria-checked="true"]) {
688
+ border-color: var(--m-text-3);
689
+ background: var(--m-raised);
690
+ color: var(--m-text-max);
691
+ }
692
+
693
+ /* text fields: inset, a hairline that brightens on focus (the app's
694
+ layered !important utilities are steered through their variables) */
695
+ :root[data-agy-theme="matte"] .agy-dialog :is(input.agy-field, input.bg-muted, .h-8.rounded-lg.bg-muted.border) {
696
+ --color-muted: var(--m-inset);
697
+ --color-border: var(--m-line-2);
698
+ border-color: var(--color-border);
699
+ border-radius: 6px !important;
700
+ background: var(--m-inset);
701
+ color: var(--m-text);
702
+ font-size: 13px !important;
703
+ }
704
+ :root[data-agy-theme="matte"] .agy-dialog :is(input.agy-field:focus, input.bg-muted:focus, .h-8.rounded-lg.bg-muted.border:focus-within) {
705
+ --color-border: var(--m-line-3);
706
+ outline: none;
707
+ }
708
+
709
+ /* usage rings and token bars: monochrome, status color only when low */
710
+ :root[data-agy-theme="matte"] circle:has(+ [data-testid="quota-progress-circle"]) {
711
+ stroke: var(--m-high);
712
+ stroke-opacity: 1;
713
+ }
714
+ :root[data-agy-theme="matte"] .rounded-full:has(> svg [data-testid="quota-progress-circle"]) {
715
+ background: transparent;
716
+ }
717
+ :root[data-agy-theme="matte"] [data-testid="quota-progress-circle"] {
718
+ stroke: var(--m-text);
719
+ }
720
+ :root[data-agy-theme="matte"] [data-testid="quota-progress-circle"]:is(.stroke-yellow-500, .stroke-amber-500, .stroke-orange-500) {
721
+ stroke: var(--m-warning);
722
+ }
723
+ :root[data-agy-theme="matte"] [data-testid="quota-progress-circle"]:is(.stroke-red-500, .stroke-destructive) {
724
+ stroke: var(--m-error);
725
+ }
726
+ :root[data-agy-theme="matte"] .agy-dialog {
727
+ --chart-blue: var(--m-blue);
728
+ --chart-green: var(--m-success);
729
+ --chart-purple: var(--m-text-2);
730
+ --chart-yellow: var(--m-amber);
731
+ --chart-orange: var(--m-warning);
732
+ --chart-red: var(--m-error);
733
+ }
734
+ :root[data-agy-theme="matte"] .agy-dialog .h-2.rounded-full.bg-muted {
735
+ height: 4px;
736
+ background: var(--m-high);
737
+ }
738
+ :root[data-agy-theme="matte"] [data-testid="workspace-customizations-view"] .border.border-border.rounded-xl {
739
+ border-color: var(--m-line);
740
+ border-radius: 8px;
741
+ --color-border: var(--m-line);
742
+ }
743
+ :root[data-agy-theme="matte"] .agy-dialog span.rounded:is(.bg-blue-500\/10, .bg-purple-500\/10, .bg-green-500\/10, .bg-orange-500\/10) {
744
+ border-radius: 4px;
745
+ background: var(--m-high);
746
+ color: var(--m-text-2);
747
+ }
748
+
749
+ /* "Restart to Update": quiet, like every other control (raised gray, a
750
+ hairline, 6px); the app's pulses are stilled */
751
+ :root[data-agy-theme="matte"] [data-testid="app-update-button"] {
752
+ animation: none !important;
753
+ }
754
+ :root[data-agy-theme="matte"] [data-testid="app-update-button"]:not(.w-6) {
755
+ width: auto;
756
+ height: 24px;
757
+ padding: 0 10px;
758
+ border-radius: 6px;
759
+ background: var(--m-raised);
760
+ box-shadow: inset 0 0 0 1px var(--m-line-2);
761
+ color: var(--m-text-max);
762
+ font-size: 11.5px;
763
+ font-weight: 500;
764
+ }
765
+ :root[data-agy-theme="matte"] [data-testid="app-update-button"]:not(.w-6):hover {
766
+ background: var(--m-high);
767
+ box-shadow: inset 0 0 0 1px var(--m-line-3);
768
+ }
769
+ :root[data-agy-theme="matte"] [data-testid="app-update-button"].w-6 {
770
+ color: var(--m-text-max);
771
+ }
772
+
773
+ /* Chips in a sent message (quotes, files, terminals): they take the bubble's
774
+ own ink, not the app's text colors, which are meant for the panel; a 12%
775
+ tint of that ink marks them, the icon and supporting parts at 80% */
776
+ :root[data-agy-theme="matte"] .agy-user-bubble .inline-pill {
777
+ color: inherit;
778
+ background: color-mix(in srgb, currentColor 12%, transparent);
779
+ border-radius: 5px;
780
+ }
781
+ :root[data-agy-theme="matte"] .agy-user-bubble .inline-pill :is(.text-foreground, .text-secondary-foreground) {
782
+ color: inherit;
783
+ }
784
+ :root[data-agy-theme="matte"] .agy-user-bubble .inline-pill .text-muted-foreground {
785
+ color: color-mix(in srgb, currentColor 80%, transparent);
786
+ }
787
+
459
788
  /* 80 — Voice Mode & Gemini Live Harmonization */
460
789
  :root[data-agy-theme="matte"] [data-testid="voice-live-pill"] {
461
790
  background: var(--m-raised) !important;
@@ -496,7 +825,7 @@ webview[style*="opacity: 0.005"] {
496
825
  }
497
826
  :root[data-agy-theme="matte"] [data-testid="voice-picker"] .voice-picker-dot[aria-current="true"] > span {
498
827
  background: var(--m-primary) !important;
499
- box-shadow: 0 0 6px rgb(255 255 255 / 0.3) !important;
828
+ box-shadow: none !important;
500
829
  }
501
830
  :root[data-agy-theme="matte"] [data-testid="voice-picker"] button[data-testid="voice-picker-use"] {
502
831
  background: var(--m-primary) !important;
@@ -519,8 +848,7 @@ webview[style*="opacity: 0.005"] {
519
848
  border-bottom: none !important;
520
849
  border-radius: 14px 14px 0 0 !important;
521
850
  box-shadow: 0 -8px 24px -8px var(--m-shadow) !important;
522
- backdrop-filter: blur(16px) !important;
523
- -webkit-backdrop-filter: blur(16px) !important;
851
+ backdrop-filter: none !important; /* opaque: a blur behind it was pure cost */
524
852
  }
525
853
  :root[data-agy-theme="matte"] [data-testid="live-docked"] [data-testid="voice-end-button"],
526
854
  :root[data-agy-theme="matte"] [data-testid="live-docked"] [data-testid="voice-call-end"] {
@@ -586,3 +914,5 @@ webview[style*="opacity: 0.005"] {
586
914
  }
587
915
 
588
916
 
917
+ /* 90 — Swarm and other sidecar panes: themes/frames/matte.css. They are
918
+ cross-origin frames; frame-host.js loads that stylesheet inside them. */