vue-dockable-desktop 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/LICENSE +21 -0
- package/README.md +169 -0
- package/dist/components/VddConfirm.vue.d.ts +19 -0
- package/dist/components/VddContextMenu.vue.d.ts +35 -0
- package/dist/components/VddDesktop.vue.d.ts +28 -0
- package/dist/components/VddDragGhost.vue.d.ts +3 -0
- package/dist/components/VddDropZones.vue.d.ts +6 -0
- package/dist/components/VddEdgeZones.vue.d.ts +3 -0
- package/dist/components/VddFloatingWidget.vue.d.ts +51 -0
- package/dist/components/VddFloatingWindow.vue.d.ts +12 -0
- package/dist/components/VddLeafGroup.vue.d.ts +7 -0
- package/dist/components/VddModalHost.vue.d.ts +9 -0
- package/dist/components/VddModals.vue.d.ts +3 -0
- package/dist/components/VddOverlayFrame.vue.d.ts +28 -0
- package/dist/components/VddPanelMount.vue.d.ts +8 -0
- package/dist/components/VddPanelOverlay.vue.d.ts +13 -0
- package/dist/components/VddPanelSlot.vue.d.ts +9 -0
- package/dist/components/VddPanelToolbar.vue.d.ts +26 -0
- package/dist/components/VddSecondarySidebar.vue.d.ts +16 -0
- package/dist/components/VddSidePanelHost.vue.d.ts +10 -0
- package/dist/components/VddSidePanels.vue.d.ts +12 -0
- package/dist/components/VddSidebar.vue.d.ts +54 -0
- package/dist/components/VddSidebarDrawer.vue.d.ts +51 -0
- package/dist/components/VddSidebarRail.vue.d.ts +22 -0
- package/dist/components/VddSidebarTabScope.vue.d.ts +22 -0
- package/dist/components/VddTaskbar.vue.d.ts +17 -0
- package/dist/components/VddTaskbarPreview.vue.d.ts +24 -0
- package/dist/components/VddToastIcon.vue.d.ts +8 -0
- package/dist/components/VddToastItem.vue.d.ts +18 -0
- package/dist/components/VddToasts.vue.d.ts +36 -0
- package/dist/components/VddToolbar.vue.d.ts +20 -0
- package/dist/components/VddToolbarButton.vue.d.ts +25 -0
- package/dist/components/VddToolbarCenter.vue.d.ts +13 -0
- package/dist/components/VddToolbarGroupButton.vue.d.ts +8 -0
- package/dist/components/VddToolbarItem.vue.d.ts +13 -0
- package/dist/components/VddToolbarSearch.vue.d.ts +27 -0
- package/dist/components/VddToolbarSeparator.vue.d.ts +3 -0
- package/dist/components/VddToolbarSpacer.vue.d.ts +3 -0
- package/dist/components/VddToolbarToggle.vue.d.ts +32 -0
- package/dist/components/VddWorkspaceGrid.vue.d.ts +8 -0
- package/dist/composables/useColorScheme.d.ts +19 -0
- package/dist/composables/useContextMenu.d.ts +29 -0
- package/dist/composables/useContributions.d.ts +48 -0
- package/dist/composables/useDragDock.d.ts +59 -0
- package/dist/composables/useOverlayHost.d.ts +30 -0
- package/dist/composables/useOverlays.d.ts +51 -0
- package/dist/composables/usePanel.d.ts +82 -0
- package/dist/composables/usePanelDom.d.ts +7 -0
- package/dist/composables/usePanelOverlay.d.ts +35 -0
- package/dist/composables/useSidebar.d.ts +15 -0
- package/dist/composables/useToolbar.d.ts +9 -0
- package/dist/composables/useWorkspace.d.ts +18 -0
- package/dist/core/anchorGeometry.d.ts +39 -0
- package/dist/core/contextMenu.d.ts +74 -0
- package/dist/core/contributions.d.ts +56 -0
- package/dist/core/dragResize.d.ts +67 -0
- package/dist/core/eventBus.d.ts +73 -0
- package/dist/core/layoutTree.d.ts +96 -0
- package/dist/core/messages.d.ts +117 -0
- package/dist/core/overlayState.d.ts +64 -0
- package/dist/core/overlays.d.ts +114 -0
- package/dist/core/panelDom.d.ts +79 -0
- package/dist/core/panelMenu.d.ts +45 -0
- package/dist/core/panelOverlay.d.ts +121 -0
- package/dist/core/registry.d.ts +61 -0
- package/dist/core/serializable.d.ts +26 -0
- package/dist/core/serialize.d.ts +32 -0
- package/dist/core/sidebarTypes.d.ts +102 -0
- package/dist/core/stretch.d.ts +47 -0
- package/dist/core/toast.d.ts +474 -0
- package/dist/core/toolbarState.d.ts +13 -0
- package/dist/core/toolbarTypes.d.ts +99 -0
- package/dist/core/workspace.d.ts +222 -0
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.js +4851 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +3944 -0
- package/dist/types.d.ts +145 -0
- package/package.json +102 -0
package/dist/styles.css
ADDED
|
@@ -0,0 +1,3944 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* vue-dockable-desktop — stylesheet.
|
|
3
|
+
*
|
|
4
|
+
* Ported from react-dockable-desktop 6.2.0 and completed: every class is `vdd-` prefixed and
|
|
5
|
+
* every custom property is `--vdd-*`, with no exceptions. rdd's own migration had been left
|
|
6
|
+
* unfinished — ~35 unprefixed tokens (`--sidebar-*`, `--tab-*`, `--toolbar-*`), four bare
|
|
7
|
+
* classes, two dead rules and 30 demo-only `.sb-*` rules were still shipping in its published
|
|
8
|
+
* `styles.css`. All of that is resolved here and enforced by scripts/gates/css-prefix.mjs.
|
|
9
|
+
*
|
|
10
|
+
* Tokens live on `:root` deliberately, not scoped to the workspace element: the context menu,
|
|
11
|
+
* toasts, toolbar flyouts and the overlay search dropdown all teleport to `document.body`, and
|
|
12
|
+
* `<VddSidebar>` is normally an *ancestor* of `<VddDesktop>`. CSS variables only cascade
|
|
13
|
+
* downward, so scoping them would leave those parts unthemed.
|
|
14
|
+
*
|
|
15
|
+
* See docs/decisions/0008-css-prefix.md and docs/manual/10-theming.md.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
:root {
|
|
19
|
+
--vdd-styles-loaded: 1; /* sentinel — checked at mount to detect missing CSS import */
|
|
20
|
+
--vdd-z-base: 1000; /* base for floating windows + all chrome overlays; override via WindowManagerProvider's zIndexBase */
|
|
21
|
+
--vdd-bg-primary: #090b11;
|
|
22
|
+
--vdd-bg-workspace: #0f111a;
|
|
23
|
+
--vdd-bg-panel: #141722;
|
|
24
|
+
--vdd-bg-tab-bar: #0d0f16;
|
|
25
|
+
--vdd-text-primary: #f1f5f9;
|
|
26
|
+
--vdd-text-secondary: #94a3b8;
|
|
27
|
+
--vdd-border-color: rgba(255, 255, 255, 0.08);
|
|
28
|
+
--vdd-accent-color: #38bdf8; /* Modern Cyan/Sky-blue accent */
|
|
29
|
+
--vdd-accent-glow: rgba(56, 189, 248, 0.15);
|
|
30
|
+
--vdd-header-button-gap: 4px; /* Configurable gap spacing between titlebar action buttons */
|
|
31
|
+
/* Window skins variables */
|
|
32
|
+
--vdd-window-bg: rgba(20, 22, 28, var(--vdd-window-opacity, 0.85));
|
|
33
|
+
--vdd-window-border: rgba(255, 255, 255, 0.08);
|
|
34
|
+
--vdd-window-border-focused: rgba(255, 255, 255, 0.28);
|
|
35
|
+
--vdd-window-header-bg: rgba(0, 0, 0, 0.25);
|
|
36
|
+
--vdd-window-text: #f8f9fa;
|
|
37
|
+
--vdd-window-shadow: 0 16px 40px rgba(0, 0, 0, 0.4);
|
|
38
|
+
--vdd-window-shadow-focused: 0 24px 50px rgba(0, 0, 0, 0.55);
|
|
39
|
+
/* Modal theme variables */
|
|
40
|
+
--vdd-modal-curtain-bg: rgba(9, 11, 17, 0.65);
|
|
41
|
+
--vdd-modal-bg: rgba(20, 23, 34, 0.95);
|
|
42
|
+
--vdd-modal-border: rgba(255, 255, 255, 0.08);
|
|
43
|
+
--vdd-modal-header-bg: rgba(0, 0, 0, 0.15);
|
|
44
|
+
--vdd-modal-header-border: rgba(255, 255, 255, 0.06);
|
|
45
|
+
--vdd-modal-close-hover-color: #ffffff;
|
|
46
|
+
--vdd-side-panel-bg: rgba(20, 23, 34, 0.88);
|
|
47
|
+
--vdd-side-panel-border: rgba(255, 255, 255, 0.08);
|
|
48
|
+
--vdd-side-panel-header-bg: rgba(0, 0, 0, 0.15);
|
|
49
|
+
--vdd-side-panel-header-border: rgba(255, 255, 255, 0.06);
|
|
50
|
+
--vdd-side-panel-close-hover-color: #ffffff;
|
|
51
|
+
/* Grid/Docked panel theme variables */
|
|
52
|
+
--vdd-border-panel: rgba(255, 255, 255, 0.08);
|
|
53
|
+
--vdd-bg-tab-inactive: #0c0d12;
|
|
54
|
+
--vdd-text-tab-inactive: #858b99;
|
|
55
|
+
--vdd-text-tab-active: #ffffff;
|
|
56
|
+
/* Tab and control button hover colors */
|
|
57
|
+
--vdd-bg-tab-hover: #171a22;
|
|
58
|
+
--vdd-text-tab-hover: #e2e8f0;
|
|
59
|
+
--vdd-close-btn-hover-bg: rgba(255, 255, 255, 0.12);
|
|
60
|
+
--vdd-close-btn-hover-color: #ffffff;
|
|
61
|
+
--vdd-close-btn-color: #858b99;
|
|
62
|
+
--vdd-close-btn-active-color: #e2e8f0;
|
|
63
|
+
/* Tab focus states */
|
|
64
|
+
--vdd-tab-indicator-focused: var(--vdd-accent-color, #38bdf8);
|
|
65
|
+
--vdd-tab-indicator-unfocused: rgba(255, 255, 255, 0.3);
|
|
66
|
+
--vdd-tab-bg-active-focused: var(--vdd-bg-panel);
|
|
67
|
+
--vdd-tab-bg-active-unfocused: rgba(20, 23, 34, 0.55);
|
|
68
|
+
--vdd-tab-text-active-focused: var(--vdd-text-tab-active, #ffffff);
|
|
69
|
+
--vdd-tab-text-active-unfocused: rgba(255, 255, 255, 0.65);
|
|
70
|
+
--vdd-resizer-bg: rgba(255, 255, 255, 0.08);
|
|
71
|
+
--vdd-custom-btn-bg: rgba(255, 255, 255, 0.03);
|
|
72
|
+
--vdd-custom-btn-border: rgba(255, 255, 255, 0.05);
|
|
73
|
+
--vdd-custom-btn-hover-bg: rgba(255, 255, 255, 0.12);
|
|
74
|
+
--vdd-custom-btn-hover-color: #ffffff;
|
|
75
|
+
/* Taskbar theme variables */
|
|
76
|
+
--vdd-taskbar-bg: rgba(0, 0, 0, 0.75);
|
|
77
|
+
--vdd-taskbar-border: rgba(255, 255, 255, 0.1);
|
|
78
|
+
--vdd-taskbar-nav-color: rgba(255, 255, 255, 0.5);
|
|
79
|
+
--vdd-taskbar-item-bg: rgba(15, 23, 42, 0.6);
|
|
80
|
+
--vdd-taskbar-item-hover-bg: rgba(15, 23, 42, 0.8);
|
|
81
|
+
--vdd-taskbar-item-border: rgba(255, 255, 255, 0.08);
|
|
82
|
+
--vdd-taskbar-item-text: var(--vdd-accent-color, #38bdf8);
|
|
83
|
+
/* Scrollbar theme variables */
|
|
84
|
+
--vdd-scrollbar-thumb: rgba(255, 255, 255, 0.1);
|
|
85
|
+
--vdd-scrollbar-thumb-hover: rgba(255, 255, 255, 0.2);
|
|
86
|
+
--vdd-scrollbar-track: rgba(255, 255, 255, 0.01);
|
|
87
|
+
/* Mockup Panel inner theme variables */
|
|
88
|
+
--vdd-panel-card-bg: rgba(0, 0, 0, 0.2);
|
|
89
|
+
--vdd-panel-card-border: rgba(255, 255, 255, 0.1);
|
|
90
|
+
--vdd-panel-text: var(--vdd-text-primary);
|
|
91
|
+
--vdd-panel-title-color: var(--vdd-accent-color, #38bdf8);
|
|
92
|
+
/* ── Panel Overlay — Toolbar ── */
|
|
93
|
+
--vdd-panel-toolbar-padding: 8px;
|
|
94
|
+
--vdd-panel-toolbar-gap: 4px;
|
|
95
|
+
--vdd-panel-toolbar-btn-size: 32px;
|
|
96
|
+
--vdd-panel-toolbar-btn-radius: 6px;
|
|
97
|
+
--vdd-panel-toolbar-fg: rgba(255, 255, 255, 0.65);
|
|
98
|
+
--vdd-panel-toolbar-fg-hover: rgba(255, 255, 255, 0.95);
|
|
99
|
+
--vdd-panel-toolbar-btn-hover-bg: var(--vdd-toolbar-btn-hover-bg, rgba(255, 255, 255, 0.08));
|
|
100
|
+
--vdd-panel-toolbar-btn-active-bg: var(--vdd-toolbar-btn-radio-active-bg, rgba(56, 189, 248, 0.14));
|
|
101
|
+
--vdd-panel-toolbar-btn-active-color: var(--vdd-tab-icon-active, #38bdf8);
|
|
102
|
+
--vdd-panel-toolbar-separator-color: var(--vdd-toolbar-separator-color, rgba(255, 255, 255, 0.09));
|
|
103
|
+
/* ── Panel Overlay — Floating Window ── */
|
|
104
|
+
--vdd-panel-float-bg: rgba(22, 24, 34, 0.92);
|
|
105
|
+
--vdd-panel-float-border: rgba(255, 255, 255, 0.1);
|
|
106
|
+
--vdd-panel-float-radius: 8px;
|
|
107
|
+
--vdd-panel-float-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);
|
|
108
|
+
--vdd-panel-float-shadow-active: 0 8px 28px rgba(0, 0, 0, 0.55);
|
|
109
|
+
--vdd-panel-float-header-bg: var(--vdd-window-header-bg, rgba(0, 0, 0, 0.25));
|
|
110
|
+
--vdd-panel-float-header-bg-active: var(--vdd-window-header-bg, rgba(0, 0, 0, 0.25));
|
|
111
|
+
--vdd-panel-float-title-color: var(--vdd-window-text, #f8f9fa);
|
|
112
|
+
--vdd-panel-float-title-color-active: var(--vdd-window-text, #f8f9fa);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Every element the library renders carries an vdd- prefixed class (see
|
|
116
|
+
CLAUDE.md's prefix convention) — this targets exactly those elements
|
|
117
|
+
directly, never their descendants, so a consumer's own content nested
|
|
118
|
+
inside (tab renderContent, panel/modal body content) is never touched.
|
|
119
|
+
Without this, several rules combining padding with a fixed/percentage
|
|
120
|
+
min-height/max-height/height (e.g. .vdd-side-panel-header,
|
|
121
|
+
.vdd-toolbar-strip) render at a size that depends on whatever box-sizing
|
|
122
|
+
the host page happens to set globally — MUI's CssBaseline and Bootstrap's
|
|
123
|
+
reboot both reset it via a bare `*` selector, but a plain page with no
|
|
124
|
+
such reset leaves the browser default (content-box) in effect, so the
|
|
125
|
+
exact same CSS renders at a visibly different size purely depending on
|
|
126
|
+
which app it's dropped into. Deliberately no !important: this selector's
|
|
127
|
+
specificity (0,1,0) already beats an accidental bare `*` reset (both
|
|
128
|
+
examples above are (0,0,0)) unconditionally, regardless of stylesheet
|
|
129
|
+
load order, while still losing — via source order at the resulting tie —
|
|
130
|
+
to a consumer's own deliberate, equally-specific override of a specific
|
|
131
|
+
vdd- class, which normally loads after this stylesheet. */
|
|
132
|
+
[class*="vdd-"] {
|
|
133
|
+
box-sizing: border-box;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/*
|
|
137
|
+
* The library does not style the host page.
|
|
138
|
+
*
|
|
139
|
+
* react-dockable-desktop sets `height: 100%; overflow: hidden` on `html, body, #root`,
|
|
140
|
+
* because a percentage-height chain needs a real height all the way up. That works, but it
|
|
141
|
+
* reaches outside the library's own DOM and silently changes the page of any app that
|
|
142
|
+
* embeds a workspace in part of a view. vdd asks the application to give the workspace a
|
|
143
|
+
* height instead, warns in development when it has none, and offers this opt-in helper.
|
|
144
|
+
*
|
|
145
|
+
* See docs/PARITY.md section 4, divergence D8.
|
|
146
|
+
*/
|
|
147
|
+
.vdd-fill-viewport {
|
|
148
|
+
height: 100vh;
|
|
149
|
+
overflow: hidden;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Cosmetic properties are scoped to the library's own root element only — never
|
|
153
|
+
the consumer's page, html/body, or their own mount div. */
|
|
154
|
+
.vdd-workspace {
|
|
155
|
+
background-color: var(--vdd-bg-primary);
|
|
156
|
+
color: var(--vdd-text-primary);
|
|
157
|
+
font-family: 'Outfit', 'Inter', system-ui, -apple-system, sans-serif;
|
|
158
|
+
-webkit-font-smoothing: antialiased;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* Workspace Panel Container */
|
|
162
|
+
.vdd-workspace-panel {
|
|
163
|
+
background-color: var(--vdd-bg-panel);
|
|
164
|
+
border: 1px solid var(--vdd-border-panel);
|
|
165
|
+
box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.15);
|
|
166
|
+
width: 100%;
|
|
167
|
+
height: 100%;
|
|
168
|
+
display: flex;
|
|
169
|
+
flex-direction: column;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Tab Headers Bar */
|
|
173
|
+
.vdd-workspace-tab-bar {
|
|
174
|
+
background-color: var(--vdd-bg-tab-bar);
|
|
175
|
+
border-bottom: 1px solid var(--vdd-border-panel);
|
|
176
|
+
padding: 0 4px;
|
|
177
|
+
display: flex;
|
|
178
|
+
flex-direction: row;
|
|
179
|
+
justify-content: space-between;
|
|
180
|
+
align-items: center;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* Tab Headers Container */
|
|
184
|
+
/* rdd rendered scroll buttons in a tab bar that overflowed (`.rdd-tab-scroll-btn`).
|
|
185
|
+
vdd's tab bar is a scroll container with no buttons — recorded as divergence D15 — so
|
|
186
|
+
those rules matched nothing and were removed in M13. The taskbar's own overflow buttons
|
|
187
|
+
are `.vdd-taskbar-nav-btn`, which are emitted and styled. */
|
|
188
|
+
|
|
189
|
+
.vdd-tab-headers-container {
|
|
190
|
+
display: flex;
|
|
191
|
+
align-items: flex-end;
|
|
192
|
+
height: 100%;
|
|
193
|
+
padding-top: 4px;
|
|
194
|
+
padding-left: 6px;
|
|
195
|
+
position: relative;
|
|
196
|
+
z-index: 26; /* above resizer ::before (22) and resizer hover (25) — tabs always win */
|
|
197
|
+
margin-bottom: -1px;
|
|
198
|
+
flex-grow: 1;
|
|
199
|
+
overflow-x: auto;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* Tab bar scroll arrow buttons — appear when tabs overflow */
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
/* Premium Tab styling (VS Code Style) */
|
|
207
|
+
.vdd-workspace-tab {
|
|
208
|
+
position: relative;
|
|
209
|
+
background-color: var(--vdd-bg-tab-inactive) !important; /* VS Code dark background for inactive tabs */
|
|
210
|
+
color: var(--vdd-text-tab-inactive) !important; /* Clear readable gray */
|
|
211
|
+
border: none !important;
|
|
212
|
+
border-right: 1px solid var(--vdd-border-panel) !important; /* crisp separator */
|
|
213
|
+
padding: 0 6px 0 14px !important;
|
|
214
|
+
font-size: 0.75rem;
|
|
215
|
+
display: flex;
|
|
216
|
+
align-items: center;
|
|
217
|
+
border-radius: 0 !important; /* Square edges */
|
|
218
|
+
margin-right: 0 !important; /* No gaps between tabs */
|
|
219
|
+
font-weight: 500;
|
|
220
|
+
cursor: pointer;
|
|
221
|
+
user-select: none;
|
|
222
|
+
height: 35px; /* VS Code standard height */
|
|
223
|
+
box-sizing: border-box;
|
|
224
|
+
flex-shrink: 1;
|
|
225
|
+
min-width: 80px; /* compress before scrolling kicks in */
|
|
226
|
+
transition: background-color 0.1s ease, color 0.1s ease;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.vdd-workspace-tab > .vdd-text-truncate {
|
|
230
|
+
margin-right: 12px;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* Remove original after element separator */
|
|
234
|
+
.vdd-workspace-tab:not(.vdd-active):not(:last-child)::after {
|
|
235
|
+
display: none !important;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.vdd-workspace-tab:hover {
|
|
239
|
+
background-color: var(--vdd-bg-tab-hover) !important;
|
|
240
|
+
color: var(--vdd-text-tab-hover) !important;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* Active tab (focused) */
|
|
244
|
+
.vdd-workspace-tab.vdd-active.vdd-workspace-tab-active-focused {
|
|
245
|
+
background-color: var(--vdd-tab-bg-active-focused) !important;
|
|
246
|
+
color: var(--vdd-tab-text-active-focused) !important;
|
|
247
|
+
font-weight: 500;
|
|
248
|
+
border-right: 1px solid var(--vdd-border-panel) !important;
|
|
249
|
+
z-index: 2;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.vdd-workspace-tab.vdd-active.vdd-workspace-tab-active-focused::before {
|
|
253
|
+
content: '';
|
|
254
|
+
position: absolute;
|
|
255
|
+
top: 0;
|
|
256
|
+
left: 0;
|
|
257
|
+
right: 0;
|
|
258
|
+
height: 2px;
|
|
259
|
+
background-color: var(--vdd-tab-indicator-focused) !important;
|
|
260
|
+
border-radius: 0 !important;
|
|
261
|
+
box-shadow: 0 1px 4px var(--vdd-accent-glow);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* Active tab (unfocused/inactive group) */
|
|
265
|
+
.vdd-workspace-tab.vdd-active.vdd-workspace-tab-active-unfocused {
|
|
266
|
+
background-color: var(--vdd-tab-bg-active-unfocused) !important;
|
|
267
|
+
color: var(--vdd-tab-text-active-unfocused) !important;
|
|
268
|
+
font-weight: 500;
|
|
269
|
+
border-right: 1px solid var(--vdd-border-panel) !important;
|
|
270
|
+
z-index: 2;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.vdd-workspace-tab.vdd-active.vdd-workspace-tab-active-unfocused::before {
|
|
274
|
+
content: '';
|
|
275
|
+
position: absolute;
|
|
276
|
+
top: 0;
|
|
277
|
+
left: 0;
|
|
278
|
+
right: 0;
|
|
279
|
+
height: 2px;
|
|
280
|
+
background-color: var(--vdd-tab-indicator-unfocused) !important;
|
|
281
|
+
border-radius: 0 !important;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.vdd-workspace-tab-inactive {
|
|
285
|
+
color: var(--vdd-close-btn-color) !important;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.vdd-workspace-tab-inactive:hover {
|
|
289
|
+
color: var(--vdd-text-tab-hover) !important;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/* Tab close button (VS Code style visibility) */
|
|
293
|
+
.vdd-close-tab-x {
|
|
294
|
+
opacity: 0; /* hidden by default on inactive tabs, allows hover/active overrides */
|
|
295
|
+
transition: opacity 0.12s ease, background-color 0.12s ease, color 0.12s ease;
|
|
296
|
+
margin-left: 8px;
|
|
297
|
+
border-radius: 3px;
|
|
298
|
+
color: var(--vdd-close-btn-color) !important;
|
|
299
|
+
display: flex;
|
|
300
|
+
align-items: center;
|
|
301
|
+
justify-content: center;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/* Always show close icon on active tab */
|
|
305
|
+
.vdd-workspace-tab.vdd-active .vdd-close-tab-x {
|
|
306
|
+
opacity: 0.75 !important;
|
|
307
|
+
color: var(--vdd-close-btn-active-color) !important;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/* Show close icon on hover of any tab */
|
|
311
|
+
.vdd-workspace-tab:hover .vdd-close-tab-x {
|
|
312
|
+
opacity: 0.75 !important;
|
|
313
|
+
color: var(--vdd-close-btn-active-color) !important;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/* Hover style on the close icon itself (VS Code dark rounded background) */
|
|
317
|
+
.vdd-close-tab-x:hover {
|
|
318
|
+
opacity: 1 !important;
|
|
319
|
+
background-color: var(--vdd-close-btn-hover-bg) !important;
|
|
320
|
+
color: var(--vdd-close-btn-hover-color) !important;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/* Drag resizer split bars */
|
|
324
|
+
.vdd-resizer-bar {
|
|
325
|
+
background-color: var(--vdd-border-panel, rgba(255, 255, 255, 0.08)) !important;
|
|
326
|
+
transition: background-color 0.15s ease, transform 0.15s ease !important;
|
|
327
|
+
position: relative;
|
|
328
|
+
z-index: 21;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/* Invisible 8px hit-box overlay to make grabbing easy */
|
|
332
|
+
.vdd-resizer-bar::before {
|
|
333
|
+
content: '';
|
|
334
|
+
position: absolute;
|
|
335
|
+
z-index: 22;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/* Grab hit-box for columns (cursor: col-resize) */
|
|
339
|
+
.vdd-resizer-bar[style*="cursor: col-resize"]::before {
|
|
340
|
+
top: 0;
|
|
341
|
+
bottom: 0;
|
|
342
|
+
left: -3px;
|
|
343
|
+
width: 8px;
|
|
344
|
+
height: 100%;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/* Grab hit-box for rows (cursor: row-resize) — extends upward only (into safe content area),
|
|
348
|
+
never downward into the tab bar of the panel below */
|
|
349
|
+
.vdd-resizer-bar[style*="cursor: row-resize"]::before {
|
|
350
|
+
left: 0;
|
|
351
|
+
right: 0;
|
|
352
|
+
top: -8px;
|
|
353
|
+
height: 9px;
|
|
354
|
+
width: 100%;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/* Highlight state (on hover or active drag) */
|
|
358
|
+
.vdd-resizer-bar:hover,
|
|
359
|
+
.vdd-resizer-bar.vdd-active {
|
|
360
|
+
background-color: color-mix(in srgb, var(--vdd-accent-color) 35%, transparent) !important;
|
|
361
|
+
box-shadow: none !important;
|
|
362
|
+
z-index: 25 !important;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.vdd-resizer-bar[style*="cursor: col-resize"]:hover,
|
|
366
|
+
.vdd-resizer-bar[style*="cursor: col-resize"].vdd-active {
|
|
367
|
+
transform: scaleX(2);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.vdd-resizer-bar[style*="cursor: row-resize"]:hover,
|
|
371
|
+
.vdd-resizer-bar[style*="cursor: row-resize"].vdd-active {
|
|
372
|
+
transform: scaleY(2);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/* Global body cursor overrides during active resize drag to prevent cursor flickering */
|
|
376
|
+
body.vdd-resizing-active {
|
|
377
|
+
-webkit-user-select: none !important;
|
|
378
|
+
user-select: none !important;
|
|
379
|
+
}
|
|
380
|
+
body.vdd-resizing-row-active,
|
|
381
|
+
body.vdd-resizing-row-active * {
|
|
382
|
+
cursor: row-resize !important;
|
|
383
|
+
}
|
|
384
|
+
body.vdd-resizing-col-active,
|
|
385
|
+
body.vdd-resizing-col-active * {
|
|
386
|
+
cursor: col-resize !important;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/* Control buttons inside tabs/windows */
|
|
390
|
+
.vdd-custom-tab-btn {
|
|
391
|
+
background: var(--vdd-custom-btn-bg);
|
|
392
|
+
border: 1px solid var(--vdd-custom-btn-border);
|
|
393
|
+
color: var(--vdd-text-secondary);
|
|
394
|
+
font-size: 9px;
|
|
395
|
+
width: 18px;
|
|
396
|
+
height: 18px;
|
|
397
|
+
border-radius: 4px;
|
|
398
|
+
display: flex;
|
|
399
|
+
align-items: center;
|
|
400
|
+
justify-content: center;
|
|
401
|
+
cursor: pointer;
|
|
402
|
+
transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
403
|
+
padding: 0;
|
|
404
|
+
line-height: 1;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.vdd-custom-tab-btn:hover {
|
|
408
|
+
background-color: var(--vdd-custom-btn-hover-bg);
|
|
409
|
+
color: var(--vdd-custom-btn-hover-color);
|
|
410
|
+
border-color: var(--vdd-custom-btn-border);
|
|
411
|
+
transform: scale(1.05);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/* Taskbar Sibling Footer Styling */
|
|
415
|
+
/* ── autohide mode: absolute overlay, collapses to peek strip ── */
|
|
416
|
+
/*
|
|
417
|
+
* The taskbar sits above the workspace content.
|
|
418
|
+
*
|
|
419
|
+
* rdd set `zIndex: 100` inline on its footer; ported here because it is load-bearing, not
|
|
420
|
+
* decorative. Without it the autohide overlay is covered by whatever the grid puts at the
|
|
421
|
+
* bottom edge — a split divider's invisible 8px hit-box was enough to swallow every
|
|
422
|
+
* `pointerenter`, so the peek strip could not be hovered at all. Found by the M7 browser
|
|
423
|
+
* gate; the same class of omission as the structural flex styles in M4.
|
|
424
|
+
*
|
|
425
|
+
* Below floating windows on purpose: those stack from `--vdd-z-base` (1000), matching rdd.
|
|
426
|
+
*/
|
|
427
|
+
.vdd-taskbar-footer-container {
|
|
428
|
+
position: relative;
|
|
429
|
+
z-index: 100;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.vdd-taskbar-footer-container.vdd-taskbar-mode-autohide {
|
|
433
|
+
position: absolute;
|
|
434
|
+
bottom: 0;
|
|
435
|
+
left: 0;
|
|
436
|
+
right: 0;
|
|
437
|
+
transform: translateY(calc(100% - 8px));
|
|
438
|
+
transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.vdd-taskbar-footer-container.vdd-taskbar-mode-autohide.vdd-taskbar-expanded {
|
|
442
|
+
transform: translateY(0);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.vdd-taskbar-peek-handle {
|
|
446
|
+
position: absolute;
|
|
447
|
+
top: 3px;
|
|
448
|
+
left: 50%;
|
|
449
|
+
transform: translateX(-50%);
|
|
450
|
+
width: 32px;
|
|
451
|
+
height: 3px;
|
|
452
|
+
border-radius: 999px;
|
|
453
|
+
background: var(--vdd-accent-color, #38bdf8);
|
|
454
|
+
opacity: 0.5;
|
|
455
|
+
pointer-events: none;
|
|
456
|
+
transition: opacity 0.2s;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.vdd-taskbar-footer-container.vdd-taskbar-mode-autohide.vdd-taskbar-expanded .vdd-taskbar-peek-handle {
|
|
460
|
+
opacity: 0;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
@media (pointer: coarse) {
|
|
464
|
+
.vdd-taskbar-footer-container.vdd-taskbar-mode-autohide {
|
|
465
|
+
transform: translateY(calc(100% - 12px));
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.vdd-taskbar-footer-container {
|
|
470
|
+
background-color: var(--vdd-taskbar-bg) !important;
|
|
471
|
+
border-top: 1px solid var(--vdd-border-panel) !important;
|
|
472
|
+
backdrop-filter: blur(12px) saturate(180%);
|
|
473
|
+
-webkit-backdrop-filter: blur(12px) saturate(180%);
|
|
474
|
+
flex-shrink: 0;
|
|
475
|
+
width: 100%;
|
|
476
|
+
display: flex;
|
|
477
|
+
flex-direction: row;
|
|
478
|
+
align-items: center;
|
|
479
|
+
justify-content: center;
|
|
480
|
+
padding: 0 1rem;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.vdd-taskbar-nav-btn {
|
|
484
|
+
color: var(--vdd-taskbar-nav-color) !important;
|
|
485
|
+
background: transparent;
|
|
486
|
+
border: none;
|
|
487
|
+
cursor: pointer;
|
|
488
|
+
font-family: monospace;
|
|
489
|
+
padding: 0;
|
|
490
|
+
text-decoration: none;
|
|
491
|
+
font-size: 0.875rem;
|
|
492
|
+
line-height: 1;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.vdd-taskbar-nav-btn:hover {
|
|
496
|
+
color: var(--vdd-accent-color) !important;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
/* macOS/Win11 Glassmorphic Taskbar */
|
|
500
|
+
.vdd-taskbar-glassmorphic-item {
|
|
501
|
+
background: var(--vdd-taskbar-item-bg) !important;
|
|
502
|
+
backdrop-filter: blur(12px) saturate(180%);
|
|
503
|
+
-webkit-backdrop-filter: blur(12px) saturate(180%);
|
|
504
|
+
border: 1px solid var(--vdd-taskbar-item-border) !important;
|
|
505
|
+
color: var(--vdd-taskbar-item-text) !important;
|
|
506
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
507
|
+
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1) !important;
|
|
508
|
+
display: flex;
|
|
509
|
+
align-items: center;
|
|
510
|
+
justify-content: center;
|
|
511
|
+
border-radius: 4px;
|
|
512
|
+
cursor: pointer;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
.vdd-taskbar-glassmorphic-item:hover {
|
|
516
|
+
background: var(--vdd-taskbar-item-hover-bg) !important;
|
|
517
|
+
border-color: var(--vdd-accent-color, #38bdf8) !important;
|
|
518
|
+
box-shadow: 0 6px 16px rgba(56, 189, 248, 0.15);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/* Minimalist Taskbar Icon-Only & Premium Tooltip Rules */
|
|
522
|
+
.vdd-taskbar-item-icon {
|
|
523
|
+
font-size: 22px !important;
|
|
524
|
+
line-height: 1 !important;
|
|
525
|
+
display: inline-flex;
|
|
526
|
+
align-items: center;
|
|
527
|
+
justify-content: center;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
.vdd-taskbar-item-icon svg,
|
|
531
|
+
.vdd-taskbar-item-icon img {
|
|
532
|
+
width: 22px !important;
|
|
533
|
+
height: 22px !important;
|
|
534
|
+
max-width: 22px !important;
|
|
535
|
+
max-height: 22px !important;
|
|
536
|
+
object-fit: contain;
|
|
537
|
+
display: block;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
@keyframes vdd-tooltip-fade-in {
|
|
541
|
+
from {
|
|
542
|
+
opacity: 0;
|
|
543
|
+
transform: translateX(-50%) translateY(-90%);
|
|
544
|
+
}
|
|
545
|
+
to {
|
|
546
|
+
opacity: 1;
|
|
547
|
+
transform: translateX(-50%) translateY(-100%);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/*
|
|
552
|
+
* The hover preview stacks above everything in the workspace.
|
|
553
|
+
*
|
|
554
|
+
* rdd set `zIndex: 999999` inline on this element, so the ported stylesheet had no z-index at
|
|
555
|
+
* all and the preview came out at `auto`: a split divider painted over it, and the pointer
|
|
556
|
+
* could never reach the preview to click it. Expressed against `--vdd-z-base` like the rest
|
|
557
|
+
* of the library's chrome, so `zIndexBase` moves it with everything else.
|
|
558
|
+
*
|
|
559
|
+
* This is the third value rdd carried inline rather than in CSS (after the structural flex
|
|
560
|
+
* styles and the taskbar's own z-index) — all three were load-bearing, and all three were
|
|
561
|
+
* found by a browser gate rather than by reading.
|
|
562
|
+
*/
|
|
563
|
+
.vdd-taskbar-item-tooltip {
|
|
564
|
+
z-index: calc(var(--vdd-z-base, 1000) + 8000);
|
|
565
|
+
background: var(--vdd-bg-panel, #1e1e1e) !important;
|
|
566
|
+
color: var(--vdd-text-primary, #ffffff) !important;
|
|
567
|
+
padding: 8px !important;
|
|
568
|
+
border-radius: 6px;
|
|
569
|
+
font-size: 11px !important;
|
|
570
|
+
font-family: 'Outfit', 'Inter', system-ui, sans-serif;
|
|
571
|
+
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);
|
|
572
|
+
border: 1px solid var(--vdd-taskbar-item-border, rgba(255, 255, 255, 0.1)) !important;
|
|
573
|
+
animation: vdd-tooltip-fade-in 0.15s cubic-bezier(0.4, 0, 0.2, 1) forwards;
|
|
574
|
+
display: flex;
|
|
575
|
+
flex-direction: column;
|
|
576
|
+
gap: 0.25rem;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/* Invisible bridge so mouse transitions smoothly to tooltip */
|
|
580
|
+
.vdd-taskbar-item-tooltip::before {
|
|
581
|
+
content: '';
|
|
582
|
+
position: absolute;
|
|
583
|
+
top: 100%;
|
|
584
|
+
left: 0;
|
|
585
|
+
width: 100%;
|
|
586
|
+
height: 12px;
|
|
587
|
+
background: transparent;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
.vdd-taskbar-item-tooltip::after {
|
|
591
|
+
content: '';
|
|
592
|
+
position: absolute;
|
|
593
|
+
top: 100%;
|
|
594
|
+
left: 50%;
|
|
595
|
+
transform: translateX(-50%);
|
|
596
|
+
border-width: 5px;
|
|
597
|
+
border-style: solid;
|
|
598
|
+
border-color: var(--vdd-bg-panel, #1e1e1e) transparent transparent transparent;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/* Live preview thumbnail styles.
|
|
602
|
+
rdd additionally shipped `.vdd-taskbar-item-preview-host .luciad canvas` rules, hard-coding
|
|
603
|
+
a specific third-party mapping library's class name into a framework-agnostic stylesheet.
|
|
604
|
+
Dropped — an application can style its own content inside the preview host itself.
|
|
605
|
+
See docs/PARITY.md, divergence D10. */
|
|
606
|
+
/*
|
|
607
|
+
* The thumbnail frame is clickable; its *contents* are not.
|
|
608
|
+
*
|
|
609
|
+
* rdd sets `pointer-events: none` on the frame itself, so a click anywhere over the
|
|
610
|
+
* thumbnail — which is most of the preview — passes through the tooltip entirely and does
|
|
611
|
+
* nothing. Only its little header row responds. Here the frame accepts the click (and the
|
|
612
|
+
* tooltip's handler restores the panel) while everything inside stays inert, so the live
|
|
613
|
+
* panel in the preview can never be interacted with by accident.
|
|
614
|
+
* See docs/PARITY.md divergence D11.
|
|
615
|
+
*/
|
|
616
|
+
.vdd-taskbar-item-preview-frame {
|
|
617
|
+
border-radius: 4px;
|
|
618
|
+
overflow: hidden;
|
|
619
|
+
background: #000000;
|
|
620
|
+
border: 1px solid var(--vdd-taskbar-item-border, rgba(255, 255, 255, 0.15));
|
|
621
|
+
position: relative;
|
|
622
|
+
margin-top: 4px;
|
|
623
|
+
user-select: none !important;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.vdd-taskbar-item-preview-host,
|
|
627
|
+
.vdd-taskbar-item-preview-letter {
|
|
628
|
+
pointer-events: none !important;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
.vdd-taskbar-item-preview-host {
|
|
632
|
+
transform-origin: top left;
|
|
633
|
+
position: absolute;
|
|
634
|
+
top: 0;
|
|
635
|
+
left: 0;
|
|
636
|
+
}
|
|
637
|
+
.vdd-taskbar-item-preview-host * {
|
|
638
|
+
pointer-events: none !important;
|
|
639
|
+
user-select: none !important;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
.vdd-tooltip-close-x {
|
|
645
|
+
width: 18px;
|
|
646
|
+
height: 18px;
|
|
647
|
+
border-radius: 3px;
|
|
648
|
+
background: transparent !important;
|
|
649
|
+
border: none !important;
|
|
650
|
+
color: var(--vdd-close-btn-color, var(--vdd-text-secondary, #888888)) !important;
|
|
651
|
+
cursor: pointer;
|
|
652
|
+
transition: opacity 0.12s ease, background-color 0.12s ease, color 0.12s ease;
|
|
653
|
+
flex-shrink: 0;
|
|
654
|
+
display: flex;
|
|
655
|
+
align-items: center;
|
|
656
|
+
justify-content: center;
|
|
657
|
+
opacity: 0.75;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
.vdd-tooltip-close-x:hover {
|
|
661
|
+
background: var(--vdd-close-btn-hover-bg) !important;
|
|
662
|
+
color: var(--vdd-close-btn-hover-color) !important;
|
|
663
|
+
opacity: 1 !important;
|
|
664
|
+
}
|
|
665
|
+
.vdd-scrollbar-hidden::-webkit-scrollbar {
|
|
666
|
+
display: none;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/* Cross-browser scrollbar styling (Firefox standard) — scoped to the library's
|
|
670
|
+
own workspace subtree, never the consumer's page. .vdd-sidebar-drawer-body is
|
|
671
|
+
included explicitly alongside it: <Sidebar> mounts as a sibling of
|
|
672
|
+
<WindowManager>, not a descendant of .vdd-workspace, so it needs its own
|
|
673
|
+
entry here to pick up the same treatment — keep both in sync if this block
|
|
674
|
+
ever changes. */
|
|
675
|
+
.vdd-workspace *,
|
|
676
|
+
.vdd-sidebar-drawer-body {
|
|
677
|
+
scrollbar-width: thin;
|
|
678
|
+
scrollbar-color: var(--vdd-scrollbar-thumb) var(--vdd-scrollbar-track);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* WebKit (Chrome, Safari, Edge) scrollbar styling */
|
|
682
|
+
.vdd-workspace ::-webkit-scrollbar,
|
|
683
|
+
.vdd-sidebar-drawer-body::-webkit-scrollbar {
|
|
684
|
+
width: 6px;
|
|
685
|
+
height: 6px;
|
|
686
|
+
}
|
|
687
|
+
.vdd-workspace ::-webkit-scrollbar-track,
|
|
688
|
+
.vdd-sidebar-drawer-body::-webkit-scrollbar-track {
|
|
689
|
+
background: var(--vdd-scrollbar-track);
|
|
690
|
+
}
|
|
691
|
+
.vdd-workspace ::-webkit-scrollbar-thumb,
|
|
692
|
+
.vdd-sidebar-drawer-body::-webkit-scrollbar-thumb {
|
|
693
|
+
background: var(--vdd-scrollbar-thumb);
|
|
694
|
+
border-radius: 4px;
|
|
695
|
+
}
|
|
696
|
+
.vdd-workspace ::-webkit-scrollbar-thumb:hover,
|
|
697
|
+
.vdd-sidebar-drawer-body::-webkit-scrollbar-thumb:hover {
|
|
698
|
+
background: var(--vdd-scrollbar-thumb-hover);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.vdd-floating-window {
|
|
702
|
+
display: flex;
|
|
703
|
+
flex-direction: column;
|
|
704
|
+
border-radius: 8px;
|
|
705
|
+
border: 1px solid var(--vdd-window-border);
|
|
706
|
+
box-shadow: var(--vdd-window-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.05);
|
|
707
|
+
backdrop-filter: blur(16px) saturate(180%);
|
|
708
|
+
-webkit-backdrop-filter: blur(16px) saturate(180%);
|
|
709
|
+
background-color: var(--vdd-window-bg);
|
|
710
|
+
overflow: hidden;
|
|
711
|
+
transition: box-shadow 0.2s, border-color 0.2s;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
.vdd-floating-window.vdd-window-focused {
|
|
715
|
+
box-shadow: var(--vdd-window-shadow-focused), inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
|
716
|
+
border-color: var(--vdd-window-border-focused);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/* Dim only titlebar when window is unfocused to keep panel content opaque */
|
|
720
|
+
.vdd-floating-window:not(.vdd-window-focused) .vdd-floating-window-titlebar {
|
|
721
|
+
opacity: 0.65;
|
|
722
|
+
transition: opacity 0.2s ease;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/* The class the component actually renders is `vdd-maximized`. rdd's equivalent rule said
|
|
726
|
+
`.maximized`, so it never matched and a maximized window kept its rounded corners, border
|
|
727
|
+
and drop shadow while filling the whole workspace. See docs/PARITY.md, divergence D9. */
|
|
728
|
+
.vdd-floating-window.vdd-maximized {
|
|
729
|
+
border-radius: 0;
|
|
730
|
+
border: none;
|
|
731
|
+
box-shadow: none;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
.vdd-floating-window-titlebar {
|
|
736
|
+
padding: 8px 14px;
|
|
737
|
+
background-color: var(--vdd-window-header-bg);
|
|
738
|
+
border-bottom: 1px solid var(--vdd-window-border);
|
|
739
|
+
min-height: 38px;
|
|
740
|
+
display: flex;
|
|
741
|
+
flex-direction: row;
|
|
742
|
+
justify-content: space-between;
|
|
743
|
+
align-items: center;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
.vdd-floating-window-title {
|
|
747
|
+
font-family: 'Outfit', sans-serif;
|
|
748
|
+
font-size: 0.78rem;
|
|
749
|
+
font-weight: 600;
|
|
750
|
+
color: var(--vdd-window-text);
|
|
751
|
+
letter-spacing: 0.02em;
|
|
752
|
+
display: flex;
|
|
753
|
+
align-items: center;
|
|
754
|
+
overflow: hidden;
|
|
755
|
+
text-overflow: ellipsis;
|
|
756
|
+
white-space: nowrap;
|
|
757
|
+
margin-inline-end: 0.5rem;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
.vdd-cursor-move {
|
|
761
|
+
cursor: grab;
|
|
762
|
+
}
|
|
763
|
+
.vdd-cursor-move:active {
|
|
764
|
+
cursor: grabbing;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
/* ==========================================================================
|
|
768
|
+
CONTEXT MENU (.vdd-context-menu)
|
|
769
|
+
========================================================================== */
|
|
770
|
+
|
|
771
|
+
/* rdd wrapped its built-in menu icons in `.rdd-menu-icon` for the icon column's sizing.
|
|
772
|
+
vdd renders them inside `.vdd-context-menu__icon`, which is shared with the toolbar
|
|
773
|
+
flyout's rows, so the separate wrapper rule matched nothing. Removed in M13. */
|
|
774
|
+
|
|
775
|
+
.vdd-context-menu {
|
|
776
|
+
position: fixed;
|
|
777
|
+
z-index: calc(var(--vdd-z-base, 1000) + 8500);
|
|
778
|
+
background: var(--vdd-sidebar-bg, #1e2024);
|
|
779
|
+
border: 1px solid var(--vdd-sidebar-border, rgba(255, 255, 255, 0.08));
|
|
780
|
+
border-radius: 6px;
|
|
781
|
+
padding: 4px 0;
|
|
782
|
+
min-width: 220px;
|
|
783
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2);
|
|
784
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
|
785
|
+
font-size: 13px;
|
|
786
|
+
animation: vdd-context-menu-in 0.1s cubic-bezier(0.16, 1, 0.3, 1);
|
|
787
|
+
outline: none;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
@keyframes vdd-context-menu-in {
|
|
791
|
+
from { opacity: 0; transform: scale(0.97); }
|
|
792
|
+
to { opacity: 1; transform: scale(1); }
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
.vdd-context-menu--submenu {
|
|
796
|
+
z-index: calc(var(--vdd-z-base, 1000) + 8501);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
.vdd-context-menu__separator {
|
|
800
|
+
height: 1px;
|
|
801
|
+
background: var(--vdd-sidebar-border, rgba(255, 255, 255, 0.08));
|
|
802
|
+
margin: 4px 8px;
|
|
803
|
+
border: none;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
.vdd-context-menu__item {
|
|
807
|
+
display: flex;
|
|
808
|
+
align-items: center;
|
|
809
|
+
width: calc(100% - 8px);
|
|
810
|
+
margin: 0 4px;
|
|
811
|
+
padding: 5px 8px;
|
|
812
|
+
gap: 8px;
|
|
813
|
+
background: none;
|
|
814
|
+
border: none;
|
|
815
|
+
border-radius: 4px;
|
|
816
|
+
color: var(--vdd-sidebar-text-title, #cccccc);
|
|
817
|
+
cursor: pointer;
|
|
818
|
+
text-align: start;
|
|
819
|
+
white-space: nowrap;
|
|
820
|
+
letter-spacing: 0.01em;
|
|
821
|
+
box-sizing: border-box;
|
|
822
|
+
font-size: inherit;
|
|
823
|
+
font-family: inherit;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
.vdd-context-menu__item:hover:not(:disabled):not(.vdd-context-menu__item--disabled) {
|
|
827
|
+
background-color: var(--vdd-toolbar-btn-hover-bg, rgba(255, 255, 255, 0.07));
|
|
828
|
+
color: var(--vdd-sidebar-text-title, #f8f9fa);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
.vdd-context-menu__item:disabled,
|
|
832
|
+
.vdd-context-menu__item--disabled {
|
|
833
|
+
opacity: 0.38;
|
|
834
|
+
cursor: default;
|
|
835
|
+
pointer-events: none;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
.vdd-context-menu__item--has-submenu.vdd-context-menu__item--submenu-open {
|
|
839
|
+
background-color: var(--vdd-toolbar-btn-radio-active-bg, rgba(9, 71, 113, 0.35));
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
.vdd-context-menu__icon {
|
|
843
|
+
width: 16px;
|
|
844
|
+
min-width: 16px;
|
|
845
|
+
display: inline-flex;
|
|
846
|
+
align-items: center;
|
|
847
|
+
justify-content: center;
|
|
848
|
+
flex-shrink: 0;
|
|
849
|
+
color: inherit;
|
|
850
|
+
opacity: 0.85;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
.vdd-context-menu__label {
|
|
854
|
+
flex: 1;
|
|
855
|
+
overflow: hidden;
|
|
856
|
+
text-overflow: ellipsis;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
.vdd-context-menu__chevron {
|
|
860
|
+
flex-shrink: 0;
|
|
861
|
+
margin-left: auto;
|
|
862
|
+
padding-left: 12px;
|
|
863
|
+
font-size: 14px;
|
|
864
|
+
line-height: 1;
|
|
865
|
+
opacity: 0.6;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
[dir="rtl"] .vdd-context-menu__chevron {
|
|
869
|
+
margin-left: 0;
|
|
870
|
+
margin-right: auto;
|
|
871
|
+
padding-left: 0;
|
|
872
|
+
padding-right: 12px;
|
|
873
|
+
transform: scaleX(-1);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
[dir="rtl"] .vdd-context-menu__checkbox {
|
|
877
|
+
margin-left: 0;
|
|
878
|
+
margin-right: auto;
|
|
879
|
+
padding-left: 0;
|
|
880
|
+
padding-right: 12px;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
.vdd-context-menu__checkbox {
|
|
884
|
+
width: 14px;
|
|
885
|
+
min-width: 14px;
|
|
886
|
+
height: 14px;
|
|
887
|
+
flex-shrink: 0;
|
|
888
|
+
margin-left: auto;
|
|
889
|
+
padding-left: 12px;
|
|
890
|
+
display: inline-flex;
|
|
891
|
+
align-items: center;
|
|
892
|
+
justify-content: center;
|
|
893
|
+
color: var(--vdd-tab-icon-active, #38bdf8);
|
|
894
|
+
box-sizing: content-box;
|
|
895
|
+
opacity: 0.6;
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
.vdd-context-menu__checkbox--checked {
|
|
899
|
+
opacity: 1;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/* Drag split target drop zone overlays */
|
|
903
|
+
.vdd-dock-drop-zone-overlay {
|
|
904
|
+
position: absolute;
|
|
905
|
+
inset: 0;
|
|
906
|
+
/* Must outrank .vdd-workspace-edge-trigger (+8999) and .vdd-corner-zone (+9000) —
|
|
907
|
+
a leaf's cross commonly falls within the outer edge band or a corner region,
|
|
908
|
+
and the more specific per-leaf target should win the hover/drop hit-test there. */
|
|
909
|
+
z-index: calc(var(--vdd-z-base, 1000) + 9001);
|
|
910
|
+
display: flex;
|
|
911
|
+
align-items: center;
|
|
912
|
+
justify-content: center;
|
|
913
|
+
background-color: rgba(0, 0, 0, 0.15);
|
|
914
|
+
pointer-events: none;
|
|
915
|
+
border-radius: 4px;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/* Translucent overlay preview highlighting the grid section about to split */
|
|
919
|
+
.vdd-dock-preview-highlight {
|
|
920
|
+
position: absolute;
|
|
921
|
+
background-color: rgba(56, 189, 248, 0.2) !important; /* neon cyan overlay */
|
|
922
|
+
border: 1.5px dashed var(--vdd-accent-color) !important;
|
|
923
|
+
transition: all 0.1s ease-out;
|
|
924
|
+
pointer-events: none;
|
|
925
|
+
z-index: 90;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/* Central cross layout container */
|
|
929
|
+
.vdd-dock-target-cross {
|
|
930
|
+
position: relative;
|
|
931
|
+
width: 140px;
|
|
932
|
+
height: 140px;
|
|
933
|
+
pointer-events: auto;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/* Visual split target buttons (top, bottom, left, right, center) */
|
|
937
|
+
.vdd-dock-target-box {
|
|
938
|
+
position: absolute;
|
|
939
|
+
background-color: rgba(15, 23, 42, 0.92);
|
|
940
|
+
border: 1px solid rgba(255, 255, 255, 0.15);
|
|
941
|
+
border-radius: 4px;
|
|
942
|
+
display: flex;
|
|
943
|
+
align-items: center;
|
|
944
|
+
justify-content: center;
|
|
945
|
+
cursor: copy;
|
|
946
|
+
transition: all 0.12s ease-in-out;
|
|
947
|
+
pointer-events: auto;
|
|
948
|
+
box-shadow: 0 4px 12px rgba(0,0,0,0.5);
|
|
949
|
+
color: var(--vdd-text-secondary);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
/* State-driven (activeDropZone), not :hover-driven — :hover never reliably
|
|
953
|
+
updates during an active drag in Safari, and doesn't exist on touch at all. */
|
|
954
|
+
.vdd-dock-target-box--active {
|
|
955
|
+
background-color: var(--vdd-accent-color) !important;
|
|
956
|
+
border-color: #ffffff !important;
|
|
957
|
+
color: #090b11 !important;
|
|
958
|
+
transform: scale(1.12);
|
|
959
|
+
box-shadow: 0 0 12px var(--vdd-accent-color);
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/* Specific split target layouts */
|
|
963
|
+
.vdd-dock-target-left {
|
|
964
|
+
left: 0;
|
|
965
|
+
top: 45px;
|
|
966
|
+
width: 40px;
|
|
967
|
+
height: 50px;
|
|
968
|
+
}
|
|
969
|
+
.vdd-dock-target-right {
|
|
970
|
+
right: 0;
|
|
971
|
+
top: 45px;
|
|
972
|
+
width: 40px;
|
|
973
|
+
height: 50px;
|
|
974
|
+
}
|
|
975
|
+
.vdd-dock-target-top {
|
|
976
|
+
left: 45px;
|
|
977
|
+
top: 0;
|
|
978
|
+
width: 50px;
|
|
979
|
+
height: 40px;
|
|
980
|
+
}
|
|
981
|
+
.vdd-dock-target-bottom {
|
|
982
|
+
left: 45px;
|
|
983
|
+
bottom: 0;
|
|
984
|
+
width: 50px;
|
|
985
|
+
height: 40px;
|
|
986
|
+
}
|
|
987
|
+
.vdd-dock-target-center {
|
|
988
|
+
left: 45px;
|
|
989
|
+
top: 45px;
|
|
990
|
+
width: 50px;
|
|
991
|
+
height: 50px;
|
|
992
|
+
background-color: rgba(30, 41, 59, 0.95);
|
|
993
|
+
color: var(--vdd-accent-color);
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
/* Drag hover indicators: glowing insertion line */
|
|
997
|
+
.vdd-workspace-tab.vdd-drag-hover-left {
|
|
998
|
+
box-shadow: -3px 0 0 0 var(--vdd-accent-color, #38bdf8),
|
|
999
|
+
-10px 0 10px -2px var(--vdd-accent-glow, rgba(56,189,248,0.35));
|
|
1000
|
+
}
|
|
1001
|
+
.vdd-workspace-tab.vdd-drag-hover-right {
|
|
1002
|
+
box-shadow: 3px 0 0 0 var(--vdd-accent-color, #38bdf8),
|
|
1003
|
+
10px 0 10px -2px var(--vdd-accent-glow, rgba(56,189,248,0.35));
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
/* Close button for empty LeafGroups inside header */
|
|
1007
|
+
.vdd-header-close-empty-group {
|
|
1008
|
+
opacity: 0 !important;
|
|
1009
|
+
transition: opacity 0.12s ease, background-color 0.12s ease, color 0.12s ease !important;
|
|
1010
|
+
display: flex;
|
|
1011
|
+
align-items: center;
|
|
1012
|
+
justify-content: center;
|
|
1013
|
+
margin-inline-end: 0.5rem;
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
.vdd-workspace-panel:hover .vdd-header-close-empty-group {
|
|
1017
|
+
opacity: 0.75 !important;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
.vdd-header-close-empty-group:hover {
|
|
1021
|
+
opacity: 1 !important;
|
|
1022
|
+
background-color: rgba(255, 255, 255, 0.12) !important;
|
|
1023
|
+
color: #ffffff !important;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
/* Grabbing cursor style during active dragging */
|
|
1027
|
+
.vdd-dragging-active,
|
|
1028
|
+
.vdd-dragging-active * {
|
|
1029
|
+
cursor: grabbing !important;
|
|
1030
|
+
}
|
|
1031
|
+
body.vdd-dragging-active {
|
|
1032
|
+
-webkit-user-select: none !important;
|
|
1033
|
+
user-select: none !important;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
/* --- Theme Variables for Sidebar and Tabs --- */
|
|
1037
|
+
[data-color-scheme="dark"] {
|
|
1038
|
+
--vdd-sidebar-bg: #1e2024;
|
|
1039
|
+
--vdd-sidebar-tabs-bg: #141619;
|
|
1040
|
+
--vdd-sidebar-border: rgba(255, 255, 255, 0.08);
|
|
1041
|
+
--vdd-sidebar-card-bg: rgba(255, 255, 255, 0.03);
|
|
1042
|
+
--vdd-sidebar-card-border: rgba(255, 255, 255, 0.08);
|
|
1043
|
+
--vdd-sidebar-card-active-bg: rgba(56, 189, 248, 0.06);
|
|
1044
|
+
--vdd-sidebar-card-active-border: rgba(56, 189, 248, 0.3);
|
|
1045
|
+
--vdd-sidebar-text-title: #f8f9fa;
|
|
1046
|
+
--vdd-sidebar-text-muted: #8a90a0;
|
|
1047
|
+
--vdd-sidebar-badge-bg: #2d3139;
|
|
1048
|
+
--vdd-sidebar-badge-text: #b0b5c0;
|
|
1049
|
+
--vdd-sidebar-btn-front-border: #38bdf8;
|
|
1050
|
+
--vdd-sidebar-btn-front-text: #38bdf8;
|
|
1051
|
+
--vdd-sidebar-btn-front-bg: transparent;
|
|
1052
|
+
--vdd-sidebar-btn-front-hover-bg: rgba(56, 189, 248, 0.1);
|
|
1053
|
+
--vdd-tab-icon-active: #38bdf8;
|
|
1054
|
+
--vdd-tab-icon-inactive: #9ea4b0;
|
|
1055
|
+
--vdd-tab-btn-active-bg: #1e2024; /* Seamless merge look */
|
|
1056
|
+
--vdd-sidebar-btn-hover-bg: rgba(255, 255, 255, 0.05);
|
|
1057
|
+
--vdd-sidebar-card-hover-border: rgba(56, 189, 248, 0.25);
|
|
1058
|
+
--vdd-sidebar-card-hover-bg: rgba(255, 255, 255, 0.04);
|
|
1059
|
+
--vdd-sidebar-card-active-shadow: rgba(56, 189, 248, 0.08);
|
|
1060
|
+
--vdd-sidebar-drawer-header-bg: rgba(0, 0, 0, 0.12);
|
|
1061
|
+
--vdd-toolbar-btn-hover-bg: rgba(255, 255, 255, 0.06);
|
|
1062
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(56, 189, 248, 0.14);
|
|
1063
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(56, 189, 248, 0.08);
|
|
1064
|
+
--vdd-toolbar-separator-color: rgba(255, 255, 255, 0.09);
|
|
1065
|
+
/* Sidebar active-tab design tokens */
|
|
1066
|
+
--vdd-tab-btn-active-width: 100%;
|
|
1067
|
+
--vdd-tab-btn-active-radius: 0px;
|
|
1068
|
+
--vdd-tab-btn-active-shadow: none;
|
|
1069
|
+
--vdd-tab-btn-active-glow: none;
|
|
1070
|
+
--vdd-tab-accent-bar-width: 3px;
|
|
1071
|
+
/* Toolbar active-button design tokens */
|
|
1072
|
+
--vdd-toolbar-btn-active-shadow: none;
|
|
1073
|
+
--vdd-toolbar-btn-active-glow: none;
|
|
1074
|
+
--vdd-toolbar-accent-bar-width: 3px;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
[data-color-scheme="light"] {
|
|
1078
|
+
--vdd-bg-primary: #f8f9fa;
|
|
1079
|
+
--vdd-bg-workspace: #f1f5f9;
|
|
1080
|
+
--vdd-bg-panel: #ffffff;
|
|
1081
|
+
--vdd-bg-tab-bar: #e9ecef;
|
|
1082
|
+
--vdd-text-primary: #212529;
|
|
1083
|
+
--vdd-text-secondary: #6c757d;
|
|
1084
|
+
--vdd-border-color: rgba(0, 0, 0, 0.08);
|
|
1085
|
+
|
|
1086
|
+
--vdd-sidebar-bg: #f8f9fa;
|
|
1087
|
+
--vdd-sidebar-tabs-bg: #e9ecef;
|
|
1088
|
+
--vdd-sidebar-border: rgba(0, 0, 0, 0.08);
|
|
1089
|
+
--vdd-sidebar-card-bg: #ffffff;
|
|
1090
|
+
--vdd-sidebar-card-border: rgba(0, 0, 0, 0.08);
|
|
1091
|
+
--vdd-sidebar-card-active-bg: rgba(0, 102, 204, 0.05);
|
|
1092
|
+
--vdd-sidebar-card-active-border: rgba(0, 102, 204, 0.3);
|
|
1093
|
+
--vdd-sidebar-text-title: #212529;
|
|
1094
|
+
--vdd-sidebar-text-muted: #6c757d;
|
|
1095
|
+
--vdd-sidebar-badge-bg: #e9ecef;
|
|
1096
|
+
--vdd-sidebar-badge-text: #495057;
|
|
1097
|
+
--vdd-sidebar-btn-front-border: #0066cc;
|
|
1098
|
+
--vdd-sidebar-btn-front-text: #0066cc;
|
|
1099
|
+
--vdd-sidebar-btn-front-bg: transparent;
|
|
1100
|
+
--vdd-sidebar-btn-front-hover-bg: rgba(0, 102, 204, 0.08);
|
|
1101
|
+
--vdd-tab-icon-active: #0066cc;
|
|
1102
|
+
--vdd-tab-icon-inactive: #555c66;
|
|
1103
|
+
--vdd-tab-btn-active-bg: #f8f9fa; /* Seamless merge look */
|
|
1104
|
+
--vdd-sidebar-btn-hover-bg: rgba(0, 0, 0, 0.05);
|
|
1105
|
+
--vdd-sidebar-card-hover-border: rgba(0, 102, 204, 0.3);
|
|
1106
|
+
--vdd-sidebar-card-hover-bg: rgba(0, 0, 0, 0.03);
|
|
1107
|
+
--vdd-sidebar-card-active-shadow: rgba(0, 102, 204, 0.08);
|
|
1108
|
+
--vdd-sidebar-drawer-header-bg: rgba(0, 0, 0, 0.04);
|
|
1109
|
+
--vdd-toolbar-btn-hover-bg: rgba(0, 0, 0, 0.05);
|
|
1110
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(0, 102, 204, 0.1);
|
|
1111
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(0, 102, 204, 0.06);
|
|
1112
|
+
--vdd-toolbar-separator-color: rgba(0, 0, 0, 0.1);
|
|
1113
|
+
/* Light skin window overrides */
|
|
1114
|
+
--vdd-window-bg: rgba(243, 244, 246, var(--vdd-window-opacity, 0.9));
|
|
1115
|
+
--vdd-window-border: rgba(0, 0, 0, 0.08);
|
|
1116
|
+
--vdd-window-border-focused: rgba(0, 0, 0, 0.28);
|
|
1117
|
+
--vdd-window-header-bg: rgba(0, 0, 0, 0.04);
|
|
1118
|
+
--vdd-window-text: #212529;
|
|
1119
|
+
--vdd-window-shadow: 0 10px 30px rgba(0, 0, 0, 0.06);
|
|
1120
|
+
--vdd-window-shadow-focused: 0 16px 36px rgba(0, 0, 0, 0.12);
|
|
1121
|
+
/* Light skin modal overrides */
|
|
1122
|
+
--vdd-modal-curtain-bg: rgba(0, 0, 0, 0.5);
|
|
1123
|
+
--vdd-modal-bg: rgba(255, 255, 255, 0.97);
|
|
1124
|
+
--vdd-modal-border: rgba(0, 0, 0, 0.1);
|
|
1125
|
+
--vdd-modal-header-bg: rgba(0, 0, 0, 0.04);
|
|
1126
|
+
--vdd-modal-header-border: rgba(0, 0, 0, 0.08);
|
|
1127
|
+
--vdd-modal-close-hover-color: #212529;
|
|
1128
|
+
/* Light skin side panel overrides */
|
|
1129
|
+
--vdd-side-panel-bg: rgba(255, 255, 255, 0.97);
|
|
1130
|
+
--vdd-side-panel-border: rgba(0, 0, 0, 0.1);
|
|
1131
|
+
--vdd-side-panel-header-bg: rgba(0, 0, 0, 0.04);
|
|
1132
|
+
--vdd-side-panel-header-border: rgba(0, 0, 0, 0.08);
|
|
1133
|
+
--vdd-side-panel-close-hover-color: #212529;
|
|
1134
|
+
/* Light skin grid/docked panel overrides */
|
|
1135
|
+
--vdd-border-panel: rgba(0, 0, 0, 0.08);
|
|
1136
|
+
--vdd-bg-tab-inactive: #e9ecef;
|
|
1137
|
+
--vdd-text-tab-inactive: #495057;
|
|
1138
|
+
--vdd-text-tab-active: #212529;
|
|
1139
|
+
/* Light skin tab and control button hover colors */
|
|
1140
|
+
--vdd-bg-tab-hover: #dee2e6;
|
|
1141
|
+
--vdd-text-tab-hover: #212529;
|
|
1142
|
+
--vdd-close-btn-hover-bg: rgba(0, 0, 0, 0.08);
|
|
1143
|
+
--vdd-close-btn-hover-color: #212529;
|
|
1144
|
+
--vdd-close-btn-color: #6c757d;
|
|
1145
|
+
--vdd-close-btn-active-color: #212529;
|
|
1146
|
+
--vdd-tab-indicator-focused: #0066cc;
|
|
1147
|
+
--vdd-tab-indicator-unfocused: rgba(0, 0, 0, 0.25);
|
|
1148
|
+
--vdd-tab-bg-active-focused: var(--vdd-bg-panel);
|
|
1149
|
+
--vdd-tab-bg-active-unfocused: rgba(220, 224, 230, 0.65);
|
|
1150
|
+
--vdd-tab-text-active-focused: #212529;
|
|
1151
|
+
--vdd-tab-text-active-unfocused: #6c757d;
|
|
1152
|
+
--vdd-resizer-bg: rgba(0, 0, 0, 0.08);
|
|
1153
|
+
--vdd-custom-btn-bg: rgba(0, 0, 0, 0.03);
|
|
1154
|
+
--vdd-custom-btn-border: rgba(0, 0, 0, 0.08);
|
|
1155
|
+
--vdd-custom-btn-hover-bg: rgba(0, 0, 0, 0.08);
|
|
1156
|
+
--vdd-custom-btn-hover-color: #212529;
|
|
1157
|
+
/* Light skin taskbar theme variables */
|
|
1158
|
+
--vdd-taskbar-bg: rgba(248, 249, 250, 0.85);
|
|
1159
|
+
--vdd-taskbar-border: rgba(0, 0, 0, 0.08);
|
|
1160
|
+
--vdd-taskbar-nav-color: rgba(0, 0, 0, 0.5);
|
|
1161
|
+
--vdd-taskbar-item-bg: rgba(255, 255, 255, 0.65);
|
|
1162
|
+
--vdd-taskbar-item-hover-bg: rgba(255, 255, 255, 0.85);
|
|
1163
|
+
--vdd-taskbar-item-border: rgba(0, 0, 0, 0.08);
|
|
1164
|
+
--vdd-taskbar-item-text: #0066cc;
|
|
1165
|
+
/* Light skin scrollbar theme variables */
|
|
1166
|
+
--vdd-scrollbar-thumb: rgba(0, 0, 0, 0.15);
|
|
1167
|
+
--vdd-scrollbar-thumb-hover: rgba(0, 0, 0, 0.25);
|
|
1168
|
+
--vdd-scrollbar-track: rgba(0, 0, 0, 0.02);
|
|
1169
|
+
/* Light skin mockup panel inner theme variables */
|
|
1170
|
+
--vdd-panel-card-bg: rgba(0, 0, 0, 0.03);
|
|
1171
|
+
--vdd-panel-card-border: rgba(0, 0, 0, 0.08);
|
|
1172
|
+
--vdd-panel-text: #212529;
|
|
1173
|
+
--vdd-panel-title-color: #0066cc;
|
|
1174
|
+
/* ── Panel Overlay — Toolbar (light) ── */
|
|
1175
|
+
--vdd-panel-toolbar-fg: rgba(0, 0, 0, 0.55);
|
|
1176
|
+
--vdd-panel-toolbar-fg-hover: rgba(0, 0, 0, 0.85);
|
|
1177
|
+
--vdd-panel-toolbar-btn-hover-bg: rgba(0, 0, 0, 0.08);
|
|
1178
|
+
--vdd-panel-toolbar-separator-color: rgba(0, 0, 0, 0.1);
|
|
1179
|
+
/* ── Panel Overlay — Floating Window (light) ── */
|
|
1180
|
+
--vdd-panel-float-bg: rgba(255, 255, 255, 0.96);
|
|
1181
|
+
--vdd-panel-float-border: rgba(0, 0, 0, 0.1);
|
|
1182
|
+
--vdd-panel-float-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
|
|
1183
|
+
--vdd-panel-float-shadow-active: 0 8px 28px rgba(0, 0, 0, 0.2);
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
/* ==========================================================================
|
|
1187
|
+
MULTI-THEME PRESETS (SKINS) DEFINITIONS
|
|
1188
|
+
========================================================================== */
|
|
1189
|
+
|
|
1190
|
+
/* --------------------------------------------------------------------------
|
|
1191
|
+
SKIN 1: VS Code (Default Variables matching :root)
|
|
1192
|
+
-------------------------------------------------------------------------- */
|
|
1193
|
+
[data-workspace-skin="vscode"] {
|
|
1194
|
+
/* Inherits everything from :root */
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
/* --------------------------------------------------------------------------
|
|
1198
|
+
SKIN 2: macOS / Glassmorphic Preset
|
|
1199
|
+
-------------------------------------------------------------------------- */
|
|
1200
|
+
[data-workspace-skin="macos"] {
|
|
1201
|
+
--vdd-bg-workspace: #1a1a24;
|
|
1202
|
+
--vdd-bg-panel: rgba(30, 30, 40, 0.45);
|
|
1203
|
+
--vdd-bg-tab-bar: rgba(18, 18, 24, 0.3);
|
|
1204
|
+
--vdd-window-bg: rgba(25, 25, 35, var(--vdd-window-opacity, 0.7));
|
|
1205
|
+
--vdd-window-border: rgba(255, 255, 255, 0.1);
|
|
1206
|
+
--vdd-window-header-bg: rgba(0, 0, 0, 0.15);
|
|
1207
|
+
--vdd-accent-color: #38bdf8;
|
|
1208
|
+
--vdd-accent-glow: rgba(56, 189, 248, 0.25);
|
|
1209
|
+
--vdd-border-panel: rgba(255, 255, 255, 0.08);
|
|
1210
|
+
--vdd-bg-tab-inactive: transparent;
|
|
1211
|
+
--vdd-text-tab-inactive: #94a3b8;
|
|
1212
|
+
--vdd-text-tab-active: #ffffff;
|
|
1213
|
+
--vdd-window-shadow: 0 16px 40px rgba(0, 0, 0, 0.4);
|
|
1214
|
+
--vdd-window-shadow-focused: 0 24px 50px rgba(56, 189, 248, 0.15);
|
|
1215
|
+
--vdd-panel-card-bg: rgba(255, 255, 255, 0.03);
|
|
1216
|
+
--vdd-panel-card-border: rgba(255, 255, 255, 0.08);
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
[data-workspace-skin="macos"][data-color-scheme="light"] {
|
|
1220
|
+
--vdd-bg-primary: #f3f4f6;
|
|
1221
|
+
--vdd-bg-workspace: #e5e7eb;
|
|
1222
|
+
--vdd-bg-panel: rgba(255, 255, 255, 0.7);
|
|
1223
|
+
--vdd-bg-tab-bar: rgba(229, 231, 235, 0.5);
|
|
1224
|
+
--vdd-window-bg: rgba(255, 255, 255, var(--vdd-window-opacity, 0.85));
|
|
1225
|
+
--vdd-window-border: rgba(0, 0, 0, 0.12);
|
|
1226
|
+
--vdd-window-header-bg: rgba(243, 244, 246, 0.5);
|
|
1227
|
+
--vdd-accent-color: #0066cc;
|
|
1228
|
+
--vdd-accent-glow: rgba(0, 102, 204, 0.15);
|
|
1229
|
+
--vdd-border-panel: rgba(0, 0, 0, 0.1);
|
|
1230
|
+
--vdd-bg-tab-inactive: transparent;
|
|
1231
|
+
--vdd-text-tab-inactive: #4b5563;
|
|
1232
|
+
--vdd-text-tab-active: #111827;
|
|
1233
|
+
--vdd-window-text: #111827;
|
|
1234
|
+
--vdd-window-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
|
|
1235
|
+
--vdd-window-shadow-focused: 0 16px 36px rgba(0, 102, 204, 0.18);
|
|
1236
|
+
--vdd-panel-card-bg: rgba(0, 0, 0, 0.04);
|
|
1237
|
+
--vdd-panel-card-border: rgba(0, 0, 0, 0.08);
|
|
1238
|
+
--vdd-panel-text: #111827;
|
|
1239
|
+
--vdd-panel-title-color: #0066cc;
|
|
1240
|
+
--vdd-close-btn-color: #4b5563;
|
|
1241
|
+
--vdd-close-btn-active-color: #111827;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
/* macOS structural adjustments */
|
|
1245
|
+
[data-workspace-skin="macos"] .vdd-floating-window {
|
|
1246
|
+
border-radius: 12px;
|
|
1247
|
+
backdrop-filter: blur(20px) saturate(180%);
|
|
1248
|
+
-webkit-backdrop-filter: blur(20px) saturate(180%);
|
|
1249
|
+
border-color: var(--vdd-window-border);
|
|
1250
|
+
}
|
|
1251
|
+
[data-workspace-skin="macos"] .vdd-floating-window-titlebar {
|
|
1252
|
+
border-top-left-radius: 12px;
|
|
1253
|
+
border-top-right-radius: 12px;
|
|
1254
|
+
}
|
|
1255
|
+
[data-workspace-skin="macos"] .vdd-workspace-panel {
|
|
1256
|
+
border-radius: 8px;
|
|
1257
|
+
backdrop-filter: blur(12px) saturate(180%);
|
|
1258
|
+
-webkit-backdrop-filter: blur(12px) saturate(180%);
|
|
1259
|
+
}
|
|
1260
|
+
[data-workspace-skin="macos"] .vdd-workspace-tab {
|
|
1261
|
+
border-radius: 6px !important;
|
|
1262
|
+
margin: 4px 4px 4px 4px !important;
|
|
1263
|
+
height: 28px !important;
|
|
1264
|
+
border: 1px solid var(--vdd-border-panel) !important;
|
|
1265
|
+
}
|
|
1266
|
+
[data-workspace-skin="macos"] .vdd-workspace-tab.vdd-active {
|
|
1267
|
+
background-color: var(--vdd-bg-workspace) !important;
|
|
1268
|
+
}
|
|
1269
|
+
[data-workspace-skin="macos"] .vdd-workspace-tab.vdd-active::before {
|
|
1270
|
+
display: none !important; /* Hide VS Code top line */
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
/* macOS Circle dots controls styling */
|
|
1274
|
+
[data-workspace-skin="macos"] .vdd-custom-tab-btn {
|
|
1275
|
+
border-radius: 50% !important;
|
|
1276
|
+
width: 12px !important;
|
|
1277
|
+
height: 12px !important;
|
|
1278
|
+
background: var(--vdd-custom-btn-bg) !important;
|
|
1279
|
+
border: none !important;
|
|
1280
|
+
color: transparent !important;
|
|
1281
|
+
font-size: 0 !important;
|
|
1282
|
+
overflow: hidden;
|
|
1283
|
+
margin: 0 2px;
|
|
1284
|
+
}
|
|
1285
|
+
[data-workspace-skin="macos"] .vdd-floating-window-titlebar {
|
|
1286
|
+
flex-direction: row-reverse !important;
|
|
1287
|
+
position: relative !important;
|
|
1288
|
+
}
|
|
1289
|
+
[data-workspace-skin="macos"] .vdd-floating-window-titlebar .vdd-floating-window-title {
|
|
1290
|
+
pointer-events: none !important;
|
|
1291
|
+
margin: 0 !important;
|
|
1292
|
+
margin-inline-start: 0.5rem !important;
|
|
1293
|
+
flex: 1 !important;
|
|
1294
|
+
min-width: 0 !important;
|
|
1295
|
+
justify-content: flex-end !important;
|
|
1296
|
+
}
|
|
1297
|
+
[data-workspace-skin="macos"] .vdd-floating-window-titlebar .vdd-floating-window-title > * {
|
|
1298
|
+
pointer-events: auto;
|
|
1299
|
+
}
|
|
1300
|
+
[data-workspace-skin="macos"] .vdd-floating-window-titlebar .vdd-titlebar-actions {
|
|
1301
|
+
flex-direction: row-reverse !important;
|
|
1302
|
+
}
|
|
1303
|
+
[data-workspace-skin="macos"] .vdd-custom-tab-btn svg {
|
|
1304
|
+
display: none !important;
|
|
1305
|
+
}
|
|
1306
|
+
[data-workspace-skin="macos"] .vdd-btn-close-tab {
|
|
1307
|
+
background-color: #ff5f56 !important; /* Red (Close) */
|
|
1308
|
+
}
|
|
1309
|
+
[data-workspace-skin="macos"] .vdd-btn-minimize-tab {
|
|
1310
|
+
background-color: #ffbd2e !important; /* Yellow (Minimize) */
|
|
1311
|
+
}
|
|
1312
|
+
[data-workspace-skin="macos"] .vdd-btn-maximize-tab {
|
|
1313
|
+
background-color: #27c93f !important; /* Green (Maximize) */
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
/* Panel Icon Styling and Alignment */
|
|
1317
|
+
.vdd-workspace-tab-icon,
|
|
1318
|
+
.vdd-window-title-icon {
|
|
1319
|
+
display: inline-flex;
|
|
1320
|
+
align-items: center;
|
|
1321
|
+
justify-content: center;
|
|
1322
|
+
flex-shrink: 0;
|
|
1323
|
+
vertical-align: middle;
|
|
1324
|
+
line-height: 1;
|
|
1325
|
+
margin-inline-end: 4px !important; /* Forces the gap between the icon and the text title */
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
.vdd-workspace-tab-icon svg,
|
|
1329
|
+
.vdd-workspace-tab-icon img,
|
|
1330
|
+
.vdd-window-title-icon svg,
|
|
1331
|
+
.vdd-window-title-icon img {
|
|
1332
|
+
width: 14px !important;
|
|
1333
|
+
height: 14px !important;
|
|
1334
|
+
max-width: 14px !important;
|
|
1335
|
+
max-height: 14px !important;
|
|
1336
|
+
object-fit: contain;
|
|
1337
|
+
display: block;
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
[data-workspace-skin="macos"] .vdd-custom-tab-btn:hover {
|
|
1341
|
+
filter: brightness(0.85);
|
|
1342
|
+
transform: none !important;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
/* --------------------------------------------------------------------------
|
|
1346
|
+
SKIN 3: Chrome / Browser-Style Preset
|
|
1347
|
+
-------------------------------------------------------------------------- */
|
|
1348
|
+
[data-workspace-skin="chrome"] {
|
|
1349
|
+
--vdd-bg-workspace: #202124;
|
|
1350
|
+
--vdd-bg-panel: #292a2d;
|
|
1351
|
+
--vdd-bg-tab-bar: #202124;
|
|
1352
|
+
--vdd-window-bg: rgba(41, 42, 45, var(--vdd-window-opacity, 1.0));
|
|
1353
|
+
--vdd-window-border: #3c4043;
|
|
1354
|
+
--vdd-window-header-bg: #202124;
|
|
1355
|
+
--vdd-accent-color: #8ab4f8;
|
|
1356
|
+
--vdd-accent-glow: rgba(138, 180, 248, 0.15);
|
|
1357
|
+
--vdd-border-panel: #3c4043;
|
|
1358
|
+
--vdd-bg-tab-inactive: #202124;
|
|
1359
|
+
--vdd-text-tab-inactive: #9aa0a6;
|
|
1360
|
+
--vdd-text-tab-active: #ffffff;
|
|
1361
|
+
--vdd-panel-card-bg: #202124;
|
|
1362
|
+
--vdd-panel-card-border: #3c4043;
|
|
1363
|
+
--vdd-window-text: #ffffff;
|
|
1364
|
+
--vdd-panel-text: #e8eaed;
|
|
1365
|
+
--vdd-tab-icon-active: #8ab4f8;
|
|
1366
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(138, 180, 248, 0.14);
|
|
1367
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(138, 180, 248, 0.08);
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
[data-workspace-skin="chrome"][data-color-scheme="light"] {
|
|
1371
|
+
--vdd-bg-workspace: #dee1e6;
|
|
1372
|
+
--vdd-bg-panel: #ffffff;
|
|
1373
|
+
--vdd-bg-tab-bar: #dee1e6;
|
|
1374
|
+
--vdd-window-bg: rgba(255, 255, 255, var(--vdd-window-opacity, 1.0));
|
|
1375
|
+
--vdd-window-border: #cbd5e1;
|
|
1376
|
+
--vdd-window-header-bg: #dee1e6;
|
|
1377
|
+
--vdd-accent-color: #1a73e8;
|
|
1378
|
+
--vdd-accent-glow: rgba(26, 115, 232, 0.15);
|
|
1379
|
+
--vdd-border-panel: #dadce0;
|
|
1380
|
+
--vdd-bg-tab-inactive: #dee1e6;
|
|
1381
|
+
--vdd-text-tab-inactive: #474747;
|
|
1382
|
+
--vdd-text-tab-active: #1f1f1f;
|
|
1383
|
+
--vdd-panel-card-bg: #f1f3f4;
|
|
1384
|
+
--vdd-panel-card-border: #dadce0;
|
|
1385
|
+
--vdd-window-text: #1f1f1f;
|
|
1386
|
+
--vdd-panel-text: #1f1f1f;
|
|
1387
|
+
--vdd-panel-title-color: #1a73e8;
|
|
1388
|
+
--vdd-close-btn-color: #474747;
|
|
1389
|
+
--vdd-close-btn-active-color: #1f1f1f;
|
|
1390
|
+
--vdd-tab-icon-active: #1a73e8;
|
|
1391
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(26, 115, 232, 0.12);
|
|
1392
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(26, 115, 232, 0.07);
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
/* Chrome tab angled geometry shapes */
|
|
1396
|
+
[data-workspace-skin="chrome"] .vdd-workspace-tab {
|
|
1397
|
+
clip-path: polygon(10px 0%, calc(100% - 10px) 0%, 100% 100%, 0% 100%);
|
|
1398
|
+
padding: 0 18px !important;
|
|
1399
|
+
margin-right: -4px !important;
|
|
1400
|
+
border-right: none !important;
|
|
1401
|
+
}
|
|
1402
|
+
[data-workspace-skin="chrome"] .vdd-workspace-tab.vdd-active {
|
|
1403
|
+
z-index: 5;
|
|
1404
|
+
}
|
|
1405
|
+
[data-workspace-skin="chrome"] .vdd-workspace-tab.vdd-active::before {
|
|
1406
|
+
display: none !important;
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
/* --------------------------------------------------------------------------
|
|
1410
|
+
SKIN 4: Fluent Slate Preset
|
|
1411
|
+
-------------------------------------------------------------------------- */
|
|
1412
|
+
[data-workspace-skin="slate"] {
|
|
1413
|
+
--vdd-bg-workspace: #0f172a;
|
|
1414
|
+
--vdd-bg-panel: #1e293b;
|
|
1415
|
+
--vdd-bg-tab-bar: #0f172a;
|
|
1416
|
+
--vdd-window-bg: rgba(30, 41, 59, var(--vdd-window-opacity, 1.0));
|
|
1417
|
+
--vdd-window-border: #334155;
|
|
1418
|
+
--vdd-window-header-bg: #1e293b;
|
|
1419
|
+
--vdd-accent-color: #38bdf8;
|
|
1420
|
+
--vdd-accent-glow: rgba(56, 189, 248, 0.15);
|
|
1421
|
+
--vdd-border-panel: #334155;
|
|
1422
|
+
--vdd-bg-tab-inactive: #1e293b;
|
|
1423
|
+
--vdd-text-tab-inactive: #64748b;
|
|
1424
|
+
--vdd-text-tab-active: #f8fafc;
|
|
1425
|
+
--vdd-panel-card-bg: #0f172a;
|
|
1426
|
+
--vdd-panel-card-border: #334155;
|
|
1427
|
+
--vdd-window-text: #f8fafc;
|
|
1428
|
+
--vdd-panel-text: #f8fafc;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
[data-workspace-skin="slate"][data-color-scheme="light"] {
|
|
1432
|
+
--vdd-bg-workspace: #f1f5f9;
|
|
1433
|
+
--vdd-bg-panel: #ffffff;
|
|
1434
|
+
--vdd-bg-tab-bar: #f1f5f9;
|
|
1435
|
+
--vdd-window-bg: rgba(255, 255, 255, var(--vdd-window-opacity, 1.0));
|
|
1436
|
+
--vdd-window-border: #cbd5e1;
|
|
1437
|
+
--vdd-window-header-bg: #f8fafc;
|
|
1438
|
+
--vdd-accent-color: #0078d4;
|
|
1439
|
+
--vdd-accent-glow: rgba(0, 120, 212, 0.15);
|
|
1440
|
+
--vdd-border-panel: #e2e8f0;
|
|
1441
|
+
--vdd-bg-tab-inactive: #f8fafc;
|
|
1442
|
+
--vdd-text-tab-inactive: #475569;
|
|
1443
|
+
--vdd-text-tab-active: #0f172a;
|
|
1444
|
+
--vdd-panel-card-bg: #f8fafc;
|
|
1445
|
+
--vdd-panel-card-border: #cbd5e1;
|
|
1446
|
+
--vdd-window-text: #0f172a;
|
|
1447
|
+
--vdd-panel-text: #0f172a;
|
|
1448
|
+
--vdd-panel-title-color: #0078d4;
|
|
1449
|
+
--vdd-close-btn-color: #475569;
|
|
1450
|
+
--vdd-close-btn-active-color: #0f172a;
|
|
1451
|
+
--vdd-tab-icon-active: #0078d4;
|
|
1452
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(0, 120, 212, 0.10);
|
|
1453
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(0, 120, 212, 0.06);
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
[data-workspace-skin="slate"] .vdd-workspace-tab.vdd-active::before {
|
|
1457
|
+
top: auto !important;
|
|
1458
|
+
bottom: 0 !important;
|
|
1459
|
+
height: 3px !important;
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
/* --------------------------------------------------------------------------
|
|
1463
|
+
SKIN 5: Nordic Frost Preset (Nord Theme)
|
|
1464
|
+
-------------------------------------------------------------------------- */
|
|
1465
|
+
[data-workspace-skin="nord"] {
|
|
1466
|
+
--vdd-bg-workspace: #2e3440;
|
|
1467
|
+
--vdd-bg-panel: #3b4252;
|
|
1468
|
+
--vdd-bg-tab-bar: #2e3440;
|
|
1469
|
+
--vdd-window-bg: rgba(59, 66, 82, var(--vdd-window-opacity, 1.0));
|
|
1470
|
+
--vdd-window-border: #434c5e;
|
|
1471
|
+
--vdd-window-header-bg: #2e3440;
|
|
1472
|
+
--vdd-accent-color: #88c0d0;
|
|
1473
|
+
--vdd-accent-glow: rgba(136, 192, 208, 0.2);
|
|
1474
|
+
--vdd-border-panel: #434c5e;
|
|
1475
|
+
--vdd-bg-tab-inactive: #2e3440;
|
|
1476
|
+
--vdd-text-tab-inactive: #d8dee9;
|
|
1477
|
+
--vdd-text-tab-active: #eceff4;
|
|
1478
|
+
--vdd-panel-card-bg: #2e3440;
|
|
1479
|
+
--vdd-panel-card-border: #4c566a;
|
|
1480
|
+
--vdd-close-btn-color: #d8dee9;
|
|
1481
|
+
--vdd-close-btn-active-color: #88c0d0;
|
|
1482
|
+
--vdd-scrollbar-thumb: rgba(136, 192, 208, 0.25);
|
|
1483
|
+
--vdd-scrollbar-thumb-hover: rgba(136, 192, 208, 0.4);
|
|
1484
|
+
--vdd-window-text: #eceff4;
|
|
1485
|
+
--vdd-panel-text: #eceff4;
|
|
1486
|
+
--vdd-tab-icon-active: #88c0d0;
|
|
1487
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(136, 192, 208, 0.14);
|
|
1488
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(136, 192, 208, 0.08);
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1491
|
+
[data-workspace-skin="nord"][data-color-scheme="light"] {
|
|
1492
|
+
--vdd-bg-workspace: #e5e9f0;
|
|
1493
|
+
--vdd-bg-panel: #eceff4;
|
|
1494
|
+
--vdd-bg-tab-bar: #e5e9f0;
|
|
1495
|
+
--vdd-window-bg: rgba(236, 239, 244, var(--vdd-window-opacity, 1.0));
|
|
1496
|
+
--vdd-window-border: #d8dee9;
|
|
1497
|
+
--vdd-window-header-bg: #e5e9f0;
|
|
1498
|
+
--vdd-accent-color: #5e81ac;
|
|
1499
|
+
--vdd-accent-glow: rgba(94, 129, 172, 0.15);
|
|
1500
|
+
--vdd-border-panel: #d8dee9;
|
|
1501
|
+
--vdd-bg-tab-inactive: #e5e9f0;
|
|
1502
|
+
--vdd-text-tab-inactive: #4c566a;
|
|
1503
|
+
--vdd-text-tab-active: #2e3440;
|
|
1504
|
+
--vdd-panel-card-bg: #e5e9f0;
|
|
1505
|
+
--vdd-panel-card-border: #d8dee9;
|
|
1506
|
+
--vdd-close-btn-color: #4c566a;
|
|
1507
|
+
--vdd-close-btn-active-color: #5e81ac;
|
|
1508
|
+
--vdd-scrollbar-thumb: rgba(94, 129, 172, 0.2);
|
|
1509
|
+
--vdd-scrollbar-thumb-hover: rgba(94, 129, 172, 0.35);
|
|
1510
|
+
--vdd-window-text: #2e3440;
|
|
1511
|
+
--vdd-panel-text: #2e3440;
|
|
1512
|
+
--vdd-panel-title-color: #5e81ac;
|
|
1513
|
+
--vdd-tab-icon-active: #5e81ac;
|
|
1514
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(94, 129, 172, 0.12);
|
|
1515
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(94, 129, 172, 0.07);
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
/* --------------------------------------------------------------------------
|
|
1519
|
+
SKIN 6: Midnight Obsidian Preset (Vercel Style)
|
|
1520
|
+
-------------------------------------------------------------------------- */
|
|
1521
|
+
[data-workspace-skin="obsidian"] {
|
|
1522
|
+
--vdd-bg-workspace: #000000;
|
|
1523
|
+
--vdd-bg-panel: #0a0a0a;
|
|
1524
|
+
--vdd-bg-tab-bar: #000000;
|
|
1525
|
+
--vdd-window-bg: rgba(10, 10, 10, var(--vdd-window-opacity, 1.0));
|
|
1526
|
+
--vdd-window-border: #1a1a1a;
|
|
1527
|
+
--vdd-window-border-focused: #333333;
|
|
1528
|
+
--vdd-window-header-bg: #000000;
|
|
1529
|
+
--vdd-accent-color: #ffffff;
|
|
1530
|
+
--vdd-accent-glow: rgba(255, 255, 255, 0.08);
|
|
1531
|
+
--vdd-border-panel: #1a1a1a;
|
|
1532
|
+
--vdd-bg-tab-inactive: #000000;
|
|
1533
|
+
--vdd-text-tab-inactive: #737373;
|
|
1534
|
+
--vdd-text-tab-active: #ffffff;
|
|
1535
|
+
--vdd-panel-card-bg: #030303;
|
|
1536
|
+
--vdd-panel-card-border: #1a1a1a;
|
|
1537
|
+
--vdd-close-btn-color: #737373;
|
|
1538
|
+
--vdd-close-btn-active-color: #ffffff;
|
|
1539
|
+
--vdd-scrollbar-thumb: rgba(255, 255, 255, 0.15);
|
|
1540
|
+
--vdd-scrollbar-thumb-hover: rgba(255, 255, 255, 0.35);
|
|
1541
|
+
--vdd-window-text: #ffffff;
|
|
1542
|
+
--vdd-panel-text: #ffffff;
|
|
1543
|
+
--vdd-tab-icon-active: #ffffff;
|
|
1544
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(255, 255, 255, 0.10);
|
|
1545
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(255, 255, 255, 0.06);
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
[data-workspace-skin="obsidian"][data-color-scheme="light"] {
|
|
1549
|
+
--vdd-bg-workspace: #ffffff;
|
|
1550
|
+
--vdd-bg-panel: #fafafa;
|
|
1551
|
+
--vdd-bg-tab-bar: #ffffff;
|
|
1552
|
+
--vdd-window-bg: rgba(250, 250, 250, var(--vdd-window-opacity, 1.0));
|
|
1553
|
+
--vdd-window-border: #e5e5e5;
|
|
1554
|
+
--vdd-window-border-focused: #a3a3a3;
|
|
1555
|
+
--vdd-window-header-bg: #ffffff;
|
|
1556
|
+
--vdd-accent-color: #000000;
|
|
1557
|
+
--vdd-accent-glow: rgba(0, 0, 0, 0.05);
|
|
1558
|
+
--vdd-border-panel: #eaeaea;
|
|
1559
|
+
--vdd-bg-tab-inactive: #ffffff;
|
|
1560
|
+
--vdd-text-tab-inactive: #737373;
|
|
1561
|
+
--vdd-text-tab-active: #000000;
|
|
1562
|
+
--vdd-panel-card-bg: #ffffff;
|
|
1563
|
+
--vdd-panel-card-border: #e5e5e5;
|
|
1564
|
+
--vdd-close-btn-color: #737373;
|
|
1565
|
+
--vdd-close-btn-active-color: #000000;
|
|
1566
|
+
--vdd-scrollbar-thumb: rgba(0, 0, 0, 0.1);
|
|
1567
|
+
--vdd-scrollbar-thumb-hover: rgba(0, 0, 0, 0.25);
|
|
1568
|
+
--vdd-window-text: #000000;
|
|
1569
|
+
--vdd-panel-text: #000000;
|
|
1570
|
+
--vdd-panel-title-color: #000000;
|
|
1571
|
+
--vdd-tab-icon-active: #000000;
|
|
1572
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(0, 0, 0, 0.10);
|
|
1573
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(0, 0, 0, 0.06);
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
/* Obsidian custom borderless panel elevations */
|
|
1577
|
+
[data-workspace-skin="obsidian"] .vdd-floating-window {
|
|
1578
|
+
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.6), 0 0 1px rgba(255, 255, 255, 0.2) !important;
|
|
1579
|
+
border-radius: 6px;
|
|
1580
|
+
}
|
|
1581
|
+
[data-workspace-skin="obsidian"] .vdd-floating-window.vdd-window-focused {
|
|
1582
|
+
box-shadow: 0 24px 50px rgba(255, 255, 255, 0.06), 0 0 1px rgba(255, 255, 255, 0.4) !important;
|
|
1583
|
+
}
|
|
1584
|
+
[data-workspace-skin="obsidian"][data-color-scheme="light"] .vdd-floating-window {
|
|
1585
|
+
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08), 0 0 1px rgba(0, 0, 0, 0.1) !important;
|
|
1586
|
+
}
|
|
1587
|
+
[data-workspace-skin="obsidian"][data-color-scheme="light"] .vdd-floating-window.vdd-window-focused {
|
|
1588
|
+
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.14), 0 0 1px rgba(0, 0, 0, 0.2) !important;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
/* --------------------------------------------------------------------------
|
|
1592
|
+
SKIN 7: Tokyo Night Preset
|
|
1593
|
+
-------------------------------------------------------------------------- */
|
|
1594
|
+
[data-workspace-skin="tokyo"] {
|
|
1595
|
+
--vdd-bg-workspace: #1a1b26;
|
|
1596
|
+
--vdd-bg-panel: #24283c;
|
|
1597
|
+
--vdd-bg-tab-bar: #1f2335;
|
|
1598
|
+
--vdd-window-bg: rgba(36, 40, 60, var(--vdd-window-opacity, 1.0));
|
|
1599
|
+
--vdd-window-border: #383e5a;
|
|
1600
|
+
--vdd-window-border-focused: #7aa2f7;
|
|
1601
|
+
--vdd-window-header-bg: #1f2335;
|
|
1602
|
+
--vdd-accent-color: #bb9af7;
|
|
1603
|
+
--vdd-accent-glow: rgba(187, 154, 247, 0.25);
|
|
1604
|
+
--vdd-border-panel: #383e5a;
|
|
1605
|
+
--vdd-bg-tab-inactive: #1f2335;
|
|
1606
|
+
--vdd-text-tab-inactive: #787c99;
|
|
1607
|
+
--vdd-text-tab-active: #c0caf5;
|
|
1608
|
+
--vdd-panel-card-bg: #1a1b26;
|
|
1609
|
+
--vdd-panel-card-border: #383e5a;
|
|
1610
|
+
--vdd-close-btn-color: #787c99;
|
|
1611
|
+
--vdd-close-btn-active-color: #7aa2f7;
|
|
1612
|
+
--vdd-scrollbar-thumb: rgba(122, 162, 247, 0.25);
|
|
1613
|
+
--vdd-scrollbar-thumb-hover: rgba(187, 154, 247, 0.4);
|
|
1614
|
+
--vdd-window-text: #c0caf5;
|
|
1615
|
+
--vdd-panel-text: #c0caf5;
|
|
1616
|
+
--vdd-tab-icon-active: #7aa2f7;
|
|
1617
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(122, 162, 247, 0.14);
|
|
1618
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(122, 162, 247, 0.08);
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
[data-workspace-skin="tokyo"][data-color-scheme="light"] {
|
|
1622
|
+
--vdd-bg-workspace: #e1e2e7;
|
|
1623
|
+
--vdd-bg-panel: #f2f4f8;
|
|
1624
|
+
--vdd-bg-tab-bar: #d5d6db;
|
|
1625
|
+
--vdd-window-bg: rgba(242, 244, 248, var(--vdd-window-opacity, 1.0));
|
|
1626
|
+
--vdd-window-border: #b4b5b9;
|
|
1627
|
+
--vdd-window-border-focused: #385af6;
|
|
1628
|
+
--vdd-window-header-bg: #d5d6db;
|
|
1629
|
+
--vdd-accent-color: #9854f1;
|
|
1630
|
+
--vdd-accent-glow: rgba(152, 84, 241, 0.15);
|
|
1631
|
+
--vdd-border-panel: #b4b5b9;
|
|
1632
|
+
--vdd-bg-tab-inactive: #d5d6db;
|
|
1633
|
+
--vdd-text-tab-inactive: #565a6e;
|
|
1634
|
+
--vdd-text-tab-active: #383e56;
|
|
1635
|
+
--vdd-panel-card-bg: #e1e2e7;
|
|
1636
|
+
--vdd-panel-card-border: #b4b5b9;
|
|
1637
|
+
--vdd-close-btn-color: #565a6e;
|
|
1638
|
+
--vdd-close-btn-active-color: #385af6;
|
|
1639
|
+
--vdd-scrollbar-thumb: rgba(56, 90, 246, 0.2);
|
|
1640
|
+
--vdd-scrollbar-thumb-hover: rgba(152, 84, 241, 0.35);
|
|
1641
|
+
--vdd-window-text: #383e56;
|
|
1642
|
+
--vdd-panel-text: #383e56;
|
|
1643
|
+
--vdd-panel-title-color: #9854f1;
|
|
1644
|
+
--vdd-tab-icon-active: #385af6;
|
|
1645
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(56, 90, 246, 0.12);
|
|
1646
|
+
--vdd-toolbar-btn-toggle-active-bg: rgba(56, 90, 246, 0.07);
|
|
1647
|
+
}
|
|
1648
|
+
|
|
1649
|
+
/* ==========================================================================
|
|
1650
|
+
PER-SKIN ACTIVE TAB & TOOLBAR DESIGN LANGUAGE
|
|
1651
|
+
========================================================================== */
|
|
1652
|
+
|
|
1653
|
+
/* --------------------------------------------------------------------------
|
|
1654
|
+
vscode — Accent Bar (2 px bar, fully transparent fill — faithful to VS Code)
|
|
1655
|
+
-------------------------------------------------------------------------- */
|
|
1656
|
+
[data-workspace-skin="vscode"] {
|
|
1657
|
+
--vdd-tab-btn-active-bg: transparent;
|
|
1658
|
+
--vdd-tab-accent-bar-width: 2px;
|
|
1659
|
+
--vdd-toolbar-btn-radio-active-bg: transparent;
|
|
1660
|
+
--vdd-toolbar-accent-bar-width: 2px;
|
|
1661
|
+
}
|
|
1662
|
+
[data-workspace-skin="vscode"] .vdd-sidebar-tab-btn.vdd-active {
|
|
1663
|
+
border-top: 1px solid transparent !important;
|
|
1664
|
+
border-bottom: 1px solid transparent !important;
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
/* --------------------------------------------------------------------------
|
|
1668
|
+
chrome — Tab Shape (sidebar bridge, toolbar accent-tinted)
|
|
1669
|
+
-------------------------------------------------------------------------- */
|
|
1670
|
+
[data-workspace-skin="chrome"] {
|
|
1671
|
+
--vdd-tab-btn-active-bg: var(--vdd-sidebar-bg);
|
|
1672
|
+
--vdd-tab-accent-bar-width: 0px;
|
|
1673
|
+
--vdd-toolbar-accent-bar-width: 2px;
|
|
1674
|
+
}
|
|
1675
|
+
[data-workspace-skin="chrome"] .vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
1676
|
+
border-radius: 0 10px 10px 0 !important;
|
|
1677
|
+
border-left: none !important;
|
|
1678
|
+
}
|
|
1679
|
+
[data-workspace-skin="chrome"] .vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
1680
|
+
border-radius: 10px 0 0 10px !important;
|
|
1681
|
+
border-right: none !important;
|
|
1682
|
+
border-top: 1px solid var(--vdd-sidebar-border) !important;
|
|
1683
|
+
border-bottom: 1px solid var(--vdd-sidebar-border) !important;
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
/* --------------------------------------------------------------------------
|
|
1687
|
+
slate — Fluent Pill (floating capsule, accent-tinted)
|
|
1688
|
+
-------------------------------------------------------------------------- */
|
|
1689
|
+
[data-workspace-skin="slate"] {
|
|
1690
|
+
--vdd-tab-btn-active-bg: rgba(96, 165, 250, 0.14);
|
|
1691
|
+
--vdd-tab-btn-active-width: 36px;
|
|
1692
|
+
--vdd-tab-btn-active-radius: 8px;
|
|
1693
|
+
--vdd-tab-accent-bar-width: 0px;
|
|
1694
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(96, 165, 250, 0.14);
|
|
1695
|
+
--vdd-toolbar-accent-bar-width: 0px;
|
|
1696
|
+
}
|
|
1697
|
+
[data-workspace-skin="slate"] .vdd-sidebar-tab-btn.vdd-active {
|
|
1698
|
+
border-top: 1px solid transparent !important;
|
|
1699
|
+
border-bottom: 1px solid transparent !important;
|
|
1700
|
+
margin: 0 !important;
|
|
1701
|
+
}
|
|
1702
|
+
[data-workspace-skin="slate"] .vdd-toolbar-strip .vdd-toolbar-btn-radio.vdd-active,
|
|
1703
|
+
[data-workspace-skin="slate"] .vdd-toolbar-strip .vdd-toolbar-btn-group.vdd-active {
|
|
1704
|
+
border-radius: 8px !important;
|
|
1705
|
+
}
|
|
1706
|
+
[data-workspace-skin="slate"][data-color-scheme="light"] {
|
|
1707
|
+
--vdd-tab-btn-active-bg: rgba(0, 120, 212, 0.12);
|
|
1708
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(0, 120, 212, 0.12);
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
/* --------------------------------------------------------------------------
|
|
1712
|
+
nord — Nordic Line (zero fill, zero bar, 16×2 px accent line via ::after)
|
|
1713
|
+
-------------------------------------------------------------------------- */
|
|
1714
|
+
[data-workspace-skin="nord"] {
|
|
1715
|
+
--vdd-tab-btn-active-bg: transparent;
|
|
1716
|
+
--vdd-tab-btn-active-width: 44px;
|
|
1717
|
+
--vdd-tab-btn-active-radius: 6px;
|
|
1718
|
+
--vdd-tab-accent-bar-width: 0px;
|
|
1719
|
+
--vdd-toolbar-btn-radio-active-bg: transparent;
|
|
1720
|
+
--vdd-toolbar-accent-bar-width: 0px;
|
|
1721
|
+
}
|
|
1722
|
+
[data-workspace-skin="nord"] .vdd-sidebar-tab-btn.vdd-active {
|
|
1723
|
+
border-top: 1px solid transparent !important;
|
|
1724
|
+
border-bottom: 1px solid transparent !important;
|
|
1725
|
+
border-left: none !important;
|
|
1726
|
+
border-right: none !important;
|
|
1727
|
+
}
|
|
1728
|
+
[data-workspace-skin="nord"] .vdd-sidebar-tab-btn.vdd-active::after {
|
|
1729
|
+
content: '';
|
|
1730
|
+
position: absolute;
|
|
1731
|
+
bottom: 5px;
|
|
1732
|
+
left: 50%;
|
|
1733
|
+
transform: translateX(-50%);
|
|
1734
|
+
width: 16px;
|
|
1735
|
+
height: 2px;
|
|
1736
|
+
border-radius: 1px;
|
|
1737
|
+
background-color: var(--vdd-tab-icon-active);
|
|
1738
|
+
}
|
|
1739
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip .vdd-toolbar-btn-radio.vdd-active,
|
|
1740
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip .vdd-toolbar-btn-group.vdd-active {
|
|
1741
|
+
border-left: none !important;
|
|
1742
|
+
border-right: none !important;
|
|
1743
|
+
border-top: none !important;
|
|
1744
|
+
border-bottom: none !important;
|
|
1745
|
+
}
|
|
1746
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-radio.vdd-active::after,
|
|
1747
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-group.vdd-active::after,
|
|
1748
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-radio.vdd-active::after,
|
|
1749
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-group.vdd-active::after,
|
|
1750
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-radio.vdd-active::after,
|
|
1751
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-group.vdd-active::after {
|
|
1752
|
+
content: '';
|
|
1753
|
+
position: absolute;
|
|
1754
|
+
bottom: 4px;
|
|
1755
|
+
left: 50%;
|
|
1756
|
+
transform: translateX(-50%);
|
|
1757
|
+
width: 14px;
|
|
1758
|
+
height: 2px;
|
|
1759
|
+
border-radius: 1px;
|
|
1760
|
+
background-color: var(--vdd-tab-icon-active);
|
|
1761
|
+
}
|
|
1762
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-radio.vdd-active::after,
|
|
1763
|
+
[data-workspace-skin="nord"] .vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-group.vdd-active::after {
|
|
1764
|
+
content: '';
|
|
1765
|
+
position: absolute;
|
|
1766
|
+
top: 4px;
|
|
1767
|
+
left: 50%;
|
|
1768
|
+
transform: translateX(-50%);
|
|
1769
|
+
width: 14px;
|
|
1770
|
+
height: 2px;
|
|
1771
|
+
border-radius: 1px;
|
|
1772
|
+
background-color: var(--vdd-tab-icon-active);
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1775
|
+
/* --------------------------------------------------------------------------
|
|
1776
|
+
obsidian — Deep Glow (near-black fill, 2 px bar, inner glow, icon shadow)
|
|
1777
|
+
-------------------------------------------------------------------------- */
|
|
1778
|
+
[data-workspace-skin="obsidian"] {
|
|
1779
|
+
--vdd-tab-btn-active-bg: rgba(255, 255, 255, 0.03);
|
|
1780
|
+
--vdd-tab-btn-active-shadow: inset 0 0 12px rgba(255, 255, 255, 0.06);
|
|
1781
|
+
--vdd-tab-btn-active-glow: drop-shadow(0 0 5px rgba(255, 255, 255, 0.5));
|
|
1782
|
+
--vdd-tab-accent-bar-width: 2px;
|
|
1783
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(255, 255, 255, 0.03);
|
|
1784
|
+
--vdd-toolbar-btn-active-shadow: inset 0 0 12px rgba(255, 255, 255, 0.06);
|
|
1785
|
+
--vdd-toolbar-btn-active-glow: drop-shadow(0 0 5px rgba(255, 255, 255, 0.5));
|
|
1786
|
+
--vdd-toolbar-accent-bar-width: 2px;
|
|
1787
|
+
}
|
|
1788
|
+
[data-workspace-skin="obsidian"] .vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
1789
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset 3px 0 8px rgba(255, 255, 255, 0.08) !important;
|
|
1790
|
+
}
|
|
1791
|
+
[data-workspace-skin="obsidian"] .vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
1792
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset -3px 0 8px rgba(255, 255, 255, 0.08) !important;
|
|
1793
|
+
}
|
|
1794
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-radio.vdd-active,
|
|
1795
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-group.vdd-active {
|
|
1796
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset 3px 0 8px rgba(255, 255, 255, 0.08) !important;
|
|
1797
|
+
}
|
|
1798
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-radio.vdd-active,
|
|
1799
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-group.vdd-active {
|
|
1800
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset -3px 0 8px rgba(255, 255, 255, 0.08) !important;
|
|
1801
|
+
}
|
|
1802
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-radio.vdd-active,
|
|
1803
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-group.vdd-active {
|
|
1804
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset 0 -3px 8px rgba(255, 255, 255, 0.08) !important;
|
|
1805
|
+
}
|
|
1806
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-radio.vdd-active,
|
|
1807
|
+
[data-workspace-skin="obsidian"] .vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-group.vdd-active {
|
|
1808
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset 0 3px 8px rgba(255, 255, 255, 0.08) !important;
|
|
1809
|
+
}
|
|
1810
|
+
[data-workspace-skin="obsidian"][data-color-scheme="light"] {
|
|
1811
|
+
--vdd-tab-btn-active-shadow: inset 0 0 12px rgba(0, 0, 0, 0.06);
|
|
1812
|
+
--vdd-tab-btn-active-glow: drop-shadow(0 0 4px rgba(0, 0, 0, 0.4));
|
|
1813
|
+
--vdd-toolbar-btn-active-shadow: inset 0 0 12px rgba(0, 0, 0, 0.06);
|
|
1814
|
+
--vdd-toolbar-btn-active-glow: drop-shadow(0 0 4px rgba(0, 0, 0, 0.4));
|
|
1815
|
+
}
|
|
1816
|
+
|
|
1817
|
+
/* --------------------------------------------------------------------------
|
|
1818
|
+
tokyo — Neon Pulse (accent-blue tint, vivid neon glow)
|
|
1819
|
+
-------------------------------------------------------------------------- */
|
|
1820
|
+
[data-workspace-skin="tokyo"] {
|
|
1821
|
+
--vdd-tab-btn-active-bg: rgba(122, 162, 247, 0.10);
|
|
1822
|
+
--vdd-tab-btn-active-shadow: inset 0 0 16px rgba(122, 162, 247, 0.12);
|
|
1823
|
+
--vdd-tab-btn-active-glow: drop-shadow(0 0 6px rgba(122, 162, 247, 0.65));
|
|
1824
|
+
--vdd-tab-accent-bar-width: 2px;
|
|
1825
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(122, 162, 247, 0.10);
|
|
1826
|
+
--vdd-toolbar-btn-active-shadow: inset 0 0 16px rgba(122, 162, 247, 0.12);
|
|
1827
|
+
--vdd-toolbar-btn-active-glow: drop-shadow(0 0 6px rgba(122, 162, 247, 0.65));
|
|
1828
|
+
--vdd-toolbar-accent-bar-width: 2px;
|
|
1829
|
+
}
|
|
1830
|
+
[data-workspace-skin="tokyo"] .vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
1831
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset 3px 0 12px rgba(122, 162, 247, 0.18) !important;
|
|
1832
|
+
}
|
|
1833
|
+
[data-workspace-skin="tokyo"] .vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
1834
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset -3px 0 12px rgba(122, 162, 247, 0.18) !important;
|
|
1835
|
+
}
|
|
1836
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-radio.vdd-active,
|
|
1837
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-group.vdd-active {
|
|
1838
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset 3px 0 12px rgba(122, 162, 247, 0.18) !important;
|
|
1839
|
+
}
|
|
1840
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-radio.vdd-active,
|
|
1841
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-group.vdd-active {
|
|
1842
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset -3px 0 12px rgba(122, 162, 247, 0.18) !important;
|
|
1843
|
+
}
|
|
1844
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-radio.vdd-active,
|
|
1845
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-group.vdd-active {
|
|
1846
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset 0 -3px 12px rgba(122, 162, 247, 0.18) !important;
|
|
1847
|
+
}
|
|
1848
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-radio.vdd-active,
|
|
1849
|
+
[data-workspace-skin="tokyo"] .vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-group.vdd-active {
|
|
1850
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow), inset 0 3px 12px rgba(122, 162, 247, 0.18) !important;
|
|
1851
|
+
}
|
|
1852
|
+
|
|
1853
|
+
/* --------------------------------------------------------------------------
|
|
1854
|
+
macos — Glass Chip (full-round floating chip, accent fill + white ring)
|
|
1855
|
+
Inspired by macOS app icon strip conventions: Xcode, Logic Pro, System Settings.
|
|
1856
|
+
A contained chip that floats inside the strip — not an edge-connecting bridge.
|
|
1857
|
+
-------------------------------------------------------------------------- */
|
|
1858
|
+
[data-workspace-skin="macos"] {
|
|
1859
|
+
--vdd-tab-btn-active-bg: rgba(56, 189, 248, 0.2);
|
|
1860
|
+
--vdd-tab-btn-active-width: 36px;
|
|
1861
|
+
--vdd-tab-btn-active-radius: 10px;
|
|
1862
|
+
--vdd-tab-btn-active-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28);
|
|
1863
|
+
--vdd-tab-accent-bar-width: 0px;
|
|
1864
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(56, 189, 248, 0.2);
|
|
1865
|
+
--vdd-toolbar-btn-active-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.28);
|
|
1866
|
+
--vdd-toolbar-accent-bar-width: 0px;
|
|
1867
|
+
}
|
|
1868
|
+
[data-workspace-skin="macos"] .vdd-sidebar-tab-btn.vdd-active {
|
|
1869
|
+
border-top: 1px solid transparent !important;
|
|
1870
|
+
border-bottom: 1px solid transparent !important;
|
|
1871
|
+
margin: 0 !important;
|
|
1872
|
+
}
|
|
1873
|
+
[data-workspace-skin="macos"] .vdd-toolbar-strip .vdd-toolbar-btn-radio.vdd-active,
|
|
1874
|
+
[data-workspace-skin="macos"] .vdd-toolbar-strip .vdd-toolbar-btn-group.vdd-active {
|
|
1875
|
+
border-radius: 10px !important;
|
|
1876
|
+
}
|
|
1877
|
+
[data-workspace-skin="macos"][data-color-scheme="light"] {
|
|
1878
|
+
--vdd-tab-btn-active-bg: rgba(0, 102, 204, 0.16);
|
|
1879
|
+
--vdd-tab-btn-active-shadow: inset 0 0 0 1px rgba(0, 102, 204, 0.3);
|
|
1880
|
+
--vdd-toolbar-btn-radio-active-bg: rgba(0, 102, 204, 0.16);
|
|
1881
|
+
--vdd-toolbar-btn-active-shadow: inset 0 0 0 1px rgba(0, 102, 204, 0.3);
|
|
1882
|
+
}
|
|
1883
|
+
|
|
1884
|
+
/* ─── Sidebar structure ──────────────────────────────────────────────────────
|
|
1885
|
+
rdd carried every rule below as an inline `style={{…}}` object on the JSX,
|
|
1886
|
+
which is why its stylesheet had no sidebar layout at all: the sizes and the
|
|
1887
|
+
flex behaviour lived in the component file. Anything inline is unreachable to
|
|
1888
|
+
a consumer without `!important`, and invisible to a stylesheet review — the
|
|
1889
|
+
class of omission catalogued as docs/PARITY.md divergence D12. Only the
|
|
1890
|
+
values that genuinely vary per render stay inline in vdd: the strip's own
|
|
1891
|
+
width (it animates between 56px and 0), the drawer's flex-basis/min/max, and
|
|
1892
|
+
each pane's display. */
|
|
1893
|
+
|
|
1894
|
+
/* The row that holds strip, drawer, resizer and the workspace itself. */
|
|
1895
|
+
.vdd-sidebar-layout {
|
|
1896
|
+
display: flex;
|
|
1897
|
+
flex-direction: row;
|
|
1898
|
+
width: 100%;
|
|
1899
|
+
height: 100%;
|
|
1900
|
+
overflow: hidden;
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
/* Collapse wrapper around the strip. The animated width is set inline; this
|
|
1904
|
+
clips the 56px strip inside it while that width is on its way to 0. */
|
|
1905
|
+
.vdd-sidebar-strip-outer {
|
|
1906
|
+
height: 100%;
|
|
1907
|
+
overflow: hidden;
|
|
1908
|
+
flex-shrink: 0;
|
|
1909
|
+
transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1910
|
+
}
|
|
1911
|
+
|
|
1912
|
+
/* The consumer's own content — the workspace, normally.
|
|
1913
|
+
|
|
1914
|
+
flex-basis: 0 rather than the `auto` a bare `flex-grow: 1` would leave in
|
|
1915
|
+
place: with `auto`, a flex item's hypothetical size is its content's
|
|
1916
|
+
max-content width, and `min-width: 0` lowers only the shrink floor, not that
|
|
1917
|
+
starting size. So a wide panel inside would inflate this wrapper and steal
|
|
1918
|
+
width from the drawer beside it, moving the drawer according to what happens
|
|
1919
|
+
to be rendered in the workspace. At 0 the width is purely flex-grow's share
|
|
1920
|
+
of the free space. */
|
|
1921
|
+
.vdd-sidebar-main {
|
|
1922
|
+
flex-grow: 1;
|
|
1923
|
+
flex-shrink: 1;
|
|
1924
|
+
flex-basis: 0;
|
|
1925
|
+
min-width: 0;
|
|
1926
|
+
overflow: hidden;
|
|
1927
|
+
}
|
|
1928
|
+
|
|
1929
|
+
/* The drawer animates its flex-basis, not its width: in a flex row, `width` has
|
|
1930
|
+
no effect once flex-basis is set. */
|
|
1931
|
+
.vdd-sidebar-content-drawer {
|
|
1932
|
+
flex-grow: 0;
|
|
1933
|
+
flex-shrink: 1;
|
|
1934
|
+
overflow: hidden;
|
|
1935
|
+
transition:
|
|
1936
|
+
flex-basis 0.2s cubic-bezier(0.4, 0, 0.2, 1),
|
|
1937
|
+
min-width 0.2s cubic-bezier(0.4, 0, 0.2, 1),
|
|
1938
|
+
max-width 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
1939
|
+
}
|
|
1940
|
+
|
|
1941
|
+
/* One pane per mounted tab; all but the open one are display: none, set inline.
|
|
1942
|
+
Column so a tab's header sits above its scrolling body. */
|
|
1943
|
+
.vdd-sidebar-drawer-pane {
|
|
1944
|
+
flex-direction: column;
|
|
1945
|
+
height: 100%;
|
|
1946
|
+
width: 100%;
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
/* --- Modern Sidebar and Tabs UI Theme Customizations --- */
|
|
1950
|
+
.vdd-sidebar-content-drawer {
|
|
1951
|
+
background-color: var(--vdd-sidebar-bg) !important;
|
|
1952
|
+
color: var(--vdd-sidebar-text-title) !important;
|
|
1953
|
+
height: 100%;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
/* Position-specific drawer border and shadow alignment */
|
|
1957
|
+
.vdd-sidebar-content-drawer.vdd-left {
|
|
1958
|
+
border-right: 1px solid var(--vdd-sidebar-border) !important;
|
|
1959
|
+
border-left: none !important;
|
|
1960
|
+
box-shadow: 4px 0 16px rgba(0, 0, 0, 0.12);
|
|
1961
|
+
}
|
|
1962
|
+
.vdd-sidebar-content-drawer.vdd-right {
|
|
1963
|
+
border-left: 1px solid var(--vdd-sidebar-border) !important;
|
|
1964
|
+
border-right: none !important;
|
|
1965
|
+
box-shadow: -4px 0 16px rgba(0, 0, 0, 0.12);
|
|
1966
|
+
}
|
|
1967
|
+
|
|
1968
|
+
.vdd-sidebar-tabs-strip {
|
|
1969
|
+
background-color: var(--vdd-sidebar-tabs-bg) !important;
|
|
1970
|
+
display: flex;
|
|
1971
|
+
flex-direction: column;
|
|
1972
|
+
align-items: center;
|
|
1973
|
+
padding-top: 38px; /* Perfectly aligned to match the 38px height of the drawer header bar — only
|
|
1974
|
+
relevant when a tab is the first item; see the modifier rule below. */
|
|
1975
|
+
padding-bottom: 12px;
|
|
1976
|
+
flex-shrink: 0;
|
|
1977
|
+
z-index: 5;
|
|
1978
|
+
}
|
|
1979
|
+
|
|
1980
|
+
/* When a headerAction is present, it owns its own top/bottom spacing (see
|
|
1981
|
+
.vdd-sidebar-header-area below) — the strip's own alignment padding no longer applies. */
|
|
1982
|
+
.vdd-sidebar-tabs-strip.vdd-sidebar-tabs-strip--has-header-action {
|
|
1983
|
+
padding-top: 0;
|
|
1984
|
+
}
|
|
1985
|
+
|
|
1986
|
+
/* When a footerAction is present, it owns its own bottom spacing (see .vdd-sidebar-footer-area
|
|
1987
|
+
below) — the strip's own bottom padding no longer applies. */
|
|
1988
|
+
.vdd-sidebar-tabs-strip.vdd-sidebar-tabs-strip--has-footer-action {
|
|
1989
|
+
padding-bottom: 0;
|
|
1990
|
+
}
|
|
1991
|
+
|
|
1992
|
+
/* Wraps `headerAction` — independent of .vdd-sidebar-tabs-list's own gap, so a consumer can
|
|
1993
|
+
tune spacing/effective height around their button(s) (default, custom-rendered, or a mix with
|
|
1994
|
+
real tabs) without touching inter-tab spacing. Layout-only values, so no light/dark variant is
|
|
1995
|
+
needed. Column + gap so multiple entries stack — visually identical to before for the single-
|
|
1996
|
+
entry case. */
|
|
1997
|
+
.vdd-sidebar-header-area {
|
|
1998
|
+
display: flex;
|
|
1999
|
+
flex-direction: column;
|
|
2000
|
+
align-items: center;
|
|
2001
|
+
gap: 8px;
|
|
2002
|
+
/* Floor matching .vdd-sidebar-tab-btn's own intrinsic 44px — without it, a lone active tab
|
|
2003
|
+
(width: var(--vdd-tab-btn-active-width, 100%)) has no stable sibling to size this shrink-to-fit
|
|
2004
|
+
container against, so its 100% resolves against nothing and collapses to its icon's size. */
|
|
2005
|
+
min-width: 44px;
|
|
2006
|
+
padding-top: var(--vdd-sidebar-header-area-padding-top, 8px);
|
|
2007
|
+
padding-bottom: var(--vdd-sidebar-header-area-padding-bottom, 8px);
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
/* Mirror of .vdd-sidebar-header-area for `footerAction` — pinned to the bottom of the strip via
|
|
2011
|
+
.vdd-sidebar-tabs-list's flex: 1 below. */
|
|
2012
|
+
.vdd-sidebar-footer-area {
|
|
2013
|
+
display: flex;
|
|
2014
|
+
flex-direction: column;
|
|
2015
|
+
align-items: center;
|
|
2016
|
+
gap: 8px;
|
|
2017
|
+
min-width: 44px;
|
|
2018
|
+
padding-top: var(--vdd-sidebar-footer-area-padding-top, 8px);
|
|
2019
|
+
padding-bottom: var(--vdd-sidebar-footer-area-padding-bottom, 8px);
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
/* Wraps the tabs only — owns the gap that used to live on .vdd-sidebar-tabs-strip itself.
|
|
2023
|
+
flex: 1 absorbs remaining space so a following .vdd-sidebar-footer-area is pushed to the
|
|
2024
|
+
bottom of the strip regardless of tab count. */
|
|
2025
|
+
.vdd-sidebar-tabs-list {
|
|
2026
|
+
display: flex;
|
|
2027
|
+
flex-direction: column;
|
|
2028
|
+
align-items: center;
|
|
2029
|
+
gap: 8px;
|
|
2030
|
+
flex: 1;
|
|
2031
|
+
}
|
|
2032
|
+
|
|
2033
|
+
/* Position-specific tab strip border alignment */
|
|
2034
|
+
.vdd-sidebar-tabs-strip.vdd-left {
|
|
2035
|
+
border-right: 1px solid var(--vdd-sidebar-border) !important;
|
|
2036
|
+
border-left: none !important;
|
|
2037
|
+
}
|
|
2038
|
+
.vdd-sidebar-tabs-strip.vdd-right {
|
|
2039
|
+
border-left: 1px solid var(--vdd-sidebar-border) !important;
|
|
2040
|
+
border-right: none !important;
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
/* Sidebar Header */
|
|
2044
|
+
.vdd-sidebar-header-title {
|
|
2045
|
+
font-family: monospace;
|
|
2046
|
+
font-weight: 700;
|
|
2047
|
+
letter-spacing: 0.05em;
|
|
2048
|
+
text-transform: uppercase;
|
|
2049
|
+
color: var(--vdd-sidebar-text-title);
|
|
2050
|
+
font-size: 0.85rem;
|
|
2051
|
+
}
|
|
2052
|
+
|
|
2053
|
+
/* Tab Button with real tabbed integration */
|
|
2054
|
+
.vdd-sidebar-tab-btn {
|
|
2055
|
+
width: 44px;
|
|
2056
|
+
height: 44px;
|
|
2057
|
+
display: flex;
|
|
2058
|
+
align-items: center;
|
|
2059
|
+
justify-content: center;
|
|
2060
|
+
border: 1px solid transparent !important;
|
|
2061
|
+
border-radius: 6px;
|
|
2062
|
+
background: transparent;
|
|
2063
|
+
color: var(--vdd-tab-icon-inactive);
|
|
2064
|
+
position: relative;
|
|
2065
|
+
transition: color 0.15s ease, background-color 0.15s ease, transform 0.15s ease;
|
|
2066
|
+
cursor: pointer;
|
|
2067
|
+
outline: none !important;
|
|
2068
|
+
}
|
|
2069
|
+
|
|
2070
|
+
/* Micro-interactions & hover tactile feedback for inactive buttons */
|
|
2071
|
+
.vdd-sidebar-tab-btn:not(.vdd-active):hover {
|
|
2072
|
+
color: var(--vdd-sidebar-text-title);
|
|
2073
|
+
background-color: var(--vdd-sidebar-btn-hover-bg) !important;
|
|
2074
|
+
transform: scale(1.05);
|
|
2075
|
+
}
|
|
2076
|
+
|
|
2077
|
+
.vdd-sidebar-tab-btn.vdd-active {
|
|
2078
|
+
width: var(--vdd-tab-btn-active-width, 100%) !important;
|
|
2079
|
+
color: var(--vdd-tab-icon-active) !important;
|
|
2080
|
+
background-color: var(--vdd-tab-btn-active-bg) !important;
|
|
2081
|
+
border-top: 1px solid var(--vdd-sidebar-border) !important;
|
|
2082
|
+
border-bottom: 1px solid var(--vdd-sidebar-border) !important;
|
|
2083
|
+
border-radius: var(--vdd-tab-btn-active-radius, 0px) !important;
|
|
2084
|
+
box-shadow: var(--vdd-tab-btn-active-shadow, none);
|
|
2085
|
+
filter: var(--vdd-tab-btn-active-glow, none);
|
|
2086
|
+
z-index: 6;
|
|
2087
|
+
transition: color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
|
|
2088
|
+
}
|
|
2089
|
+
|
|
2090
|
+
/* Position-specific active button border & margin alignments */
|
|
2091
|
+
.vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
2092
|
+
border-left: var(--vdd-tab-accent-bar-width, 3px) solid var(--vdd-tab-icon-active) !important;
|
|
2093
|
+
border-right: none !important;
|
|
2094
|
+
margin-right: -2px !important;
|
|
2095
|
+
margin-left: 0 !important;
|
|
2096
|
+
}
|
|
2097
|
+
.vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
2098
|
+
border-left: none !important;
|
|
2099
|
+
border-right: var(--vdd-tab-accent-bar-width, 3px) solid var(--vdd-tab-icon-active) !important;
|
|
2100
|
+
margin-left: -2px !important;
|
|
2101
|
+
margin-right: 0 !important;
|
|
2102
|
+
}
|
|
2103
|
+
|
|
2104
|
+
|
|
2105
|
+
/* Animations are on by default. `animations={false}` on <WindowManager /> adds
|
|
2106
|
+
`vdd-no-animations` to the workspace root and mirrors it onto <html> (so
|
|
2107
|
+
portaled elements — ContextMenu, Toast, Toolbar's flyout — are covered too).
|
|
2108
|
+
Scoped to only the library's own elements ([class*="vdd-"]) via the new
|
|
2109
|
+
unified prefix — this never touches the consumer's own transitions/animations
|
|
2110
|
+
elsewhere on the page, in either state. */
|
|
2111
|
+
.vdd-no-animations [class*="vdd-"],
|
|
2112
|
+
.vdd-no-animations [class*="vdd-"]::before,
|
|
2113
|
+
.vdd-no-animations [class*="vdd-"]::after,
|
|
2114
|
+
html.vdd-no-animations [class*="vdd-"],
|
|
2115
|
+
html.vdd-no-animations [class*="vdd-"]::before,
|
|
2116
|
+
html.vdd-no-animations [class*="vdd-"]::after {
|
|
2117
|
+
transition: none !important;
|
|
2118
|
+
animation: none !important;
|
|
2119
|
+
}
|
|
2120
|
+
|
|
2121
|
+
|
|
2122
|
+
|
|
2123
|
+
@keyframes vdd-fade-in {
|
|
2124
|
+
from { opacity: 0; }
|
|
2125
|
+
to { opacity: 1; }
|
|
2126
|
+
}
|
|
2127
|
+
|
|
2128
|
+
@keyframes vdd-scale-up {
|
|
2129
|
+
from { transform: scale(0.95); opacity: 0; }
|
|
2130
|
+
to { transform: scale(1); opacity: 1; }
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2133
|
+
/* Stacked Modal Classes */
|
|
2134
|
+
.vdd-modal-overlay {
|
|
2135
|
+
position: fixed;
|
|
2136
|
+
inset: 0;
|
|
2137
|
+
display: flex;
|
|
2138
|
+
align-items: center;
|
|
2139
|
+
justify-content: center;
|
|
2140
|
+
z-index: calc(var(--vdd-z-base, 1000) + 9000);
|
|
2141
|
+
animation: vdd-fade-in 0.18s ease-out;
|
|
2142
|
+
}
|
|
2143
|
+
|
|
2144
|
+
.vdd-modal-curtain {
|
|
2145
|
+
position: absolute;
|
|
2146
|
+
inset: 0;
|
|
2147
|
+
background-color: var(--vdd-modal-curtain-bg);
|
|
2148
|
+
backdrop-filter: blur(6px);
|
|
2149
|
+
}
|
|
2150
|
+
|
|
2151
|
+
.vdd-modal-window {
|
|
2152
|
+
position: relative;
|
|
2153
|
+
background: var(--vdd-modal-bg);
|
|
2154
|
+
border: 1px solid var(--vdd-modal-border);
|
|
2155
|
+
box-shadow: 0 24px 48px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255, 255, 255, 0.05);
|
|
2156
|
+
border-radius: 12px;
|
|
2157
|
+
display: flex;
|
|
2158
|
+
flex-direction: column;
|
|
2159
|
+
color: var(--vdd-text-primary);
|
|
2160
|
+
max-width: 90%;
|
|
2161
|
+
max-height: 90vh;
|
|
2162
|
+
animation: vdd-scale-up 0.18s cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
2163
|
+
overflow: hidden;
|
|
2164
|
+
}
|
|
2165
|
+
|
|
2166
|
+
.vdd-modal-header {
|
|
2167
|
+
display: flex;
|
|
2168
|
+
align-items: center;
|
|
2169
|
+
padding: 12px 20px;
|
|
2170
|
+
border-bottom: 1px solid var(--vdd-modal-header-border);
|
|
2171
|
+
background-color: var(--vdd-modal-header-bg);
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
.vdd-modal-icon {
|
|
2175
|
+
margin-right: 10px;
|
|
2176
|
+
font-size: 1.1rem;
|
|
2177
|
+
display: flex;
|
|
2178
|
+
align-items: center;
|
|
2179
|
+
}
|
|
2180
|
+
|
|
2181
|
+
.vdd-modal-title {
|
|
2182
|
+
font-size: 1rem;
|
|
2183
|
+
font-weight: 600;
|
|
2184
|
+
margin: 0;
|
|
2185
|
+
flex-grow: 1;
|
|
2186
|
+
}
|
|
2187
|
+
|
|
2188
|
+
.vdd-modal-close-button {
|
|
2189
|
+
background: transparent;
|
|
2190
|
+
border: none;
|
|
2191
|
+
color: var(--vdd-text-secondary);
|
|
2192
|
+
cursor: pointer;
|
|
2193
|
+
padding: 4px;
|
|
2194
|
+
display: flex;
|
|
2195
|
+
align-items: center;
|
|
2196
|
+
justify-content: center;
|
|
2197
|
+
border-radius: 4px;
|
|
2198
|
+
transition: all 0.15s ease;
|
|
2199
|
+
}
|
|
2200
|
+
|
|
2201
|
+
.vdd-modal-close-button:hover {
|
|
2202
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
2203
|
+
color: var(--vdd-modal-close-hover-color);
|
|
2204
|
+
}
|
|
2205
|
+
|
|
2206
|
+
.vdd-modal-body {
|
|
2207
|
+
padding: 0;
|
|
2208
|
+
overflow-y: auto;
|
|
2209
|
+
max-height: calc(90vh - 70px);
|
|
2210
|
+
}
|
|
2211
|
+
|
|
2212
|
+
/* Modal Sizes */
|
|
2213
|
+
.vdd-modal-size-small {
|
|
2214
|
+
width: 420px;
|
|
2215
|
+
}
|
|
2216
|
+
.vdd-modal-size-medium {
|
|
2217
|
+
width: 560px;
|
|
2218
|
+
}
|
|
2219
|
+
.vdd-modal-size-large {
|
|
2220
|
+
width: 800px;
|
|
2221
|
+
}
|
|
2222
|
+
.vdd-modal-size-fullscreen {
|
|
2223
|
+
width: 98vw;
|
|
2224
|
+
height: 96vh;
|
|
2225
|
+
}
|
|
2226
|
+
.vdd-modal-size-auto {
|
|
2227
|
+
width: auto;
|
|
2228
|
+
min-width: 300px;
|
|
2229
|
+
}
|
|
2230
|
+
|
|
2231
|
+
/* Side Drawer Panels */
|
|
2232
|
+
/* position: fixed (not absolute) is deliberate: it anchors the panel to the
|
|
2233
|
+
viewport directly, matching .vdd-modal-overlay's own position: fixed. A
|
|
2234
|
+
position: absolute panel resolves its containing block against whatever
|
|
2235
|
+
position: relative/absolute ancestor the consumer happens to have between
|
|
2236
|
+
it and the document (per the documented "mount as a sibling of
|
|
2237
|
+
WindowManager" pattern) — and while off-screen mid-slide-in (a pure
|
|
2238
|
+
transform, not a visibility change), it then contributes real scrollable
|
|
2239
|
+
overflow to THAT ancestor, which the browser auto-scrolls on focus and then
|
|
2240
|
+
continuously re-clamps in lockstep with the animation, visibly dragging the
|
|
2241
|
+
ancestor's entire content (the whole workspace) left/right and back over
|
|
2242
|
+
the whole animation — not window/document, so no amount of watching
|
|
2243
|
+
window.scrollX/scrollY (an earlier fix here, since reverted) can catch or
|
|
2244
|
+
correct it. position: fixed removes the panel from that ancestor's overflow
|
|
2245
|
+
calculation entirely, the same way it already does for modals. */
|
|
2246
|
+
.vdd-side-panel {
|
|
2247
|
+
position: fixed;
|
|
2248
|
+
top: 0;
|
|
2249
|
+
bottom: 0;
|
|
2250
|
+
width: 400px;
|
|
2251
|
+
background: var(--vdd-side-panel-bg);
|
|
2252
|
+
backdrop-filter: blur(20px) saturate(180%);
|
|
2253
|
+
-webkit-backdrop-filter: blur(20px) saturate(180%);
|
|
2254
|
+
border-right: 1px solid var(--vdd-side-panel-border);
|
|
2255
|
+
z-index: calc(var(--vdd-z-base, 1000) + 8000);
|
|
2256
|
+
box-shadow: 10px 0 30px rgba(0, 0, 0, 0.4);
|
|
2257
|
+
transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);
|
|
2258
|
+
display: flex;
|
|
2259
|
+
flex-direction: column;
|
|
2260
|
+
}
|
|
2261
|
+
|
|
2262
|
+
.vdd-side-panel-right {
|
|
2263
|
+
right: 0;
|
|
2264
|
+
border-right: none;
|
|
2265
|
+
border-left: 1px solid var(--vdd-side-panel-border);
|
|
2266
|
+
box-shadow: -10px 0 30px rgba(0, 0, 0, 0.4);
|
|
2267
|
+
}
|
|
2268
|
+
|
|
2269
|
+
.vdd-side-panel-left {
|
|
2270
|
+
left: 0;
|
|
2271
|
+
}
|
|
2272
|
+
|
|
2273
|
+
.vdd-side-panel-window {
|
|
2274
|
+
display: flex;
|
|
2275
|
+
flex-direction: column;
|
|
2276
|
+
height: 100%;
|
|
2277
|
+
width: 100%;
|
|
2278
|
+
}
|
|
2279
|
+
|
|
2280
|
+
.vdd-side-panel-header {
|
|
2281
|
+
display: flex;
|
|
2282
|
+
align-items: center;
|
|
2283
|
+
padding: 12px 20px;
|
|
2284
|
+
border-bottom: 1px solid var(--vdd-side-panel-header-border);
|
|
2285
|
+
background-color: var(--vdd-side-panel-header-bg);
|
|
2286
|
+
min-height: 44px;
|
|
2287
|
+
}
|
|
2288
|
+
|
|
2289
|
+
.vdd-side-panel-icon {
|
|
2290
|
+
margin-right: 10px;
|
|
2291
|
+
font-size: 1.1rem;
|
|
2292
|
+
display: flex;
|
|
2293
|
+
align-items: center;
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
.vdd-side-panel-title {
|
|
2297
|
+
font-size: 0.95rem;
|
|
2298
|
+
font-weight: 600;
|
|
2299
|
+
margin: 0;
|
|
2300
|
+
flex-grow: 1;
|
|
2301
|
+
color: var(--vdd-text-primary);
|
|
2302
|
+
}
|
|
2303
|
+
|
|
2304
|
+
.vdd-side-panel-close-button {
|
|
2305
|
+
background: transparent;
|
|
2306
|
+
border: none;
|
|
2307
|
+
color: var(--vdd-text-secondary);
|
|
2308
|
+
cursor: pointer;
|
|
2309
|
+
padding: 4px;
|
|
2310
|
+
display: flex;
|
|
2311
|
+
align-items: center;
|
|
2312
|
+
justify-content: center;
|
|
2313
|
+
border-radius: 4px;
|
|
2314
|
+
transition: all 0.15s ease;
|
|
2315
|
+
}
|
|
2316
|
+
|
|
2317
|
+
.vdd-side-panel-close-button:hover {
|
|
2318
|
+
background-color: rgba(255, 255, 255, 0.08);
|
|
2319
|
+
color: var(--vdd-side-panel-close-hover-color);
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
.vdd-side-panel-body {
|
|
2323
|
+
flex-grow: 1;
|
|
2324
|
+
overflow-y: auto;
|
|
2325
|
+
padding: 0;
|
|
2326
|
+
}
|
|
2327
|
+
|
|
2328
|
+
.vdd-side-panel-left.vdd-side-panel-visible {
|
|
2329
|
+
animation: vdd-slide-in-left 0.25s cubic-bezier(0.16, 1, 0.3, 1);
|
|
2330
|
+
}
|
|
2331
|
+
|
|
2332
|
+
.vdd-side-panel-right.vdd-side-panel-visible {
|
|
2333
|
+
animation: vdd-slide-in-right 0.25s cubic-bezier(0.16, 1, 0.3, 1);
|
|
2334
|
+
}
|
|
2335
|
+
|
|
2336
|
+
@keyframes vdd-slide-in-left {
|
|
2337
|
+
from { transform: translateX(-100%); }
|
|
2338
|
+
to { transform: translateX(0); }
|
|
2339
|
+
}
|
|
2340
|
+
|
|
2341
|
+
@keyframes vdd-slide-in-right {
|
|
2342
|
+
from { transform: translateX(100%); }
|
|
2343
|
+
to { transform: translateX(0); }
|
|
2344
|
+
}
|
|
2345
|
+
|
|
2346
|
+
/* Outer Workspace Edge Drop Zones */
|
|
2347
|
+
.vdd-workspace-edge-trigger {
|
|
2348
|
+
position: absolute;
|
|
2349
|
+
z-index: calc(var(--vdd-z-base, 1000) + 8999);
|
|
2350
|
+
background-color: rgba(0, 123, 255, 0.01);
|
|
2351
|
+
transition: background-color 0.2s;
|
|
2352
|
+
}
|
|
2353
|
+
|
|
2354
|
+
.vdd-workspace-edge-trigger:hover {
|
|
2355
|
+
background-color: rgba(0, 123, 255, 0.12);
|
|
2356
|
+
}
|
|
2357
|
+
|
|
2358
|
+
.vdd-edge-trigger-left {
|
|
2359
|
+
left: 0;
|
|
2360
|
+
top: 0;
|
|
2361
|
+
bottom: 0;
|
|
2362
|
+
width: 24px;
|
|
2363
|
+
}
|
|
2364
|
+
|
|
2365
|
+
.vdd-edge-trigger-right {
|
|
2366
|
+
right: 0;
|
|
2367
|
+
top: 0;
|
|
2368
|
+
bottom: 0;
|
|
2369
|
+
width: 24px;
|
|
2370
|
+
}
|
|
2371
|
+
|
|
2372
|
+
.vdd-edge-trigger-top {
|
|
2373
|
+
top: 0;
|
|
2374
|
+
left: 24px;
|
|
2375
|
+
right: 24px;
|
|
2376
|
+
height: 10px; /* thin strip — keeps clear of tab bar (38px tall) */
|
|
2377
|
+
}
|
|
2378
|
+
|
|
2379
|
+
.vdd-edge-trigger-bottom {
|
|
2380
|
+
bottom: 0;
|
|
2381
|
+
left: 24px;
|
|
2382
|
+
right: 24px;
|
|
2383
|
+
height: 24px;
|
|
2384
|
+
}
|
|
2385
|
+
|
|
2386
|
+
.vdd-workspace-edge-preview {
|
|
2387
|
+
position: absolute;
|
|
2388
|
+
z-index: calc(var(--vdd-z-base, 1000) + 8998);
|
|
2389
|
+
background-color: rgba(0, 123, 255, 0.2);
|
|
2390
|
+
border: 2px dashed #007bff;
|
|
2391
|
+
pointer-events: none;
|
|
2392
|
+
animation: vdd-fade-in 0.15s ease-out;
|
|
2393
|
+
}
|
|
2394
|
+
|
|
2395
|
+
/* Workspace corner anchor drop zones */
|
|
2396
|
+
.vdd-corner-zone {
|
|
2397
|
+
position: absolute;
|
|
2398
|
+
width: 80px;
|
|
2399
|
+
height: 80px;
|
|
2400
|
+
border: 2px dashed var(--vdd-accent-color, #38bdf8);
|
|
2401
|
+
border-radius: 8px;
|
|
2402
|
+
background: rgba(56, 189, 248, 0.06);
|
|
2403
|
+
pointer-events: auto;
|
|
2404
|
+
z-index: calc(var(--vdd-z-base, 1000) + 9000);
|
|
2405
|
+
opacity: 0.55;
|
|
2406
|
+
transition: opacity 0.15s ease, background 0.15s ease, border-style 0.15s ease;
|
|
2407
|
+
}
|
|
2408
|
+
.vdd-corner-zone--top-left { top: 0; left: 0; }
|
|
2409
|
+
.vdd-corner-zone--top-right { top: 0; right: 0; }
|
|
2410
|
+
.vdd-corner-zone--bottom-left { bottom: 0; left: 0; }
|
|
2411
|
+
.vdd-corner-zone--bottom-right { bottom: 0; right: 0; }
|
|
2412
|
+
.vdd-corner-zone--hovered {
|
|
2413
|
+
opacity: 1;
|
|
2414
|
+
background: rgba(56, 189, 248, 0.18);
|
|
2415
|
+
border-style: solid;
|
|
2416
|
+
}
|
|
2417
|
+
|
|
2418
|
+
[dir="rtl"] .vdd-corner-zone--top-right { right: auto; left: 0; }
|
|
2419
|
+
[dir="rtl"] .vdd-corner-zone--top-left { left: auto; right: 0; }
|
|
2420
|
+
[dir="rtl"] .vdd-corner-zone--bottom-right { right: auto; left: 0; }
|
|
2421
|
+
[dir="rtl"] .vdd-corner-zone--bottom-left { left: auto; right: 0; }
|
|
2422
|
+
|
|
2423
|
+
/* ==========================================
|
|
2424
|
+
RTL (Right-to-Left) Support
|
|
2425
|
+
========================================== */
|
|
2426
|
+
|
|
2427
|
+
[dir="rtl"] .vdd-workspace-tab {
|
|
2428
|
+
border-right: none !important;
|
|
2429
|
+
border-left: 1px solid var(--vdd-border-panel) !important;
|
|
2430
|
+
padding: 0 14px 0 6px !important;
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
[dir="rtl"] .vdd-workspace-tab.vdd-drag-hover-left {
|
|
2434
|
+
box-shadow: 3px 0 0 0 var(--vdd-accent-color, #38bdf8),
|
|
2435
|
+
10px 0 10px -2px var(--vdd-accent-glow, rgba(56,189,248,0.35));
|
|
2436
|
+
}
|
|
2437
|
+
[dir="rtl"] .vdd-workspace-tab.vdd-drag-hover-right {
|
|
2438
|
+
box-shadow: -3px 0 0 0 var(--vdd-accent-color, #38bdf8),
|
|
2439
|
+
-10px 0 10px -2px var(--vdd-accent-glow, rgba(56,189,248,0.35));
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
[dir="rtl"] .vdd-workspace-tab > .vdd-text-truncate {
|
|
2443
|
+
margin-right: 0 !important;
|
|
2444
|
+
margin-left: 12px !important;
|
|
2445
|
+
}
|
|
2446
|
+
|
|
2447
|
+
[dir="rtl"] .vdd-workspace-tab-icon {
|
|
2448
|
+
margin-right: 0 !important;
|
|
2449
|
+
margin-left: 6px !important;
|
|
2450
|
+
}
|
|
2451
|
+
|
|
2452
|
+
[dir="rtl"] .vdd-tab-header-actions {
|
|
2453
|
+
margin-left: 0 !important;
|
|
2454
|
+
margin-right: auto !important;
|
|
2455
|
+
}
|
|
2456
|
+
|
|
2457
|
+
[dir="rtl"] .vdd-close-tab-x {
|
|
2458
|
+
margin-left: 0 !important;
|
|
2459
|
+
margin-right: auto !important;
|
|
2460
|
+
}
|
|
2461
|
+
|
|
2462
|
+
/* Floating window title bar RTL — inherited direction:rtl on the titlebar flex container
|
|
2463
|
+
moves buttons (last in DOM) to the LEFT and title (first in DOM) to the RIGHT.
|
|
2464
|
+
No explicit row-reverse needed; only prevent the button group from reordering internally. */
|
|
2465
|
+
[dir="rtl"] .vdd-titlebar-actions { flex-direction: row; }
|
|
2466
|
+
|
|
2467
|
+
/* Side Panels transitions slide-in direction */
|
|
2468
|
+
[dir="rtl"] .vdd-side-panel-left {
|
|
2469
|
+
left: auto !important;
|
|
2470
|
+
right: 0 !important;
|
|
2471
|
+
transform: translateX(100%) !important;
|
|
2472
|
+
}
|
|
2473
|
+
[dir="rtl"] .vdd-side-panel-left.vdd-side-panel-visible {
|
|
2474
|
+
transform: translateX(0) !important;
|
|
2475
|
+
border-right: none !important;
|
|
2476
|
+
border-left: 1px solid var(--vdd-border-panel, #3c3c3c) !important;
|
|
2477
|
+
}
|
|
2478
|
+
|
|
2479
|
+
[dir="rtl"] .vdd-side-panel-right {
|
|
2480
|
+
right: auto !important;
|
|
2481
|
+
left: 0 !important;
|
|
2482
|
+
transform: translateX(-100%) !important;
|
|
2483
|
+
}
|
|
2484
|
+
[dir="rtl"] .vdd-side-panel-right.vdd-side-panel-visible {
|
|
2485
|
+
transform: translateX(0) !important;
|
|
2486
|
+
border-left: none !important;
|
|
2487
|
+
border-right: 1px solid var(--vdd-border-panel, #3c3c3c) !important;
|
|
2488
|
+
}
|
|
2489
|
+
|
|
2490
|
+
/* Minimize Taskbar adjustments */
|
|
2491
|
+
[dir="rtl"] .vdd-taskbar-footer-container {
|
|
2492
|
+
flex-direction: row-reverse !important;
|
|
2493
|
+
}
|
|
2494
|
+
[dir="rtl"] .vdd-taskbar-item-icon {
|
|
2495
|
+
margin-right: 0 !important;
|
|
2496
|
+
margin-left: 4px !important;
|
|
2497
|
+
}
|
|
2498
|
+
|
|
2499
|
+
/* macOS Skin - RTL floating window titlebar overrides
|
|
2500
|
+
Dots must stay on the LEFT in both LTR and RTL (real macOS behavior).
|
|
2501
|
+
In RTL context flex-direction:row flows items right-to-left, so
|
|
2502
|
+
DOM [title][buttons] → title at RIGHT, buttons at LEFT. */
|
|
2503
|
+
[dir="rtl"] [data-workspace-skin="macos"] .vdd-floating-window-titlebar {
|
|
2504
|
+
flex-direction: row !important;
|
|
2505
|
+
}
|
|
2506
|
+
/* Title: pack icon+text toward the visual right (flex-start = right in RTL) */
|
|
2507
|
+
[dir="rtl"] [data-workspace-skin="macos"] .vdd-floating-window-titlebar .vdd-floating-window-title {
|
|
2508
|
+
justify-content: flex-start !important;
|
|
2509
|
+
}
|
|
2510
|
+
/* Button group: keep dots in correct visual order (Red → Yellow → Green, close at far left).
|
|
2511
|
+
direction:rtl (inherited) + flex-direction:row = right-to-left → DOM first item (more) at right,
|
|
2512
|
+
last item (close) at left. */
|
|
2513
|
+
[dir="rtl"] [data-workspace-skin="macos"] .vdd-floating-window-titlebar .vdd-titlebar-actions {
|
|
2514
|
+
flex-direction: row !important;
|
|
2515
|
+
}
|
|
2516
|
+
|
|
2517
|
+
/* Mirror close-button margins for macOS tabs under RTL */
|
|
2518
|
+
[dir="rtl"][data-workspace-skin="macos"] .vdd-close-tab-x {
|
|
2519
|
+
margin-left: 0 !important;
|
|
2520
|
+
margin-right: 2px !important;
|
|
2521
|
+
}
|
|
2522
|
+
|
|
2523
|
+
/* ── Sidebar strips — separator border, accent indicator, drawer shadow ──
|
|
2524
|
+
direction: rtl (inherited from workspace root) reverses the flex row so
|
|
2525
|
+
`vdd-left` strips move visually to the RIGHT and `vdd-right` strips to the LEFT.
|
|
2526
|
+
All physical border-left/border-right and box-shadow directions must swap. */
|
|
2527
|
+
|
|
2528
|
+
[dir="rtl"] .vdd-sidebar-tabs-strip.vdd-left {
|
|
2529
|
+
border-left: 1px solid var(--vdd-sidebar-border) !important;
|
|
2530
|
+
border-right: none !important;
|
|
2531
|
+
}
|
|
2532
|
+
[dir="rtl"] .vdd-sidebar-tabs-strip.vdd-right {
|
|
2533
|
+
border-right: 1px solid var(--vdd-sidebar-border) !important;
|
|
2534
|
+
border-left: none !important;
|
|
2535
|
+
}
|
|
2536
|
+
|
|
2537
|
+
[dir="rtl"] .vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
2538
|
+
border-left: none !important;
|
|
2539
|
+
border-right: var(--vdd-tab-accent-bar-width, 3px) solid var(--vdd-tab-icon-active) !important;
|
|
2540
|
+
margin-left: -2px !important;
|
|
2541
|
+
margin-right: 0 !important;
|
|
2542
|
+
}
|
|
2543
|
+
[dir="rtl"] .vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
2544
|
+
border-right: none !important;
|
|
2545
|
+
border-left: var(--vdd-tab-accent-bar-width, 3px) solid var(--vdd-tab-icon-active) !important;
|
|
2546
|
+
margin-right: -2px !important;
|
|
2547
|
+
margin-left: 0 !important;
|
|
2548
|
+
}
|
|
2549
|
+
|
|
2550
|
+
[dir="rtl"] .vdd-sidebar-content-drawer.vdd-left {
|
|
2551
|
+
border-left: 1px solid var(--vdd-sidebar-border) !important;
|
|
2552
|
+
border-right: none !important;
|
|
2553
|
+
box-shadow: -4px 0 16px rgba(0, 0, 0, 0.12);
|
|
2554
|
+
}
|
|
2555
|
+
[dir="rtl"] .vdd-sidebar-content-drawer.vdd-right {
|
|
2556
|
+
border-right: 1px solid var(--vdd-sidebar-border) !important;
|
|
2557
|
+
border-left: none !important;
|
|
2558
|
+
box-shadow: 4px 0 16px rgba(0, 0, 0, 0.12);
|
|
2559
|
+
}
|
|
2560
|
+
|
|
2561
|
+
/* obsidian & tokyo — flip the inset glow X offset sign */
|
|
2562
|
+
[dir="rtl"] [data-workspace-skin="obsidian"] .vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
2563
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset -3px 0 8px rgba(255, 255, 255, 0.08) !important;
|
|
2564
|
+
}
|
|
2565
|
+
[dir="rtl"] [data-workspace-skin="obsidian"] .vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
2566
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset 3px 0 8px rgba(255, 255, 255, 0.08) !important;
|
|
2567
|
+
}
|
|
2568
|
+
[dir="rtl"] [data-workspace-skin="tokyo"] .vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
2569
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset -3px 0 12px rgba(122, 162, 247, 0.18) !important;
|
|
2570
|
+
}
|
|
2571
|
+
[dir="rtl"] [data-workspace-skin="tokyo"] .vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
2572
|
+
box-shadow: var(--vdd-tab-btn-active-shadow), inset 3px 0 12px rgba(122, 162, 247, 0.18) !important;
|
|
2573
|
+
}
|
|
2574
|
+
|
|
2575
|
+
/* chrome — swap the capsule border-radius when strips change sides */
|
|
2576
|
+
[dir="rtl"] [data-workspace-skin="chrome"] .vdd-sidebar-tabs-strip.vdd-left .vdd-sidebar-tab-btn.vdd-active {
|
|
2577
|
+
border-radius: 10px 0 0 10px !important;
|
|
2578
|
+
margin-left: 0 !important;
|
|
2579
|
+
margin-right: 0 !important;
|
|
2580
|
+
}
|
|
2581
|
+
[dir="rtl"] [data-workspace-skin="chrome"] .vdd-sidebar-tabs-strip.vdd-right .vdd-sidebar-tab-btn.vdd-active {
|
|
2582
|
+
border-radius: 0 10px 10px 0 !important;
|
|
2583
|
+
margin-right: 0 !important;
|
|
2584
|
+
margin-left: 0 !important;
|
|
2585
|
+
}
|
|
2586
|
+
|
|
2587
|
+
/* ==========================================================================
|
|
2588
|
+
FRAMEWORK-AGNOSTIC UTILITY CLASSES
|
|
2589
|
+
(replaces Bootstrap utility class dependencies)
|
|
2590
|
+
========================================================================== */
|
|
2591
|
+
|
|
2592
|
+
/* Text truncation (equivalent to Bootstrap .vdd-text-truncate) */
|
|
2593
|
+
.vdd-text-truncate {
|
|
2594
|
+
overflow: hidden;
|
|
2595
|
+
text-overflow: ellipsis;
|
|
2596
|
+
white-space: nowrap;
|
|
2597
|
+
}
|
|
2598
|
+
|
|
2599
|
+
/* Floating window titlebar button group */
|
|
2600
|
+
.vdd-titlebar-actions {
|
|
2601
|
+
display: flex;
|
|
2602
|
+
align-items: center;
|
|
2603
|
+
}
|
|
2604
|
+
|
|
2605
|
+
|
|
2606
|
+
/* Tab header custom actions slot */
|
|
2607
|
+
.vdd-tab-header-actions {
|
|
2608
|
+
margin-inline-start: auto;
|
|
2609
|
+
display: flex;
|
|
2610
|
+
align-items: center;
|
|
2611
|
+
margin-inline-end: 0.25rem;
|
|
2612
|
+
gap: var(--vdd-header-button-gap, 4px);
|
|
2613
|
+
}
|
|
2614
|
+
|
|
2615
|
+
/* Panel body (tab content area / floating window content area) */
|
|
2616
|
+
.vdd-panel-body {
|
|
2617
|
+
flex-grow: 1;
|
|
2618
|
+
width: 100%;
|
|
2619
|
+
height: 100%;
|
|
2620
|
+
}
|
|
2621
|
+
|
|
2622
|
+
/* Empty workspace section placeholder text */
|
|
2623
|
+
.vdd-empty-leaf-placeholder {
|
|
2624
|
+
width: 100%;
|
|
2625
|
+
height: 100%;
|
|
2626
|
+
display: flex;
|
|
2627
|
+
align-items: center;
|
|
2628
|
+
justify-content: center;
|
|
2629
|
+
font-family: monospace;
|
|
2630
|
+
font-size: 0.875rem;
|
|
2631
|
+
color: var(--vdd-text-secondary, #94a3b8);
|
|
2632
|
+
}
|
|
2633
|
+
|
|
2634
|
+
|
|
2635
|
+
/* Unregistered component error panel */
|
|
2636
|
+
.vdd-unregistered-panel {
|
|
2637
|
+
width: 100%;
|
|
2638
|
+
height: 100%;
|
|
2639
|
+
display: flex;
|
|
2640
|
+
flex-direction: column;
|
|
2641
|
+
align-items: center;
|
|
2642
|
+
justify-content: center;
|
|
2643
|
+
background: transparent;
|
|
2644
|
+
color: #dc3545;
|
|
2645
|
+
font-family: monospace;
|
|
2646
|
+
padding: 1rem;
|
|
2647
|
+
text-align: center;
|
|
2648
|
+
box-sizing: border-box;
|
|
2649
|
+
}
|
|
2650
|
+
|
|
2651
|
+
/* Taskbar scrollable items row */
|
|
2652
|
+
.vdd-taskbar-items-container {
|
|
2653
|
+
display: flex;
|
|
2654
|
+
flex-direction: row;
|
|
2655
|
+
gap: 0.5rem;
|
|
2656
|
+
overflow-x: auto;
|
|
2657
|
+
align-items: center;
|
|
2658
|
+
margin: 0 0.5rem;
|
|
2659
|
+
padding: 2px 4px;
|
|
2660
|
+
scrollbar-width: none;
|
|
2661
|
+
scroll-snap-type: x mandatory;
|
|
2662
|
+
max-width: 800px;
|
|
2663
|
+
}
|
|
2664
|
+
|
|
2665
|
+
.vdd-taskbar-items-container::-webkit-scrollbar {
|
|
2666
|
+
display: none;
|
|
2667
|
+
}
|
|
2668
|
+
|
|
2669
|
+
/* Tooltip header row (title + close button) */
|
|
2670
|
+
.vdd-tooltip-header-row {
|
|
2671
|
+
display: flex;
|
|
2672
|
+
flex-direction: row;
|
|
2673
|
+
align-items: center;
|
|
2674
|
+
justify-content: space-between;
|
|
2675
|
+
width: 100%;
|
|
2676
|
+
gap: 0.75rem;
|
|
2677
|
+
padding: 0 0.25rem;
|
|
2678
|
+
}
|
|
2679
|
+
|
|
2680
|
+
/* Drag ghost tab preview (floating label while dragging) */
|
|
2681
|
+
.vdd-drag-ghost-tab {
|
|
2682
|
+
position: fixed;
|
|
2683
|
+
background: rgba(0, 0, 0, 0.8);
|
|
2684
|
+
border: 1px solid var(--vdd-accent-color, #38bdf8);
|
|
2685
|
+
border-left: 3px solid var(--vdd-accent-color, #38bdf8);
|
|
2686
|
+
border-radius: 4px;
|
|
2687
|
+
color: var(--vdd-accent-color, #38bdf8);
|
|
2688
|
+
font-family: monospace;
|
|
2689
|
+
padding: 0.375rem 1rem;
|
|
2690
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
|
|
2691
|
+
display: flex;
|
|
2692
|
+
align-items: center;
|
|
2693
|
+
gap: 0.5rem;
|
|
2694
|
+
font-size: 0.75rem;
|
|
2695
|
+
white-space: nowrap;
|
|
2696
|
+
pointer-events: none;
|
|
2697
|
+
}
|
|
2698
|
+
|
|
2699
|
+
/* ConfirmationForm component styles */
|
|
2700
|
+
.vdd-confirmation-form-body {
|
|
2701
|
+
padding: 0.75rem;
|
|
2702
|
+
display: flex;
|
|
2703
|
+
flex-direction: column;
|
|
2704
|
+
gap: 0.75rem;
|
|
2705
|
+
}
|
|
2706
|
+
|
|
2707
|
+
.vdd-confirmation-alert {
|
|
2708
|
+
display: flex;
|
|
2709
|
+
align-items: center;
|
|
2710
|
+
gap: 0.5rem;
|
|
2711
|
+
margin: 0;
|
|
2712
|
+
padding: 0.625rem;
|
|
2713
|
+
font-size: 0.875rem;
|
|
2714
|
+
border-radius: 0.375rem;
|
|
2715
|
+
}
|
|
2716
|
+
|
|
2717
|
+
.vdd-confirmation-alert-danger {
|
|
2718
|
+
background: rgba(220, 53, 69, 0.15);
|
|
2719
|
+
border: 1px solid rgba(220, 53, 69, 0.3);
|
|
2720
|
+
color: #f87171;
|
|
2721
|
+
}
|
|
2722
|
+
|
|
2723
|
+
.vdd-confirmation-alert-info {
|
|
2724
|
+
background: rgba(13, 202, 240, 0.15);
|
|
2725
|
+
border: 1px solid rgba(13, 202, 240, 0.3);
|
|
2726
|
+
color: #67e8f9;
|
|
2727
|
+
}
|
|
2728
|
+
|
|
2729
|
+
.vdd-confirmation-alert-warning {
|
|
2730
|
+
background: rgba(255, 193, 7, 0.15);
|
|
2731
|
+
border: 1px solid rgba(255, 193, 7, 0.3);
|
|
2732
|
+
color: #fbbf24;
|
|
2733
|
+
}
|
|
2734
|
+
|
|
2735
|
+
.vdd-confirmation-alert-success {
|
|
2736
|
+
background: rgba(25, 135, 84, 0.15);
|
|
2737
|
+
border: 1px solid rgba(25, 135, 84, 0.3);
|
|
2738
|
+
color: #4ade80;
|
|
2739
|
+
}
|
|
2740
|
+
|
|
2741
|
+
/* The message body. rdd set these three values inline on the JSX, together with an <hr>
|
|
2742
|
+
that existed only to draw a separator — so a consumer could restyle neither (D12). The
|
|
2743
|
+
separator is this element's own border-bottom, which is one element instead of two and
|
|
2744
|
+
leaves the spacing to the flex gap above. */
|
|
2745
|
+
.vdd-confirmation-message {
|
|
2746
|
+
font-size: 0.9rem;
|
|
2747
|
+
line-height: 1.5;
|
|
2748
|
+
color: inherit;
|
|
2749
|
+
padding-bottom: 0.5rem;
|
|
2750
|
+
border-bottom: 1px solid var(--vdd-sidebar-border, rgba(255, 255, 255, 0.08));
|
|
2751
|
+
}
|
|
2752
|
+
|
|
2753
|
+
.vdd-confirmation-actions {
|
|
2754
|
+
display: flex;
|
|
2755
|
+
justify-content: flex-end;
|
|
2756
|
+
gap: 0.5rem;
|
|
2757
|
+
}
|
|
2758
|
+
|
|
2759
|
+
/* Sidebar drawer header */
|
|
2760
|
+
.vdd-sidebar-drawer-header {
|
|
2761
|
+
display: flex;
|
|
2762
|
+
align-items: center;
|
|
2763
|
+
justify-content: space-between;
|
|
2764
|
+
border-bottom: 1px solid var(--vdd-sidebar-border, rgba(255, 255, 255, 0.08));
|
|
2765
|
+
padding: 0 0.75rem;
|
|
2766
|
+
flex-shrink: 0;
|
|
2767
|
+
background: var(--vdd-sidebar-drawer-header-bg);
|
|
2768
|
+
min-height: 38px;
|
|
2769
|
+
}
|
|
2770
|
+
|
|
2771
|
+
/* Optional close button (showCloseButton) — an extra way to collapse the sidebar besides
|
|
2772
|
+
clicking the active tab's own icon again. */
|
|
2773
|
+
.vdd-sidebar-drawer-close-button {
|
|
2774
|
+
background: transparent;
|
|
2775
|
+
border: none;
|
|
2776
|
+
color: var(--vdd-sidebar-text-muted, var(--vdd-text-secondary));
|
|
2777
|
+
cursor: pointer;
|
|
2778
|
+
padding: 4px;
|
|
2779
|
+
display: flex;
|
|
2780
|
+
align-items: center;
|
|
2781
|
+
justify-content: center;
|
|
2782
|
+
border-radius: 4px;
|
|
2783
|
+
transition: all 0.15s ease;
|
|
2784
|
+
flex-shrink: 0;
|
|
2785
|
+
}
|
|
2786
|
+
|
|
2787
|
+
.vdd-sidebar-drawer-close-button:hover {
|
|
2788
|
+
background-color: var(--vdd-sidebar-btn-hover-bg);
|
|
2789
|
+
color: var(--vdd-sidebar-text-title);
|
|
2790
|
+
}
|
|
2791
|
+
|
|
2792
|
+
/* Sidebar drawer content body */
|
|
2793
|
+
.vdd-sidebar-drawer-body {
|
|
2794
|
+
flex-grow: 1;
|
|
2795
|
+
overflow: auto;
|
|
2796
|
+
}
|
|
2797
|
+
|
|
2798
|
+
/* ==========================================================================
|
|
2799
|
+
TOOLBAR STRIP
|
|
2800
|
+
========================================================================== */
|
|
2801
|
+
|
|
2802
|
+
.vdd-toolbar-strip {
|
|
2803
|
+
background-color: var(--vdd-sidebar-tabs-bg);
|
|
2804
|
+
display: flex;
|
|
2805
|
+
align-items: center;
|
|
2806
|
+
flex-shrink: 0;
|
|
2807
|
+
z-index: 5;
|
|
2808
|
+
}
|
|
2809
|
+
|
|
2810
|
+
.vdd-toolbar-strip.vdd-left,
|
|
2811
|
+
.vdd-toolbar-strip.vdd-right {
|
|
2812
|
+
flex-direction: column;
|
|
2813
|
+
width: 48px;
|
|
2814
|
+
height: 100%;
|
|
2815
|
+
padding: 8px 0;
|
|
2816
|
+
gap: 4px;
|
|
2817
|
+
overflow: hidden;
|
|
2818
|
+
transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
|
2819
|
+
}
|
|
2820
|
+
|
|
2821
|
+
.vdd-toolbar-strip.vdd-top,
|
|
2822
|
+
.vdd-toolbar-strip.vdd-bottom {
|
|
2823
|
+
flex-direction: row;
|
|
2824
|
+
width: 100%;
|
|
2825
|
+
height: 48px;
|
|
2826
|
+
padding: 0 8px;
|
|
2827
|
+
gap: 4px;
|
|
2828
|
+
overflow: hidden;
|
|
2829
|
+
transition: height 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
|
2830
|
+
}
|
|
2831
|
+
|
|
2832
|
+
@media (pointer: coarse) {
|
|
2833
|
+
.vdd-toolbar-strip.vdd-left, .vdd-toolbar-strip.vdd-right { width: 56px; }
|
|
2834
|
+
.vdd-toolbar-strip.vdd-top, .vdd-toolbar-strip.vdd-bottom { height: 56px; }
|
|
2835
|
+
}
|
|
2836
|
+
|
|
2837
|
+
.vdd-toolbar-strip.vdd-left { border-right: 1px solid var(--vdd-sidebar-border); }
|
|
2838
|
+
.vdd-toolbar-strip.vdd-right { border-left: 1px solid var(--vdd-sidebar-border); }
|
|
2839
|
+
.vdd-toolbar-strip.vdd-top { border-bottom: 1px solid var(--vdd-sidebar-border); }
|
|
2840
|
+
.vdd-toolbar-strip.vdd-bottom{ border-top: 1px solid var(--vdd-sidebar-border); }
|
|
2841
|
+
|
|
2842
|
+
/* Base button */
|
|
2843
|
+
.vdd-toolbar-btn {
|
|
2844
|
+
width: 36px;
|
|
2845
|
+
height: 36px;
|
|
2846
|
+
display: flex;
|
|
2847
|
+
align-items: center;
|
|
2848
|
+
justify-content: center;
|
|
2849
|
+
background: transparent;
|
|
2850
|
+
border: 1px solid transparent;
|
|
2851
|
+
border-radius: 6px;
|
|
2852
|
+
color: var(--vdd-tab-icon-inactive);
|
|
2853
|
+
cursor: pointer;
|
|
2854
|
+
flex-shrink: 0;
|
|
2855
|
+
outline: none !important;
|
|
2856
|
+
position: relative;
|
|
2857
|
+
transition: color 0.15s ease, background-color 0.15s ease;
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2860
|
+
.vdd-toolbar-btn:hover:not(:disabled) {
|
|
2861
|
+
background-color: var(--vdd-toolbar-btn-hover-bg);
|
|
2862
|
+
color: var(--vdd-sidebar-text-title);
|
|
2863
|
+
}
|
|
2864
|
+
|
|
2865
|
+
.vdd-toolbar-btn:disabled {
|
|
2866
|
+
opacity: 0.35;
|
|
2867
|
+
cursor: not-allowed;
|
|
2868
|
+
}
|
|
2869
|
+
|
|
2870
|
+
/* Radio active — accent bar on the outer edge */
|
|
2871
|
+
.vdd-toolbar-btn-radio.vdd-active {
|
|
2872
|
+
color: var(--vdd-tab-icon-active);
|
|
2873
|
+
background-color: var(--vdd-toolbar-btn-radio-active-bg);
|
|
2874
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow, none);
|
|
2875
|
+
filter: var(--vdd-toolbar-btn-active-glow, none);
|
|
2876
|
+
transition: color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
|
|
2877
|
+
}
|
|
2878
|
+
|
|
2879
|
+
.vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-radio.vdd-active { border-left: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 0 6px 6px 0; }
|
|
2880
|
+
.vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-radio.vdd-active { border-right: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 6px 0 0 6px; }
|
|
2881
|
+
.vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-radio.vdd-active { border-bottom: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 6px 6px 0 0; }
|
|
2882
|
+
.vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-radio.vdd-active { border-top: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 0 0 6px 6px; }
|
|
2883
|
+
|
|
2884
|
+
/* Toggle active — lighter tint, no directional border */
|
|
2885
|
+
.vdd-toolbar-btn-toggle.vdd-active {
|
|
2886
|
+
color: var(--vdd-tab-icon-active);
|
|
2887
|
+
background-color: var(--vdd-toolbar-btn-toggle-active-bg);
|
|
2888
|
+
}
|
|
2889
|
+
|
|
2890
|
+
/* Group button — corner triangle indicator shows a sub-tool family */
|
|
2891
|
+
.vdd-toolbar-btn-group {
|
|
2892
|
+
position: relative;
|
|
2893
|
+
}
|
|
2894
|
+
|
|
2895
|
+
.vdd-toolbar-btn-group::after {
|
|
2896
|
+
content: '';
|
|
2897
|
+
position: absolute;
|
|
2898
|
+
bottom: 4px;
|
|
2899
|
+
right: 4px;
|
|
2900
|
+
width: 0;
|
|
2901
|
+
height: 0;
|
|
2902
|
+
border: 3.5px solid transparent;
|
|
2903
|
+
border-top-color: currentColor;
|
|
2904
|
+
border-right-color: currentColor;
|
|
2905
|
+
opacity: 0.55;
|
|
2906
|
+
}
|
|
2907
|
+
|
|
2908
|
+
/* Group active state — same directional accent as radio */
|
|
2909
|
+
.vdd-toolbar-btn-group.vdd-active {
|
|
2910
|
+
color: var(--vdd-tab-icon-active);
|
|
2911
|
+
background-color: var(--vdd-toolbar-btn-radio-active-bg);
|
|
2912
|
+
box-shadow: var(--vdd-toolbar-btn-active-shadow, none);
|
|
2913
|
+
filter: var(--vdd-toolbar-btn-active-glow, none);
|
|
2914
|
+
transition: color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2917
|
+
.vdd-toolbar-strip.vdd-left .vdd-toolbar-btn-group.vdd-active { border-left: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 0 6px 6px 0; }
|
|
2918
|
+
.vdd-toolbar-strip.vdd-right .vdd-toolbar-btn-group.vdd-active { border-right: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 6px 0 0 6px; }
|
|
2919
|
+
.vdd-toolbar-strip.vdd-top .vdd-toolbar-btn-group.vdd-active { border-bottom: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 6px 6px 0 0; }
|
|
2920
|
+
.vdd-toolbar-strip.vdd-bottom .vdd-toolbar-btn-group.vdd-active { border-top: var(--vdd-toolbar-accent-bar-width, 3px) solid var(--vdd-tab-icon-active); border-radius: 0 0 6px 6px; }
|
|
2921
|
+
|
|
2922
|
+
/* Separators */
|
|
2923
|
+
.vdd-toolbar-strip.vdd-left .vdd-toolbar-separator,
|
|
2924
|
+
.vdd-toolbar-strip.vdd-right .vdd-toolbar-separator {
|
|
2925
|
+
width: 24px;
|
|
2926
|
+
height: 1px;
|
|
2927
|
+
background-color: var(--vdd-toolbar-separator-color);
|
|
2928
|
+
flex-shrink: 0;
|
|
2929
|
+
margin: 4px 0;
|
|
2930
|
+
align-self: center;
|
|
2931
|
+
}
|
|
2932
|
+
|
|
2933
|
+
.vdd-toolbar-strip.vdd-top .vdd-toolbar-separator,
|
|
2934
|
+
.vdd-toolbar-strip.vdd-bottom .vdd-toolbar-separator {
|
|
2935
|
+
height: 24px;
|
|
2936
|
+
width: 1px;
|
|
2937
|
+
background-color: var(--vdd-toolbar-separator-color);
|
|
2938
|
+
flex-shrink: 0;
|
|
2939
|
+
margin: 0 4px;
|
|
2940
|
+
align-self: center;
|
|
2941
|
+
}
|
|
2942
|
+
|
|
2943
|
+
/* Touch targets on coarse-pointer devices */
|
|
2944
|
+
@media (pointer: coarse) {
|
|
2945
|
+
.vdd-toolbar-btn { width: 44px; height: 44px; }
|
|
2946
|
+
}
|
|
2947
|
+
|
|
2948
|
+
/* ==========================================================================
|
|
2949
|
+
TOOLBAR GROUP FLYOUT
|
|
2950
|
+
========================================================================== */
|
|
2951
|
+
|
|
2952
|
+
.vdd-toolbar-group-flyout {
|
|
2953
|
+
position: fixed;
|
|
2954
|
+
z-index: calc(var(--vdd-z-base, 1000) + 7000);
|
|
2955
|
+
background: var(--vdd-sidebar-bg, var(--vdd-bg-panel));
|
|
2956
|
+
border: 1px solid var(--vdd-sidebar-border);
|
|
2957
|
+
border-radius: 8px;
|
|
2958
|
+
padding: 4px;
|
|
2959
|
+
min-width: 168px;
|
|
2960
|
+
display: flex;
|
|
2961
|
+
flex-direction: column;
|
|
2962
|
+
gap: 1px;
|
|
2963
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
2964
|
+
animation: vdd-toolbar-flyout-in 0.12s cubic-bezier(0.16, 1, 0.3, 1);
|
|
2965
|
+
}
|
|
2966
|
+
|
|
2967
|
+
@keyframes vdd-toolbar-flyout-in {
|
|
2968
|
+
from { opacity: 0; transform: scale(0.95); }
|
|
2969
|
+
to { opacity: 1; transform: scale(1); }
|
|
2970
|
+
}
|
|
2971
|
+
|
|
2972
|
+
/* Animation origin matches the edge closest to the toolbar button */
|
|
2973
|
+
.vdd-toolbar-group-flyout.vdd-left { transform-origin: top left; }
|
|
2974
|
+
.vdd-toolbar-group-flyout.vdd-right { transform-origin: top right; }
|
|
2975
|
+
.vdd-toolbar-group-flyout.vdd-top { transform-origin: top left; }
|
|
2976
|
+
.vdd-toolbar-group-flyout.vdd-bottom { transform-origin: bottom left; }
|
|
2977
|
+
/* RTL: physical sides swap, so animation origin flips horizontally */
|
|
2978
|
+
[dir="rtl"] .vdd-toolbar-group-flyout.vdd-left { transform-origin: top right; }
|
|
2979
|
+
[dir="rtl"] .vdd-toolbar-group-flyout.vdd-right { transform-origin: top left; }
|
|
2980
|
+
[dir="rtl"] .vdd-toolbar-group-flyout.vdd-top { transform-origin: top right; }
|
|
2981
|
+
[dir="rtl"] .vdd-toolbar-group-flyout.vdd-bottom { transform-origin: bottom right; }
|
|
2982
|
+
|
|
2983
|
+
[dir="rtl"] .vdd-toolbar-group-flyout-label {
|
|
2984
|
+
text-align: right;
|
|
2985
|
+
}
|
|
2986
|
+
|
|
2987
|
+
.vdd-toolbar-group-flyout-item {
|
|
2988
|
+
display: flex;
|
|
2989
|
+
align-items: center;
|
|
2990
|
+
gap: 8px;
|
|
2991
|
+
padding: 5px 8px;
|
|
2992
|
+
border: 1px solid transparent;
|
|
2993
|
+
border-radius: 6px;
|
|
2994
|
+
background: transparent;
|
|
2995
|
+
color: var(--vdd-sidebar-text-title, var(--vdd-text-primary));
|
|
2996
|
+
cursor: pointer;
|
|
2997
|
+
width: 100%;
|
|
2998
|
+
text-align: start;
|
|
2999
|
+
font-size: 0.8125rem;
|
|
3000
|
+
font-family: inherit;
|
|
3001
|
+
flex-shrink: 0;
|
|
3002
|
+
transition: background-color 0.1s ease, color 0.1s ease;
|
|
3003
|
+
}
|
|
3004
|
+
|
|
3005
|
+
.vdd-toolbar-group-flyout-item:hover:not(:disabled) {
|
|
3006
|
+
background-color: var(--vdd-toolbar-btn-hover-bg);
|
|
3007
|
+
color: var(--vdd-sidebar-text-title, var(--vdd-text-primary));
|
|
3008
|
+
}
|
|
3009
|
+
|
|
3010
|
+
.vdd-toolbar-group-flyout-item:disabled {
|
|
3011
|
+
opacity: 0.35;
|
|
3012
|
+
cursor: not-allowed;
|
|
3013
|
+
}
|
|
3014
|
+
|
|
3015
|
+
.vdd-toolbar-group-flyout-item.vdd-active {
|
|
3016
|
+
color: var(--vdd-tab-icon-active);
|
|
3017
|
+
background-color: var(--vdd-toolbar-btn-radio-active-bg);
|
|
3018
|
+
}
|
|
3019
|
+
|
|
3020
|
+
.vdd-toolbar-group-flyout-icon {
|
|
3021
|
+
flex-shrink: 0;
|
|
3022
|
+
width: 16px;
|
|
3023
|
+
height: 16px;
|
|
3024
|
+
display: flex;
|
|
3025
|
+
align-items: center;
|
|
3026
|
+
justify-content: center;
|
|
3027
|
+
}
|
|
3028
|
+
|
|
3029
|
+
|
|
3030
|
+
.vdd-toolbar-group-flyout-label {
|
|
3031
|
+
flex: 1;
|
|
3032
|
+
white-space: nowrap;
|
|
3033
|
+
overflow: hidden;
|
|
3034
|
+
text-overflow: ellipsis;
|
|
3035
|
+
}
|
|
3036
|
+
|
|
3037
|
+
.vdd-toolbar-group-flyout-shortcut {
|
|
3038
|
+
flex-shrink: 0;
|
|
3039
|
+
font-size: 0.6875rem;
|
|
3040
|
+
color: var(--vdd-text-secondary);
|
|
3041
|
+
opacity: 0.7;
|
|
3042
|
+
}
|
|
3043
|
+
|
|
3044
|
+
.vdd-toolbar-group-flyout-sep {
|
|
3045
|
+
height: 1px;
|
|
3046
|
+
background: var(--vdd-toolbar-separator-color);
|
|
3047
|
+
margin: 3px 4px;
|
|
3048
|
+
flex-shrink: 0;
|
|
3049
|
+
}
|
|
3050
|
+
|
|
3051
|
+
|
|
3052
|
+
/* Button base — used in ConfirmationForm and similar dialogs */
|
|
3053
|
+
.vdd-btn {
|
|
3054
|
+
display: inline-flex;
|
|
3055
|
+
align-items: center;
|
|
3056
|
+
justify-content: center;
|
|
3057
|
+
font-family: monospace;
|
|
3058
|
+
font-weight: 500;
|
|
3059
|
+
cursor: pointer;
|
|
3060
|
+
border-radius: 4px;
|
|
3061
|
+
transition: all 0.15s ease;
|
|
3062
|
+
white-space: nowrap;
|
|
3063
|
+
user-select: none;
|
|
3064
|
+
line-height: 1.2;
|
|
3065
|
+
}
|
|
3066
|
+
|
|
3067
|
+
.vdd-btn-sm {
|
|
3068
|
+
padding: 0.25rem 0.75rem;
|
|
3069
|
+
font-size: 0.8125rem;
|
|
3070
|
+
}
|
|
3071
|
+
|
|
3072
|
+
.vdd-btn-outline {
|
|
3073
|
+
background: transparent;
|
|
3074
|
+
border: 1px solid var(--vdd-text-secondary, #6c757d);
|
|
3075
|
+
color: var(--vdd-text-secondary, #6c757d);
|
|
3076
|
+
}
|
|
3077
|
+
|
|
3078
|
+
.vdd-btn-outline:hover {
|
|
3079
|
+
background: rgba(255, 255, 255, 0.08);
|
|
3080
|
+
border-color: var(--vdd-text-primary, #f1f5f9);
|
|
3081
|
+
color: var(--vdd-text-primary, #f1f5f9);
|
|
3082
|
+
}
|
|
3083
|
+
|
|
3084
|
+
[data-color-scheme="light"] .vdd-btn-outline {
|
|
3085
|
+
border-color: #6c757d;
|
|
3086
|
+
color: #6c757d;
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
[data-color-scheme="light"] .vdd-btn-outline:hover {
|
|
3090
|
+
background: rgba(0, 0, 0, 0.05);
|
|
3091
|
+
border-color: #495057;
|
|
3092
|
+
color: #495057;
|
|
3093
|
+
}
|
|
3094
|
+
|
|
3095
|
+
.vdd-btn-primary {
|
|
3096
|
+
background: var(--vdd-accent-color, #38bdf8);
|
|
3097
|
+
border: 1px solid var(--vdd-accent-color, #38bdf8);
|
|
3098
|
+
color: #090b11;
|
|
3099
|
+
}
|
|
3100
|
+
|
|
3101
|
+
.vdd-btn-primary:hover {
|
|
3102
|
+
filter: brightness(1.1);
|
|
3103
|
+
}
|
|
3104
|
+
|
|
3105
|
+
[data-color-scheme="light"] .vdd-btn-primary {
|
|
3106
|
+
color: #ffffff;
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3109
|
+
/* ============================================================
|
|
3110
|
+
TOUCH SUPPORT (Phase 1C, 2A–B, 3B, 4A, 4C)
|
|
3111
|
+
============================================================ */
|
|
3112
|
+
|
|
3113
|
+
/* Phase 1C: touch-action — suppress scroll on drag handles,
|
|
3114
|
+
allow horizontal pan on tab bar */
|
|
3115
|
+
.vdd-workspace-tab { touch-action: none; }
|
|
3116
|
+
.vdd-floating-window-titlebar { touch-action: none; }
|
|
3117
|
+
.vdd-resizer-bar { touch-action: none; }
|
|
3118
|
+
.vdd-resize-handle { touch-action: none; }
|
|
3119
|
+
|
|
3120
|
+
/* Phase 2A: Expand resizer hit area to 44px on touch devices */
|
|
3121
|
+
@media (pointer: coarse) {
|
|
3122
|
+
.vdd-resizer-bar[style*="cursor: col-resize"]::before {
|
|
3123
|
+
left: -20px;
|
|
3124
|
+
width: 44px;
|
|
3125
|
+
}
|
|
3126
|
+
.vdd-resizer-bar[style*="cursor: row-resize"]::before {
|
|
3127
|
+
top: -32px;
|
|
3128
|
+
height: 33px; /* 32px upward into safe content area, 0px downward into tab bar */
|
|
3129
|
+
}
|
|
3130
|
+
}
|
|
3131
|
+
|
|
3132
|
+
/* Phase 3B: 8-direction resize handles on floating windows */
|
|
3133
|
+
.vdd-resize-handle {
|
|
3134
|
+
position: absolute;
|
|
3135
|
+
z-index: 30;
|
|
3136
|
+
}
|
|
3137
|
+
|
|
3138
|
+
/*
|
|
3139
|
+
* Resize handles sit fully INSIDE their window.
|
|
3140
|
+
*
|
|
3141
|
+
* rdd positions every handle at `-4px`, straddling the edge for an 8px grab area — but the
|
|
3142
|
+
* elements that carry them (`.rdd-floating-window`, `.rdd-panel-float`) are `overflow:
|
|
3143
|
+
* hidden`, which clips the outer half away. Measured in Chrome: an 8px edge handle leaves
|
|
3144
|
+
* ~4px hittable, a 16px corner handle leaves ~12px, and at the extreme corner the window's
|
|
3145
|
+
* own `border-radius` means *nothing* is hit at all — the click falls straight through to
|
|
3146
|
+
* the grid behind, so a corner drag does nothing.
|
|
3147
|
+
*
|
|
3148
|
+
* Insetting to 0 makes the whole nominal area hittable. The trade is that you cannot grab
|
|
3149
|
+
* from just outside the window; in exchange, every pixel of the handle works, which it did
|
|
3150
|
+
* not before. See docs/PARITY.md divergence D5.
|
|
3151
|
+
*/
|
|
3152
|
+
|
|
3153
|
+
/* Edge handles */
|
|
3154
|
+
.vdd-resize-n { top: 0; left: 16px; right: 16px; height: 8px; cursor: n-resize; }
|
|
3155
|
+
.vdd-resize-s { bottom: 0; left: 16px; right: 16px; height: 8px; cursor: s-resize; }
|
|
3156
|
+
.vdd-resize-e { right: 0; top: 16px; bottom: 16px; width: 8px; cursor: e-resize; }
|
|
3157
|
+
.vdd-resize-w { left: 0; top: 16px; bottom: 16px; width: 8px; cursor: w-resize; }
|
|
3158
|
+
|
|
3159
|
+
/* Corner handles */
|
|
3160
|
+
.vdd-resize-ne { top: 0; right: 0; width: 16px; height: 16px; cursor: ne-resize; }
|
|
3161
|
+
.vdd-resize-se { bottom: 0; right: 0; width: 16px; height: 16px; cursor: se-resize; }
|
|
3162
|
+
.vdd-resize-sw { bottom: 0; left: 0; width: 16px; height: 16px; cursor: sw-resize; }
|
|
3163
|
+
.vdd-resize-nw { top: 0; left: 0; width: 16px; height: 16px; cursor: nw-resize; }
|
|
3164
|
+
|
|
3165
|
+
/* SE corner subtle visual indicator (preserve existing look) */
|
|
3166
|
+
.vdd-resize-se::after {
|
|
3167
|
+
content: '';
|
|
3168
|
+
position: absolute;
|
|
3169
|
+
inset: 0;
|
|
3170
|
+
background: linear-gradient(135deg, transparent 50%, rgba(255,255,255,0.2) 50%);
|
|
3171
|
+
}
|
|
3172
|
+
|
|
3173
|
+
/*
|
|
3174
|
+
* Touch: larger hit areas — still fully inside the box.
|
|
3175
|
+
*
|
|
3176
|
+
* rdd enlarges these to 12px but positions them at -6px, so `overflow: hidden` clips half of
|
|
3177
|
+
* the enlargement away: the intent is 12px and the reality is 6px, on exactly the devices
|
|
3178
|
+
* that need a *bigger* target. The enlargement is kept and the insets are zeroed, so the
|
|
3179
|
+
* whole 12px is grabbable. Same reasoning as the handle note above; see PARITY.md D5.
|
|
3180
|
+
*/
|
|
3181
|
+
@media (pointer: coarse) {
|
|
3182
|
+
.vdd-resize-ne, .vdd-resize-se, .vdd-resize-sw, .vdd-resize-nw {
|
|
3183
|
+
width: 28px;
|
|
3184
|
+
height: 28px;
|
|
3185
|
+
}
|
|
3186
|
+
.vdd-resize-n, .vdd-resize-s {
|
|
3187
|
+
left: 28px;
|
|
3188
|
+
right: 28px;
|
|
3189
|
+
height: 12px;
|
|
3190
|
+
top: 0;
|
|
3191
|
+
}
|
|
3192
|
+
.vdd-resize-s { top: auto; bottom: 0; }
|
|
3193
|
+
.vdd-resize-e, .vdd-resize-w {
|
|
3194
|
+
top: 28px;
|
|
3195
|
+
bottom: 28px;
|
|
3196
|
+
width: 12px;
|
|
3197
|
+
right: 0;
|
|
3198
|
+
}
|
|
3199
|
+
.vdd-resize-w { right: auto; left: 0; }
|
|
3200
|
+
}
|
|
3201
|
+
|
|
3202
|
+
/* Phase 2B: Adaptive density for coarse-pointer (touch) devices */
|
|
3203
|
+
@media (pointer: coarse) {
|
|
3204
|
+
/* Taller tabs for touch targets */
|
|
3205
|
+
.vdd-workspace-tab {
|
|
3206
|
+
min-height: 44px !important;
|
|
3207
|
+
height: 44px !important;
|
|
3208
|
+
padding: 0 12px 0 14px !important;
|
|
3209
|
+
}
|
|
3210
|
+
|
|
3211
|
+
/* Always-visible close button (no hover-to-reveal) */
|
|
3212
|
+
.vdd-workspace-tab .vdd-close-tab-x {
|
|
3213
|
+
opacity: 0.8 !important;
|
|
3214
|
+
width: 24px !important;
|
|
3215
|
+
height: 24px !important;
|
|
3216
|
+
}
|
|
3217
|
+
|
|
3218
|
+
/* Larger titlebar action buttons */
|
|
3219
|
+
.vdd-custom-tab-btn {
|
|
3220
|
+
width: 28px !important;
|
|
3221
|
+
height: 28px !important;
|
|
3222
|
+
}
|
|
3223
|
+
|
|
3224
|
+
/* Taller taskbar items */
|
|
3225
|
+
.vdd-taskbar-glassmorphic-item {
|
|
3226
|
+
width: 48px !important;
|
|
3227
|
+
height: 48px !important;
|
|
3228
|
+
}
|
|
3229
|
+
|
|
3230
|
+
/* Wider tab min-width on touch */
|
|
3231
|
+
.vdd-workspace-tab { min-width: 88px; }
|
|
3232
|
+
|
|
3233
|
+
/* Wider scroll arrows on touch */
|
|
3234
|
+
|
|
3235
|
+
/* Keep top edge trigger thin even on touch — avoids collision with tab bar */
|
|
3236
|
+
.vdd-edge-trigger-top { height: 14px; }
|
|
3237
|
+
}
|
|
3238
|
+
|
|
3239
|
+
/* Phase 4A: Long-press active animation (visual feedback during 300ms hold) */
|
|
3240
|
+
.vdd-long-press-active {
|
|
3241
|
+
animation: vdd-long-press-pulse 0.25s ease-out forwards;
|
|
3242
|
+
transform-origin: center;
|
|
3243
|
+
}
|
|
3244
|
+
|
|
3245
|
+
@keyframes vdd-long-press-pulse {
|
|
3246
|
+
0% { transform: scale(1); box-shadow: 0 0 0 0 var(--vdd-accent-glow, rgba(56,189,248,0.3)); }
|
|
3247
|
+
60% { transform: scale(1.04); box-shadow: 0 0 0 6px var(--vdd-accent-glow, rgba(56,189,248,0.15)); }
|
|
3248
|
+
100% { transform: scale(1.02); box-shadow: 0 0 0 4px var(--vdd-accent-glow, rgba(56,189,248,0.1)); }
|
|
3249
|
+
}
|
|
3250
|
+
|
|
3251
|
+
/* Phase 4C: Tab bar horizontal scroll (handled by existing .vdd-tab-headers-container overflow-x: auto) */
|
|
3252
|
+
/* Note: touch-action and -webkit-overflow-scrolling intentionally omitted — they cause iOS Safari
|
|
3253
|
+
to fire pointercancel before the 300ms long-press timer can activate tab drag */
|
|
3254
|
+
.vdd-tab-headers-container::-webkit-scrollbar { display: none; }
|
|
3255
|
+
|
|
3256
|
+
/* ==========================================================================
|
|
3257
|
+
PANEL OVERLAY — Per-skin token overrides
|
|
3258
|
+
========================================================================== */
|
|
3259
|
+
|
|
3260
|
+
[data-workspace-skin="vscode"] {
|
|
3261
|
+
--vdd-panel-toolbar-btn-hover-bg: rgba(255, 255, 255, 0.12);
|
|
3262
|
+
}
|
|
3263
|
+
|
|
3264
|
+
[data-workspace-skin="macos"] {
|
|
3265
|
+
--vdd-panel-toolbar-btn-hover-bg: rgba(255, 255, 255, 0.18);
|
|
3266
|
+
}
|
|
3267
|
+
|
|
3268
|
+
[data-workspace-skin="slate"] {
|
|
3269
|
+
--vdd-panel-toolbar-btn-active-color: #60a5fa;
|
|
3270
|
+
--vdd-panel-toolbar-btn-active-bg: rgba(96, 165, 250, 0.15);
|
|
3271
|
+
}
|
|
3272
|
+
|
|
3273
|
+
[data-workspace-skin="nord"] {
|
|
3274
|
+
--vdd-panel-toolbar-btn-active-color: #88c0d0;
|
|
3275
|
+
--vdd-panel-toolbar-btn-active-bg: rgba(136, 192, 208, 0.15);
|
|
3276
|
+
}
|
|
3277
|
+
|
|
3278
|
+
[data-workspace-skin="obsidian"] {
|
|
3279
|
+
--vdd-panel-toolbar-btn-active-color: #a78bfa;
|
|
3280
|
+
--vdd-panel-toolbar-btn-active-bg: rgba(167, 139, 250, 0.15);
|
|
3281
|
+
}
|
|
3282
|
+
|
|
3283
|
+
[data-workspace-skin="tokyo"] {
|
|
3284
|
+
--vdd-panel-toolbar-btn-active-color: #7aa2f7;
|
|
3285
|
+
--vdd-panel-toolbar-btn-active-bg: rgba(122, 162, 247, 0.15);
|
|
3286
|
+
}
|
|
3287
|
+
|
|
3288
|
+
/* ==========================================================================
|
|
3289
|
+
PANEL OVERLAY — PanelToolbar + PanelFloatingWindow
|
|
3290
|
+
========================================================================== */
|
|
3291
|
+
|
|
3292
|
+
/* ── Root container ── */
|
|
3293
|
+
.vdd-panel-overlay-root {
|
|
3294
|
+
position: relative;
|
|
3295
|
+
width: 100%;
|
|
3296
|
+
height: 100%;
|
|
3297
|
+
overflow: hidden;
|
|
3298
|
+
}
|
|
3299
|
+
|
|
3300
|
+
/* ── Toolbar container ── */
|
|
3301
|
+
.vdd-panel-toolbar {
|
|
3302
|
+
position: absolute;
|
|
3303
|
+
z-index: 5;
|
|
3304
|
+
pointer-events: none;
|
|
3305
|
+
display: flex;
|
|
3306
|
+
align-items: center;
|
|
3307
|
+
gap: var(--vdd-panel-toolbar-gap, 4px);
|
|
3308
|
+
padding: var(--vdd-panel-toolbar-padding, 8px);
|
|
3309
|
+
box-sizing: border-box;
|
|
3310
|
+
}
|
|
3311
|
+
|
|
3312
|
+
.vdd-panel-toolbar--top,
|
|
3313
|
+
.vdd-panel-toolbar--bottom {
|
|
3314
|
+
flex-direction: row;
|
|
3315
|
+
}
|
|
3316
|
+
|
|
3317
|
+
.vdd-panel-toolbar--left,
|
|
3318
|
+
.vdd-panel-toolbar--right {
|
|
3319
|
+
flex-direction: column;
|
|
3320
|
+
}
|
|
3321
|
+
|
|
3322
|
+
/* Restore pointer-events on every direct child */
|
|
3323
|
+
.vdd-panel-toolbar > * {
|
|
3324
|
+
pointer-events: auto;
|
|
3325
|
+
}
|
|
3326
|
+
|
|
3327
|
+
/* ── Toolbar button (shared by ToolbarButton + ToolbarToggle) ── */
|
|
3328
|
+
.vdd-panel-toolbar-btn {
|
|
3329
|
+
display: inline-flex;
|
|
3330
|
+
align-items: center;
|
|
3331
|
+
justify-content: center;
|
|
3332
|
+
width: var(--vdd-panel-toolbar-btn-size, 32px);
|
|
3333
|
+
height: var(--vdd-panel-toolbar-btn-size, 32px);
|
|
3334
|
+
flex-shrink: 0;
|
|
3335
|
+
border-radius: var(--vdd-panel-toolbar-btn-radius, 6px);
|
|
3336
|
+
border: none;
|
|
3337
|
+
background: transparent;
|
|
3338
|
+
color: var(--vdd-panel-toolbar-fg, rgba(255, 255, 255, 0.65));
|
|
3339
|
+
cursor: pointer;
|
|
3340
|
+
padding: 0;
|
|
3341
|
+
transition: background 0.12s ease, color 0.12s ease, transform 0.1s ease, border-color 0.12s ease;
|
|
3342
|
+
}
|
|
3343
|
+
|
|
3344
|
+
.vdd-panel-toolbar-btn:hover:not(:disabled) {
|
|
3345
|
+
background: var(--vdd-panel-toolbar-btn-hover-bg, rgba(255, 255, 255, 0.15));
|
|
3346
|
+
color: var(--vdd-panel-toolbar-fg-hover, rgba(255, 255, 255, 0.95));
|
|
3347
|
+
transform: scale(1.07);
|
|
3348
|
+
}
|
|
3349
|
+
|
|
3350
|
+
.vdd-panel-toolbar-btn:active:not(:disabled) {
|
|
3351
|
+
transform: scale(0.94);
|
|
3352
|
+
}
|
|
3353
|
+
|
|
3354
|
+
.vdd-panel-toolbar-btn--active {
|
|
3355
|
+
background: var(--vdd-panel-toolbar-btn-active-bg, rgba(56, 189, 248, 0.14));
|
|
3356
|
+
color: var(--vdd-panel-toolbar-btn-active-color, #38bdf8);
|
|
3357
|
+
}
|
|
3358
|
+
|
|
3359
|
+
.vdd-panel-toolbar-btn--active:hover:not(:disabled) {
|
|
3360
|
+
background: var(--vdd-panel-toolbar-btn-active-bg, rgba(56, 189, 248, 0.22));
|
|
3361
|
+
}
|
|
3362
|
+
|
|
3363
|
+
.vdd-panel-toolbar-btn:disabled {
|
|
3364
|
+
opacity: 0.38;
|
|
3365
|
+
cursor: not-allowed;
|
|
3366
|
+
}
|
|
3367
|
+
|
|
3368
|
+
/* ── Toolbar strip variants ── */
|
|
3369
|
+
.vdd-panel-toolbar[data-variant="frosted"] {
|
|
3370
|
+
background: rgba(15, 20, 30, 0.55);
|
|
3371
|
+
backdrop-filter: blur(10px) saturate(150%);
|
|
3372
|
+
-webkit-backdrop-filter: blur(10px) saturate(150%);
|
|
3373
|
+
}
|
|
3374
|
+
.vdd-panel-toolbar[data-variant="solid"] {
|
|
3375
|
+
background: var(--vdd-bg-tab-bar, #0d0f16);
|
|
3376
|
+
}
|
|
3377
|
+
[data-color-scheme="light"] .vdd-panel-toolbar[data-variant="frosted"] {
|
|
3378
|
+
background: rgba(233, 236, 239, 0.72);
|
|
3379
|
+
}
|
|
3380
|
+
.vdd-panel-toolbar--top[data-variant="frosted"],
|
|
3381
|
+
.vdd-panel-toolbar--top[data-variant="solid"] {
|
|
3382
|
+
border-bottom: 1px solid var(--vdd-panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
|
|
3383
|
+
}
|
|
3384
|
+
.vdd-panel-toolbar--bottom[data-variant="frosted"],
|
|
3385
|
+
.vdd-panel-toolbar--bottom[data-variant="solid"] {
|
|
3386
|
+
border-top: 1px solid var(--vdd-panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
|
|
3387
|
+
}
|
|
3388
|
+
.vdd-panel-toolbar--left[data-variant="frosted"],
|
|
3389
|
+
.vdd-panel-toolbar--left[data-variant="solid"] {
|
|
3390
|
+
border-right: 1px solid var(--vdd-panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
|
|
3391
|
+
}
|
|
3392
|
+
.vdd-panel-toolbar--right[data-variant="frosted"],
|
|
3393
|
+
.vdd-panel-toolbar--right[data-variant="solid"] {
|
|
3394
|
+
border-left: 1px solid var(--vdd-panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
|
|
3395
|
+
}
|
|
3396
|
+
|
|
3397
|
+
/* ── Button variants — toolbar-level default ── */
|
|
3398
|
+
|
|
3399
|
+
/* soft */
|
|
3400
|
+
.vdd-panel-toolbar[data-btn-variant="soft"] .vdd-panel-toolbar-btn,
|
|
3401
|
+
.vdd-panel-toolbar-btn[data-variant="soft"] {
|
|
3402
|
+
background: rgba(255, 255, 255, 0.06);
|
|
3403
|
+
}
|
|
3404
|
+
.vdd-panel-toolbar[data-btn-variant="soft"] .vdd-panel-toolbar-btn:hover:not(:disabled),
|
|
3405
|
+
.vdd-panel-toolbar-btn[data-variant="soft"]:hover:not(:disabled) {
|
|
3406
|
+
background: rgba(255, 255, 255, 0.15);
|
|
3407
|
+
}
|
|
3408
|
+
[data-color-scheme="light"] .vdd-panel-toolbar[data-btn-variant="soft"] .vdd-panel-toolbar-btn,
|
|
3409
|
+
[data-color-scheme="light"] .vdd-panel-toolbar-btn[data-variant="soft"] {
|
|
3410
|
+
background: rgba(0, 0, 0, 0.04);
|
|
3411
|
+
}
|
|
3412
|
+
[data-color-scheme="light"] .vdd-panel-toolbar[data-btn-variant="soft"] .vdd-panel-toolbar-btn:hover:not(:disabled),
|
|
3413
|
+
[data-color-scheme="light"] .vdd-panel-toolbar-btn[data-variant="soft"]:hover:not(:disabled) {
|
|
3414
|
+
background: rgba(0, 0, 0, 0.08);
|
|
3415
|
+
}
|
|
3416
|
+
|
|
3417
|
+
/* outlined */
|
|
3418
|
+
.vdd-panel-toolbar[data-btn-variant="outlined"] .vdd-panel-toolbar-btn,
|
|
3419
|
+
.vdd-panel-toolbar-btn[data-variant="outlined"] {
|
|
3420
|
+
border: 1px solid var(--vdd-panel-toolbar-separator-color, rgba(255, 255, 255, 0.18));
|
|
3421
|
+
}
|
|
3422
|
+
.vdd-panel-toolbar[data-btn-variant="outlined"] .vdd-panel-toolbar-btn:hover:not(:disabled),
|
|
3423
|
+
.vdd-panel-toolbar-btn[data-variant="outlined"]:hover:not(:disabled) {
|
|
3424
|
+
background: rgba(255, 255, 255, 0.12);
|
|
3425
|
+
border-color: rgba(255, 255, 255, 0.38);
|
|
3426
|
+
}
|
|
3427
|
+
[data-color-scheme="light"] .vdd-panel-toolbar[data-btn-variant="outlined"] .vdd-panel-toolbar-btn:hover:not(:disabled),
|
|
3428
|
+
[data-color-scheme="light"] .vdd-panel-toolbar-btn[data-variant="outlined"]:hover:not(:disabled) {
|
|
3429
|
+
background: rgba(0, 0, 0, 0.06);
|
|
3430
|
+
border-color: rgba(0, 0, 0, 0.25);
|
|
3431
|
+
}
|
|
3432
|
+
|
|
3433
|
+
/* filled */
|
|
3434
|
+
.vdd-panel-toolbar[data-btn-variant="filled"] .vdd-panel-toolbar-btn,
|
|
3435
|
+
.vdd-panel-toolbar-btn[data-variant="filled"] {
|
|
3436
|
+
background: var(--vdd-panel-toolbar-btn-active-bg, rgba(56, 189, 248, 0.2));
|
|
3437
|
+
color: var(--vdd-panel-toolbar-btn-active-color, #38bdf8);
|
|
3438
|
+
border: 1px solid var(--vdd-panel-toolbar-btn-active-color, #38bdf8);
|
|
3439
|
+
}
|
|
3440
|
+
.vdd-panel-toolbar[data-btn-variant="filled"] .vdd-panel-toolbar-btn:hover:not(:disabled),
|
|
3441
|
+
.vdd-panel-toolbar-btn[data-variant="filled"]:hover:not(:disabled) {
|
|
3442
|
+
background: var(--vdd-panel-toolbar-btn-active-color, #38bdf8);
|
|
3443
|
+
color: #000;
|
|
3444
|
+
border-color: transparent;
|
|
3445
|
+
}
|
|
3446
|
+
|
|
3447
|
+
/* ── Separator ── */
|
|
3448
|
+
.vdd-panel-toolbar__sep {
|
|
3449
|
+
flex-shrink: 0;
|
|
3450
|
+
background: var(--vdd-panel-toolbar-separator-color, rgba(255, 255, 255, 0.09));
|
|
3451
|
+
align-self: center;
|
|
3452
|
+
}
|
|
3453
|
+
|
|
3454
|
+
.vdd-panel-toolbar--top .vdd-panel-toolbar__sep,
|
|
3455
|
+
.vdd-panel-toolbar--bottom .vdd-panel-toolbar__sep {
|
|
3456
|
+
width: 1px;
|
|
3457
|
+
height: 18px;
|
|
3458
|
+
}
|
|
3459
|
+
|
|
3460
|
+
.vdd-panel-toolbar--left .vdd-panel-toolbar__sep,
|
|
3461
|
+
.vdd-panel-toolbar--right .vdd-panel-toolbar__sep {
|
|
3462
|
+
height: 1px;
|
|
3463
|
+
width: 18px;
|
|
3464
|
+
}
|
|
3465
|
+
|
|
3466
|
+
/* ── Spacer — pushes subsequent items to the opposite end ── */
|
|
3467
|
+
.vdd-panel-toolbar__spacer {
|
|
3468
|
+
flex: 1;
|
|
3469
|
+
pointer-events: none;
|
|
3470
|
+
}
|
|
3471
|
+
|
|
3472
|
+
/* ── ToolbarItem wrapper (restores pointer-events for custom controls) ── */
|
|
3473
|
+
.vdd-panel-toolbar__item {
|
|
3474
|
+
display: inline-flex;
|
|
3475
|
+
align-items: center;
|
|
3476
|
+
pointer-events: auto;
|
|
3477
|
+
}
|
|
3478
|
+
|
|
3479
|
+
/* ── ToolbarCenter — absolutely centered, independent of left/right widths ── */
|
|
3480
|
+
.vdd-panel-toolbar__center {
|
|
3481
|
+
position: absolute;
|
|
3482
|
+
display: flex;
|
|
3483
|
+
align-items: center;
|
|
3484
|
+
gap: var(--vdd-panel-toolbar-gap, 4px);
|
|
3485
|
+
pointer-events: none;
|
|
3486
|
+
}
|
|
3487
|
+
.vdd-panel-toolbar__center > * {
|
|
3488
|
+
pointer-events: auto;
|
|
3489
|
+
}
|
|
3490
|
+
/* Horizontal toolbars: center horizontally */
|
|
3491
|
+
.vdd-panel-toolbar--top .vdd-panel-toolbar__center,
|
|
3492
|
+
.vdd-panel-toolbar--bottom .vdd-panel-toolbar__center {
|
|
3493
|
+
flex-direction: row;
|
|
3494
|
+
top: 0;
|
|
3495
|
+
bottom: 0;
|
|
3496
|
+
left: 50%;
|
|
3497
|
+
transform: translateX(-50%);
|
|
3498
|
+
}
|
|
3499
|
+
/* Vertical toolbars: center vertically */
|
|
3500
|
+
.vdd-panel-toolbar--left .vdd-panel-toolbar__center,
|
|
3501
|
+
.vdd-panel-toolbar--right .vdd-panel-toolbar__center {
|
|
3502
|
+
flex-direction: column;
|
|
3503
|
+
left: 0;
|
|
3504
|
+
right: 0;
|
|
3505
|
+
top: 50%;
|
|
3506
|
+
transform: translateY(-50%);
|
|
3507
|
+
}
|
|
3508
|
+
|
|
3509
|
+
/* ── ToolbarSearchInput ── */
|
|
3510
|
+
.vdd-panel-toolbar-search {
|
|
3511
|
+
display: inline-flex;
|
|
3512
|
+
align-items: center;
|
|
3513
|
+
gap: 4px;
|
|
3514
|
+
}
|
|
3515
|
+
|
|
3516
|
+
.vdd-panel-toolbar-search__input {
|
|
3517
|
+
height: var(--vdd-panel-toolbar-btn-size, 28px);
|
|
3518
|
+
width: 200px;
|
|
3519
|
+
border: 1px solid var(--vdd-panel-toolbar-separator-color, rgba(255, 255, 255, 0.15));
|
|
3520
|
+
border-radius: var(--vdd-panel-toolbar-btn-radius, 6px);
|
|
3521
|
+
background: rgba(0, 0, 0, 0.18);
|
|
3522
|
+
color: inherit;
|
|
3523
|
+
padding: 0 8px;
|
|
3524
|
+
font-size: 12px;
|
|
3525
|
+
outline: none;
|
|
3526
|
+
box-sizing: border-box;
|
|
3527
|
+
}
|
|
3528
|
+
|
|
3529
|
+
.vdd-panel-toolbar-search__input::placeholder {
|
|
3530
|
+
opacity: 0.45;
|
|
3531
|
+
}
|
|
3532
|
+
|
|
3533
|
+
.vdd-panel-toolbar-search__input:focus {
|
|
3534
|
+
border-color: var(--vdd-panel-toolbar-btn-active-color, #38bdf8);
|
|
3535
|
+
}
|
|
3536
|
+
|
|
3537
|
+
.vdd-panel-toolbar-search__dropdown {
|
|
3538
|
+
/* Shifts with --vdd-z-base like every other chrome overlay; above the context menu
|
|
3539
|
+
(+8500/+8501) since it's opened from a toolbar that can sit under one. */
|
|
3540
|
+
z-index: calc(var(--vdd-z-base, 1000) + 8502);
|
|
3541
|
+
background: var(--vdd-panel-float-bg, rgba(22, 24, 34, 0.95));
|
|
3542
|
+
border: 1px solid var(--vdd-panel-float-border, rgba(255, 255, 255, 0.1));
|
|
3543
|
+
border-radius: var(--vdd-panel-float-radius, 8px);
|
|
3544
|
+
box-shadow: var(--vdd-panel-float-shadow-active, 0 8px 28px rgba(0, 0, 0, 0.55));
|
|
3545
|
+
overflow: hidden;
|
|
3546
|
+
max-height: 300px;
|
|
3547
|
+
overflow-y: auto;
|
|
3548
|
+
}
|
|
3549
|
+
|
|
3550
|
+
.vdd-panel-toolbar-search__group {
|
|
3551
|
+
padding: 6px 12px 2px;
|
|
3552
|
+
font-size: 10px;
|
|
3553
|
+
font-weight: 600;
|
|
3554
|
+
text-transform: uppercase;
|
|
3555
|
+
letter-spacing: 0.05em;
|
|
3556
|
+
opacity: 0.45;
|
|
3557
|
+
}
|
|
3558
|
+
|
|
3559
|
+
.vdd-panel-toolbar-search__item {
|
|
3560
|
+
display: flex;
|
|
3561
|
+
align-items: center;
|
|
3562
|
+
gap: 8px;
|
|
3563
|
+
width: 100%;
|
|
3564
|
+
padding: 7px 12px;
|
|
3565
|
+
border: none;
|
|
3566
|
+
background: transparent;
|
|
3567
|
+
color: inherit;
|
|
3568
|
+
text-align: start;
|
|
3569
|
+
cursor: pointer;
|
|
3570
|
+
font-size: 12px;
|
|
3571
|
+
}
|
|
3572
|
+
|
|
3573
|
+
.vdd-panel-toolbar-search__item:hover {
|
|
3574
|
+
background: var(--vdd-panel-toolbar-btn-hover-bg, rgba(255, 255, 255, 0.08));
|
|
3575
|
+
}
|
|
3576
|
+
|
|
3577
|
+
.vdd-panel-toolbar-search__item-icon { flex-shrink: 0; opacity: 0.7; }
|
|
3578
|
+
.vdd-panel-toolbar-search__item-label { flex: 1; }
|
|
3579
|
+
.vdd-panel-toolbar-search__item-desc { opacity: 0.45; font-size: 11px; }
|
|
3580
|
+
|
|
3581
|
+
/* ── Floating window ── */
|
|
3582
|
+
.vdd-panel-float {
|
|
3583
|
+
position: absolute;
|
|
3584
|
+
min-width: 120px;
|
|
3585
|
+
min-height: 60px;
|
|
3586
|
+
display: flex;
|
|
3587
|
+
flex-direction: column;
|
|
3588
|
+
border-radius: var(--vdd-panel-float-radius, 8px);
|
|
3589
|
+
background: var(--vdd-panel-float-bg, rgba(22, 24, 34, 0.92));
|
|
3590
|
+
border: 1px solid var(--vdd-panel-float-border, rgba(255, 255, 255, 0.1));
|
|
3591
|
+
box-shadow: var(--vdd-panel-float-shadow, 0 4px 16px rgba(0, 0, 0, 0.35));
|
|
3592
|
+
backdrop-filter: blur(8px);
|
|
3593
|
+
overflow: hidden;
|
|
3594
|
+
}
|
|
3595
|
+
|
|
3596
|
+
.vdd-panel-float--active {
|
|
3597
|
+
box-shadow: var(--vdd-panel-float-shadow-active, 0 8px 28px rgba(0, 0, 0, 0.55));
|
|
3598
|
+
}
|
|
3599
|
+
|
|
3600
|
+
.vdd-panel-float__header {
|
|
3601
|
+
display: flex;
|
|
3602
|
+
align-items: center;
|
|
3603
|
+
gap: 6px;
|
|
3604
|
+
padding: 0 8px;
|
|
3605
|
+
height: 28px;
|
|
3606
|
+
flex-shrink: 0;
|
|
3607
|
+
background: var(--vdd-panel-float-header-bg, rgba(255, 255, 255, 0.04));
|
|
3608
|
+
cursor: grab;
|
|
3609
|
+
user-select: none;
|
|
3610
|
+
}
|
|
3611
|
+
|
|
3612
|
+
.vdd-panel-float__header:active {
|
|
3613
|
+
cursor: grabbing;
|
|
3614
|
+
}
|
|
3615
|
+
|
|
3616
|
+
.vdd-panel-float--active .vdd-panel-float__header {
|
|
3617
|
+
background: var(--vdd-panel-float-header-bg-active, rgba(56, 189, 248, 0.08));
|
|
3618
|
+
}
|
|
3619
|
+
|
|
3620
|
+
.vdd-panel-float__title {
|
|
3621
|
+
flex: 1;
|
|
3622
|
+
font-size: 11px;
|
|
3623
|
+
font-weight: 500;
|
|
3624
|
+
color: var(--vdd-panel-float-title-color, rgba(255, 255, 255, 0.6));
|
|
3625
|
+
overflow: hidden;
|
|
3626
|
+
text-overflow: ellipsis;
|
|
3627
|
+
white-space: nowrap;
|
|
3628
|
+
}
|
|
3629
|
+
|
|
3630
|
+
.vdd-panel-float--active .vdd-panel-float__title {
|
|
3631
|
+
color: var(--vdd-panel-float-title-color-active, rgba(255, 255, 255, 0.9));
|
|
3632
|
+
}
|
|
3633
|
+
|
|
3634
|
+
.vdd-panel-float__icon {
|
|
3635
|
+
flex-shrink: 0;
|
|
3636
|
+
width: 14px;
|
|
3637
|
+
height: 14px;
|
|
3638
|
+
display: flex;
|
|
3639
|
+
align-items: center;
|
|
3640
|
+
justify-content: center;
|
|
3641
|
+
opacity: 0.7;
|
|
3642
|
+
color: var(--vdd-panel-float-title-color, rgba(255, 255, 255, 0.6));
|
|
3643
|
+
}
|
|
3644
|
+
.vdd-panel-float--active .vdd-panel-float__icon {
|
|
3645
|
+
opacity: 1;
|
|
3646
|
+
color: var(--vdd-panel-float-title-color-active, rgba(255, 255, 255, 0.9));
|
|
3647
|
+
}
|
|
3648
|
+
|
|
3649
|
+
.vdd-panel-float__close {
|
|
3650
|
+
display: inline-flex;
|
|
3651
|
+
align-items: center;
|
|
3652
|
+
justify-content: center;
|
|
3653
|
+
width: 18px;
|
|
3654
|
+
height: 18px;
|
|
3655
|
+
flex-shrink: 0;
|
|
3656
|
+
background: var(--vdd-custom-btn-bg, rgba(255, 255, 255, 0.03));
|
|
3657
|
+
border: 1px solid var(--vdd-custom-btn-border, rgba(255, 255, 255, 0.05));
|
|
3658
|
+
color: var(--vdd-text-secondary, #94a3b8);
|
|
3659
|
+
cursor: pointer;
|
|
3660
|
+
border-radius: 4px;
|
|
3661
|
+
padding: 0;
|
|
3662
|
+
line-height: 1;
|
|
3663
|
+
transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
3664
|
+
}
|
|
3665
|
+
|
|
3666
|
+
.vdd-panel-float__close:hover {
|
|
3667
|
+
background-color: var(--vdd-custom-btn-hover-bg, rgba(255, 255, 255, 0.12));
|
|
3668
|
+
color: var(--vdd-custom-btn-hover-color, #ffffff);
|
|
3669
|
+
border-color: var(--vdd-custom-btn-border, rgba(255, 255, 255, 0.05));
|
|
3670
|
+
transform: scale(1.05);
|
|
3671
|
+
}
|
|
3672
|
+
|
|
3673
|
+
.vdd-panel-float__body {
|
|
3674
|
+
flex: 1;
|
|
3675
|
+
overflow: auto;
|
|
3676
|
+
min-height: 0;
|
|
3677
|
+
}
|
|
3678
|
+
|
|
3679
|
+
/* A `.vdd-panel-float__resize` rule lived here in rdd and was dead: nothing rendered that
|
|
3680
|
+
class in either library — the widget's handles are `.vdd-resize-handle.vdd-resize-<dir>`,
|
|
3681
|
+
which have their own rules. Removed in M13, when the class/rule correspondence sweep found
|
|
3682
|
+
it. A rule that matches nothing looks exactly like styling and does nothing at all. */
|
|
3683
|
+
|
|
3684
|
+
/* ── Docking drop zones (visible while dragging a floating window) ── */
|
|
3685
|
+
/* Armed for resize-to-stretch: the clamps already hold the widget exactly where a stretched axis
|
|
3686
|
+
would sit, so releasing now locks it there. The outline is the cue that it *will* lock — without
|
|
3687
|
+
it the gesture is invisible and undiscoverable. Same dashed accent vocabulary as the drop zones
|
|
3688
|
+
below. */
|
|
3689
|
+
.vdd-panel-float--snapping {
|
|
3690
|
+
outline: 2px dashed var(--vdd-accent-color, #38bdf8);
|
|
3691
|
+
outline-offset: -2px;
|
|
3692
|
+
}
|
|
3693
|
+
|
|
3694
|
+
.vdd-panel-float-dropzone {
|
|
3695
|
+
position: absolute;
|
|
3696
|
+
width: 80px;
|
|
3697
|
+
height: 80px;
|
|
3698
|
+
border: 2px dashed var(--vdd-accent-color, #38bdf8);
|
|
3699
|
+
border-radius: 8px;
|
|
3700
|
+
background: rgba(56, 189, 248, 0.06);
|
|
3701
|
+
pointer-events: none;
|
|
3702
|
+
z-index: 200;
|
|
3703
|
+
opacity: 0.55;
|
|
3704
|
+
transition: opacity 0.15s ease, background 0.15s ease, border-style 0.15s ease;
|
|
3705
|
+
}
|
|
3706
|
+
|
|
3707
|
+
.vdd-panel-float-dropzone--hovered {
|
|
3708
|
+
opacity: 1;
|
|
3709
|
+
background: rgba(56, 189, 248, 0.18);
|
|
3710
|
+
border-style: solid;
|
|
3711
|
+
}
|
|
3712
|
+
|
|
3713
|
+
.vdd-panel-float-dropzone--top-left { top: 8px; left: 8px; }
|
|
3714
|
+
.vdd-panel-float-dropzone--top-right { top: 8px; right: 8px; }
|
|
3715
|
+
.vdd-panel-float-dropzone--bottom-left { bottom: 8px; left: 8px; }
|
|
3716
|
+
.vdd-panel-float-dropzone--bottom-right { bottom: 8px; right: 8px; }
|
|
3717
|
+
|
|
3718
|
+
[dir="rtl"] .vdd-panel-float-dropzone--top-right { right: auto; left: 8px; }
|
|
3719
|
+
[dir="rtl"] .vdd-panel-float-dropzone--top-left { left: auto; right: 8px; }
|
|
3720
|
+
[dir="rtl"] .vdd-panel-float-dropzone--bottom-right { right: auto; left: 8px; }
|
|
3721
|
+
[dir="rtl"] .vdd-panel-float-dropzone--bottom-left { left: auto; right: 8px; }
|
|
3722
|
+
|
|
3723
|
+
[dir="rtl"] .vdd-panel-float__title { text-align: right; }
|
|
3724
|
+
|
|
3725
|
+
/* ── Toast ── */
|
|
3726
|
+
|
|
3727
|
+
/* Color tokens — match confirmation-alert-* palette exactly */
|
|
3728
|
+
:root {
|
|
3729
|
+
--vdd-toast-info-color: #67e8f9;
|
|
3730
|
+
--vdd-toast-success-color: #4ade80;
|
|
3731
|
+
--vdd-toast-warning-color: #fbbf24;
|
|
3732
|
+
--vdd-toast-error-color: #f87171;
|
|
3733
|
+
--vdd-toast-bg: #2a2d32;
|
|
3734
|
+
--vdd-toast-border: rgba(255, 255, 255, 0.14);
|
|
3735
|
+
}
|
|
3736
|
+
[data-color-scheme="light"] {
|
|
3737
|
+
--vdd-toast-info-color: #0369a1;
|
|
3738
|
+
--vdd-toast-success-color: #15803d;
|
|
3739
|
+
--vdd-toast-warning-color: #b45309;
|
|
3740
|
+
--vdd-toast-error-color: #b91c1c;
|
|
3741
|
+
--vdd-toast-bg: #ffffff;
|
|
3742
|
+
--vdd-toast-border: rgba(0, 0, 0, 0.14);
|
|
3743
|
+
}
|
|
3744
|
+
|
|
3745
|
+
/* Position containers */
|
|
3746
|
+
.vdd-toast-container {
|
|
3747
|
+
position: fixed; z-index: calc(var(--vdd-z-base, 1000) + 9100);
|
|
3748
|
+
display: flex; gap: 8px; padding: 16px;
|
|
3749
|
+
pointer-events: none;
|
|
3750
|
+
box-sizing: border-box;
|
|
3751
|
+
}
|
|
3752
|
+
.vdd-toast-container--top-right { top: var(--vdd-toast-offset-top, 0px); right: 0; flex-direction: column; }
|
|
3753
|
+
.vdd-toast-container--top-left { top: var(--vdd-toast-offset-top, 0px); left: 0; flex-direction: column; }
|
|
3754
|
+
.vdd-toast-container--bottom-right { bottom: var(--vdd-toast-offset-bottom, 0px); right: 0; flex-direction: column-reverse; }
|
|
3755
|
+
.vdd-toast-container--bottom-left { bottom: var(--vdd-toast-offset-bottom, 0px); left: 0; flex-direction: column-reverse; }
|
|
3756
|
+
/* newestOnTop override inverts the column direction */
|
|
3757
|
+
.vdd-toast-container--newest-top.vdd-toast-container--bottom-right,
|
|
3758
|
+
.vdd-toast-container--newest-top.vdd-toast-container--bottom-left { flex-direction: column; }
|
|
3759
|
+
.vdd-toast-container--newest-bottom.vdd-toast-container--top-right,
|
|
3760
|
+
.vdd-toast-container--newest-bottom.vdd-toast-container--top-left { flex-direction: column-reverse; }
|
|
3761
|
+
|
|
3762
|
+
/* Individual toast — base card */
|
|
3763
|
+
.vdd-toast {
|
|
3764
|
+
pointer-events: all; position: relative; overflow: hidden;
|
|
3765
|
+
display: flex; align-items: flex-start; gap: 10px;
|
|
3766
|
+
padding: 20px 14px; border-radius: 6px;
|
|
3767
|
+
background: var(--vdd-toast-bg, #2a2d32);
|
|
3768
|
+
border: 1px solid var(--vdd-toast-border, rgba(255,255,255,0.14)); border-inline-start-width: 3px;
|
|
3769
|
+
box-shadow: 0 8px 24px rgba(0,0,0,.4), 0 2px 8px rgba(0,0,0,.2);
|
|
3770
|
+
color: var(--vdd-sidebar-text-title, #cccccc);
|
|
3771
|
+
font-size: 13.5px; line-height: 1.4; width: 100%;
|
|
3772
|
+
transition: opacity 200ms ease, transform 200ms ease,
|
|
3773
|
+
max-height 300ms ease, padding 300ms ease, margin 300ms ease;
|
|
3774
|
+
}
|
|
3775
|
+
/* Reserve space for the absolute-positioned close button */
|
|
3776
|
+
.vdd-toast:has(.vdd-toast__close) { padding-inline-end: 32px; }
|
|
3777
|
+
|
|
3778
|
+
/* Type-specific: solid background, accent inline-start border only */
|
|
3779
|
+
.vdd-toast--info { border-inline-start-color: var(--vdd-toast-info-color); }
|
|
3780
|
+
.vdd-toast--success { border-inline-start-color: var(--vdd-toast-success-color); }
|
|
3781
|
+
.vdd-toast--warning { border-inline-start-color: var(--vdd-toast-warning-color); }
|
|
3782
|
+
.vdd-toast--error { border-inline-start-color: var(--vdd-toast-error-color); }
|
|
3783
|
+
|
|
3784
|
+
/* Entry animation classes toggled by JS on next frame */
|
|
3785
|
+
.vdd-toast--entering { opacity: 0; transform: translateX(110%); }
|
|
3786
|
+
.vdd-toast--entering-left { opacity: 0; transform: translateX(-110%); }
|
|
3787
|
+
.vdd-toast--fade-entering { opacity: 0; transform: translateX(0); }
|
|
3788
|
+
.vdd-toast--visible { opacity: 1; transform: translateX(0); }
|
|
3789
|
+
/* Exit: fade out + height collapse for gravity slide effect */
|
|
3790
|
+
.vdd-toast--exiting {
|
|
3791
|
+
opacity: 0; max-height: 0 !important;
|
|
3792
|
+
padding-top: 0; padding-bottom: 0; margin: 0;
|
|
3793
|
+
}
|
|
3794
|
+
|
|
3795
|
+
/* Icon */
|
|
3796
|
+
.vdd-toast__icon { flex-shrink: 0; width: 16px; height: 16px; margin-top: 1px; }
|
|
3797
|
+
.vdd-toast--info .vdd-toast__icon { color: var(--vdd-toast-info-color); }
|
|
3798
|
+
.vdd-toast--success .vdd-toast__icon { color: var(--vdd-toast-success-color); }
|
|
3799
|
+
.vdd-toast--warning .vdd-toast__icon { color: var(--vdd-toast-warning-color); }
|
|
3800
|
+
.vdd-toast--error .vdd-toast__icon { color: var(--vdd-toast-error-color); }
|
|
3801
|
+
|
|
3802
|
+
/* Body & close button */
|
|
3803
|
+
.vdd-toast__body { flex: 1; min-width: 0; word-break: break-word; }
|
|
3804
|
+
.vdd-toast__close {
|
|
3805
|
+
position: absolute; top: 8px; inset-inline-end: 10px;
|
|
3806
|
+
background: none; border: none; cursor: pointer;
|
|
3807
|
+
opacity: .5; padding: 2px; color: inherit; line-height: 1;
|
|
3808
|
+
}
|
|
3809
|
+
.vdd-toast__close:hover { opacity: 1; }
|
|
3810
|
+
|
|
3811
|
+
/* Progress bar */
|
|
3812
|
+
.vdd-toast__progress {
|
|
3813
|
+
position: absolute; bottom: 0; left: 0; right: 0; height: 3px;
|
|
3814
|
+
transform-origin: left; animation: vdd-toast-shrink linear forwards;
|
|
3815
|
+
}
|
|
3816
|
+
.vdd-toast--paused .vdd-toast__progress { animation-play-state: paused; }
|
|
3817
|
+
.vdd-toast--info .vdd-toast__progress { background: var(--vdd-toast-info-color); }
|
|
3818
|
+
.vdd-toast--success .vdd-toast__progress { background: var(--vdd-toast-success-color); }
|
|
3819
|
+
.vdd-toast--warning .vdd-toast__progress { background: var(--vdd-toast-warning-color); }
|
|
3820
|
+
.vdd-toast--error .vdd-toast__progress { background: var(--vdd-toast-error-color); }
|
|
3821
|
+
|
|
3822
|
+
@keyframes vdd-toast-shrink { from { transform: scaleX(1); } to { transform: scaleX(0); } }
|
|
3823
|
+
|
|
3824
|
+
/* Toast RTL: flip icon/body order and progress bar collapse direction */
|
|
3825
|
+
[dir="rtl"] .vdd-toast { flex-direction: row-reverse; }
|
|
3826
|
+
[dir="rtl"] .vdd-toast__progress { transform-origin: right; }
|
|
3827
|
+
|
|
3828
|
+
/* ==========================================================================
|
|
3829
|
+
Structure added by the Vue port
|
|
3830
|
+
==========================================================================
|
|
3831
|
+
The persistence port and its slots. These carry no cosmetics — they exist so
|
|
3832
|
+
panel DOM can be moved between hosts without Vue observing it. See
|
|
3833
|
+
src/core/panelDom.ts and docs/decisions/0002-zero-unmount-via-teleport.md. */
|
|
3834
|
+
|
|
3835
|
+
/*
|
|
3836
|
+
* Structure the React library carried as inline JSX styles.
|
|
3837
|
+
*
|
|
3838
|
+
* rdd set `display:flex`, `flexDirection:column`, `height:100%` and friends inline on its
|
|
3839
|
+
* workspace, grid and panel elements. Ported here as CSS instead: the percentage-height
|
|
3840
|
+
* chain has to be unbroken from the workspace down to a leaf's body, or every descendant
|
|
3841
|
+
* collapses — a split divider in a row ends up 0px tall and cannot be grabbed at all, which
|
|
3842
|
+
* is exactly what the M4 browser gate caught.
|
|
3843
|
+
*/
|
|
3844
|
+
.vdd-workspace {
|
|
3845
|
+
display: flex;
|
|
3846
|
+
flex-direction: column;
|
|
3847
|
+
position: relative;
|
|
3848
|
+
width: 100%;
|
|
3849
|
+
height: 100%;
|
|
3850
|
+
overflow: hidden;
|
|
3851
|
+
/* Dragging a tab or a divider must not select text across the workspace. Panel *content*
|
|
3852
|
+
is exempt below, so a panel can still contain selectable text. */
|
|
3853
|
+
user-select: none;
|
|
3854
|
+
}
|
|
3855
|
+
|
|
3856
|
+
.vdd-panel-content {
|
|
3857
|
+
user-select: text;
|
|
3858
|
+
}
|
|
3859
|
+
|
|
3860
|
+
.vdd-workspace-panel {
|
|
3861
|
+
display: flex;
|
|
3862
|
+
flex-direction: column;
|
|
3863
|
+
width: 100%;
|
|
3864
|
+
height: 100%;
|
|
3865
|
+
overflow: hidden;
|
|
3866
|
+
position: relative;
|
|
3867
|
+
}
|
|
3868
|
+
|
|
3869
|
+
.vdd-panel-body {
|
|
3870
|
+
flex-grow: 1;
|
|
3871
|
+
min-height: 0;
|
|
3872
|
+
position: relative;
|
|
3873
|
+
overflow: hidden;
|
|
3874
|
+
}
|
|
3875
|
+
|
|
3876
|
+
.vdd-workspace-viewport {
|
|
3877
|
+
flex-grow: 1;
|
|
3878
|
+
width: 100%;
|
|
3879
|
+
position: relative;
|
|
3880
|
+
overflow: hidden;
|
|
3881
|
+
}
|
|
3882
|
+
|
|
3883
|
+
/* Every open panel is rendered inside this, once, for as long as it is open. It has no box
|
|
3884
|
+
of its own: each panel's content is teleported out of here into its own cache element. */
|
|
3885
|
+
.vdd-panel-port {
|
|
3886
|
+
display: contents;
|
|
3887
|
+
}
|
|
3888
|
+
|
|
3889
|
+
/* The off-screen store a panel waits in while minimised, or before its first host. */
|
|
3890
|
+
.vdd-panel-store {
|
|
3891
|
+
display: none !important;
|
|
3892
|
+
}
|
|
3893
|
+
|
|
3894
|
+
/* A host: the box a panel's element is moved into. */
|
|
3895
|
+
.vdd-panel-slot {
|
|
3896
|
+
width: 100%;
|
|
3897
|
+
height: 100%;
|
|
3898
|
+
position: relative;
|
|
3899
|
+
overflow: hidden;
|
|
3900
|
+
}
|
|
3901
|
+
|
|
3902
|
+
/* The element that is moved. One per panel, for the panel's whole lifetime. */
|
|
3903
|
+
.vdd-panel-mount,
|
|
3904
|
+
.vdd-panel-content {
|
|
3905
|
+
width: 100%;
|
|
3906
|
+
height: 100%;
|
|
3907
|
+
}
|
|
3908
|
+
|
|
3909
|
+
.vdd-workspace-branch {
|
|
3910
|
+
width: 100%;
|
|
3911
|
+
height: 100%;
|
|
3912
|
+
}
|
|
3913
|
+
|
|
3914
|
+
/* A floating window is a flex column: title bar, then a body that takes the rest. rdd set
|
|
3915
|
+
this inline; see the note above. */
|
|
3916
|
+
.vdd-floating-window {
|
|
3917
|
+
display: flex;
|
|
3918
|
+
flex-direction: column;
|
|
3919
|
+
}
|
|
3920
|
+
|
|
3921
|
+
/* The letter tile shown for a panel that opts out of a live preview. */
|
|
3922
|
+
.vdd-taskbar-item-preview-letter {
|
|
3923
|
+
display: flex;
|
|
3924
|
+
align-items: center;
|
|
3925
|
+
justify-content: center;
|
|
3926
|
+
width: 100%;
|
|
3927
|
+
height: 100%;
|
|
3928
|
+
font-size: 2rem;
|
|
3929
|
+
font-weight: 600;
|
|
3930
|
+
color: var(--vdd-panel-title-color, var(--vdd-panel-text));
|
|
3931
|
+
background: rgba(108, 117, 125, 0.15);
|
|
3932
|
+
border: 1px dashed var(--vdd-taskbar-item-border);
|
|
3933
|
+
user-select: none;
|
|
3934
|
+
}
|
|
3935
|
+
|
|
3936
|
+
.vdd-floating-window-body {
|
|
3937
|
+
flex-grow: 1;
|
|
3938
|
+
min-height: 0;
|
|
3939
|
+
width: 100%;
|
|
3940
|
+
overflow: hidden;
|
|
3941
|
+
position: relative;
|
|
3942
|
+
/* A new stacking context, so panel content cannot escape its own window. */
|
|
3943
|
+
isolation: isolate;
|
|
3944
|
+
}
|