@materialwebunofficial/antigravity-themes 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +30 -0
- package/README.md +261 -2
- package/bin/cli.mjs +252 -0
- package/lib/autostart.mjs +70 -0
- package/lib/bundle.mjs +73 -0
- package/lib/injector.mjs +176 -0
- package/lib/paths.mjs +28 -0
- package/package.json +40 -4
- package/src/code-tools.js +131 -0
- package/src/context-card.js +536 -0
- package/src/loading-indicator.js +74 -0
- package/src/progress-indicators.js +98 -0
- package/src/theme-host.js +709 -0
- package/src/turn-tokens.js +115 -0
- package/themes/index.json +21 -0
- package/themes/matte.css +390 -0
- package/themes/md3e-icons.css +244 -0
- package/themes/md3e-tokens.css +834 -0
- package/themes/md3e.css +1206 -0
- package/vendor/md3e/LICENSE +176 -0
- package/vendor/md3e/NOTICE +686 -0
- package/vendor/md3e/Roboto-OFL.txt +93 -0
- package/vendor/md3e/SOURCE.txt +10 -0
- package/vendor/md3e/components.js +4682 -0
- package/vendor/md3e/roboto-variable.woff2 +0 -0
package/themes/md3e.css
ADDED
|
@@ -0,0 +1,1206 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
"Material 3 Expressive": a theme for Antigravity Desktop (tested with 2.28)
|
|
3
|
+
|
|
4
|
+
Built on the real system: every value below reads a --md-sys-* token from
|
|
5
|
+
@materialwebunofficial/md3e-web (themes/md3e-tokens.css, generated by
|
|
6
|
+
tools/build-md3e.mjs): the dark and light "expressive" color schemes from Material
|
|
7
|
+
Color Utilities, the M3 type scale in Roboto (the package's variable
|
|
8
|
+
font, registered by theme-host.js), the shape scale, state-layer
|
|
9
|
+
opacities, elevation levels and the expressive spring motion tokens.
|
|
10
|
+
theme-host.js adds M3 ripples (AndroidX timing) on a separate layer.
|
|
11
|
+
|
|
12
|
+
Antigravity is React + Tailwind and can only be restyled, not rebuilt
|
|
13
|
+
from md3e-web components; this file maps the system onto its controls.
|
|
14
|
+
|
|
15
|
+
Performance rules: tokens first; rules end in an id, class or one
|
|
16
|
+
attribute; no blur; :has() and masks only on a few small elements;
|
|
17
|
+
transitions only on color, opacity, transform, and border-radius of small
|
|
18
|
+
controls; nothing loops.
|
|
19
|
+
Scope: :root[data-agy-theme="md3e"]; seed preset via data-agy-seed.
|
|
20
|
+
========================================================================== */
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
/* 00 — Local helpers on top of the system tokens -------------------------- */
|
|
24
|
+
:root[data-agy-theme="md3e"] {
|
|
25
|
+
--md-hover: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-hover-state-layer-opacity) * 100%), transparent);
|
|
26
|
+
--md-press: color-mix(in srgb, var(--md-sys-color-on-surface) calc(var(--md-sys-state-pressed-state-layer-opacity) * 100%), transparent);
|
|
27
|
+
--md-primary-hover: color-mix(in srgb, var(--md-sys-color-primary) calc(var(--md-sys-state-hover-state-layer-opacity) * 100%), transparent);
|
|
28
|
+
/* opaque hover for the sidebar rows: the app pairs the row and its action
|
|
29
|
+
gradient through --sidebar-muted, so the state layer must be solid */
|
|
30
|
+
--md-nav-hover: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, var(--md-sys-color-surface-container));
|
|
31
|
+
--md-fast: var(--md-sys-motion-spatial-fast-duration) var(--md-sys-motion-spatial-fast-easing);
|
|
32
|
+
--md-color-fast: var(--md-sys-motion-effect-fast-duration) var(--md-sys-motion-effect-fast-easing);
|
|
33
|
+
/* hover/highlight state layers: M3's own 15ms linear (md-ripple, Compose
|
|
34
|
+
StateLayer); the 225ms effects curve made hover trail the pointer */
|
|
35
|
+
--md-state: 15ms linear;
|
|
36
|
+
/* code accents: the fixed-dim tones read on dark surfaces; on light ones
|
|
37
|
+
the on-fixed-variant tones do (light override below) */
|
|
38
|
+
--md-code-accent: var(--md-sys-color-primary-fixed-dim);
|
|
39
|
+
--md-code-accent-2: var(--md-sys-color-tertiary-fixed-dim);
|
|
40
|
+
}
|
|
41
|
+
/* Light mode: theme-host.js mirrors the app's own setting (System / Light /
|
|
42
|
+
Dark, marked on <body>) as data-agy-mode; md3e-tokens.css holds the light
|
|
43
|
+
schemes, so every rule below follows on its own */
|
|
44
|
+
:root[data-agy-theme="md3e"][data-agy-mode="light"] {
|
|
45
|
+
--md-code-accent: var(--md-sys-color-on-primary-fixed-variant);
|
|
46
|
+
--md-code-accent-2: var(--md-sys-color-on-tertiary-fixed-variant);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
/* 01 — Bridge: app tokens (inline on <html>, hence !important) ------------ */
|
|
51
|
+
:root[data-agy-theme="md3e"] {
|
|
52
|
+
--background: var(--md-sys-color-surface-container) !important; /* window; the body pane re-points it (10) */
|
|
53
|
+
--content: var(--md-sys-color-surface) !important;
|
|
54
|
+
--foreground: var(--md-sys-color-on-surface) !important;
|
|
55
|
+
--primary: var(--md-sys-color-primary) !important;
|
|
56
|
+
--primary-foreground: var(--md-sys-color-on-primary) !important;
|
|
57
|
+
--secondary: var(--md-sys-color-surface-container-highest) !important;
|
|
58
|
+
--secondary-foreground: var(--md-sys-color-on-surface-variant) !important;
|
|
59
|
+
--muted: var(--md-sys-color-surface-container) !important;
|
|
60
|
+
--muted-foreground: var(--md-sys-color-on-surface-variant) !important;
|
|
61
|
+
--placeholder: var(--md-sys-color-on-surface-variant) !important;
|
|
62
|
+
--border: var(--md-sys-color-outline-variant) !important;
|
|
63
|
+
--card: var(--md-sys-color-surface-container-high) !important;
|
|
64
|
+
--card-border: var(--md-sys-color-outline-variant) !important;
|
|
65
|
+
--sidebar: var(--md-sys-color-surface-container) !important;
|
|
66
|
+
--sidebar-secondary: var(--md-sys-color-secondary-container) !important;
|
|
67
|
+
--sidebar-muted: var(--md-nav-hover) !important;
|
|
68
|
+
--link: var(--md-sys-color-primary) !important;
|
|
69
|
+
--code-foreground: var(--md-sys-color-on-surface) !important;
|
|
70
|
+
--success: var(--md-sys-color-tertiary) !important;
|
|
71
|
+
--warning: var(--md-sys-color-tertiary) !important;
|
|
72
|
+
--error: var(--md-sys-color-error) !important;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
:root[data-agy-theme="md3e"] {
|
|
76
|
+
--font-sans: var(--md-sys-typescale-font-family);
|
|
77
|
+
--ring: var(--md-sys-color-secondary);
|
|
78
|
+
--ease-expo-out: var(--md-sys-motion-spatial-fast-easing); /* the app's own popup/panel transitions */
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
:root[data-agy-theme="md3e"] body {
|
|
82
|
+
--focus-ring-color: var(--md-sys-color-secondary);
|
|
83
|
+
font-family: var(--md-sys-typescale-font-family);
|
|
84
|
+
-webkit-font-smoothing: antialiased;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Code colors from the scheme. The app writes its code-color setting inline
|
|
88
|
+
on <body> (hence !important); while the theme is on, it owns them. */
|
|
89
|
+
:root[data-agy-theme="md3e"] .theme-dark,
|
|
90
|
+
:root[data-agy-theme="md3e"] .theme-light {
|
|
91
|
+
--syntax-default-fg: var(--md-sys-color-on-surface) !important;
|
|
92
|
+
--syntax-comment: var(--md-sys-color-outline) !important;
|
|
93
|
+
--syntax-punctuation: var(--md-sys-color-on-surface-variant) !important;
|
|
94
|
+
--syntax-operator: var(--md-sys-color-on-surface-variant) !important;
|
|
95
|
+
--syntax-variable: var(--md-sys-color-on-surface) !important;
|
|
96
|
+
--syntax-keyword: var(--md-sys-color-primary) !important;
|
|
97
|
+
--syntax-string: var(--md-sys-color-tertiary) !important;
|
|
98
|
+
--syntax-attr-value: var(--md-sys-color-tertiary) !important;
|
|
99
|
+
--syntax-inserted: var(--md-sys-color-tertiary) !important;
|
|
100
|
+
--syntax-attr-name: var(--md-sys-color-secondary) !important;
|
|
101
|
+
--syntax-builtin: var(--md-sys-color-secondary) !important;
|
|
102
|
+
--syntax-function: var(--md-code-accent) !important;
|
|
103
|
+
--syntax-class-name: var(--md-code-accent) !important;
|
|
104
|
+
--syntax-number: var(--md-code-accent-2) !important;
|
|
105
|
+
--syntax-constant: var(--md-code-accent-2) !important;
|
|
106
|
+
--syntax-property: var(--md-sys-color-secondary) !important;
|
|
107
|
+
--syntax-tag: var(--md-sys-color-error) !important;
|
|
108
|
+
--syntax-deleted: var(--md-sys-color-error) !important;
|
|
109
|
+
--syntax-regex: var(--md-code-accent-2) !important;
|
|
110
|
+
--bg-selection: color-mix(in srgb, var(--md-sys-color-primary) 28%, transparent) !important;
|
|
111
|
+
--bg-selection-overlay: color-mix(in srgb, var(--md-sys-color-primary) 28%, transparent) !important;
|
|
112
|
+
--bg-cursor-line: var(--md-hover) !important;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
/* 02 — Bridge: VS Code vars (inline on <html>) ---------------------------- */
|
|
117
|
+
:root[data-agy-theme="md3e"] {
|
|
118
|
+
--vscode-foreground: var(--md-sys-color-on-surface) !important;
|
|
119
|
+
--vscode-focusBorder: var(--md-sys-color-secondary) !important;
|
|
120
|
+
--vscode-textLink-foreground: var(--md-sys-color-primary) !important;
|
|
121
|
+
--vscode-textCodeBlock-background: var(--md-sys-color-surface-container) !important;
|
|
122
|
+
--vscode-sideBar-background: var(--md-sys-color-surface-container) !important;
|
|
123
|
+
--vscode-editor-background: var(--md-sys-color-surface-container-lowest) !important;
|
|
124
|
+
--vscode-editor-foreground: var(--md-sys-color-on-surface) !important;
|
|
125
|
+
--vscode-editor-lineHighlightBackground: var(--md-hover) !important;
|
|
126
|
+
--vscode-editor-selectionBackground: color-mix(in srgb, var(--md-sys-color-primary) 28%, transparent) !important;
|
|
127
|
+
--vscode-editorCursor-foreground: var(--md-sys-color-primary) !important;
|
|
128
|
+
--vscode-editorLineNumber-foreground: var(--md-sys-color-outline) !important;
|
|
129
|
+
--vscode-editorLineNumber-activeForeground: var(--md-sys-color-on-surface-variant) !important;
|
|
130
|
+
--vscode-editor-findMatchBackground: color-mix(in srgb, var(--md-sys-color-tertiary) 40%, transparent) !important;
|
|
131
|
+
--vscode-editor-findMatchHighlightBackground: color-mix(in srgb, var(--md-sys-color-tertiary) 20%, transparent) !important;
|
|
132
|
+
--vscode-editorWidget-background: var(--md-sys-color-surface-container) !important;
|
|
133
|
+
--vscode-editorWidget-border: var(--md-sys-color-outline-variant) !important;
|
|
134
|
+
--vscode-editorHoverWidget-background: var(--md-sys-color-surface-container) !important;
|
|
135
|
+
--vscode-editorHoverWidget-border: var(--md-sys-color-outline-variant) !important;
|
|
136
|
+
--vscode-input-background: var(--md-sys-color-surface-container-high) !important;
|
|
137
|
+
--vscode-input-border: var(--md-sys-color-outline-variant) !important;
|
|
138
|
+
--vscode-dropdown-background: var(--md-sys-color-surface-container) !important;
|
|
139
|
+
--vscode-dropdown-border: var(--md-sys-color-outline-variant) !important;
|
|
140
|
+
--vscode-button-background: var(--md-sys-color-primary) !important;
|
|
141
|
+
--vscode-button-foreground: var(--md-sys-color-on-primary) !important;
|
|
142
|
+
--vscode-button-hoverBackground: color-mix(in srgb, var(--md-sys-color-on-primary) 8%, var(--md-sys-color-primary)) !important;
|
|
143
|
+
--vscode-badge-background: var(--md-sys-color-secondary-container) !important;
|
|
144
|
+
--vscode-badge-foreground: var(--md-sys-color-on-secondary-container) !important;
|
|
145
|
+
--vscode-list-hoverBackground: var(--md-hover) !important;
|
|
146
|
+
--vscode-list-focusBackground: var(--md-hover) !important;
|
|
147
|
+
--vscode-list-activeSelectionBackground: var(--md-sys-color-secondary-container) !important;
|
|
148
|
+
--vscode-list-inactiveSelectionBackground: var(--md-hover) !important;
|
|
149
|
+
--vscode-scrollbarSlider-background: color-mix(in srgb, var(--md-sys-color-on-surface) 14%, transparent) !important;
|
|
150
|
+
--vscode-scrollbarSlider-hoverBackground: color-mix(in srgb, var(--md-sys-color-on-surface) 22%, transparent) !important;
|
|
151
|
+
--vscode-scrollbarSlider-activeBackground: color-mix(in srgb, var(--md-sys-color-on-surface) 30%, transparent) !important;
|
|
152
|
+
--vscode-diffEditor-insertedLineBackground: color-mix(in srgb, var(--md-sys-color-tertiary) 12%, transparent) !important;
|
|
153
|
+
--vscode-diffEditor-insertedTextBackground: color-mix(in srgb, var(--md-sys-color-tertiary) 24%, transparent) !important;
|
|
154
|
+
--vscode-diffEditor-removedLineBackground: color-mix(in srgb, var(--md-sys-color-error) 12%, transparent) !important;
|
|
155
|
+
--vscode-diffEditor-removedTextBackground: color-mix(in srgb, var(--md-sys-color-error) 24%, transparent) !important;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Find in conversation and in code: every match a tertiary tint, the
|
|
159
|
+
current one the tertiary container. The app sets these inline; its own
|
|
160
|
+
::highlight rules read them crosswise (every match in the "current"
|
|
161
|
+
color), so they are restated the right way round. */
|
|
162
|
+
:root[data-agy-theme="md3e"] {
|
|
163
|
+
--editor-find-match-background: color-mix(in srgb, var(--md-sys-color-tertiary) 28%, transparent) !important;
|
|
164
|
+
--editor-find-current-background: var(--md-sys-color-tertiary-container) !important;
|
|
165
|
+
--editor-find-current-border: var(--md-sys-color-tertiary) !important;
|
|
166
|
+
}
|
|
167
|
+
:root[data-agy-theme="md3e"] ::highlight(find-match-highlight) {
|
|
168
|
+
background-color: var(--editor-find-match-background);
|
|
169
|
+
}
|
|
170
|
+
:root[data-agy-theme="md3e"] ::highlight(find-match-current) {
|
|
171
|
+
background-color: var(--editor-find-current-background);
|
|
172
|
+
color: var(--md-sys-color-on-tertiary-container);
|
|
173
|
+
}
|
|
174
|
+
:root[data-agy-theme="md3e"] .bg-find-current { /* app class */
|
|
175
|
+
color: var(--md-sys-color-on-tertiary-container);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
/* 10 — Layout: navigation on surface-container, an inset surface body ----- */
|
|
180
|
+
:root[data-agy-theme="md3e"] .group\/pane,
|
|
181
|
+
:root[data-agy-theme="md3e"] [data-active-tab-id] + .flex-grow {
|
|
182
|
+
--background: var(--md-sys-color-surface);
|
|
183
|
+
--color-background: var(--md-sys-color-surface);
|
|
184
|
+
background: var(--md-sys-color-surface);
|
|
185
|
+
border-radius: var(--md-sys-shape-corner-extra-large);
|
|
186
|
+
overflow: hidden;
|
|
187
|
+
}
|
|
188
|
+
:root[data-agy-theme="md3e"] .group\/pane {
|
|
189
|
+
width: auto;
|
|
190
|
+
height: calc(100% - 12px);
|
|
191
|
+
margin: 0 12px 12px 8px;
|
|
192
|
+
}
|
|
193
|
+
:root[data-agy-theme="md3e"] [data-active-tab-id] + .flex-grow {
|
|
194
|
+
margin: 0 12px 12px 0;
|
|
195
|
+
}
|
|
196
|
+
:root[data-agy-theme="md3e"] [data-active-tab-id] {
|
|
197
|
+
border-bottom-color: transparent;
|
|
198
|
+
}
|
|
199
|
+
:root[data-agy-theme="md3e"] .bg-border.flex-shrink-0.z-30.h-full { /* sidebar | body divider; keeps the sash */
|
|
200
|
+
background: transparent;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* Top app bar. The conversation title is title-medium (16/24, 500): the
|
|
204
|
+
scale has no 18-20px role, and title-large (22px, 400) in a 40px pill
|
|
205
|
+
read as heavy */
|
|
206
|
+
:root[data-agy-theme="md3e"] [data-testid="breadcrumb-segment"] {
|
|
207
|
+
height: 36px;
|
|
208
|
+
padding: 0 12px;
|
|
209
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
210
|
+
font: var(--md-sys-typescale-title-medium);
|
|
211
|
+
letter-spacing: var(--md-sys-typescale-title-medium-tracking);
|
|
212
|
+
color: var(--md-sys-color-on-surface);
|
|
213
|
+
transition: background-color var(--md-state);
|
|
214
|
+
}
|
|
215
|
+
:root[data-agy-theme="md3e"] [data-testid="breadcrumb-segment"]:hover {
|
|
216
|
+
background: var(--md-hover);
|
|
217
|
+
}
|
|
218
|
+
/* The text menu bar folds into the app menu button (theme-host.js), which
|
|
219
|
+
reads and runs these menus: hidden, not removed. data-agy-appmenu is set
|
|
220
|
+
only once that button exists; until then the rules below style the bar. */
|
|
221
|
+
:root[data-agy-theme="md3e"][data-agy-appmenu] [data-testid="title-menu-bar"] > * {
|
|
222
|
+
display: none;
|
|
223
|
+
}
|
|
224
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"] {
|
|
225
|
+
padding: 0 12px;
|
|
226
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
227
|
+
font: var(--md-sys-typescale-label-large);
|
|
228
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
229
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
230
|
+
transition: background-color var(--md-state), color var(--md-state);
|
|
231
|
+
}
|
|
232
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"]:hover {
|
|
233
|
+
background: var(--md-hover);
|
|
234
|
+
color: var(--md-sys-color-on-surface);
|
|
235
|
+
}
|
|
236
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"]:has(+ div) { /* its menu is open */
|
|
237
|
+
background: var(--md-sys-color-secondary-container);
|
|
238
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/* Title bar menus (Antigravity, Workspace, View, Window): the app's own
|
|
242
|
+
popup, without menu roles, so section 50 never reached it. Same md-menu
|
|
243
|
+
anatomy: one surface-container-low group (16px, level 2), 44px items with
|
|
244
|
+
their shape 4px in (12px at the ends), 8% / 10% state layers, label-large;
|
|
245
|
+
opens with the menu's scale + fade */
|
|
246
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"] + div {
|
|
247
|
+
min-width: 240px;
|
|
248
|
+
margin-top: 4px;
|
|
249
|
+
padding: 4px 0;
|
|
250
|
+
border: 0;
|
|
251
|
+
border-radius: 16px;
|
|
252
|
+
background: var(--md-sys-color-surface-container-low);
|
|
253
|
+
box-shadow: var(--md-sys-elevation-level2);
|
|
254
|
+
color: var(--md-sys-color-on-surface);
|
|
255
|
+
transform-origin: top left;
|
|
256
|
+
transition: scale var(--md-fast), opacity var(--md-color-fast);
|
|
257
|
+
}
|
|
258
|
+
@starting-style {
|
|
259
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"] + div {
|
|
260
|
+
scale: 0.8;
|
|
261
|
+
opacity: 0;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"] {
|
|
265
|
+
position: relative;
|
|
266
|
+
isolation: isolate;
|
|
267
|
+
min-height: 44px;
|
|
268
|
+
padding: 0 16px;
|
|
269
|
+
gap: 12px;
|
|
270
|
+
background: transparent;
|
|
271
|
+
color: var(--md-sys-color-on-surface);
|
|
272
|
+
font: var(--md-sys-typescale-label-large);
|
|
273
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
274
|
+
}
|
|
275
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"]::before {
|
|
276
|
+
content: "";
|
|
277
|
+
position: absolute;
|
|
278
|
+
inset: 0 4px;
|
|
279
|
+
z-index: -1;
|
|
280
|
+
border-radius: 4px;
|
|
281
|
+
transition: background-color var(--md-state);
|
|
282
|
+
}
|
|
283
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"] + div > div:first-child > [data-testid="title-menu-bar-option"]::before {
|
|
284
|
+
border-top-left-radius: 12px;
|
|
285
|
+
border-top-right-radius: 12px;
|
|
286
|
+
}
|
|
287
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-item"] + div > div:last-child > [data-testid="title-menu-bar-option"]::before {
|
|
288
|
+
border-bottom-left-radius: 12px;
|
|
289
|
+
border-bottom-right-radius: 12px;
|
|
290
|
+
}
|
|
291
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"]:hover::before {
|
|
292
|
+
background: color-mix(in srgb, currentColor 8%, transparent);
|
|
293
|
+
}
|
|
294
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"]:focus-visible::before,
|
|
295
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"]:active::before {
|
|
296
|
+
background: color-mix(in srgb, currentColor 10%, transparent);
|
|
297
|
+
}
|
|
298
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"].pointer-events-none, /* "Version …" and other labels */
|
|
299
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"] > span + span { /* shortcut */
|
|
300
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
301
|
+
opacity: 1;
|
|
302
|
+
}
|
|
303
|
+
:root[data-agy-theme="md3e"] [data-testid="title-menu-bar-option"] > span + span {
|
|
304
|
+
font: var(--md-sys-typescale-label-large);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/* Conversation navigator (the rail of turn dots on the left): outline-variant
|
|
308
|
+
dots, the current turn a primary pill that grows on the spatial spring */
|
|
309
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-navigator-turn"] > span {
|
|
310
|
+
background: var(--md-sys-color-outline-variant);
|
|
311
|
+
transition: height var(--md-fast), scale var(--md-fast), background-color var(--md-state);
|
|
312
|
+
}
|
|
313
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-navigator-turn"]:hover > span,
|
|
314
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-navigator-turn"]:focus-visible > span {
|
|
315
|
+
background: var(--md-sys-color-on-surface-variant);
|
|
316
|
+
}
|
|
317
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-navigator-turn"][data-active="true"] > span {
|
|
318
|
+
background: var(--md-sys-color-primary);
|
|
319
|
+
}
|
|
320
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-navigator"][data-mode="dots"] [data-active="true"] > span {
|
|
321
|
+
height: 12px; /* 11px pitch: still 2px clear of the 6px neighbours */
|
|
322
|
+
scale: 1;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
/* 20 — Navigation drawer --------------------------------------------------- */
|
|
327
|
+
/* Extended FAB: 56px, large corners, primary-container, level 3 */
|
|
328
|
+
:root[data-agy-theme="md3e"] [data-testid="new-conversation-button"] {
|
|
329
|
+
height: 56px;
|
|
330
|
+
margin-bottom: 12px;
|
|
331
|
+
padding: 0 20px 0 16px;
|
|
332
|
+
gap: 12px;
|
|
333
|
+
border: 0;
|
|
334
|
+
border-radius: var(--md-sys-shape-corner-large);
|
|
335
|
+
background: var(--md-sys-color-primary-container);
|
|
336
|
+
box-shadow: var(--md-sys-elevation-level3);
|
|
337
|
+
color: var(--md-sys-color-on-primary-container);
|
|
338
|
+
font: var(--md-sys-typescale-label-large);
|
|
339
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
340
|
+
transition: border-radius var(--md-fast), background-color var(--md-state);
|
|
341
|
+
}
|
|
342
|
+
:root[data-agy-theme="md3e"] [data-testid="new-conversation-button"]:hover {
|
|
343
|
+
background: color-mix(in srgb, var(--md-sys-color-on-primary-container) 8%, var(--md-sys-color-primary-container));
|
|
344
|
+
}
|
|
345
|
+
:root[data-agy-theme="md3e"] [data-testid="new-conversation-button"]:active {
|
|
346
|
+
border-radius: var(--md-sys-shape-corner-medium);
|
|
347
|
+
}
|
|
348
|
+
:root[data-agy-theme="md3e"] [data-testid="new-conversation-button"] svg {
|
|
349
|
+
width: 24px;
|
|
350
|
+
height: 24px;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/* Drawer items: 48px, full pill, label-large */
|
|
354
|
+
:root[data-agy-theme="md3e"] [data-testid="history-button"],
|
|
355
|
+
:root[data-agy-theme="md3e"] [data-testid="automations-button"],
|
|
356
|
+
:root[data-agy-theme="md3e"] [data-testid="settings-button"],
|
|
357
|
+
:root[data-agy-theme="md3e"] [data-testid="new-conversation-button"] ~ a {
|
|
358
|
+
height: 48px;
|
|
359
|
+
padding: 0 16px;
|
|
360
|
+
gap: 12px;
|
|
361
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
362
|
+
font: var(--md-sys-typescale-label-large);
|
|
363
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
364
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
365
|
+
transition: background-color var(--md-state), color var(--md-state);
|
|
366
|
+
}
|
|
367
|
+
:root[data-agy-theme="md3e"] [data-testid="history-button"]:hover,
|
|
368
|
+
:root[data-agy-theme="md3e"] [data-testid="automations-button"]:hover,
|
|
369
|
+
:root[data-agy-theme="md3e"] [data-testid="settings-button"]:hover,
|
|
370
|
+
:root[data-agy-theme="md3e"] [data-testid="new-conversation-button"] ~ a:hover {
|
|
371
|
+
background: var(--md-hover);
|
|
372
|
+
color: var(--md-sys-color-on-surface);
|
|
373
|
+
}
|
|
374
|
+
:root[data-agy-theme="md3e"] [data-testid="history-button"] svg,
|
|
375
|
+
:root[data-agy-theme="md3e"] [data-testid="automations-button"] svg,
|
|
376
|
+
:root[data-agy-theme="md3e"] [data-testid="settings-button"] svg,
|
|
377
|
+
:root[data-agy-theme="md3e"] [data-testid="new-conversation-button"] ~ a svg {
|
|
378
|
+
width: 20px;
|
|
379
|
+
height: 20px;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/* The list as an md-navigation-drawer sheet (the package's AndroidX port):
|
|
383
|
+
destinations inset 12px, group headlines in title-small 16px further in,
|
|
384
|
+
a divider between groups, and every destination a 20px leading icon, its
|
|
385
|
+
label at 48px. Rows are 40px, the drawer item's 56px at desktop density
|
|
386
|
+
(-4); the app's virtual list measures every row, so heights may change. */
|
|
387
|
+
:root[data-agy-theme="md3e"] {
|
|
388
|
+
--agy-icon-chat: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 -960 960 960%27%3E%3Cpath d=%27M240 -240 157 -157Q140 -140 118 -149Q96 -159 96 -183V-792Q96 -822 117 -843Q138 -864 168 -864H792Q822 -864 843 -843Q864 -822 864 -792V-312Q864 -282 843 -261Q822 -240 792 -240ZM210 -312H792Q792 -312 792 -312Q792 -312 792 -312V-792Q792 -792 792 -792Q792 -792 792 -792H168Q168 -792 168 -792Q168 -792 168 -792V-270ZM168 -312V-792Q168 -792 168 -792Q168 -792 168 -792Q168 -792 168 -792Q168 -792 168 -792V-312Q168 -312 168 -312Q168 -312 168 -312Z%27/%3E%3C/svg%3E");
|
|
389
|
+
--agy-icon-chat-fill: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 -960 960 960%27%3E%3Cpath d=%27M240 -240 157 -157Q140 -140 118 -149Q96 -159 96 -183V-792Q96 -822 117 -843Q138 -864 168 -864H792Q822 -864 843 -843Q864 -822 864 -792V-312Q864 -282 843 -261Q822 -240 792 -240ZM210 -312H792Q792 -312 792 -312Q792 -312 792 -312V-792Q792 -792 792 -792Q792 -792 792 -792H168Q168 -792 168 -792Q168 -792 168 -792V-270ZM210 -312 168 -270V-792Q168 -792 168 -792Q168 -792 168 -792H792Q792 -792 792 -792Q792 -792 792 -792V-312Q792 -312 792 -312Q792 -312 792 -312Z%27/%3E%3C/svg%3E");
|
|
390
|
+
--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");
|
|
391
|
+
--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");
|
|
392
|
+
}
|
|
393
|
+
:root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] > .px-2,
|
|
394
|
+
:root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] > .flex.flex-col.gap-px,
|
|
395
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-list-sidebar"] {
|
|
396
|
+
padding-inline: 12px;
|
|
397
|
+
}
|
|
398
|
+
:root[data-agy-theme="md3e"] [role="navigation"][aria-label="Sidebar"] > .h-px {
|
|
399
|
+
margin-inline: 28px;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/* Group headlines (the drawer's .headline): title-small, on-surface-variant;
|
|
403
|
+
the collapse chevron always shown, turning on the spatial spring */
|
|
404
|
+
:root[data-agy-theme="md3e"] [data-testid="section-header"] .group\/section-header {
|
|
405
|
+
height: 48px;
|
|
406
|
+
padding: 0 4px 0 16px;
|
|
407
|
+
}
|
|
408
|
+
:root[data-agy-theme="md3e"] [data-testid$="section-header"] h2 {
|
|
409
|
+
font: var(--md-sys-typescale-title-small);
|
|
410
|
+
letter-spacing: var(--md-sys-typescale-title-small-tracking);
|
|
411
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
412
|
+
opacity: 1;
|
|
413
|
+
}
|
|
414
|
+
:root[data-agy-theme="md3e"] [data-testid="section-header"] h2 svg {
|
|
415
|
+
width: 18px;
|
|
416
|
+
height: 18px;
|
|
417
|
+
margin-left: 4px;
|
|
418
|
+
opacity: 1;
|
|
419
|
+
transition: rotate var(--md-fast);
|
|
420
|
+
}
|
|
421
|
+
/* its actions (sort, new project, new conversation): M3 icon buttons */
|
|
422
|
+
:root[data-agy-theme="md3e"] [data-testid="section-header"] .group\/section-header button[aria-label] {
|
|
423
|
+
width: 32px;
|
|
424
|
+
height: 32px;
|
|
425
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
426
|
+
background: transparent;
|
|
427
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
428
|
+
transition: background-color var(--md-state);
|
|
429
|
+
}
|
|
430
|
+
:root[data-agy-theme="md3e"] [data-testid="section-header"] .group\/section-header button[aria-label]:hover {
|
|
431
|
+
background: var(--md-hover);
|
|
432
|
+
}
|
|
433
|
+
:root[data-agy-theme="md3e"] [data-testid="section-header"] .group\/section-header button[aria-label] svg {
|
|
434
|
+
width: 20px;
|
|
435
|
+
height: 20px;
|
|
436
|
+
}
|
|
437
|
+
/* the 16px spacer between groups (empty, sized inline) carries the divider */
|
|
438
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-list-sidebar"] [data-index] > div[style]:not([class]):empty::before {
|
|
439
|
+
content: "";
|
|
440
|
+
display: block;
|
|
441
|
+
height: 1px;
|
|
442
|
+
margin-inline: 16px;
|
|
443
|
+
transform: translateY(8px);
|
|
444
|
+
background: var(--md-sys-color-outline-variant);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/* Project folders: drawer items of their own; the 24px icon box puts the
|
|
448
|
+
20px folder / folder_open at 16px and the label at 48px */
|
|
449
|
+
:root[data-agy-theme="md3e"] [data-testid="project-header"] {
|
|
450
|
+
height: 40px;
|
|
451
|
+
padding-left: 14px;
|
|
452
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
453
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
454
|
+
font: var(--md-sys-typescale-label-large);
|
|
455
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
456
|
+
transition: background-color var(--md-state);
|
|
457
|
+
}
|
|
458
|
+
:root[data-agy-theme="md3e"] [data-testid="project-header"]:hover {
|
|
459
|
+
background: var(--md-nav-hover);
|
|
460
|
+
}
|
|
461
|
+
:root[data-agy-theme="md3e"] [data-testid="project-header"] > div > div {
|
|
462
|
+
gap: 10px;
|
|
463
|
+
}
|
|
464
|
+
:root[data-agy-theme="md3e"] [data-testid="project-header"] .w-6 svg {
|
|
465
|
+
width: 20px;
|
|
466
|
+
height: 20px;
|
|
467
|
+
}
|
|
468
|
+
:root[data-agy-theme="md3e"] [data-testid="project-header"] span.truncate {
|
|
469
|
+
font: inherit;
|
|
470
|
+
color: var(--md-sys-color-on-surface);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/* Conversation rows. Hover comes from the app's own hover:bg-sidebar-muted,
|
|
474
|
+
now the solid state layer, so the action buttons' fade gradient
|
|
475
|
+
(var(--row-bg)) matches it exactly. */
|
|
476
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"],
|
|
477
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"] > a {
|
|
478
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
479
|
+
}
|
|
480
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"] {
|
|
481
|
+
isolation: isolate;
|
|
482
|
+
min-height: 40px;
|
|
483
|
+
padding: 10px 12px 10px 16px;
|
|
484
|
+
transition: background-color var(--md-state);
|
|
485
|
+
}
|
|
486
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"] span {
|
|
487
|
+
font-weight: 500;
|
|
488
|
+
}
|
|
489
|
+
/* leading icon: chat_bubble, keep when pinned; filled when selected (the
|
|
490
|
+
drawer item's selectedIcon) */
|
|
491
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"]::after {
|
|
492
|
+
content: "";
|
|
493
|
+
order: -1;
|
|
494
|
+
flex: none;
|
|
495
|
+
align-self: center;
|
|
496
|
+
width: 20px;
|
|
497
|
+
height: 20px;
|
|
498
|
+
margin-inline-end: 12px;
|
|
499
|
+
background: var(--md-sys-color-on-surface-variant);
|
|
500
|
+
mask: var(--agy-icon-chat) center / 20px 20px no-repeat;
|
|
501
|
+
pointer-events: none;
|
|
502
|
+
}
|
|
503
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-pinned="true"]::after {
|
|
504
|
+
mask-image: var(--agy-icon-keep);
|
|
505
|
+
}
|
|
506
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-selected="true"]::after {
|
|
507
|
+
background: var(--md-sys-color-on-secondary-container);
|
|
508
|
+
mask-image: var(--agy-icon-chat-fill);
|
|
509
|
+
}
|
|
510
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-selected="true"][data-pinned="true"]::after {
|
|
511
|
+
mask-image: var(--agy-icon-keep-fill);
|
|
512
|
+
}
|
|
513
|
+
/* trailing time ("8d"): label-medium, the drawer item's badge slot */
|
|
514
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"] .min-w-4 {
|
|
515
|
+
font: var(--md-sys-typescale-label-medium);
|
|
516
|
+
letter-spacing: var(--md-sys-typescale-label-medium-tracking);
|
|
517
|
+
font-variant-numeric: tabular-nums;
|
|
518
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
519
|
+
opacity: 1;
|
|
520
|
+
}
|
|
521
|
+
/* a project's conversations: the row (and its pill) starts 32px in, so its
|
|
522
|
+
icon sits under the folder's label; a 1px guide runs down from the folder
|
|
523
|
+
icon on the row's virtual-list slot */
|
|
524
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-indented="true"] {
|
|
525
|
+
width: auto;
|
|
526
|
+
margin-left: 32px;
|
|
527
|
+
padding-left: 16px;
|
|
528
|
+
}
|
|
529
|
+
:root[data-agy-theme="md3e"] [data-sidebar-row-id]:has([data-indented="true"]) {
|
|
530
|
+
background: linear-gradient(var(--md-sys-color-outline-variant), var(--md-sys-color-outline-variant)) 25px 0 / 1px 100% no-repeat;
|
|
531
|
+
}
|
|
532
|
+
/* the action group (kebab, pin, archive) sat 4px past the row's end with
|
|
533
|
+
square corners; keep it inside the pill (Tailwind class hook) */
|
|
534
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"] .pl-6.justify-end {
|
|
535
|
+
right: 0;
|
|
536
|
+
border-radius: 0 var(--md-sys-shape-corner-full) var(--md-sys-shape-corner-full) 0;
|
|
537
|
+
}
|
|
538
|
+
/* Active indicator: a pill behind the row that springs open sideways */
|
|
539
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-selected="true"] {
|
|
540
|
+
background: transparent;
|
|
541
|
+
}
|
|
542
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-selected="true"]::before {
|
|
543
|
+
content: "";
|
|
544
|
+
position: absolute;
|
|
545
|
+
inset: 0;
|
|
546
|
+
z-index: -1;
|
|
547
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
548
|
+
background: var(--md-sys-color-secondary-container);
|
|
549
|
+
animation: agy-md-indicator var(--md-fast) both;
|
|
550
|
+
}
|
|
551
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-selected="true"] span {
|
|
552
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
553
|
+
font-weight: 700;
|
|
554
|
+
}
|
|
555
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-selected="true"] .min-w-4 {
|
|
556
|
+
font-weight: 500;
|
|
557
|
+
}
|
|
558
|
+
@keyframes agy-md-indicator {
|
|
559
|
+
from { transform: scaleX(0.4); opacity: 0; }
|
|
560
|
+
to { transform: none; opacity: 1; }
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
/* 30 — Body ---------------------------------------------------------------- */
|
|
565
|
+
:root[data-agy-theme="md3e"] [role="article"] .leading-relaxed { /* app class: prose wrapper */
|
|
566
|
+
font: var(--md-sys-typescale-body-large);
|
|
567
|
+
letter-spacing: var(--md-sys-typescale-body-large-tracking);
|
|
568
|
+
}
|
|
569
|
+
:root[data-agy-theme="md3e"] [role="article"] h1,
|
|
570
|
+
:root[data-agy-theme="md3e"] [role="article"] h2 {
|
|
571
|
+
font: var(--md-sys-typescale-headline-small);
|
|
572
|
+
color: var(--md-sys-color-on-surface);
|
|
573
|
+
}
|
|
574
|
+
:root[data-agy-theme="md3e"] [role="article"] h3 {
|
|
575
|
+
font: var(--md-sys-typescale-title-large);
|
|
576
|
+
color: var(--md-sys-color-on-surface);
|
|
577
|
+
}
|
|
578
|
+
:root[data-agy-theme="md3e"] [role="article"] a {
|
|
579
|
+
text-decoration: underline;
|
|
580
|
+
text-underline-offset: 3px;
|
|
581
|
+
}
|
|
582
|
+
:root[data-agy-theme="md3e"] [role="article"] pre > div {
|
|
583
|
+
border: 0;
|
|
584
|
+
border-radius: var(--md-sys-shape-corner-large);
|
|
585
|
+
background: var(--md-sys-color-surface-container);
|
|
586
|
+
--agy-lineno: var(--md-sys-color-outline); /* code-tools.js line numbers */
|
|
587
|
+
}
|
|
588
|
+
/* Its header buttons (Copy code, Insert in terminal, At mention, and
|
|
589
|
+
code-tools.js's Wrap lines / Line numbers): 28px M3 standard icon buttons
|
|
590
|
+
with a state layer, the row's 28px height kept; a toggle that is on is
|
|
591
|
+
primary (M3 selected icon button), and the two tool glyphs take the
|
|
592
|
+
Rounded shapes, as md3e-icons.css does for the app's */
|
|
593
|
+
:root[data-agy-theme="md3e"] .agy-code > :first-child > :last-child {
|
|
594
|
+
gap: 0;
|
|
595
|
+
}
|
|
596
|
+
:root[data-agy-theme="md3e"] .agy-code > :first-child > :last-child > button {
|
|
597
|
+
display: inline-flex;
|
|
598
|
+
align-items: center;
|
|
599
|
+
justify-content: center;
|
|
600
|
+
width: 28px;
|
|
601
|
+
height: 28px;
|
|
602
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
603
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
604
|
+
transition: background-color var(--md-state), color var(--md-state);
|
|
605
|
+
}
|
|
606
|
+
:root[data-agy-theme="md3e"] .agy-code > :first-child > :last-child > button:hover {
|
|
607
|
+
background: var(--md-hover);
|
|
608
|
+
color: var(--md-sys-color-on-surface);
|
|
609
|
+
}
|
|
610
|
+
:root[data-agy-theme="md3e"] .agy-code > :first-child > :last-child > button:active,
|
|
611
|
+
:root[data-agy-theme="md3e"] .agy-code > :first-child > :last-child > button:focus-visible {
|
|
612
|
+
background: var(--md-press);
|
|
613
|
+
}
|
|
614
|
+
:root[data-agy-theme="md3e"] .agy-code > :first-child > :last-child > button > svg {
|
|
615
|
+
width: 16px;
|
|
616
|
+
height: 16px;
|
|
617
|
+
}
|
|
618
|
+
:root[data-agy-theme="md3e"] .agy-code > :first-child > :last-child > .agy-code-tool[aria-pressed="true"] {
|
|
619
|
+
color: var(--md-sys-color-primary);
|
|
620
|
+
}
|
|
621
|
+
:root[data-agy-theme="md3e"] .agy-code-tool[data-tool="wrap"] path {
|
|
622
|
+
d: path("M228 -510Q213 -510 202 -520Q192 -531 192 -546Q192 -561 202 -572Q213 -582 228 -582H672Q732 -582 774 -540Q816 -498 816 -438Q816 -378 774 -336Q732 -294 672 -294H570L596 -268Q607 -257 607 -242Q607 -228 596 -217Q585 -206 570 -206Q556 -206 545 -217L457 -305Q452 -310 449 -316Q447 -322 447 -330Q447 -338 449 -344Q452 -350 457 -355L545 -443Q556 -454 570 -454Q584 -454 595 -443Q606 -432 606 -418Q606 -403 595 -392L569 -366H672Q702 -366 723 -387Q744 -408 744 -438Q744 -468 723 -489Q702 -510 672 -510ZM228 -294Q213 -294 202 -304Q192 -315 192 -330Q192 -345 202 -356Q213 -366 228 -366H348Q363 -366 374 -356Q384 -345 384 -330Q384 -315 374 -304Q363 -294 348 -294ZM228 -726Q213 -726 202 -736Q192 -747 192 -762Q192 -777 202 -788Q213 -798 228 -798H732Q747 -798 758 -788Q768 -777 768 -762Q768 -747 758 -736Q747 -726 732 -726Z");
|
|
623
|
+
}
|
|
624
|
+
:root[data-agy-theme="md3e"] .agy-code-tool[data-tool="lines"] path {
|
|
625
|
+
d: path("M168 -144Q158 -144 151 -151Q144 -158 144 -168Q144 -178 151 -185Q158 -192 168 -192H240V-216H216Q206 -216 199 -223Q192 -230 192 -240Q192 -250 199 -257Q206 -264 216 -264H240V-288H168Q158 -288 151 -295Q144 -302 144 -312Q144 -322 151 -329Q158 -336 168 -336H264Q274 -336 281 -329Q288 -322 288 -312V-264Q288 -254 281 -247Q274 -240 264 -240Q274 -240 281 -233Q288 -226 288 -216V-168Q288 -158 281 -151Q274 -144 264 -144ZM171 -384Q160 -384 152 -392Q144 -400 144 -411V-480Q144 -490 151 -497Q158 -504 168 -504H240V-528H168Q158 -528 151 -535Q144 -542 144 -552Q144 -562 151 -569Q158 -576 168 -576H264Q274 -576 281 -569Q288 -562 288 -552V-480Q288 -470 281 -463Q274 -456 264 -456H192V-432H264Q274 -432 281 -425Q288 -418 288 -408Q288 -398 281 -391Q274 -384 264 -384ZM192 -648V-768H168Q158 -768 151 -775Q144 -782 144 -792Q144 -802 151 -809Q158 -816 168 -816H213Q224 -816 232 -808Q240 -800 240 -789V-648Q240 -638 233 -631Q226 -624 216 -624Q206 -624 199 -631Q192 -638 192 -648ZM396 -240Q381 -240 370 -250Q360 -261 360 -276Q360 -291 370 -302Q381 -312 396 -312H780Q795 -312 806 -302Q816 -291 816 -276Q816 -261 806 -250Q795 -240 780 -240ZM396 -444Q381 -444 370 -454Q360 -465 360 -480Q360 -495 370 -506Q381 -516 396 -516H780Q795 -516 806 -506Q816 -495 816 -480Q816 -465 806 -454Q795 -444 780 -444ZM396 -648Q381 -648 370 -658Q360 -669 360 -684Q360 -699 370 -710Q381 -720 396 -720H780Q795 -720 806 -710Q816 -699 816 -684Q816 -669 806 -658Q795 -648 780 -648Z");
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/* User turn: primary-container bubble, asymmetric corner */
|
|
629
|
+
:root[data-agy-theme="md3e"] [data-testid="user-input-step"] .bg-card-border {
|
|
630
|
+
padding: 0;
|
|
631
|
+
border-radius: 24px 24px 6px 24px;
|
|
632
|
+
background: transparent;
|
|
633
|
+
}
|
|
634
|
+
:root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] {
|
|
635
|
+
padding: 12px 18px;
|
|
636
|
+
border-radius: 24px 24px 6px 24px;
|
|
637
|
+
background: var(--md-sys-color-primary-container);
|
|
638
|
+
color: var(--md-sys-color-on-primary-container);
|
|
639
|
+
}
|
|
640
|
+
:root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] .whitespace-pre-wrap {
|
|
641
|
+
font: var(--md-sys-typescale-body-large);
|
|
642
|
+
letter-spacing: var(--md-sys-typescale-body-large-tracking);
|
|
643
|
+
}
|
|
644
|
+
/* Its hover actions (time, Copy, Undo): a small M3 floating toolbar. The app
|
|
645
|
+
draws a 25px halo in the card color (user-input-buttons-shadow) to fade
|
|
646
|
+
into a card-colored bubble; on the primary-container bubble that halo
|
|
647
|
+
read as a dark smudge, so the toolbar gets its own surface and level 1 */
|
|
648
|
+
:root[data-agy-theme="md3e"] .user-input-buttons-container { /* app class */
|
|
649
|
+
right: 6px;
|
|
650
|
+
bottom: 6px;
|
|
651
|
+
gap: 0;
|
|
652
|
+
padding: 0 4px 0 12px;
|
|
653
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
654
|
+
background: var(--md-sys-color-surface-container-high);
|
|
655
|
+
box-shadow: var(--md-sys-elevation-level1);
|
|
656
|
+
}
|
|
657
|
+
:root[data-agy-theme="md3e"] .user-input-buttons-container > span {
|
|
658
|
+
margin-right: 4px;
|
|
659
|
+
font: var(--md-sys-typescale-label-medium);
|
|
660
|
+
letter-spacing: var(--md-sys-typescale-label-medium-tracking);
|
|
661
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/* Standard icon buttons, 32px circle and state layer: the user message's
|
|
665
|
+
hover actions and the queued messages' Send now / Edit / Delete (the
|
|
666
|
+
app's ghost icon-sm buttons, square hover) */
|
|
667
|
+
:root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] .user-input-buttons-container > button,
|
|
668
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-card"] .flex-shrink-0 button,
|
|
669
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-expand-button"] {
|
|
670
|
+
display: inline-flex;
|
|
671
|
+
align-items: center;
|
|
672
|
+
justify-content: center;
|
|
673
|
+
width: 32px;
|
|
674
|
+
height: 32px;
|
|
675
|
+
padding: 0;
|
|
676
|
+
border: 0;
|
|
677
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
678
|
+
background: transparent;
|
|
679
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
680
|
+
transition: background-color var(--md-state), color var(--md-state);
|
|
681
|
+
}
|
|
682
|
+
:root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] .user-input-buttons-container > button:hover,
|
|
683
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-card"] .flex-shrink-0 button:hover,
|
|
684
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-expand-button"]:hover {
|
|
685
|
+
background: var(--md-hover);
|
|
686
|
+
color: var(--md-sys-color-on-surface);
|
|
687
|
+
}
|
|
688
|
+
:root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] .user-input-buttons-container > button:active,
|
|
689
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-card"] .flex-shrink-0 button:active,
|
|
690
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-expand-button"]:active,
|
|
691
|
+
:root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] .user-input-buttons-container > button:focus-visible,
|
|
692
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-card"] .flex-shrink-0 button:focus-visible,
|
|
693
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-expand-button"]:focus-visible {
|
|
694
|
+
background: var(--md-press);
|
|
695
|
+
color: var(--md-sys-color-on-surface);
|
|
696
|
+
}
|
|
697
|
+
:root[data-agy-theme="md3e"] [data-testid="user-message-bubble"] .user-input-buttons-container > button > svg,
|
|
698
|
+
:root[data-agy-theme="md3e"] [data-testid="queued-messages-card"] .flex-shrink-0 button > svg {
|
|
699
|
+
width: 18px;
|
|
700
|
+
height: 18px;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/* Agent steps (collapsibles and the step rows sharing their classes) as
|
|
704
|
+
M3 text buttons */
|
|
705
|
+
:root[data-agy-theme="md3e"] [data-testid="thinking-collapsible-trigger"],
|
|
706
|
+
:root[data-agy-theme="md3e"] [data-testid="worked-for-collapsible"],
|
|
707
|
+
:root[data-agy-theme="md3e"] [data-testid="tool-group-collapsible"],
|
|
708
|
+
:root[data-agy-theme="md3e"] [role="article"] button.tabular-nums.min-h-8 { /* class hook */
|
|
709
|
+
width: fit-content;
|
|
710
|
+
min-height: 32px;
|
|
711
|
+
padding: 0 12px;
|
|
712
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
713
|
+
font: var(--md-sys-typescale-label-large);
|
|
714
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
715
|
+
color: var(--md-sys-color-primary);
|
|
716
|
+
transition: background-color var(--md-state);
|
|
717
|
+
}
|
|
718
|
+
:root[data-agy-theme="md3e"] [data-testid="thinking-collapsible-trigger"] > span,
|
|
719
|
+
:root[data-agy-theme="md3e"] [data-testid="worked-for-collapsible"] > span,
|
|
720
|
+
:root[data-agy-theme="md3e"] [data-testid="tool-group-collapsible"] > span,
|
|
721
|
+
:root[data-agy-theme="md3e"] [role="article"] button.tabular-nums.min-h-8 > span,
|
|
722
|
+
:root[data-agy-theme="md3e"] [role="article"] button.tabular-nums.min-h-8 > div,
|
|
723
|
+
:root[data-agy-theme="md3e"] [role="article"] button.tabular-nums.min-h-8 > div > span,
|
|
724
|
+
:root[data-agy-theme="md3e"] [role="article"] button.tabular-nums.min-h-8 > svg {
|
|
725
|
+
color: inherit;
|
|
726
|
+
}
|
|
727
|
+
:root[data-agy-theme="md3e"] [data-testid="thinking-collapsible-trigger"]:hover,
|
|
728
|
+
:root[data-agy-theme="md3e"] [data-testid="worked-for-collapsible"]:hover,
|
|
729
|
+
:root[data-agy-theme="md3e"] [data-testid="tool-group-collapsible"]:hover,
|
|
730
|
+
:root[data-agy-theme="md3e"] [role="article"] button.tabular-nums.min-h-8:hover {
|
|
731
|
+
background: var(--md-primary-hover);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
/* "Working" / "Compacting": the package's loading indicator (put in front
|
|
735
|
+
by loading-indicator.js) carries the motion, so the app's shimmer sweep
|
|
736
|
+
stops and the text is plain label-large */
|
|
737
|
+
:root[data-agy-theme="md3e"] [data-testid="agent-loading"] .animate-shimmer-text {
|
|
738
|
+
animation: none;
|
|
739
|
+
mask-image: none;
|
|
740
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
741
|
+
font: var(--md-sys-typescale-label-large);
|
|
742
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
743
|
+
}
|
|
744
|
+
:root[data-agy-theme="md3e"] [data-testid="agent-loading"] > .agy-loader {
|
|
745
|
+
flex: none;
|
|
746
|
+
margin-inline-end: 8px;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/* Running work: the package's wavy progress indicator (progress-indicators.js).
|
|
750
|
+
A running Background Commands row grows by the wave's 10px and carries it
|
|
751
|
+
along its bottom edge, under the label (past the 16px glyph); the glyph's
|
|
752
|
+
blinking caret (inline animation) stops, so the wave is the one thing
|
|
753
|
+
moving. The "N tasks running" status gets a short wave and loses its
|
|
754
|
+
shimmer. */
|
|
755
|
+
:root[data-agy-theme="md3e"] [data-testid="background-task-row"]:has(> .agy-progress) {
|
|
756
|
+
height: 42px;
|
|
757
|
+
padding-bottom: 10px;
|
|
758
|
+
}
|
|
759
|
+
:root[data-agy-theme="md3e"] [data-testid="background-task-row"] > .agy-progress {
|
|
760
|
+
position: absolute;
|
|
761
|
+
left: 30px;
|
|
762
|
+
right: 8px;
|
|
763
|
+
bottom: 2px;
|
|
764
|
+
width: auto;
|
|
765
|
+
}
|
|
766
|
+
:root[data-agy-theme="md3e"] [data-testid="status-task-running"] [data-agent-state-caret] {
|
|
767
|
+
animation: none !important;
|
|
768
|
+
}
|
|
769
|
+
:root[data-agy-theme="md3e"] [data-testid="idle-status-text"] > .agy-progress {
|
|
770
|
+
flex: none;
|
|
771
|
+
width: 40px;
|
|
772
|
+
margin-inline-end: 8px;
|
|
773
|
+
}
|
|
774
|
+
:root[data-agy-theme="md3e"] [data-testid="idle-status-text"] .animate-shimmer-text {
|
|
775
|
+
animation: none;
|
|
776
|
+
mask-image: none;
|
|
777
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
/* Turn actions: 40px standard icon buttons */
|
|
781
|
+
:root[data-agy-theme="md3e"] [role="article"] [aria-label="Copy"],
|
|
782
|
+
:root[data-agy-theme="md3e"] [role="article"] [aria-label="Good response"],
|
|
783
|
+
:root[data-agy-theme="md3e"] [role="article"] [aria-label="Bad response"] {
|
|
784
|
+
width: 40px;
|
|
785
|
+
height: 40px;
|
|
786
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
787
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
788
|
+
transition: background-color var(--md-state);
|
|
789
|
+
}
|
|
790
|
+
:root[data-agy-theme="md3e"] [role="article"] [aria-label="Copy"]:hover,
|
|
791
|
+
:root[data-agy-theme="md3e"] [role="article"] [aria-label="Good response"]:hover,
|
|
792
|
+
:root[data-agy-theme="md3e"] [role="article"] [aria-label="Bad response"]:hover {
|
|
793
|
+
background: var(--md-hover);
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
/* "N files changed": outlined card; Review: tonal button */
|
|
797
|
+
:root[data-agy-theme="md3e"] .files-changed-header { /* app class */
|
|
798
|
+
min-height: 56px;
|
|
799
|
+
padding: 8px 8px 8px 16px;
|
|
800
|
+
border: 1px solid var(--md-sys-color-outline-variant);
|
|
801
|
+
border-radius: var(--md-sys-shape-corner-medium);
|
|
802
|
+
background: transparent;
|
|
803
|
+
font: var(--md-sys-typescale-body-medium);
|
|
804
|
+
}
|
|
805
|
+
:root[data-agy-theme="md3e"] .files-changed-header > button {
|
|
806
|
+
height: 40px;
|
|
807
|
+
padding: 0 16px;
|
|
808
|
+
border: 0;
|
|
809
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
810
|
+
background: var(--md-sys-color-secondary-container);
|
|
811
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
812
|
+
font: var(--md-sys-typescale-label-large);
|
|
813
|
+
transition: background-color var(--md-state);
|
|
814
|
+
}
|
|
815
|
+
/* Review keeps its pill when pressed: the press shape change (pill -> 8px)
|
|
816
|
+
flashed a dark rounded rectangle behind the label. The press shows as
|
|
817
|
+
the M3 state layer instead. */
|
|
818
|
+
:root[data-agy-theme="md3e"] .files-changed-header > button:hover {
|
|
819
|
+
background: color-mix(in srgb, var(--md-sys-color-on-secondary-container) 8%, var(--md-sys-color-secondary-container));
|
|
820
|
+
}
|
|
821
|
+
:root[data-agy-theme="md3e"] .files-changed-header > button:active {
|
|
822
|
+
background: color-mix(in srgb, var(--md-sys-color-on-secondary-container) 10%, var(--md-sys-color-secondary-container));
|
|
823
|
+
}
|
|
824
|
+
/* Expansion: theme-host.js animates the file list both ways on the same M3
|
|
825
|
+
Expressive springs (the app mounts and unmounts it at once). Opening used
|
|
826
|
+
to be a CSS transition to auto here (300ms emphasized from
|
|
827
|
+
@starting-style), which read as a jump next to the slower close. The
|
|
828
|
+
chevron turns on the package's overshoot curve. */
|
|
829
|
+
:root[data-agy-theme="md3e"] [data-testid="changed-files-card-header"] svg.transition-transform {
|
|
830
|
+
transition: rotate 300ms cubic-bezier(0.2, 0, 0, 1.2), transform 300ms cubic-bezier(0.2, 0, 0, 1.2);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/* Scroll to bottom: small FAB. The app fades it and slides it 16px (inline
|
|
834
|
+
transition, hence !important); M3 FABs scale in and out. scale is its own
|
|
835
|
+
property, so the app's inline translate stays intact, and scale, opacity
|
|
836
|
+
and transform run on the compositor: they keep going while the app's
|
|
837
|
+
click handler holds the main thread. */
|
|
838
|
+
:root[data-agy-theme="md3e"] [aria-label="Scroll to Bottom"] {
|
|
839
|
+
width: 40px;
|
|
840
|
+
height: 40px;
|
|
841
|
+
border: 0;
|
|
842
|
+
border-radius: var(--md-sys-shape-corner-medium);
|
|
843
|
+
background: var(--md-sys-color-surface-container-high);
|
|
844
|
+
box-shadow: var(--md-sys-elevation-level3);
|
|
845
|
+
color: var(--md-sys-color-primary);
|
|
846
|
+
transition:
|
|
847
|
+
scale var(--md-fast),
|
|
848
|
+
transform var(--md-fast),
|
|
849
|
+
opacity var(--md-color-fast),
|
|
850
|
+
border-radius var(--md-fast),
|
|
851
|
+
background-color var(--md-state),
|
|
852
|
+
margin-left 500ms var(--ease-expo-out) !important;
|
|
853
|
+
}
|
|
854
|
+
:root[data-agy-theme="md3e"] [aria-label="Scroll to Bottom"].opacity-0 {
|
|
855
|
+
scale: 0.4;
|
|
856
|
+
}
|
|
857
|
+
:root[data-agy-theme="md3e"] [aria-label="Scroll to Bottom"]:active {
|
|
858
|
+
border-radius: var(--md-sys-shape-corner-small);
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
/* 40 — Composer: floating dock --------------------------------------------- */
|
|
863
|
+
/* Focus is a container-tone change (M3 search bar), not a ring */
|
|
864
|
+
:root[data-agy-theme="md3e"] [id="antigravity.agentSidePanelInputBox"] {
|
|
865
|
+
border-radius: var(--md-sys-shape-corner-extra-large);
|
|
866
|
+
background: transparent;
|
|
867
|
+
box-shadow: var(--md-sys-elevation-level3);
|
|
868
|
+
}
|
|
869
|
+
:root[data-agy-theme="md3e"] [id="antigravity.agentSidePanelInputBox"] > div {
|
|
870
|
+
padding: 8px;
|
|
871
|
+
border-radius: var(--md-sys-shape-corner-extra-large);
|
|
872
|
+
background: var(--md-sys-color-surface-container-high);
|
|
873
|
+
transition: background-color var(--md-color-fast);
|
|
874
|
+
}
|
|
875
|
+
:root[data-agy-theme="md3e"] [id="antigravity.agentSidePanelInputBox"]:focus-within > div {
|
|
876
|
+
background: var(--md-sys-color-surface-container-highest);
|
|
877
|
+
}
|
|
878
|
+
:root[data-agy-theme="md3e"] [aria-label="Message input"][contenteditable] {
|
|
879
|
+
padding: 12px 16px 8px;
|
|
880
|
+
font: var(--md-sys-typescale-body-large);
|
|
881
|
+
letter-spacing: var(--md-sys-typescale-body-large-tracking);
|
|
882
|
+
color: var(--md-sys-color-on-surface);
|
|
883
|
+
caret-color: var(--md-sys-color-primary);
|
|
884
|
+
}
|
|
885
|
+
:root[data-agy-theme="md3e"] [aria-label="Message input"][contenteditable] + p {
|
|
886
|
+
top: 12px;
|
|
887
|
+
left: 16px;
|
|
888
|
+
right: 16px;
|
|
889
|
+
font: var(--md-sys-typescale-body-large);
|
|
890
|
+
letter-spacing: var(--md-sys-typescale-body-large-tracking);
|
|
891
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
892
|
+
opacity: 1;
|
|
893
|
+
}
|
|
894
|
+
:root[data-agy-theme="md3e"] [aria-label="Add context"],
|
|
895
|
+
:root[data-agy-theme="md3e"] [aria-label="Record voice memo"] {
|
|
896
|
+
width: 40px;
|
|
897
|
+
height: 40px;
|
|
898
|
+
padding: 10px;
|
|
899
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
900
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
901
|
+
transition: background-color var(--md-state);
|
|
902
|
+
}
|
|
903
|
+
:root[data-agy-theme="md3e"] [aria-label="Add context"]:hover,
|
|
904
|
+
:root[data-agy-theme="md3e"] [aria-label="Record voice memo"]:hover {
|
|
905
|
+
background: var(--md-hover);
|
|
906
|
+
}
|
|
907
|
+
/* Model and mode selectors: md-button, tonal, size xs (32px, 16px padding,
|
|
908
|
+
8px icon gap, label-large; round 16 -> 8 on press). While the menu is
|
|
909
|
+
open the button holds the square shape (12) and its arrow turns over. */
|
|
910
|
+
:root[data-agy-theme="md3e"] [data-testid="model-selector-trigger"],
|
|
911
|
+
:root[data-agy-theme="md3e"] [data-testid="permissions-selector-trigger"] {
|
|
912
|
+
height: 32px;
|
|
913
|
+
padding-inline: 16px 12px;
|
|
914
|
+
gap: 8px;
|
|
915
|
+
border: 0;
|
|
916
|
+
border-radius: 16px;
|
|
917
|
+
background: var(--md-sys-color-secondary-container);
|
|
918
|
+
box-shadow: var(--md-sys-elevation-level0, none);
|
|
919
|
+
font: var(--md-sys-typescale-label-large);
|
|
920
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
921
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
922
|
+
transition:
|
|
923
|
+
border-radius var(--md-fast),
|
|
924
|
+
box-shadow var(--md-color-fast),
|
|
925
|
+
background-color var(--md-state);
|
|
926
|
+
}
|
|
927
|
+
:root[data-agy-theme="md3e"] [data-testid="model-selector-trigger"]:hover,
|
|
928
|
+
:root[data-agy-theme="md3e"] [data-testid="permissions-selector-trigger"]:hover {
|
|
929
|
+
background: color-mix(in srgb, var(--md-sys-color-on-secondary-container) 8%, var(--md-sys-color-secondary-container));
|
|
930
|
+
box-shadow: var(--md-sys-elevation-level1);
|
|
931
|
+
}
|
|
932
|
+
:root[data-agy-theme="md3e"] [data-testid="model-selector-trigger"][aria-expanded="true"],
|
|
933
|
+
:root[data-agy-theme="md3e"] [data-testid="permissions-selector-trigger"][aria-expanded="true"] {
|
|
934
|
+
border-radius: 12px;
|
|
935
|
+
}
|
|
936
|
+
:root[data-agy-theme="md3e"] [data-testid="model-selector-trigger"]:active,
|
|
937
|
+
:root[data-agy-theme="md3e"] [data-testid="permissions-selector-trigger"]:active {
|
|
938
|
+
border-radius: 8px;
|
|
939
|
+
}
|
|
940
|
+
:root[data-agy-theme="md3e"] [data-testid="model-selector-trigger"] > svg:last-child,
|
|
941
|
+
:root[data-agy-theme="md3e"] [data-testid="permissions-selector-trigger"] > svg:last-child {
|
|
942
|
+
width: 18px;
|
|
943
|
+
height: 18px;
|
|
944
|
+
transition: rotate var(--md-fast);
|
|
945
|
+
}
|
|
946
|
+
:root[data-agy-theme="md3e"] [data-testid="model-selector-trigger"][aria-expanded="true"] > svg:last-child,
|
|
947
|
+
:root[data-agy-theme="md3e"] [data-testid="permissions-selector-trigger"][aria-expanded="true"] > svg:last-child {
|
|
948
|
+
rotate: 180deg;
|
|
949
|
+
}
|
|
950
|
+
/* Send and stop: one 40px icon button in two states, as md-icon-button
|
|
951
|
+
(size s) does it. Send is round; while the agent runs, stop is the
|
|
952
|
+
"selected" square (12px). The app swaps the two elements, so each one
|
|
953
|
+
enters by morphing from the other's shape (@starting-style), with a
|
|
954
|
+
scale that stays on the compositor. Press: corners spring to 8px. */
|
|
955
|
+
:root[data-agy-theme="md3e"] [data-testid="send-button"],
|
|
956
|
+
:root[data-agy-theme="md3e"] [data-tooltip-id="input-send-button-cancel-tooltip"] {
|
|
957
|
+
width: 40px;
|
|
958
|
+
height: 40px;
|
|
959
|
+
transition: border-radius var(--md-fast), scale var(--md-fast), background-color var(--md-state);
|
|
960
|
+
}
|
|
961
|
+
:root[data-agy-theme="md3e"] [data-testid="send-button"] {
|
|
962
|
+
padding: 10px;
|
|
963
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
964
|
+
}
|
|
965
|
+
:root[data-agy-theme="md3e"] [data-tooltip-id="input-send-button-cancel-tooltip"] {
|
|
966
|
+
border-radius: var(--md-sys-shape-corner-medium);
|
|
967
|
+
background: var(--md-sys-color-error-container);
|
|
968
|
+
}
|
|
969
|
+
@starting-style {
|
|
970
|
+
:root[data-agy-theme="md3e"] [data-testid="send-button"] {
|
|
971
|
+
border-radius: var(--md-sys-shape-corner-medium);
|
|
972
|
+
scale: 0.8;
|
|
973
|
+
}
|
|
974
|
+
:root[data-agy-theme="md3e"] [data-tooltip-id="input-send-button-cancel-tooltip"] {
|
|
975
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
976
|
+
scale: 0.8;
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
:root[data-agy-theme="md3e"] [data-testid="send-button"]:active,
|
|
980
|
+
:root[data-agy-theme="md3e"] [data-tooltip-id="input-send-button-cancel-tooltip"]:active {
|
|
981
|
+
border-radius: 8px;
|
|
982
|
+
}
|
|
983
|
+
:root[data-agy-theme="md3e"] [data-tooltip-id="input-send-button-cancel-tooltip"] .bg-red-500 { /* Tailwind class hook */
|
|
984
|
+
background: var(--md-sys-color-on-error-container);
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
|
|
988
|
+
/* 50 — Menus, tooltips, side sheet ---------------------------------------- */
|
|
989
|
+
/* Menus are md-menu as the package builds it (menu-layout.js, a port of the
|
|
990
|
+
Compose menu). The app's Base UI menus keep their logic and keyboard
|
|
991
|
+
handling; only the anatomy changes:
|
|
992
|
+
- the popup draws no surface; its rows do, as groups 2px apart (the app's
|
|
993
|
+
separators become the gaps), corners 16 outside and 8 between groups,
|
|
994
|
+
one elevation-2 shadow over all of them
|
|
995
|
+
- items sit 4px inside their group: 44px, label-large, corners 4 (12 at
|
|
996
|
+
the ends of a group); hover/press are 8%/10% state layers
|
|
997
|
+
- the selected item is a tertiary-container pill (12) whose check slides
|
|
998
|
+
in at the start, in place of a leading icon
|
|
999
|
+
- group headers are label-large, 32px */
|
|
1000
|
+
:root[data-agy-theme="md3e"] [role="menu"] {
|
|
1001
|
+
--color-card: var(--md-sys-color-surface-container-low); /* the app's in-menu fades */
|
|
1002
|
+
padding: 0;
|
|
1003
|
+
gap: 0;
|
|
1004
|
+
border: 0;
|
|
1005
|
+
border-radius: 0;
|
|
1006
|
+
background: transparent;
|
|
1007
|
+
box-shadow: none;
|
|
1008
|
+
backdrop-filter: none;
|
|
1009
|
+
filter: drop-shadow(0 1px 2px rgb(0 0 0 / 0.3)) drop-shadow(0 2px 6px rgb(0 0 0 / 0.15));
|
|
1010
|
+
color: var(--md-sys-color-on-surface);
|
|
1011
|
+
font-family: var(--md-sys-typescale-font-family);
|
|
1012
|
+
}
|
|
1013
|
+
/* rows: the children of the popup, of a menu group, and of the model panel */
|
|
1014
|
+
: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"]) {
|
|
1015
|
+
overflow: clip;
|
|
1016
|
+
border-radius: 0;
|
|
1017
|
+
background: var(--md-sys-color-surface-container-low);
|
|
1018
|
+
}
|
|
1019
|
+
:root[data-agy-theme="md3e"] [role="menu"] > [role="group"],
|
|
1020
|
+
:root[data-agy-theme="md3e"] [data-testid="model-selector-panel"] {
|
|
1021
|
+
gap: 0;
|
|
1022
|
+
padding: 0;
|
|
1023
|
+
background: transparent;
|
|
1024
|
+
}
|
|
1025
|
+
:root[data-agy-theme="md3e"] :is([role="menu"], [role="menu"] > [role="group"], [data-testid="model-selector-panel"]) > :first-child {
|
|
1026
|
+
border-start-start-radius: 16px;
|
|
1027
|
+
border-start-end-radius: 16px;
|
|
1028
|
+
}
|
|
1029
|
+
:root[data-agy-theme="md3e"] :is([role="menu"], [role="menu"] > [role="group"], [data-testid="model-selector-panel"]) > :last-child {
|
|
1030
|
+
border-end-start-radius: 16px;
|
|
1031
|
+
border-end-end-radius: 16px;
|
|
1032
|
+
}
|
|
1033
|
+
:root[data-agy-theme="md3e"] :is([role="menu"], [role="menu"] > [role="group"], [data-testid="model-selector-panel"]) > [role="separator"] + * {
|
|
1034
|
+
border-start-start-radius: 8px;
|
|
1035
|
+
border-start-end-radius: 8px;
|
|
1036
|
+
}
|
|
1037
|
+
:root[data-agy-theme="md3e"] :is([role="menu"], [role="menu"] > [role="group"], [data-testid="model-selector-panel"]) > :has(+ [role="separator"]) {
|
|
1038
|
+
border-end-start-radius: 8px;
|
|
1039
|
+
border-end-end-radius: 8px;
|
|
1040
|
+
}
|
|
1041
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role="separator"] {
|
|
1042
|
+
height: 2px;
|
|
1043
|
+
margin: 0;
|
|
1044
|
+
background: transparent;
|
|
1045
|
+
}
|
|
1046
|
+
/* group headers: Base UI group labels, the model list's "Model", the mode
|
|
1047
|
+
menu's "<Project> Settings" row */
|
|
1048
|
+
:root[data-agy-theme="md3e"] [role="menu"] .text-xs.text-muted-foreground.font-medium,
|
|
1049
|
+
:root[data-agy-theme="md3e"] [role="menu"] > [role="group"] > div:not([role]):first-child {
|
|
1050
|
+
display: flex;
|
|
1051
|
+
align-items: center;
|
|
1052
|
+
min-height: 32px;
|
|
1053
|
+
padding: 0 4px 0 12px;
|
|
1054
|
+
font: var(--md-sys-typescale-label-large);
|
|
1055
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
1056
|
+
color: var(--md-sys-color-on-surface);
|
|
1057
|
+
}
|
|
1058
|
+
:root[data-agy-theme="md3e"] [role="menu"] > [role="group"] > div:not([role]):first-child .text-xs {
|
|
1059
|
+
font: inherit;
|
|
1060
|
+
color: inherit;
|
|
1061
|
+
}
|
|
1062
|
+
/* Popup motion, as md-menu does it: scale 0.8 -> 1 from the anchor corner on
|
|
1063
|
+
the expressive fast-spatial spring, alpha on fast-effects; closing returns
|
|
1064
|
+
to 0.8 / 0, both on fast-effects so the menu is gone as soon as it is
|
|
1065
|
+
invisible. The app's popups (.animate-slideIn, Base UI) start at a small
|
|
1066
|
+
translate; Base UI provides --transform-origin from the anchor. */
|
|
1067
|
+
:root[data-agy-theme="md3e"] .animate-slideIn {
|
|
1068
|
+
transform-origin: var(--transform-origin, top left);
|
|
1069
|
+
transition:
|
|
1070
|
+
opacity var(--md-color-fast),
|
|
1071
|
+
transform var(--md-fast);
|
|
1072
|
+
}
|
|
1073
|
+
:root[data-agy-theme="md3e"] .animate-slideIn[data-starting-style],
|
|
1074
|
+
:root[data-agy-theme="md3e"] .animate-slideIn[data-ending-style] {
|
|
1075
|
+
opacity: 0;
|
|
1076
|
+
transform: scale(0.8);
|
|
1077
|
+
}
|
|
1078
|
+
:root[data-agy-theme="md3e"] .animate-slideIn[data-ending-style] {
|
|
1079
|
+
transition:
|
|
1080
|
+
opacity var(--md-color-fast),
|
|
1081
|
+
transform var(--md-color-fast);
|
|
1082
|
+
}
|
|
1083
|
+
/* items */
|
|
1084
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]) {
|
|
1085
|
+
position: relative;
|
|
1086
|
+
isolation: isolate;
|
|
1087
|
+
min-height: 44px;
|
|
1088
|
+
padding: 12px 16px; /* 4px row inset + 12px item padding */
|
|
1089
|
+
gap: 8px;
|
|
1090
|
+
background: transparent;
|
|
1091
|
+
color: var(--md-sys-color-on-surface);
|
|
1092
|
+
font: var(--md-sys-typescale-label-large);
|
|
1093
|
+
letter-spacing: var(--md-sys-typescale-label-large-tracking);
|
|
1094
|
+
}
|
|
1095
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"])::before {
|
|
1096
|
+
content: "";
|
|
1097
|
+
position: absolute;
|
|
1098
|
+
inset: 0 4px;
|
|
1099
|
+
z-index: -1;
|
|
1100
|
+
border-radius: 4px;
|
|
1101
|
+
transition: border-radius var(--md-fast), background-color var(--md-state);
|
|
1102
|
+
}
|
|
1103
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):first-child::before,
|
|
1104
|
+
:root[data-agy-theme="md3e"] [role="menu"] :not([role^="menuitem"]) + :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"])::before {
|
|
1105
|
+
border-start-start-radius: 12px;
|
|
1106
|
+
border-start-end-radius: 12px;
|
|
1107
|
+
}
|
|
1108
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):last-child::before,
|
|
1109
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):has(+ [role="separator"])::before {
|
|
1110
|
+
border-end-start-radius: 12px;
|
|
1111
|
+
border-end-end-radius: 12px;
|
|
1112
|
+
}
|
|
1113
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):is([data-highlighted], :hover)::before {
|
|
1114
|
+
background: color-mix(in srgb, currentColor 8%, transparent);
|
|
1115
|
+
}
|
|
1116
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]):is(:focus-visible, :active)::before {
|
|
1117
|
+
background: color-mix(in srgb, currentColor 10%, transparent);
|
|
1118
|
+
}
|
|
1119
|
+
:root[data-agy-theme="md3e"] [role="menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"])[data-disabled] {
|
|
1120
|
+
opacity: 0.38;
|
|
1121
|
+
}
|
|
1122
|
+
/* leading icons 20px, trailing text and supporting text on-surface-variant */
|
|
1123
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"] > svg:first-child,
|
|
1124
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"] > [data-icon] svg {
|
|
1125
|
+
width: 20px;
|
|
1126
|
+
height: 20px;
|
|
1127
|
+
}
|
|
1128
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"] > :is(svg:first-child, [data-icon], .ml-auto),
|
|
1129
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"] .text-muted-foreground {
|
|
1130
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
1131
|
+
}
|
|
1132
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"] .text-muted-foreground {
|
|
1133
|
+
font: var(--md-sys-typescale-body-medium);
|
|
1134
|
+
letter-spacing: var(--md-sys-typescale-body-medium-tracking);
|
|
1135
|
+
white-space: normal; /* md-menu wraps supporting text (the app truncates it) */
|
|
1136
|
+
}
|
|
1137
|
+
/* selected: the app marks it with text-foreground and a trailing check */
|
|
1138
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) {
|
|
1139
|
+
color: var(--md-sys-color-on-tertiary-container);
|
|
1140
|
+
}
|
|
1141
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"])::before {
|
|
1142
|
+
border-radius: 12px;
|
|
1143
|
+
background: var(--md-sys-color-tertiary-container);
|
|
1144
|
+
}
|
|
1145
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]):is([data-highlighted], :hover)::before {
|
|
1146
|
+
background: color-mix(in srgb, var(--md-sys-color-on-tertiary-container) 8%, var(--md-sys-color-tertiary-container));
|
|
1147
|
+
}
|
|
1148
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) :is(.text-muted-foreground, .ml-auto),
|
|
1149
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) > :is(svg:first-child, .ml-auto) {
|
|
1150
|
+
color: inherit;
|
|
1151
|
+
}
|
|
1152
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"] > .ml-auto > span[style*="width"]:last-child,
|
|
1153
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"]) > [data-icon] {
|
|
1154
|
+
display: none;
|
|
1155
|
+
}
|
|
1156
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"])::after {
|
|
1157
|
+
content: "";
|
|
1158
|
+
order: -1;
|
|
1159
|
+
flex: none;
|
|
1160
|
+
width: 20px;
|
|
1161
|
+
height: 20px;
|
|
1162
|
+
background: currentColor;
|
|
1163
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3E%3Cpath d='M389 -369 688 -668Q699 -679 714 -679Q728 -679 739 -668Q750 -657 750 -642Q750 -628 739 -617L415 -292Q404 -281 390 -281Q375 -281 364 -292L221 -435Q210 -446 210 -460Q210 -475 221 -486Q232 -497 246 -497Q261 -497 272 -486Z'/%3E%3C/svg%3E") center / 20px no-repeat;
|
|
1164
|
+
transition: width var(--md-fast), margin var(--md-fast), opacity var(--md-color-fast);
|
|
1165
|
+
}
|
|
1166
|
+
@starting-style {
|
|
1167
|
+
:root[data-agy-theme="md3e"] [role="menu"] [role^="menuitem"]:is(.text-foreground, [aria-checked="true"])::after {
|
|
1168
|
+
width: 0;
|
|
1169
|
+
margin-inline-end: -8px;
|
|
1170
|
+
opacity: 0;
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
:root[data-agy-theme="md3e"] .compact-tooltip {
|
|
1174
|
+
padding: 4px 8px;
|
|
1175
|
+
border: 0;
|
|
1176
|
+
border-radius: var(--md-sys-shape-corner-extra-small);
|
|
1177
|
+
background: var(--md-sys-color-inverse-surface);
|
|
1178
|
+
color: var(--md-sys-color-inverse-on-surface);
|
|
1179
|
+
font: var(--md-sys-typescale-body-small);
|
|
1180
|
+
}
|
|
1181
|
+
:root[data-agy-theme="md3e"] [data-testid="overview-panel-host-gutter"] {
|
|
1182
|
+
padding: 8px;
|
|
1183
|
+
border: 0;
|
|
1184
|
+
border-radius: var(--md-sys-shape-corner-extra-large);
|
|
1185
|
+
background: var(--md-sys-color-surface-container-low);
|
|
1186
|
+
box-shadow: var(--md-sys-elevation-level1);
|
|
1187
|
+
}
|
|
1188
|
+
:root[data-agy-theme="md3e"] [data-testid^="overview-panel-row-"] {
|
|
1189
|
+
height: 48px;
|
|
1190
|
+
padding: 0 16px;
|
|
1191
|
+
gap: 12px;
|
|
1192
|
+
border-radius: var(--md-sys-shape-corner-full);
|
|
1193
|
+
font: var(--md-sys-typescale-label-large);
|
|
1194
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
1195
|
+
transition: background-color var(--md-state), color var(--md-state);
|
|
1196
|
+
}
|
|
1197
|
+
:root[data-agy-theme="md3e"] [data-testid^="overview-panel-row-"]:hover {
|
|
1198
|
+
background: var(--md-hover);
|
|
1199
|
+
color: var(--md-sys-color-on-surface);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1203
|
+
:root[data-agy-theme="md3e"] [data-testid="conversation-row-sidebar"][data-selected="true"]::before {
|
|
1204
|
+
animation: none;
|
|
1205
|
+
}
|
|
1206
|
+
}
|