dsh-better-sidebar 0.10.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 +21 -0
- package/README.md +139 -0
- package/README_EN.md +139 -0
- package/lib/client-docx.js +7649 -0
- package/lib/client-editor.js +32677 -0
- package/lib/client-pptx.js +63438 -0
- package/lib/client-registry.js +8021 -0
- package/lib/client-terminal.js +8060 -0
- package/lib/client-xlsx.js +359755 -0
- package/lib/client.js +8021 -0
- package/lib/index.js +2604 -0
- package/lib/invariant.js +22 -0
- package/lib/types/agent-pty.d.ts +220 -0
- package/lib/types/browser-probe.d.ts +15 -0
- package/lib/types/bundle-route.d.ts +13 -0
- package/lib/types/client/BrowserView.d.ts +22 -0
- package/lib/types/client/DiffTab.d.ts +6 -0
- package/lib/types/client/DiffView.d.ts +51 -0
- package/lib/types/client/EditorHost.d.ts +10 -0
- package/lib/types/client/ExplorerView.d.ts +9 -0
- package/lib/types/client/GitView.d.ts +8 -0
- package/lib/types/client/OrphanedTab.d.ts +11 -0
- package/lib/types/client/PdfView.d.ts +6 -0
- package/lib/types/client/PptxView.d.ts +6 -0
- package/lib/types/client/SandboxStatusBar.d.ts +10 -0
- package/lib/types/client/SideCardSection.d.ts +27 -0
- package/lib/types/client/Sidebar.d.ts +6 -0
- package/lib/types/client/SubagentView.d.ts +16 -0
- package/lib/types/client/TabBar.d.ts +38 -0
- package/lib/types/client/TerminalView.d.ts +8 -0
- package/lib/types/client/TextEditor.d.ts +10 -0
- package/lib/types/client/api.d.ts +170 -0
- package/lib/types/client/binary-download.d.ts +12 -0
- package/lib/types/client/breakpoints.d.ts +12 -0
- package/lib/types/client/browser.d.ts +50 -0
- package/lib/types/client/builtins/index.d.ts +17 -0
- package/lib/types/client/builtins/tabs.d.ts +6 -0
- package/lib/types/client/builtins/viewers.d.ts +3 -0
- package/lib/types/client/chunk-loader.d.ts +74 -0
- package/lib/types/client/chunks/docx.d.ts +8 -0
- package/lib/types/client/chunks/editor.d.ts +9 -0
- package/lib/types/client/chunks/pptx.d.ts +8 -0
- package/lib/types/client/chunks/terminal.d.ts +9 -0
- package/lib/types/client/chunks/xlsx.d.ts +9 -0
- package/lib/types/client/cm-themes.d.ts +24 -0
- package/lib/types/client/conversation-draft.d.ts +14 -0
- package/lib/types/client/docx-view.d.ts +8 -0
- package/lib/types/client/editor-load.d.ts +66 -0
- package/lib/types/client/icons.d.ts +47 -0
- package/lib/types/client/image-types.d.ts +3 -0
- package/lib/types/client/ime-guard.d.ts +36 -0
- package/lib/types/client/index.d.ts +10 -0
- package/lib/types/client/intercept.d.ts +20 -0
- package/lib/types/client/lang.d.ts +12 -0
- package/lib/types/client/lazy-chunk.d.ts +25 -0
- package/lib/types/client/link-intercept.d.ts +35 -0
- package/lib/types/client/locales.d.ts +237 -0
- package/lib/types/client/office-shared.d.ts +33 -0
- package/lib/types/client/office-types.d.ts +36 -0
- package/lib/types/client/office-view.d.ts +12 -0
- package/lib/types/client/openpath-intercept.d.ts +41 -0
- package/lib/types/client/paths.d.ts +19 -0
- package/lib/types/client/pdf-types.d.ts +2 -0
- package/lib/types/client/prefs.d.ts +30 -0
- package/lib/types/client/produced-files.d.ts +27 -0
- package/lib/types/client/selection-payload.d.ts +27 -0
- package/lib/types/client/service.d.ts +214 -0
- package/lib/types/client/split-pane.d.ts +29 -0
- package/lib/types/client/state.d.ts +322 -0
- package/lib/types/client/subagent-activity.d.ts +35 -0
- package/lib/types/client/subagent-detect.d.ts +47 -0
- package/lib/types/client/subagent-jobs.d.ts +63 -0
- package/lib/types/client/theme.d.ts +28 -0
- package/lib/types/client/xlsx-to-univer.d.ts +33 -0
- package/lib/types/client/xlsx-view.d.ts +10 -0
- package/lib/types/config.d.ts +41 -0
- package/lib/types/context-types.d.ts +431 -0
- package/lib/types/fs-tree.d.ts +41 -0
- package/lib/types/git.d.ts +75 -0
- package/lib/types/html-route.d.ts +48 -0
- package/lib/types/index.d.ts +39 -0
- package/lib/types/invariant.d.ts +15 -0
- package/lib/types/jobs-routes.d.ts +45 -0
- package/lib/types/prefs-shared.d.ts +106 -0
- package/lib/types/pty-manager.d.ts +76 -0
- package/lib/types/tools.d.ts +28 -0
- package/lib/types/trust-fence.d.ts +24 -0
- package/lib/types/wire.d.ts +38 -0
- package/package.json +168 -0
- package/src/agent-pty.ts +519 -0
- package/src/browser-probe.ts +26 -0
- package/src/bundle-route.ts +130 -0
- package/src/client/BrowserView.tsx +253 -0
- package/src/client/DiffTab.tsx +110 -0
- package/src/client/DiffView.tsx +266 -0
- package/src/client/EditorHost.tsx +101 -0
- package/src/client/ExplorerView.tsx +283 -0
- package/src/client/GitView.tsx +540 -0
- package/src/client/OrphanedTab.tsx +27 -0
- package/src/client/PdfView.tsx +110 -0
- package/src/client/PptxView.tsx +131 -0
- package/src/client/SandboxStatusBar.tsx +60 -0
- package/src/client/SideCardSection.module.css +271 -0
- package/src/client/SideCardSection.tsx +426 -0
- package/src/client/Sidebar.tsx +861 -0
- package/src/client/SubagentView.module.css +547 -0
- package/src/client/SubagentView.tsx +866 -0
- package/src/client/TabBar.tsx +188 -0
- package/src/client/TerminalView.tsx +233 -0
- package/src/client/TextEditor.tsx +382 -0
- package/src/client/api.ts +215 -0
- package/src/client/binary-download.tsx +23 -0
- package/src/client/breakpoints.ts +51 -0
- package/src/client/browser.ts +119 -0
- package/src/client/builtins/index.ts +33 -0
- package/src/client/builtins/tabs.tsx +211 -0
- package/src/client/builtins/viewers.tsx +151 -0
- package/src/client/chunk-loader.ts +196 -0
- package/src/client/chunks/docx.tsx +8 -0
- package/src/client/chunks/editor.tsx +9 -0
- package/src/client/chunks/pptx.tsx +8 -0
- package/src/client/chunks/terminal.tsx +9 -0
- package/src/client/chunks/xlsx.tsx +9 -0
- package/src/client/cm-themes.ts +129 -0
- package/src/client/conversation-draft.ts +29 -0
- package/src/client/css-modules.d.ts +5 -0
- package/src/client/docx-view.tsx +113 -0
- package/src/client/editor-load.ts +92 -0
- package/src/client/icons.tsx +137 -0
- package/src/client/image-types.ts +8 -0
- package/src/client/ime-guard.ts +47 -0
- package/src/client/index.tsx +238 -0
- package/src/client/intercept.tsx +94 -0
- package/src/client/lang.ts +95 -0
- package/src/client/layout.css +54 -0
- package/src/client/lazy-chunk.tsx +89 -0
- package/src/client/link-intercept.ts +66 -0
- package/src/client/locales.ts +476 -0
- package/src/client/office-shared.tsx +40 -0
- package/src/client/office-types.ts +48 -0
- package/src/client/office-view.tsx +12 -0
- package/src/client/openpath-intercept.ts +62 -0
- package/src/client/paths.ts +28 -0
- package/src/client/pdf-types.ts +4 -0
- package/src/client/prefs.ts +100 -0
- package/src/client/produced-files.ts +87 -0
- package/src/client/selection-payload.ts +86 -0
- package/src/client/service.ts +434 -0
- package/src/client/sidebar.module.css +1917 -0
- package/src/client/split-pane.tsx +292 -0
- package/src/client/state.ts +1048 -0
- package/src/client/subagent-activity.ts +67 -0
- package/src/client/subagent-detect.ts +125 -0
- package/src/client/subagent-jobs.ts +161 -0
- package/src/client/theme.ts +44 -0
- package/src/client/xlsx-to-univer.ts +260 -0
- package/src/client/xlsx-view.tsx +116 -0
- package/src/config.ts +95 -0
- package/src/context-types.ts +445 -0
- package/src/fs-tree.ts +115 -0
- package/src/git.ts +236 -0
- package/src/html-route.ts +70 -0
- package/src/index.ts +897 -0
- package/src/invariant.ts +32 -0
- package/src/jobs-routes.ts +257 -0
- package/src/prefs-shared.ts +127 -0
- package/src/pty-manager.ts +199 -0
- package/src/tools.ts +477 -0
- package/src/trust-fence.ts +77 -0
- package/src/wire.ts +94 -0
|
@@ -0,0 +1,1917 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sidebar styles. Per the DSH web-styling rules every visual value rides the
|
|
3
|
+
* theme: --dsw-alias-* semantic tokens for colors, --dsw-font-* typography
|
|
4
|
+
* roles (size paired with line-height), and --ds-* for motion. The chrome
|
|
5
|
+
* mirrors the native DSH sidebar: flat (NO box-shadows anywhere), the
|
|
6
|
+
* sidebar fill surface, hairline borders, and the 28/36px circular icon
|
|
7
|
+
* controls with hover fills. No static palette values, no color literals, no
|
|
8
|
+
* theme selectors — light/dark adaptation is the theme package's job.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/* ── Shell ─────────────────────────────────────────────────────────────── */
|
|
12
|
+
|
|
13
|
+
/* The persistent expand/collapse cluster at the top-right corner: two rail
|
|
14
|
+
controls side by side (bottom panel's glyph LEFT of the right panel's).
|
|
15
|
+
Always pinned to the viewport corner — inside the right panel's top-right
|
|
16
|
+
while it is open, sitting flush in the 34px tab strip (28px buttons at
|
|
17
|
+
top: 3) whose right end it really squeezes. */
|
|
18
|
+
.toggleCluster {
|
|
19
|
+
position: fixed;
|
|
20
|
+
top: 3px;
|
|
21
|
+
right: 10px;
|
|
22
|
+
z-index: 55;
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: row;
|
|
25
|
+
gap: 4px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* The tab strip of the OPEN right panel reserves the cluster's width at its
|
|
29
|
+
right end, so the tabs and the + menu genuinely yield space to the cluster
|
|
30
|
+
(never hiding under it). */
|
|
31
|
+
.panel:not(.panelHidden) .tabBar {
|
|
32
|
+
padding-right: 72px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* The closed-state affordance is the native rail icon control: a plain
|
|
36
|
+
28px circle (the app's icon-button size — the cluster must stay inside
|
|
37
|
+
the 34px tab-strip band so it never covers the pane headers below),
|
|
38
|
+
transparent fill, secondary ink; hover raises the fill. No border, no
|
|
39
|
+
shadow — the icon alone is the affordance. */
|
|
40
|
+
.toggleButton {
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
width: 28px;
|
|
45
|
+
height: 28px;
|
|
46
|
+
border: none;
|
|
47
|
+
border-radius: 50%;
|
|
48
|
+
background: transparent;
|
|
49
|
+
color: var(--dsw-alias-label-secondary);
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
transition:
|
|
52
|
+
background var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
53
|
+
color var(--ds-transition-duration-slow) var(--ds-ease-in-out);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.toggleButton:hover:not(:disabled) {
|
|
57
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
58
|
+
color: var(--dsw-alias-label-primary);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.toggleButton:disabled {
|
|
62
|
+
opacity: 0.4;
|
|
63
|
+
cursor: default;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.panel {
|
|
67
|
+
position: fixed;
|
|
68
|
+
top: 0;
|
|
69
|
+
right: 0;
|
|
70
|
+
/* Full height: the bottom panel squeezes only the center column, so the
|
|
71
|
+
right panel never gives up any vertical position. */
|
|
72
|
+
bottom: 0;
|
|
73
|
+
z-index: 50;
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-direction: column;
|
|
76
|
+
/* The native sidebar surface: bluish-50 over white / bluish-900 over dark,
|
|
77
|
+
exactly like the app's own sidebar column (SidebarRoot .root). */
|
|
78
|
+
background: var(--dsw-specific-sidebar-fill);
|
|
79
|
+
border-left: 1px solid var(--dsw-alias-border-l2);
|
|
80
|
+
/* Expand/collapse slides the panel; fullscreen animates the width. */
|
|
81
|
+
transition:
|
|
82
|
+
transform var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
83
|
+
width var(--ds-transition-duration-slow) var(--ds-ease-in-out);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Collapsed: slid off-screen, interactive nothing, hidden after the slide. */
|
|
87
|
+
.panelHidden {
|
|
88
|
+
transform: translateX(102%);
|
|
89
|
+
pointer-events: none;
|
|
90
|
+
visibility: hidden;
|
|
91
|
+
transition:
|
|
92
|
+
transform var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
93
|
+
width var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
94
|
+
visibility 0s linear var(--ds-transition-duration-slow);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Width drags write at pointer cadence; easing would detach the edge. */
|
|
98
|
+
.panel[data-dragging] {
|
|
99
|
+
transition: none;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.panelResize {
|
|
103
|
+
position: absolute;
|
|
104
|
+
left: -4px;
|
|
105
|
+
top: 0;
|
|
106
|
+
bottom: 0;
|
|
107
|
+
width: 8px;
|
|
108
|
+
cursor: col-resize;
|
|
109
|
+
z-index: 2;
|
|
110
|
+
touch-action: none;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.panelResizeActive {
|
|
114
|
+
background: var(--dsw-alias-interactive-bg-hover-accent);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.panelBody {
|
|
118
|
+
flex: 1;
|
|
119
|
+
min-height: 0;
|
|
120
|
+
min-width: 0;
|
|
121
|
+
display: flex;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* ── Bottom panel ──────────────────────────────────────────────────────── */
|
|
125
|
+
|
|
126
|
+
/* The bottom panel: an independent workbench at the bottom of the CENTER
|
|
127
|
+
column only (the Sidebar shell writes left/right inline: from the app's
|
|
128
|
+
own left sidebar to the right panel's left edge) — the sidebars never
|
|
129
|
+
give up any position. Same surface as the right panel, with a top
|
|
130
|
+
hairline instead of the left one. */
|
|
131
|
+
.bottomPanel {
|
|
132
|
+
position: fixed;
|
|
133
|
+
bottom: 0;
|
|
134
|
+
z-index: 50;
|
|
135
|
+
display: flex;
|
|
136
|
+
flex-direction: column;
|
|
137
|
+
background: var(--dsw-specific-sidebar-fill);
|
|
138
|
+
border-top: 1px solid var(--dsw-alias-border-l2);
|
|
139
|
+
/* Expand/collapse slides the panel; height drags animate the height. */
|
|
140
|
+
transition:
|
|
141
|
+
transform var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
142
|
+
height var(--ds-transition-duration-slow) var(--ds-ease-in-out);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Collapsed: slid off-screen, interactive nothing, hidden after the slide. */
|
|
146
|
+
.bottomPanelHidden {
|
|
147
|
+
transform: translateY(102%);
|
|
148
|
+
pointer-events: none;
|
|
149
|
+
visibility: hidden;
|
|
150
|
+
transition:
|
|
151
|
+
transform var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
152
|
+
height var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
153
|
+
visibility 0s linear var(--ds-transition-duration-slow);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Height drags write at pointer cadence; easing would detach the edge. */
|
|
157
|
+
.bottomPanel[data-dragging] {
|
|
158
|
+
transition: none;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* The bottom panel's height drag: the top edge strip (mirror of the right
|
|
162
|
+
panel's width strip). */
|
|
163
|
+
.bottomResize {
|
|
164
|
+
position: absolute;
|
|
165
|
+
left: 0;
|
|
166
|
+
right: 0;
|
|
167
|
+
top: -4px;
|
|
168
|
+
height: 8px;
|
|
169
|
+
cursor: row-resize;
|
|
170
|
+
z-index: 2;
|
|
171
|
+
touch-action: none;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.bottomResizeActive {
|
|
175
|
+
background: var(--dsw-alias-interactive-bg-hover-accent);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* The bottom panel's close control: the app's icon-button pattern (28px
|
|
179
|
+
circle), pinned to the tab strip's right end — one tap collapses the
|
|
180
|
+
panel. The tab strips below reserve its width so the + menu never hides
|
|
181
|
+
under it. */
|
|
182
|
+
.bottomClose {
|
|
183
|
+
position: absolute;
|
|
184
|
+
top: 3px;
|
|
185
|
+
right: 6px;
|
|
186
|
+
z-index: 4;
|
|
187
|
+
display: inline-flex;
|
|
188
|
+
align-items: center;
|
|
189
|
+
justify-content: center;
|
|
190
|
+
width: 28px;
|
|
191
|
+
height: 28px;
|
|
192
|
+
padding: 0;
|
|
193
|
+
border: none;
|
|
194
|
+
border-radius: 50%;
|
|
195
|
+
background: transparent;
|
|
196
|
+
color: var(--dsw-alias-label-secondary);
|
|
197
|
+
cursor: pointer;
|
|
198
|
+
flex: none;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.bottomClose:hover:not(:disabled) {
|
|
202
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
203
|
+
color: var(--dsw-alias-label-primary);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* The bottom panel's tab strips reserve the close control's width at their
|
|
207
|
+
right end, so the + menu never hides under it. */
|
|
208
|
+
.bottomPanel .tabBar {
|
|
209
|
+
padding-right: 40px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* The shared corner (both panels open): the intersection of the right
|
|
213
|
+
panel's left edge and the bottom panel's top edge. Horizontal drags
|
|
214
|
+
resize the width, vertical drags the height — the two panels drag
|
|
215
|
+
against each other. */
|
|
216
|
+
.cornerHandle {
|
|
217
|
+
position: fixed;
|
|
218
|
+
width: 12px;
|
|
219
|
+
height: 12px;
|
|
220
|
+
z-index: 52;
|
|
221
|
+
cursor: nwse-resize;
|
|
222
|
+
touch-action: none;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.cornerHandle:hover,
|
|
226
|
+
.cornerHandle[data-dragging] {
|
|
227
|
+
background: var(--dsw-alias-interactive-bg-hover-accent);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Icon button: the app's own icon-button pattern (ui-workspace) — a 28px
|
|
231
|
+
circle, secondary label, hover fill; no border so the icon alone is the
|
|
232
|
+
affordance. */
|
|
233
|
+
.iconButton {
|
|
234
|
+
display: inline-flex;
|
|
235
|
+
align-items: center;
|
|
236
|
+
justify-content: center;
|
|
237
|
+
width: 28px;
|
|
238
|
+
height: 28px;
|
|
239
|
+
padding: 0;
|
|
240
|
+
border: none;
|
|
241
|
+
border-radius: 50%;
|
|
242
|
+
background: transparent;
|
|
243
|
+
color: var(--dsw-alias-label-secondary);
|
|
244
|
+
cursor: pointer;
|
|
245
|
+
flex: none;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
.iconButton:hover:not(:disabled) {
|
|
249
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
250
|
+
color: var(--dsw-alias-label-primary);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.iconButton:disabled {
|
|
254
|
+
opacity: 0.4;
|
|
255
|
+
cursor: default;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* ── Workbench / split panes ───────────────────────────────────────────── */
|
|
259
|
+
|
|
260
|
+
.workbench {
|
|
261
|
+
flex: 1;
|
|
262
|
+
min-width: 0;
|
|
263
|
+
min-height: 0;
|
|
264
|
+
display: flex;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.split {
|
|
268
|
+
flex: 1;
|
|
269
|
+
min-width: 0;
|
|
270
|
+
min-height: 0;
|
|
271
|
+
display: flex;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.splitRow {
|
|
275
|
+
flex-direction: row;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.splitCol {
|
|
279
|
+
flex-direction: column;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.splitChild {
|
|
283
|
+
position: relative;
|
|
284
|
+
display: flex;
|
|
285
|
+
overflow: hidden;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.divider {
|
|
289
|
+
position: relative;
|
|
290
|
+
flex: none;
|
|
291
|
+
z-index: 3;
|
|
292
|
+
touch-action: none;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/* The hit area stays 7px wide enough to grab, but the visual is a 1px
|
|
296
|
+
hairline centered in it — a divider line, not a thick band. */
|
|
297
|
+
.dividerRow::after,
|
|
298
|
+
.dividerCol::after {
|
|
299
|
+
content: '';
|
|
300
|
+
position: absolute;
|
|
301
|
+
background: var(--dsw-alias-border-l2);
|
|
302
|
+
transition: background var(--ds-transition-duration-slow) var(--ds-ease-in-out);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.dividerRow {
|
|
306
|
+
width: 7px;
|
|
307
|
+
margin: 0 -2px;
|
|
308
|
+
cursor: col-resize;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.dividerRow::after {
|
|
312
|
+
top: 0;
|
|
313
|
+
bottom: 0;
|
|
314
|
+
left: 50%;
|
|
315
|
+
width: 1px;
|
|
316
|
+
transform: translateX(-50%);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.dividerCol {
|
|
320
|
+
height: 7px;
|
|
321
|
+
margin: -2px 0;
|
|
322
|
+
cursor: row-resize;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.dividerCol::after {
|
|
326
|
+
left: 0;
|
|
327
|
+
right: 0;
|
|
328
|
+
top: 50%;
|
|
329
|
+
height: 1px;
|
|
330
|
+
transform: translateY(-50%);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.divider:hover::after,
|
|
334
|
+
.dividerActive::after {
|
|
335
|
+
background: var(--dsw-alias-interactive-bg-hover-accent);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.pane {
|
|
339
|
+
position: relative;
|
|
340
|
+
flex: 1;
|
|
341
|
+
min-width: 0;
|
|
342
|
+
min-height: 0;
|
|
343
|
+
display: flex;
|
|
344
|
+
flex-direction: column;
|
|
345
|
+
background: var(--dsw-alias-bg-base);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.paneDrop {
|
|
349
|
+
outline: 1px solid var(--dsw-alias-interactive-bg-hover-accent);
|
|
350
|
+
outline-offset: -1px;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/* VSCode-style drag-to-edge drop zones (25% edges, 50% center). */
|
|
354
|
+
.dropOverlay {
|
|
355
|
+
position: absolute;
|
|
356
|
+
z-index: 6;
|
|
357
|
+
pointer-events: none;
|
|
358
|
+
background: var(--dsw-alias-interactive-bg-hover-accent);
|
|
359
|
+
opacity: 0.5;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.dropLeft {
|
|
363
|
+
left: 0;
|
|
364
|
+
top: 0;
|
|
365
|
+
bottom: 0;
|
|
366
|
+
width: 25%;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.dropRight {
|
|
370
|
+
right: 0;
|
|
371
|
+
top: 0;
|
|
372
|
+
bottom: 0;
|
|
373
|
+
width: 25%;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.dropUp {
|
|
377
|
+
top: 0;
|
|
378
|
+
left: 0;
|
|
379
|
+
right: 0;
|
|
380
|
+
height: 25%;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.dropDown {
|
|
384
|
+
bottom: 0;
|
|
385
|
+
left: 0;
|
|
386
|
+
right: 0;
|
|
387
|
+
height: 25%;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
.dropCenter {
|
|
391
|
+
left: 25%;
|
|
392
|
+
right: 25%;
|
|
393
|
+
top: 25%;
|
|
394
|
+
bottom: 25%;
|
|
395
|
+
background: transparent;
|
|
396
|
+
outline: 2px dashed var(--dsw-alias-interactive-bg-hover-accent);
|
|
397
|
+
outline-offset: -2px;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.paneContent {
|
|
401
|
+
flex: 1;
|
|
402
|
+
min-height: 0;
|
|
403
|
+
display: flex;
|
|
404
|
+
flex-direction: column;
|
|
405
|
+
overflow: hidden;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* One tab's mounted content; inactive tabs stay mounted but hidden so
|
|
409
|
+
switching never tears down terminals/editors (state survives). */
|
|
410
|
+
.paneTab {
|
|
411
|
+
flex: 1;
|
|
412
|
+
min-height: 0;
|
|
413
|
+
display: flex;
|
|
414
|
+
flex-direction: column;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.paneTabHidden {
|
|
418
|
+
display: none;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* An empty pane's welcome cards: a responsive grid of compact cards — as
|
|
422
|
+
many per row as the pane width allows; rows that cannot fit the pane
|
|
423
|
+
height are clipped (never scrolled or squeezed smaller). */
|
|
424
|
+
.paneEmptyCards {
|
|
425
|
+
flex: 1;
|
|
426
|
+
min-height: 0;
|
|
427
|
+
display: grid;
|
|
428
|
+
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
|
|
429
|
+
align-content: start;
|
|
430
|
+
gap: 8px;
|
|
431
|
+
padding: 12px;
|
|
432
|
+
overflow: hidden;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.paneCard {
|
|
436
|
+
display: flex;
|
|
437
|
+
flex-direction: column;
|
|
438
|
+
align-items: center;
|
|
439
|
+
justify-content: center;
|
|
440
|
+
gap: 6px;
|
|
441
|
+
min-width: 0;
|
|
442
|
+
padding: 12px 8px;
|
|
443
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
444
|
+
border-radius: 8px;
|
|
445
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
446
|
+
color: var(--dsw-alias-label-secondary);
|
|
447
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
448
|
+
cursor: pointer;
|
|
449
|
+
text-align: center;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
.paneCard:hover:not(:disabled) {
|
|
453
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
454
|
+
color: var(--dsw-alias-label-primary);
|
|
455
|
+
border-color: var(--dsw-alias-border-l2);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.paneCard:disabled {
|
|
459
|
+
opacity: 0.45;
|
|
460
|
+
cursor: default;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/* ── Tab strip ─────────────────────────────────────────────────────────── */
|
|
464
|
+
|
|
465
|
+
.tabBar {
|
|
466
|
+
flex: none;
|
|
467
|
+
display: flex;
|
|
468
|
+
align-items: stretch;
|
|
469
|
+
height: 34px;
|
|
470
|
+
border-bottom: 1px solid var(--dsw-alias-border-l1);
|
|
471
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.tabBarDrop {
|
|
475
|
+
outline: 1px dashed var(--dsw-alias-interactive-bg-hover-accent);
|
|
476
|
+
outline-offset: -1px;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.tabList {
|
|
480
|
+
flex: 1;
|
|
481
|
+
min-width: 0;
|
|
482
|
+
display: flex;
|
|
483
|
+
overflow-x: auto;
|
|
484
|
+
scrollbar-width: none;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
.tabList::-webkit-scrollbar {
|
|
488
|
+
display: none;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.tab {
|
|
492
|
+
flex: none;
|
|
493
|
+
max-width: 160px;
|
|
494
|
+
min-width: 64px;
|
|
495
|
+
display: flex;
|
|
496
|
+
align-items: center;
|
|
497
|
+
gap: 4px;
|
|
498
|
+
padding: 0 4px 0 10px;
|
|
499
|
+
font: var(--dsw-font-xxs-12);
|
|
500
|
+
color: var(--dsw-alias-label-secondary);
|
|
501
|
+
border-right: 1px solid var(--dsw-alias-border-l1);
|
|
502
|
+
background: transparent;
|
|
503
|
+
cursor: pointer;
|
|
504
|
+
user-select: none;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
.tab:hover {
|
|
508
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
.tabActive {
|
|
512
|
+
color: var(--dsw-alias-label-primary);
|
|
513
|
+
/* Native selected fill (Rows .sessionRow.selected) — no underline, no shadow. */
|
|
514
|
+
background: var(--dsw-alias-interactive-bg-active);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.tabTitle {
|
|
518
|
+
flex: 1;
|
|
519
|
+
min-width: 0;
|
|
520
|
+
overflow: hidden;
|
|
521
|
+
text-overflow: ellipsis;
|
|
522
|
+
white-space: nowrap;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
.tabClose {
|
|
526
|
+
display: inline-flex;
|
|
527
|
+
align-items: center;
|
|
528
|
+
justify-content: center;
|
|
529
|
+
width: 18px;
|
|
530
|
+
height: 18px;
|
|
531
|
+
padding: 0;
|
|
532
|
+
border: none;
|
|
533
|
+
border-radius: 4px;
|
|
534
|
+
background: transparent;
|
|
535
|
+
color: var(--dsw-alias-label-tertiary);
|
|
536
|
+
cursor: pointer;
|
|
537
|
+
flex: none;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
.tabClose:hover {
|
|
541
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
542
|
+
color: var(--dsw-alias-label-primary);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.tabBarPlus {
|
|
546
|
+
flex: none;
|
|
547
|
+
align-self: center;
|
|
548
|
+
/* Adjacent to the rightmost tab; sticky so overflowing tab rows keep it
|
|
549
|
+
visible at the right edge of the scrollport. */
|
|
550
|
+
position: sticky;
|
|
551
|
+
right: 0;
|
|
552
|
+
display: inline-flex;
|
|
553
|
+
align-items: center;
|
|
554
|
+
justify-content: center;
|
|
555
|
+
width: 22px;
|
|
556
|
+
height: 22px;
|
|
557
|
+
margin: 0 6px;
|
|
558
|
+
padding: 0;
|
|
559
|
+
border: none;
|
|
560
|
+
border-radius: 5px;
|
|
561
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
562
|
+
color: var(--dsw-alias-label-tertiary);
|
|
563
|
+
cursor: pointer;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
.tabBarPlus:hover {
|
|
567
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
568
|
+
color: var(--dsw-alias-label-primary);
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/* ── Explorer ──────────────────────────────────────────────────────────── */
|
|
572
|
+
|
|
573
|
+
.explorer {
|
|
574
|
+
flex: 1;
|
|
575
|
+
min-height: 0;
|
|
576
|
+
display: flex;
|
|
577
|
+
flex-direction: column;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
.explorerHeader {
|
|
581
|
+
flex: none;
|
|
582
|
+
display: flex;
|
|
583
|
+
align-items: center;
|
|
584
|
+
justify-content: space-between;
|
|
585
|
+
gap: 8px;
|
|
586
|
+
height: 36px;
|
|
587
|
+
padding: 0 8px 0 12px;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
.explorerRoot {
|
|
591
|
+
font: var(--dsw-font-s-14);
|
|
592
|
+
color: var(--dsw-alias-label-secondary);
|
|
593
|
+
overflow: hidden;
|
|
594
|
+
text-overflow: ellipsis;
|
|
595
|
+
white-space: nowrap;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.explorerBody {
|
|
599
|
+
flex: 1;
|
|
600
|
+
min-height: 0;
|
|
601
|
+
overflow-y: auto;
|
|
602
|
+
padding: 2px 6px 8px;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/* One tree row: the app's session-row cell (34px, radius 8, inset, hover
|
|
606
|
+
fill, 22px indent step, 14px ink) with a mount fade so expanding a
|
|
607
|
+
directory reveals its children gently (stable keys keep existing rows from
|
|
608
|
+
replaying it). */
|
|
609
|
+
.explorerRow {
|
|
610
|
+
display: flex;
|
|
611
|
+
align-items: center;
|
|
612
|
+
gap: 6px;
|
|
613
|
+
width: 100%;
|
|
614
|
+
height: 34px;
|
|
615
|
+
padding: 0 8px;
|
|
616
|
+
border: none;
|
|
617
|
+
background: transparent;
|
|
618
|
+
font: var(--dsw-font-s-14);
|
|
619
|
+
color: var(--dsw-alias-label-primary);
|
|
620
|
+
text-align: left;
|
|
621
|
+
cursor: pointer;
|
|
622
|
+
white-space: nowrap;
|
|
623
|
+
border-radius: 8px;
|
|
624
|
+
animation: dsh-row-in 150ms var(--ds-ease-in-out);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
.explorerRow:hover {
|
|
628
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
.explorerDir {
|
|
632
|
+
font: var(--dsw-font-s-strong-14);
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
.explorerHidden {
|
|
636
|
+
opacity: 0.45;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
.explorerName {
|
|
640
|
+
overflow: hidden;
|
|
641
|
+
text-overflow: ellipsis;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/* The hover-revealed @-reference button at the row's far right (and the
|
|
645
|
+
transient "copied" label that replaces it after a copy). Hidden rows
|
|
646
|
+
keep the name at full width; hovering or focusing the row reveals it. */
|
|
647
|
+
.explorerRef {
|
|
648
|
+
flex: none;
|
|
649
|
+
display: none;
|
|
650
|
+
align-items: center;
|
|
651
|
+
height: 20px;
|
|
652
|
+
padding: 0 8px;
|
|
653
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
654
|
+
border-radius: 999px;
|
|
655
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
656
|
+
color: var(--dsw-alias-label-tertiary);
|
|
657
|
+
font: var(--dsw-font-xxxs-strong-11);
|
|
658
|
+
cursor: pointer;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
.explorerRef:hover {
|
|
662
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
663
|
+
color: var(--dsw-alias-label-primary);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
.explorerRow:hover .explorerRef,
|
|
667
|
+
.explorerRow:focus-within .explorerRef {
|
|
668
|
+
display: inline-flex;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
.explorerCopied {
|
|
672
|
+
flex: none;
|
|
673
|
+
font: var(--dsw-font-xxxs-11);
|
|
674
|
+
color: var(--dsw-alias-label-tertiary);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
.explorerError {
|
|
678
|
+
font: var(--dsw-font-xxs-12);
|
|
679
|
+
color: var(--dsw-alias-state-error-primary);
|
|
680
|
+
cursor: default;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/* Mount fade for tree rows (the app's session-row reveal). */
|
|
684
|
+
@keyframes dsh-row-in {
|
|
685
|
+
from { opacity: 0; }
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.explorerEmpty {
|
|
689
|
+
padding: 16px;
|
|
690
|
+
font: var(--dsw-font-xxs-12);
|
|
691
|
+
color: var(--dsw-alias-label-tertiary);
|
|
692
|
+
text-align: center;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/* ── Editor ────────────────────────────────────────────────────────────── */
|
|
696
|
+
|
|
697
|
+
.editor {
|
|
698
|
+
flex: 1;
|
|
699
|
+
min-height: 0;
|
|
700
|
+
display: flex;
|
|
701
|
+
flex-direction: column;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
.editorHeader {
|
|
705
|
+
flex: none;
|
|
706
|
+
display: flex;
|
|
707
|
+
align-items: center;
|
|
708
|
+
gap: 6px;
|
|
709
|
+
padding: 4px 8px;
|
|
710
|
+
border-bottom: 1px solid var(--dsw-alias-border-l1);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
.editorTitle {
|
|
714
|
+
flex: 1;
|
|
715
|
+
min-width: 0;
|
|
716
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
717
|
+
color: var(--dsw-alias-label-secondary);
|
|
718
|
+
overflow: hidden;
|
|
719
|
+
text-overflow: ellipsis;
|
|
720
|
+
white-space: nowrap;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
.editorStatus {
|
|
724
|
+
font: var(--dsw-font-xxxs-11);
|
|
725
|
+
color: var(--dsw-alias-label-tertiary);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
.editorStatusError {
|
|
729
|
+
color: var(--dsw-alias-state-error-primary);
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
.dirtyDot {
|
|
733
|
+
width: 7px;
|
|
734
|
+
height: 7px;
|
|
735
|
+
border-radius: 50%;
|
|
736
|
+
background: var(--dsw-alias-state-warn-primary);
|
|
737
|
+
flex: none;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
.editorPlaceholder {
|
|
741
|
+
flex: 1;
|
|
742
|
+
display: flex;
|
|
743
|
+
align-items: center;
|
|
744
|
+
justify-content: center;
|
|
745
|
+
font: var(--dsw-font-xxs-12);
|
|
746
|
+
color: var(--dsw-alias-label-tertiary);
|
|
747
|
+
padding: 16px;
|
|
748
|
+
text-align: center;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/* The unregistered tab type shown by the orphaned-tab placeholder. */
|
|
752
|
+
.orphanedType {
|
|
753
|
+
display: block;
|
|
754
|
+
margin-top: 8px;
|
|
755
|
+
font-size: 12px;
|
|
756
|
+
opacity: 0.7;
|
|
757
|
+
overflow-wrap: anywhere;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
/* Binary / download-only files (pptx, OLE .doc/.xls/.ppt, unknown binaries):
|
|
761
|
+
a centered notice plus a download link — the user always gets the file. */
|
|
762
|
+
.editorBinary {
|
|
763
|
+
flex: 1;
|
|
764
|
+
display: flex;
|
|
765
|
+
flex-direction: column;
|
|
766
|
+
align-items: center;
|
|
767
|
+
justify-content: center;
|
|
768
|
+
gap: 12px;
|
|
769
|
+
padding: 24px 16px;
|
|
770
|
+
text-align: center;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
.editorBinaryNotice {
|
|
774
|
+
font: var(--dsw-font-xxs-12);
|
|
775
|
+
color: var(--dsw-alias-label-tertiary);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
.editorDownloadLink {
|
|
779
|
+
display: inline-flex;
|
|
780
|
+
align-items: center;
|
|
781
|
+
gap: 6px;
|
|
782
|
+
padding: 6px 14px;
|
|
783
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
784
|
+
border-radius: 6px;
|
|
785
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
786
|
+
color: var(--dsw-alias-label-primary);
|
|
787
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
788
|
+
text-decoration: none;
|
|
789
|
+
cursor: pointer;
|
|
790
|
+
transition:
|
|
791
|
+
background var(--ds-transition-duration-slow) var(--ds-ease-in-out),
|
|
792
|
+
border-color var(--ds-transition-duration-slow) var(--ds-ease-in-out);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
.editorDownloadLink:hover {
|
|
796
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
797
|
+
border-color: var(--dsw-alias-border-l2);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
.editorError {
|
|
801
|
+
padding: 12px 16px;
|
|
802
|
+
font: var(--dsw-font-xxs-12);
|
|
803
|
+
color: var(--dsw-alias-state-error-primary);
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
.editorBanner {
|
|
807
|
+
flex: none;
|
|
808
|
+
padding: 4px 12px;
|
|
809
|
+
font: var(--dsw-font-xxxs-11);
|
|
810
|
+
color: var(--dsw-alias-state-warn-label);
|
|
811
|
+
background: var(--dsw-alias-state-warn-tertiary);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/* Live sandbox status row (HTML preview / browser tab): GREEN while the
|
|
815
|
+
sandbox is on (with the one-tap temporary unlock), RED while it is off
|
|
816
|
+
(global setting or temporary unlock) — the red state is the persistent
|
|
817
|
+
warning that the page runs on the GUI's own origin. */
|
|
818
|
+
.sandboxStatus {
|
|
819
|
+
flex: none;
|
|
820
|
+
display: flex;
|
|
821
|
+
align-items: center;
|
|
822
|
+
gap: 8px;
|
|
823
|
+
padding: 4px 10px;
|
|
824
|
+
font: var(--dsw-font-xxxs-11);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
.sandboxStatusOn {
|
|
828
|
+
color: var(--dsw-alias-label-secondary);
|
|
829
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
830
|
+
border-bottom: 1px solid var(--dsw-alias-border-l1);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
.sandboxStatusOff {
|
|
834
|
+
color: var(--dsw-alias-state-error-primary);
|
|
835
|
+
background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);
|
|
836
|
+
border-bottom: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
.sandboxDot {
|
|
840
|
+
flex: none;
|
|
841
|
+
width: 6px;
|
|
842
|
+
height: 6px;
|
|
843
|
+
border-radius: 50%;
|
|
844
|
+
background: var(--dsw-alias-state-success-primary);
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
.sandboxStatusOff .sandboxDot {
|
|
848
|
+
background: var(--dsw-alias-state-error-primary);
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
.sandboxStatusText {
|
|
852
|
+
flex: 1;
|
|
853
|
+
min-width: 0;
|
|
854
|
+
overflow: hidden;
|
|
855
|
+
text-overflow: ellipsis;
|
|
856
|
+
white-space: nowrap;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
.sandboxAction {
|
|
860
|
+
flex: none;
|
|
861
|
+
padding: 2px 8px;
|
|
862
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
863
|
+
border-radius: 6px;
|
|
864
|
+
background: transparent;
|
|
865
|
+
font: inherit;
|
|
866
|
+
color: inherit;
|
|
867
|
+
cursor: pointer;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
.sandboxAction:hover {
|
|
871
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
/* The HTML preview iframe: fills the editor body. Route-src (never srcdoc)
|
|
875
|
+
so the frame is cross-origin by construction even if the sandbox
|
|
876
|
+
attribute is ever dropped; sandboxed by default (see TextEditor). */
|
|
877
|
+
.editorHtml {
|
|
878
|
+
flex: 1;
|
|
879
|
+
min-height: 0;
|
|
880
|
+
width: 100%;
|
|
881
|
+
border: none;
|
|
882
|
+
background: var(--dsw-alias-bg-base);
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
/* ── Browser tab ──────────────────────────────────────────────────────── */
|
|
886
|
+
|
|
887
|
+
.browser {
|
|
888
|
+
flex: 1;
|
|
889
|
+
min-height: 0;
|
|
890
|
+
display: flex;
|
|
891
|
+
flex-direction: column;
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
.browserBar {
|
|
895
|
+
flex: none;
|
|
896
|
+
display: flex;
|
|
897
|
+
align-items: center;
|
|
898
|
+
gap: 4px;
|
|
899
|
+
padding: 6px 8px;
|
|
900
|
+
border-bottom: 1px solid var(--dsw-alias-border-l1);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
.browserInput {
|
|
904
|
+
flex: 1;
|
|
905
|
+
min-width: 0;
|
|
906
|
+
height: 28px;
|
|
907
|
+
padding: 0 10px;
|
|
908
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
909
|
+
border-radius: 6px;
|
|
910
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
911
|
+
color: var(--dsw-alias-label-primary);
|
|
912
|
+
font: var(--dsw-font-xxs-12);
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
.browserInput:focus {
|
|
916
|
+
outline: none;
|
|
917
|
+
border-color: var(--dsw-alias-border-l2);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
.browserMessage {
|
|
921
|
+
flex: none;
|
|
922
|
+
padding: 4px 12px;
|
|
923
|
+
font: var(--dsw-font-xxxs-11);
|
|
924
|
+
color: var(--dsw-alias-state-warn-label);
|
|
925
|
+
background: var(--dsw-alias-state-warn-tertiary);
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
.browserFrame {
|
|
929
|
+
flex: 1;
|
|
930
|
+
min-height: 0;
|
|
931
|
+
width: 100%;
|
|
932
|
+
border: none;
|
|
933
|
+
background: var(--dsw-alias-bg-base);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
.browserStart {
|
|
937
|
+
flex: 1;
|
|
938
|
+
min-height: 0;
|
|
939
|
+
display: flex;
|
|
940
|
+
align-items: center;
|
|
941
|
+
justify-content: center;
|
|
942
|
+
padding: 20px;
|
|
943
|
+
text-align: center;
|
|
944
|
+
font: var(--dsw-font-xs-13);
|
|
945
|
+
color: var(--dsw-alias-label-tertiary);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
/* Embed-refusal panel (X-Frame-Options / frame-ancestors): replaces the
|
|
949
|
+
blank refused iframe with the reason + open-in-browser actions. */
|
|
950
|
+
.browserBlocked {
|
|
951
|
+
flex: 1;
|
|
952
|
+
min-height: 0;
|
|
953
|
+
display: flex;
|
|
954
|
+
flex-direction: column;
|
|
955
|
+
align-items: center;
|
|
956
|
+
justify-content: center;
|
|
957
|
+
gap: 6px;
|
|
958
|
+
padding: 24px;
|
|
959
|
+
text-align: center;
|
|
960
|
+
color: var(--dsw-alias-state-warn-primary);
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
.browserBlockedTitle {
|
|
964
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
965
|
+
color: var(--dsw-alias-label-primary);
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
.browserBlockedDesc {
|
|
969
|
+
max-width: 280px;
|
|
970
|
+
font: var(--dsw-font-xxxs-11);
|
|
971
|
+
color: var(--dsw-alias-label-secondary);
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
.browserBlockedActions {
|
|
975
|
+
display: flex;
|
|
976
|
+
gap: 8px;
|
|
977
|
+
margin-top: 6px;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
.browserBlockedButton {
|
|
981
|
+
padding: 4px 12px;
|
|
982
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
983
|
+
border-radius: 6px;
|
|
984
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
985
|
+
color: var(--dsw-alias-label-primary);
|
|
986
|
+
font: var(--dsw-font-xxxs-11);
|
|
987
|
+
cursor: pointer;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
.browserBlockedButton:hover {
|
|
991
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
.editorCm {
|
|
995
|
+
flex: 1;
|
|
996
|
+
min-height: 0;
|
|
997
|
+
overflow: hidden;
|
|
998
|
+
background: transparent;
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
.editorCmHidden {
|
|
1002
|
+
display: none;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
/* CodeMirror fills the pane; the theme supplies its own token palette
|
|
1006
|
+
(a designed dark theme, same policy as the xterm palette). */
|
|
1007
|
+
.editorCm :global(.cm-editor) {
|
|
1008
|
+
height: 100%;
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
.editorCm :global(.cm-editor.cm-focused) {
|
|
1012
|
+
outline: none;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/* Preview / edit segmented toggle (markdown and other previewable files). */
|
|
1016
|
+
.editorModeToggle {
|
|
1017
|
+
flex: none;
|
|
1018
|
+
display: inline-flex;
|
|
1019
|
+
align-items: center;
|
|
1020
|
+
gap: 2px;
|
|
1021
|
+
padding: 2px;
|
|
1022
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
1023
|
+
border-radius: 6px;
|
|
1024
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
.editorModeButton {
|
|
1028
|
+
padding: 2px 8px;
|
|
1029
|
+
border: none;
|
|
1030
|
+
border-radius: 4px;
|
|
1031
|
+
background: transparent;
|
|
1032
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1033
|
+
font: var(--dsw-font-xxxs-11);
|
|
1034
|
+
cursor: pointer;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
.editorModeButton:hover {
|
|
1038
|
+
color: var(--dsw-alias-label-primary);
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
.editorModeActive {
|
|
1042
|
+
background: var(--dsw-alias-bg-base);
|
|
1043
|
+
color: var(--dsw-alias-label-primary);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
.editorImageWrap {
|
|
1047
|
+
flex: 1;
|
|
1048
|
+
min-height: 0;
|
|
1049
|
+
display: flex;
|
|
1050
|
+
align-items: center;
|
|
1051
|
+
justify-content: center;
|
|
1052
|
+
overflow: auto;
|
|
1053
|
+
padding: 12px;
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
.editorImage {
|
|
1057
|
+
max-width: 100%;
|
|
1058
|
+
max-height: 100%;
|
|
1059
|
+
object-fit: contain;
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
.editorMd {
|
|
1063
|
+
flex: 1;
|
|
1064
|
+
min-height: 0;
|
|
1065
|
+
overflow-y: auto;
|
|
1066
|
+
padding: 10px 14px;
|
|
1067
|
+
font: var(--dsw-font-xs-13);
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
/* The floating "add to conversation" button anchored above a text
|
|
1071
|
+
selection in the preview/code viewers. Portalled to document.body and
|
|
1072
|
+
position:fixed, so the editor's overflow clips cannot crop it; flat
|
|
1073
|
+
chrome like the rest of the sidebar (hairline border, layer-2 fill,
|
|
1074
|
+
hover fill — no shadow). */
|
|
1075
|
+
.selectionPopup {
|
|
1076
|
+
position: fixed;
|
|
1077
|
+
z-index: 60;
|
|
1078
|
+
transform: translate(-50%, calc(-100% - 8px));
|
|
1079
|
+
display: inline-flex;
|
|
1080
|
+
align-items: center;
|
|
1081
|
+
height: 28px;
|
|
1082
|
+
padding: 0 10px;
|
|
1083
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
1084
|
+
border-radius: 6px;
|
|
1085
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
1086
|
+
color: var(--dsw-alias-label-primary);
|
|
1087
|
+
font: var(--dsw-font-xxxs-strong-11);
|
|
1088
|
+
white-space: nowrap;
|
|
1089
|
+
cursor: pointer;
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
.selectionPopup:hover {
|
|
1093
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
/* Word preview: the document scrolls independently while the zoom control
|
|
1097
|
+
stays pinned to the bottom edge. */
|
|
1098
|
+
.editorDocx {
|
|
1099
|
+
flex: 1;
|
|
1100
|
+
min-height: 0;
|
|
1101
|
+
display: flex;
|
|
1102
|
+
flex-direction: column;
|
|
1103
|
+
background: var(--dsw-alias-bg-base);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
.editorDocxViewport {
|
|
1107
|
+
flex: 1;
|
|
1108
|
+
min-height: 0;
|
|
1109
|
+
display: flex;
|
|
1110
|
+
flex-direction: column;
|
|
1111
|
+
overflow: auto;
|
|
1112
|
+
background: var(--dsw-alias-bg-base);
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
/* docx-preview renders into a wrapper div with .docx className; the host
|
|
1116
|
+
above scrolls while the wrapper holds the page flow. */
|
|
1117
|
+
.editorDocxWrap {
|
|
1118
|
+
flex: none;
|
|
1119
|
+
padding: 16px;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
.editorDocxZoom {
|
|
1123
|
+
flex: none;
|
|
1124
|
+
display: flex;
|
|
1125
|
+
align-items: center;
|
|
1126
|
+
gap: 8px;
|
|
1127
|
+
min-height: 34px;
|
|
1128
|
+
padding: 4px 10px;
|
|
1129
|
+
border-top: 1px solid var(--dsw-alias-border-l1);
|
|
1130
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
.editorDocxZoomHint,
|
|
1134
|
+
.editorDocxZoomValue {
|
|
1135
|
+
flex: none;
|
|
1136
|
+
font: var(--dsw-font-xxxs-11);
|
|
1137
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
.editorDocxZoomValue {
|
|
1141
|
+
width: 36px;
|
|
1142
|
+
text-align: right;
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
.editorDocxZoomRange {
|
|
1146
|
+
flex: 1;
|
|
1147
|
+
min-width: 72px;
|
|
1148
|
+
accent-color: var(--dsw-alias-brand-primary);
|
|
1149
|
+
cursor: pointer;
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
.editorPdf {
|
|
1153
|
+
flex: 1;
|
|
1154
|
+
min-height: 0;
|
|
1155
|
+
display: flex;
|
|
1156
|
+
flex-direction: column;
|
|
1157
|
+
background: var(--dsw-alias-bg-base);
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
.editorPdfToolbar {
|
|
1161
|
+
flex: none;
|
|
1162
|
+
display: flex;
|
|
1163
|
+
justify-content: flex-end;
|
|
1164
|
+
padding: 6px 8px;
|
|
1165
|
+
border-bottom: 1px solid var(--dsw-alias-border-l1);
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
.editorPdfStage {
|
|
1169
|
+
position: relative;
|
|
1170
|
+
flex: 1;
|
|
1171
|
+
min-height: 0;
|
|
1172
|
+
display: flex;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
.editorPdfFrame {
|
|
1176
|
+
flex: 1;
|
|
1177
|
+
min-height: 0;
|
|
1178
|
+
width: 100%;
|
|
1179
|
+
border: none;
|
|
1180
|
+
background: var(--dsw-alias-bg-base);
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
.editorPdfFrameBlocked {
|
|
1184
|
+
pointer-events: none;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
.editorPdfDragShield {
|
|
1188
|
+
position: absolute;
|
|
1189
|
+
inset: 0;
|
|
1190
|
+
z-index: 4;
|
|
1191
|
+
pointer-events: none;
|
|
1192
|
+
background: transparent;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
.editorPdfDragShieldActive {
|
|
1196
|
+
pointer-events: auto;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
/* Tab drag must switch iframe hit-testing before the pointer can enter the
|
|
1200
|
+
Chromium PDF browsing context. The body flag is set synchronously by the
|
|
1201
|
+
drag source, avoiding React render timing entirely. */
|
|
1202
|
+
:global(body[data-dsh-tab-dragging]) .editorPdfFrame {
|
|
1203
|
+
pointer-events: none !important;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
:global(body[data-dsh-tab-dragging]) .editorPdfDragShield {
|
|
1207
|
+
pointer-events: auto !important;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
.editorXlsx {
|
|
1211
|
+
position: relative;
|
|
1212
|
+
flex: 1;
|
|
1213
|
+
min-height: 0;
|
|
1214
|
+
overflow: hidden;
|
|
1215
|
+
background: var(--dsw-alias-bg-base);
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
.editorUniverHost {
|
|
1219
|
+
width: 100%;
|
|
1220
|
+
height: 100%;
|
|
1221
|
+
min-width: 0;
|
|
1222
|
+
min-height: 0;
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
.editorOfficeOverlay {
|
|
1226
|
+
position: absolute;
|
|
1227
|
+
inset: 0;
|
|
1228
|
+
z-index: 2;
|
|
1229
|
+
display: flex;
|
|
1230
|
+
background: var(--dsw-alias-bg-base);
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
.editorPptx {
|
|
1234
|
+
flex: 1;
|
|
1235
|
+
min-height: 0;
|
|
1236
|
+
display: flex;
|
|
1237
|
+
flex-direction: column;
|
|
1238
|
+
background: var(--dsw-alias-bg-base);
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
.editorPptxToolbar {
|
|
1242
|
+
flex: none;
|
|
1243
|
+
display: flex;
|
|
1244
|
+
align-items: center;
|
|
1245
|
+
justify-content: center;
|
|
1246
|
+
gap: 8px;
|
|
1247
|
+
padding: 6px 8px;
|
|
1248
|
+
border-bottom: 1px solid var(--dsw-alias-border-l1);
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
.editorPptxToolbar .editorDownloadLink {
|
|
1252
|
+
margin-left: auto;
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
.editorPptxButton {
|
|
1256
|
+
height: 28px;
|
|
1257
|
+
padding: 0 10px;
|
|
1258
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1259
|
+
border-radius: 6px;
|
|
1260
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
1261
|
+
color: var(--dsw-alias-label-secondary);
|
|
1262
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
1263
|
+
cursor: pointer;
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
.editorPptxButton:hover:not(:disabled) {
|
|
1267
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1268
|
+
color: var(--dsw-alias-label-primary);
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
.editorPptxButton:disabled {
|
|
1272
|
+
opacity: 0.4;
|
|
1273
|
+
cursor: default;
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
.editorPptxPosition {
|
|
1277
|
+
min-width: 64px;
|
|
1278
|
+
text-align: center;
|
|
1279
|
+
font: var(--dsw-font-xxs-12);
|
|
1280
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
.editorPptxStage {
|
|
1284
|
+
position: relative;
|
|
1285
|
+
flex: 1;
|
|
1286
|
+
min-height: 0;
|
|
1287
|
+
overflow: hidden;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
.editorPptxHost {
|
|
1291
|
+
width: 100%;
|
|
1292
|
+
height: 100%;
|
|
1293
|
+
min-width: 0;
|
|
1294
|
+
min-height: 0;
|
|
1295
|
+
overflow: auto;
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
/* ── Terminal ──────────────────────────────────────────────────────────── */
|
|
1299
|
+
|
|
1300
|
+
.terminalWrap {
|
|
1301
|
+
flex: 1;
|
|
1302
|
+
min-height: 0;
|
|
1303
|
+
position: relative;
|
|
1304
|
+
display: flex;
|
|
1305
|
+
flex-direction: column;
|
|
1306
|
+
background: var(--dsw-alias-bg-base);
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
.terminal {
|
|
1310
|
+
flex: 1;
|
|
1311
|
+
min-height: 0;
|
|
1312
|
+
padding: 6px 4px 6px 8px;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
.terminal :global(.xterm) {
|
|
1316
|
+
height: 100%;
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
.terminalBanner {
|
|
1320
|
+
flex: none;
|
|
1321
|
+
display: flex;
|
|
1322
|
+
align-items: center;
|
|
1323
|
+
flex-wrap: wrap;
|
|
1324
|
+
gap: 8px;
|
|
1325
|
+
padding: 3px 10px;
|
|
1326
|
+
font: var(--dsw-font-xxxs-11);
|
|
1327
|
+
color: var(--dsw-alias-state-warn-label);
|
|
1328
|
+
background: var(--dsw-alias-state-warn-tertiary);
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
/* The attempted ws URL, shown when the connection failed (diagnosis). */
|
|
1332
|
+
.terminalBannerUrl {
|
|
1333
|
+
flex-basis: 100%;
|
|
1334
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
1335
|
+
word-break: break-all;
|
|
1336
|
+
opacity: 0.85;
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
.boundaryError {
|
|
1340
|
+
position: fixed;
|
|
1341
|
+
right: 0;
|
|
1342
|
+
top: 0;
|
|
1343
|
+
bottom: 0;
|
|
1344
|
+
z-index: 50;
|
|
1345
|
+
display: flex;
|
|
1346
|
+
flex-direction: column;
|
|
1347
|
+
gap: 8px;
|
|
1348
|
+
align-items: flex-start;
|
|
1349
|
+
padding: 16px;
|
|
1350
|
+
background: var(--dsw-alias-bg-layer-1);
|
|
1351
|
+
border-left: 1px solid var(--dsw-alias-border-l2);
|
|
1352
|
+
font: var(--dsw-font-xxs-12);
|
|
1353
|
+
color: var(--dsw-alias-state-error-primary);
|
|
1354
|
+
overflow: auto;
|
|
1355
|
+
}
|
|
1356
|
+
|
|
1357
|
+
.terminalRetry {
|
|
1358
|
+
flex: none;
|
|
1359
|
+
padding: 1px 8px;
|
|
1360
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1361
|
+
border-radius: 999px;
|
|
1362
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
1363
|
+
color: var(--dsw-alias-label-secondary);
|
|
1364
|
+
font: var(--dsw-font-xxxs-strong-11);
|
|
1365
|
+
cursor: pointer;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
.terminalRetry:hover {
|
|
1369
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1370
|
+
color: var(--dsw-alias-label-primary);
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
/* ── Git ───────────────────────────────────────────────────────────────── */
|
|
1374
|
+
|
|
1375
|
+
.git {
|
|
1376
|
+
flex: 1;
|
|
1377
|
+
min-height: 0;
|
|
1378
|
+
min-width: 0;
|
|
1379
|
+
display: flex;
|
|
1380
|
+
flex-direction: column;
|
|
1381
|
+
overflow-y: auto;
|
|
1382
|
+
/* Tab pages never scroll horizontally: content wraps or truncates to the
|
|
1383
|
+
panel width instead of panning sideways. */
|
|
1384
|
+
overflow-x: hidden;
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
.gitHeader {
|
|
1388
|
+
flex: none;
|
|
1389
|
+
display: flex;
|
|
1390
|
+
align-items: center;
|
|
1391
|
+
gap: 8px;
|
|
1392
|
+
height: 36px;
|
|
1393
|
+
padding: 0 8px 0 12px;
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1396
|
+
.gitBranchSelect {
|
|
1397
|
+
flex: 1;
|
|
1398
|
+
min-width: 0;
|
|
1399
|
+
height: 26px;
|
|
1400
|
+
padding: 0 6px;
|
|
1401
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1402
|
+
border-radius: 6px;
|
|
1403
|
+
background: var(--dsw-alias-bg-base);
|
|
1404
|
+
color: var(--dsw-alias-label-primary);
|
|
1405
|
+
font: var(--dsw-font-xxs-12);
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
.gitSection {
|
|
1409
|
+
border-top: 1px solid var(--dsw-alias-border-l1);
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1412
|
+
.gitSectionHeader {
|
|
1413
|
+
display: flex;
|
|
1414
|
+
align-items: center;
|
|
1415
|
+
justify-content: space-between;
|
|
1416
|
+
padding: 6px 12px 4px;
|
|
1417
|
+
font: var(--dsw-font-xxxs-strong-11);
|
|
1418
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1419
|
+
text-transform: uppercase;
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
.gitLink {
|
|
1423
|
+
border: none;
|
|
1424
|
+
background: transparent;
|
|
1425
|
+
font: var(--dsw-font-xxxs-11);
|
|
1426
|
+
color: var(--dsw-alias-brand-primary);
|
|
1427
|
+
cursor: pointer;
|
|
1428
|
+
padding: 0;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
.gitLink:hover:not(:disabled) {
|
|
1432
|
+
text-decoration: underline;
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
.gitLink:disabled {
|
|
1436
|
+
opacity: 0.4;
|
|
1437
|
+
cursor: default;
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
.gitRow {
|
|
1441
|
+
display: flex;
|
|
1442
|
+
align-items: center;
|
|
1443
|
+
gap: 6px;
|
|
1444
|
+
min-height: 34px;
|
|
1445
|
+
margin: 0 6px;
|
|
1446
|
+
padding: 0 8px;
|
|
1447
|
+
border-radius: 8px;
|
|
1448
|
+
animation: dsh-row-in 150ms var(--ds-ease-in-out);
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
.gitRow:hover {
|
|
1452
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
.gitRowSelected {
|
|
1456
|
+
background: var(--dsw-alias-interactive-bg-active);
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
.gitRowMain {
|
|
1460
|
+
flex: 1;
|
|
1461
|
+
min-width: 0;
|
|
1462
|
+
display: flex;
|
|
1463
|
+
align-items: center;
|
|
1464
|
+
gap: 8px;
|
|
1465
|
+
border: none;
|
|
1466
|
+
background: transparent;
|
|
1467
|
+
padding: 3px 0;
|
|
1468
|
+
cursor: pointer;
|
|
1469
|
+
text-align: left;
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
.gitBadge {
|
|
1473
|
+
flex: none;
|
|
1474
|
+
width: 20px;
|
|
1475
|
+
height: 16px;
|
|
1476
|
+
display: inline-flex;
|
|
1477
|
+
align-items: center;
|
|
1478
|
+
justify-content: center;
|
|
1479
|
+
border-radius: 4px;
|
|
1480
|
+
font: var(--dsw-font-xxxs-strong-11);
|
|
1481
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1482
|
+
color: var(--dsw-alias-label-secondary);
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
.gitName {
|
|
1486
|
+
flex: 1;
|
|
1487
|
+
min-width: 0;
|
|
1488
|
+
overflow: hidden;
|
|
1489
|
+
text-overflow: ellipsis;
|
|
1490
|
+
white-space: nowrap;
|
|
1491
|
+
font: var(--dsw-font-s-14);
|
|
1492
|
+
color: var(--dsw-alias-label-primary);
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
.gitEmpty {
|
|
1496
|
+
padding: 4px 12px 8px;
|
|
1497
|
+
font: var(--dsw-font-xxs-12);
|
|
1498
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
.gitPlaceholder {
|
|
1502
|
+
padding: 16px;
|
|
1503
|
+
font: var(--dsw-font-xxs-12);
|
|
1504
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1505
|
+
text-align: center;
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
.gitError {
|
|
1509
|
+
padding: 8px 12px;
|
|
1510
|
+
font: var(--dsw-font-xxs-12);
|
|
1511
|
+
color: var(--dsw-alias-state-error-primary);
|
|
1512
|
+
white-space: pre-wrap;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
.gitDiff {
|
|
1516
|
+
border-top: 1px solid var(--dsw-alias-border-l1);
|
|
1517
|
+
padding: 8px;
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
/* The diff tab (a change opened from the git panel, like VSCode's diff
|
|
1521
|
+
editor): header + scrollable diff body, no horizontal panning. */
|
|
1522
|
+
.gitDiffTab {
|
|
1523
|
+
flex: 1;
|
|
1524
|
+
min-height: 0;
|
|
1525
|
+
min-width: 0;
|
|
1526
|
+
display: flex;
|
|
1527
|
+
flex-direction: column;
|
|
1528
|
+
overflow-y: auto;
|
|
1529
|
+
overflow-x: hidden;
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
.gitDiffTabHeader {
|
|
1533
|
+
flex: none;
|
|
1534
|
+
display: flex;
|
|
1535
|
+
align-items: center;
|
|
1536
|
+
gap: 8px;
|
|
1537
|
+
height: 36px;
|
|
1538
|
+
padding: 0 8px 0 12px;
|
|
1539
|
+
border-bottom: 1px solid var(--dsw-alias-border-l1);
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
.gitDiffTabTitle {
|
|
1543
|
+
flex: 1;
|
|
1544
|
+
min-width: 0;
|
|
1545
|
+
overflow: hidden;
|
|
1546
|
+
text-overflow: ellipsis;
|
|
1547
|
+
white-space: nowrap;
|
|
1548
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
1549
|
+
color: var(--dsw-alias-label-primary);
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
/* One changed file's section: path header, hunk headers, aligned lines. */
|
|
1553
|
+
.gitDiffFile {
|
|
1554
|
+
display: flex;
|
|
1555
|
+
align-items: baseline;
|
|
1556
|
+
gap: 6px;
|
|
1557
|
+
padding: 8px 2px 2px;
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
.gitDiffFilePath {
|
|
1561
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
1562
|
+
color: var(--dsw-alias-label-primary);
|
|
1563
|
+
overflow: hidden;
|
|
1564
|
+
text-overflow: ellipsis;
|
|
1565
|
+
white-space: nowrap;
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
.gitDiffFileOld {
|
|
1569
|
+
flex: none;
|
|
1570
|
+
font: var(--dsw-font-xxxs-11);
|
|
1571
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1572
|
+
overflow: hidden;
|
|
1573
|
+
text-overflow: ellipsis;
|
|
1574
|
+
white-space: nowrap;
|
|
1575
|
+
max-width: 40%;
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1578
|
+
.gitDiffFileTag {
|
|
1579
|
+
flex: none;
|
|
1580
|
+
padding: 0 6px;
|
|
1581
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1582
|
+
border-radius: 999px;
|
|
1583
|
+
font: var(--dsw-font-xxxs-strong-11);
|
|
1584
|
+
color: var(--dsw-alias-label-secondary);
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
.gitDiffHunk {
|
|
1588
|
+
display: flex;
|
|
1589
|
+
gap: 8px;
|
|
1590
|
+
padding: 3px 2px;
|
|
1591
|
+
font: var(--dsw-font-markdown-code-block-small);
|
|
1592
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
.gitDiffHunkHeader {
|
|
1596
|
+
flex: none;
|
|
1597
|
+
color: var(--dsw-alias-label-secondary);
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
.gitDiffHunkSection {
|
|
1601
|
+
overflow: hidden;
|
|
1602
|
+
text-overflow: ellipsis;
|
|
1603
|
+
white-space: nowrap;
|
|
1604
|
+
}
|
|
1605
|
+
|
|
1606
|
+
/* One aligned diff line: old gutter / new gutter / code. Lines WRAP instead
|
|
1607
|
+
of scrolling horizontally (the tab-page rule: fill the width adaptively),
|
|
1608
|
+
with the long-token fallback breaking anywhere a space never comes. */
|
|
1609
|
+
.gitDiffLine {
|
|
1610
|
+
display: flex;
|
|
1611
|
+
align-items: stretch;
|
|
1612
|
+
font: var(--dsw-font-markdown-code-block-small);
|
|
1613
|
+
line-height: 20px;
|
|
1614
|
+
white-space: pre-wrap;
|
|
1615
|
+
overflow-wrap: anywhere;
|
|
1616
|
+
min-width: 0;
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
.gitDiffNum {
|
|
1620
|
+
flex: none;
|
|
1621
|
+
width: 36px;
|
|
1622
|
+
padding-right: 8px;
|
|
1623
|
+
text-align: right;
|
|
1624
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1625
|
+
user-select: none;
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
.gitDiffCode {
|
|
1629
|
+
flex: 1;
|
|
1630
|
+
min-width: 0;
|
|
1631
|
+
overflow: visible;
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
.gitDiffCtx {
|
|
1635
|
+
color: var(--dsw-alias-label-primary);
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
.gitDiffDel {
|
|
1639
|
+
color: var(--dsw-alias-state-error-primary);
|
|
1640
|
+
background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);
|
|
1641
|
+
}
|
|
1642
|
+
|
|
1643
|
+
.gitDiffAdd {
|
|
1644
|
+
color: var(--dsw-alias-state-success-primary);
|
|
1645
|
+
background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
.gitDiffMeta {
|
|
1649
|
+
padding-left: 2px;
|
|
1650
|
+
}
|
|
1651
|
+
|
|
1652
|
+
.gitDiffMetaText {
|
|
1653
|
+
font: var(--dsw-font-xxxs-11);
|
|
1654
|
+
font-style: italic;
|
|
1655
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
.gitDiffExpand {
|
|
1659
|
+
display: block;
|
|
1660
|
+
width: 100%;
|
|
1661
|
+
margin: 4px 0;
|
|
1662
|
+
border: none;
|
|
1663
|
+
background: transparent;
|
|
1664
|
+
font: var(--dsw-font-xxs-12);
|
|
1665
|
+
color: var(--dsw-alias-brand-primary);
|
|
1666
|
+
cursor: pointer;
|
|
1667
|
+
text-align: center;
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
.gitDiffExpand:hover {
|
|
1671
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1674
|
+
.gitConfirmDesc {
|
|
1675
|
+
margin: 0;
|
|
1676
|
+
font: var(--dsw-font-s-14);
|
|
1677
|
+
color: var(--dsw-alias-label-primary);
|
|
1678
|
+
white-space: pre-wrap;
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
.gitCommit {
|
|
1682
|
+
display: flex;
|
|
1683
|
+
gap: 6px;
|
|
1684
|
+
padding: 8px 12px;
|
|
1685
|
+
border-top: 1px solid var(--dsw-alias-border-l1);
|
|
1686
|
+
align-items: center;
|
|
1687
|
+
}
|
|
1688
|
+
|
|
1689
|
+
.gitCommitInput {
|
|
1690
|
+
flex: 1;
|
|
1691
|
+
min-width: 0;
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1694
|
+
.gitCommitButton {
|
|
1695
|
+
flex: none;
|
|
1696
|
+
height: 26px;
|
|
1697
|
+
padding: 0 12px;
|
|
1698
|
+
border: none;
|
|
1699
|
+
border-radius: 6px;
|
|
1700
|
+
background: var(--dsw-alias-button-primary-fill);
|
|
1701
|
+
color: var(--dsw-alias-label-primary-inverted);
|
|
1702
|
+
font: var(--dsw-font-xxs-strong-12);
|
|
1703
|
+
cursor: pointer;
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1706
|
+
.gitCommitButton:hover:not(:disabled) {
|
|
1707
|
+
background: var(--dsw-alias-button-primary-hover);
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
.gitCommitButton:disabled {
|
|
1711
|
+
opacity: 0.45;
|
|
1712
|
+
cursor: default;
|
|
1713
|
+
}
|
|
1714
|
+
|
|
1715
|
+
/* A history row: line 1 = hash + subject, line 2 = ref badges + author/date
|
|
1716
|
+
(badges live on the second line so they never crowd the subject). */
|
|
1717
|
+
.gitLogRow {
|
|
1718
|
+
display: flex;
|
|
1719
|
+
flex-direction: column;
|
|
1720
|
+
gap: 2px;
|
|
1721
|
+
padding: 5px 12px;
|
|
1722
|
+
cursor: pointer;
|
|
1723
|
+
border-radius: 8px;
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
.gitLogRow:hover {
|
|
1727
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
.gitLogLine1 {
|
|
1731
|
+
display: flex;
|
|
1732
|
+
align-items: baseline;
|
|
1733
|
+
gap: 8px;
|
|
1734
|
+
min-width: 0;
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
.gitLogHash {
|
|
1738
|
+
flex: none;
|
|
1739
|
+
font: var(--dsw-font-markdown-code-block-small);
|
|
1740
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
.gitLogLine2 {
|
|
1744
|
+
display: flex;
|
|
1745
|
+
align-items: center;
|
|
1746
|
+
gap: 6px;
|
|
1747
|
+
min-width: 0;
|
|
1748
|
+
flex-wrap: wrap;
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
.gitLogRef {
|
|
1752
|
+
flex: none;
|
|
1753
|
+
padding: 0 5px;
|
|
1754
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1755
|
+
border-radius: 999px;
|
|
1756
|
+
font: var(--dsw-font-xxxs-strong-11);
|
|
1757
|
+
color: var(--dsw-alias-brand-primary);
|
|
1758
|
+
white-space: nowrap;
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
|
+
.gitLogSubject {
|
|
1762
|
+
flex: 1;
|
|
1763
|
+
min-width: 0;
|
|
1764
|
+
overflow: hidden;
|
|
1765
|
+
text-overflow: ellipsis;
|
|
1766
|
+
white-space: nowrap;
|
|
1767
|
+
font: var(--dsw-font-s-14);
|
|
1768
|
+
color: var(--dsw-alias-label-primary);
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
.gitLogMeta {
|
|
1772
|
+
font: var(--dsw-font-xxxs-11);
|
|
1773
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
.gitLogMore {
|
|
1777
|
+
display: block;
|
|
1778
|
+
width: calc(100% - 24px);
|
|
1779
|
+
margin: 4px 12px 8px;
|
|
1780
|
+
padding: 6px 0;
|
|
1781
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1782
|
+
border-radius: 6px;
|
|
1783
|
+
background: transparent;
|
|
1784
|
+
font: var(--dsw-font-xxs-12);
|
|
1785
|
+
color: var(--dsw-alias-label-secondary);
|
|
1786
|
+
cursor: pointer;
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
.gitLogMore:hover:not(:disabled) {
|
|
1790
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1791
|
+
color: var(--dsw-alias-label-primary);
|
|
1792
|
+
}
|
|
1793
|
+
|
|
1794
|
+
.gitLogMore:disabled {
|
|
1795
|
+
opacity: 0.5;
|
|
1796
|
+
cursor: default;
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
/* ── Intercepted produced-files row ────────────────────────────────────── */
|
|
1800
|
+
|
|
1801
|
+
.producedRow {
|
|
1802
|
+
display: flex;
|
|
1803
|
+
align-items: center;
|
|
1804
|
+
gap: 8px;
|
|
1805
|
+
flex-wrap: wrap;
|
|
1806
|
+
padding: 4px 0;
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
.producedLabel {
|
|
1810
|
+
font: var(--dsw-font-xxs-12);
|
|
1811
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
.producedChip {
|
|
1815
|
+
display: inline-flex;
|
|
1816
|
+
align-items: center;
|
|
1817
|
+
gap: 4px;
|
|
1818
|
+
max-width: 200px;
|
|
1819
|
+
padding: 2px 8px;
|
|
1820
|
+
border: 1px solid var(--dsw-alias-border-l2);
|
|
1821
|
+
border-radius: 999px;
|
|
1822
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
1823
|
+
color: var(--dsw-alias-label-secondary);
|
|
1824
|
+
font: var(--dsw-font-xxs-12);
|
|
1825
|
+
cursor: pointer;
|
|
1826
|
+
overflow: hidden;
|
|
1827
|
+
}
|
|
1828
|
+
|
|
1829
|
+
.producedChip:hover {
|
|
1830
|
+
background: var(--dsw-alias-interactive-bg-hover);
|
|
1831
|
+
color: var(--dsw-alias-label-primary);
|
|
1832
|
+
}
|
|
1833
|
+
|
|
1834
|
+
.producedChip span {
|
|
1835
|
+
overflow: hidden;
|
|
1836
|
+
text-overflow: ellipsis;
|
|
1837
|
+
white-space: nowrap;
|
|
1838
|
+
}
|
|
1839
|
+
|
|
1840
|
+
.producedMore {
|
|
1841
|
+
font: var(--dsw-font-xxs-12);
|
|
1842
|
+
color: var(--dsw-alias-label-tertiary);
|
|
1843
|
+
}
|
|
1844
|
+
|
|
1845
|
+
/* ── Shared interaction rules ──────────────────────────────────────────── */
|
|
1846
|
+
|
|
1847
|
+
/* Keyboard focus stays visible on every interactive control (the styling
|
|
1848
|
+
policy requires focus visibility; the accent token doubles as the ring). */
|
|
1849
|
+
.toggleButton:focus-visible,
|
|
1850
|
+
.bottomClose:focus-visible,
|
|
1851
|
+
.iconButton:focus-visible,
|
|
1852
|
+
.tab:focus-visible,
|
|
1853
|
+
.tabClose:focus-visible,
|
|
1854
|
+
.tabBarPlus:focus-visible,
|
|
1855
|
+
.paneCard:focus-visible,
|
|
1856
|
+
.explorerRow:focus-visible,
|
|
1857
|
+
.explorerRef:focus-visible,
|
|
1858
|
+
.gitRowMain:focus-visible,
|
|
1859
|
+
.gitLink:focus-visible,
|
|
1860
|
+
.gitCommitButton:focus-visible,
|
|
1861
|
+
.gitLogRow:focus-visible,
|
|
1862
|
+
.gitLogMore:focus-visible,
|
|
1863
|
+
.gitDiffExpand:focus-visible,
|
|
1864
|
+
.terminalRetry:focus-visible,
|
|
1865
|
+
.editorModeButton:focus-visible,
|
|
1866
|
+
.editorDownloadLink:focus-visible,
|
|
1867
|
+
.editorPptxButton:focus-visible,
|
|
1868
|
+
.editorDocxZoomRange:focus-visible {
|
|
1869
|
+
outline: 2px solid var(--dsw-alias-interactive-bg-hover-accent);
|
|
1870
|
+
outline-offset: -1px;
|
|
1871
|
+
}
|
|
1872
|
+
|
|
1873
|
+
/* Reduced motion: no slides, fades or color transitions. */
|
|
1874
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1875
|
+
.panel,
|
|
1876
|
+
.panelHidden,
|
|
1877
|
+
.bottomPanel,
|
|
1878
|
+
.bottomPanelHidden,
|
|
1879
|
+
.toggleCluster,
|
|
1880
|
+
.toggleButton,
|
|
1881
|
+
.tab,
|
|
1882
|
+
.tabBarPlus,
|
|
1883
|
+
.paneCard,
|
|
1884
|
+
.explorerRow,
|
|
1885
|
+
.gitRow,
|
|
1886
|
+
.divider,
|
|
1887
|
+
.dividerRow::after,
|
|
1888
|
+
.dividerCol::after {
|
|
1889
|
+
transition: none;
|
|
1890
|
+
animation: none;
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
|
|
1894
|
+
/* ── Narrow (mobile) viewport ──────────────────────────────────────────── */
|
|
1895
|
+
|
|
1896
|
+
/* Pairs with NARROW_MAX_WIDTH = 768 in src/client/breakpoints.ts: widths
|
|
1897
|
+
strictly below 768px (i.e. max-width: 767px) switch the sidebar to the
|
|
1898
|
+
mobile layout — one full-screen drawer (the bottom panel's tabs were
|
|
1899
|
+
migrated into the right tree), one toggle button. The structural
|
|
1900
|
+
switches (which panels render, the migration) are JS-driven via
|
|
1901
|
+
useNarrowViewport; this block only adapts the pure style details. */
|
|
1902
|
+
@media (max-width: 767px) {
|
|
1903
|
+
/* The toggle cluster holds a single button on narrow viewports (the
|
|
1904
|
+
bottom panel button is not rendered), so the open panel's tab strip
|
|
1905
|
+
reserves 40px instead of the desktop 72px — the tabs and + menu still
|
|
1906
|
+
yield space to the one remaining control. */
|
|
1907
|
+
.panel:not(.panelHidden) .tabBar {
|
|
1908
|
+
padding-right: 40px;
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
/* Narrower tabs: a phone-width drawer fits more open tabs before the
|
|
1912
|
+
strip scrolls. */
|
|
1913
|
+
.tab {
|
|
1914
|
+
min-width: 48px;
|
|
1915
|
+
max-width: 128px;
|
|
1916
|
+
}
|
|
1917
|
+
}
|