@ash-qw/dsh-theme-prts 2.0.0 → 2.1.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.
@@ -0,0 +1,326 @@
1
+ /* Full mode uses one viewport-aligned image, so the two regions never crop independently. */
2
+ html[data-dsh-prts] { --prts-background-wash: color-mix(in srgb, var(--prts-canvas) var(--prts-background-shade, 45%), transparent); }
3
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] :is([data-prts-region="frame"], [data-prts-nav-rail]) {
4
+ background: linear-gradient(var(--prts-background-wash), var(--prts-background-wash)), var(--prts-background-full) center / cover fixed;
5
+ }
6
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] :is([data-prts-region="sessions"], [data-prts-region="operation"]) { background: transparent; }
7
+ html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-sidebar] [data-prts-region="sessions"] {
8
+ background: linear-gradient(var(--prts-background-wash), var(--prts-background-wash)), var(--prts-background-sidebar) center / cover no-repeat;
9
+ }
10
+ html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-conversation] [data-prts-region="operation"] {
11
+ background: linear-gradient(var(--prts-background-wash), var(--prts-background-wash)), var(--prts-background-conversation) center / cover no-repeat;
12
+ }
13
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-ambient-layer],
14
+ html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-conversation] [data-prts-ambient-layer] { display: none !important; }
15
+ [data-prts-background-settings] { display: grid; gap: 14px; margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--prts-line); }
16
+ [data-prts-background-settings] header { display: grid; gap: 6px; }
17
+ [data-prts-background-settings] small, [data-prts-background-status] { color: var(--prts-muted); font-size: 12px; line-height: 1.6; }
18
+ [data-prts-background-modes] { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
19
+ [data-prts-background-modes] button { display: grid; gap: 10px; padding: 12px; border: 1px solid var(--prts-line); border-radius: 8px; background: transparent; color: var(--prts-ink); text-align: left; cursor: pointer; }
20
+ [data-prts-background-modes] button strong { display: block; font-size: 13px; margin-bottom: 3px; }
21
+ [data-prts-background-modes] button small { font-size: 11px; }
22
+ [data-prts-background-modes] button[aria-pressed="true"] { border-color: var(--prts-cyan); background: color-mix(in srgb, var(--prts-cyan) 8%, transparent); box-shadow: inset 0 0 0 1px var(--prts-cyan); }
23
+ [data-prts-background-diagram] { display: flex; gap: 3px; width: 44px; height: 26px; padding: 3px; border: 1px solid var(--prts-muted); border-radius: 4px; }
24
+ [data-prts-background-diagram] i { background: var(--prts-muted); opacity: .35; border-radius: 1px; flex: 1; }
25
+ [data-prts-background-diagram] i:first-child { flex: 0 0 28%; }
26
+ [data-prts-background-diagram="split"] i { background: var(--prts-cyan); opacity: .6; }
27
+ [data-prts-background-diagram="split"] i:first-child { opacity: .25; }
28
+ [data-prts-background-diagram="full"] { background: color-mix(in srgb, var(--prts-cyan) 25%, transparent); }
29
+ [data-prts-background-diagram="full"] i { background: transparent; }
30
+ [data-prts-background-images] { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
31
+ [data-prts-background-card="full"] { grid-column: 1 / -1; }
32
+ [data-prts-background-card-heading] { display: flex; justify-content: space-between; align-items: center; min-height: 30px; margin-bottom: 6px; font-size: 13px; }
33
+ [data-prts-background-upload] { position: relative; display: grid; place-items: center; width: 100%; height: 120px; padding: 0; border: 1px dashed var(--prts-line); border-radius: 8px; color: var(--prts-muted); background: var(--prts-panel); overflow: hidden; cursor: pointer; }
34
+ [data-prts-background-card="full"] [data-prts-background-upload] { height: 155px; }
35
+ [data-prts-background-upload][data-has-image] { border-style: solid; }
36
+ [data-prts-background-upload]:hover { border-color: var(--prts-cyan); color: var(--prts-ink); }
37
+ [data-prts-background-thumbnail] { position: absolute; inset: 0; background: center / cover no-repeat; }
38
+ [data-prts-background-caption] { position: relative; padding: 6px 12px; border-radius: 5px; font-size: 12px; }
39
+ [data-has-image] [data-prts-background-caption] { align-self: end; justify-self: end; margin: 8px; background: var(--prts-panel); color: var(--prts-ink); box-shadow: 0 1px 5px #0003; }
40
+ [data-prts-background-remove] { padding: 4px 8px; background: transparent; color: var(--prts-muted); border: 0; border-radius: 4px; font-size: 12px; cursor: pointer; }
41
+ [data-prts-background-remove]:hover { color: var(--prts-red); background: color-mix(in srgb, var(--prts-red) 8%, transparent); }
42
+ [data-prts-background-shade] { display: grid; gap: 8px; font-size: 13px; padding-top: 14px; border-top: 1px solid var(--prts-line); }
43
+ [data-prts-background-shade] > span { display: flex; justify-content: space-between; }
44
+ [data-prts-background-shade] output { color: var(--prts-muted); font-variant-numeric: tabular-nums; }
45
+ [data-prts-background-shade] input { width: 100%; accent-color: var(--prts-cyan); }
46
+ [data-prts-background-status] { margin: 0; }
47
+ [data-prts-background-status]:empty { display: none; }
48
+ [data-prts-background-settings] button:focus-visible { outline: 2px solid var(--prts-cyan); outline-offset: 3px; }
49
+ @media (max-width: 600px) {
50
+ [data-prts-background-modes] button { padding: 8px; }
51
+ [data-prts-background-modes] button small { display: none; }
52
+ [data-prts-background-images] { grid-template-columns: 1fr; }
53
+ }
54
+ [data-prts-background-settings] [hidden] { display: none !important; }
55
+ /* Classic conversation roots keep their native surface unless an image is active. */
56
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] :is([data-slot="main.conversation"], [data-slot="conversation"]) > [data-phase],
57
+ html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-conversation] :is([data-slot="main.conversation"], [data-slot="conversation"]) > [data-phase] { background: transparent !important; }
58
+ /* The native fade ends in a solid sidebar color and would cover a custom image. */
59
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-region="sessions"] [data-slot="sidebar.workspaces"] span[class$="_fade"],
60
+ html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-sidebar] [data-prts-region="sessions"] [data-slot="sidebar.workspaces"] span[class$="_fade"] { display: none !important; }
61
+
62
+ /* Paint glass behind sidebar controls, never filter their ancestor: fixed
63
+ * settings/menus must retain their viewport positioning. The split-mode image
64
+ * stays on the parent so this surface can blur it as well as the full wallpaper. */
65
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-region="sessions"]::before,
66
+ html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-sidebar] [data-prts-region="sessions"]::before {
67
+ content: "";
68
+ position: absolute;
69
+ inset: 0;
70
+ z-index: 0;
71
+ pointer-events: none;
72
+ background: color-mix(in srgb, var(--prts-panel) var(--prts-sidebar-opacity, 6%), transparent);
73
+ -webkit-backdrop-filter: blur(var(--prts-sidebar-blur, 8px)) saturate(1.15);
74
+ backdrop-filter: blur(var(--prts-sidebar-blur, 8px)) saturate(1.15);
75
+ box-shadow: inset -1px 0 color-mix(in srgb, var(--prts-ink) 10%, transparent), inset 0 1px rgb(255 255 255 / 8%);
76
+ }
77
+ /* The sidebar slot is display:contents and cannot establish a paint layer.
78
+ * Raise its actual root so glass never blurs static plugin entries. */
79
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-region="sessions"] [data-slot="sidebar"] > :first-child,
80
+ html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-sidebar] [data-prts-region="sessions"] [data-slot="sidebar"] > :first-child {
81
+ position: relative;
82
+ z-index: 1;
83
+ }
84
+
85
+ /* The fixed rail already establishes a stacking context. Keep the glass below
86
+ * every control without changing their positioning or tooltip geometry. */
87
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail]::before {
88
+ content: "";
89
+ position: absolute;
90
+ inset: 0;
91
+ z-index: -1;
92
+ pointer-events: none;
93
+ background: color-mix(in srgb, var(--prts-panel) var(--prts-rail-opacity, 30%), transparent);
94
+ -webkit-backdrop-filter: blur(var(--prts-rail-blur, 12px)) saturate(1.15);
95
+ backdrop-filter: blur(var(--prts-rail-blur, 12px)) saturate(1.15);
96
+ box-shadow: inset -1px 0 color-mix(in srgb, var(--prts-ink) 10%, transparent), inset 0 1px rgb(255 255 255 / 8%);
97
+ }
98
+
99
+ /* Glass rail feedback retains the wallpaper instead of switching to solid black. */
100
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail] button {
101
+ color: var(--prts-muted) !important;
102
+ border-bottom-color: var(--prts-line);
103
+ transition: background-color 140ms ease, box-shadow 140ms ease, color 140ms ease;
104
+ }
105
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail] button:is(:hover, :focus-visible, [aria-expanded="true"]) {
106
+ background: color-mix(in srgb, var(--prts-panel-raised) 32%, transparent);
107
+ color: var(--prts-ink) !important;
108
+ box-shadow: inset 0 1px rgb(255 255 255 / 15%), inset 0 0 0 1px color-mix(in srgb, var(--prts-ink) 10%, transparent);
109
+ }
110
+ html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail] button:active {
111
+ background: color-mix(in srgb, var(--prts-panel-raised) 48%, transparent);
112
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--prts-ink) 18%, transparent);
113
+ }
114
+
115
+ /* Daylight needs a little contrast, rather than another white highlight. */
116
+ html[data-dsh-prts][data-prts-scheme="light"][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail] button:is(:hover, :focus-visible, [aria-expanded="true"]) {
117
+ background: color-mix(in srgb, var(--prts-ink) 8%, transparent);
118
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--prts-ink) 16%, transparent);
119
+ }
120
+ html[data-dsh-prts][data-prts-scheme="light"][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail] button:active {
121
+ background: color-mix(in srgb, var(--prts-ink) 13%, transparent);
122
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--prts-ink) 22%, transparent);
123
+ }
124
+
125
+ /* The solid rail stays dark in both schemes; use the same light feedback
126
+ * instead of the conversation palette's light-mode ink/surface colors. */
127
+ html[data-dsh-prts]:not([data-prts-background-mode="full"][data-prts-background-full]) [data-prts-nav-rail] button:is(:hover, :focus-visible, [aria-expanded="true"]) {
128
+ background: rgb(255 255 255 / 8%);
129
+ color: #f3f6f7 !important;
130
+ box-shadow: inset 0 0 0 1px rgb(255 255 255 / 12%);
131
+ }
132
+ html[data-dsh-prts]:not([data-prts-background-mode="full"][data-prts-background-full]) [data-prts-nav-rail] button:active {
133
+ background: rgb(255 255 255 / 14%);
134
+ color: #f3f6f7 !important;
135
+ box-shadow: inset 0 0 0 1px rgb(255 255 255 / 20%);
136
+ }
137
+
138
+ /* A dark solid-rail divider is too strong against the daylight wallpaper. */
139
+ html[data-dsh-prts][data-prts-scheme="light"][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail] {
140
+ border-right-color: color-mix(in srgb, var(--prts-ink) 10%, transparent);
141
+ box-shadow: none;
142
+ }
143
+ html[data-dsh-prts][data-prts-scheme="light"][data-prts-background-mode="full"][data-prts-background-full] [data-prts-nav-rail]::before {
144
+ box-shadow: inset 0 1px rgb(255 255 255 / 8%);
145
+ }
146
+
147
+ /* Baker keeps its game palette; only a real conversation wallpaper enables glass. */
148
+ html[data-dsh-prts][data-prts-conversation-style="deck-chat"]:is(
149
+ [data-prts-background-mode="full"][data-prts-background-full],
150
+ [data-prts-background-mode="split"][data-prts-background-conversation]
151
+ ) {
152
+ --prts-chat-user-surface: rgb(239 239 237 / var(--prts-baker-opacity, 50%));
153
+ --prts-chat-assistant-surface: rgb(69 70 68 / var(--prts-baker-opacity, 50%));
154
+ &[data-prts-scheme="light"] {
155
+ --prts-chat-user-surface: rgb(255 255 255 / var(--prts-baker-opacity, 50%));
156
+ --prts-chat-assistant-surface: rgb(223 227 223 / var(--prts-baker-opacity, 50%));
157
+ }
158
+ & :is([data-chat-flow-kind="user"], [data-submission-echo]:not([data-pending-steering])) [class$="_bubble"],
159
+ & :is([data-prts-ai-surface], [data-message-role="user"], [data-message-role="assistant"]),
160
+ & [data-chat-flow-kind="assistant-step"]:not([data-chat-group-part="reasoning"]) [class$="_body"]:has(:is([data-markdown], [data-slot*="markdown" i], .markdown-body)) {
161
+ -webkit-backdrop-filter: blur(var(--prts-baker-blur, 8px)) saturate(1.08);
162
+ backdrop-filter: blur(var(--prts-baker-blur, 8px)) saturate(1.08);
163
+ }
164
+ & [data-prts-ai-surface]::before,
165
+ & [data-message-role="assistant"]::after,
166
+ & :is([data-chat-flow-kind="user"], [data-submission-echo]:not([data-pending-steering])) [class$="_bubble"]::before,
167
+ & [data-message-role="user"]::before {
168
+ -webkit-backdrop-filter: blur(var(--prts-baker-blur, 8px)) saturate(1.08);
169
+ backdrop-filter: blur(var(--prts-baker-blur, 8px)) saturate(1.08);
170
+ }
171
+ }
172
+
173
+ /* Classic user messages share the wallpaper translucency controls with Baker bubbles. */
174
+ html[data-dsh-prts][data-prts-conversation-style="native"]:is(
175
+ [data-prts-background-mode="full"][data-prts-background-full],
176
+ [data-prts-background-mode="split"][data-prts-background-conversation]
177
+ ) {
178
+ & [data-message-role="user"],
179
+ & :is([data-chat-flow-kind="user"], [data-submission-echo]:not([data-pending-steering])) [class$="_bubble"] {
180
+ background: rgb(23 29 33 / var(--prts-classic-user-opacity, 50%)) !important;
181
+ -webkit-backdrop-filter: blur(var(--prts-classic-user-blur, 8px)) saturate(1.08);
182
+ backdrop-filter: blur(var(--prts-classic-user-blur, 8px)) saturate(1.08);
183
+ }
184
+ &[data-prts-scheme="light"] {
185
+ & [data-message-role="user"],
186
+ & :is([data-chat-flow-kind="user"], [data-submission-echo]:not([data-pending-steering])) [class$="_bubble"] {
187
+ background: rgb(229 234 237 / var(--prts-classic-user-opacity, 50%)) !important;
188
+ }
189
+ }
190
+ }
191
+
192
+ [data-prts-opacity-settings] { min-width: 0; max-width: 420px; margin: 0; padding: 14px 0 0; border: 0; border-top: 1px solid var(--prts-line); }
193
+ [data-prts-opacity-settings] legend { padding: 0 8px 0 0; font-size: 13px; font-weight: 600; }
194
+ [data-prts-opacity-grid] { display: grid; grid-template-columns: minmax(0,1fr); max-width: 420px; margin-top: 12px; }
195
+ [data-prts-opacity-control] { display: grid; grid-template-columns: minmax(116px,38%) minmax(0,1fr); grid-template-rows: 26px 96px auto auto; align-items: center; column-gap: 16px; min-width: 0; padding: 10px 0 12px; }
196
+ [data-prts-opacity-control]:not(:first-child):not([hidden]) { border-top: 1px solid var(--prts-line); }
197
+ [data-prts-opacity-control][hidden] { display: none; }
198
+ [data-prts-opacity-heading] { grid-column: 1; grid-row: 1; display: flex; align-self: stretch; align-items: center; justify-content: center; gap: 4px; min-width: 0; }
199
+ [data-prts-opacity-heading] > strong { font-size: 12px; line-height: 1.4; white-space: nowrap; }
200
+ [data-prts-opacity-control] > [data-prts-material-preview] { grid-column: 2; grid-row: 1 / 3; align-self: center; }
201
+ [data-prts-opacity-control] > [data-prts-opacity-note] { grid-column: 1 / -1; grid-row: 4; }
202
+ [data-prts-blur-control] { grid-column: 1 / -1; grid-row: 3; display: grid; grid-template-columns: minmax(0, 1fr) 36px 22px; align-items: center; gap: 8px; min-width: 0; margin-top: 6px; }
203
+ [data-prts-blur-control][hidden] { display: none; }
204
+ [data-prts-blur-control] label { display: grid; grid-template-columns: 34px minmax(0, 1fr); align-items: center; gap: 8px; min-width: 0; font-size: 11px; color: var(--prts-muted); }
205
+ [data-prts-blur-control] input { width: 100%; min-width: 0; margin: 0; accent-color: var(--prts-cyan); cursor: pointer; }
206
+ [data-prts-blur-control] output { color: var(--prts-ink); font: 11px/1 var(--prts-mono); text-align: right; font-variant-numeric: tabular-nums; }
207
+ [data-prts-blur-reset] { display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 4px; background: transparent; color: var(--prts-muted); cursor: pointer; }
208
+ [data-prts-blur-reset]:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--prts-cyan) 12%, transparent); color: var(--prts-cyan); }
209
+ [data-prts-blur-reset] svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
210
+ [data-prts-opacity-dial] { position: relative; grid-column: 1; grid-row: 2; justify-self: center; width: 96px; aspect-ratio: 1; user-select: none; }
211
+ [data-prts-opacity-dial] svg { display: block; width: 100%; height: 100%; cursor: grab; touch-action: none; border-radius: 50%; }
212
+ [data-dragging] [data-prts-opacity-dial] svg { cursor: grabbing; }
213
+ [data-prts-opacity-dial] svg:focus-visible { outline: 2px solid var(--prts-cyan); outline-offset: 2px; }
214
+ [data-prts-opacity-dial] path { fill: none; stroke-width: 5; stroke-linecap: round; }
215
+ [data-dial-track] { stroke: var(--prts-muted); opacity: .25; }
216
+ [data-dial-lit], [data-dial-tail] { stroke: var(--prts-cyan); }
217
+ [data-prts-opacity-dial] [data-dial-tail] { stroke-width: 12; transition: opacity 160ms ease; }
218
+ [data-dial-head] { fill: var(--prts-cyan); }
219
+ [data-prts-opacity-number] { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); display: flex; align-items: baseline; gap: 1px; }
220
+ [data-prts-opacity-number] input { appearance: textfield; width: 3ch; padding: 3px 0; border: 0; border-bottom: 1px solid transparent; border-radius: 0; outline-offset: 2px; background: transparent; color: var(--prts-ink); text-align: center; font: 500 22px/1.2 var(--prts-mono); font-variant-numeric: tabular-nums; }
221
+ [data-prts-opacity-number] input:focus { border-bottom-color: var(--prts-cyan); }
222
+ [data-prts-opacity-number] input::-webkit-inner-spin-button, [data-prts-opacity-number] input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
223
+ [data-prts-opacity-number] span { font-size: 11px; color: var(--prts-muted); }
224
+ [data-prts-opacity-reset] { position: relative; display: grid; place-items: center; flex: 0 0 24px; width: 24px; height: 24px; padding: 0; border: 0; border-radius: 4px; background: transparent; color: var(--prts-muted); cursor: pointer; }
225
+ [data-prts-opacity-reset] svg { display: block; width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
226
+ [data-prts-opacity-reset]:hover, [data-prts-opacity-reset]:focus-visible { background: color-mix(in srgb, var(--prts-cyan) 12%, transparent); color: var(--prts-cyan); }
227
+ [data-prts-opacity-reset]::after { content: attr(data-prts-opacity-reset-tooltip); position: absolute; z-index: 5; top: calc(100% + 6px); left: 0; padding: 5px 8px; border: 1px solid var(--prts-line); border-radius: 4px; background: var(--prts-panel-raised); color: var(--prts-ink); box-shadow: var(--prts-shadow-glass-overlay); white-space: nowrap; opacity: 0; transform: translateY(-3px); pointer-events: none; transition: opacity 120ms ease, transform 120ms ease; }
228
+ [data-prts-opacity-reset]:hover::after, [data-prts-opacity-reset]:focus-visible::after { opacity: 1; transform: translateY(0); }
229
+ [data-prts-opacity-control] [data-prts-opacity-note] { font-size: 10px; }
230
+ [data-prts-opacity-note]:empty { display: none; }
231
+ html[data-prts-motion="reduced"] [data-prts-opacity-dial] [data-dial-tail] { display: none; }
232
+ @media (prefers-reduced-motion: reduce) { [data-prts-opacity-dial] [data-dial-tail] { display: none; } }
233
+
234
+ /* Match the two peer modules without boxing one of them in a second surface. */
235
+ html[data-dsh-prts] [data-prts-theme-settings] [data-prts-settings-section="appearance"] > section {
236
+ padding: 0;
237
+ border: 0;
238
+ border-radius: 0;
239
+ background: transparent;
240
+ }
241
+ html[data-dsh-prts] [data-prts-theme-settings] [data-prts-background-settings] {
242
+ margin-top: 24px;
243
+ padding-top: 12px;
244
+ border-top: 1px solid var(--prts-line);
245
+ }
246
+ /* SVG outlines are rectangular in Chromium. Draw keyboard focus inside the ring. */
247
+ html[data-dsh-prts] [data-prts-theme-settings] [data-prts-opacity-dial] svg:focus { outline: none !important; box-shadow: none; }
248
+ [data-dial-focus] { fill: none; stroke: var(--prts-cyan); stroke-width: 2; opacity: 0; }
249
+ [data-prts-opacity-dial] svg:focus-visible [data-dial-focus] { opacity: .8; }
250
+ [data-prts-opacity-control][data-dragging] [data-dial-focus] { opacity: 0; }
251
+ [data-prts-material-preview] {
252
+ position: relative;
253
+ width: 100%;
254
+ height: 104px;
255
+ overflow: hidden;
256
+ border: 1px solid var(--prts-line);
257
+ border-radius: 6px;
258
+ background: var(--prts-background-full, linear-gradient(135deg, #8bb6c2, #c7b69c)) center / cover;
259
+ --prts-preview-surface: var(--prts-panel);
260
+ }
261
+ html[data-prts-background-mode="split"] [data-prts-material-preview="sidebarOpacity"] { background-image: var(--prts-background-sidebar, linear-gradient(135deg, #8bb6c2, #c7b69c)); }
262
+ html[data-prts-background-mode="split"] [data-prts-material-preview="bakerOpacity"] { background-image: var(--prts-background-conversation, linear-gradient(135deg, #8bb6c2, #c7b69c)); }
263
+ html[data-prts-background-mode="split"] [data-prts-material-preview="classicUserOpacity"] { background-image: var(--prts-background-conversation, linear-gradient(135deg, #8bb6c2, #c7b69c)); }
264
+ [data-prts-material-preview]::before { content: ""; position: absolute; inset: 0; background: var(--prts-background-wash); }
265
+ [data-prts-material-preview-surface] { position: absolute; inset: 0; display: grid; align-content: center; gap: 6px; padding: 10px; font-size: 10px; text-align: left; color: var(--prts-ink); background: color-mix(in srgb, var(--prts-preview-surface) var(--prts-sidebar-opacity, 6%), transparent); backdrop-filter: blur(var(--prts-sidebar-blur, 8px)) saturate(1.15); }
266
+ [data-prts-material-preview-surface] i { display: block; height: 8px; border-radius: 2px; background: color-mix(in srgb, var(--prts-ink) 18%, transparent); }
267
+ [data-prts-material-preview-surface] i:last-child { width: 65%; }
268
+ [data-prts-material-preview="railOpacity"] [data-prts-material-preview-surface] { inset: 0 auto 0 0; width: 40%; padding: 5px; justify-items: center; gap: 2px; background: color-mix(in srgb, var(--prts-preview-surface) var(--prts-rail-opacity, 30%), transparent); backdrop-filter: blur(var(--prts-rail-blur, 12px)) saturate(1.15); }
269
+ [data-prts-material-preview="bakerOpacity"] [data-prts-material-preview-surface] { inset: 16px 10px; border-radius: 0 10px 10px 10px; background: rgb(69 70 68 / var(--prts-baker-opacity, 50%)); backdrop-filter: blur(var(--prts-baker-blur, 8px)) saturate(1.08); }
270
+ html[data-prts-scheme="light"] [data-prts-material-preview="bakerOpacity"] [data-prts-material-preview-surface] { background: rgb(223 227 223 / var(--prts-baker-opacity, 50%)); }
271
+ [data-prts-material-preview="classicUserOpacity"] [data-prts-material-preview-surface] { inset: 16px 10px; border-left: 3px solid var(--prts-yellow); border-radius: var(--prts-radius-card); background: rgb(23 29 33 / var(--prts-classic-user-opacity, 50%)); backdrop-filter: blur(var(--prts-classic-user-blur, 8px)) saturate(1.08); }
272
+ html[data-prts-scheme="light"] [data-prts-material-preview="classicUserOpacity"] [data-prts-material-preview-surface] { background: rgb(229 234 237 / var(--prts-classic-user-opacity, 50%)); }
273
+ @media (max-width: 560px) {
274
+ [data-prts-opacity-control] { column-gap: 10px; }
275
+ [data-prts-opacity-heading] { gap: 6px; }
276
+ [data-prts-opacity-dial] { width: 88px; }
277
+ }
278
+
279
+ /* Backgrounds now have their own settings page. */
280
+ html[data-dsh-prts] [data-prts-theme-settings] [data-prts-settings-section="background"] > [data-prts-background-settings] { margin: 0; padding: 0; border: 0; }
281
+ html[data-dsh-prts] [data-prts-settings-section="background"] [data-prts-background-settings] > header { padding: 16px 0 10px; }
282
+ html[data-dsh-prts] [data-prts-settings-section="background"] [data-prts-background-settings] > header strong { font-size: 13px; color: var(--prts-muted); }
283
+ [data-prts-composer-glass-setting], [data-prts-composer-glass-required] { display: block; margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--prts-line); }
284
+ [data-prts-composer-glass-required] { font-size: 12px; color: var(--prts-muted); }
285
+
286
+ /* The native active composer fades into DSH's base color. Baker paints a
287
+ * different solid backdrop, so match that backdrop while keeping the fade. */
288
+ html[data-dsh-prts][data-prts-conversation-style="deck-chat"][data-prts-background-mode="off"] [data-phase="active"] [data-composer-seat]:not(:has([data-prts-composer-glass-active])) {
289
+ background: linear-gradient(180deg, transparent 0, var(--prts-chat-dock-surface, var(--prts-chat-backdrop)) 36px) !important;
290
+ }
291
+ html[data-dsh-prts][data-prts-conversation-style="deck-chat"][data-prts-background-mode="off"][data-prts-texture="restrained"] {
292
+ --prts-chat-dock-surface: color-mix(in srgb, var(--prts-chat-backdrop) 82%, var(--prts-canvas));
293
+ }
294
+ html[data-dsh-prts][data-prts-conversation-style="deck-chat"][data-prts-background-mode="off"][data-prts-texture="off"] {
295
+ --prts-chat-dock-surface: color-mix(in srgb, var(--prts-chat-backdrop) 72%, var(--prts-canvas));
296
+ }
297
+
298
+ /* Native data-streaming disappears for settled and interrupted responses.
299
+ * Hide only the current response body, never reasoning, tools or earlier rounds. */
300
+ html[data-dsh-prts][data-prts-conversation-style="deck-chat"][data-prts-baker-loading]
301
+ [data-chat-flow-kind="assistant-step"]:not([data-chat-group-part="reasoning"])
302
+ [data-streaming] > :is([data-prts-ai-surface], [class$="_body"]) {
303
+ min-width: 78px;
304
+ width: 78px !important;
305
+ min-height: 42px;
306
+ box-sizing: border-box;
307
+ display: flex;
308
+ align-items: center;
309
+ justify-content: center;
310
+ padding: 12px 18px !important;
311
+ & > * { display: none !important; }
312
+ &::after {
313
+ content: "正在生成回复";
314
+ font-size: 0;
315
+ display: block;
316
+ width: 4px;
317
+ height: 4px;
318
+ border-radius: 1px;
319
+ animation: prts-baker-typing 1.2s linear infinite;
320
+ }
321
+ }
322
+ @keyframes prts-baker-typing {
323
+ 0%, 100% { background: color-mix(in srgb,currentColor 30%,transparent); box-shadow: -10px 0 0 currentColor, 10px 0 0 color-mix(in srgb,currentColor 30%,transparent); }
324
+ 33% { background: currentColor; box-shadow: -10px 0 0 color-mix(in srgb,currentColor 30%,transparent), 10px 0 0 color-mix(in srgb,currentColor 30%,transparent); }
325
+ 66% { background: color-mix(in srgb,currentColor 30%,transparent); box-shadow: -10px 0 0 color-mix(in srgb,currentColor 30%,transparent), 10px 0 0 currentColor; }
326
+ }
@@ -1569,6 +1569,7 @@ html[data-dsh-prts] [data-prts-glass-control="preset"] {
1569
1569
  color: var(--prts-ink) !important;
1570
1570
  }
1571
1571
 
1572
+ html[data-dsh-prts] [data-menu-material][class*="_7KE1Ra_menu"],
1572
1573
  html[data-dsh-prts] [data-prts-glass-menu],
1573
1574
  html[data-dsh-prts] [data-prts-floating-glass="menu"],
1574
1575
  html[data-dsh-prts] [data-prts-floating-glass="listbox"],
@@ -1592,6 +1593,7 @@ html[data-dsh-prts] [data-prts-floating-glass="dialog"] {
1592
1593
  -webkit-backdrop-filter: none;
1593
1594
  }
1594
1595
 
1596
+ html[data-dsh-prts] [data-menu-material][class*="_7KE1Ra_menu"] :is([role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]),
1595
1597
  html[data-dsh-prts] [data-prts-floating-item] {
1596
1598
  min-height: 38px;
1597
1599
  border-radius: var(--prts-radius-control) !important;
@@ -1906,3 +1908,91 @@ html[data-dsh-prts][data-prts-conversation-style="deck-chat"] {
1906
1908
  & :is([data-chat-flow-kind="user"], [data-submission-echo]:not([data-pending-steering])) [class$="_bubble"]::before,
1907
1909
  & [data-message-role="user"]::before { left: auto; right: -9px; transform: scaleX(-1); }
1908
1910
  }
1911
+
1912
+ /* The upstream component replaces only the composer's two background plates. */
1913
+ html[data-dsh-prts] :is([data-composer-card], [data-prts-composer-fallback])[data-prts-composer-glass-active]::before,
1914
+ html[data-dsh-prts] :is([data-composer-card], [data-prts-composer-fallback])[data-prts-composer-glass-active]::after {
1915
+ content: none;
1916
+ }
1917
+ html[data-dsh-prts] :is([data-composer-card], [data-prts-composer-fallback]) > [data-prts-composer-glass-surface] {
1918
+ position: absolute !important;
1919
+ inset: -16px;
1920
+ z-index: 0 !important;
1921
+ pointer-events: none;
1922
+ }
1923
+
1924
+ /* The host's sticky dock fades to opaque after 36px; let the glass see the chat. */
1925
+ html[data-dsh-prts] [data-composer-seat]:has([data-prts-composer-glass-active]) {
1926
+ background: transparent !important;
1927
+ }
1928
+
1929
+
1930
+ /* Optional popup material changes neither popup geometry nor its border/shadow. */
1931
+ html[data-dsh-prts][data-prts-composer-enhanced] {
1932
+ --prts-composer-menu-tint: rgba(25, 32, 38, .85);
1933
+ --prts-composer-menu-filter: blur(16px) saturate(1.15);
1934
+ }
1935
+ html[data-dsh-prts][data-prts-composer-enhanced][data-prts-scheme="light"] {
1936
+ --prts-composer-menu-tint: rgba(244, 249, 251, .85);
1937
+ }
1938
+ html[data-dsh-prts][data-prts-composer-enhanced] :is(
1939
+ [data-prts-glass-menu],
1940
+ [data-menu-material][class*="_7KE1Ra_menu"]
1941
+ ) {
1942
+ background: var(--prts-composer-menu-tint) !important;
1943
+ backdrop-filter: var(--prts-composer-menu-filter) !important;
1944
+ -webkit-backdrop-filter: var(--prts-composer-menu-filter) !important;
1945
+ }
1946
+ /* Reuse the host material plate when present; do not stack two blur filters. */
1947
+ html[data-dsh-prts][data-prts-composer-enhanced] :is(
1948
+ [data-prts-glass-menu],
1949
+ [data-menu-material][class*="_7KE1Ra_menu"]
1950
+ ):has(> [aria-hidden="true"][class*="_material_"]) {
1951
+ background: transparent !important;
1952
+ backdrop-filter: none !important;
1953
+ -webkit-backdrop-filter: none !important;
1954
+ }
1955
+ html[data-dsh-prts][data-prts-composer-enhanced] :is(
1956
+ [data-prts-glass-menu],
1957
+ [data-menu-material][class*="_7KE1Ra_menu"]
1958
+ ) > [aria-hidden="true"][class*="_material_"] {
1959
+ background: var(--prts-composer-menu-tint) !important;
1960
+ backdrop-filter: var(--prts-composer-menu-filter) !important;
1961
+ -webkit-backdrop-filter: var(--prts-composer-menu-filter) !important;
1962
+ }
1963
+ html[data-dsh-prts][data-prts-composer-enhanced] [data-prts-glass-menu] [data-prts-glass-menu]:not([data-menu-material]) {
1964
+ background: transparent !important;
1965
+ backdrop-filter: none !important;
1966
+ -webkit-backdrop-filter: none !important;
1967
+ box-shadow: none !important;
1968
+ }
1969
+
1970
+ /* The live CSS outline owns geometry; asynchronously decoded artwork only refracts. */
1971
+ html[data-dsh-prts] [data-prts-composer-glass-active] > [data-prts-composer-glass-surface] > .glass-surface {
1972
+ mask: none !important;
1973
+ -webkit-mask: none !important;
1974
+ opacity: 1 !important;
1975
+ clip-path: polygon(19px 16px, calc(50% - 42px) 16px, calc(50% - 37px) 21px, calc(50% + 37px) 21px, calc(50% + 42px) 16px, calc(100% - 19px) 16px, calc(100% - 16px) 19px, calc(100% - 16px) calc(100% - 19px), calc(100% - 19px) calc(100% - 16px), 19px calc(100% - 16px), 16px calc(100% - 19px), 16px 19px);
1976
+ }
1977
+ html[data-dsh-prts] [data-prts-composer-glass-active] :is(.glass-surface__line, .glass-surface__glow) {
1978
+ display: none;
1979
+ }
1980
+ html[data-dsh-prts] :is([data-composer-card], [data-prts-composer-fallback])[data-prts-composer-glass-active]::before {
1981
+ content: "";
1982
+ position: absolute;
1983
+ inset: 0;
1984
+ z-index: 1;
1985
+ pointer-events: none;
1986
+ background: var(--prts-line-strong);
1987
+ clip-path: polygon(evenodd,
1988
+ 3px 0, calc(50% - 42px) 0, calc(50% - 37px) 5px, calc(50% + 37px) 5px, calc(50% + 42px) 0, calc(100% - 3px) 0, 100% 3px, 100% calc(100% - 3px), calc(100% - 3px) 100%, 3px 100%, 0 calc(100% - 3px), 0 3px, 3px 0,
1989
+ 3px 1px, 1px 3px, 1px calc(100% - 3px), 3px calc(100% - 1px), calc(100% - 3px) calc(100% - 1px), calc(100% - 1px) calc(100% - 3px), calc(100% - 1px) 3px, calc(100% - 3px) 1px, calc(50% + 42px) 1px, calc(50% + 37px) 6px, calc(50% - 37px) 6px, calc(50% - 42px) 1px, 3px 1px);
1990
+ }
1991
+
1992
+ /* A restrained tint/sheen keeps the material legible over a blank backdrop too. */
1993
+ html[data-dsh-prts] [data-prts-composer-glass-active] > [data-prts-composer-glass-surface] > .glass-surface {
1994
+ background: linear-gradient(135deg, rgba(255, 255, 255, .055), transparent 65%), rgba(31, 40, 47, .5);
1995
+ }
1996
+ html[data-dsh-prts][data-prts-scheme="light"] [data-prts-composer-glass-active] > [data-prts-composer-glass-surface] > .glass-surface {
1997
+ background: linear-gradient(135deg, rgba(255, 255, 255, .2), transparent 65%), rgba(244, 249, 251, .5);
1998
+ }
@@ -150,6 +150,15 @@ html[data-dsh-prts] [data-prts-session-time] {
150
150
  transition: opacity 120ms ease, transform 220ms var(--prts-ease-spring);
151
151
  }
152
152
 
153
+ /* DSH keeps its pin in the row's trailing slot; move that slot inside our face. */
154
+ html[data-dsh-prts] [data-prts-session-row] > :is([aria-label="Pinned"], [class*="_pinIndicator"]) {
155
+ margin-right: calc(var(--prts-row-end-reserve) + 6px);
156
+ }
157
+
158
+ html[data-dsh-prts] [data-prts-session-row]:has(> :is([aria-label="Pinned"], [class*="_pinIndicator"])) [data-prts-session-time] {
159
+ margin-right: 8px;
160
+ }
161
+
153
162
  html[data-dsh-prts] [data-prts-session-row]:hover [data-prts-session-time] {
154
163
  opacity: 0;
155
164
  }
@@ -872,6 +872,9 @@ html[data-dsh-prts] [data-prts-avatar-crop]{position:fixed;inset:0;margin:auto;b
872
872
 
873
873
  html[data-dsh-prts]{
874
874
  [data-prts-conversation-settings]{display:grid;gap:16px;padding:18px;border:1px solid var(--prts-line);background:var(--prts-panel)}
875
+ & [data-prts-theme-settings] :is([data-prts-baker-options], [data-prts-composer-glass-setting]) [data-prts-setting-row] { display: grid; grid-template-columns: minmax(0, 1fr); gap: 5px; padding: 8px 0; }
876
+ & [data-prts-theme-settings] :is([data-prts-baker-options], [data-prts-composer-glass-setting]) [data-prts-setting-row] > span { display: grid; gap: 4px; min-width: 0; }
877
+ & [data-prts-theme-settings] :is([data-prts-baker-options], [data-prts-composer-glass-setting]) [data-prts-setting-row] > [data-prts-setting-switch] { justify-self: start; }
875
878
  [data-prts-conversation-settings] header{display:grid;gap:5px}
876
879
  [data-prts-conversation-settings] small{display:block;color:var(--prts-muted);font-size:12px;line-height:1.6}
877
880
  [data-prts-conversation-cards]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
@@ -0,0 +1,168 @@
1
+ .glass-surface {
2
+ position: relative;
3
+ display: flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ overflow: hidden;
7
+ transition: opacity 0.26s ease-out;
8
+ }
9
+
10
+ .glass-surface__filter {
11
+ width: 100%;
12
+ height: 100%;
13
+ pointer-events: none;
14
+ position: absolute;
15
+ inset: 0;
16
+ opacity: 0;
17
+ z-index: -1;
18
+ }
19
+
20
+ .glass-surface__content {
21
+ width: 100%;
22
+ height: 100%;
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ padding: 0.5rem;
27
+ border-radius: inherit;
28
+ position: relative;
29
+ z-index: 1;
30
+ }
31
+
32
+ .glass-surface--svg {
33
+ background: light-dark(hsl(0 0% 100% / var(--glass-frost, 0)), hsl(0 0% 0% / var(--glass-frost, 0)));
34
+ backdrop-filter: var(--filter-id, url(#glass-filter)) saturate(var(--glass-saturation, 1));
35
+ box-shadow:
36
+ 0 0 2px 1px light-dark(color-mix(in oklch, black, transparent 85%), color-mix(in oklch, white, transparent 65%))
37
+ inset,
38
+ 0 0 10px 4px light-dark(color-mix(in oklch, black, transparent 90%), color-mix(in oklch, white, transparent 85%))
39
+ inset,
40
+ 0px 4px 16px rgba(17, 17, 26, 0.05),
41
+ 0px 8px 24px rgba(17, 17, 26, 0.05),
42
+ 0px 16px 56px rgba(17, 17, 26, 0.05),
43
+ 0px 4px 16px rgba(17, 17, 26, 0.05) inset,
44
+ 0px 8px 24px rgba(17, 17, 26, 0.05) inset,
45
+ 0px 16px 56px rgba(17, 17, 26, 0.05) inset;
46
+ }
47
+
48
+ .glass-surface--webgl {
49
+ box-shadow:
50
+ 0px 4px 16px rgba(17, 17, 26, 0.05),
51
+ 0px 8px 24px rgba(17, 17, 26, 0.05),
52
+ 0px 16px 56px rgba(17, 17, 26, 0.05);
53
+ }
54
+
55
+ .glass-surface__canvas,
56
+ .glass-surface__frame {
57
+ position: absolute;
58
+ inset: 0;
59
+ width: 100%;
60
+ height: 100%;
61
+ border-radius: inherit;
62
+ pointer-events: none;
63
+ }
64
+
65
+ .glass-surface__frame {
66
+ background: light-dark(hsl(0 0% 100% / var(--glass-frost, 0)), hsl(0 0% 0% / var(--glass-frost, 0)));
67
+ box-shadow:
68
+ 0 0 2px 1px light-dark(color-mix(in oklch, black, transparent 85%), color-mix(in oklch, white, transparent 65%))
69
+ inset,
70
+ 0 0 10px 4px light-dark(color-mix(in oklch, black, transparent 90%), color-mix(in oklch, white, transparent 85%))
71
+ inset,
72
+ 0px 4px 16px rgba(17, 17, 26, 0.05) inset,
73
+ 0px 8px 24px rgba(17, 17, 26, 0.05) inset,
74
+ 0px 16px 56px rgba(17, 17, 26, 0.05) inset;
75
+ }
76
+
77
+ .glass-surface--fallback {
78
+ background: light-dark(
79
+ hsl(0 0% 100% / calc(0.12 + var(--glass-frost, 0) * 0.5)),
80
+ hsl(0 0% 100% / calc(0.04 + var(--glass-frost, 0) * 0.3))
81
+ );
82
+ -webkit-backdrop-filter: blur(12px) saturate(calc(var(--glass-saturation, 1) * 1.4)) brightness(1.04);
83
+ backdrop-filter: blur(12px) saturate(calc(var(--glass-saturation, 1) * 1.4)) brightness(1.04);
84
+ box-shadow:
85
+ inset 0 1px 0 0 light-dark(hsl(0 0% 100% / 0.85), hsl(0 0% 100% / 0.3)),
86
+ inset 0 -1px 0 0 light-dark(hsl(0 0% 100% / 0.35), hsl(0 0% 100% / 0.08)),
87
+ 0 0 2px 1px light-dark(color-mix(in oklch, black, transparent 88%), color-mix(in oklch, white, transparent 72%))
88
+ inset,
89
+ 0 0 12px 3px light-dark(color-mix(in oklch, white, transparent 72%), color-mix(in oklch, white, transparent 90%))
90
+ inset,
91
+ 0px 4px 16px rgba(17, 17, 26, 0.06),
92
+ 0px 8px 24px rgba(17, 17, 26, 0.06),
93
+ 0px 16px 56px rgba(17, 17, 26, 0.06);
94
+ }
95
+
96
+ .glass-surface__sheen,
97
+ .glass-surface__rim {
98
+ position: absolute;
99
+ inset: 0;
100
+ border-radius: inherit;
101
+ pointer-events: none;
102
+ }
103
+
104
+ .glass-surface__sheen {
105
+ background: linear-gradient(
106
+ 135deg,
107
+ light-dark(hsl(0 0% 100% / 0.42), hsl(0 0% 100% / 0.14)) 0%,
108
+ transparent 42%,
109
+ transparent 64%,
110
+ light-dark(hsl(0 0% 100% / 0.18), hsl(0 0% 100% / 0.05)) 100%
111
+ );
112
+ }
113
+
114
+ .glass-surface__rim {
115
+ padding: 3px;
116
+ background: linear-gradient(
117
+ 150deg,
118
+ light-dark(hsl(0 0% 100% / 0.7), hsl(0 0% 100% / 0.34)),
119
+ light-dark(hsl(0 0% 100% / 0.1), hsl(0 0% 100% / 0.03)) 45%,
120
+ light-dark(hsl(0 0% 100% / 0.08), hsl(0 0% 100% / 0.02)) 60%,
121
+ light-dark(hsl(0 0% 100% / 0.42), hsl(0 0% 100% / 0.18))
122
+ );
123
+ -webkit-mask:
124
+ linear-gradient(#000 0 0) content-box,
125
+ linear-gradient(#000 0 0);
126
+ -webkit-mask-composite: xor;
127
+ mask:
128
+ linear-gradient(#000 0 0) content-box exclude,
129
+ linear-gradient(#000 0 0);
130
+ }
131
+
132
+ .glass-surface__line,
133
+ .glass-surface__glow {
134
+ position: absolute;
135
+ inset: 0;
136
+ pointer-events: none;
137
+ -webkit-mask-size: 100% 100%;
138
+ mask-size: 100% 100%;
139
+ }
140
+
141
+ .glass-surface--svg .glass-surface__line,
142
+ .glass-surface--webgl .glass-surface__line {
143
+ background: light-dark(color-mix(in oklch, black, transparent 85%), color-mix(in oklch, white, transparent 65%));
144
+ }
145
+
146
+ .glass-surface--svg .glass-surface__glow,
147
+ .glass-surface--webgl .glass-surface__glow {
148
+ background: light-dark(color-mix(in oklch, black, transparent 90%), color-mix(in oklch, white, transparent 85%));
149
+ }
150
+
151
+ .glass-surface--fallback .glass-surface__line {
152
+ background: light-dark(color-mix(in oklch, black, transparent 88%), color-mix(in oklch, white, transparent 72%));
153
+ }
154
+
155
+ .glass-surface--fallback .glass-surface__glow {
156
+ background: light-dark(color-mix(in oklch, white, transparent 72%), color-mix(in oklch, white, transparent 90%));
157
+ }
158
+
159
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
160
+ .glass-surface--fallback {
161
+ background: light-dark(hsl(0 0% 100% / 0.72), hsl(0 0% 12% / 0.72));
162
+ }
163
+ }
164
+
165
+ .glass-surface:focus-visible {
166
+ outline: 2px solid light-dark(#007aff, #0a84ff);
167
+ outline-offset: 2px;
168
+ }