@materialwebunofficial/antigravity-themes 1.0.5 → 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/md3e.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /* ==========================================================================
2
- AGY "Material 3 Expressive" (v3.1) — Antigravity Desktop 2.26–2.28
2
+ AGY "Material 3 Expressive" (v3.2) — Antigravity Desktop 2.26–2.31
3
3
 
4
4
  Built on the real system: every value below reads a --md-sys-* token from
5
5
  @materialwebunofficial/md3e-web (themes/md3e-tokens.css, generated by
@@ -164,7 +164,7 @@
164
164
  --glass-border: transparent;
165
165
  --glass-highlight: transparent;
166
166
  --glass-shadow: none;
167
- --shell: var(--md-sys-color-surface);
167
+ --shell: var(--md-sys-color-surface-container);
168
168
  --onyx-frame: transparent;
169
169
  --onyx-well: var(--md-sys-color-surface-container-highest);
170
170
  --onyx-key: var(--md-sys-color-secondary-container);
@@ -209,12 +209,16 @@
209
209
 
210
210
  /* P2 — Menus, Popovers & Overlays */
211
211
  :root[data-agy-theme="md3e"] body[data-agy-theme][data-newux-theme]:is(.dark, :not(.dark)) .agy-overlay[role="menu"] {
212
- background: var(--md-sys-color-surface-container-low);
213
- border-radius: 16px;
214
- overflow: visible;
215
- border: 0;
216
- box-shadow: 0 4px 16px -2px rgb(0 0 0 / 0.5);
217
- backdrop-filter: none;
212
+ background: var(--md-sys-color-surface-container-low) !important;
213
+ border-radius: 16px !important;
214
+ border: 0 !important;
215
+ box-shadow: 0 4px 16px -2px rgb(0 0 0 / 0.5) !important;
216
+ backdrop-filter: none !important;
217
+ padding: 4px !important;
218
+ max-height: min(75vh, calc(100vh - 60px)) !important;
219
+ overflow-y: auto !important;
220
+ overflow-x: hidden !important;
221
+ scrollbar-width: thin;
218
222
  }
219
223
  :root[data-agy-theme="md3e"] body[data-agy-theme][data-newux-theme]:is(.dark, :not(.dark)) .agy-overlay .agy-overlay-item {
220
224
  border-radius: 0;
@@ -245,33 +249,79 @@
245
249
  }
246
250
 
247
251
 
248
- /* 10 — Layout: navigation on surface-container, an inset surface body ----- */
249
- :root[data-agy-theme="md3e"] .group\/pane,
250
- :root[data-agy-theme="md3e"] .agy-sheet:not(:has(.group\/pane)) .browser-hole-opaque,
251
- :root[data-agy-theme="md3e"] [data-active-tab-id] + .flex-grow {
252
+ /* 10 — Layout: panes on the window ----------------------------------------- */
253
+ /* The window is surface-container: the title bar, the drawer, the header
254
+ rows. The conversation and the side panel are M3 panes on it: surface, with
255
+ extra-large corners, apart by a spacer. Nothing is outlined: tone and shape
256
+ tell a pane from the window, as in M3's canonical layouts.
257
+
258
+ Since the November update the app lays the panes out itself (.agy-sheet,
259
+ with --card-gap, --card-radius, --card-edge and --shell-canvas), so the
260
+ theme only sets those variables: the app's margins, its sidebar-closed gap
261
+ and its split panes keep working. --card-edge is the 0.5px hairline the app
262
+ draws around every pane; M3 has no such stroke. */
263
+ :root[data-agy-theme="md3e"] .agy-inset-shell {
264
+ --shell-canvas: var(--md-sys-color-surface-container);
265
+ --card-gap: 12px;
266
+ --card-radius: var(--md-sys-shape-corner-extra-large);
267
+ --card-edge: transparent;
268
+ --sash-line: var(--md-sys-color-outline);
269
+ --sash-glow: transparent;
270
+ }
271
+ :root[data-agy-theme="md3e"] [data-testid="title-menu-bar"] {
272
+ border-bottom: 0;
273
+ box-shadow: none;
274
+ }
275
+ /* Inside a pane, --background (and Tailwind's resolved --color-background)
276
+ is the pane: the pinned user-message band, the fade above the composer and
277
+ sticky headers then match it */
278
+ :root[data-agy-theme="md3e"] .agy-sheet [data-main-content-body],
279
+ :root[data-agy-theme="md3e"] .agy-inset-shell [data-side-panel-body],
280
+ :root[data-agy-theme="md3e"] [data-testid="sidecar-iframe-slot"] { /* a sidecar's frame is mounted over its pane, not in it */
252
281
  --background: var(--md-sys-color-surface);
253
282
  --color-background: var(--md-sys-color-surface);
254
- background: var(--md-sys-color-surface);
255
- border-radius: var(--md-sys-shape-corner-extra-large);
256
- overflow: hidden;
257
- }
258
- :root[data-agy-theme="md3e"] .group\/pane,
259
- :root[data-agy-theme="md3e"] .agy-sheet:not(:has(.group\/pane)) .browser-hole-opaque {
260
- width: auto;
261
- height: calc(100% - 12px);
262
- margin: 0 12px 12px 8px;
263
283
  }
264
284
  :root[data-agy-theme="md3e"] .agy-sheet {
265
285
  background-image: none !important;
266
286
  }
267
- :root[data-agy-theme="md3e"] [data-active-tab-id] + .flex-grow {
268
- margin: 0 12px 12px 0;
269
- }
270
287
  :root[data-agy-theme="md3e"] [data-active-tab-id] {
271
288
  border-bottom-color: transparent;
272
289
  }
273
- :root[data-agy-theme="md3e"] .bg-border.flex-shrink-0.z-30.h-full { /* sidebar | body divider; keeps the sash */
274
- background: var(--md-sys-color-surface-container);
290
+
291
+ /* A docked side panel is a second pane, not half of one card: both keep
292
+ their corners and share the spacer (the app joins them along a hairline) */
293
+ :root[data-agy-theme="md3e"] .agy-sheet[data-side-panel-docked] [data-main-content-body] {
294
+ --card-gap-right: calc(var(--card-gap) / 2);
295
+ border-radius: var(--card-radius);
296
+ }
297
+ :root[data-agy-theme="md3e"] .agy-sheet[data-side-panel-docked] [data-side-panel-body] {
298
+ --card-gap-left: calc(var(--card-gap) / 2);
299
+ border-radius: var(--card-radius);
300
+ }
301
+ /* The spacer's drag handle (M3 pane drag handle: a 4x48dp pill in outline,
302
+ on-surface and larger while dragged), centered on the panes. The app shows
303
+ a full-height line on hover instead. */
304
+ :root[data-agy-theme="md3e"] .agy-sheet[data-sheet-inset] > [data-split-root] > [data-split-sash] [data-sash-handle]::before {
305
+ top: calc(50% + var(--sash-line-top) / 2 - 24px);
306
+ bottom: auto;
307
+ left: calc(50% - 2px);
308
+ width: 4px;
309
+ height: 48px;
310
+ background-color: var(--md-sys-color-outline);
311
+ box-shadow: none;
312
+ clip-path: none;
313
+ opacity: 1;
314
+ transform: none;
315
+ transition: background-color var(--md-state), scale var(--md-fast);
316
+ }
317
+ :root[data-agy-theme="md3e"] .agy-sheet[data-sheet-inset] > [data-split-root] > [data-split-sash] [data-sash-handle]:hover::before {
318
+ background-color: var(--md-sys-color-on-surface-variant);
319
+ transform: none;
320
+ }
321
+ :root[data-agy-theme="md3e"] .agy-sheet[data-sheet-inset] > [data-split-root] > [data-split-sash] [data-sash-handle][data-dragging]::before {
322
+ background-color: var(--md-sys-color-on-surface);
323
+ scale: 1.5 1.1;
324
+ transform: none;
275
325
  }
276
326
 
277
327
  /* Inactive webview occlusion guard: prevent GPU compositor bleeding */
@@ -301,7 +351,10 @@ webview[style*="opacity: 0.005"] {
301
351
  reads and runs these menus: hidden, not removed. data-agy-appmenu is set
302
352
  only once that button exists; until then the rules below style the bar. */
303
353
  :root[data-agy-theme="md3e"][data-agy-appmenu] [data-testid="title-menu-bar"] > * {
304
- display: none;
354
+ display: none !important;
355
+ }
356
+ :root[data-agy-theme="md3e"] [data-testid="title-menu-bar"] > * {
357
+ display: flex;
305
358
  }
306
359
  :root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"] {
307
360
  padding: 0 12px;
@@ -472,8 +525,28 @@ webview[style*="opacity: 0.005"] {
472
525
  --agy-icon-keep: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 -960 960 960%27%3E%3Cpath d=%27M624 -744V-480L709 -395Q714 -390 717 -384Q720 -377 720 -369V-348Q720 -333 710 -322Q699 -312 684 -312H516V-90Q516 -75 506 -64Q495 -54 480 -54Q465 -54 454 -64Q444 -75 444 -90V-312H276Q261 -312 250 -322Q240 -333 240 -348V-369Q240 -377 243 -384Q246 -390 251 -395L336 -480V-744H324Q309 -744 298 -754Q288 -765 288 -780Q288 -795 298 -806Q309 -816 324 -816H636Q651 -816 662 -806Q672 -795 672 -780Q672 -765 662 -754Q651 -744 636 -744ZM342 -384H618L552 -450V-744H408V-450ZM480 -384Z%27/%3E%3C/svg%3E");
473
526
  --agy-icon-keep-fill: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 -960 960 960%27%3E%3Cpath d=%27M624 -744V-480L709 -395Q714 -390 717 -384Q720 -377 720 -369V-348Q720 -333 710 -322Q699 -312 684 -312H516V-90Q516 -75 506 -64Q495 -54 480 -54Q465 -54 454 -64Q444 -75 444 -90V-312H276Q261 -312 250 -322Q240 -333 240 -348V-369Q240 -377 243 -384Q246 -390 251 -395L336 -480V-744H324Q309 -744 298 -754Q288 -765 288 -780Q288 -795 298 -806Q309 -816 324 -816H636Q651 -816 662 -806Q672 -795 672 -780Q672 -765 662 -754Q651 -744 636 -744ZM342 -384H618L552 -450V-744H408V-450ZM342 -384 408 -450V-744H552V-450L618 -384Z%27/%3E%3C/svg%3E");
474
527
  }
475
- :root[data-agy-theme="md3e"] .flex:has([role="navigation"][aria-label="Sidebar"]) {
476
- transition: width 250ms cubic-bezier(0.2, 0, 0, 1);
528
+ :root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] {
529
+ container-type: inline-size;
530
+ overflow: hidden !important;
531
+ }
532
+ :root[data-agy-theme="md3e"] [data-testid="conversation-list-sidebar"] {
533
+ overflow-x: hidden !important;
534
+ }
535
+ :root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"] {
536
+ overflow: hidden !important;
537
+ }
538
+
539
+ @container (max-width: 180px) {
540
+ :root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"] {
541
+ display: none !important;
542
+ }
543
+ :root[data-agy-theme="md3e"] [data-testid="conversation-list-sidebar"] {
544
+ display: none !important;
545
+ }
546
+ :root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] .px-2,
547
+ :root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] .flex.flex-col.gap-px {
548
+ display: none !important;
549
+ }
477
550
  }
478
551
 
479
552
  :root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] > .px-2,
@@ -481,8 +554,18 @@ webview[style*="opacity: 0.005"] {
481
554
  :root[data-agy-theme="md3e"] [data-testid="conversation-list-sidebar"] {
482
555
  padding-inline: 12px;
483
556
  }
557
+ /* the drawer's dividers: under the top destinations and above Settings, as
558
+ between the groups; 8px of air each side. The app shows them only while
559
+ the list is scrolled (inline). */
484
560
  :root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] > .h-px {
485
561
  margin-inline: 28px;
562
+ background-color: var(--md-sys-color-outline-variant) !important;
563
+ }
564
+ :root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] > .h-px.mt-3 {
565
+ margin-top: 8px;
566
+ }
567
+ :root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] > .py-3 {
568
+ padding-block: 8px;
486
569
  }
487
570
 
488
571
  /* Group headlines (the drawer's .headline): title-small, on-surface-variant;
@@ -602,7 +685,6 @@ webview[style*="opacity: 0.005"] {
602
685
  letter-spacing: var(--md-sys-typescale-label-medium-tracking);
603
686
  font-variant-numeric: tabular-nums;
604
687
  color: var(--md-sys-color-on-surface-variant);
605
- opacity: 1;
606
688
  }
607
689
  /* a project's conversations: the row (and its pill) starts 32px in, so its
608
690
  icon sits under the folder's label; a 1px guide runs down from the folder
@@ -665,12 +747,19 @@ webview[style*="opacity: 0.005"] {
665
747
  text-decoration: underline;
666
748
  text-underline-offset: 3px;
667
749
  }
668
- :root[data-agy-theme="md3e"] [role="article"] pre > div {
750
+ /* Fenced code: a filled card (surface-container, large corners), with no
751
+ outline and no rule under its header. .agy-code is the block code-tools.js
752
+ marks (the one holding Copy code); since 2.31 it is no longer a pre > div */
753
+ :root[data-agy-theme="md3e"] [role="article"] pre > div,
754
+ :root[data-agy-theme="md3e"] .agy-code {
669
755
  border: 0;
670
756
  border-radius: var(--md-sys-shape-corner-large);
671
757
  background: var(--md-sys-color-surface-container);
672
758
  --agy-lineno: var(--md-sys-color-outline); /* code-tools.js line numbers */
673
759
  }
760
+ :root[data-agy-theme="md3e"] .agy-code > :first-child {
761
+ border-bottom-color: transparent;
762
+ }
674
763
  /* Its header buttons (Copy code, Insert in terminal, At mention, and
675
764
  code-tools.js's Wrap lines / Line numbers): 28px M3 standard icon buttons
676
765
  with a state layer, the row's 28px height kept; a toggle that is on is
@@ -718,11 +807,17 @@ webview[style*="opacity: 0.005"] {
718
807
  background: transparent;
719
808
  }
720
809
  :root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] {
810
+ --muted-foreground: color-mix(in srgb, var(--md-sys-color-on-primary-container) 75%, transparent) !important;
811
+ --secondary-foreground: color-mix(in srgb, var(--md-sys-color-on-primary-container) 85%, transparent) !important;
812
+ --foreground: var(--md-sys-color-on-primary-container) !important;
721
813
  padding: 12px 18px;
722
814
  border-radius: 24px 24px 6px 24px;
723
815
  background: var(--md-sys-color-primary-container);
724
816
  color: var(--md-sys-color-on-primary-container);
725
817
  }
818
+ :root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] :is(.text-muted-foreground, .text-secondary-foreground, [class*="muted"], blockquote, q, em) {
819
+ color: color-mix(in srgb, var(--md-sys-color-on-primary-container) 75%, transparent) !important;
820
+ }
726
821
  :root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] .whitespace-pre-wrap {
727
822
  font: var(--md-sys-typescale-body-large);
728
823
  letter-spacing: var(--md-sys-typescale-body-large-tracking);
@@ -1046,7 +1141,7 @@ webview[style*="opacity: 0.005"] {
1046
1141
  }
1047
1142
  :root[data-agy-theme="md3e"] [data-testid="send-button"] {
1048
1143
  padding: 10px;
1049
- border-radius: var(--md-sys-shape-corner-full);
1144
+ border-radius: 50%;
1050
1145
  }
1051
1146
  :root[data-agy-theme="md3e"] [data-tooltip-id="input-send-button-cancel-tooltip"] {
1052
1147
  border-radius: var(--md-sys-shape-corner-medium);
@@ -1058,7 +1153,7 @@ webview[style*="opacity: 0.005"] {
1058
1153
  scale: 0.8;
1059
1154
  }
1060
1155
  :root[data-agy-theme="md3e"] [data-tooltip-id="input-send-button-cancel-tooltip"] {
1061
- border-radius: var(--md-sys-shape-corner-full);
1156
+ border-radius: 50%;
1062
1157
  scale: 0.8;
1063
1158
  }
1064
1159
  }
@@ -1085,20 +1180,23 @@ webview[style*="opacity: 0.005"] {
1085
1180
  - group headers are label-large, 32px */
1086
1181
  :root[data-agy-theme="md3e"] [role="menu"] {
1087
1182
  --color-card: var(--md-sys-color-surface-container-low); /* the app's in-menu fades */
1088
- padding: 0;
1183
+ padding: 4px !important;
1089
1184
  gap: 0;
1090
- border: 0;
1091
- border-radius: 16px;
1092
- background: var(--md-sys-color-surface-container-low);
1093
- overflow: visible;
1094
- box-shadow: 0 4px 16px -2px rgb(0 0 0 / 0.5);
1095
- backdrop-filter: none;
1185
+ border: 0 !important;
1186
+ border-radius: 16px !important;
1187
+ background: var(--md-sys-color-surface-container-low) !important;
1188
+ max-height: min(75vh, calc(100vh - 60px)) !important;
1189
+ overflow-y: auto !important;
1190
+ overflow-x: hidden !important;
1191
+ scrollbar-width: thin;
1192
+ box-shadow: 0 4px 16px -2px rgb(0 0 0 / 0.5) !important;
1193
+ backdrop-filter: none !important;
1096
1194
  filter: none;
1097
1195
  color: var(--md-sys-color-on-surface);
1098
1196
  font-family: var(--md-sys-typescale-font-family);
1099
1197
  }
1100
1198
  /* rows: the children of the popup, of a menu group, and of the model panel */
1101
- :root[data-agy-theme="md3e"] :is([role="menu"], [role="menu"] > [role="group"], [data-testid="model-selector-panel"]) > :not([role="separator"], [role="group"], [data-testid="model-selector-panel"]) {
1199
+ :root[data-agy-theme="md3e"] :is([role="menu"], [role="menu"] > [role="group"], [data-testid="model-selector-panel"]) > :not([role="separator"], [role="group"], [data-testid="model-selector-panel"], .overflow-y-auto) {
1102
1200
  overflow: clip;
1103
1201
  border-radius: 0;
1104
1202
  }
@@ -1113,6 +1211,14 @@ webview[style*="opacity: 0.005"] {
1113
1211
  margin: 0;
1114
1212
  background: var(--md-sys-color-surface);
1115
1213
  }
1214
+ /* A menu that holds a submenu in its own DOM (the project picker, whose
1215
+ This Computer list opens beside it) must not be a scroll container:
1216
+ focusing the submenu's search would scroll the menu sideways and drag the
1217
+ submenu over it. It sizes itself; its project list scrolls on its own. */
1218
+ :root[data-agy-theme="md3e"] body[data-agy-theme][data-newux-theme]:is(.dark, :not(.dark)) .agy-overlay[role="menu"]:has(> [data-testid="project-selector-search"]) {
1219
+ max-height: none !important;
1220
+ overflow: visible !important;
1221
+ }
1116
1222
  /* group headers: Base UI group labels, the model list's "Model", the mode
1117
1223
  menu's "<Project> Settings" row */
1118
1224
  :root[data-agy-theme="md3e"] [role="menu"] .text-xs.text-muted-foreground.font-medium,
@@ -1152,39 +1258,46 @@ webview[style*="opacity: 0.005"] {
1152
1258
  }
1153
1259
  /* items */
1154
1260
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]) {
1155
- position: relative;
1156
- isolation: isolate;
1157
- min-height: 44px;
1158
- padding: 12px 16px; /* 4px row inset + 12px item padding */
1159
- gap: 8px;
1160
- background: transparent;
1161
- color: var(--md-sys-color-on-surface);
1162
- font: var(--md-sys-typescale-label-large);
1163
- letter-spacing: var(--md-sys-typescale-label-large-tracking);
1261
+ position: relative !important;
1262
+ isolation: isolate !important;
1263
+ min-height: 36px !important;
1264
+ padding: 8px 12px !important;
1265
+ gap: 8px !important;
1266
+ background: transparent !important;
1267
+ border-radius: 8px !important;
1268
+ color: var(--md-sys-color-on-surface) !important;
1269
+ font: var(--md-sys-typescale-label-large) !important;
1270
+ letter-spacing: var(--md-sys-typescale-label-large-tracking) !important;
1271
+ }
1272
+ :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):is([data-highlighted], :hover, :focus, :focus-visible) {
1273
+ background: transparent !important;
1164
1274
  }
1165
1275
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"])::before {
1166
- content: "";
1167
- position: absolute;
1168
- inset: 0 4px;
1169
- z-index: -1;
1170
- border-radius: 4px;
1171
- transition: border-radius var(--md-fast), background-color var(--md-state);
1276
+ content: "" !important;
1277
+ position: absolute !important;
1278
+ inset: 0 !important;
1279
+ z-index: -1 !important;
1280
+ border-radius: 8px !important;
1281
+ transition: border-radius var(--md-fast), background-color var(--md-state) !important;
1172
1282
  }
1173
1283
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):first-child::before,
1174
1284
  :root[data-agy-theme="md3e"] [role="menu"] :not([role^="menuitem"]) + :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"])::before {
1175
- border-start-start-radius: 12px;
1176
- border-start-end-radius: 12px;
1285
+ border-top-left-radius: 12px !important;
1286
+ border-top-right-radius: 12px !important;
1177
1287
  }
1178
1288
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):last-child::before,
1179
1289
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):has(+ [role="separator"])::before {
1180
- border-end-start-radius: 12px;
1181
- border-end-end-radius: 12px;
1290
+ border-bottom-left-radius: 12px !important;
1291
+ border-bottom-right-radius: 12px !important;
1292
+ }
1293
+ :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):only-child::before {
1294
+ border-radius: 12px !important;
1182
1295
  }
1183
1296
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):is([data-highlighted], :hover)::before {
1184
- background: color-mix(in srgb, currentColor 8%, transparent);
1297
+ background: color-mix(in srgb, currentColor 8%, transparent) !important;
1185
1298
  }
1186
1299
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):is(:focus-visible, :active)::before {
1187
- background: color-mix(in srgb, currentColor 10%, transparent);
1300
+ background: color-mix(in srgb, currentColor 10%, transparent) !important;
1188
1301
  }
1189
1302
  :root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"])[data-disabled] {
1190
1303
  opacity: 0.38;
@@ -1205,24 +1318,30 @@ webview[style*="opacity: 0.005"] {
1205
1318
  white-space: normal; /* md-menu wraps supporting text (the app truncates it) */
1206
1319
  }
1207
1320
  /* selected: the app marks it with text-foreground and a trailing check */
1208
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) {
1209
- color: var(--md-sys-color-on-tertiary-container);
1321
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"]) {
1322
+ background: var(--md-sys-color-tertiary-container) !important;
1323
+ color: var(--md-sys-color-on-tertiary-container) !important;
1324
+ border-radius: 12px !important;
1210
1325
  }
1211
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"])::before {
1212
- border-radius: 12px;
1213
- background: var(--md-sys-color-tertiary-container);
1326
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"]) * {
1327
+ color: var(--md-sys-color-on-tertiary-container) !important;
1328
+ fill: var(--md-sys-color-on-tertiary-container) !important;
1329
+ }
1330
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"])::before {
1331
+ border-radius: 12px !important;
1332
+ background: var(--md-sys-color-tertiary-container) !important;
1214
1333
  }
1215
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]):is([data-highlighted], :hover)::before {
1216
- background: color-mix(in srgb, var(--md-sys-color-on-tertiary-container) 8%, var(--md-sys-color-tertiary-container));
1334
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"]):is([data-highlighted], :hover, :focus, :focus-visible)::before {
1335
+ background: color-mix(in srgb, var(--md-sys-color-on-tertiary-container) 10%, var(--md-sys-color-tertiary-container)) !important;
1217
1336
  }
1218
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) :is(.text-muted-foreground, .ml-auto),
1219
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) > :is(svg:first-child, .ml-auto) {
1337
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"]) :is(.text-muted-foreground, .ml-auto),
1338
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"]) > :is(svg:first-child, .ml-auto) {
1220
1339
  color: inherit;
1221
1340
  }
1222
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) > span.ml-auto {
1341
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"]) > span.ml-auto {
1223
1342
  display: none;
1224
1343
  }
1225
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"])::after {
1344
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"])::after {
1226
1345
  content: "";
1227
1346
  order: -1;
1228
1347
  flex: none;
@@ -1233,7 +1352,7 @@ webview[style*="opacity: 0.005"] {
1233
1352
  transition: width var(--md-fast), margin var(--md-fast), opacity var(--md-color-fast);
1234
1353
  }
1235
1354
  @starting-style {
1236
- :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"])::after {
1355
+ :root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"], [data-checked="true"])::after {
1237
1356
  width: 0;
1238
1357
  margin-inline-end: -8px;
1239
1358
  opacity: 0;
@@ -1274,127 +1393,968 @@ webview[style*="opacity: 0.005"] {
1274
1393
  }
1275
1394
  }
1276
1395
 
1277
- /* 80 — Voice Mode & Gemini Live: Material 3 Expressive */
1278
- :root[data-agy-theme="md3e"] [data-testid="voice-live-pill"] {
1279
- background: var(--md-sys-color-secondary-container) !important;
1280
- color: var(--md-sys-color-on-secondary-container) !important;
1281
- border: 1px solid var(--md-sys-color-outline-variant) !important;
1282
- border-radius: var(--md-sys-shape-corner-full) !important;
1283
- transition: background-color var(--md-state), color var(--md-state), box-shadow var(--md-motion-short) !important;
1396
+ /* Select popups (Base UI listboxes: Settings dropdowns and the like): the
1397
+ md-menu anatomy of the menus above. Surface-container-low, 16px corners,
1398
+ level 2; options 8px (12px at the ends), label-large with body-medium
1399
+ supporting text, an 8% state layer on hover and keyboard focus; the
1400
+ chosen one a tertiary-container pill. The glass layer's square items
1401
+ (05) need !important on the corners. */
1402
+ :root[data-agy-theme="md3e"] [data-select-popup] {
1403
+ padding: 4px;
1404
+ border: 0 !important;
1405
+ border-radius: 16px !important;
1406
+ background: var(--md-sys-color-surface-container-low) !important;
1407
+ box-shadow: 0 4px 16px -2px rgb(0 0 0 / 0.5) !important;
1408
+ backdrop-filter: none !important;
1409
+ color: var(--md-sys-color-on-surface);
1410
+ font-family: var(--md-sys-typescale-font-family);
1284
1411
  }
1285
- :root[data-agy-theme="md3e"] [data-testid="voice-live-pill"]:hover {
1286
- box-shadow: var(--md-sys-elevation-level1) !important;
1412
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="listbox"] {
1413
+ gap: 0;
1414
+ padding: 0;
1287
1415
  }
1288
- :root[data-agy-theme="md3e"] [data-testid="voice-start-button"] {
1289
- color: inherit !important;
1416
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"] {
1417
+ min-height: 44px;
1418
+ padding: 8px 12px;
1419
+ gap: 8px;
1420
+ border-radius: 8px !important;
1421
+ background: transparent !important;
1422
+ color: var(--md-sys-color-on-surface) !important;
1423
+ font: var(--md-sys-typescale-label-large);
1424
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
1425
+ transition: background-color var(--md-state), border-radius var(--md-fast) !important;
1290
1426
  }
1291
-
1292
- /* Voice Picker Dialog — M3 Modal Dialog */
1293
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] {
1294
- background: var(--md-sys-color-surface-container-high) !important;
1295
- border: 1px solid var(--md-sys-color-outline-variant) !important;
1296
- border-radius: 28px !important;
1297
- box-shadow: var(--md-sys-elevation-level3) !important;
1427
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"]:first-child {
1428
+ border-top-left-radius: 12px !important;
1429
+ border-top-right-radius: 12px !important;
1298
1430
  }
1299
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] [data-testid="voice-picker-close"] {
1300
- color: var(--md-sys-color-on-surface-variant) !important;
1301
- border-radius: var(--md-sys-shape-corner-full) !important;
1431
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"]:last-child {
1432
+ border-bottom-left-radius: 12px !important;
1433
+ border-bottom-right-radius: 12px !important;
1302
1434
  }
1303
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] [data-testid="voice-picker-close"]:hover {
1304
- background: var(--md-hover) !important;
1305
- color: var(--md-sys-color-on-surface) !important;
1435
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"]:is([data-highlighted], :hover, :focus-visible) {
1436
+ background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent) !important;
1306
1437
  }
1307
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] [data-testid="voice-picker-name"] {
1308
- color: var(--md-sys-color-on-surface) !important;
1309
- font: var(--md-sys-typescale-headline-small) !important;
1438
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"] .text-muted-foreground {
1439
+ font: var(--md-sys-typescale-body-medium);
1440
+ letter-spacing: var(--md-sys-typescale-body-medium-tracking);
1441
+ color: var(--md-sys-color-on-surface-variant);
1310
1442
  }
1311
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] .voice-picker-dot > span {
1312
- background: var(--md-sys-color-outline-variant) !important;
1443
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"]:is([data-selected], [aria-selected="true"]) {
1444
+ border-radius: 12px !important;
1445
+ background: var(--md-sys-color-tertiary-container) !important;
1446
+ color: var(--md-sys-color-on-tertiary-container) !important;
1313
1447
  }
1314
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] .voice-picker-dot[aria-current="true"] > span {
1315
- background: var(--md-sys-color-primary) !important;
1316
- box-shadow: 0 0 10px color-mix(in srgb, var(--md-sys-color-primary) 50%, transparent) !important;
1448
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"]:is([data-selected], [aria-selected="true"]):is([data-highlighted], :hover, :focus-visible) {
1449
+ background: color-mix(in srgb, var(--md-sys-color-on-tertiary-container) 10%, var(--md-sys-color-tertiary-container)) !important;
1317
1450
  }
1318
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] button[data-testid="voice-picker-use"] {
1319
- background: var(--md-sys-color-primary) !important;
1320
- color: var(--md-sys-color-on-primary) !important;
1321
- border-radius: var(--md-sys-shape-corner-full) !important;
1322
- font: var(--md-sys-typescale-label-large) !important;
1323
- box-shadow: var(--md-sys-elevation-level1) !important;
1324
- transition: box-shadow var(--md-motion-short), background-color var(--md-state) !important;
1451
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"]:is([data-selected], [aria-selected="true"]) :is(.text-muted-foreground, svg) {
1452
+ color: var(--md-sys-color-on-tertiary-container);
1325
1453
  }
1326
- :root[data-agy-theme="md3e"] [data-testid="voice-picker"] button[data-testid="voice-picker-use"]:hover {
1327
- box-shadow: var(--md-sys-elevation-level2) !important;
1454
+ :root[data-agy-theme="md3e"] [data-select-popup] [role="option"] > span.shrink-0 svg {
1455
+ width: 20px;
1456
+ height: 20px;
1328
1457
  }
1329
1458
 
1330
- /* Active Voice Docked Panel — M3 Bottom Sheet */
1331
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] {
1332
- background: var(--md-sys-color-surface-container-high) !important;
1333
- background-image: none !important;
1334
- border: 1px solid var(--md-sys-color-outline-variant) !important;
1335
- border-bottom: none !important;
1336
- border-radius: 28px 28px 0 0 !important;
1459
+ /* 60 — Dialogs and Settings ------------------------------------------------ */
1460
+ /* Every dialog is an M3 dialog: surface-container-high, extra-large corners,
1461
+ level 3, over a 32% scrim; nothing outlined. Selectors go through
1462
+ .agy-dialog: the app's own glass rules (body[data-newux-theme] ...) round
1463
+ these controls into pills and outrank a single class. */
1464
+ :root[data-agy-theme="md3e"] .agy-dialog {
1465
+ border: 0 !important;
1466
+ border-radius: var(--md-sys-shape-corner-extra-large) !important;
1467
+ background: var(--md-sys-color-surface-container-high);
1337
1468
  box-shadow: var(--md-sys-elevation-level3) !important;
1338
- backdrop-filter: blur(20px) !important;
1339
- -webkit-backdrop-filter: blur(20px) !important;
1469
+ color: var(--md-sys-color-on-surface);
1340
1470
  }
1341
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-end-button"],
1342
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-end"] {
1343
- background: var(--md-sys-color-error) !important;
1344
- color: var(--md-sys-color-on-error) !important;
1345
- border-radius: var(--md-sys-shape-corner-full) !important;
1346
- font: var(--md-sys-typescale-label-medium) !important;
1471
+ :root[data-agy-theme="md3e"] .settings-modal-backdrop {
1472
+ background: color-mix(in srgb, var(--md-sys-color-scrim) 32%, transparent);
1347
1473
  }
1348
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-mute-button"],
1349
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-agent-mute"],
1350
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-speed"],
1351
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-collapse"] {
1474
+ :root[data-agy-theme="md3e"] .agy-dialog > button[aria-label="Close"] {
1475
+ width: 40px;
1476
+ height: 40px;
1352
1477
  border-radius: var(--md-sys-shape-corner-full) !important;
1478
+ color: var(--md-sys-color-on-surface-variant);
1479
+ transition: background-color var(--md-state), color var(--md-state);
1353
1480
  }
1354
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-mute-button"]:hover,
1355
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-agent-mute"]:hover,
1356
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-speed"]:hover,
1357
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-collapse"]:hover {
1358
- background: var(--md-hover) !important;
1481
+ :root[data-agy-theme="md3e"] .agy-dialog > button[aria-label="Close"]:hover {
1482
+ background: var(--md-hover);
1483
+ color: var(--md-sys-color-on-surface);
1359
1484
  }
1360
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-speed-fill"] {
1361
- background: var(--md-sys-color-primary) !important;
1485
+ :root[data-agy-theme="md3e"] .agy-dialog > button[aria-label="Close"] svg {
1486
+ width: 24px;
1487
+ height: 24px;
1362
1488
  }
1363
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-speed-track"] {
1364
- background: var(--md-sys-color-surface-container-highest) !important;
1489
+
1490
+ /* Settings: M3's list-detail layout. The dialog is the window
1491
+ (surface-container) with a navigation drawer; the page is a pane on it
1492
+ (surface, large corners); settings are segmented lists, M3 Expressive's
1493
+ grouped list items: 2px apart, 4px corners inside a group, 20px outside. */
1494
+ :root[data-agy-theme="md3e"] .settings-modal-container {
1495
+ --md-row: var(--md-sys-color-surface-container-high);
1496
+ background: var(--md-sys-color-surface-container);
1497
+ scrollbar-width: thin;
1365
1498
  }
1366
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="live-lead"],
1367
- :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="live-body"] {
1368
- color: var(--md-sys-color-on-surface) !important;
1499
+ :root[data-agy-theme="md3e"] .settings-modal-container .bg-background {
1500
+ background: transparent;
1501
+ }
1502
+ :root[data-agy-theme="md3e"] .settings-modal-container [data-split-root] > div:last-child {
1503
+ margin: 12px 12px 12px 0;
1504
+ border-radius: var(--md-sys-shape-corner-large-increased);
1505
+ background: var(--md-sys-color-surface);
1506
+ overflow: hidden;
1369
1507
  }
1370
1508
 
1371
- /* Background Glow Canvas & Ring — M3 Color Tint */
1372
- :root[data-agy-theme="md3e"] [data-testid="voice-speaking-glow"] canvas {
1373
- filter: drop-shadow(0 0 24px color-mix(in srgb, var(--md-sys-color-primary) 35%, transparent)) !important;
1509
+ /* Drawer: title-small headlines 28px in, pill destinations, dividers
1510
+ between groups (inset 28px). 40px rows, as the window's drawer list. */
1511
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] {
1512
+ background: transparent;
1513
+ font-family: var(--md-sys-typescale-font-family);
1374
1514
  }
1375
- :root[data-agy-theme="md3e"] [data-testid="voice-speaking-glow"] .voice-glow-ring {
1376
- box-shadow: 0 0 0 1px var(--md-sys-color-outline-variant) !important;
1515
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] > div:first-child {
1516
+ gap: 0;
1517
+ padding: 12px 0;
1518
+ }
1519
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] :is(h1, h2) {
1520
+ font: var(--md-sys-typescale-title-small);
1521
+ letter-spacing: var(--md-sys-typescale-title-small-tracking);
1522
+ color: var(--md-sys-color-on-surface-variant);
1523
+ }
1524
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] .px-4 {
1525
+ display: flex;
1526
+ align-items: center;
1527
+ min-height: 40px;
1528
+ padding: 0 28px;
1529
+ }
1530
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] .px-4.mt-2 {
1531
+ margin: 8px 28px 0;
1532
+ padding: 8px 0 0;
1533
+ border-top: 1px solid var(--md-sys-color-outline-variant);
1534
+ }
1535
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] .flex.flex-col.gap-0\.5 {
1536
+ gap: 0;
1537
+ }
1538
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] .mx-2 {
1539
+ margin: 0 12px;
1540
+ }
1541
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"] {
1542
+ min-height: 40px;
1543
+ padding: 0 16px;
1544
+ gap: 12px;
1545
+ border-radius: var(--md-sys-shape-corner-full);
1546
+ background: transparent;
1547
+ color: var(--md-sys-color-on-surface-variant);
1548
+ font: var(--md-sys-typescale-label-large);
1549
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
1550
+ transition: background-color var(--md-state), color var(--md-state);
1551
+ }
1552
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"] span {
1553
+ color: inherit;
1554
+ font: inherit;
1555
+ }
1556
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"]:hover {
1557
+ background: var(--md-hover);
1558
+ color: var(--md-sys-color-on-surface);
1559
+ }
1560
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"].bg-sidebar-secondary {
1561
+ background: var(--md-sys-color-secondary-container);
1562
+ color: var(--md-sys-color-on-secondary-container);
1563
+ font: var(--md-sys-typescale-label-large-emphasized);
1564
+ }
1565
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] button[data-testid^="settings-nav-item-"].bg-sidebar-secondary:hover {
1566
+ background: color-mix(in srgb, var(--md-sys-color-on-secondary-container) 8%, var(--md-sys-color-secondary-container));
1567
+ }
1568
+ /* "Show All": a text button */
1569
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] button.mx-4 {
1570
+ align-self: flex-start;
1571
+ min-height: 40px;
1572
+ margin: 0 12px;
1573
+ padding: 0 16px;
1574
+ border-radius: var(--md-sys-shape-corner-full);
1575
+ color: var(--md-sys-color-primary);
1576
+ font: var(--md-sys-typescale-label-large);
1577
+ text-decoration: none;
1578
+ transition: background-color var(--md-state);
1579
+ }
1580
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] button.mx-4:hover {
1581
+ background: var(--md-primary-hover);
1582
+ color: var(--md-sys-color-primary);
1583
+ }
1584
+ /* account: a 56px destination with a 40px avatar */
1585
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] > .border-t {
1586
+ margin: 0 28px;
1587
+ padding: 8px 0 12px;
1588
+ border-color: var(--md-sys-color-outline-variant);
1589
+ }
1590
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] > .border-t > button {
1591
+ min-height: 56px;
1592
+ margin: 0 -16px;
1593
+ padding: 0 16px;
1594
+ gap: 12px;
1595
+ border-radius: var(--md-sys-shape-corner-full);
1596
+ }
1597
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] > .border-t > button > div:first-child {
1598
+ width: 40px;
1599
+ height: 40px;
1600
+ background: var(--md-sys-color-primary-container);
1601
+ color: var(--md-sys-color-on-primary-container);
1602
+ }
1603
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] > .border-t span.text-foreground {
1604
+ font: var(--md-sys-typescale-title-small);
1605
+ }
1606
+ :root[data-agy-theme="md3e"] [data-testid="settings-sidebar"] > .border-t span.text-sm {
1607
+ font: var(--md-sys-typescale-body-small);
1377
1608
  }
1378
1609
 
1379
- /* In-Chat Separator Marker */
1380
- :root[data-agy-theme="md3e"] [data-testid="voice-chat-marker"] {
1381
- color: var(--md-sys-color-on-surface-variant) !important;
1382
- font: var(--md-sys-typescale-label-medium) !important;
1610
+ /* Page: headline-medium title, title-small primary category headers (as
1611
+ Android's settings), body-medium supporting text */
1612
+ :root[data-agy-theme="md3e"] .settings-modal-container .p-6.max-w-2xl {
1613
+ padding: 28px 24px 40px;
1614
+ }
1615
+ :root[data-agy-theme="md3e"] .settings-modal-container h2.text-2xl {
1616
+ font: var(--md-sys-typescale-headline-medium);
1617
+ letter-spacing: var(--md-sys-typescale-headline-medium-tracking);
1618
+ color: var(--md-sys-color-on-surface);
1383
1619
  }
1384
- :root[data-agy-theme="md3e"] div:has(> span [data-testid="voice-chat-marker"]) .bg-secondary,
1385
- :root[data-agy-theme="md3e"] div:has(> [data-testid="voice-chat-marker"]) .bg-secondary,
1386
- :root[data-agy-theme="md3e"] [data-testid="voice-chat-marker"] ~ div.bg-secondary {
1387
- background-color: var(--md-sys-color-outline-variant) !important;
1620
+ :root[data-agy-theme="md3e"] .settings-modal-container h2.text-2xl + div {
1621
+ font: var(--md-sys-typescale-body-medium);
1622
+ color: var(--md-sys-color-on-surface-variant);
1623
+ }
1624
+ :root[data-agy-theme="md3e"] .settings-modal-container h3 {
1625
+ padding-inline-start: 16px;
1626
+ font: var(--md-sys-typescale-title-small);
1627
+ letter-spacing: var(--md-sys-typescale-title-small-tracking);
1628
+ color: var(--md-sys-color-primary);
1629
+ }
1630
+ :root[data-agy-theme="md3e"] .settings-modal-container .leading-relaxed {
1631
+ padding-inline-start: 16px;
1632
+ font: var(--md-sys-typescale-body-medium);
1633
+ color: var(--md-sys-color-on-surface-variant);
1388
1634
  }
1389
1635
 
1390
- /* In-Chat Voice Transcript Card */
1391
- :root[data-agy-theme="md3e"] [data-testid="voice-transcript-card"] {
1392
- background: var(--md-sys-color-surface-container) !important;
1393
- border: 1px solid var(--md-sys-color-outline-variant) !important;
1394
- border-radius: 16px !important;
1636
+ /* Segmented list */
1637
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card {
1638
+ display: flex;
1639
+ flex-direction: column;
1640
+ gap: 2px;
1641
+ border: 0;
1642
+ border-radius: var(--md-sys-shape-corner-large-increased);
1643
+ background: transparent;
1644
+ }
1645
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card > * {
1646
+ border: 0 !important;
1647
+ border-radius: var(--md-sys-shape-corner-extra-small);
1648
+ background: var(--md-row, var(--md-sys-color-surface-container-highest));
1649
+ font: var(--md-sys-typescale-body-large);
1650
+ letter-spacing: var(--md-sys-typescale-body-large-tracking);
1651
+ }
1652
+ /* the rows (some sit in a wrapper) */
1653
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card .py-2.px-3 {
1654
+ min-height: 56px;
1655
+ padding: 12px 16px;
1656
+ }
1657
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card .text-sm {
1658
+ font: var(--md-sys-typescale-body-medium);
1659
+ letter-spacing: var(--md-sys-typescale-body-medium-tracking);
1660
+ color: var(--md-sys-color-on-surface-variant);
1661
+ }
1662
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card > button { /* "Code Preview": a list item that opens */
1663
+ min-height: 48px;
1664
+ color: var(--md-sys-color-on-surface-variant);
1665
+ font: var(--md-sys-typescale-label-large);
1666
+ transition: background-color var(--md-state);
1667
+ }
1668
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card > button:hover {
1669
+ background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, var(--md-row));
1670
+ color: var(--md-sys-color-on-surface);
1671
+ }
1672
+ :root[data-agy-theme="md3e"] .agy-dialog [data-testid="settings-row-badge"] {
1673
+ min-width: 20px;
1674
+ height: 20px;
1675
+ padding: 0 6px;
1676
+ border: 0;
1677
+ border-radius: var(--md-sys-shape-corner-full);
1678
+ background: var(--md-sys-color-secondary-container);
1679
+ color: var(--md-sys-color-on-secondary-container);
1680
+ font: var(--md-sys-typescale-label-small);
1681
+ line-height: 20px;
1682
+ text-align: center;
1683
+ }
1684
+ :root[data-agy-theme="md3e"] .agy-dialog code {
1685
+ padding: 0 6px;
1686
+ border: 0;
1687
+ border-radius: var(--md-sys-shape-corner-extra-small);
1688
+ background: var(--md-sys-color-surface-container-highest);
1689
+ color: var(--md-sys-color-on-surface);
1690
+ }
1691
+
1692
+ /* Buttons: filled tonal, 40px, pill; on press the corners close to medium
1693
+ (M3 Expressive's shape morph). Primary actions are filled. */
1694
+ :root[data-agy-theme="md3e"] .agy-dialog :is(.agy-button-sm, .agy-button-md).bg-secondary {
1695
+ height: 40px;
1696
+ padding: 0 16px;
1697
+ border-radius: 20px !important;
1698
+ background: var(--md-sys-color-secondary-container);
1699
+ color: var(--md-sys-color-on-secondary-container);
1700
+ font: var(--md-sys-typescale-label-large);
1701
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
1702
+ transition: border-radius var(--md-fast), background-color var(--md-state);
1703
+ }
1704
+ :root[data-agy-theme="md3e"] .agy-dialog :is(.agy-button-sm, .agy-button-md).bg-secondary:hover {
1705
+ background: color-mix(in srgb, var(--md-sys-color-on-secondary-container) 8%, var(--md-sys-color-secondary-container));
1706
+ color: var(--md-sys-color-on-secondary-container);
1707
+ }
1708
+ :root[data-agy-theme="md3e"] .agy-dialog :is(a, button:not([role])).bg-primary {
1709
+ display: inline-flex;
1710
+ align-items: center;
1711
+ height: 40px;
1712
+ padding: 0 24px;
1713
+ border-radius: 20px !important;
1714
+ background: var(--md-sys-color-primary);
1715
+ color: var(--md-sys-color-on-primary);
1716
+ font: var(--md-sys-typescale-label-large);
1717
+ transition: border-radius var(--md-fast), background-color var(--md-state);
1718
+ }
1719
+ :root[data-agy-theme="md3e"] .agy-dialog :is(a, button:not([role])).bg-primary:hover {
1720
+ background: color-mix(in srgb, var(--md-sys-color-on-primary) 8%, var(--md-sys-color-primary));
1721
+ }
1722
+ :root[data-agy-theme="md3e"] .agy-dialog [data-testid="delete-project-button"] {
1723
+ height: 40px;
1724
+ padding: 0 24px;
1725
+ border-radius: 20px !important;
1726
+ background: var(--md-sys-color-error);
1727
+ color: var(--md-sys-color-on-error);
1728
+ font: var(--md-sys-typescale-label-large);
1729
+ transition: border-radius var(--md-fast);
1730
+ }
1731
+ :root[data-agy-theme="md3e"] .agy-dialog :is(.agy-button-sm.bg-secondary, .agy-button-md.bg-secondary, a.bg-primary, button.bg-primary:not([role]), [data-testid="delete-project-button"]):active {
1732
+ border-radius: var(--md-sys-shape-corner-medium) !important;
1733
+ }
1734
+ /* text buttons: "Show N breakdown", "Advanced Settings" */
1735
+ :root[data-agy-theme="md3e"] .agy-dialog :is(.agy-button-sm.text-link, button.self-start.rounded-md) {
1736
+ height: 40px;
1737
+ margin: 0;
1738
+ padding: 0 12px;
1739
+ border-radius: 20px !important;
1740
+ color: var(--md-sys-color-primary);
1741
+ font: var(--md-sys-typescale-label-large);
1742
+ transition: background-color var(--md-state);
1743
+ }
1744
+ :root[data-agy-theme="md3e"] .agy-dialog :is(.agy-button-sm.text-link, button.self-start.rounded-md):hover {
1745
+ background: var(--md-primary-hover);
1746
+ color: var(--md-sys-color-primary);
1747
+ text-decoration: none;
1748
+ }
1749
+ /* icon buttons keep their size; standard icon button colors */
1750
+ :root[data-agy-theme="md3e"] .agy-dialog :is(.agy-button-icon-sm, .agy-button-icon):not(.bg-secondary) {
1751
+ border-radius: var(--md-sys-shape-corner-full) !important;
1752
+ color: var(--md-sys-color-on-surface-variant);
1753
+ transition: background-color var(--md-state), color var(--md-state);
1754
+ }
1755
+ :root[data-agy-theme="md3e"] .agy-dialog :is(.agy-button-icon-sm, .agy-button-icon):not(.bg-secondary):hover {
1756
+ background: var(--md-hover);
1757
+ color: var(--md-sys-color-on-surface);
1758
+ }
1759
+ /* key chips (Shortcuts): filled, small corners */
1760
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-button-xs.border {
1761
+ height: 32px;
1762
+ padding: 0 12px;
1763
+ border: 0;
1764
+ border-radius: var(--md-sys-shape-corner-small) !important;
1765
+ background: var(--md-sys-color-surface-container-highest);
1766
+ color: var(--md-sys-color-on-surface);
1767
+ font: var(--md-sys-typescale-label-large);
1768
+ transition: background-color var(--md-state);
1769
+ }
1770
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-button-xs.border:hover {
1771
+ background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, var(--md-sys-color-surface-container-highest));
1772
+ }
1773
+
1774
+ /* Select: an outlined button with a trailing arrow; open, it is selected
1775
+ (secondary-container) and its corners close to medium */
1776
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-select-trigger {
1777
+ height: 40px;
1778
+ padding: 0 12px 0 16px;
1779
+ gap: 8px;
1780
+ border: 1px solid var(--md-sys-color-outline-variant) !important;
1781
+ border-radius: 20px;
1782
+ background: transparent;
1783
+ color: var(--md-sys-color-on-surface-variant);
1784
+ font: var(--md-sys-typescale-label-large);
1785
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
1786
+ transition: border-radius var(--md-fast), background-color var(--md-state), color var(--md-state);
1787
+ }
1788
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-select-trigger:hover {
1789
+ background: var(--md-hover);
1790
+ color: var(--md-sys-color-on-surface);
1791
+ }
1792
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-select-trigger[aria-expanded="true"] {
1793
+ border-color: transparent !important;
1794
+ border-radius: var(--md-sys-shape-corner-medium);
1795
+ background: var(--md-sys-color-secondary-container);
1796
+ color: var(--md-sys-color-on-secondary-container);
1797
+ }
1798
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-select-trigger svg {
1799
+ width: 18px;
1800
+ height: 18px;
1801
+ opacity: 1;
1802
+ transition: transform var(--md-fast);
1803
+ }
1804
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-select-trigger[aria-expanded="true"] svg {
1805
+ transform: rotate(180deg);
1806
+ }
1807
+
1808
+ /* Connected button group (toggle groups): 2px apart, 8px inner corners;
1809
+ the selected one is secondary-container and fully round */
1810
+ :root[data-agy-theme="md3e"] .agy-dialog [data-slot="toggle-group"] {
1811
+ height: 40px;
1812
+ padding: 0;
1813
+ gap: 2px;
1814
+ border: 0 !important;
1815
+ border-radius: 0;
1816
+ background: transparent !important;
1817
+ box-shadow: none !important;
1818
+ }
1819
+ :root[data-agy-theme="md3e"] .agy-dialog [data-slot="toggle-group"] > button {
1820
+ min-width: 48px;
1821
+ height: 40px;
1822
+ padding: 0 16px;
1823
+ border-radius: var(--md-sys-shape-corner-small);
1824
+ background: var(--md-sys-color-surface-container-highest) !important;
1825
+ color: var(--md-sys-color-on-surface-variant) !important;
1826
+ box-shadow: none !important;
1827
+ font: var(--md-sys-typescale-label-large);
1828
+ transition: border-radius var(--md-fast), background-color var(--md-color-fast), color var(--md-color-fast);
1829
+ }
1830
+ :root[data-agy-theme="md3e"] .agy-dialog [data-slot="toggle-group"] > button:first-child {
1831
+ border-start-start-radius: 20px;
1832
+ border-end-start-radius: 20px;
1833
+ }
1834
+ :root[data-agy-theme="md3e"] .agy-dialog [data-slot="toggle-group"] > button:last-child {
1835
+ border-start-end-radius: 20px;
1836
+ border-end-end-radius: 20px;
1837
+ }
1838
+ /* hover: an 8% state layer drawn as an image, so it shows at once while the
1839
+ selection color fades */
1840
+ :root[data-agy-theme="md3e"] .agy-dialog [data-slot="toggle-group"] > button:hover,
1841
+ :root[data-agy-theme="md3e"] .agy-dialog [data-slot="toggle-group"] > button[data-pressed]:hover {
1842
+ background-image: linear-gradient(color-mix(in srgb, currentColor 8%, transparent) 0 0) !important;
1843
+ }
1844
+ :root[data-agy-theme="md3e"] .agy-dialog [data-slot="toggle-group"] > button[data-pressed] {
1845
+ border-radius: 20px;
1846
+ background: var(--md-sys-color-secondary-container) !important;
1847
+ color: var(--md-sys-color-on-secondary-container) !important;
1848
+ }
1849
+
1850
+ /* Switch: M3's, 52 x 32. Off: outlined track, a 16px outline handle;
1851
+ on: primary track, a 24px on-primary handle; pressed: 28px. The handle is
1852
+ one 28px circle moved and sized by transform alone (scale 16/28, 24/28,
1853
+ 1), so the spring runs on the compositor with no layout; the app's own
1854
+ inline transform is overridden. */
1855
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full {
1856
+ width: 52px;
1857
+ height: 32px;
1858
+ padding: 0;
1859
+ border: 2px solid var(--md-sys-color-outline);
1860
+ background: var(--md-sys-color-surface-container-highest) !important;
1861
+ contain: layout;
1862
+ transition: background-color var(--md-color-fast), border-color var(--md-color-fast);
1863
+ }
1864
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full:is([aria-checked="true"], [data-checked]) {
1865
+ border-color: var(--md-sys-color-primary);
1866
+ background: var(--md-sys-color-primary) !important;
1867
+ }
1868
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full > span {
1869
+ flex: none;
1870
+ width: 28px;
1871
+ height: 28px;
1872
+ background: var(--md-sys-color-outline);
1873
+ box-shadow: none !important;
1874
+ transform: translateX(0) scale(0.5714) !important;
1875
+ transition: transform var(--md-fast), background-color var(--md-color-fast);
1876
+ will-change: transform;
1877
+ }
1878
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full:is([aria-checked="true"], [data-checked]) > span {
1879
+ background: var(--md-sys-color-on-primary);
1880
+ transform: translateX(20px) scale(0.8571) !important;
1881
+ }
1882
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full:hover > span {
1883
+ background: var(--md-sys-color-on-surface-variant);
1884
+ }
1885
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full:is([aria-checked="true"], [data-checked]):hover > span {
1886
+ background: var(--md-sys-color-primary-container);
1887
+ }
1888
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full:active > span {
1889
+ transform: translateX(0) scale(1) !important;
1890
+ }
1891
+ :root[data-agy-theme="md3e"] [role="switch"].rounded-full:is([aria-checked="true"], [data-checked]):active > span {
1892
+ transform: translateX(20px) scale(1) !important;
1893
+ }
1894
+
1895
+ /* Slider: M3 Expressive's, a 16px track and a 4px handle with a gap */
1896
+ :root[data-agy-theme="md3e"] .agy-dialog input[type="range"] {
1897
+ --primary: var(--md-sys-color-primary);
1898
+ --secondary: var(--md-sys-color-secondary-container);
1899
+ height: 16px;
1900
+ border-radius: var(--md-sys-shape-corner-small);
1901
+ }
1902
+ :root[data-agy-theme="md3e"] .agy-dialog input[type="range"]::-webkit-slider-thumb {
1903
+ width: 4px;
1904
+ height: 36px;
1905
+ border-radius: 2px;
1906
+ background: var(--md-sys-color-primary);
1907
+ box-shadow: 0 0 0 4px var(--md-row, var(--md-sys-color-surface-container-high));
1908
+ }
1909
+
1910
+ /* Option cards (Interface Layout): filled cards; selected, the
1911
+ secondary-container and extra-large corners */
1912
+ :root[data-agy-theme="md3e"] .agy-dialog [role="radio"].rounded-xl {
1913
+ padding: 16px;
1914
+ border: 0;
1915
+ border-radius: var(--md-sys-shape-corner-large);
1916
+ background: var(--md-sys-color-surface-container-high);
1917
+ box-shadow: none;
1918
+ color: var(--md-sys-color-on-surface);
1919
+ transition: border-radius var(--md-fast), background-color var(--md-state);
1920
+ }
1921
+ :root[data-agy-theme="md3e"] .agy-dialog [role="radio"].rounded-xl:hover {
1922
+ background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, var(--md-sys-color-surface-container-high));
1923
+ }
1924
+ :root[data-agy-theme="md3e"] .agy-dialog [role="radio"].rounded-xl:is([data-checked], [aria-checked="true"]) {
1925
+ border-radius: var(--md-sys-shape-corner-extra-large);
1926
+ background: var(--md-sys-color-secondary-container);
1927
+ color: var(--md-sys-color-on-secondary-container);
1928
+ }
1929
+ :root[data-agy-theme="md3e"] .agy-dialog [role="radio"].rounded-xl:is([data-checked], [aria-checked="true"]) :is(.text-muted-foreground, .text-foreground, svg) {
1930
+ color: var(--md-sys-color-on-secondary-container);
1931
+ }
1932
+
1933
+ /* Text fields: M3 filled fields (top corners, an active indicator). Some
1934
+ carry Tailwind's !border / !bg-muted / !shadow-none, whose layered
1935
+ !important outranks any unlayered rule; they are steered through the
1936
+ variables those utilities read instead. */
1937
+ :root[data-agy-theme="md3e"] .agy-dialog :is(input.agy-field, input.bg-muted, .h-8.rounded-lg.bg-muted.border) {
1938
+ --tw-border-style: none;
1939
+ --color-muted: var(--md-sys-color-surface-container-highest);
1940
+ --tw-inset-shadow: inset 0 -1px 0 var(--md-sys-color-on-surface-variant);
1941
+ border-style: none;
1942
+ border-radius: var(--md-sys-shape-corner-extra-small-top) !important;
1943
+ background: var(--md-sys-color-surface-container-highest);
1944
+ box-shadow: var(--tw-inset-shadow);
1945
+ color: var(--md-sys-color-on-surface);
1946
+ font: var(--md-sys-typescale-body-large);
1947
+ font-size: var(--md-sys-typescale-body-large-size) !important; /* inline 12px */
1948
+ transition: box-shadow var(--md-state);
1949
+ }
1950
+ :root[data-agy-theme="md3e"] .agy-dialog :is(input.agy-field, input.bg-muted) {
1951
+ height: 40px;
1952
+ }
1953
+ :root[data-agy-theme="md3e"] .agy-dialog :is(input.agy-field:focus, input.bg-muted:focus, .h-8.rounded-lg.bg-muted.border:focus-within) {
1954
+ --tw-inset-shadow: inset 0 -2px 0 var(--md-sys-color-primary);
1955
+ outline: none;
1956
+ }
1957
+ :root[data-agy-theme="md3e"] .agy-dialog .h-8.rounded-lg.bg-muted.border {
1958
+ height: 48px;
1959
+ }
1960
+ :root[data-agy-theme="md3e"] .agy-dialog .h-8.rounded-lg.bg-muted.border input {
1961
+ font: var(--md-sys-typescale-body-large);
1962
+ }
1963
+ :root[data-agy-theme="md3e"] .agy-dialog button[aria-label="Show Remote Control QR code"] {
1964
+ border: 0;
1965
+ border-radius: var(--md-sys-shape-corner-medium);
1966
+ background: var(--md-sys-color-surface-container-lowest);
1967
+ }
1968
+ :root[data-agy-theme="md3e"] .agy-dialog button[aria-label$="color picker"] {
1969
+ border: 0;
1970
+ border-radius: var(--md-sys-shape-corner-full);
1971
+ box-shadow: inset 0 0 0 1px var(--md-sys-color-outline-variant);
1972
+ }
1973
+
1974
+ /* Usage rings: M3's circular progress indicator (primary on a
1975
+ secondary-container track, 4px, round caps; theme-host.js opens the gap
1976
+ between them). Low remaining quota reads in tertiary, then error. */
1977
+ :root[data-agy-theme="md3e"] .rounded-full:has(> svg [data-testid="quota-progress-circle"]) {
1978
+ background: transparent;
1979
+ }
1980
+ :root[data-agy-theme="md3e"] svg:has([data-testid="quota-progress-circle"]) circle:first-child {
1981
+ stroke: var(--md-sys-color-secondary-container);
1982
+ stroke-opacity: var(--agy-track-opacity, 1);
1983
+ stroke-width: 4;
1984
+ stroke-linecap: round;
1985
+ stroke-dasharray: var(--agy-track-dash, none);
1986
+ stroke-dashoffset: var(--agy-track-offset, 0);
1987
+ }
1988
+ :root[data-agy-theme="md3e"] [data-testid="quota-progress-circle"] {
1989
+ stroke: var(--md-sys-color-primary);
1990
+ stroke-linecap: round;
1991
+ }
1992
+ :root[data-agy-theme="md3e"] [data-testid="quota-progress-circle"]:is(.stroke-yellow-500, .stroke-amber-500, .stroke-orange-500) {
1993
+ stroke: var(--md-sys-color-tertiary);
1994
+ }
1995
+ :root[data-agy-theme="md3e"] [data-testid="quota-progress-circle"]:is(.stroke-red-500, .stroke-destructive) {
1996
+ stroke: var(--md-sys-color-error);
1997
+ }
1998
+
1999
+ /* Customizations (project pages): token bars as M3 linear progress (8px,
2000
+ secondary-container track); chart colors from the scheme; skill and rule
2001
+ cards filled; source tags as tonal labels */
2002
+ :root[data-agy-theme="md3e"] .agy-dialog {
2003
+ --chart-blue: var(--md-sys-color-primary);
2004
+ --chart-green: var(--md-sys-color-tertiary);
2005
+ --chart-purple: var(--md-sys-color-secondary);
2006
+ --chart-yellow: var(--md-sys-color-tertiary-fixed-dim);
2007
+ --chart-orange: var(--md-sys-color-primary-fixed-dim);
2008
+ --chart-red: var(--md-sys-color-error);
2009
+ }
2010
+ :root[data-agy-theme="md3e"] .agy-dialog .h-2.rounded-full.bg-muted {
2011
+ background: var(--md-sys-color-secondary-container);
2012
+ }
2013
+ /* skills, rules, subagents: the same segmented list */
2014
+ :root[data-agy-theme="md3e"] [data-testid="workspace-customizations-view"] .border.border-border.rounded-xl {
2015
+ display: flex;
2016
+ flex-direction: column;
2017
+ gap: 2px;
2018
+ border: 0;
2019
+ border-radius: var(--md-sys-shape-corner-large-increased);
2020
+ }
2021
+ :root[data-agy-theme="md3e"] [data-testid="workspace-customizations-view"] .border.border-border.rounded-xl > div {
2022
+ padding: 12px 16px;
2023
+ border: 0;
2024
+ border-radius: var(--md-sys-shape-corner-extra-small);
2025
+ background: var(--md-row);
2026
+ }
2027
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card p {
2028
+ font: var(--md-sys-typescale-body-medium);
2029
+ color: var(--md-sys-color-on-surface-variant);
2030
+ }
2031
+ /* project folders: 48px rows; Add Folder closes the group as a list action */
2032
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card > .h-9 {
2033
+ height: 48px;
2034
+ padding: 0 8px 0 16px;
2035
+ }
2036
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card [data-testid="project-add-folder-button"].bg-secondary {
2037
+ height: 48px;
2038
+ border-radius: var(--md-sys-shape-corner-extra-small) !important;
2039
+ background: var(--md-row);
2040
+ color: var(--md-sys-color-primary);
2041
+ }
2042
+ :root[data-agy-theme="md3e"] .agy-dialog .agy-card [data-testid="project-add-folder-button"].bg-secondary:hover {
2043
+ background: color-mix(in srgb, var(--md-sys-color-primary) 8%, var(--md-row));
2044
+ color: var(--md-sys-color-primary);
2045
+ }
2046
+ :root[data-agy-theme="md3e"] .agy-dialog span.rounded:is(.bg-blue-500\/10, .bg-purple-500\/10, .bg-green-500\/10, .bg-orange-500\/10) {
2047
+ padding: 2px 8px;
2048
+ border-radius: var(--md-sys-shape-corner-small);
2049
+ font: var(--md-sys-typescale-label-medium);
2050
+ }
2051
+ :root[data-agy-theme="md3e"] .agy-dialog span.rounded.bg-blue-500\/10 {
2052
+ background: var(--md-sys-color-secondary-container);
2053
+ color: var(--md-sys-color-on-secondary-container);
2054
+ }
2055
+ :root[data-agy-theme="md3e"] .agy-dialog span.rounded:is(.bg-purple-500\/10, .bg-green-500\/10, .bg-orange-500\/10) {
2056
+ background: var(--md-sys-color-tertiary-container);
2057
+ color: var(--md-sys-color-on-tertiary-container);
2058
+ }
2059
+
2060
+ /* Usage (model menu > View Usage): the menu's segmented groups of two-line
2061
+ items. Headline label-large, the reset time body-small, the amount left
2062
+ label-medium beside a 24px circular indicator (the rings above). */
2063
+ :root[data-agy-theme="md3e"] [role="menu"] > .select-none > .justify-between:first-child {
2064
+ min-height: 36px;
2065
+ padding: 4px 12px;
2066
+ font: var(--md-sys-typescale-label-large);
2067
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
2068
+ color: var(--md-sys-color-on-surface-variant);
2069
+ }
2070
+ :root[data-agy-theme="md3e"] [role="menu"] > .select-none > .flex-col.gap-1 {
2071
+ gap: 8px;
2072
+ }
2073
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"].gap-px {
2074
+ gap: 2px;
2075
+ }
2076
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"].gap-px > [role="presentation"] {
2077
+ padding: 4px 12px 6px;
2078
+ font: var(--md-sys-typescale-title-small);
2079
+ letter-spacing: var(--md-sys-typescale-title-small-tracking);
2080
+ color: var(--md-sys-color-primary) !important;
2081
+ }
2082
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"] > .grid.gap-x-3 {
2083
+ min-height: 48px;
2084
+ padding: 8px 12px 8px 16px;
2085
+ column-gap: 16px;
2086
+ row-gap: 0;
2087
+ border-radius: var(--md-sys-shape-corner-extra-small);
2088
+ background: var(--md-sys-color-surface-container);
2089
+ }
2090
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"] > [role="presentation"] + .grid.gap-x-3 {
2091
+ border-top-left-radius: var(--md-sys-shape-corner-medium);
2092
+ border-top-right-radius: var(--md-sys-shape-corner-medium);
2093
+ }
2094
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"] > .grid.gap-x-3:last-child {
2095
+ border-bottom-left-radius: var(--md-sys-shape-corner-medium);
2096
+ border-bottom-right-radius: var(--md-sys-shape-corner-medium);
2097
+ }
2098
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"] > .grid.gap-x-3 > span:first-child {
2099
+ font: var(--md-sys-typescale-label-large);
2100
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
2101
+ color: var(--md-sys-color-on-surface);
2102
+ }
2103
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"] > .grid.gap-x-3 > .col-span-2 {
2104
+ font: var(--md-sys-typescale-body-small);
2105
+ letter-spacing: var(--md-sys-typescale-body-small-tracking);
2106
+ color: var(--md-sys-color-on-surface-variant);
2107
+ }
2108
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"] > .grid.gap-x-3 > span:nth-child(2) {
2109
+ gap: 12px;
2110
+ font: var(--md-sys-typescale-label-medium);
2111
+ letter-spacing: var(--md-sys-typescale-label-medium-tracking);
2112
+ font-variant-numeric: tabular-nums;
2113
+ }
2114
+ :root[data-agy-theme="md3e"] [role="menu"] [role="group"] > .grid.gap-x-3 .w-4.h-4 {
2115
+ width: 24px;
2116
+ height: 24px;
2117
+ }
2118
+
2119
+ /* "Restart to Update": an M3 Expressive extra-small filled button (32px,
2120
+ label-large) with a leading refresh icon in place of the trailing arrow;
2121
+ pressed, its corners close to medium. The app's pulses are stilled. */
2122
+ :root[data-agy-theme="md3e"] [data-testid="app-update-button"] {
2123
+ animation: none !important;
2124
+ }
2125
+ :root[data-agy-theme="md3e"] [data-testid="app-update-button"]:not(.w-6) {
2126
+ width: auto;
2127
+ height: 32px;
2128
+ padding: 0 14px 0 10px;
2129
+ gap: 6px;
2130
+ border-radius: 16px;
2131
+ background: var(--md-sys-color-primary);
2132
+ color: var(--md-sys-color-on-primary);
2133
+ font: var(--md-sys-typescale-label-large);
2134
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
2135
+ transition: border-radius var(--md-fast), background-color var(--md-state);
2136
+ }
2137
+ :root[data-agy-theme="md3e"] [data-testid="app-update-button"]:not(.w-6)::before {
2138
+ content: "";
2139
+ flex: none;
2140
+ width: 18px;
2141
+ height: 18px;
2142
+ background: currentColor;
2143
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M17.65 6.35A7.96 7.96 0 0 0 12 4a8 8 0 1 0 7.73 10h-2.08A6 6 0 1 1 12 6c1.66 0 3.14.69 4.22 1.78L13 11h7V4z'/%3E%3C/svg%3E") center / 18px no-repeat;
2144
+ }
2145
+ :root[data-agy-theme="md3e"] [data-testid="app-update-button"]:not(.w-6) > span + span {
2146
+ display: none;
2147
+ }
2148
+ :root[data-agy-theme="md3e"] [data-testid="app-update-button"]:not(.w-6):hover {
2149
+ background: color-mix(in srgb, var(--md-sys-color-on-primary) 8%, var(--md-sys-color-primary));
2150
+ }
2151
+ :root[data-agy-theme="md3e"] [data-testid="app-update-button"]:not(.w-6):active {
2152
+ border-radius: var(--md-sys-shape-corner-medium);
2153
+ }
2154
+ :root[data-agy-theme="md3e"] [data-testid="app-update-button"].w-6 {
2155
+ width: 32px;
2156
+ height: 32px;
2157
+ border-radius: var(--md-sys-shape-corner-full);
2158
+ color: var(--md-sys-color-primary);
2159
+ }
2160
+
2161
+ /* Artifact cards (a plan, a report the agent wrote): M3 filled cards, no
2162
+ outline; the title title-small, the summary body-medium; Proceed a filled
2163
+ button, Open a tonal split button (2px apart, 4px inner corners) */
2164
+ :root[data-agy-theme="md3e"] :is([data-testid="artifact-card"], [data-testid="voice-transcript-card"]).artifact-card {
2165
+ padding: 16px;
2166
+ gap: 8px;
2167
+ border: 0;
2168
+ border-radius: var(--md-sys-shape-corner-large);
2169
+ background: var(--md-sys-color-surface-container-high);
2170
+ transition: background-color var(--md-state);
2171
+ }
2172
+ :root[data-agy-theme="md3e"] :is([data-testid="artifact-card"], [data-testid="voice-transcript-card"]).artifact-card:hover {
2173
+ background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, var(--md-sys-color-surface-container-high));
2174
+ }
2175
+ :root[data-agy-theme="md3e"] [data-testid="artifact-card-header"] {
2176
+ font: var(--md-sys-typescale-title-small);
2177
+ letter-spacing: var(--md-sys-typescale-title-small-tracking);
2178
+ color: var(--md-sys-color-on-surface);
2179
+ }
2180
+ :root[data-agy-theme="md3e"] [data-testid="artifact-card-header"] .text-secondary-foreground {
2181
+ font: var(--md-sys-typescale-body-medium);
2182
+ color: var(--md-sys-color-on-surface-variant);
2183
+ }
2184
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm {
2185
+ height: 40px;
2186
+ padding: 0 16px;
2187
+ border: 0;
2188
+ border-radius: 20px !important;
2189
+ font: var(--md-sys-typescale-label-large);
2190
+ letter-spacing: var(--md-sys-typescale-label-large-tracking);
2191
+ transition: border-radius var(--md-fast), background-color var(--md-state);
2192
+ }
2193
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm:active {
2194
+ border-radius: var(--md-sys-shape-corner-medium) !important;
2195
+ }
2196
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm.proceed-button {
2197
+ background: var(--md-sys-color-primary);
2198
+ color: var(--md-sys-color-on-primary);
2199
+ }
2200
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm:not(.proceed-button) {
2201
+ background: var(--md-sys-color-secondary-container);
2202
+ color: var(--md-sys-color-on-secondary-container);
2203
+ }
2204
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm:not(.proceed-button):hover {
2205
+ background: color-mix(in srgb, var(--md-sys-color-on-secondary-container) 8%, var(--md-sys-color-secondary-container));
2206
+ }
2207
+ :root[data-agy-theme="md3e"] .artifact-card .inline-flex.items-stretch {
2208
+ gap: 2px;
2209
+ }
2210
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm.rounded-r-none {
2211
+ border-top-right-radius: var(--md-sys-shape-corner-extra-small) !important;
2212
+ border-bottom-right-radius: var(--md-sys-shape-corner-extra-small) !important;
2213
+ }
2214
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm.rounded-l-none {
2215
+ width: 40px;
2216
+ padding: 0;
2217
+ border-left: 0;
2218
+ border-top-left-radius: var(--md-sys-shape-corner-extra-small) !important;
2219
+ border-bottom-left-radius: var(--md-sys-shape-corner-extra-small) !important;
2220
+ }
2221
+ :root[data-agy-theme="md3e"] .artifact-card .agy-button-sm.rounded-l-none[aria-expanded="true"] {
2222
+ border-radius: 20px !important;
2223
+ }
2224
+
2225
+ /* Chips in a sent message (quotes, files, terminals): they take the bubble's
2226
+ own ink, not the app's text colors, which are meant for the panel; a 12%
2227
+ tint of that ink marks them, the icon and supporting parts at 80% */
2228
+ :root[data-agy-theme="md3e"] .agy-user-bubble .inline-pill {
2229
+ color: inherit;
2230
+ background: color-mix(in srgb, currentColor 12%, transparent);
2231
+ border-radius: 8px;
2232
+ }
2233
+ :root[data-agy-theme="md3e"] .agy-user-bubble .inline-pill :is(.text-foreground, .text-secondary-foreground) {
2234
+ color: inherit;
2235
+ }
2236
+ :root[data-agy-theme="md3e"] .agy-user-bubble .inline-pill .text-muted-foreground {
2237
+ color: color-mix(in srgb, currentColor 80%, transparent);
2238
+ }
2239
+
2240
+ /* 80 — Voice Mode & Gemini Live: Material 3 Expressive */
2241
+ :root[data-agy-theme="md3e"] [data-testid="voice-live-pill"] {
2242
+ background: var(--md-sys-color-secondary-container) !important;
2243
+ color: var(--md-sys-color-on-secondary-container) !important;
2244
+ border-color: transparent !important;
2245
+ border-radius: var(--md-sys-shape-corner-full) !important;
2246
+ transition: background-color var(--md-state), color var(--md-state), box-shadow var(--md-color-fast) !important;
2247
+ }
2248
+ :root[data-agy-theme="md3e"] [data-testid="voice-live-pill"]:hover {
2249
+ box-shadow: var(--md-sys-elevation-level1) !important;
2250
+ }
2251
+ :root[data-agy-theme="md3e"] [data-testid="voice-start-button"] {
2252
+ color: inherit !important;
2253
+ }
2254
+
2255
+ /* Voice Picker Dialog — M3 Modal Dialog */
2256
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] {
2257
+ background: var(--md-sys-color-surface-container-high) !important;
2258
+ border-color: transparent !important;
2259
+ border-radius: var(--md-sys-shape-corner-extra-large) !important;
2260
+ box-shadow: var(--md-sys-elevation-level3) !important;
2261
+ }
2262
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] [data-testid="voice-picker-close"] {
2263
+ color: var(--md-sys-color-on-surface-variant) !important;
2264
+ border-radius: var(--md-sys-shape-corner-full) !important;
2265
+ }
2266
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] [data-testid="voice-picker-close"]:hover {
2267
+ background: var(--md-hover) !important;
2268
+ color: var(--md-sys-color-on-surface) !important;
2269
+ }
2270
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] [data-testid="voice-picker-name"] {
2271
+ color: var(--md-sys-color-on-surface) !important;
2272
+ font: var(--md-sys-typescale-headline-small) !important;
2273
+ }
2274
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] .voice-picker-dot > span {
2275
+ background: var(--md-sys-color-outline-variant) !important;
2276
+ }
2277
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] .voice-picker-dot[aria-current="true"] > span {
2278
+ background: var(--md-sys-color-primary) !important;
2279
+ box-shadow: none !important;
2280
+ }
2281
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] button[data-testid="voice-picker-use"] {
2282
+ background: var(--md-sys-color-primary) !important;
2283
+ color: var(--md-sys-color-on-primary) !important;
2284
+ border-radius: var(--md-sys-shape-corner-full) !important;
2285
+ font: var(--md-sys-typescale-label-large) !important;
2286
+ box-shadow: var(--md-sys-elevation-level1) !important;
2287
+ transition: box-shadow var(--md-color-fast), background-color var(--md-state) !important;
2288
+ }
2289
+ :root[data-agy-theme="md3e"] [data-testid="voice-picker"] button[data-testid="voice-picker-use"]:hover {
2290
+ box-shadow: var(--md-sys-elevation-level2) !important;
2291
+ }
2292
+
2293
+ /* Active Voice Docked Panel — M3 Bottom Sheet */
2294
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] {
2295
+ background: var(--md-sys-color-surface-container-high) !important;
2296
+ background-image: none !important;
2297
+ border-color: transparent !important;
2298
+ border-radius: var(--md-sys-shape-corner-extra-large) var(--md-sys-shape-corner-extra-large) 0 0 !important;
2299
+ box-shadow: var(--md-sys-elevation-level1) !important;
2300
+ backdrop-filter: none !important;
2301
+ }
2302
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-end-button"],
2303
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-end"] {
2304
+ background: var(--md-sys-color-error) !important;
2305
+ color: var(--md-sys-color-on-error) !important;
2306
+ border-radius: var(--md-sys-shape-corner-full) !important;
2307
+ font: var(--md-sys-typescale-label-medium) !important;
2308
+ }
2309
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-mute-button"],
2310
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-agent-mute"],
2311
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-speed"],
2312
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-collapse"] {
2313
+ border-radius: var(--md-sys-shape-corner-full) !important;
2314
+ }
2315
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-mute-button"]:hover,
2316
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-agent-mute"]:hover,
2317
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-speed"]:hover,
2318
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-call-collapse"]:hover {
2319
+ background: var(--md-hover) !important;
2320
+ }
2321
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-speed-fill"] {
2322
+ background: var(--md-sys-color-primary) !important;
2323
+ }
2324
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="voice-speed-track"] {
2325
+ background: var(--md-sys-color-surface-container-highest) !important;
2326
+ }
2327
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="live-lead"],
2328
+ :root[data-agy-theme="md3e"] [data-testid="live-docked"] [data-testid="live-body"] {
2329
+ color: var(--md-sys-color-on-surface) !important;
2330
+ }
2331
+
2332
+ /* Speaking glow: the app's own canvas, with no blur on top; its ring */
2333
+ :root[data-agy-theme="md3e"] [data-testid="voice-speaking-glow"] .voice-glow-ring {
2334
+ box-shadow: 0 0 0 1px var(--md-sys-color-outline-variant) !important;
2335
+ }
2336
+
2337
+ /* In-Chat Separator Marker */
2338
+ :root[data-agy-theme="md3e"] [data-testid="voice-chat-marker"] {
2339
+ color: var(--md-sys-color-on-surface-variant) !important;
2340
+ font: var(--md-sys-typescale-label-medium) !important;
2341
+ }
2342
+ :root[data-agy-theme="md3e"] div:has(> span [data-testid="voice-chat-marker"]) .bg-secondary,
2343
+ :root[data-agy-theme="md3e"] div:has(> [data-testid="voice-chat-marker"]) .bg-secondary,
2344
+ :root[data-agy-theme="md3e"] [data-testid="voice-chat-marker"] ~ div.bg-secondary {
2345
+ background-color: var(--md-sys-color-outline-variant) !important;
2346
+ }
2347
+
2348
+ /* In-Chat Voice Transcript Card */
2349
+ :root[data-agy-theme="md3e"] [data-testid="voice-transcript-card"] {
2350
+ background: var(--md-sys-color-surface-container) !important;
2351
+ border-color: transparent !important;
2352
+ border-radius: var(--md-sys-shape-corner-large) !important;
1395
2353
  }
1396
2354
  :root[data-agy-theme="md3e"] [data-testid="voice-transcript-card"]:hover {
1397
2355
  background: var(--md-sys-color-surface-container-high) !important;
1398
2356
  box-shadow: var(--md-sys-elevation-level1) !important;
1399
2357
  }
1400
2358
 
2359
+ /* 90 — Swarm and other sidecar panes: themes/frames/md3e.css. They are
2360
+ cross-origin frames; frame-host.js loads that stylesheet inside them. */