real-world-css-libraries 1.0.2 → 1.0.4
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/README.md +72 -7
- package/index.js +45 -6
- package/libs/30days30submits-18-v0.0.0.css +213 -0
- package/libs/amoled-cord-v5.0.11.css +894 -0
- package/libs/animating-hamburger-icons-v0.1.0.css +618 -0
- package/libs/bootplus-v1.0.5.css +6876 -0
- package/libs/cleanslate-v0.10.1.css +454 -0
- package/libs/colofilter-v0.0.0.css +232 -0
- package/libs/enferno-v13.1.1.css +75 -0
- package/libs/facebook-buttons-v1.0.0.css +223 -0
- package/libs/fileicon-v0.1.1.css +140 -0
- package/libs/fluentbird-v1.1.2.css +1060 -0
- package/libs/freebies-v0.0.0.css +1110 -0
- package/libs/gitweb-theme-v0.0.0.css +764 -0
- package/libs/gridism-v0.2.2.css +133 -0
- package/libs/holmes-v6.8.12.css +483 -0
- package/libs/justified-v0.0.0.css +14 -0
- package/libs/kickoff-v8.0.0.css +2267 -0
- package/libs/knacss-v8.2.0.css +1141 -0
- package/libs/less-framework-v0.0.0.css +168 -0
- package/libs/linktree-v0.0.0.css +803 -0
- package/libs/littlebox-v0.0.4.css +5833 -0
- package/libs/lynx-v1.4.0.css +1587 -0
- package/libs/medium.css-v1.0.2.css +287 -0
- package/libs/obnoxious-v3.5.2.css +1144 -0
- package/libs/obsidian-notebook-themes-v2.2.3.css +272 -0
- package/libs/off-canvas-menu-effects-v0.0.0.css +238 -0
- package/libs/patternbolt-v0.0.0.css +861 -0
- package/libs/progress-tracker-v3.0.0.css +352 -0
- package/libs/proxmorph-v2.7.3.css +3952 -0
- package/libs/sapc-apca-v0.0.0.css +5546 -0
- package/libs/select2-bootstrap-v1.2.5.css +120 -0
- package/libs/shina-fox-v0.1.0.css +1194 -0
- package/libs/simptip-v1.0.4.css +447 -0
- package/libs/social-signin-buttons-v0.0.0.css +387 -0
- package/libs/spicetify-bloom-v0.0.0.css +2725 -0
- package/libs/stackoverflow-dark-v5.1.2.css +4962 -0
- package/libs/swagger-ui-themes-2-v2.1.0.css +1730 -0
- package/libs/swagger-ui-themes-3-v3.0.1.css +1793 -0
- package/libs/tailwind-cards-v0.0.0.css +215592 -0
- package/libs/the-50-front-end-project-44-v0.0.0.css +459 -0
- package/libs/tocas-v5.7.0.css +19928 -0
- package/libs/utility-opentype-v0.1.4.css +515 -0
- package/libs/vim-css3-syntax-v2.10.0.css +1642 -0
- package/libs/waffle-grid-v1.3.6.css +544 -0
- package/libs/wenk-v1.0.8.css +126 -0
- package/libs/wikipedia-dark-v3.7.9.css +9990 -0
- package/libs/windows-95-v0.0.0.css +393 -0
- package/libs/woah-v1.3.1.css +1025 -0
- package/libs/yacy-v4.1.2.css +677 -0
- package/libs/yue-v1.1.1.css +180 -0
- package/package.json +3 -3
- package/test.js +3 -4
- /package/libs/{bootstrap-v4.6.2.css → bootstrap-4-v4.6.2.css} +0 -0
- /package/libs/{bootstrap-v5.3.8.css → bootstrap-5-v5.3.8.css} +0 -0
|
@@ -0,0 +1,3952 @@
|
|
|
1
|
+
/* https://github.com/IT-BAER/proxmorph/blob/main/themes/theme-unifi.css */
|
|
2
|
+
/*!UniFi*/
|
|
3
|
+
/*
|
|
4
|
+
* ProxMorph Theme: UniFi
|
|
5
|
+
* Authentic recreation of Ubiquiti UniFi Network Application UI
|
|
6
|
+
* Version: 5.94
|
|
7
|
+
* Author: N.E.S.T. / Dr. Dranglog
|
|
8
|
+
*
|
|
9
|
+
* UniFi Color Palette (extracted from live instance):
|
|
10
|
+
*
|
|
11
|
+
* BACKGROUNDS:
|
|
12
|
+
* - Base/Body: #131416 (rgb 19,20,22) - main dark background
|
|
13
|
+
* - Header: #282B2F (rgb 40,43,47) - top navigation bar
|
|
14
|
+
* - Hover solid: #34383D (rgb 52,56,61) - button hover
|
|
15
|
+
* - Hover subtle: rgba(249, 250, 250, 0.02) - row hover
|
|
16
|
+
* - Hover medium: rgba(249, 250, 250, 0.04) - tertiary hover
|
|
17
|
+
* - Hover strong: rgba(249, 250, 250, 0.07) - input hover
|
|
18
|
+
*
|
|
19
|
+
* TEXT COLORS:
|
|
20
|
+
* - Primary: #DEE0E3 (rgb 222,224,227) - main text
|
|
21
|
+
* - Secondary: #B7BCC2 (rgb 183,188,194) - labels
|
|
22
|
+
* - Bright: #F9FAFA (rgb 249,250,250) - headings/emphasis
|
|
23
|
+
* - Muted: rgba(255, 255, 255, 0.65) - sidebar text
|
|
24
|
+
* - Tertiary: #737C87 (rgb 115,124,135) - disabled/hints
|
|
25
|
+
*
|
|
26
|
+
* ACCENT COLORS:
|
|
27
|
+
* - Primary Blue: #006EFF - links, active states
|
|
28
|
+
* - Blue Hover: #4797FF (rgb 71,151,255)
|
|
29
|
+
* - Success: #37BE5F (rgb 55,190,95)
|
|
30
|
+
* - Warning: #f5a623
|
|
31
|
+
* - Danger: #f03a3e
|
|
32
|
+
*
|
|
33
|
+
* CSS VARIABLES (official Ubiquiti):
|
|
34
|
+
* - --ubnt-color-DN60: #151725 (darkest neutral)
|
|
35
|
+
* - --ubnt-color-DN50: #242635 (card background)
|
|
36
|
+
* - --ubnt-color-primary: #006fff
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/* =====================================================
|
|
40
|
+
CSS VARIABLES
|
|
41
|
+
===================================================== */
|
|
42
|
+
:root {
|
|
43
|
+
/* UniFi design tokens (only the ones actually used) */
|
|
44
|
+
--ubnt-color-primary: #006fff;
|
|
45
|
+
--ubnt-color-danger: #f03a3e;
|
|
46
|
+
--ubnt-color-warning: #f5a623;
|
|
47
|
+
--ubnt-color-success: #39cc64;
|
|
48
|
+
|
|
49
|
+
/* ProxMorph semantic variables */
|
|
50
|
+
--pm-accent: #006EFF;
|
|
51
|
+
--pm-accent-hover: #4797FF;
|
|
52
|
+
--pm-accent-active: #0058cc;
|
|
53
|
+
|
|
54
|
+
--pm-success: #37BE5F;
|
|
55
|
+
--pm-warning: var(--ubnt-color-warning);
|
|
56
|
+
--pm-error: var(--ubnt-color-danger);
|
|
57
|
+
|
|
58
|
+
/* Base palette tuned to Proxmox UI (keeps existing theme look) */
|
|
59
|
+
--pm-bg-base: #131416;
|
|
60
|
+
--pm-bg-surface: #282B2F;
|
|
61
|
+
--pm-bg-elevated: #34383D;
|
|
62
|
+
|
|
63
|
+
--pm-border: #34383D;
|
|
64
|
+
--pm-border-strong: #444444;
|
|
65
|
+
|
|
66
|
+
--pm-text: #DEE0E3;
|
|
67
|
+
--pm-text-dim: #B7BCC2;
|
|
68
|
+
--pm-text-muted: #B7BCC2;
|
|
69
|
+
--pm-text-disabled: #737C87;
|
|
70
|
+
--pm-text-bright: #F9FAFA;
|
|
71
|
+
|
|
72
|
+
--pm-hover-subtle: rgba(249, 250, 250, 0.02);
|
|
73
|
+
--pm-hover-medium: rgba(249, 250, 250, 0.04);
|
|
74
|
+
--pm-hover-strong: rgba(249, 250, 250, 0.07);
|
|
75
|
+
|
|
76
|
+
--pm-radius-sm: 4px;
|
|
77
|
+
--pm-radius-md: 6px;
|
|
78
|
+
--pm-radius-lg: 8px;
|
|
79
|
+
--pm-radius-xl: 12px;
|
|
80
|
+
|
|
81
|
+
--pm-focus-ring-color: rgba(0, 111, 255, 0.15);
|
|
82
|
+
|
|
83
|
+
/* Proxmox widget toolkit variables */
|
|
84
|
+
--pwt-panel-background: var(--pm-bg-base);
|
|
85
|
+
--pwt-text-color: var(--pm-text-dim);
|
|
86
|
+
--pwt-gauge-default: var(--pm-accent-hover);
|
|
87
|
+
--pwt-gauge-back: var(--pm-bg-elevated);
|
|
88
|
+
--pwt-gauge-warn: var(--pm-warning);
|
|
89
|
+
--pwt-gauge-crit: var(--pm-error);
|
|
90
|
+
--pwt-chart-primary: var(--pm-success);
|
|
91
|
+
--pwt-chart-grid-stroke: var(--pm-border);
|
|
92
|
+
|
|
93
|
+
color-scheme: dark;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* =====================================================
|
|
97
|
+
GLOBAL BORDER-BOX ROUNDED CORNERS (UniFi style)
|
|
98
|
+
===================================================== */
|
|
99
|
+
.x-border-box,
|
|
100
|
+
.x-border-box * {
|
|
101
|
+
border-radius: var(--pm-radius-lg);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Remove rounded corners from grids/tables/lists (Tasks, logs) */
|
|
105
|
+
.x-grid,
|
|
106
|
+
.x-grid *,
|
|
107
|
+
.x-grid-header-ct,
|
|
108
|
+
.x-grid-header-ct *,
|
|
109
|
+
.x-grid-view,
|
|
110
|
+
.x-grid-view *,
|
|
111
|
+
.x-column-header,
|
|
112
|
+
.x-column-header *,
|
|
113
|
+
.x-grid-item,
|
|
114
|
+
.x-grid-cell,
|
|
115
|
+
.x-grid-cell-inner,
|
|
116
|
+
.x-grid-row,
|
|
117
|
+
table,
|
|
118
|
+
table *,
|
|
119
|
+
tr,
|
|
120
|
+
td,
|
|
121
|
+
th,
|
|
122
|
+
/* Legend elements - no rounded corners */
|
|
123
|
+
.x-legend,
|
|
124
|
+
.x-legend *,
|
|
125
|
+
.x-legend-container,
|
|
126
|
+
.x-legend-container *,
|
|
127
|
+
.x-legend-item,
|
|
128
|
+
.x-legend-horizontal .x-legend-item,
|
|
129
|
+
.x-legend-vertical .x-legend-item,
|
|
130
|
+
.x-legend-horizontal .x-legend-item:first-child,
|
|
131
|
+
.x-legend-horizontal .x-legend-item:last-child,
|
|
132
|
+
.x-legend-vertical .x-legend-item:first-child,
|
|
133
|
+
.x-legend-vertical .x-legend-item:last-child,
|
|
134
|
+
/* Tool icons - no rounded corners */
|
|
135
|
+
.x-tool,
|
|
136
|
+
.x-tool-tool-el,
|
|
137
|
+
.x-tool-default,
|
|
138
|
+
.x-tool-img {
|
|
139
|
+
border-radius: 0 !important;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* Form elements - exclude from global 8px, apply 4px (UniFi style) */
|
|
143
|
+
/* Reset ALL form-related parent containers to prevent 8px inheritance */
|
|
144
|
+
.x-form-item,
|
|
145
|
+
.x-form-item-default,
|
|
146
|
+
.x-form-item-body,
|
|
147
|
+
.x-form-item-body-default,
|
|
148
|
+
.x-form-text-field-body,
|
|
149
|
+
.x-form-text-field-body-default,
|
|
150
|
+
.x-form-fieldcontainer,
|
|
151
|
+
.x-field,
|
|
152
|
+
.x-field-default,
|
|
153
|
+
.x-form-type-text {
|
|
154
|
+
border-radius: 0 !important;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* Reset layout containers that clip form elements with overflow:hidden + 8px radius */
|
|
158
|
+
.x-box-layout-ct,
|
|
159
|
+
.x-panel-bodyWrap,
|
|
160
|
+
.x-panel-bodyWrap-default,
|
|
161
|
+
.x-autocontainer-innerCt,
|
|
162
|
+
.x-autocontainer-outerCt,
|
|
163
|
+
.x-panel.x-tabpanel-child,
|
|
164
|
+
.x-panel.x-box-item,
|
|
165
|
+
.x-box-inner,
|
|
166
|
+
.x-box-target,
|
|
167
|
+
.x-container,
|
|
168
|
+
.x-container-default,
|
|
169
|
+
/* Window/dialog inner bodies - prevent 8px clipping on form elements */
|
|
170
|
+
.x-window .x-panel-body,
|
|
171
|
+
.x-window .x-window-body,
|
|
172
|
+
.x-window .x-window-bodyWrap {
|
|
173
|
+
border-radius: 0 !important;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Restore right border for grids inside windows (fixed v5.4 over-reach) */
|
|
177
|
+
.x-window .x-panel-body.x-grid-body {
|
|
178
|
+
border-right: 1px solid #34383D !important;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* =====================================================
|
|
182
|
+
v5.73: WINDOW/MODAL BORDER-RADIUS CONSISTENCY
|
|
183
|
+
Reset all children to 0, then re-apply specific radii
|
|
184
|
+
to ensure consistent 8px corners on login/modals
|
|
185
|
+
===================================================== */
|
|
186
|
+
|
|
187
|
+
/* 1. Reset everything inside windows to 0 - overrides global x-border-box rule */
|
|
188
|
+
.x-window *,
|
|
189
|
+
.x-window .x-autocontainer-innerCt,
|
|
190
|
+
.x-window .x-autocontainer-outerCt,
|
|
191
|
+
.x-window .x-form-layout-wrap,
|
|
192
|
+
.x-window .x-form-layout-auto-label,
|
|
193
|
+
.x-window .x-form-layout-colgroup,
|
|
194
|
+
.x-window .x-form-layout-column,
|
|
195
|
+
.x-window .x-field,
|
|
196
|
+
.x-window .x-form-item,
|
|
197
|
+
.x-window .x-form-item-body {
|
|
198
|
+
border-radius: 0 !important;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* 2. Window container - consistent 8px with overflow hidden */
|
|
202
|
+
.x-window {
|
|
203
|
+
border-radius: 8px !important;
|
|
204
|
+
overflow: hidden !important;
|
|
205
|
+
min-width: 295px !important;
|
|
206
|
+
/* v5.85: Match Proxmox default to prevent scrollbars */
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* v5.86: Fix dialog header/body not matching dialog width when min-width is applied
|
|
210
|
+
Root cause: ExtJS sets inline width on header/body that's smaller than min-width forces.
|
|
211
|
+
Solution: Force header/body to use 100% width so they inherit parent's computed width. */
|
|
212
|
+
.x-window > .x-window-header,
|
|
213
|
+
.x-window > .x-window-body,
|
|
214
|
+
.x-window > .x-window-bodyWrap,
|
|
215
|
+
.x-window-bodyWrap > .x-window-body {
|
|
216
|
+
width: 100% !important;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* Ensure box containers inside header use full width */
|
|
220
|
+
.x-window-header > .x-box-inner,
|
|
221
|
+
.x-window-header > .x-box-inner > .x-box-target {
|
|
222
|
+
width: 100% !important;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Header title should expand appropriately */
|
|
226
|
+
.x-window-header-title {
|
|
227
|
+
width: auto !important;
|
|
228
|
+
flex: 1 !important;
|
|
229
|
+
max-width: calc(100% - 30px) !important;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* 3. Window header - top corners only */
|
|
233
|
+
.x-window-header,
|
|
234
|
+
.x-window-header-default {
|
|
235
|
+
border-radius: 8px 8px 0 0 !important;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* 4. Re-apply button styling inside windows (6px) */
|
|
239
|
+
.x-window .x-btn {
|
|
240
|
+
border-radius: 6px !important;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* 5. Re-apply checkbox styling inside windows (4px) */
|
|
244
|
+
.x-window .x-form-checkbox {
|
|
245
|
+
border-radius: 4px !important;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/* 6. Re-apply form inputs inside windows (4px with split corners) */
|
|
249
|
+
.x-window .x-form-trigger-wrap,
|
|
250
|
+
.x-window .x-form-trigger-wrap-default {
|
|
251
|
+
border-radius: 4px !important;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.x-window .x-form-text-wrap,
|
|
255
|
+
.x-window .x-form-text {
|
|
256
|
+
border-radius: 4px 0 0 4px !important;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.x-window .x-form-arrow-trigger {
|
|
260
|
+
border-radius: 0 4px 4px 0 !important;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.x-form-trigger-wrap,
|
|
264
|
+
.x-form-trigger-wrap *,
|
|
265
|
+
.x-form-text-wrap,
|
|
266
|
+
.x-form-text-wrap *,
|
|
267
|
+
.x-form-text,
|
|
268
|
+
.x-form-trigger {
|
|
269
|
+
border-radius: 0 !important;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* Form element containers - 4px radius (UniFi consistent) */
|
|
273
|
+
.x-form-trigger-wrap,
|
|
274
|
+
.x-form-trigger-wrap-default {
|
|
275
|
+
border-radius: 4px !important;
|
|
276
|
+
overflow: hidden !important;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* Constrain autocontainer width (Moved from L3450) */
|
|
280
|
+
.x-window .x-autocontainer-outerCt {
|
|
281
|
+
max-width: 100% !important;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* Form text wrap - left side rounded */
|
|
285
|
+
.x-form-text-wrap,
|
|
286
|
+
.x-form-text-wrap-default {
|
|
287
|
+
border-radius: 4px 0 0 4px !important;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Form input text - left side rounded */
|
|
291
|
+
.x-form-text,
|
|
292
|
+
.x-form-text-default {
|
|
293
|
+
border-radius: 4px 0 0 4px !important;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* Form trigger button - right side rounded */
|
|
297
|
+
.x-form-trigger,
|
|
298
|
+
.x-form-trigger-default,
|
|
299
|
+
.x-form-arrow-trigger,
|
|
300
|
+
.x-form-arrow-trigger-default {
|
|
301
|
+
border-radius: 0 4px 4px 0 !important;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/* Cursor styles for combobox/dropdown elements (pointer indicates clickable) */
|
|
305
|
+
.x-form-trigger-wrap,
|
|
306
|
+
.x-form-text-wrap,
|
|
307
|
+
.x-form-field[role="combobox"],
|
|
308
|
+
input.x-form-text[readonly],
|
|
309
|
+
.x-form-trigger,
|
|
310
|
+
.x-form-arrow-trigger {
|
|
311
|
+
cursor: pointer !important;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* Cursor for dropdown list items */
|
|
315
|
+
.x-boundlist-item,
|
|
316
|
+
.x-boundlist-item-over,
|
|
317
|
+
.x-boundlist-selected {
|
|
318
|
+
cursor: pointer !important;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/* =====================================================
|
|
322
|
+
BASE / BODY - Authentic UniFi dark background
|
|
323
|
+
===================================================== */
|
|
324
|
+
.x-body {
|
|
325
|
+
color: var(--pm-text);
|
|
326
|
+
background-color: var(--pm-bg-base);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.x-viewport>.x-body {
|
|
330
|
+
background-color: var(--pm-bg-base);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
body.x-border-layout-ct,
|
|
334
|
+
div.x-border-layout-ct {
|
|
335
|
+
background-color: var(--pm-bg-base);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/* =====================================================
|
|
339
|
+
LEGEND / CHARTS - Ensure chart visibility
|
|
340
|
+
===================================================== */
|
|
341
|
+
.x-legend-container {
|
|
342
|
+
background-color: var(--pm-bg-base);
|
|
343
|
+
border-radius: 0 !important;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.x-legend-horizontal .x-legend-item,
|
|
347
|
+
.x-legend-item {
|
|
348
|
+
background-color: var(--pm-bg-base);
|
|
349
|
+
color: var(--pm-text-muted);
|
|
350
|
+
border: none !important;
|
|
351
|
+
border-radius: 0 !important;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/* Legend color marker (dot) - keep circular */
|
|
355
|
+
.x-legend-item-marker {
|
|
356
|
+
border-radius: 50% !important;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* Chart canvas and SVG visibility */
|
|
360
|
+
.x-chart,
|
|
361
|
+
.rrd-chart canvas,
|
|
362
|
+
canvas.x-surface {
|
|
363
|
+
opacity: 1 !important;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/* Chart grid lines */
|
|
367
|
+
.x-chart-grid-horizontal line,
|
|
368
|
+
.x-chart-grid-vertical line {
|
|
369
|
+
stroke: #34383D !important;
|
|
370
|
+
stroke-opacity: 1 !important;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/* Chart axis text */
|
|
374
|
+
.x-chart-axis-label {
|
|
375
|
+
fill: #B7BCC2 !important;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/* RRDTool charts (Proxmox specific) - ensure PNG charts are visible */
|
|
379
|
+
img.rrdimage,
|
|
380
|
+
.rrd-chart img,
|
|
381
|
+
div[class*="rrd"] img {
|
|
382
|
+
filter: none !important;
|
|
383
|
+
opacity: 1 !important;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/* =====================================================
|
|
387
|
+
MASKS & OVERLAYS
|
|
388
|
+
===================================================== */
|
|
389
|
+
.x-mask {
|
|
390
|
+
/* v5.48: Background blur + 0.5 opacity */
|
|
391
|
+
backdrop-filter: blur(4px) !important;
|
|
392
|
+
-webkit-backdrop-filter: blur(4px) !important;
|
|
393
|
+
background-color: rgba(0, 0, 0, 0.5) !important;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* Disabled field-groups: keep the native "reduced opacity" look (no black mask overlay) */
|
|
397
|
+
.x-item-disabled.x-masked-relative>.x-mask {
|
|
398
|
+
background-color: transparent !important;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.x-tool .x-mask {
|
|
402
|
+
backdrop-filter: blur(4px);
|
|
403
|
+
background-color: #131416;
|
|
404
|
+
opacity: 0.6;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* v5.50: Hide ExtJS shadow element - use pure CSS shadow on window instead */
|
|
408
|
+
.x-css-shadow {
|
|
409
|
+
display: none !important;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/* =====================================================
|
|
413
|
+
ICONS - Inverted for dark mode
|
|
414
|
+
===================================================== */
|
|
415
|
+
/* General icons - gray color */
|
|
416
|
+
.fa-tags::before,
|
|
417
|
+
.fa-file-o::before,
|
|
418
|
+
.fa-building::before,
|
|
419
|
+
.x-action-col-icon::before,
|
|
420
|
+
.fa-shield::before,
|
|
421
|
+
.fa-file-text-o::before,
|
|
422
|
+
.fa-clock-o::before,
|
|
423
|
+
.x-tab-icon-el-default,
|
|
424
|
+
.pve-icon-verify-lettering::after,
|
|
425
|
+
.x-tree-icon-custom.lock-migrate::after,
|
|
426
|
+
.x-grid-icon-custom.lock-migrate::after,
|
|
427
|
+
.x-tree-icon-leaf:not(.x-tree-icon-custom)::before,
|
|
428
|
+
.x-tree-icon-parent:not(.x-tree-icon-custom)::before,
|
|
429
|
+
.x-tree-icon-parent-expanded:not(.x-tree-icon-custom)::before,
|
|
430
|
+
.x-grid-filters-filtered-column .x-column-header-text::after {
|
|
431
|
+
color: #B7BCC2;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* VM/CT icons - default gray, NOT green */
|
|
435
|
+
.x-tree-icon-custom,
|
|
436
|
+
.x-grid-icon-custom {
|
|
437
|
+
color: #B7BCC2;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.x-tree-icon-parent:not(.x-tree-icon-custom)::before,
|
|
441
|
+
.x-tree-icon-parent-expanded:not(.x-tree-icon-custom)::before {
|
|
442
|
+
filter: invert(90%);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.fa-ceph::before,
|
|
446
|
+
.fa-sdn::before,
|
|
447
|
+
.fa-network-wired::before,
|
|
448
|
+
.pve-itype-treelist-item-icon-cdrom,
|
|
449
|
+
.fa-chevron-right::before,
|
|
450
|
+
.x-grid-row-console,
|
|
451
|
+
.x-box-scroller-toolbar-default.x-box-scroller,
|
|
452
|
+
.x-tree-elbow-img,
|
|
453
|
+
.pve-itype-icon-qemu,
|
|
454
|
+
.x-tree-node-computer,
|
|
455
|
+
.x-grid-tree-node-expanded .x-tree-node-computer,
|
|
456
|
+
.pbs-icon-tape,
|
|
457
|
+
.pbs-icon-tape-drive,
|
|
458
|
+
.x-tree-icon-leaf:not(.x-tree-icon-custom),
|
|
459
|
+
.x-tree-icon-parent:not(.x-tree-icon-custom),
|
|
460
|
+
.x-tree-icon-parent-expanded:not(.x-tree-icon-custom) {
|
|
461
|
+
filter: invert(90%);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/* v5.37: Resource grid icon inversion - tree node icons only
|
|
465
|
+
Harddisk tree nodes are SVG background images that need inversion for dark themes */
|
|
466
|
+
.x-tree-node-harddisk,
|
|
467
|
+
.x-grid-tree-node-expanded .x-tree-node-harddisk {
|
|
468
|
+
filter: invert(90%);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/* Fix #27: Resource grid cells (td.pve-itype-icon-* / td.pmx-itype-icon-*) — remove
|
|
472
|
+
filter from TD so text is NOT inverted. Strip original background-image and reconstruct
|
|
473
|
+
icon via ::before pseudo-element on .x-grid-cell-inner with filter applied to icon only.
|
|
474
|
+
Includes pmx-itype-icon-processor/memory used by LXC Resources tab (PVE 9.x). */
|
|
475
|
+
td.pve-itype-icon-cpu,
|
|
476
|
+
td.pve-itype-icon-memory,
|
|
477
|
+
td.pve-itype-icon-cdrom,
|
|
478
|
+
td.pve-itype-icon-pci,
|
|
479
|
+
td.pve-itype-icon-serial,
|
|
480
|
+
td.pve-itype-icon-die,
|
|
481
|
+
td.pmx-itype-icon-processor,
|
|
482
|
+
td.pmx-itype-icon-memory {
|
|
483
|
+
filter: none !important;
|
|
484
|
+
background-image: none !important;
|
|
485
|
+
padding-left: 0px !important;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/* Match FA row inner padding (4px) */
|
|
489
|
+
td.pve-itype-icon-cpu > .x-grid-cell-inner,
|
|
490
|
+
td.pve-itype-icon-memory > .x-grid-cell-inner,
|
|
491
|
+
td.pve-itype-icon-cdrom > .x-grid-cell-inner,
|
|
492
|
+
td.pve-itype-icon-pci > .x-grid-cell-inner,
|
|
493
|
+
td.pve-itype-icon-serial > .x-grid-cell-inner,
|
|
494
|
+
td.pve-itype-icon-die > .x-grid-cell-inner,
|
|
495
|
+
td.pmx-itype-icon-processor > .x-grid-cell-inner,
|
|
496
|
+
td.pmx-itype-icon-memory > .x-grid-cell-inner {
|
|
497
|
+
padding-left: 4px !important;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/* Inline-block pseudo-element icons — invert only the icon, not the text */
|
|
501
|
+
td.pve-itype-icon-cpu > .x-grid-cell-inner::before,
|
|
502
|
+
td.pve-itype-icon-memory > .x-grid-cell-inner::before,
|
|
503
|
+
td.pve-itype-icon-cdrom > .x-grid-cell-inner::before,
|
|
504
|
+
td.pve-itype-icon-pci > .x-grid-cell-inner::before,
|
|
505
|
+
td.pve-itype-icon-serial > .x-grid-cell-inner::before,
|
|
506
|
+
td.pve-itype-icon-die > .x-grid-cell-inner::before,
|
|
507
|
+
td.pmx-itype-icon-processor > .x-grid-cell-inner::before,
|
|
508
|
+
td.pmx-itype-icon-memory > .x-grid-cell-inner::before {
|
|
509
|
+
content: '' !important;
|
|
510
|
+
display: inline-block !important;
|
|
511
|
+
width: 14px !important;
|
|
512
|
+
height: 14px !important;
|
|
513
|
+
vertical-align: middle !important;
|
|
514
|
+
margin-right: 4px !important;
|
|
515
|
+
background-size: 14px 14px !important;
|
|
516
|
+
background-repeat: no-repeat !important;
|
|
517
|
+
background-position: center !important;
|
|
518
|
+
filter: invert(90%) !important;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/* Individual icon URLs — pve-itype-icon-* classes are PVE-specific, so use /pve2/images/
|
|
522
|
+
(icon-cpu.svg exists in /pwt/images/ too, but memory/cdrom/pci/serial/die do NOT) */
|
|
523
|
+
td.pve-itype-icon-cpu > .x-grid-cell-inner::before {
|
|
524
|
+
background-image: url('/pve2/images/icon-cpu.svg') !important;
|
|
525
|
+
}
|
|
526
|
+
td.pve-itype-icon-memory > .x-grid-cell-inner::before {
|
|
527
|
+
background-image: url('/pve2/images/icon-memory.svg') !important;
|
|
528
|
+
}
|
|
529
|
+
td.pve-itype-icon-cdrom > .x-grid-cell-inner::before {
|
|
530
|
+
background-image: url('/pve2/images/icon-cd-drive.svg') !important;
|
|
531
|
+
}
|
|
532
|
+
td.pve-itype-icon-pci > .x-grid-cell-inner::before {
|
|
533
|
+
background-image: url('/pve2/images/icon-pci.svg') !important;
|
|
534
|
+
}
|
|
535
|
+
td.pve-itype-icon-serial > .x-grid-cell-inner::before {
|
|
536
|
+
background-image: url('/pve2/images/icon-serial.svg') !important;
|
|
537
|
+
}
|
|
538
|
+
td.pve-itype-icon-die > .x-grid-cell-inner::before {
|
|
539
|
+
background-image: url('/pve2/images/icon-die.svg') !important;
|
|
540
|
+
}
|
|
541
|
+
/* pmx-itype-icon-* use relative paths for PVE+PBS compatibility */
|
|
542
|
+
td.pmx-itype-icon-processor > .x-grid-cell-inner::before {
|
|
543
|
+
background-image: url('../images/icon-cpu.svg') !important;
|
|
544
|
+
}
|
|
545
|
+
td.pmx-itype-icon-memory > .x-grid-cell-inner::before {
|
|
546
|
+
background-image: url('../images/icon-ram.svg') !important;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/* v5.38: Summary panel icons (i elements) - reset to original Proxmox styling */
|
|
550
|
+
i.pmx-itype-icon-processor,
|
|
551
|
+
i.pmx-itype-icon-memory,
|
|
552
|
+
.pmx-icon.pmx-itype-icon-processor,
|
|
553
|
+
.pmx-icon.pmx-itype-icon-memory {
|
|
554
|
+
filter: invert(90%) !important;
|
|
555
|
+
background-repeat: no-repeat !important;
|
|
556
|
+
background-position: 3px center !important;
|
|
557
|
+
background-size: 14px 14px !important;
|
|
558
|
+
padding-left: 18px !important;
|
|
559
|
+
position: static !important;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/* v5.94: Use relative paths for PVE+PBS compatibility
|
|
563
|
+
PVE serves from /pwt/themes/ → ../images/ resolves to /pwt/images/
|
|
564
|
+
PBS serves from /widgettoolkit/themes/ → ../images/ resolves to /widgettoolkit/images/ */
|
|
565
|
+
i.pmx-itype-icon-processor,
|
|
566
|
+
.pmx-icon.pmx-itype-icon-processor {
|
|
567
|
+
background-image: url('../images/icon-cpu.svg') !important;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
i.pmx-itype-icon-memory,
|
|
571
|
+
.pmx-icon.pmx-itype-icon-memory {
|
|
572
|
+
background-image: url('../images/icon-ram.svg') !important;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/* Disable ::before pseudo-elements on Summary panel icons */
|
|
576
|
+
i.pmx-itype-icon-processor::before,
|
|
577
|
+
i.pmx-itype-icon-memory::before,
|
|
578
|
+
.pmx-icon.pmx-itype-icon-processor::before,
|
|
579
|
+
.pmx-icon.pmx-itype-icon-memory::before {
|
|
580
|
+
content: none !important;
|
|
581
|
+
display: none !important;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/* v5.38: Summary panel SWAP and Bootdisk FontAwesome icons - consistent sizing */
|
|
585
|
+
.left-aligned .fa.fa-refresh,
|
|
586
|
+
.left-aligned .fa.fa-hdd-o {
|
|
587
|
+
font-size: 14px !important;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/* v5.88: Fix "More" button position in IPs section of Summary panel
|
|
591
|
+
Move button next to "IPs" label, vertically centered with IP addresses.
|
|
592
|
+
Parent containers need overflow:visible because transform moves button outside bounds.
|
|
593
|
+
|
|
594
|
+
Key insight: ExtJS positions button at container's right edge (after IP addresses).
|
|
595
|
+
Solution: Anchor to top: 0, then use transform to shift button left to "IPs" label.
|
|
596
|
+
Value -242px moves button from right edge to just after the 35px "IPs" label.
|
|
597
|
+
NOTE: This value may need adjustment if Proxmox UI layout changes. */
|
|
598
|
+
[id^="pveIPViewLXC-"] .x-box-inner,
|
|
599
|
+
[id^="pveIPViewLXC-"] > .x-box-inner {
|
|
600
|
+
overflow: visible !important;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
[id^="pveIPViewLXC-"] [id^="button-"].x-btn {
|
|
604
|
+
top: 0 !important;
|
|
605
|
+
transform: translate(-242px, 5px) !important;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/* Cell inner content alignment — handled by Fix #27 td.pve-itype-icon-* rules above */
|
|
609
|
+
|
|
610
|
+
/* v5.37: FontAwesome icons in resource grid (Swap, Root Disk) */
|
|
611
|
+
.pve-itype-fa .x-grid-cell-inner {
|
|
612
|
+
padding-left: 4px !important;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
.pve-itype-fa .pve-grid-fa,
|
|
616
|
+
.pve-itype-fa .pve-grid-fa.fa,
|
|
617
|
+
.x-grid-item .pve-itype-fa .fa {
|
|
618
|
+
color: #DEE0E3 !important;
|
|
619
|
+
margin-right: 4px !important;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.x-tree-icon-custom,
|
|
623
|
+
.x-grid-icon-custom {
|
|
624
|
+
color: #B7BCC2;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/* Running VMs/CTs - type icon neutral; status indicator handled separately */
|
|
628
|
+
.x-tree-icon-custom.running,
|
|
629
|
+
.x-grid-icon-custom.running {
|
|
630
|
+
color: #B7BCC2;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
.x-tree-icon-custom::after,
|
|
634
|
+
.x-grid-icon-custom::after {
|
|
635
|
+
color: #B7BCC2;
|
|
636
|
+
text-shadow: none;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
.x-tree-icon-custom.stopped,
|
|
640
|
+
.x-tree-icon-custom.offline,
|
|
641
|
+
.x-grid-icon-custom.stopped,
|
|
642
|
+
.x-grid-icon-custom.offline {
|
|
643
|
+
color: #737C87;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
.x-tree-icon-custom.lxc::after,
|
|
647
|
+
.x-tree-icon-custom.qemu::after,
|
|
648
|
+
.x-grid-icon-custom.lxc::after,
|
|
649
|
+
.x-grid-icon-custom.qemu::after {
|
|
650
|
+
background-color: #131416;
|
|
651
|
+
color: #B7BCC2;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/* v5.55: Fix LXC/QEMU icon ::after in treelist navigation */
|
|
655
|
+
.x-treelist-item-icon.lxc::after,
|
|
656
|
+
.x-treelist-item-icon.qemu::after {
|
|
657
|
+
background-color: transparent !important;
|
|
658
|
+
color: #B7BCC2 !important;
|
|
659
|
+
margin-top: 4px !important;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
.x-tree-arrows .x-tree-expander {
|
|
663
|
+
filter: brightness(200%);
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/* =====================================================
|
|
667
|
+
v5.6: Custom tree expander arrows (FontAwesome chevrons)
|
|
668
|
+
Replaces default sprite arrows with larger, animated icons
|
|
669
|
+
===================================================== */
|
|
670
|
+
|
|
671
|
+
/* Base expander styling - replace sprite with FA icon */
|
|
672
|
+
.x-tree-expander {
|
|
673
|
+
background-image: none !important;
|
|
674
|
+
position: relative !important;
|
|
675
|
+
width: 18px !important;
|
|
676
|
+
height: 18px !important;
|
|
677
|
+
margin-right: 4px !important;
|
|
678
|
+
vertical-align: middle !important;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/* Arrow icon using FontAwesome chevron-right */
|
|
682
|
+
.x-tree-expander::before {
|
|
683
|
+
content: "\f054" !important;
|
|
684
|
+
/* FA chevron-right */
|
|
685
|
+
font-family: "FontAwesome" !important;
|
|
686
|
+
font-size: 11px !important;
|
|
687
|
+
color: #737C87 !important;
|
|
688
|
+
/* UniFi tertiary/muted color */
|
|
689
|
+
position: absolute !important;
|
|
690
|
+
top: -2px !important;
|
|
691
|
+
left: 3px !important;
|
|
692
|
+
transition: transform 0.2s ease, color 0.15s ease !important;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/* Expanded state - arrow rotates 90 degrees */
|
|
696
|
+
.x-grid-tree-node-expanded .x-tree-expander::before {
|
|
697
|
+
transform: rotate(90deg) !important;
|
|
698
|
+
color: #B7BCC2 !important;
|
|
699
|
+
/* UniFi secondary text */
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/* Collapsed state - no rotation */
|
|
703
|
+
tr:not(.x-grid-tree-node-expanded) .x-tree-expander::before {
|
|
704
|
+
transform: rotate(0deg) !important;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/* Hover effect - UniFi blue accent */
|
|
708
|
+
.x-tree-expander:hover::before {
|
|
709
|
+
color: #006EFF !important;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/* Gap before node icon */
|
|
713
|
+
.x-tree-icon-parent,
|
|
714
|
+
.x-tree-icon-leaf,
|
|
715
|
+
.x-tree-icon {
|
|
716
|
+
margin-left: 2px !important;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/* Empty elbows - no extra margin */
|
|
720
|
+
.x-tree-elbow-empty,
|
|
721
|
+
.x-tree-elbow {
|
|
722
|
+
margin-right: 0 !important;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/* =====================================================
|
|
726
|
+
v5.36: CHECKBOXES & RADIO BUTTONS - UniFi Authentic
|
|
727
|
+
Extracted from live UniFi Network Application
|
|
728
|
+
===================================================== */
|
|
729
|
+
|
|
730
|
+
/* Remove the old filter-based styling */
|
|
731
|
+
.x-form-checkbox-default,
|
|
732
|
+
.x-form-radio-default,
|
|
733
|
+
.x-column-header-checkbox .x-column-header-checkbox::after,
|
|
734
|
+
.x-grid-checkcolumn::after,
|
|
735
|
+
.x-menu-item-checked .x-menu-item-icon-default.x-menu-item-checkbox,
|
|
736
|
+
.x-menu-item-unchecked .x-menu-item-icon-default.x-menu-item-checkbox {
|
|
737
|
+
filter: none !important;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
/* The actual INPUT element that receives clicks - needs pointer cursor */
|
|
741
|
+
.x-form-cb-input {
|
|
742
|
+
cursor: pointer !important;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/* CHECKBOXES - Base styling (SPAN element - visual display) */
|
|
746
|
+
.x-form-checkbox,
|
|
747
|
+
.x-form-checkbox-default {
|
|
748
|
+
display: inline-block !important;
|
|
749
|
+
width: 16px !important;
|
|
750
|
+
min-width: 16px !important;
|
|
751
|
+
height: 16px !important;
|
|
752
|
+
min-height: 16px !important;
|
|
753
|
+
border-radius: 4px !important;
|
|
754
|
+
border: 0.8px solid #737C87 !important;
|
|
755
|
+
background-color: rgba(0, 0, 0, 0.01) !important;
|
|
756
|
+
background-image: none !important;
|
|
757
|
+
cursor: pointer !important;
|
|
758
|
+
transition: border-color 0.2s linear, background-color 0.2s linear !important;
|
|
759
|
+
position: relative !important;
|
|
760
|
+
box-sizing: border-box !important;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
/* Checkbox - Checked state */
|
|
764
|
+
.x-form-cb-checked .x-form-checkbox {
|
|
765
|
+
border-color: #4797FF !important;
|
|
766
|
+
background-color: #4797FF !important;
|
|
767
|
+
background-image: none !important;
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
/* Checkbox checkmark using ::after pseudo-element */
|
|
771
|
+
.x-form-cb-checked .x-form-checkbox::after {
|
|
772
|
+
content: '✓' !important;
|
|
773
|
+
position: absolute !important;
|
|
774
|
+
color: white !important;
|
|
775
|
+
font-size: 12px !important;
|
|
776
|
+
font-weight: bold !important;
|
|
777
|
+
top: 50% !important;
|
|
778
|
+
left: 50% !important;
|
|
779
|
+
transform: translate(-50%, -50%) !important;
|
|
780
|
+
pointer-events: none !important;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/* Checkbox - Hover state */
|
|
784
|
+
.x-form-checkbox:hover,
|
|
785
|
+
.x-form-cb:hover .x-form-checkbox,
|
|
786
|
+
.x-form-cb-wrap:hover .x-form-checkbox {
|
|
787
|
+
border-color: #4797FF !important;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/* RADIO BUTTONS - Base styling */
|
|
791
|
+
.x-form-radio,
|
|
792
|
+
.x-form-radio-default {
|
|
793
|
+
display: inline-block !important;
|
|
794
|
+
width: 16px !important;
|
|
795
|
+
min-width: 16px !important;
|
|
796
|
+
height: 16px !important;
|
|
797
|
+
min-height: 16px !important;
|
|
798
|
+
border-radius: 50% !important;
|
|
799
|
+
border: 0.8px solid #737C87 !important;
|
|
800
|
+
background-color: rgba(0, 0, 0, 0.01) !important;
|
|
801
|
+
background-image: none !important;
|
|
802
|
+
cursor: pointer !important;
|
|
803
|
+
position: relative !important;
|
|
804
|
+
transition: border-color 0.2s linear !important;
|
|
805
|
+
box-sizing: border-box !important;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/* Radio - Checked state border */
|
|
809
|
+
.x-form-cb-checked .x-form-radio {
|
|
810
|
+
border-color: #4797FF !important;
|
|
811
|
+
background-color: rgba(0, 0, 0, 0.01) !important;
|
|
812
|
+
background-image: none !important;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/* Radio - Inner dot using ::after pseudo-element */
|
|
816
|
+
.x-form-radio::after {
|
|
817
|
+
content: '' !important;
|
|
818
|
+
position: absolute !important;
|
|
819
|
+
top: 50% !important;
|
|
820
|
+
left: 50% !important;
|
|
821
|
+
width: 6px !important;
|
|
822
|
+
height: 6px !important;
|
|
823
|
+
border-radius: 50% !important;
|
|
824
|
+
background-color: transparent !important;
|
|
825
|
+
transform: translate(-50%, -50%) scale(0) !important;
|
|
826
|
+
transition: transform 0.2s ease, background-color 0.2s ease !important;
|
|
827
|
+
pointer-events: none !important;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/* Radio - Checked inner dot */
|
|
831
|
+
.x-form-cb-checked .x-form-radio::after {
|
|
832
|
+
background-color: #4797FF !important;
|
|
833
|
+
transform: translate(-50%, -50%) scale(1) !important;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
/* Radio - Hover state */
|
|
837
|
+
.x-form-radio:hover,
|
|
838
|
+
.x-form-cb-wrap:hover .x-form-radio {
|
|
839
|
+
border-color: #4797FF !important;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
/* =====================================================
|
|
843
|
+
BUTTONS - Clean, minimal style (UniFi authentic)
|
|
844
|
+
===================================================== */
|
|
845
|
+
/* v5.88: Respect inline display:none - Proxmox hides buttons dynamically and !important was overriding */
|
|
846
|
+
.x-btn-default-small[style*="display: none"],
|
|
847
|
+
.x-btn-default-small[style*="display:none"] {
|
|
848
|
+
display: none !important;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
.x-btn-default-small {
|
|
852
|
+
background-color: #006EFF;
|
|
853
|
+
border: none;
|
|
854
|
+
border-radius: 6px;
|
|
855
|
+
padding: 5px 10px !important;
|
|
856
|
+
min-height: 26px !important;
|
|
857
|
+
/* v5.29: Header buttons (Create VM, Create CT, root@pam) - consistent 28px height with vertical centering */
|
|
858
|
+
/* Exclude tag edit buttons (display:none when hidden, :has(.fa-check) for checkmark) */
|
|
859
|
+
height: 28px !important;
|
|
860
|
+
min-height: 28px !important;
|
|
861
|
+
display: flex !important;
|
|
862
|
+
align-items: center !important;
|
|
863
|
+
padding: 3px 8px !important;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
.x-btn-default-small .x-btn-inner {
|
|
867
|
+
color: #ffffff;
|
|
868
|
+
padding: 2px 4px !important;
|
|
869
|
+
display: inline-flex !important;
|
|
870
|
+
align-items: center !important;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/* Flex container logic (Merged from L3242) */
|
|
874
|
+
.x-btn.x-btn-default-small .x-btn-button {
|
|
875
|
+
display: flex !important;
|
|
876
|
+
align-items: center !important;
|
|
877
|
+
justify-content: center !important;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
.x-btn.x-btn-default-small .x-btn-icon-el {
|
|
881
|
+
justify-content: center !important;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
.x-btn-default-small.x-btn-over,
|
|
885
|
+
.x-keyboard-mode .x-btn-default-small.x-btn-focus {
|
|
886
|
+
background-color: #338BFF;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
/* Pressed state */
|
|
890
|
+
.x-btn-default-small.x-btn-pressed,
|
|
891
|
+
.x-btn-default-small.x-btn-menu-active {
|
|
892
|
+
background-color: #0056CC;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
/* Fix #29: Disabled buttons — explicit muted colors instead of opacity */
|
|
896
|
+
.x-btn-default-small.x-btn.x-btn-disabled {
|
|
897
|
+
opacity: 1 !important;
|
|
898
|
+
background-color: #003A80 !important;
|
|
899
|
+
border-color: #002D66 !important;
|
|
900
|
+
}
|
|
901
|
+
.x-btn-default-small.x-btn.x-btn-disabled .x-btn-inner {
|
|
902
|
+
color: #8A9099 !important;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
/* Toolbar Buttons - Compact & Transparent */
|
|
906
|
+
.x-btn-default-toolbar-small {
|
|
907
|
+
background-color: transparent;
|
|
908
|
+
border: 1px solid #34383D !important;
|
|
909
|
+
padding: 4px 8px !important;
|
|
910
|
+
border-radius: 4px;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
.x-btn-default-toolbar-small .x-btn-inner-default-toolbar-small {
|
|
914
|
+
color: #B7BCC2;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
.x-btn-default-toolbar-small .x-btn-icon-el-default-toolbar-small {
|
|
918
|
+
color: #B7BCC2;
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
/* v5.8: Toolbar button icon vertical centering fix */
|
|
922
|
+
.x-btn-wrap.x-btn-wrap-default-toolbar-small {
|
|
923
|
+
align-items: center !important;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
.x-btn-icon-el.x-btn-icon-el-default-toolbar-small {
|
|
927
|
+
display: flex !important;
|
|
928
|
+
align-items: center !important;
|
|
929
|
+
justify-content: center !important;
|
|
930
|
+
line-height: 16px !important;
|
|
931
|
+
height: 16px !important;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
.x-btn-inner.x-btn-inner-default-toolbar-small {
|
|
935
|
+
display: flex !important;
|
|
936
|
+
align-items: center !important;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
.x-btn-default-toolbar-small .x-btn-wrap-default-toolbar-small.x-btn-arrow-right::after,
|
|
940
|
+
.x-btn-default-toolbar-small .x-btn-wrap-default-toolbar-small.x-btn-split-right::after {
|
|
941
|
+
filter: brightness(150%);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
.x-btn-default-toolbar-small.x-btn-over,
|
|
945
|
+
.x-keyboard-mode .x-btn-default-toolbar-small.x-btn-focus {
|
|
946
|
+
background-color: #34383D;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
.x-btn-default-toolbar-small.x-btn.x-btn-disabled {
|
|
950
|
+
opacity: 1 !important;
|
|
951
|
+
background-color: rgba(40, 43, 47, 0.5) !important;
|
|
952
|
+
border-color: #282B2F !important;
|
|
953
|
+
}
|
|
954
|
+
.x-btn-default-toolbar-small.x-btn.x-btn-disabled .x-btn-inner {
|
|
955
|
+
color: #555B63 !important;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
.x-btn-default-toolbar-small.x-btn.x-btn-menu-active,
|
|
959
|
+
.x-btn-default-toolbar-small.x-btn.x-btn-pressed {
|
|
960
|
+
background-color: #006EFF;
|
|
961
|
+
padding: 4px 8px !important; /* Fix #30: prevent width change when dropdown opens */
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
.x-btn-default-toolbar-small.x-btn.x-btn-pressed .x-btn-inner-default-toolbar-small,
|
|
965
|
+
.x-btn-default-toolbar-small.x-btn.x-btn-pressed .x-btn-icon-el-default-toolbar-small {
|
|
966
|
+
color: #ffffff;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
/* Server View cogwheel button height - match adjacent combobox (28px) */
|
|
970
|
+
.x-box-target:has(#view)>.x-btn {
|
|
971
|
+
height: 28px !important;
|
|
972
|
+
min-height: 28px !important;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/* Header buttons (Create VM, Create CT, root@pam) - consistent 28px height with vertical centering */
|
|
976
|
+
/* v5.29: Exclude tag edit buttons (display:none when hidden, :has(.fa-check) for checkmark) */
|
|
977
|
+
.x-btn.x-btn-default-small:not(.x-btn-default-toolbar-small):not([style*="display: none"]):not([style*="display:none"]):not(:has(.fa-check)) {
|
|
978
|
+
height: 28px !important;
|
|
979
|
+
min-height: 28px !important;
|
|
980
|
+
display: flex !important;
|
|
981
|
+
align-items: center !important;
|
|
982
|
+
padding: 3px 8px !important;
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
.x-btn.x-btn-default-small:not(.x-btn-default-toolbar-small):not([style*="display: none"]):not([style*="display:none"]):not(:has(.fa-check)) .x-btn-wrap {
|
|
986
|
+
display: flex !important;
|
|
987
|
+
align-items: center !important;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
.x-btn.x-btn-default-small:not(.x-btn-default-toolbar-small):not([style*="display: none"]):not([style*="display:none"]):not(:has(.fa-check)) .x-btn-inner {
|
|
991
|
+
display: flex !important;
|
|
992
|
+
align-items: center !important;
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
/* Fix dropdown arrows on split/arrow buttons */
|
|
996
|
+
.x-btn-wrap.x-btn-arrow-right::after,
|
|
997
|
+
.x-btn-wrap.x-btn-split-right::after {
|
|
998
|
+
height: 16px !important;
|
|
999
|
+
min-height: 16px !important;
|
|
1000
|
+
width: 20px !important;
|
|
1001
|
+
display: flex !important;
|
|
1002
|
+
align-items: center !important;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
/* v5.27: Fix icon-only buttons - hide inner element when button has no text */
|
|
1006
|
+
/* ExtJS adds x-btn-no-text class to buttons with only an icon */
|
|
1007
|
+
.x-btn-no-text .x-btn-inner,
|
|
1008
|
+
.x-btn-button.x-btn-no-text .x-btn-inner,
|
|
1009
|
+
.x-btn-button-default-toolbar-small.x-btn-no-text .x-btn-inner-default-toolbar-small,
|
|
1010
|
+
.x-btn-button-default-small.x-btn-no-text .x-btn-inner-default-small,
|
|
1011
|
+
.x-btn-button-default-small.x-btn-no-text>.x-btn-inner-default-small {
|
|
1012
|
+
display: none !important;
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/* =====================================================
|
|
1016
|
+
v5.8: TOOLBOX SCROLL ARROWS FIX
|
|
1017
|
+
ExtJS behavior:
|
|
1018
|
+
- Sets inline display:none when content NOT scrollable
|
|
1019
|
+
- Adds x-box-scroller-disabled class at boundary
|
|
1020
|
+
- No inline style when scrollable (show arrow)
|
|
1021
|
+
===================================================== */
|
|
1022
|
+
|
|
1023
|
+
/* Hide disabled scrollers (at boundary) */
|
|
1024
|
+
.x-box-scroller.x-box-scroller-disabled {
|
|
1025
|
+
display: none !important;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
/* Hide scrollers when ExtJS sets inline display:none (not scrollable) */
|
|
1029
|
+
/* Note: ExtJS uses "display:none" without space, check both formats */
|
|
1030
|
+
.x-box-scroller.x-box-scroller-toolbar[style*="display:none"],
|
|
1031
|
+
.x-box-scroller.x-box-scroller-toolbar[style*="display: none"] {
|
|
1032
|
+
display: none !important;
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
/* Show scrollers when content is scrollable (no inline display style, not disabled) */
|
|
1036
|
+
.x-toolbar-vertical .x-box-scroller-top:not(.x-box-scroller-disabled):not([style*="display"]),
|
|
1037
|
+
.x-toolbar-vertical .x-box-scroller-bottom:not(.x-box-scroller-disabled):not([style*="display"]) {
|
|
1038
|
+
display: flex !important;
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/* Style the vertical toolbar scrollers - arrow only, no background */
|
|
1042
|
+
.x-toolbar-vertical .x-box-scroller-top,
|
|
1043
|
+
.x-toolbar-vertical .x-box-scroller-bottom {
|
|
1044
|
+
width: 100% !important;
|
|
1045
|
+
height: 16px !important;
|
|
1046
|
+
left: 0 !important;
|
|
1047
|
+
right: 0 !important;
|
|
1048
|
+
background: transparent !important;
|
|
1049
|
+
background-image: none !important;
|
|
1050
|
+
filter: none !important;
|
|
1051
|
+
display: flex !important;
|
|
1052
|
+
align-items: center !important;
|
|
1053
|
+
justify-content: center !important;
|
|
1054
|
+
cursor: pointer !important;
|
|
1055
|
+
opacity: 1 !important;
|
|
1056
|
+
z-index: 100 !important;
|
|
1057
|
+
border: none !important;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
.x-toolbar-vertical .x-box-scroller-top {
|
|
1061
|
+
top: 0 !important;
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
.x-toolbar-vertical .x-box-scroller-bottom {
|
|
1065
|
+
bottom: 0 !important;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
/* Arrow icons */
|
|
1069
|
+
.x-toolbar-vertical .x-box-scroller-top::before {
|
|
1070
|
+
content: '▲' !important;
|
|
1071
|
+
font-size: 10px !important;
|
|
1072
|
+
color: #B7BCC2 !important;
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
.x-toolbar-vertical .x-box-scroller-bottom::before {
|
|
1076
|
+
content: '▼' !important;
|
|
1077
|
+
font-size: 10px !important;
|
|
1078
|
+
color: #B7BCC2 !important;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
/* Hover states */
|
|
1082
|
+
.x-toolbar-vertical .x-box-scroller-top:hover::before,
|
|
1083
|
+
.x-toolbar-vertical .x-box-scroller-bottom:hover::before {
|
|
1084
|
+
color: #F9FAFA !important;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
/* Re-hide disabled scrollers after styling */
|
|
1088
|
+
.x-toolbar-vertical .x-box-scroller.x-box-scroller-disabled {
|
|
1089
|
+
display: none !important;
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
/* =====================================================
|
|
1093
|
+
FORM ELEMENTS - Clean inputs (UniFi authentic)
|
|
1094
|
+
===================================================== */
|
|
1095
|
+
.x-form-trigger-default {
|
|
1096
|
+
background-color: transparent;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
/* Boundlist dropdown popup - UniFi style 4px radius */
|
|
1100
|
+
.x-boundlist {
|
|
1101
|
+
background-color: #282B2F;
|
|
1102
|
+
border: 1px solid #34383D;
|
|
1103
|
+
border-radius: 4px !important;
|
|
1104
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
|
|
1105
|
+
padding: 2px;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
.x-boundlist-item {
|
|
1109
|
+
background-color: transparent;
|
|
1110
|
+
border: none;
|
|
1111
|
+
border-radius: 4px !important;
|
|
1112
|
+
color: #DEE0E3;
|
|
1113
|
+
padding: 2px 8px;
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
.x-boundlist-selected {
|
|
1117
|
+
background-color: rgba(249, 250, 250, 0.07);
|
|
1118
|
+
color: #F9FAFA;
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
.x-boundlist-item-over {
|
|
1122
|
+
background-color: rgba(249, 250, 250, 0.04);
|
|
1123
|
+
color: #DEE0E3;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
/* v5.38: Fix boundlist inner container inheriting 8px radius from global rule */
|
|
1127
|
+
.x-boundlist-list-ct {
|
|
1128
|
+
border-radius: 4px !important;
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
/* Dropdown/floating grid pickers (e.g. ISO selector): readable column headers */
|
|
1132
|
+
.x-layer.x-grid .x-grid-header-ct,
|
|
1133
|
+
.x-layer.x-grid .x-column-header,
|
|
1134
|
+
.x-boundlist .x-grid-header-ct,
|
|
1135
|
+
.x-boundlist .x-column-header {
|
|
1136
|
+
background-color: var(--pm-bg-surface) !important;
|
|
1137
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.08) !important;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
.x-layer.x-grid .x-column-header-inner,
|
|
1141
|
+
.x-layer.x-grid .x-column-header-text,
|
|
1142
|
+
.x-layer.x-grid .x-column-header-text-inner,
|
|
1143
|
+
.x-layer.x-grid .x-column-header-text-default,
|
|
1144
|
+
.x-boundlist .x-column-header-inner,
|
|
1145
|
+
.x-boundlist .x-column-header-text,
|
|
1146
|
+
.x-boundlist .x-column-header-text-inner,
|
|
1147
|
+
.x-boundlist .x-column-header-text-default {
|
|
1148
|
+
color: var(--pm-text-bright) !important;
|
|
1149
|
+
font-weight: 700 !important;
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
.x-layer.x-grid .x-column-header-trigger,
|
|
1153
|
+
.x-boundlist .x-column-header-trigger {
|
|
1154
|
+
border-left-color: rgba(255, 255, 255, 0.08) !important;
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
.x-form-display-field-default {
|
|
1158
|
+
color: #B7BCC2;
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
.x-form-text-default {
|
|
1162
|
+
background-color: transparent;
|
|
1163
|
+
color: #F9FAFA;
|
|
1164
|
+
border-radius: 4px 0 0 4px !important;
|
|
1165
|
+
padding: 6px 10px !important;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
.x-form-trigger-wrap-default {
|
|
1169
|
+
border-color: var(--pm-border);
|
|
1170
|
+
border-radius: 4px !important;
|
|
1171
|
+
background-color: var(--pm-hover-medium);
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
.x-form-trigger-wrap-default.x-form-trigger-wrap-focus {
|
|
1175
|
+
border-color: var(--pm-accent);
|
|
1176
|
+
box-shadow: 0 0 0 3px var(--pm-focus-ring-color);
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
.x-form-item-label-default {
|
|
1180
|
+
color: #B7BCC2;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
.x-form-spinner-default {
|
|
1184
|
+
background-color: #282B2F;
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
/* v5.59: Make spinner buttons fill container with FontAwesome arrows */
|
|
1188
|
+
.x-form-spinner-up,
|
|
1189
|
+
.x-form-spinner-down {
|
|
1190
|
+
height: 13px !important;
|
|
1191
|
+
background-image: none !important;
|
|
1192
|
+
display: flex !important;
|
|
1193
|
+
align-items: center !important;
|
|
1194
|
+
justify-content: center !important;
|
|
1195
|
+
font-family: 'Font Awesome 6 Free', 'Font Awesome 5 Free', FontAwesome !important;
|
|
1196
|
+
font-weight: 900 !important;
|
|
1197
|
+
font-size: 7px !important;
|
|
1198
|
+
color: #B7BCC2 !important;
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
.x-form-spinner-up::before {
|
|
1202
|
+
content: '\f077' !important;
|
|
1203
|
+
display: block !important;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
.x-form-spinner-down::before {
|
|
1207
|
+
content: '\f078' !important;
|
|
1208
|
+
display: block !important;
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
/* v5.64: Dialog form field alignment - let ExtJS handle natural sizing */
|
|
1212
|
+
.x-window .x-container .x-form-trigger-wrap,
|
|
1213
|
+
.x-window .x-form-item-body .x-form-trigger-wrap {
|
|
1214
|
+
width: 100% !important;
|
|
1215
|
+
max-width: none !important;
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
/* Ensure input fills the trigger wrap */
|
|
1219
|
+
.x-window .x-container .x-form-trigger-wrap input.x-form-field {
|
|
1220
|
+
width: calc(100% - 2px) !important;
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
/* v5.63: Removed v5.61 margin-left rule that caused form alignment issues */
|
|
1224
|
+
|
|
1225
|
+
.x-form-cb-label-default {
|
|
1226
|
+
color: #B7BCC2;
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/* v5.41: Reduce gap between checkbox/radio and label */
|
|
1230
|
+
/* Label after checkbox - reduce left padding */
|
|
1231
|
+
.x-form-cb-label-after {
|
|
1232
|
+
padding-left: 6px !important;
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
/* Label before checkbox - reduce right padding */
|
|
1236
|
+
.x-form-cb-label-before {
|
|
1237
|
+
padding-right: 6px !important;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
.x-fieldset-default {
|
|
1241
|
+
border-color: #34383D;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
.x-fieldset-header-default>.x-fieldset-header-text {
|
|
1245
|
+
color: #F9FAFA;
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
/* =====================================================
|
|
1249
|
+
GRID / TABLE - UniFi authentic row hover
|
|
1250
|
+
===================================================== */
|
|
1251
|
+
.x-column-header {
|
|
1252
|
+
border-color: transparent !important;
|
|
1253
|
+
background-color: transparent !important;
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
/* Header Text - Bright White */
|
|
1257
|
+
.x-column-header-inner,
|
|
1258
|
+
.x-column-header-text {
|
|
1259
|
+
color: #F9FAFA !important;
|
|
1260
|
+
font-weight: 700 !important;
|
|
1261
|
+
font-size: 13px !important;
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
.x-grid-item,
|
|
1265
|
+
.x-column-header-default,
|
|
1266
|
+
.x-grid-cell-row-numberer {
|
|
1267
|
+
color: #DEE0E3 !important;
|
|
1268
|
+
background-color: transparent !important;
|
|
1269
|
+
border-color: transparent !important;
|
|
1270
|
+
font-size: 13px !important;
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
.x-column-header-trigger {
|
|
1274
|
+
border-color: transparent !important;
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
.x-grid-cell-special {
|
|
1278
|
+
border-color: transparent !important;
|
|
1279
|
+
}
|
|
1280
|
+
|
|
1281
|
+
.x-grid-group-hd {
|
|
1282
|
+
background-color: transparent !important;
|
|
1283
|
+
border-color: transparent !important;
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
.x-grid-group-title {
|
|
1287
|
+
color: #F9FAFA !important;
|
|
1288
|
+
font-weight: 700 !important;
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
.x-grid-header-ct {
|
|
1292
|
+
border: none !important;
|
|
1293
|
+
background-color: transparent !important;
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
/* Row separators (use td borders; more reliable than box-shadow on <tr>) */
|
|
1297
|
+
.x-grid td,
|
|
1298
|
+
.x-grid-td,
|
|
1299
|
+
.x-grid-cell,
|
|
1300
|
+
td.x-grid-cell {
|
|
1301
|
+
border: none !important;
|
|
1302
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
/* v5.53: Vertically center text in grid table cells */
|
|
1306
|
+
.x-grid-cell {
|
|
1307
|
+
vertical-align: middle !important;
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
/* Keep rows themselves flat; separators handled above */
|
|
1311
|
+
.x-grid-item {
|
|
1312
|
+
box-shadow: none !important;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
/* Slightly roomier rows (matches UniFi table density) */
|
|
1316
|
+
.x-grid-cell-inner {
|
|
1317
|
+
padding-top: 6px !important;
|
|
1318
|
+
padding-bottom: 6px !important;
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
/*
|
|
1322
|
+
Tasks + Cluster Log: compact rows (validated via DevTools)
|
|
1323
|
+
- Tasks: 4px top/bottom
|
|
1324
|
+
- Cluster Log: 4.5px top/bottom
|
|
1325
|
+
- Keep line-height stable and prevent action-column icons from inflating row height
|
|
1326
|
+
*/
|
|
1327
|
+
|
|
1328
|
+
/* Tasks grid (bottom Tasks panel) */
|
|
1329
|
+
div[id^="pveTaskViewer-"] .x-grid-cell-inner,
|
|
1330
|
+
div[id^="pveClusterTasks-"] .x-grid-cell-inner,
|
|
1331
|
+
[aria-label="Tasks"] .x-grid-view .x-grid-cell-inner {
|
|
1332
|
+
padding-top: 4px !important;
|
|
1333
|
+
padding-bottom: 4px !important;
|
|
1334
|
+
line-height: 15px !important;
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
/* Tasks action-column (chevron) can inflate row height unless centered */
|
|
1338
|
+
div[id^="pveTaskViewer-"] .x-grid-cell-inner-action-col,
|
|
1339
|
+
div[id^="pveClusterTasks-"] .x-grid-cell-inner-action-col,
|
|
1340
|
+
[aria-label="Tasks"] .x-grid-view .x-grid-cell-inner-action-col {
|
|
1341
|
+
display: flex !important;
|
|
1342
|
+
align-items: center !important;
|
|
1343
|
+
justify-content: center !important;
|
|
1344
|
+
padding-top: 4px !important;
|
|
1345
|
+
padding-bottom: 4px !important;
|
|
1346
|
+
line-height: 15px !important;
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
/* Cluster Log grid */
|
|
1350
|
+
div[id^="pveClusterLog-"] .x-grid-cell-inner,
|
|
1351
|
+
div[id^="pveLogView-"] .x-grid-cell-inner,
|
|
1352
|
+
[aria-label="Cluster Log"] .x-grid-view .x-grid-cell-inner {
|
|
1353
|
+
padding-top: 4.5px !important;
|
|
1354
|
+
padding-bottom: 4.5px !important;
|
|
1355
|
+
line-height: 15px !important;
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
.x-grid-item-alt {
|
|
1359
|
+
background-color: transparent !important;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
/* Ensure alternating rows have readable text */
|
|
1363
|
+
.x-grid-item-alt .x-grid-cell-inner,
|
|
1364
|
+
.x-grid-item-alt .x-grid-cell {
|
|
1365
|
+
color: #DEE0E3 !important;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
.x-grid-with-row-lines .x-grid-item {
|
|
1369
|
+
border-bottom: none !important;
|
|
1370
|
+
border: none !important;
|
|
1371
|
+
box-shadow: none !important;
|
|
1372
|
+
}
|
|
1373
|
+
|
|
1374
|
+
/* Optional: no trailing divider after the last row */
|
|
1375
|
+
.x-grid-with-row-lines .x-grid-item:last-child td.x-grid-cell,
|
|
1376
|
+
.x-grid-with-row-lines .x-grid-item:last-child .x-grid-td {
|
|
1377
|
+
border-bottom: none !important;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
.x-grid-with-row-lines .x-grid-item.x-grid-item-over {
|
|
1381
|
+
background-color: var(--pm-hover-subtle) !important;
|
|
1382
|
+
border: none !important;
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
.x-grid-with-row-lines .x-grid-item.x-grid-item-selected {
|
|
1386
|
+
background-color: rgba(0, 110, 255, 0.08) !important;
|
|
1387
|
+
box-shadow: rgba(71, 151, 255, 0.1) 0px 0px 0px 1000px inset !important;
|
|
1388
|
+
border: none !important;
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
.x-grid-item-over {
|
|
1392
|
+
background-color: hsla(214, 8%, 98%, 0.02) !important;
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
.x-grid-item-over .x-grid-cell {
|
|
1396
|
+
background-color: transparent !important;
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1399
|
+
/* Keep row separators stable on hover/selection (prevents 1px shift) */
|
|
1400
|
+
.x-grid-item-over .x-grid-cell,
|
|
1401
|
+
.x-grid-item-over .x-grid-td,
|
|
1402
|
+
.x-grid-item-over td.x-grid-cell,
|
|
1403
|
+
.x-grid-item-selected .x-grid-cell,
|
|
1404
|
+
.x-grid-item-selected .x-grid-td,
|
|
1405
|
+
.x-grid-item-selected td.x-grid-cell {
|
|
1406
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
.x-grid-item-selected {
|
|
1410
|
+
background-color: rgba(0, 110, 255, 0.08) !important;
|
|
1411
|
+
box-shadow: rgba(71, 151, 255, 0.1) 0px 0px 0px 1000px inset !important;
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
.x-grid-item-selected .x-grid-cell-inner {
|
|
1415
|
+
color: hsla(0, 0%, 100%, 1) !important;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
/* v5.16: Remove background highlight from parent nodes (folders/servers) when focused/selected via arrow */
|
|
1419
|
+
/* Only leaf nodes (VMs/CTs) should show the selection/focus background */
|
|
1420
|
+
.x-grid-item:not(.x-grid-tree-node-leaf).x-grid-item-focused,
|
|
1421
|
+
.x-grid-item:not(.x-grid-tree-node-leaf).x-grid-item-selected {
|
|
1422
|
+
background-color: transparent !important;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
/* More visible hover state */
|
|
1426
|
+
.x-grid-item-over .x-grid-cell-inner,
|
|
1427
|
+
.x-grid-item-over .x-grid-cell {
|
|
1428
|
+
color: #F9FAFA !important;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
.x-column-header-over,
|
|
1432
|
+
.x-column-header-open {
|
|
1433
|
+
background-color: #34383D;
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
.x-column-header-sort-ASC,
|
|
1437
|
+
.x-column-header-sort-DESC {
|
|
1438
|
+
background-color: #1b384c;
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
.x-grid-row-summary .x-grid-cell,
|
|
1442
|
+
.x-grid-row-summary .x-grid-rowwrap,
|
|
1443
|
+
.x-grid-row-summary .x-grid-cell-rowbody {
|
|
1444
|
+
background-color: #131416 !important;
|
|
1445
|
+
border-color: #34383D;
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
.x-grid-with-col-lines .x-grid-cell,
|
|
1449
|
+
.x-grid-with-col-lines .x-grid-item-over .x-grid-cell,
|
|
1450
|
+
.x-grid-with-col-lines .x-grid-item-selected .x-grid-cell {
|
|
1451
|
+
border-color: hsla(214, 8%, 98%, 0.07) !important;
|
|
1452
|
+
border-right-color: transparent !important;
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
.x-dd-drag-proxy {
|
|
1456
|
+
background-color: #282B2F;
|
|
1457
|
+
border: 1px solid #34383D;
|
|
1458
|
+
color: #B7BCC2;
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
.x-keyboard-mode .x-grid-item-focused {
|
|
1462
|
+
background-color: rgba(249, 250, 250, 0.07);
|
|
1463
|
+
color: #F9FAFA;
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
.x-keyboard-mode .x-grid-item-focused .x-grid-cell-inner::before {
|
|
1467
|
+
border-color: #006EFF;
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
.x-grid-empty {
|
|
1471
|
+
background-color: #131416;
|
|
1472
|
+
color: #737C87;
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1475
|
+
/* =====================================================
|
|
1476
|
+
MENUS - Floating, clean (UniFi authentic)
|
|
1477
|
+
===================================================== */
|
|
1478
|
+
.x-menu-default {
|
|
1479
|
+
border: 1px solid #34383D;
|
|
1480
|
+
border-radius: 8px;
|
|
1481
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
.x-menu-body-default {
|
|
1485
|
+
background-color: #282B2F;
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
.x-menu-header {
|
|
1489
|
+
background-color: #006EFF;
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
.x-menu-item-default.x-menu-item-separator {
|
|
1493
|
+
background-color: #282B2F;
|
|
1494
|
+
border-color: #34383D;
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
.x-menu-item-default.x-menu-item-focus,
|
|
1498
|
+
.x-menu-item-default.x-menu-item-active {
|
|
1499
|
+
background-color: rgba(249, 250, 250, 0.07) !important;
|
|
1500
|
+
color: #F9FAFA;
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
.x-menu-item-text-default {
|
|
1504
|
+
color: #DEE0E3;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
.x-menu-item-icon-default {
|
|
1508
|
+
color: #B7BCC2;
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
.x-menu-icon-separator-default {
|
|
1512
|
+
background-color: transparent;
|
|
1513
|
+
border-color: #34383D;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
/* =====================================================
|
|
1517
|
+
PANELS - Card-like containers (UniFi authentic)
|
|
1518
|
+
===================================================== */
|
|
1519
|
+
.x-panel-header-default {
|
|
1520
|
+
background-color: #131416;
|
|
1521
|
+
border: none;
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
.x-panel-header-default .x-tool-tool-el {
|
|
1525
|
+
background-color: transparent;
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
.x-tool-img {
|
|
1529
|
+
filter: brightness(175%);
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
.x-tool-over .x-tool-img {
|
|
1533
|
+
filter: brightness(200%);
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
/* v5.39: Replace pixelated close button sprite with crisp FontAwesome icon */
|
|
1537
|
+
.x-tool-tool-el.x-tool-close,
|
|
1538
|
+
.x-tool-img.x-tool-close {
|
|
1539
|
+
background-image: none !important;
|
|
1540
|
+
font-family: "FontAwesome" !important;
|
|
1541
|
+
font-size: 20px !important;
|
|
1542
|
+
line-height: 16px !important;
|
|
1543
|
+
text-align: center !important;
|
|
1544
|
+
color: #737C87 !important;
|
|
1545
|
+
transition: color 0.15s ease !important;
|
|
1546
|
+
filter: none !important;
|
|
1547
|
+
width: 16px !important;
|
|
1548
|
+
height: 16px !important;
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1551
|
+
.x-tool-tool-el.x-tool-close::before,
|
|
1552
|
+
.x-tool-img.x-tool-close::before {
|
|
1553
|
+
content: "\f00d" !important;
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
.x-tool:hover .x-tool-tool-el.x-tool-close,
|
|
1557
|
+
.x-tool:hover .x-tool-img.x-tool-close {
|
|
1558
|
+
color: #DEE0E3 !important;
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
.x-panel-header-title-default {
|
|
1562
|
+
color: #F9FAFA;
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
/* Panel header text (VM/Container titles in toolbar) */
|
|
1566
|
+
.x-panel-header-text,
|
|
1567
|
+
.x-panel-header-text-default,
|
|
1568
|
+
.x-panel-header-text.x-box-item,
|
|
1569
|
+
.x-toolbar .x-panel-header-text,
|
|
1570
|
+
.x-toolbar-item.x-panel-header-text {
|
|
1571
|
+
color: #F9FAFA !important;
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
/* Title text general */
|
|
1575
|
+
.x-title-text,
|
|
1576
|
+
.x-title-text-default {
|
|
1577
|
+
color: #F9FAFA !important;
|
|
1578
|
+
overflow: visible !important;
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
/* Panel header container - ensure proper visibility */
|
|
1582
|
+
.x-panel-header,
|
|
1583
|
+
.x-panel-header-default {
|
|
1584
|
+
overflow: visible !important;
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
.x-panel-body-default {
|
|
1588
|
+
background-color: var(--pm-bg-base);
|
|
1589
|
+
border-color: var(--pm-border);
|
|
1590
|
+
color: var(--pm-text-muted);
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
div[id^="pveResourceTree-"][id$="-body"] {
|
|
1594
|
+
border-color: var(--pm-bg-base);
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
/* =====================================================
|
|
1598
|
+
PROGRESS BARS - Clean, rounded (UniFi authentic)
|
|
1599
|
+
v5.17: Consolidated - removed duplicate section at end of file
|
|
1600
|
+
===================================================== */
|
|
1601
|
+
/* Fix: Widget containers need overflow visible to not clip progress bars */
|
|
1602
|
+
.x-container[id^="pmxInfoWidget"],
|
|
1603
|
+
.x-container.x-box-layout-ct {
|
|
1604
|
+
overflow: visible !important;
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
/* v5.32: Add padding gap to progress bar rows (CPU/Memory/SWAP/Bootdisk)
|
|
1608
|
+
Only targets containers with VISIBLE progress bars (excludes Status/HA State/Node/Unprivileged) */
|
|
1609
|
+
/* v5.94: Reduced vertical padding from 5px to 3px to prevent PBS summary panel clipping
|
|
1610
|
+
(ExtJS calculates body height before CSS padding → overflow hidden clips bottom rows) */
|
|
1611
|
+
.x-container[id^="pmxInfoWidget"].x-box-layout-ct:has(.x-progress:not([style*="display: none"]):not([style*="display:none"])) {
|
|
1612
|
+
padding: 3px 25px !important;
|
|
1613
|
+
}
|
|
1614
|
+
|
|
1615
|
+
/* v5.51: Fix horizontal padding alignment for rows with HIDDEN progress bars
|
|
1616
|
+
(Load average, KSM sharing, CPU(s), Kernel Version, Boot Mode, Manager Version)
|
|
1617
|
+
Only adjusts horizontal padding to match visible progress bar rows, keeps vertical minimal */
|
|
1618
|
+
.x-container[id^="pmxInfoWidget"].x-box-layout-ct:has(.x-progress[style*="display: none"]),
|
|
1619
|
+
.x-container[id^="pmxInfoWidget"].x-box-layout-ct:has(.x-progress[style*="display:none"]) {
|
|
1620
|
+
padding-left: 25px !important;
|
|
1621
|
+
padding-right: 25px !important;
|
|
1622
|
+
}
|
|
1623
|
+
|
|
1624
|
+
/* v5.51: Repository Status row uses different ID pattern */
|
|
1625
|
+
.x-container[id^="pmxNodeInfoRepoStatus"].x-box-layout-ct {
|
|
1626
|
+
padding-left: 25px !important;
|
|
1627
|
+
padding-right: 25px !important;
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
/* v5.94: Fix PBS summary panel clipping - reduce body padding to fit all rows
|
|
1631
|
+
PBS panel has 9 info widgets in a smaller body (243px); default 15px top/bottom
|
|
1632
|
+
padding causes scrollHeight to exceed clientHeight → bottom rows clipped */
|
|
1633
|
+
div[id^="pbsNodeInfoPanel"][id$="-body"] {
|
|
1634
|
+
padding-top: 5px !important;
|
|
1635
|
+
padding-bottom: 5px !important;
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
/* v5.22: Removed height:inherit - only min-height:auto is needed */
|
|
1639
|
+
/* height:inherit was breaking widget containers, ExtJS inline heights work without it */
|
|
1640
|
+
.x-container[id^="pmxInfoWidget"] .x-box-inner,
|
|
1641
|
+
.x-container.x-box-layout-ct .x-box-inner {
|
|
1642
|
+
min-height: auto !important;
|
|
1643
|
+
}
|
|
1644
|
+
|
|
1645
|
+
/* v5.22: Fix pmxInfoWidget container heights - need 24px to fit 8px progress bars */
|
|
1646
|
+
[id^="pmxInfoWidget"][id$="-innerCt"] {
|
|
1647
|
+
min-height: 24px !important;
|
|
1648
|
+
overflow: visible !important;
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
/* Progress bar outer container (track) */
|
|
1652
|
+
.x-progress,
|
|
1653
|
+
.x-progress-default {
|
|
1654
|
+
height: 8px !important;
|
|
1655
|
+
min-height: 8px !important;
|
|
1656
|
+
max-height: 8px !important;
|
|
1657
|
+
border-radius: 5px !important;
|
|
1658
|
+
overflow: hidden !important;
|
|
1659
|
+
background-color: var(--pwt-gauge-back) !important;
|
|
1660
|
+
border: none !important;
|
|
1661
|
+
padding: 0 !important;
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
/* Progress bar inner fill - v5.31: Updated to UniFi blue #4797FF */
|
|
1665
|
+
.x-progress-bar,
|
|
1666
|
+
.x-progress-bar-default,
|
|
1667
|
+
.x-progress-default .x-progress-bar-default {
|
|
1668
|
+
height: 8px !important;
|
|
1669
|
+
min-height: 8px !important;
|
|
1670
|
+
max-height: 8px !important;
|
|
1671
|
+
border-radius: 5px !important;
|
|
1672
|
+
border: none !important;
|
|
1673
|
+
background-color: var(--pwt-gauge-default) !important;
|
|
1674
|
+
background-image: none !important;
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
/* Hide progress text overlay */
|
|
1678
|
+
.x-progress-text,
|
|
1679
|
+
.x-progress-default .x-progress-text {
|
|
1680
|
+
display: none !important;
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
/* Warning state */
|
|
1684
|
+
.x-progress.warning .x-progress-bar,
|
|
1685
|
+
.x-progress.warning .x-progress-bar-default {
|
|
1686
|
+
background-color: var(--pwt-gauge-warn) !important;
|
|
1687
|
+
}
|
|
1688
|
+
|
|
1689
|
+
/* Critical state */
|
|
1690
|
+
.x-progress.critical .x-progress-bar,
|
|
1691
|
+
.x-progress.critical .x-progress-bar-default {
|
|
1692
|
+
background-color: var(--pwt-gauge-crit) !important;
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
/* =====================================================
|
|
1696
|
+
SPLITTERS - Minimal
|
|
1697
|
+
===================================================== */
|
|
1698
|
+
.x-splitter {
|
|
1699
|
+
background-color: var(--pm-bg-base);
|
|
1700
|
+
}
|
|
1701
|
+
|
|
1702
|
+
/* Horizontal splitter (between main content and Tasks panel) - visible divider line */
|
|
1703
|
+
.x-splitter-horizontal,
|
|
1704
|
+
.x-splitter[aria-orientation="horizontal"] {
|
|
1705
|
+
background-color: transparent !important;
|
|
1706
|
+
border-top: 1px solid var(--pm-border) !important;
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
/* Vertical splitter - gap with visible line */
|
|
1710
|
+
.x-splitter-vertical {
|
|
1711
|
+
width: 7px !important;
|
|
1712
|
+
min-width: 7px !important;
|
|
1713
|
+
background-color: transparent !important;
|
|
1714
|
+
border-right: 1px solid #444444 !important;
|
|
1715
|
+
z-index: 10 !important;
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
.x-keyboard-mode .x-splitter-focus::after {
|
|
1719
|
+
border-color: #006EFF;
|
|
1720
|
+
}
|
|
1721
|
+
|
|
1722
|
+
/* =====================================================
|
|
1723
|
+
TABS - Clean, flat (UniFi authentic)
|
|
1724
|
+
===================================================== */
|
|
1725
|
+
.x-tab-bar-default {
|
|
1726
|
+
background-color: #131416;
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
.x-tab-default.x-tab-over {
|
|
1730
|
+
background-color: rgba(249, 250, 250, 0.04);
|
|
1731
|
+
border: none;
|
|
1732
|
+
}
|
|
1733
|
+
|
|
1734
|
+
/* Remove white focus border/outline from tabs (v5.46) */
|
|
1735
|
+
.x-tab:focus,
|
|
1736
|
+
.x-tab.x-tab-focus,
|
|
1737
|
+
.x-tab.x-tab-active:focus,
|
|
1738
|
+
.x-keyboard-mode .x-tab:focus,
|
|
1739
|
+
.x-keyboard-mode .x-tab-focus,
|
|
1740
|
+
.x-keyboard-mode .x-tab-active.x-tab-focus,
|
|
1741
|
+
.x-tab-default:focus,
|
|
1742
|
+
.x-tab-default.x-tab-focus,
|
|
1743
|
+
.x-tab-bar .x-tab:focus,
|
|
1744
|
+
.x-tab-bar .x-tab.x-tab-focus {
|
|
1745
|
+
outline: none !important;
|
|
1746
|
+
box-shadow: none !important;
|
|
1747
|
+
border-color: transparent !important;
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
.x-tab:focus::before,
|
|
1751
|
+
.x-tab:focus::after,
|
|
1752
|
+
.x-tab.x-tab-focus::before,
|
|
1753
|
+
.x-tab.x-tab-focus::after,
|
|
1754
|
+
.x-keyboard-mode .x-tab:focus::before,
|
|
1755
|
+
.x-keyboard-mode .x-tab:focus::after {
|
|
1756
|
+
border: none !important;
|
|
1757
|
+
outline: none !important;
|
|
1758
|
+
box-shadow: none !important;
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
|
+
.x-tab-default.x-tab.x-tab-active {
|
|
1762
|
+
background-color: #006EFF;
|
|
1763
|
+
border: none;
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1766
|
+
.x-tab-default.x-tab.x-tab-disabled {
|
|
1767
|
+
background-color: transparent;
|
|
1768
|
+
border: none;
|
|
1769
|
+
color: #737C87;
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
.x-keyboard-mode .x-tab-default.x-tab-focus,
|
|
1773
|
+
.x-keyboard-mode .x-tab-default.x-tab-focus.x-tab-active {
|
|
1774
|
+
background-color: #006EFF;
|
|
1775
|
+
border: none;
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
.x-tab-default-top {
|
|
1779
|
+
background-color: #131416;
|
|
1780
|
+
border: none;
|
|
1781
|
+
}
|
|
1782
|
+
|
|
1783
|
+
.x-tab-inner-default {
|
|
1784
|
+
color: #B7BCC2;
|
|
1785
|
+
}
|
|
1786
|
+
|
|
1787
|
+
.x-tab-active .x-tab-inner-default {
|
|
1788
|
+
color: #ffffff;
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
/* =====================================================
|
|
1792
|
+
TOOLTIPS (UniFi authentic)
|
|
1793
|
+
===================================================== */
|
|
1794
|
+
.x-tip-default {
|
|
1795
|
+
background-color: #282B2F;
|
|
1796
|
+
border: 1px solid #34383D;
|
|
1797
|
+
border-radius: 6px;
|
|
1798
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
.x-tip-body-default {
|
|
1802
|
+
color: #DEE0E3;
|
|
1803
|
+
}
|
|
1804
|
+
|
|
1805
|
+
.x-tip-form-invalid {
|
|
1806
|
+
background-color: #282B2F;
|
|
1807
|
+
border-color: #f03a3e;
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1810
|
+
.x-tip-body-form-invalid {
|
|
1811
|
+
color: #f03a3e;
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
/* =====================================================
|
|
1815
|
+
TOOLBARS - Minimal borders (UniFi authentic)
|
|
1816
|
+
===================================================== */
|
|
1817
|
+
.x-toolbar {
|
|
1818
|
+
background-color: #131416;
|
|
1819
|
+
}
|
|
1820
|
+
|
|
1821
|
+
.x-toolbar-default {
|
|
1822
|
+
background-color: #131416;
|
|
1823
|
+
border: none;
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
.x-toolbar-default.x-docked-top {
|
|
1827
|
+
border: none;
|
|
1828
|
+
border-bottom: 1px solid #282B2F;
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1831
|
+
.x-toolbar-default .x-toolbar-separator {
|
|
1832
|
+
border-color: #34383D;
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1835
|
+
.x-toolbar-text-default {
|
|
1836
|
+
color: #B7BCC2;
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
/* =====================================================
|
|
1840
|
+
TREE LIST - Sidebar navigation (UniFi authentic)
|
|
1841
|
+
===================================================== */
|
|
1842
|
+
.x-treelist-item,
|
|
1843
|
+
.x-treelist-item-tool {
|
|
1844
|
+
background-color: #131416;
|
|
1845
|
+
border-radius: 4px !important;
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
/* v5.84: Fix horizontal scrollbar in resource tree
|
|
1849
|
+
ExtJS sets inline 'overflow: hidden auto' which causes 1px horizontal scroll.
|
|
1850
|
+
Force overflow-x: hidden while preserving vertical scroll.
|
|
1851
|
+
Note: Must use .x-fit-item compound selector to win over rule at line ~3365 */
|
|
1852
|
+
[id^="pveResourceTree"] .x-tree-view,
|
|
1853
|
+
[id^="pveResourceTree"] .x-tree-view.x-fit-item {
|
|
1854
|
+
overflow-x: hidden !important;
|
|
1855
|
+
}
|
|
1856
|
+
|
|
1857
|
+
/* Add spacing between tree items - v5.33: Reduced padding for compactness */
|
|
1858
|
+
.x-treelist-row,
|
|
1859
|
+
.x-tree-cell,
|
|
1860
|
+
.x-grid-cell-treecolumn {
|
|
1861
|
+
padding: 0px 8px !important;
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1864
|
+
/* v5.9: UniFi-STYLE SELECTED ITEM (matching UniFi Controller)
|
|
1865
|
+
Uses subtle background + blue icon AND text with ::before pseudo-element */
|
|
1866
|
+
|
|
1867
|
+
.x-treelist-item-text,
|
|
1868
|
+
.x-treelist-item-icon {
|
|
1869
|
+
color: rgba(255, 255, 255, 0.75);
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1872
|
+
/* Remove ALL old hover/selected background styles */
|
|
1873
|
+
.x-treelist-row,
|
|
1874
|
+
.x-treelist-row:hover,
|
|
1875
|
+
.x-treelist-row-over,
|
|
1876
|
+
.x-treelist-item-selected>.x-treelist-row,
|
|
1877
|
+
.x-treelist-item-selected>.x-treelist-row:hover,
|
|
1878
|
+
.x-treelist-item-expanded>.x-treelist-row,
|
|
1879
|
+
.x-treelist-item-expanded>.x-treelist-row-over,
|
|
1880
|
+
.x-treelist-item-expandable>.x-treelist-row,
|
|
1881
|
+
.x-treelist-item-expandable>.x-treelist-row-over {
|
|
1882
|
+
background: none !important;
|
|
1883
|
+
background-color: transparent !important;
|
|
1884
|
+
box-shadow: none !important;
|
|
1885
|
+
border-left: none !important;
|
|
1886
|
+
position: relative !important;
|
|
1887
|
+
z-index: 1 !important;
|
|
1888
|
+
border-radius: 4px !important;
|
|
1889
|
+
}
|
|
1890
|
+
|
|
1891
|
+
/* Pseudo-element for ALL background effects */
|
|
1892
|
+
.x-treelist-row::before {
|
|
1893
|
+
content: '' !important;
|
|
1894
|
+
display: block !important;
|
|
1895
|
+
position: absolute !important;
|
|
1896
|
+
top: 0 !important;
|
|
1897
|
+
left: 0 !important;
|
|
1898
|
+
right: 0 !important;
|
|
1899
|
+
bottom: 0 !important;
|
|
1900
|
+
width: 100% !important;
|
|
1901
|
+
height: 100% !important;
|
|
1902
|
+
border-radius: 4px !important;
|
|
1903
|
+
background: transparent !important;
|
|
1904
|
+
opacity: 0 !important;
|
|
1905
|
+
transform: scale(0.95) !important;
|
|
1906
|
+
transition: opacity 0.15s ease, transform 0.15s ease !important;
|
|
1907
|
+
z-index: -1 !important;
|
|
1908
|
+
pointer-events: none !important;
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
/* Hover state - ONLY via :hover pseudo-class */
|
|
1912
|
+
.x-treelist-row:hover::before {
|
|
1913
|
+
background: rgb(40, 43, 47) !important;
|
|
1914
|
+
opacity: 0.5 !important;
|
|
1915
|
+
transform: scale(1) !important;
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
/* DISABLE the x-treelist-row-over class effect (ExtJS adds this to parents) */
|
|
1919
|
+
.x-treelist-row-over::before {
|
|
1920
|
+
opacity: 0 !important;
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1923
|
+
/* But if it's ALSO being hovered directly, show the effect */
|
|
1924
|
+
.x-treelist-row-over:hover::before {
|
|
1925
|
+
background: rgb(40, 43, 47) !important;
|
|
1926
|
+
opacity: 0.5 !important;
|
|
1927
|
+
transform: scale(1) !important;
|
|
1928
|
+
}
|
|
1929
|
+
|
|
1930
|
+
/* Selected state background */
|
|
1931
|
+
.x-treelist-item-selected>.x-treelist-row::before {
|
|
1932
|
+
background: rgb(40, 43, 47) !important;
|
|
1933
|
+
opacity: 1 !important;
|
|
1934
|
+
transform: scale(1) !important;
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
/* Selected + hover - slightly lighter */
|
|
1938
|
+
.x-treelist-item-selected>.x-treelist-row:hover::before {
|
|
1939
|
+
background: rgb(50, 53, 57) !important;
|
|
1940
|
+
opacity: 1 !important;
|
|
1941
|
+
}
|
|
1942
|
+
|
|
1943
|
+
/* Selected item text - BLUE like UniFi */
|
|
1944
|
+
.x-treelist-item-selected>.x-treelist-row .x-treelist-item-text {
|
|
1945
|
+
color: rgb(71, 151, 255) !important;
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
/* Selected item icon - BLUE like UniFi */
|
|
1949
|
+
.x-treelist-item-selected>.x-treelist-row .x-treelist-item-icon {
|
|
1950
|
+
color: rgb(71, 151, 255) !important;
|
|
1951
|
+
}
|
|
1952
|
+
|
|
1953
|
+
/* Parent item containing selected child - WHITE text and icon */
|
|
1954
|
+
.x-treelist-item:has(.x-treelist-item-selected)>.x-treelist-row .x-treelist-item-text {
|
|
1955
|
+
color: #F9FAFA !important;
|
|
1956
|
+
}
|
|
1957
|
+
|
|
1958
|
+
.x-treelist-item:has(.x-treelist-item-selected)>.x-treelist-row .x-treelist-item-icon {
|
|
1959
|
+
color: #F9FAFA !important;
|
|
1960
|
+
}
|
|
1961
|
+
|
|
1962
|
+
/* Reset non-selected child items */
|
|
1963
|
+
.x-treelist-item-selected .x-treelist-item:not(.x-treelist-item-selected):not(:has(.x-treelist-item-selected))>.x-treelist-row::before {
|
|
1964
|
+
opacity: 0 !important;
|
|
1965
|
+
}
|
|
1966
|
+
|
|
1967
|
+
.x-treelist-item-selected .x-treelist-item:not(.x-treelist-item-selected):not(:has(.x-treelist-item-selected))>.x-treelist-row:hover::before {
|
|
1968
|
+
opacity: 0.5 !important;
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
.x-treelist-item-selected .x-treelist-item:not(.x-treelist-item-selected):not(:has(.x-treelist-item-selected)) .x-treelist-item-text,
|
|
1972
|
+
.x-treelist-item-selected .x-treelist-item:not(.x-treelist-item-selected):not(:has(.x-treelist-item-selected)) .x-treelist-item-icon {
|
|
1973
|
+
color: #B7BCC2 !important;
|
|
1974
|
+
}
|
|
1975
|
+
|
|
1976
|
+
.x-treelist-pve-nav {
|
|
1977
|
+
background-color: #131416;
|
|
1978
|
+
border: none;
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
/* =====================================================
|
|
1982
|
+
WINDOWS / DIALOGS (UniFi authentic)
|
|
1983
|
+
===================================================== */
|
|
1984
|
+
/* v5.50: Reduced shadow intensity for cleaner look */
|
|
1985
|
+
.x-window-default {
|
|
1986
|
+
background-color: #131416;
|
|
1987
|
+
border: 1px solid #34383D;
|
|
1988
|
+
border-radius: 8px;
|
|
1989
|
+
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1);
|
|
1990
|
+
}
|
|
1991
|
+
|
|
1992
|
+
.x-window-header-default {
|
|
1993
|
+
background-color: #282B2F;
|
|
1994
|
+
border: none;
|
|
1995
|
+
border-radius: 8px 8px 0 0;
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
.x-window-header-default .x-mask {
|
|
1999
|
+
background-color: rgba(40, 43, 47, 0.7);
|
|
2000
|
+
}
|
|
2001
|
+
|
|
2002
|
+
.x-window-header-title-default {
|
|
2003
|
+
color: #F9FAFA;
|
|
2004
|
+
}
|
|
2005
|
+
|
|
2006
|
+
.x-window-body-default {
|
|
2007
|
+
background-color: #131416;
|
|
2008
|
+
border: none;
|
|
2009
|
+
color: #B7BCC2;
|
|
2010
|
+
}
|
|
2011
|
+
|
|
2012
|
+
.x-window-ghost {
|
|
2013
|
+
background-color: #131416;
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
.x-window-header-default .x-tool-img {
|
|
2017
|
+
background-color: transparent;
|
|
2018
|
+
}
|
|
2019
|
+
|
|
2020
|
+
.x-message-box .x-window-body {
|
|
2021
|
+
background-color: #282B2F;
|
|
2022
|
+
}
|
|
2023
|
+
|
|
2024
|
+
/* =====================================================
|
|
2025
|
+
v5.17 FIX: Dialog button overlap fix
|
|
2026
|
+
ExtJS uses absolute positioning for buttons, but theme's
|
|
2027
|
+
display:flex !important was overriding inline display:none
|
|
2028
|
+
on hidden buttons (OK/Cancel in Yes/No dialogs)
|
|
2029
|
+
===================================================== */
|
|
2030
|
+
/* Respect ExtJS inline display:none on hidden dialog buttons */
|
|
2031
|
+
.x-message-box .x-btn.x-btn-default-small[style*="display: none"],
|
|
2032
|
+
.x-message-box .x-btn.x-btn-default-small[style*="display:none"],
|
|
2033
|
+
.x-window .x-toolbar-footer .x-btn[style*="display: none"],
|
|
2034
|
+
.x-window .x-toolbar-footer .x-btn[style*="display:none"] {
|
|
2035
|
+
display: none !important;
|
|
2036
|
+
}
|
|
2037
|
+
|
|
2038
|
+
/* =====================================================
|
|
2039
|
+
v5.37 FIX: Create Wizard footer clipping
|
|
2040
|
+
Some wizards position their footer toolbar with inline top/height.
|
|
2041
|
+
If theme tweaks change control heights/padding, the footer can extend
|
|
2042
|
+
past the window bottom and get clipped (the window has overflow:hidden).
|
|
2043
|
+
Anchor wizard footers to bottom to keep Back/Next/Advanced visible.
|
|
2044
|
+
===================================================== */
|
|
2045
|
+
.x-window[id^="pveQemuCreateWizard-"] .x-toolbar-footer,
|
|
2046
|
+
.x-window[id^="pveLxcCreateWizard-"] .x-toolbar-footer {
|
|
2047
|
+
top: auto !important;
|
|
2048
|
+
bottom: 0 !important;
|
|
2049
|
+
left: 0 !important;
|
|
2050
|
+
right: 0 !important;
|
|
2051
|
+
width: auto !important;
|
|
2052
|
+
box-sizing: border-box !important;
|
|
2053
|
+
padding: 8px 16px !important;
|
|
2054
|
+
height: auto !important;
|
|
2055
|
+
display: flex !important;
|
|
2056
|
+
align-items: center !important;
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
/* Dialog footer - use flexbox for proper button spacing */
|
|
2060
|
+
.x-message-box .x-toolbar-footer {
|
|
2061
|
+
display: flex !important;
|
|
2062
|
+
justify-content: flex-end !important;
|
|
2063
|
+
align-items: center !important;
|
|
2064
|
+
gap: 8px !important;
|
|
2065
|
+
padding: 12px 16px !important;
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
.x-message-box .x-toolbar-footer .x-box-inner,
|
|
2069
|
+
.x-message-box .x-toolbar-footer .x-box-inner {
|
|
2070
|
+
display: flex !important;
|
|
2071
|
+
justify-content: flex-end !important;
|
|
2072
|
+
align-items: center !important;
|
|
2073
|
+
gap: 8px !important;
|
|
2074
|
+
width: 100% !important;
|
|
2075
|
+
height: auto !important;
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
.x-message-box .x-toolbar-footer .x-box-target,
|
|
2079
|
+
.x-message-box .x-toolbar-footer .x-box-target {
|
|
2080
|
+
display: flex !important;
|
|
2081
|
+
justify-content: flex-end !important;
|
|
2082
|
+
align-items: center !important;
|
|
2083
|
+
gap: 8px !important;
|
|
2084
|
+
position: relative !important;
|
|
2085
|
+
width: auto !important;
|
|
2086
|
+
height: auto !important;
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
/* Override absolute positioning on dialog buttons */
|
|
2090
|
+
.x-message-box .x-toolbar-footer .x-btn,
|
|
2091
|
+
.x-message-box .x-toolbar-footer .x-btn {
|
|
2092
|
+
position: relative !important;
|
|
2093
|
+
left: auto !important;
|
|
2094
|
+
top: auto !important;
|
|
2095
|
+
margin: 0 !important;
|
|
2096
|
+
}
|
|
2097
|
+
|
|
2098
|
+
/* =====================================================
|
|
2099
|
+
v5.49: LOGIN MODAL / DIALOG FORM FIXES
|
|
2100
|
+
- Form fields stretch to full width (override inline 380px)
|
|
2101
|
+
- Footer checkbox/button gap fixed (was -7px overlap)
|
|
2102
|
+
- Footer toolbar takes full width (override inline 374px)
|
|
2103
|
+
v5.65: Fix mainPanel width constraint - ExtJS calculates based on
|
|
2104
|
+
original parent width before CSS override, causing 549px instead
|
|
2105
|
+
of ~580px. Force direct child panels to use full available width.
|
|
2106
|
+
===================================================== */
|
|
2107
|
+
|
|
2108
|
+
/* =====================================================
|
|
2109
|
+
v5.74: DIALOG LAYOUT FIXES - REMOVED OVERRIDES
|
|
2110
|
+
Removed all forced width/padding rules for panel bodies
|
|
2111
|
+
Removed forced width/padding rules for panel bodies to prevent layout cutoff.
|
|
2112
|
+
===================================================== */
|
|
2113
|
+
|
|
2114
|
+
/* Only ensure the footer toolbar behaves correctly */
|
|
2115
|
+
.x-window .x-toolbar-footer {
|
|
2116
|
+
width: 100% !important;
|
|
2117
|
+
padding-right: 10px !important;
|
|
2118
|
+
box-sizing: border-box !important;
|
|
2119
|
+
}
|
|
2120
|
+
|
|
2121
|
+
.x-window .x-toolbar-footer .x-box-inner {
|
|
2122
|
+
display: flex !important;
|
|
2123
|
+
align-items: center !important;
|
|
2124
|
+
justify-content: flex-end !important;
|
|
2125
|
+
gap: 12px !important;
|
|
2126
|
+
width: 100% !important;
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
.x-window .x-toolbar-footer .x-box-target {
|
|
2130
|
+
display: flex !important;
|
|
2131
|
+
align-items: center !important;
|
|
2132
|
+
justify-content: flex-end !important;
|
|
2133
|
+
gap: 12px !important;
|
|
2134
|
+
width: 100% !important;
|
|
2135
|
+
}
|
|
2136
|
+
|
|
2137
|
+
/* Remove absolute positioning from footer items */
|
|
2138
|
+
.x-window .x-toolbar-footer .x-form-type-checkbox,
|
|
2139
|
+
.x-window .x-toolbar-footer .x-btn {
|
|
2140
|
+
position: relative !important;
|
|
2141
|
+
left: auto !important;
|
|
2142
|
+
top: auto !important;
|
|
2143
|
+
margin: 0 !important;
|
|
2144
|
+
}
|
|
2145
|
+
|
|
2146
|
+
/* Auto-width for checkbox label in footer */
|
|
2147
|
+
.x-window .x-toolbar-footer .x-form-type-checkbox .x-form-item-label {
|
|
2148
|
+
width: auto !important;
|
|
2149
|
+
}
|
|
2150
|
+
|
|
2151
|
+
/* v5.75: Fix Help button alignment in dialog footers */
|
|
2152
|
+
/* The help button is an inline button and should be on the left */
|
|
2153
|
+
.x-window .x-toolbar-footer .proxmox-inline-button:first-child {
|
|
2154
|
+
margin-right: auto !important;
|
|
2155
|
+
}
|
|
2156
|
+
|
|
2157
|
+
/* =====================================================
|
|
2158
|
+
PROXMOX LOGO - Invert for dark
|
|
2159
|
+
===================================================== */
|
|
2160
|
+
img[id^="proxmoxlogo-"][id$="-img"] {
|
|
2161
|
+
filter: invert(1) hue-rotate(180deg);
|
|
2162
|
+
}
|
|
2163
|
+
|
|
2164
|
+
img[id^="proxmoxLogoSvg-"][id$="-img"] {
|
|
2165
|
+
filter: invert(1) hue-rotate(180deg);
|
|
2166
|
+
}
|
|
2167
|
+
|
|
2168
|
+
div[id^="versioninfo-"]+div[id^="panel-"]>div[id^="panel-"][id$="-bodyWrap"]>div,
|
|
2169
|
+
div.eol-notice+div[id^="panel-"]>div[id^="panel-"][id$="-bodyWrap"]>div {
|
|
2170
|
+
background-color: transparent;
|
|
2171
|
+
border: none;
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
/* =====================================================
|
|
2175
|
+
PROXMOX SPECIFIC (UniFi authentic)
|
|
2176
|
+
===================================================== */
|
|
2177
|
+
.proxmox-invalid-row {
|
|
2178
|
+
background-color: rgba(240, 58, 62, 0.15);
|
|
2179
|
+
}
|
|
2180
|
+
|
|
2181
|
+
.x-keyboard-mode .proxmox-invalid-row .x-grid-item-focused {
|
|
2182
|
+
background-color: rgba(240, 58, 62, 0.25);
|
|
2183
|
+
}
|
|
2184
|
+
|
|
2185
|
+
.proxmox-warning-row {
|
|
2186
|
+
background-color: rgba(245, 166, 35, 0.15);
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
.proxmox-disabled-row td {
|
|
2190
|
+
color: #737C87;
|
|
2191
|
+
}
|
|
2192
|
+
|
|
2193
|
+
.pmx-hint {
|
|
2194
|
+
background-color: rgba(245, 166, 35, 0.15);
|
|
2195
|
+
white-space: nowrap !important;
|
|
2196
|
+
}
|
|
2197
|
+
|
|
2198
|
+
/* Allow pmx-hint text to expand beyond parent container width */
|
|
2199
|
+
.x-container:has(> .x-box-inner > .x-box-target > .pmx-hint) .x-box-inner {
|
|
2200
|
+
overflow: visible !important;
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2203
|
+
.pmx-hint a {
|
|
2204
|
+
color: #006EFF;
|
|
2205
|
+
}
|
|
2206
|
+
|
|
2207
|
+
.proxmox-inline-button {
|
|
2208
|
+
background-color: #34383D;
|
|
2209
|
+
border: none;
|
|
2210
|
+
color: #B7BCC2;
|
|
2211
|
+
}
|
|
2212
|
+
|
|
2213
|
+
.proxmox-inline-button.x-btn-over {
|
|
2214
|
+
background-color: rgba(249, 250, 250, 0.07);
|
|
2215
|
+
}
|
|
2216
|
+
|
|
2217
|
+
.proxmox-inline-button .x-btn-inner,
|
|
2218
|
+
.proxmox-inline-button .x-btn-icon-el {
|
|
2219
|
+
color: #B7BCC2;
|
|
2220
|
+
}
|
|
2221
|
+
|
|
2222
|
+
/* Loading indicators */
|
|
2223
|
+
.x-grid-row-loading,
|
|
2224
|
+
.x-treelist-item-loading .x-treelist-item-icon,
|
|
2225
|
+
.x-mask-msg-text,
|
|
2226
|
+
.x-grid-tree-loading .x-tree-icon {
|
|
2227
|
+
filter: invert(90%);
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2230
|
+
.x-mask-msg {
|
|
2231
|
+
background-color: #282B2F;
|
|
2232
|
+
border: 1px solid #34383D;
|
|
2233
|
+
border-radius: 8px;
|
|
2234
|
+
}
|
|
2235
|
+
|
|
2236
|
+
/* Markdown content */
|
|
2237
|
+
.pmx-md code {
|
|
2238
|
+
background-color: #131416;
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2241
|
+
.pmx-md pre code {
|
|
2242
|
+
border-color: #34383D;
|
|
2243
|
+
}
|
|
2244
|
+
|
|
2245
|
+
.pmx-md tbody tr td {
|
|
2246
|
+
border-color: #34383D;
|
|
2247
|
+
}
|
|
2248
|
+
|
|
2249
|
+
.pmx-md tbody tr:nth-of-type(2n) {
|
|
2250
|
+
background-color: rgba(249, 250, 250, 0.02);
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2253
|
+
.pmx-md tbody tr:hover td {
|
|
2254
|
+
background-color: rgba(249, 250, 250, 0.04);
|
|
2255
|
+
}
|
|
2256
|
+
|
|
2257
|
+
.pmx-md a {
|
|
2258
|
+
color: #006EFF;
|
|
2259
|
+
}
|
|
2260
|
+
|
|
2261
|
+
/* APT repos */
|
|
2262
|
+
.proxmox-apt-repos .x-grid-group-hd {
|
|
2263
|
+
background-color: #131416;
|
|
2264
|
+
border: none;
|
|
2265
|
+
}
|
|
2266
|
+
|
|
2267
|
+
.proxmox-apt-repos .x-grid-group-title {
|
|
2268
|
+
color: #F9FAFA;
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2271
|
+
/* Status colors */
|
|
2272
|
+
.info-blue {
|
|
2273
|
+
color: #006EFF !important;
|
|
2274
|
+
}
|
|
2275
|
+
|
|
2276
|
+
.critical {
|
|
2277
|
+
color: #f03a3e !important;
|
|
2278
|
+
}
|
|
2279
|
+
|
|
2280
|
+
/* Tags - Native contrast detection with proper visibility */
|
|
2281
|
+
.pve-edit-tag.editable span {
|
|
2282
|
+
background-color: #282B2F;
|
|
2283
|
+
color: #B7BCC2;
|
|
2284
|
+
border-color: #34383D;
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2287
|
+
/* Tags with LIGHT text (dark backgrounds like blue tags) */
|
|
2288
|
+
.pve-edit-tag.proxmox-tag-light,
|
|
2289
|
+
.pve-edit-tag.proxmox-tag-light span {
|
|
2290
|
+
color: #FFFFFF !important;
|
|
2291
|
+
}
|
|
2292
|
+
|
|
2293
|
+
/* Tags with DARK text (bright backgrounds like pink/yellow tags) - non-edit mode only */
|
|
2294
|
+
.pve-edit-tag.proxmox-tag-dark:not(.editable),
|
|
2295
|
+
.pve-edit-tag.proxmox-tag-dark:not(.editable) span {
|
|
2296
|
+
color: #1C1E21 !important;
|
|
2297
|
+
}
|
|
2298
|
+
|
|
2299
|
+
/* v5.88: In edit mode, force light text on ALL tags for better visibility */
|
|
2300
|
+
.pve-edit-tag.editable.proxmox-tag-dark,
|
|
2301
|
+
.pve-edit-tag.editable.proxmox-tag-dark span {
|
|
2302
|
+
color: #F9FAFA !important;
|
|
2303
|
+
}
|
|
2304
|
+
|
|
2305
|
+
/* Individual tag styling */
|
|
2306
|
+
.pve-edit-tag {
|
|
2307
|
+
display: inline-flex !important;
|
|
2308
|
+
align-items: center !important;
|
|
2309
|
+
padding: 2px 8px !important;
|
|
2310
|
+
border-radius: 6px !important;
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
/* v5.30: Tree view tags - match header tag styling */
|
|
2314
|
+
.x-tree-node-text .proxmox-tag-dark,
|
|
2315
|
+
.x-tree-node-text .proxmox-tag-light,
|
|
2316
|
+
.x-grid-cell-inner .proxmox-tag-dark,
|
|
2317
|
+
.x-grid-cell-inner .proxmox-tag-light,
|
|
2318
|
+
span.proxmox-tag-dark,
|
|
2319
|
+
span.proxmox-tag-light {
|
|
2320
|
+
border-radius: 6px !important;
|
|
2321
|
+
padding: 2px 8px !important;
|
|
2322
|
+
display: inline-flex !important;
|
|
2323
|
+
align-items: center !important;
|
|
2324
|
+
}
|
|
2325
|
+
|
|
2326
|
+
/* v5.52: Make resource tree tags match search table tag height (19px) */
|
|
2327
|
+
.x-tree-node-text .proxmox-tag-dark,
|
|
2328
|
+
.x-tree-node-text .proxmox-tag-light {
|
|
2329
|
+
padding-top: 1px !important;
|
|
2330
|
+
padding-bottom: 1px !important;
|
|
2331
|
+
}
|
|
2332
|
+
|
|
2333
|
+
/* v5.52: Force tree row height to stay at 25px when tags have reduced padding */
|
|
2334
|
+
.x-tree-panel .x-grid-row {
|
|
2335
|
+
height: 25px !important;
|
|
2336
|
+
}
|
|
2337
|
+
|
|
2338
|
+
/* Pencil button for editing tags */
|
|
2339
|
+
/* v5.28: Removed display override - let Proxmox control visibility via inline style */
|
|
2340
|
+
.pve-tag-inline-button {
|
|
2341
|
+
/* display controlled by inline style (none when not hovering, flex when editing) */
|
|
2342
|
+
align-items: center !important;
|
|
2343
|
+
justify-content: center !important;
|
|
2344
|
+
width: 20px !important;
|
|
2345
|
+
height: 20px !important;
|
|
2346
|
+
background: transparent !important;
|
|
2347
|
+
cursor: pointer !important;
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
.pve-tag-inline-button .fa-pencil,
|
|
2351
|
+
.pve-tag-inline-button .x-fa.fa-pencil {
|
|
2352
|
+
color: #8A919A !important;
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
.pve-tag-inline-button:hover .fa-pencil {
|
|
2356
|
+
color: #F9FAFA !important;
|
|
2357
|
+
}
|
|
2358
|
+
|
|
2359
|
+
/* v5.29: Checkmark button in tag edit - match toolbar button size */
|
|
2360
|
+
/* The checkmark has x-btn-default-small (not toolbar-small) so we need specific sizing */
|
|
2361
|
+
.x-btn.x-btn-default-small:has(.fa-check) {
|
|
2362
|
+
min-height: 24px !important;
|
|
2363
|
+
height: 24px !important;
|
|
2364
|
+
padding: 3px 8px !important;
|
|
2365
|
+
border-radius: 4px !important;
|
|
2366
|
+
background-color: #006EFF !important;
|
|
2367
|
+
border: none !important;
|
|
2368
|
+
}
|
|
2369
|
+
|
|
2370
|
+
/* Disabled checkmark - gray/transparent */
|
|
2371
|
+
.x-btn.x-btn-default-small:has(.fa-check).x-btn-disabled {
|
|
2372
|
+
background-color: transparent !important;
|
|
2373
|
+
border: 1px solid #34383D !important;
|
|
2374
|
+
opacity: 0.5 !important;
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
/* Checkmark icon - white when enabled */
|
|
2378
|
+
.x-btn.x-btn-default-small:has(.fa-check) .fa-check {
|
|
2379
|
+
color: #ffffff !important;
|
|
2380
|
+
}
|
|
2381
|
+
|
|
2382
|
+
/* Disabled checkmark icon - gray */
|
|
2383
|
+
.x-btn.x-btn-default-small:has(.fa-check).x-btn-disabled .fa-check {
|
|
2384
|
+
color: #737C87 !important;
|
|
2385
|
+
}
|
|
2386
|
+
|
|
2387
|
+
/* Checkmark button hover - lighter blue */
|
|
2388
|
+
.x-btn.x-btn-default-small:has(.fa-check):not(.x-btn-disabled):hover {
|
|
2389
|
+
background-color: #338BFF !important;
|
|
2390
|
+
}
|
|
2391
|
+
|
|
2392
|
+
/* Hide the inner element on checkmark button */
|
|
2393
|
+
.x-btn.x-btn-default-small:has(.fa-check) .x-btn-inner {
|
|
2394
|
+
display: none !important;
|
|
2395
|
+
}
|
|
2396
|
+
|
|
2397
|
+
.proxmox-tags-full .proxmox-tag-light,
|
|
2398
|
+
.proxmox-tags-full .proxmox-tag-dark,
|
|
2399
|
+
.proxmox-tags-circle .proxmox-tag-light,
|
|
2400
|
+
.proxmox-tags-circle .proxmox-tag-dark {
|
|
2401
|
+
outline: 1px solid rgba(52, 56, 61, 0.3);
|
|
2402
|
+
}
|
|
2403
|
+
|
|
2404
|
+
/* =====================================================
|
|
2405
|
+
DATE PICKER (UniFi authentic)
|
|
2406
|
+
===================================================== */
|
|
2407
|
+
.x-datepicker,
|
|
2408
|
+
.x-datepicker-column-header,
|
|
2409
|
+
.x-monthpicker {
|
|
2410
|
+
background-color: #131416;
|
|
2411
|
+
color: #B7BCC2;
|
|
2412
|
+
border: none;
|
|
2413
|
+
}
|
|
2414
|
+
|
|
2415
|
+
.x-datepicker-month .x-btn-over.x-btn-default-small {
|
|
2416
|
+
background-color: #34383D;
|
|
2417
|
+
}
|
|
2418
|
+
|
|
2419
|
+
.x-monthpicker-months {
|
|
2420
|
+
border-color: #34383D;
|
|
2421
|
+
}
|
|
2422
|
+
|
|
2423
|
+
.x-datepicker-header {
|
|
2424
|
+
background-color: #131416;
|
|
2425
|
+
}
|
|
2426
|
+
|
|
2427
|
+
.x-datepicker-date,
|
|
2428
|
+
.x-monthpicker-item-inner {
|
|
2429
|
+
color: #B7BCC2;
|
|
2430
|
+
}
|
|
2431
|
+
|
|
2432
|
+
.x-datepicker-prevday .x-datepicker-date,
|
|
2433
|
+
.x-datepicker-nextday .x-datepicker-date {
|
|
2434
|
+
color: #737C87;
|
|
2435
|
+
}
|
|
2436
|
+
|
|
2437
|
+
.x-datepicker-footer,
|
|
2438
|
+
.x-monthpicker-buttons {
|
|
2439
|
+
background-color: #131416;
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
.x-datepicker-selected div.x-datepicker-date,
|
|
2443
|
+
.x-monthpicker-item a.x-monthpicker-selected,
|
|
2444
|
+
a.x-monthpicker-item-inner:hover,
|
|
2445
|
+
div.x-datepicker-date:hover {
|
|
2446
|
+
background-color: #006EFF;
|
|
2447
|
+
color: #fff;
|
|
2448
|
+
}
|
|
2449
|
+
|
|
2450
|
+
/* =====================================================
|
|
2451
|
+
USAGE BARS - UniFi authentic style
|
|
2452
|
+
===================================================== */
|
|
2453
|
+
/* v5.31: Reduced border-radius, removed wrapper padding for full-width fill */
|
|
2454
|
+
.usage-wrapper {
|
|
2455
|
+
border: none !important;
|
|
2456
|
+
border-radius: 2px !important;
|
|
2457
|
+
background-color: #34383D !important;
|
|
2458
|
+
overflow: hidden !important;
|
|
2459
|
+
padding: 0 !important;
|
|
2460
|
+
}
|
|
2461
|
+
|
|
2462
|
+
.usage-negative {
|
|
2463
|
+
background-color: transparent !important;
|
|
2464
|
+
width: 100% !important;
|
|
2465
|
+
}
|
|
2466
|
+
|
|
2467
|
+
.usage {
|
|
2468
|
+
background-color: #37BE5F !important;
|
|
2469
|
+
border-radius: 2px !important;
|
|
2470
|
+
width: 100% !important;
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
/* =====================================================
|
|
2474
|
+
CONSOLE / TERMINAL
|
|
2475
|
+
===================================================== */
|
|
2476
|
+
div.monitor {
|
|
2477
|
+
border-color: #34383D;
|
|
2478
|
+
}
|
|
2479
|
+
|
|
2480
|
+
.install-mask {
|
|
2481
|
+
background-color: #131416;
|
|
2482
|
+
color: #B7BCC2;
|
|
2483
|
+
}
|
|
2484
|
+
|
|
2485
|
+
.x-window.install-mask {
|
|
2486
|
+
box-shadow: rgba(0, 0, 0, 0.5) 0 4px 20px !important;
|
|
2487
|
+
}
|
|
2488
|
+
|
|
2489
|
+
/* =====================================================
|
|
2490
|
+
OSD TABLE
|
|
2491
|
+
===================================================== */
|
|
2492
|
+
table.osds tr {
|
|
2493
|
+
border-color: var(--pm-border);
|
|
2494
|
+
}
|
|
2495
|
+
|
|
2496
|
+
table.osds td {
|
|
2497
|
+
border-color: var(--pm-border);
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2500
|
+
/* =====================================================
|
|
2501
|
+
LINKS - UniFi Blue (authentic)
|
|
2502
|
+
===================================================== */
|
|
2503
|
+
a {
|
|
2504
|
+
color: var(--pm-accent);
|
|
2505
|
+
}
|
|
2506
|
+
|
|
2507
|
+
a:hover {
|
|
2508
|
+
color: var(--pm-accent-hover);
|
|
2509
|
+
}
|
|
2510
|
+
|
|
2511
|
+
/* =====================================================
|
|
2512
|
+
STATUS DOTS (like UniFi - authentic)
|
|
2513
|
+
===================================================== */
|
|
2514
|
+
/* Proxmox uses ::before for the type icon and ::after for the status glyph.
|
|
2515
|
+
UniFi style: keep type icon neutral and show a green dot for "running". */
|
|
2516
|
+
.x-tree-icon-custom.running::before,
|
|
2517
|
+
.x-grid-icon-custom.running::before {
|
|
2518
|
+
color: #B7BCC2 !important;
|
|
2519
|
+
}
|
|
2520
|
+
|
|
2521
|
+
.x-tree-icon-custom.running::after,
|
|
2522
|
+
.x-grid-icon-custom.running::after {
|
|
2523
|
+
content: "\f111" !important;
|
|
2524
|
+
/* FontAwesome circle */
|
|
2525
|
+
font-family: "FontAwesome" !important;
|
|
2526
|
+
font-size: 9px !important;
|
|
2527
|
+
line-height: 1 !important;
|
|
2528
|
+
color: var(--pm-success) !important;
|
|
2529
|
+
background: transparent !important;
|
|
2530
|
+
text-shadow: none !important;
|
|
2531
|
+
}
|
|
2532
|
+
|
|
2533
|
+
/* Align CT/LXC running dot with VM running dot (cube glyph is slightly narrower) */
|
|
2534
|
+
.x-tree-icon-custom.fa-cube.running::after,
|
|
2535
|
+
.x-grid-icon-custom.fa-cube.running::after {
|
|
2536
|
+
left: -3.8px !important;
|
|
2537
|
+
right: 3.8px !important;
|
|
2538
|
+
}
|
|
2539
|
+
|
|
2540
|
+
/* v5.90: Lock icons (migrate, backup, suspend) override running dot
|
|
2541
|
+
When VM is both running AND locked for operation, show the lock icon instead of green dot */
|
|
2542
|
+
.x-tree-icon-custom.running.lock-migrate::after,
|
|
2543
|
+
.x-grid-icon-custom.running.lock-migrate::after {
|
|
2544
|
+
content: "\f1d9" !important; /* FontAwesome paper-plane (migrate) */
|
|
2545
|
+
font-size: 0.75em !important;
|
|
2546
|
+
color: var(--pm-warning) !important; /* Amber to indicate operation in progress */
|
|
2547
|
+
}
|
|
2548
|
+
|
|
2549
|
+
.x-tree-icon-custom.running.lock-backup::after,
|
|
2550
|
+
.x-grid-icon-custom.running.lock-backup::after {
|
|
2551
|
+
content: "\f0c7" !important; /* FontAwesome save/floppy (backup) */
|
|
2552
|
+
font-size: 0.75em !important;
|
|
2553
|
+
color: var(--pm-warning) !important;
|
|
2554
|
+
}
|
|
2555
|
+
|
|
2556
|
+
.x-tree-icon-custom.running.lock-suspending::after,
|
|
2557
|
+
.x-grid-icon-custom.running.lock-suspending::after {
|
|
2558
|
+
content: "\f019" !important; /* FontAwesome download (suspending) */
|
|
2559
|
+
font-size: 0.75em !important;
|
|
2560
|
+
color: var(--pm-warning) !important;
|
|
2561
|
+
}
|
|
2562
|
+
|
|
2563
|
+
.x-tree-icon-custom.stopped::before,
|
|
2564
|
+
.x-grid-icon-custom.stopped::before {
|
|
2565
|
+
color: var(--pm-text-disabled);
|
|
2566
|
+
}
|
|
2567
|
+
|
|
2568
|
+
/* =====================================================
|
|
2569
|
+
SCROLLBARS - Minimal, dark (UniFi authentic)
|
|
2570
|
+
v5.93: Increased width from 8px to 12px for better clickability
|
|
2571
|
+
===================================================== */
|
|
2572
|
+
::-webkit-scrollbar {
|
|
2573
|
+
width: 12px;
|
|
2574
|
+
height: 12px;
|
|
2575
|
+
}
|
|
2576
|
+
|
|
2577
|
+
::-webkit-scrollbar-track {
|
|
2578
|
+
background: #131416;
|
|
2579
|
+
}
|
|
2580
|
+
|
|
2581
|
+
::-webkit-scrollbar-thumb {
|
|
2582
|
+
background: #34383D;
|
|
2583
|
+
border-radius: 4px;
|
|
2584
|
+
}
|
|
2585
|
+
|
|
2586
|
+
::-webkit-scrollbar-thumb:hover {
|
|
2587
|
+
background: rgba(249, 250, 250, 0.07);
|
|
2588
|
+
}
|
|
2589
|
+
|
|
2590
|
+
/* v5.84: Style scrollbar corner to match theme (eliminates white square) */
|
|
2591
|
+
::-webkit-scrollbar-corner {
|
|
2592
|
+
background-color: #131416;
|
|
2593
|
+
}
|
|
2594
|
+
|
|
2595
|
+
/* =====================================================
|
|
2596
|
+
FIX: Labels and grid text - UniFi authentic colors
|
|
2597
|
+
===================================================== */
|
|
2598
|
+
.x-grid-cell-inner,
|
|
2599
|
+
.x-grid-cell,
|
|
2600
|
+
.x-form-display-field,
|
|
2601
|
+
.x-form-display-field-default,
|
|
2602
|
+
td,
|
|
2603
|
+
.x-panel-body-default,
|
|
2604
|
+
.x-grid-item {
|
|
2605
|
+
color: #DEE0E3 !important;
|
|
2606
|
+
}
|
|
2607
|
+
|
|
2608
|
+
/* Column headers should be brighter */
|
|
2609
|
+
.x-column-header-text,
|
|
2610
|
+
.x-column-header-text-inner,
|
|
2611
|
+
.x-column-header-text-default {
|
|
2612
|
+
color: var(--pm-text-bright) !important;
|
|
2613
|
+
}
|
|
2614
|
+
|
|
2615
|
+
/* Fix specific grid/table text */
|
|
2616
|
+
.x-grid-cell-inner span,
|
|
2617
|
+
.x-grid-cell-inner div {
|
|
2618
|
+
color: #DEE0E3;
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
/* Resource panel labels */
|
|
2622
|
+
.x-form-item-label-inner {
|
|
2623
|
+
color: #DEE0E3 !important;
|
|
2624
|
+
}
|
|
2625
|
+
|
|
2626
|
+
/* =====================================================
|
|
2627
|
+
FIX: Summary/Stats panels - add borders/cards
|
|
2628
|
+
===================================================== */
|
|
2629
|
+
.pveStatusPanel,
|
|
2630
|
+
.x-panel-default-framed,
|
|
2631
|
+
.x-panel-body-default-framed {
|
|
2632
|
+
background-color: #131416 !important;
|
|
2633
|
+
border: 1px solid #34383D !important;
|
|
2634
|
+
border-radius: 12px !important;
|
|
2635
|
+
}
|
|
2636
|
+
|
|
2637
|
+
/* Stats panel body (Status, CPU, Memory, etc) - match Notes panel rounded corners */
|
|
2638
|
+
[id^="pveGuestStatusView-"][id$="-body"],
|
|
2639
|
+
[id^="pmxNotesView-"] .x-panel-body {
|
|
2640
|
+
border-radius: 8px !important;
|
|
2641
|
+
}
|
|
2642
|
+
|
|
2643
|
+
/* Panel headers in summary */
|
|
2644
|
+
.x-panel-header-default-framed {
|
|
2645
|
+
background-color: #282B2F !important;
|
|
2646
|
+
border: none !important;
|
|
2647
|
+
border-bottom: 1px solid #34383D !important;
|
|
2648
|
+
border-radius: 12px 12px 0 0 !important;
|
|
2649
|
+
}
|
|
2650
|
+
|
|
2651
|
+
/* Summary status grid - the table with CPU/Memory/etc */
|
|
2652
|
+
/* FIX v5.18: Removed overflow:hidden to restore content visibility */
|
|
2653
|
+
.pve-info-grid {
|
|
2654
|
+
border-radius: 12px !important;
|
|
2655
|
+
}
|
|
2656
|
+
|
|
2657
|
+
/* Form display fields in summary (status fields) */
|
|
2658
|
+
.x-form-display-field-default {
|
|
2659
|
+
border-radius: 6px !important;
|
|
2660
|
+
}
|
|
2661
|
+
|
|
2662
|
+
/* Graph containers - ensure visibility */
|
|
2663
|
+
.pve-rrdview,
|
|
2664
|
+
.rrdview {
|
|
2665
|
+
background-color: #131416 !important;
|
|
2666
|
+
border: 1px solid #34383D !important;
|
|
2667
|
+
border-radius: 12px !important;
|
|
2668
|
+
padding: 12px !important;
|
|
2669
|
+
}
|
|
2670
|
+
|
|
2671
|
+
/* Chart/RRD panel specific - canvas should be transparent for chart lines to show */
|
|
2672
|
+
div[id*="rrdchart"],
|
|
2673
|
+
.pve-rrddatastore,
|
|
2674
|
+
.pmx-panel-rrd {
|
|
2675
|
+
background-color: #131416 !important;
|
|
2676
|
+
}
|
|
2677
|
+
|
|
2678
|
+
/* Canvas elements - don't set background, let charts be visible */
|
|
2679
|
+
.proxmox-rrd-panel canvas,
|
|
2680
|
+
.proxmox-widget-toolkit canvas,
|
|
2681
|
+
canvas.x-surface,
|
|
2682
|
+
.x-surface canvas {
|
|
2683
|
+
background-color: transparent !important;
|
|
2684
|
+
opacity: 1 !important;
|
|
2685
|
+
}
|
|
2686
|
+
|
|
2687
|
+
/* Proxmox RRD chart widget - ensure visibility */
|
|
2688
|
+
.proxmox-rrd-panel,
|
|
2689
|
+
.proxmox-rrd-chart {
|
|
2690
|
+
background-color: #131416 !important;
|
|
2691
|
+
}
|
|
2692
|
+
|
|
2693
|
+
/* Chart text/labels */
|
|
2694
|
+
.x-surface text,
|
|
2695
|
+
svg text {
|
|
2696
|
+
fill: #DEE0E3 !important;
|
|
2697
|
+
}
|
|
2698
|
+
|
|
2699
|
+
/* Summary status panel */
|
|
2700
|
+
.pve-summary-status,
|
|
2701
|
+
.x-container .pve-status {
|
|
2702
|
+
background-color: #131416 !important;
|
|
2703
|
+
border: 1px solid #34383D !important;
|
|
2704
|
+
border-radius: 8px !important;
|
|
2705
|
+
}
|
|
2706
|
+
|
|
2707
|
+
/* Notes panel */
|
|
2708
|
+
.x-panel-default[id*="notes"],
|
|
2709
|
+
.pve-notes-view {
|
|
2710
|
+
background-color: #131416 !important;
|
|
2711
|
+
border: 1px solid #34383D !important;
|
|
2712
|
+
border-radius: 8px !important;
|
|
2713
|
+
}
|
|
2714
|
+
|
|
2715
|
+
/* =====================================================
|
|
2716
|
+
FIX: Fieldset and form sections
|
|
2717
|
+
===================================================== */
|
|
2718
|
+
.x-fieldset {
|
|
2719
|
+
background-color: #131416 !important;
|
|
2720
|
+
border: 1px solid #34383D !important;
|
|
2721
|
+
border-radius: 8px !important;
|
|
2722
|
+
padding: 12px !important;
|
|
2723
|
+
}
|
|
2724
|
+
|
|
2725
|
+
.x-fieldset-header-text {
|
|
2726
|
+
color: #F9FAFA !important;
|
|
2727
|
+
font-weight: 500 !important;
|
|
2728
|
+
}
|
|
2729
|
+
|
|
2730
|
+
/* =====================================================
|
|
2731
|
+
FIX: UniFi-style rounded corners on hover/selection
|
|
2732
|
+
===================================================== */
|
|
2733
|
+
|
|
2734
|
+
/* Grid row hover/selection - rounded corners */
|
|
2735
|
+
.x-grid-item-over,
|
|
2736
|
+
.x-grid-item-selected,
|
|
2737
|
+
.x-grid-with-row-lines .x-grid-item.x-grid-item-over,
|
|
2738
|
+
.x-grid-with-row-lines .x-grid-item.x-grid-item-selected {
|
|
2739
|
+
border-radius: 6px !important;
|
|
2740
|
+
}
|
|
2741
|
+
|
|
2742
|
+
/* Menu items - rounded corners */
|
|
2743
|
+
.x-menu-item-default.x-menu-item-focus,
|
|
2744
|
+
.x-menu-item-default.x-menu-item-active,
|
|
2745
|
+
.x-menu-item:hover {
|
|
2746
|
+
border-radius: 6px !important;
|
|
2747
|
+
}
|
|
2748
|
+
|
|
2749
|
+
/* Treelist/sidebar items - rounded corners (v5.9: 4px to match UniFi) */
|
|
2750
|
+
/* Background now handled by ::before pseudo-element in treelist section */
|
|
2751
|
+
|
|
2752
|
+
/* Boundlist dropdown items - rounded corners (v5.10: 4px to match UniFi) */
|
|
2753
|
+
.x-boundlist-item-over,
|
|
2754
|
+
.x-boundlist-selected {
|
|
2755
|
+
border-radius: 4px !important;
|
|
2756
|
+
}
|
|
2757
|
+
|
|
2758
|
+
/* Tab hover - rounded corners */
|
|
2759
|
+
.x-tab-default.x-tab-over,
|
|
2760
|
+
.x-tab-default.x-tab.x-tab-active {
|
|
2761
|
+
border-radius: 6px 6px 0 0 !important;
|
|
2762
|
+
}
|
|
2763
|
+
|
|
2764
|
+
/* =====================================================
|
|
2765
|
+
FIX: Remove underlines from column headers
|
|
2766
|
+
===================================================== */
|
|
2767
|
+
.x-column-header-over,
|
|
2768
|
+
.x-column-header-open,
|
|
2769
|
+
.x-column-header-sort-ASC,
|
|
2770
|
+
.x-column-header-sort-DESC,
|
|
2771
|
+
.x-column-header-last .x-column-header-over .x-column-header-trigger {
|
|
2772
|
+
border-bottom: none !important;
|
|
2773
|
+
text-decoration: none !important;
|
|
2774
|
+
}
|
|
2775
|
+
|
|
2776
|
+
/* Column header text - no underline */
|
|
2777
|
+
.x-column-header-text,
|
|
2778
|
+
.x-column-header-text-inner {
|
|
2779
|
+
text-decoration: none !important;
|
|
2780
|
+
border-bottom: none !important;
|
|
2781
|
+
}
|
|
2782
|
+
|
|
2783
|
+
/* Selected grid cells - no underlines */
|
|
2784
|
+
.x-grid-item-selected .x-grid-cell-inner,
|
|
2785
|
+
.x-grid-item-over .x-grid-cell-inner {
|
|
2786
|
+
text-decoration: none !important;
|
|
2787
|
+
}
|
|
2788
|
+
|
|
2789
|
+
/* =====================================================
|
|
2790
|
+
FIX: Data view and resource lists
|
|
2791
|
+
===================================================== */
|
|
2792
|
+
.x-dataview-item {
|
|
2793
|
+
color: #DEE0E3 !important;
|
|
2794
|
+
}
|
|
2795
|
+
|
|
2796
|
+
/* Resource grid specific */
|
|
2797
|
+
.pve-resource-grid .x-grid-cell-inner {
|
|
2798
|
+
color: #DEE0E3 !important;
|
|
2799
|
+
}
|
|
2800
|
+
|
|
2801
|
+
/* Override any remaining dark text */
|
|
2802
|
+
.x-form-item-body,
|
|
2803
|
+
.x-form-item {
|
|
2804
|
+
color: hsla(214, 8%, 88%, 1) !important;
|
|
2805
|
+
}
|
|
2806
|
+
|
|
2807
|
+
/* Tree node text */
|
|
2808
|
+
.x-tree-node-text {
|
|
2809
|
+
color: hsla(214, 8%, 88%, 1) !important;
|
|
2810
|
+
}
|
|
2811
|
+
|
|
2812
|
+
.x-treelist-item-text {
|
|
2813
|
+
color: rgba(255, 255, 255, 0.75) !important;
|
|
2814
|
+
}
|
|
2815
|
+
|
|
2816
|
+
/* Selected items should be white */
|
|
2817
|
+
.x-grid-item-selected .x-grid-cell-inner,
|
|
2818
|
+
.x-treelist-item-selected .x-treelist-item-text,
|
|
2819
|
+
.x-tree-selected .x-tree-node-text {
|
|
2820
|
+
color: #ffffff !important;
|
|
2821
|
+
}
|
|
2822
|
+
|
|
2823
|
+
/* =====================================================
|
|
2824
|
+
FIX: Tab text readability
|
|
2825
|
+
===================================================== */
|
|
2826
|
+
.x-tab-inner-default {
|
|
2827
|
+
color: #B7BCC2 !important;
|
|
2828
|
+
}
|
|
2829
|
+
|
|
2830
|
+
.x-tab-active .x-tab-inner-default {
|
|
2831
|
+
color: #ffffff !important;
|
|
2832
|
+
}
|
|
2833
|
+
|
|
2834
|
+
/* =====================================================
|
|
2835
|
+
SMOOTH TRANSITIONS - UniFi-style animations
|
|
2836
|
+
===================================================== */
|
|
2837
|
+
|
|
2838
|
+
/* Base transition for all interactive elements */
|
|
2839
|
+
.x-btn,
|
|
2840
|
+
.x-btn-default-small,
|
|
2841
|
+
.x-btn-default-toolbar-small,
|
|
2842
|
+
.x-menu-item,
|
|
2843
|
+
.x-grid-item,
|
|
2844
|
+
.x-grid-row,
|
|
2845
|
+
.x-treelist-item,
|
|
2846
|
+
.x-treelist-row,
|
|
2847
|
+
.x-tab,
|
|
2848
|
+
.x-boundlist-item,
|
|
2849
|
+
.x-tree-node,
|
|
2850
|
+
.x-dataview-item,
|
|
2851
|
+
.x-column-header,
|
|
2852
|
+
.x-form-trigger,
|
|
2853
|
+
.x-tool,
|
|
2854
|
+
.x-panel-header {
|
|
2855
|
+
transition: background-color 0.2s ease,
|
|
2856
|
+
border-color 0.2s ease,
|
|
2857
|
+
color 0.2s ease,
|
|
2858
|
+
box-shadow 0.2s ease,
|
|
2859
|
+
opacity 0.2s ease !important;
|
|
2860
|
+
}
|
|
2861
|
+
|
|
2862
|
+
/* Form elements transitions */
|
|
2863
|
+
.x-form-trigger-wrap,
|
|
2864
|
+
.x-form-trigger-wrap-default,
|
|
2865
|
+
.x-form-text,
|
|
2866
|
+
.x-form-text-default,
|
|
2867
|
+
.x-form-field {
|
|
2868
|
+
transition: border-color 0.2s ease,
|
|
2869
|
+
box-shadow 0.2s ease,
|
|
2870
|
+
background-color 0.2s ease !important;
|
|
2871
|
+
}
|
|
2872
|
+
|
|
2873
|
+
/* Button hover glow effect */
|
|
2874
|
+
.x-btn-default-small:hover,
|
|
2875
|
+
.x-btn-default-small.x-btn-over {
|
|
2876
|
+
box-shadow: 0 2px 8px rgba(0, 102, 255, 0.3) !important;
|
|
2877
|
+
}
|
|
2878
|
+
|
|
2879
|
+
/* Toolbar fade moved to Button Section */
|
|
2880
|
+
|
|
2881
|
+
/* Grid row hover - smooth background change */
|
|
2882
|
+
.x-grid-item:hover,
|
|
2883
|
+
.x-grid-item.x-grid-item-over {
|
|
2884
|
+
background-color: var(--pm-hover-subtle) !important;
|
|
2885
|
+
}
|
|
2886
|
+
|
|
2887
|
+
/* Tree item hover - handled by ::before pseudo-element in treelist section */
|
|
2888
|
+
|
|
2889
|
+
/* Menu item hover */
|
|
2890
|
+
.x-menu-item:hover,
|
|
2891
|
+
.x-menu-item-active {
|
|
2892
|
+
background-color: #22252d !important;
|
|
2893
|
+
}
|
|
2894
|
+
|
|
2895
|
+
/* Tab hover */
|
|
2896
|
+
.x-tab:hover,
|
|
2897
|
+
.x-tab.x-tab-over {
|
|
2898
|
+
background-color: #1a1c22 !important;
|
|
2899
|
+
}
|
|
2900
|
+
|
|
2901
|
+
/* Dropdown item hover - UniFi style */
|
|
2902
|
+
.x-boundlist-item:hover,
|
|
2903
|
+
.x-boundlist-item-over {
|
|
2904
|
+
background-color: rgba(249, 250, 250, 0.04) !important;
|
|
2905
|
+
color: #F9FAFA !important;
|
|
2906
|
+
}
|
|
2907
|
+
|
|
2908
|
+
/* Panel tool icons */
|
|
2909
|
+
.x-tool:hover {
|
|
2910
|
+
opacity: 1 !important;
|
|
2911
|
+
}
|
|
2912
|
+
|
|
2913
|
+
.x-tool {
|
|
2914
|
+
opacity: 0.7 !important;
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2917
|
+
/* Links hover */
|
|
2918
|
+
a {
|
|
2919
|
+
transition: color 0.2s ease !important;
|
|
2920
|
+
}
|
|
2921
|
+
|
|
2922
|
+
/* Input focus glow */
|
|
2923
|
+
.x-form-trigger-wrap-focus,
|
|
2924
|
+
.x-form-trigger-wrap-default.x-form-trigger-wrap-focus {
|
|
2925
|
+
box-shadow: 0 0 0 3px var(--pm-focus-ring-color) !important;
|
|
2926
|
+
}
|
|
2927
|
+
|
|
2928
|
+
/* Selected/active states should also transition smoothly */
|
|
2929
|
+
.x-grid-item-selected,
|
|
2930
|
+
.x-treelist-item-selected>.x-treelist-row,
|
|
2931
|
+
.x-tab-active {
|
|
2932
|
+
transition: background-color 0.15s ease !important;
|
|
2933
|
+
}
|
|
2934
|
+
|
|
2935
|
+
/* Scrollbar smooth transition */
|
|
2936
|
+
::-webkit-scrollbar-thumb {
|
|
2937
|
+
transition: background-color 0.2s ease !important;
|
|
2938
|
+
}
|
|
2939
|
+
|
|
2940
|
+
/* Progress bar animation */
|
|
2941
|
+
.x-progress-bar,
|
|
2942
|
+
.x-progress-bar-default {
|
|
2943
|
+
transition: width 0.3s ease !important;
|
|
2944
|
+
}
|
|
2945
|
+
|
|
2946
|
+
/* Splitter hover */
|
|
2947
|
+
.x-splitter {
|
|
2948
|
+
transition: background-color 0.2s ease !important;
|
|
2949
|
+
}
|
|
2950
|
+
|
|
2951
|
+
.x-splitter:hover {
|
|
2952
|
+
background-color: #2a2d36 !important;
|
|
2953
|
+
}
|
|
2954
|
+
|
|
2955
|
+
/* Window/dialog fade */
|
|
2956
|
+
.x-window {
|
|
2957
|
+
transition: opacity 0.2s ease, transform 0.2s ease !important;
|
|
2958
|
+
}
|
|
2959
|
+
|
|
2960
|
+
/* Tooltip fade */
|
|
2961
|
+
.x-tip,
|
|
2962
|
+
.x-tip-default {
|
|
2963
|
+
transition: opacity 0.15s ease !important;
|
|
2964
|
+
}
|
|
2965
|
+
|
|
2966
|
+
/* Mask fade */
|
|
2967
|
+
.x-mask {
|
|
2968
|
+
transition: opacity 0.2s ease !important;
|
|
2969
|
+
}
|
|
2970
|
+
|
|
2971
|
+
/* =====================================================
|
|
2972
|
+
v5.1 FIX: Segmented buttons (Day/Hour dropdown)
|
|
2973
|
+
Only parent should have border-radius, not children
|
|
2974
|
+
===================================================== */
|
|
2975
|
+
.x-segmented-button {
|
|
2976
|
+
border-radius: 6px !important;
|
|
2977
|
+
overflow: visible !important;
|
|
2978
|
+
display: flex !important;
|
|
2979
|
+
gap: 5px !important;
|
|
2980
|
+
}
|
|
2981
|
+
|
|
2982
|
+
.x-segmented-button .x-btn,
|
|
2983
|
+
.x-segmented-button .x-btn-default-small,
|
|
2984
|
+
.x-segmented-button .x-btn-inner,
|
|
2985
|
+
.x-segmented-button .x-btn-wrap {
|
|
2986
|
+
border-radius: 6px !important;
|
|
2987
|
+
}
|
|
2988
|
+
|
|
2989
|
+
/* v5.24: Fix segmented buttons - use flex for horizontal alignment with gap */
|
|
2990
|
+
.x-segmented-button .proxmox-inline-button,
|
|
2991
|
+
.x-segmented-button .x-btn {
|
|
2992
|
+
display: flex !important;
|
|
2993
|
+
}
|
|
2994
|
+
|
|
2995
|
+
/* v5.25: Pressed segmented button text should be white for visibility on blue background */
|
|
2996
|
+
.x-segmented-button .x-btn.x-btn-pressed .x-btn-inner {
|
|
2997
|
+
color: #ffffff !important;
|
|
2998
|
+
}
|
|
2999
|
+
|
|
3000
|
+
/* =====================================================
|
|
3001
|
+
v5.1 FIX: Progress bars - increase container height
|
|
3002
|
+
The bars were getting cut off at bottom
|
|
3003
|
+
===================================================== */
|
|
3004
|
+
.pve-widget-chart-container,
|
|
3005
|
+
.proxmox-gauge-chart,
|
|
3006
|
+
.pve-resource-chart,
|
|
3007
|
+
div[class*="chart-container"],
|
|
3008
|
+
div[class*="gauge"] {
|
|
3009
|
+
overflow: visible !important;
|
|
3010
|
+
}
|
|
3011
|
+
|
|
3012
|
+
/* =====================================================
|
|
3013
|
+
v5.1 FIX: Separator between left panel sections
|
|
3014
|
+
Line between server list (left) and options menu (right)
|
|
3015
|
+
===================================================== */
|
|
3016
|
+
/* Remove individual item borders */
|
|
3017
|
+
.x-treelist-item,
|
|
3018
|
+
.x-grid-item {
|
|
3019
|
+
border-bottom: none !important;
|
|
3020
|
+
}
|
|
3021
|
+
|
|
3022
|
+
/* v5.3 FIX: Single separator between resource tree and content panel */
|
|
3023
|
+
/* Remove double separator - only use the splitter */
|
|
3024
|
+
#content,
|
|
3025
|
+
.x-container.x-border-item.x-container-default[id="content"] {
|
|
3026
|
+
border-left: none !important;
|
|
3027
|
+
}
|
|
3028
|
+
|
|
3029
|
+
|
|
3030
|
+
|
|
3031
|
+
/* =====================================================
|
|
3032
|
+
v5.1 FIX: Server view dropdown - smaller and styled
|
|
3033
|
+
===================================================== */
|
|
3034
|
+
.x-btn-default-toolbar-small.x-btn-menu-active,
|
|
3035
|
+
.x-btn.x-btn-arrow.x-btn-default-small {
|
|
3036
|
+
padding: 4px 10px !important;
|
|
3037
|
+
min-height: 26px !important;
|
|
3038
|
+
font-size: 12px !important;
|
|
3039
|
+
}
|
|
3040
|
+
|
|
3041
|
+
/* View mode combo/dropdown */
|
|
3042
|
+
.x-form-trigger-wrap-default:not([id^="textarea-"]):not(.x-grid-body),
|
|
3043
|
+
.x-form-trigger-wrap:not([id^="textarea-"]):not(.x-grid-body) {
|
|
3044
|
+
height: 28px !important;
|
|
3045
|
+
}
|
|
3046
|
+
|
|
3047
|
+
/* =====================================================
|
|
3048
|
+
v5.5 FIX: Preserve parent icon color when children are hovered
|
|
3049
|
+
===================================================== */
|
|
3050
|
+
/* The selected parent row should ALWAYS have blue icon, regardless of child hover state */
|
|
3051
|
+
.x-treelist-item-selected.x-treelist-item-expanded>.x-treelist-row .x-treelist-item-icon {
|
|
3052
|
+
color: #006EFF !important;
|
|
3053
|
+
}
|
|
3054
|
+
|
|
3055
|
+
/* Even when entire treelist has hover somewhere, selected parent icon stays blue */
|
|
3056
|
+
.x-treelist-item-selected>.x-treelist-row .x-treelist-item-icon {
|
|
3057
|
+
color: #006EFF !important;
|
|
3058
|
+
}
|
|
3059
|
+
|
|
3060
|
+
/* =====================================================
|
|
3061
|
+
v5.2 FIX: Toolbar buttons - ensure border-radius applies
|
|
3062
|
+
===================================================== */
|
|
3063
|
+
|
|
3064
|
+
/* Toolbar button hover state */
|
|
3065
|
+
.x-btn-default-toolbar-small:hover,
|
|
3066
|
+
.x-btn-default-toolbar-small.x-btn-over {
|
|
3067
|
+
background-color: #34383D !important;
|
|
3068
|
+
border-color: #4A4F56 !important;
|
|
3069
|
+
}
|
|
3070
|
+
|
|
3071
|
+
/* Pressed/active state for toolbar buttons */
|
|
3072
|
+
.x-btn-default-toolbar-small.x-btn-pressed,
|
|
3073
|
+
.x-btn-default-toolbar-small.x-btn-menu-active {
|
|
3074
|
+
background-color: #006EFF !important;
|
|
3075
|
+
border-color: #006EFF !important;
|
|
3076
|
+
}
|
|
3077
|
+
|
|
3078
|
+
/* Disabled state for toolbar buttons */
|
|
3079
|
+
.x-btn-default-toolbar-small.x-btn-disabled {
|
|
3080
|
+
opacity: 0.4 !important;
|
|
3081
|
+
cursor: not-allowed !important;
|
|
3082
|
+
}
|
|
3083
|
+
|
|
3084
|
+
/* =====================================================
|
|
3085
|
+
v5.2 FIX: Pointer cursor on tree items (entire item)
|
|
3086
|
+
===================================================== */
|
|
3087
|
+
.x-tree-node-text,
|
|
3088
|
+
.x-grid-item,
|
|
3089
|
+
.x-grid-cell,
|
|
3090
|
+
.x-grid-cell-inner,
|
|
3091
|
+
.x-tree-elbow-img,
|
|
3092
|
+
.x-tree-icon,
|
|
3093
|
+
#pveResourceTree .x-grid-item,
|
|
3094
|
+
#pveResourceTree .x-grid-row,
|
|
3095
|
+
.x-treelist-item,
|
|
3096
|
+
.x-treelist-row,
|
|
3097
|
+
.x-treelist-item-wrap,
|
|
3098
|
+
.x-treelist-item-text,
|
|
3099
|
+
.x-treelist-item-icon,
|
|
3100
|
+
.x-treelistitem {
|
|
3101
|
+
cursor: pointer !important;
|
|
3102
|
+
}
|
|
3103
|
+
|
|
3104
|
+
/* =====================================================
|
|
3105
|
+
v5.2 FIX: Navigation tree - reduced gaps & centered icons
|
|
3106
|
+
===================================================== */
|
|
3107
|
+
.x-treelist-item,
|
|
3108
|
+
.x-treelistitem {
|
|
3109
|
+
min-height: 28px !important;
|
|
3110
|
+
height: auto !important;
|
|
3111
|
+
}
|
|
3112
|
+
|
|
3113
|
+
.x-treelist-row {
|
|
3114
|
+
min-height: 28px !important;
|
|
3115
|
+
padding: 2px 0 !important;
|
|
3116
|
+
margin-right: 4px !important;
|
|
3117
|
+
/* v5.7: symmetric spacing */
|
|
3118
|
+
display: flex !important;
|
|
3119
|
+
align-items: center !important;
|
|
3120
|
+
}
|
|
3121
|
+
|
|
3122
|
+
/* v5.33: Reduce margin between toolbox navigation items */
|
|
3123
|
+
.x-treelist-pve-nav .x-treelist-row {
|
|
3124
|
+
margin-top: 2px !important;
|
|
3125
|
+
}
|
|
3126
|
+
|
|
3127
|
+
/* v5.94: Increased margin-left (20px→28px) for better icon-to-label gap */
|
|
3128
|
+
.x-treelist-item-text {
|
|
3129
|
+
margin-left: 28px !important;
|
|
3130
|
+
line-height: 24px !important;
|
|
3131
|
+
display: flex !important;
|
|
3132
|
+
align-items: center !important;
|
|
3133
|
+
}
|
|
3134
|
+
|
|
3135
|
+
/* Center icons vertically in tree list */
|
|
3136
|
+
.x-treelist-item-icon {
|
|
3137
|
+
display: flex !important;
|
|
3138
|
+
align-items: center !important;
|
|
3139
|
+
justify-content: center !important;
|
|
3140
|
+
line-height: inherit !important;
|
|
3141
|
+
}
|
|
3142
|
+
|
|
3143
|
+
.x-treelist-item-wrap {
|
|
3144
|
+
display: flex !important;
|
|
3145
|
+
align-items: center !important;
|
|
3146
|
+
}
|
|
3147
|
+
|
|
3148
|
+
/* =====================================================
|
|
3149
|
+
v5.7 FIX: Toolbox tree expand/collapse animation
|
|
3150
|
+
v5.18 FIX: Only apply animation to child containers, not main nav
|
|
3151
|
+
===================================================== */
|
|
3152
|
+
/* Main navigation container - must be visible */
|
|
3153
|
+
.x-treelist-pve-nav .x-treelist-container {
|
|
3154
|
+
display: block !important;
|
|
3155
|
+
overflow: visible !important;
|
|
3156
|
+
overflow-y: auto !important;
|
|
3157
|
+
}
|
|
3158
|
+
|
|
3159
|
+
/* Child containers for expand/collapse animation */
|
|
3160
|
+
.x-treelist-item>.x-treelist-container {
|
|
3161
|
+
overflow: hidden !important;
|
|
3162
|
+
transition: max-height 0.25s ease-out, opacity 0.2s ease-out !important;
|
|
3163
|
+
}
|
|
3164
|
+
|
|
3165
|
+
/* Expanded state - show children */
|
|
3166
|
+
.x-treelist-item-expanded>.x-treelist-container {
|
|
3167
|
+
max-height: 500px !important;
|
|
3168
|
+
opacity: 1 !important;
|
|
3169
|
+
}
|
|
3170
|
+
|
|
3171
|
+
/* Collapsed state - hide children with animation */
|
|
3172
|
+
.x-treelist-item-collapsed>.x-treelist-container {
|
|
3173
|
+
max-height: 0 !important;
|
|
3174
|
+
opacity: 0 !important;
|
|
3175
|
+
}
|
|
3176
|
+
|
|
3177
|
+
/* =====================================================
|
|
3178
|
+
v5.9 FIX: Consistent 4px border-radius on treelist items (UniFi-style)
|
|
3179
|
+
Note: Treelist hover/selected now handled by ::before pseudo-element
|
|
3180
|
+
===================================================== */
|
|
3181
|
+
|
|
3182
|
+
/* v5.54: Force 4px border-radius on treelist items and containers
|
|
3183
|
+
(overrides default 8px from widget-toolkit) */
|
|
3184
|
+
.x-treelist-item-wrap,
|
|
3185
|
+
.x-treelist-item-text,
|
|
3186
|
+
.x-treelist-row,
|
|
3187
|
+
.x-treelist-container,
|
|
3188
|
+
.x-treelist-root-container,
|
|
3189
|
+
.x-treelist,
|
|
3190
|
+
.x-treelist-pve-nav {
|
|
3191
|
+
border-radius: 4px !important;
|
|
3192
|
+
}
|
|
3193
|
+
|
|
3194
|
+
/* Resource tree selections - consistent 8px */
|
|
3195
|
+
.x-grid-item-selected,
|
|
3196
|
+
.x-grid-item-focused,
|
|
3197
|
+
.x-grid-item-over {
|
|
3198
|
+
border-radius: 8px !important;
|
|
3199
|
+
}
|
|
3200
|
+
|
|
3201
|
+
/* v5.5 FIX: Symmetric wrap padding for treelist items */
|
|
3202
|
+
.x-treelist-item-wrap {
|
|
3203
|
+
padding-left: 2px !important;
|
|
3204
|
+
padding-right: 2px !important;
|
|
3205
|
+
}
|
|
3206
|
+
|
|
3207
|
+
/* v5.5 FIX: Same symmetric padding for selected items (no longer needs compensation) */
|
|
3208
|
+
.x-treelist-item-selected>.x-treelist-row .x-treelist-item-wrap {
|
|
3209
|
+
padding-left: 2px !important;
|
|
3210
|
+
padding-right: 2px !important;
|
|
3211
|
+
}
|
|
3212
|
+
|
|
3213
|
+
/* v5.5 FIX: Add left margin to icon for visual balance */
|
|
3214
|
+
.x-treelist-item-icon {
|
|
3215
|
+
margin-left: 4px !important;
|
|
3216
|
+
}
|
|
3217
|
+
|
|
3218
|
+
/* =====================================================
|
|
3219
|
+
v5.2 FIX: Remove blue focus box on grid items
|
|
3220
|
+
===================================================== */
|
|
3221
|
+
.x-keyboard-mode .x-grid-cell-inner::before,
|
|
3222
|
+
.x-grid-item-focused .x-grid-cell-inner::before,
|
|
3223
|
+
.x-grid-cell-inner::before {
|
|
3224
|
+
content: none !important;
|
|
3225
|
+
border: none !important;
|
|
3226
|
+
display: none !important;
|
|
3227
|
+
}
|
|
3228
|
+
|
|
3229
|
+
/* Remove focus outline */
|
|
3230
|
+
.x-grid-item-focused,
|
|
3231
|
+
.x-grid-item-focused .x-grid-cell,
|
|
3232
|
+
.x-grid-item-focused .x-grid-cell-inner {
|
|
3233
|
+
outline: none !important;
|
|
3234
|
+
box-shadow: none !important;
|
|
3235
|
+
}
|
|
3236
|
+
|
|
3237
|
+
/* =====================================================
|
|
3238
|
+
v5.2 FIX: Font weight for Datacenter and Node items only
|
|
3239
|
+
===================================================== */
|
|
3240
|
+
.fa-server~.x-tree-node-text,
|
|
3241
|
+
.fa-building~.x-tree-node-text {
|
|
3242
|
+
font-weight: 600 !important;
|
|
3243
|
+
}
|
|
3244
|
+
|
|
3245
|
+
/* =====================================================
|
|
3246
|
+
v5.2 FIX: Global smooth scrolling
|
|
3247
|
+
===================================================== */
|
|
3248
|
+
html {
|
|
3249
|
+
scroll-behavior: smooth !important;
|
|
3250
|
+
}
|
|
3251
|
+
|
|
3252
|
+
/* =====================================================
|
|
3253
|
+
v5.4 FIX: Child items styling when parent is selected
|
|
3254
|
+
===================================================== */
|
|
3255
|
+
/* Reset text/icon color for non-selected children of selected parent */
|
|
3256
|
+
.x-treelist-item-selected .x-treelist-item:not(.x-treelist-item-selected) .x-treelist-item-text,
|
|
3257
|
+
.x-treelist-item-selected .x-treelist-item:not(.x-treelist-item-selected) .x-treelist-item-icon {
|
|
3258
|
+
color: #B7BCC2 !important;
|
|
3259
|
+
}
|
|
3260
|
+
|
|
3261
|
+
/* =====================================================
|
|
3262
|
+
v5.4 FIX: Remove double separator between panels
|
|
3263
|
+
===================================================== */
|
|
3264
|
+
#pveResourceTree-1011-body,
|
|
3265
|
+
.pve-resource-tree .x-panel-body,
|
|
3266
|
+
.x-panel-body.x-grid-body {
|
|
3267
|
+
border-right: none !important;
|
|
3268
|
+
}
|
|
3269
|
+
|
|
3270
|
+
/* =====================================================
|
|
3271
|
+
v5.4 FIX: Hover state for tree items
|
|
3272
|
+
===================================================== */
|
|
3273
|
+
/* Hover background for normal items */
|
|
3274
|
+
.x-treelist-item-over>.x-treelist-row {
|
|
3275
|
+
background-color: #23262A !important;
|
|
3276
|
+
}
|
|
3277
|
+
|
|
3278
|
+
/* Hover background for child items inside selected parent - higher specificity */
|
|
3279
|
+
.x-treelist-item-selected .x-treelist-item.x-treelist-item-over:not(.x-treelist-item-selected)>.x-treelist-row {
|
|
3280
|
+
background-color: #23262A !important;
|
|
3281
|
+
}
|
|
3282
|
+
|
|
3283
|
+
/* Hover text/icon color */
|
|
3284
|
+
.x-treelist-item-over>.x-treelist-row .x-treelist-item-text,
|
|
3285
|
+
.x-treelist-item-over>.x-treelist-row .x-treelist-item-icon,
|
|
3286
|
+
.x-treelist-item-selected .x-treelist-item.x-treelist-item-over:not(.x-treelist-item-selected)>.x-treelist-row .x-treelist-item-text,
|
|
3287
|
+
.x-treelist-item-selected .x-treelist-item.x-treelist-item-over:not(.x-treelist-item-selected)>.x-treelist-row .x-treelist-item-icon {
|
|
3288
|
+
color: #FFFFFF !important;
|
|
3289
|
+
}
|
|
3290
|
+
|
|
3291
|
+
/* =====================================================
|
|
3292
|
+
v5.4 FIX: Resource tree (grid) - left sidebar styling
|
|
3293
|
+
===================================================== */
|
|
3294
|
+
/* Server View resource tree is not a table: disable table row separators */
|
|
3295
|
+
[id^="pveResourceTree-"].x-tree-panel td.x-grid-cell,
|
|
3296
|
+
[id^="pveResourceTree-"].x-tree-panel .x-grid-td,
|
|
3297
|
+
[id^="pveResourceTree-"].x-tree-panel .x-grid-cell {
|
|
3298
|
+
border-bottom: none !important;
|
|
3299
|
+
}
|
|
3300
|
+
|
|
3301
|
+
/* Server View resource tree: compact VM/CT leaf rows (verified via DevTools) */
|
|
3302
|
+
[id^="pveResourceTree-"].x-tree-panel tr.x-grid-row.x-grid-tree-node-leaf .x-grid-cell-inner,
|
|
3303
|
+
[id^="pveResourceTree-"].x-tree-panel .x-grid-item.x-grid-tree-node-leaf .x-grid-cell-inner {
|
|
3304
|
+
padding-top: 2px !important;
|
|
3305
|
+
padding-bottom: 2px !important;
|
|
3306
|
+
}
|
|
3307
|
+
|
|
3308
|
+
/* Server View resource tree: prevent last-leaf indent shift (x-tree-elbow-end has extra margin) */
|
|
3309
|
+
[id^="pveResourceTree-"].x-tree-panel .x-tree-elbow-end {
|
|
3310
|
+
margin-right: 0 !important;
|
|
3311
|
+
}
|
|
3312
|
+
|
|
3313
|
+
[id^="pveResourceTree-"].x-tree-panel tr.x-grid-row.x-grid-tree-node-leaf .x-tree-node-text,
|
|
3314
|
+
[id^="pveResourceTree-"].x-tree-panel .x-grid-item.x-grid-tree-node-leaf .x-tree-node-text {
|
|
3315
|
+
line-height: 17px !important;
|
|
3316
|
+
}
|
|
3317
|
+
|
|
3318
|
+
/* Non-selected items should show gray text */
|
|
3319
|
+
.x-grid-item:not(.x-grid-item-selected):not(.x-grid-item-focused) .x-tree-node-text {
|
|
3320
|
+
color: #B7BCC2 !important;
|
|
3321
|
+
}
|
|
3322
|
+
|
|
3323
|
+
/* Non-selected item icons should be gray */
|
|
3324
|
+
.x-grid-item:not(.x-grid-item-selected):not(.x-grid-item-focused) .x-tree-icon,
|
|
3325
|
+
.x-grid-item:not(.x-grid-item-selected):not(.x-grid-item-focused) .fa {
|
|
3326
|
+
color: #B7BCC2 !important;
|
|
3327
|
+
}
|
|
3328
|
+
|
|
3329
|
+
/* v5.94: Preserve status icon colors in grid items
|
|
3330
|
+
The broad .fa color rule above overrides .good/.warning/.critical from ext6-pmx.css */
|
|
3331
|
+
.x-grid-item:not(.x-grid-item-selected):not(.x-grid-item-focused) .fa.good {
|
|
3332
|
+
color: var(--pm-success) !important;
|
|
3333
|
+
}
|
|
3334
|
+
.x-grid-item:not(.x-grid-item-selected):not(.x-grid-item-focused) .fa.warning {
|
|
3335
|
+
color: var(--pm-warning) !important;
|
|
3336
|
+
}
|
|
3337
|
+
.x-grid-item:not(.x-grid-item-selected):not(.x-grid-item-focused) .fa.critical {
|
|
3338
|
+
color: var(--pm-error) !important;
|
|
3339
|
+
}
|
|
3340
|
+
|
|
3341
|
+
/* Selected item text should be white */
|
|
3342
|
+
.x-grid-item-selected .x-tree-node-text,
|
|
3343
|
+
.x-grid-item-focused .x-tree-node-text {
|
|
3344
|
+
color: #FFFFFF !important;
|
|
3345
|
+
}
|
|
3346
|
+
|
|
3347
|
+
/* Selected item icons should be blue */
|
|
3348
|
+
.x-grid-item-selected .x-tree-icon,
|
|
3349
|
+
.x-grid-item-selected .fa,
|
|
3350
|
+
.x-grid-item-focused .x-tree-icon,
|
|
3351
|
+
.x-grid-item-focused .fa {
|
|
3352
|
+
color: #3B8BEB !important;
|
|
3353
|
+
}
|
|
3354
|
+
|
|
3355
|
+
/* Hover state for grid items - text stays primary color */
|
|
3356
|
+
.x-grid-item-over:not(.x-grid-item-selected) .x-tree-node-text {
|
|
3357
|
+
color: #DEE0E3 !important;
|
|
3358
|
+
}
|
|
3359
|
+
|
|
3360
|
+
/* Hover state for grid items - icons color */
|
|
3361
|
+
.x-grid-item-over:not(.x-grid-item-selected) .x-tree-icon,
|
|
3362
|
+
.x-grid-item-over:not(.x-grid-item-selected) .fa {
|
|
3363
|
+
color: #DEE0E3 !important;
|
|
3364
|
+
}
|
|
3365
|
+
|
|
3366
|
+
|
|
3367
|
+
|
|
3368
|
+
|
|
3369
|
+
|
|
3370
|
+
|
|
3371
|
+
|
|
3372
|
+
|
|
3373
|
+
|
|
3374
|
+
/* Content panel margin for splitter spacing */
|
|
3375
|
+
#content {
|
|
3376
|
+
margin-left: 6px !important;
|
|
3377
|
+
}
|
|
3378
|
+
|
|
3379
|
+
/* =====================================================
|
|
3380
|
+
CHARTS - Remove border-radius from data area only
|
|
3381
|
+
(Outer panel container keeps its rounded corners)
|
|
3382
|
+
===================================================== */
|
|
3383
|
+
/* Remove border-radius from chart canvas/data area ONLY */
|
|
3384
|
+
canvas.x-surface-canvas,
|
|
3385
|
+
.x-surface-canvas,
|
|
3386
|
+
.x-draw-component canvas,
|
|
3387
|
+
.proxmox-rrd-chart canvas {
|
|
3388
|
+
border-radius: 0 !important;
|
|
3389
|
+
}
|
|
3390
|
+
|
|
3391
|
+
/* SVG surface if used */
|
|
3392
|
+
svg.x-surface {
|
|
3393
|
+
border-radius: 0 !important;
|
|
3394
|
+
}
|
|
3395
|
+
|
|
3396
|
+
/* Draw container that holds the canvas */
|
|
3397
|
+
.x-draw-container,
|
|
3398
|
+
.x-surface {
|
|
3399
|
+
border-radius: 0 !important;
|
|
3400
|
+
}
|
|
3401
|
+
|
|
3402
|
+
/* =====================================================
|
|
3403
|
+
HEADER BUTTONS - Vertical centering fix
|
|
3404
|
+
===================================================== */
|
|
3405
|
+
/* Button flex styles moved to Button Section */
|
|
3406
|
+
|
|
3407
|
+
/* Documentation button */
|
|
3408
|
+
.proxmox-inline-button {
|
|
3409
|
+
height: 28px !important;
|
|
3410
|
+
min-height: 28px !important;
|
|
3411
|
+
display: flex !important;
|
|
3412
|
+
align-items: center !important;
|
|
3413
|
+
padding: 3px 8px !important;
|
|
3414
|
+
}
|
|
3415
|
+
|
|
3416
|
+
/* Specific fix for fa-desktop icon (Create VM) - visually bottom-heavy */
|
|
3417
|
+
.x-btn-icon-el.fa-desktop {
|
|
3418
|
+
transform: translateY(1.1px) !important;
|
|
3419
|
+
}
|
|
3420
|
+
|
|
3421
|
+
/* v5.27: Fix icon-only button width (hide inner element) - MUST be at end to override earlier rules */
|
|
3422
|
+
/* ExtJS adds x-btn-no-text class to buttons with only an icon */
|
|
3423
|
+
.x-btn-no-text .x-btn-inner,
|
|
3424
|
+
.x-btn-button.x-btn-no-text .x-btn-inner,
|
|
3425
|
+
.x-btn-button-default-toolbar-small.x-btn-no-text .x-btn-inner-default-toolbar-small,
|
|
3426
|
+
.x-btn-button-default-small.x-btn-no-text .x-btn-inner-default-small,
|
|
3427
|
+
.x-btn-button-default-small.x-btn-no-text>.x-btn-inner-default-small,
|
|
3428
|
+
.x-btn.x-btn-default-small .x-btn-button.x-btn-no-text .x-btn-inner {
|
|
3429
|
+
display: none !important;
|
|
3430
|
+
}
|
|
3431
|
+
|
|
3432
|
+
/* =====================================================
|
|
3433
|
+
v5.18 FIX: Scroll and overflow fixes for content visibility
|
|
3434
|
+
===================================================== */
|
|
3435
|
+
/* FIX 1: Remove overflow:hidden from grid containers to restore content visibility */
|
|
3436
|
+
.pve-info-grid,
|
|
3437
|
+
.x-panel-default .x-grid,
|
|
3438
|
+
.x-container .x-grid-view {
|
|
3439
|
+
overflow: visible !important;
|
|
3440
|
+
overflow-y: auto !important;
|
|
3441
|
+
}
|
|
3442
|
+
|
|
3443
|
+
/* FIX 2: Vertical toolbar scrolling with hidden scrollbar */
|
|
3444
|
+
.x-toolbar.x-vertical .x-box-scroller-body-vertical {
|
|
3445
|
+
overflow-y: auto !important;
|
|
3446
|
+
overflow-x: hidden !important;
|
|
3447
|
+
scrollbar-width: none !important;
|
|
3448
|
+
-ms-overflow-style: none !important;
|
|
3449
|
+
}
|
|
3450
|
+
|
|
3451
|
+
/* Hide scrollbar for Chrome/Safari/Opera */
|
|
3452
|
+
.x-toolbar.x-vertical .x-box-scroller-body-vertical::-webkit-scrollbar {
|
|
3453
|
+
display: none !important;
|
|
3454
|
+
width: 0 !important;
|
|
3455
|
+
}
|
|
3456
|
+
|
|
3457
|
+
/* FIX 3: Make sure the vertical toolbar doesn't hide overflow */
|
|
3458
|
+
.x-toolbar.x-vertical {
|
|
3459
|
+
overflow: visible !important;
|
|
3460
|
+
overflow-y: visible !important;
|
|
3461
|
+
}
|
|
3462
|
+
|
|
3463
|
+
/* =====================================================
|
|
3464
|
+
v5.35 FIX: Center "IPs" label vertically with IP addresses
|
|
3465
|
+
Works together with v5.87 button repositioning
|
|
3466
|
+
===================================================== */
|
|
3467
|
+
/* IPs label container - translate down 9px for vertical centering */
|
|
3468
|
+
[id^="pveIPViewLXC-"]>.x-box-inner>.x-box-target>[id^="box-"] {
|
|
3469
|
+
transform: translateY(9px) !important;
|
|
3470
|
+
}
|
|
3471
|
+
|
|
3472
|
+
/* =====================================================
|
|
3473
|
+
v5.18 FIX: CRITICAL - Restore grid/tree content visibility
|
|
3474
|
+
These must be at the END of the file to override earlier rules
|
|
3475
|
+
===================================================== */
|
|
3476
|
+
/* Remove overflow:hidden that was hiding grid content */
|
|
3477
|
+
.pve-info-grid,
|
|
3478
|
+
.x-panel-default .x-grid,
|
|
3479
|
+
.x-container .x-grid-view,
|
|
3480
|
+
.x-tree-view,
|
|
3481
|
+
.x-tree-panel .x-panel-body,
|
|
3482
|
+
.x-grid-view {
|
|
3483
|
+
overflow: visible !important;
|
|
3484
|
+
}
|
|
3485
|
+
|
|
3486
|
+
/* Tree/grid scroll containers */
|
|
3487
|
+
.x-tree-view.x-fit-item,
|
|
3488
|
+
.x-grid-view.x-fit-item {
|
|
3489
|
+
overflow: auto !important;
|
|
3490
|
+
}
|
|
3491
|
+
|
|
3492
|
+
/* Grid item containers must be visible */
|
|
3493
|
+
.x-grid-item-container {
|
|
3494
|
+
overflow: visible !important;
|
|
3495
|
+
}
|
|
3496
|
+
|
|
3497
|
+
/* =====================================================
|
|
3498
|
+
v5.57: Fix summary page widget panels border-radius
|
|
3499
|
+
Column-layout panels (Health, Guests, Resources, etc.)
|
|
3500
|
+
have visible borders that need rounded corners to
|
|
3501
|
+
match the parent panel's 8px radius.
|
|
3502
|
+
===================================================== */
|
|
3503
|
+
.x-panel.x-column>.x-panel-bodyWrap>.x-panel-body.x-panel-body-default {
|
|
3504
|
+
border-radius: 8px !important;
|
|
3505
|
+
}
|
|
3506
|
+
|
|
3507
|
+
/* Tree navigation container */
|
|
3508
|
+
.x-treelist-pve-nav .x-treelist-container {
|
|
3509
|
+
overflow: visible !important;
|
|
3510
|
+
overflow-y: auto !important;
|
|
3511
|
+
}
|
|
3512
|
+
|
|
3513
|
+
/* =====================================================
|
|
3514
|
+
v5.40: Fix floating grid picker border-radius
|
|
3515
|
+
Storage dropdown, ISO selector, etc. use grid layers
|
|
3516
|
+
Should match 4px boundlist style, not 12px summary panels
|
|
3517
|
+
===================================================== */
|
|
3518
|
+
.x-layer.x-grid .x-grid-view,
|
|
3519
|
+
.x-panel.x-layer.x-grid .x-grid-view {
|
|
3520
|
+
border-radius: 4px !important;
|
|
3521
|
+
}
|
|
3522
|
+
|
|
3523
|
+
.x-panel.x-layer.x-grid,
|
|
3524
|
+
.x-layer.x-panel.x-grid {
|
|
3525
|
+
border-radius: 4px !important;
|
|
3526
|
+
}
|
|
3527
|
+
|
|
3528
|
+
/* Grid items in floating pickers - 4px radius (matches boundlist style) */
|
|
3529
|
+
.x-layer.x-grid .x-grid-item-over,
|
|
3530
|
+
.x-layer.x-grid .x-grid-item-selected,
|
|
3531
|
+
.x-panel.x-layer.x-grid .x-grid-item-over,
|
|
3532
|
+
.x-panel.x-layer.x-grid .x-grid-item-selected {
|
|
3533
|
+
border-radius: 4px !important;
|
|
3534
|
+
}
|
|
3535
|
+
|
|
3536
|
+
/* TD cells have their own background - reset and apply only to first/last */
|
|
3537
|
+
.x-layer.x-grid .x-grid-item-over td,
|
|
3538
|
+
.x-layer.x-grid .x-grid-item-selected td,
|
|
3539
|
+
.x-layer.x-grid .x-grid-item-over .x-grid-cell,
|
|
3540
|
+
.x-layer.x-grid .x-grid-item-selected .x-grid-cell,
|
|
3541
|
+
.x-panel.x-layer.x-grid .x-grid-item-over td,
|
|
3542
|
+
.x-panel.x-layer.x-grid .x-grid-item-selected td,
|
|
3543
|
+
.x-panel.x-layer.x-grid .x-grid-item-over .x-grid-cell,
|
|
3544
|
+
.x-panel.x-layer.x-grid .x-grid-item-selected .x-grid-cell {
|
|
3545
|
+
border-radius: 0 !important;
|
|
3546
|
+
}
|
|
3547
|
+
|
|
3548
|
+
/* First cell gets left radius, last cell gets right radius */
|
|
3549
|
+
.x-layer.x-grid .x-grid-item-over td:first-child,
|
|
3550
|
+
.x-layer.x-grid .x-grid-item-selected td:first-child,
|
|
3551
|
+
.x-panel.x-layer.x-grid .x-grid-item-over td:first-child,
|
|
3552
|
+
.x-panel.x-layer.x-grid .x-grid-item-selected td:first-child {
|
|
3553
|
+
border-radius: 4px 0 0 4px !important;
|
|
3554
|
+
}
|
|
3555
|
+
|
|
3556
|
+
.x-layer.x-grid .x-grid-item-over td:last-child,
|
|
3557
|
+
.x-layer.x-grid .x-grid-item-selected td:last-child,
|
|
3558
|
+
.x-panel.x-layer.x-grid .x-grid-item-over td:last-child,
|
|
3559
|
+
.x-panel.x-layer.x-grid .x-grid-item-selected td:last-child {
|
|
3560
|
+
border-radius: 0 4px 4px 0 !important;
|
|
3561
|
+
}
|
|
3562
|
+
|
|
3563
|
+
/* =====================================================
|
|
3564
|
+
v5.42: Fix Bulk Actions dropdown button issues
|
|
3565
|
+
Button was growing larger (24px → 26px) and text was gray instead of white
|
|
3566
|
+
===================================================== */
|
|
3567
|
+
|
|
3568
|
+
/* Toolbar menu fix moved to Button Section */
|
|
3569
|
+
|
|
3570
|
+
/* =====================================================
|
|
3571
|
+
v5.43: Compact tab bar for Tasks/Cluster log panel
|
|
3572
|
+
Reduces wasted vertical space in bottom panel tabs
|
|
3573
|
+
Tab bar height: 36px → 26px, padding: 6px → 3px
|
|
3574
|
+
===================================================== */
|
|
3575
|
+
|
|
3576
|
+
/* Reduce tab bar height for south panel (Tasks/Cluster log) */
|
|
3577
|
+
.x-panel.x-border-item .x-tab-bar.x-docked.x-tab-bar-default-horizontal {
|
|
3578
|
+
height: 26px !important;
|
|
3579
|
+
}
|
|
3580
|
+
|
|
3581
|
+
/* Reduce inner body padding */
|
|
3582
|
+
.x-panel.x-border-item .x-tab-bar.x-docked .x-box-inner {
|
|
3583
|
+
padding-top: 3px !important;
|
|
3584
|
+
padding-bottom: 3px !important;
|
|
3585
|
+
}
|
|
3586
|
+
|
|
3587
|
+
/* Adjust panel body position to account for smaller tab bar */
|
|
3588
|
+
/* v5.56: Exclude grids - they need ExtJS inline positioning for proper header display */
|
|
3589
|
+
/* .x-panel.x-border-item:not(.x-grid) .x-panel-body.x-panel-body-default {
|
|
3590
|
+
top: 26px !important;
|
|
3591
|
+
} */
|
|
3592
|
+
|
|
3593
|
+
/* =====================================================
|
|
3594
|
+
v5.72: COMPREHENSIVE MODAL SPACING & CLIPPING FIX
|
|
3595
|
+
|
|
3596
|
+
Problem: The v5.43 rule (top: 26px for south panel tabs) cascaded
|
|
3597
|
+
to ALL panel bodies inside dialogs/windows, creating 52-70px gaps
|
|
3598
|
+
between title/tabs and tabs/content, plus content clipping.
|
|
3599
|
+
|
|
3600
|
+
Solution: Reset ALL panel bodies to 0, then restore 26px ONLY for
|
|
3601
|
+
the body that immediately follows a tab bar (using sibling selector).
|
|
3602
|
+
Uses ultra-high specificity with 'body' prefix to win CSS battles.
|
|
3603
|
+
===================================================== */
|
|
3604
|
+
|
|
3605
|
+
/* Restore 26px ONLY for the panel body that immediately follows a tab bar */
|
|
3606
|
+
body .x-window .x-panel .x-panel-bodyWrap>.x-tab-bar+.x-panel-body.x-panel-body-default {
|
|
3607
|
+
top: 26px !important;
|
|
3608
|
+
}
|
|
3609
|
+
|
|
3610
|
+
/* Zero out padding in bodyWraps that could cause extra gaps */
|
|
3611
|
+
.x-window .x-panel-bodyWrap {
|
|
3612
|
+
padding: 0 !important;
|
|
3613
|
+
}
|
|
3614
|
+
|
|
3615
|
+
/* v5.93: REMOVED overflow: visible rule that was breaking log viewer scrolling
|
|
3616
|
+
The original rule was:
|
|
3617
|
+
.x-window .x-panel-body { overflow: visible !important; }
|
|
3618
|
+
This was added to "fix overflow clipping - allow visible overflow in modal panels"
|
|
3619
|
+
but it breaks task viewer / log viewer scroll functionality.
|
|
3620
|
+
If clipping issues appear elsewhere, use more targeted selectors.
|
|
3621
|
+
*/
|
|
3622
|
+
|
|
3623
|
+
/* But keep auto overflow on the main window body for scrolling */
|
|
3624
|
+
/* .x-window .x-window-body {
|
|
3625
|
+
overflow: auto !important;
|
|
3626
|
+
} */
|
|
3627
|
+
|
|
3628
|
+
/* =====================================================
|
|
3629
|
+
v5.58: Fix modal form field width overflow
|
|
3630
|
+
Form fields were extending past the right edge of the modal.
|
|
3631
|
+
Constrain autocontainer and trigger wrap widths.
|
|
3632
|
+
v5.64: REMOVED margin-right rule - was causing input field cutoff.
|
|
3633
|
+
The autocontainer constraint is sufficient for overflow prevention.
|
|
3634
|
+
|
|
3635
|
+
|
|
3636
|
+
/* v5.61: Trigger-wrap width rule removed (consolidated into form layout section) */
|
|
3637
|
+
|
|
3638
|
+
|
|
3639
|
+
|
|
3640
|
+
/* =====================================================
|
|
3641
|
+
v5.47: Restore right border on disk list panel in wizards
|
|
3642
|
+
Restores right border for grids inside windows (fixed v5.4 over-reach).
|
|
3643
|
+
===================================================== */
|
|
3644
|
+
|
|
3645
|
+
|
|
3646
|
+
/* =====================================================
|
|
3647
|
+
v5.48: MODAL ANIMATIONS - Open Animation + Background Blur
|
|
3648
|
+
CSS-ONLY implementation (no JavaScript required)
|
|
3649
|
+
|
|
3650
|
+
Features:
|
|
3651
|
+
- Smooth fade-in + scale animation when modals/dialogs open
|
|
3652
|
+
- Subtle backdrop blur effect for modern look
|
|
3653
|
+
- Menu/dropdown slide-in animation
|
|
3654
|
+
|
|
3655
|
+
NOTE: Close animations are NOT possible with pure CSS because
|
|
3656
|
+
ExtJS removes the window from the DOM immediately on close.
|
|
3657
|
+
This is a pure CSS theme - no JavaScript modifications.
|
|
3658
|
+
===================================================== */
|
|
3659
|
+
|
|
3660
|
+
/* Opening animation keyframe */
|
|
3661
|
+
@keyframes modalFadeIn {
|
|
3662
|
+
from {
|
|
3663
|
+
opacity: 0;
|
|
3664
|
+
transform: scale(0.95) translateY(-10px);
|
|
3665
|
+
}
|
|
3666
|
+
|
|
3667
|
+
to {
|
|
3668
|
+
opacity: 1;
|
|
3669
|
+
transform: scale(1) translateY(0);
|
|
3670
|
+
}
|
|
3671
|
+
}
|
|
3672
|
+
|
|
3673
|
+
/* Menu slide animation keyframe */
|
|
3674
|
+
@keyframes menuSlideIn {
|
|
3675
|
+
from {
|
|
3676
|
+
opacity: 0;
|
|
3677
|
+
transform: translateY(-5px);
|
|
3678
|
+
}
|
|
3679
|
+
|
|
3680
|
+
to {
|
|
3681
|
+
opacity: 1;
|
|
3682
|
+
transform: translateY(0);
|
|
3683
|
+
}
|
|
3684
|
+
}
|
|
3685
|
+
|
|
3686
|
+
|
|
3687
|
+
|
|
3688
|
+
/* Window/Dialog - open animation */
|
|
3689
|
+
.x-window,
|
|
3690
|
+
.x-window-default {
|
|
3691
|
+
animation: modalFadeIn 0.2s ease-out forwards !important;
|
|
3692
|
+
transform-origin: center top !important;
|
|
3693
|
+
}
|
|
3694
|
+
|
|
3695
|
+
/* Message boxes - centered origin */
|
|
3696
|
+
.x-message-box {
|
|
3697
|
+
animation: modalFadeIn 0.2s ease-out forwards !important;
|
|
3698
|
+
transform-origin: center center !important;
|
|
3699
|
+
}
|
|
3700
|
+
|
|
3701
|
+
/* Menus and dropdowns - slide animation */
|
|
3702
|
+
.x-menu,
|
|
3703
|
+
.x-menu-default,
|
|
3704
|
+
.x-boundlist {
|
|
3705
|
+
animation: menuSlideIn 0.12s ease-out forwards !important;
|
|
3706
|
+
transform-origin: top center !important;
|
|
3707
|
+
}
|
|
3708
|
+
|
|
3709
|
+
/* =====================================================
|
|
3710
|
+
v5.77: TREE SETTINGS DIALOG FIX
|
|
3711
|
+
Force layout recalculation and visibility for tree settings
|
|
3712
|
+
===================================================== */
|
|
3713
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-panel-body {
|
|
3714
|
+
width: 100% !important;
|
|
3715
|
+
min-width: 300px !important;
|
|
3716
|
+
}
|
|
3717
|
+
|
|
3718
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-autocontainer-innerCt {
|
|
3719
|
+
width: 100% !important;
|
|
3720
|
+
display: block !important;
|
|
3721
|
+
}
|
|
3722
|
+
|
|
3723
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-window-body {
|
|
3724
|
+
overflow: visible !important;
|
|
3725
|
+
height: auto !important;
|
|
3726
|
+
}
|
|
3727
|
+
|
|
3728
|
+
.x-window[id^="pveTreeSettingsEdit"] input {
|
|
3729
|
+
width: 100% !important;
|
|
3730
|
+
visibility: visible !important;
|
|
3731
|
+
display: block !important;
|
|
3732
|
+
opacity: 1 !important;
|
|
3733
|
+
}
|
|
3734
|
+
|
|
3735
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-form-item-body,
|
|
3736
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-form-trigger-wrap,
|
|
3737
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-form-text-wrap {
|
|
3738
|
+
width: 100% !important;
|
|
3739
|
+
overflow: visible !important;
|
|
3740
|
+
}
|
|
3741
|
+
|
|
3742
|
+
/* v5.82: Fix Tree Settings Dialog Width (Force full width on containers) */
|
|
3743
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-panel[id^="inputpanel"],
|
|
3744
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-panel[id^="inputpanel"] .x-panel-body,
|
|
3745
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-panel[id^="inputpanel"] .x-box-inner,
|
|
3746
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-panel[id^="inputpanel"] .x-box-target,
|
|
3747
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-panel[id^="inputpanel"] .x-container,
|
|
3748
|
+
.x-window[id^="pveTreeSettingsEdit"] .x-panel[id^="inputpanel"] .x-field {
|
|
3749
|
+
width: 100% !important;
|
|
3750
|
+
box-sizing: border-box !important;
|
|
3751
|
+
}
|
|
3752
|
+
|
|
3753
|
+
/* =====================================================
|
|
3754
|
+
v5.78: LOGIN DIALOG FIXES
|
|
3755
|
+
1. Remove inner panel borders for cleaner "direct on window" look
|
|
3756
|
+
2. Rely on ExtJS natural sizing (facilitated by removing the
|
|
3757
|
+
width:inherit rule above)
|
|
3758
|
+
===================================================== */
|
|
3759
|
+
.x-window:has(#pveloginrealm) .x-panel-body {
|
|
3760
|
+
border: none !important;
|
|
3761
|
+
background: transparent !important;
|
|
3762
|
+
width: auto !important;
|
|
3763
|
+
}
|
|
3764
|
+
|
|
3765
|
+
/* =====================================================
|
|
3766
|
+
v5.81: VM WIZARD WIDTH FIX (REVISED)
|
|
3767
|
+
1. Keep window borders (user preference).
|
|
3768
|
+
2. Force internal elements to fit the measured content width
|
|
3769
|
+
(718.4px) instead of overflowing at fixed 720px.
|
|
3770
|
+
===================================================== */
|
|
3771
|
+
.x-window[id^="pveQemuCreateWizard"] .x-window-body,
|
|
3772
|
+
.x-window[id^="pveQemuCreateWizard"] .x-window-body>.x-panel,
|
|
3773
|
+
.x-window[id^="pveQemuCreateWizard"] .x-panel-bodyWrap,
|
|
3774
|
+
.x-window[id^="pveQemuCreateWizard"] .x-panel-body {
|
|
3775
|
+
width: 100% !important;
|
|
3776
|
+
box-sizing: border-box !important;
|
|
3777
|
+
}
|
|
3778
|
+
|
|
3779
|
+
/* =====================================================
|
|
3780
|
+
v5.86: TOOL ICONS - FontAwesome Replacements
|
|
3781
|
+
Replace sprite-based ExtJS tool icons with crisp
|
|
3782
|
+
FontAwesome icons for better consistency and clarity
|
|
3783
|
+
===================================================== */
|
|
3784
|
+
|
|
3785
|
+
/* Base styling for all tool icons - remove sprite backgrounds */
|
|
3786
|
+
.x-tool-tool-el.x-tool-minus,
|
|
3787
|
+
.x-tool-img.x-tool-minus,
|
|
3788
|
+
.x-tool-tool-el.x-tool-collapse-right,
|
|
3789
|
+
.x-tool-img.x-tool-collapse-right,
|
|
3790
|
+
.x-tool-tool-el.x-tool-collapse-left,
|
|
3791
|
+
.x-tool-img.x-tool-collapse-left,
|
|
3792
|
+
.x-tool-tool-el.x-tool-expand-right,
|
|
3793
|
+
.x-tool-img.x-tool-expand-right,
|
|
3794
|
+
.x-tool-tool-el.x-tool-expand-left,
|
|
3795
|
+
.x-tool-img.x-tool-expand-left,
|
|
3796
|
+
.x-tool-tool-el.x-tool-maximize,
|
|
3797
|
+
.x-tool-img.x-tool-maximize,
|
|
3798
|
+
.x-tool-tool-el.x-tool-restore,
|
|
3799
|
+
.x-tool-img.x-tool-restore,
|
|
3800
|
+
.x-tool-tool-el.x-tool-gear,
|
|
3801
|
+
.x-tool-img.x-tool-gear,
|
|
3802
|
+
.x-tool-tool-el.x-tool-refresh,
|
|
3803
|
+
.x-tool-img.x-tool-refresh {
|
|
3804
|
+
background-image: none !important;
|
|
3805
|
+
font-family: "FontAwesome" !important;
|
|
3806
|
+
font-size: 14px !important;
|
|
3807
|
+
line-height: 16px !important;
|
|
3808
|
+
text-align: center !important;
|
|
3809
|
+
color: #737C87 !important;
|
|
3810
|
+
transition: color 0.15s ease !important;
|
|
3811
|
+
filter: none !important;
|
|
3812
|
+
width: 16px !important;
|
|
3813
|
+
height: 16px !important;
|
|
3814
|
+
display: flex !important;
|
|
3815
|
+
align-items: center !important;
|
|
3816
|
+
justify-content: center !important;
|
|
3817
|
+
}
|
|
3818
|
+
|
|
3819
|
+
/* Undo Zoom button (minus icon) - use zoom-out icon */
|
|
3820
|
+
.x-tool-tool-el.x-tool-minus::before,
|
|
3821
|
+
.x-tool-img.x-tool-minus::before {
|
|
3822
|
+
content: "\f010" !important; /* fa-search-minus (zoom out) */
|
|
3823
|
+
}
|
|
3824
|
+
|
|
3825
|
+
/* Collapse right - single chevron pointing right (>)
|
|
3826
|
+
Panel is expanded, clicking will collapse it to the right */
|
|
3827
|
+
.x-tool-tool-el.x-tool-collapse-right::before,
|
|
3828
|
+
.x-tool-img.x-tool-collapse-right::before {
|
|
3829
|
+
content: "\f054" !important; /* fa-chevron-right (>) */
|
|
3830
|
+
}
|
|
3831
|
+
|
|
3832
|
+
/* Expand left - single chevron pointing left (<)
|
|
3833
|
+
Panel is collapsed on right, clicking will expand it to the left */
|
|
3834
|
+
.x-tool-tool-el.x-tool-expand-left::before,
|
|
3835
|
+
.x-tool-img.x-tool-expand-left::before {
|
|
3836
|
+
content: "\f053" !important; /* fa-chevron-left (<) */
|
|
3837
|
+
}
|
|
3838
|
+
|
|
3839
|
+
/* Collapse left - single chevron pointing left (<)
|
|
3840
|
+
Panel is expanded, clicking will collapse it to the left */
|
|
3841
|
+
.x-tool-tool-el.x-tool-collapse-left::before,
|
|
3842
|
+
.x-tool-img.x-tool-collapse-left::before {
|
|
3843
|
+
content: "\f053" !important; /* fa-chevron-left (<) */
|
|
3844
|
+
}
|
|
3845
|
+
|
|
3846
|
+
/* Expand right - single chevron pointing right (>)
|
|
3847
|
+
Panel is collapsed on left, clicking will expand it to the right */
|
|
3848
|
+
.x-tool-tool-el.x-tool-expand-right::before,
|
|
3849
|
+
.x-tool-img.x-tool-expand-right::before {
|
|
3850
|
+
content: "\f054" !important; /* fa-chevron-right (>) */
|
|
3851
|
+
}
|
|
3852
|
+
|
|
3853
|
+
/* Maximize (expand icon) */
|
|
3854
|
+
.x-tool-tool-el.x-tool-maximize::before,
|
|
3855
|
+
.x-tool-img.x-tool-maximize::before {
|
|
3856
|
+
content: "\f065" !important; /* fa-expand */
|
|
3857
|
+
}
|
|
3858
|
+
|
|
3859
|
+
/* Restore (compress icon) */
|
|
3860
|
+
.x-tool-tool-el.x-tool-restore::before,
|
|
3861
|
+
.x-tool-img.x-tool-restore::before {
|
|
3862
|
+
content: "\f066" !important; /* fa-compress */
|
|
3863
|
+
}
|
|
3864
|
+
|
|
3865
|
+
/* Gear/Settings icon */
|
|
3866
|
+
.x-tool-tool-el.x-tool-gear::before,
|
|
3867
|
+
.x-tool-img.x-tool-gear::before {
|
|
3868
|
+
content: "\f013" !important; /* fa-cog */
|
|
3869
|
+
}
|
|
3870
|
+
|
|
3871
|
+
/* Refresh icon */
|
|
3872
|
+
.x-tool-tool-el.x-tool-refresh::before,
|
|
3873
|
+
.x-tool-img.x-tool-refresh::before {
|
|
3874
|
+
content: "\f021" !important; /* fa-refresh */
|
|
3875
|
+
}
|
|
3876
|
+
|
|
3877
|
+
/* Hover state - all tool icons */
|
|
3878
|
+
.x-tool:hover .x-tool-tool-el.x-tool-minus,
|
|
3879
|
+
.x-tool:hover .x-tool-img.x-tool-minus,
|
|
3880
|
+
.x-tool:hover .x-tool-tool-el.x-tool-collapse-right,
|
|
3881
|
+
.x-tool:hover .x-tool-img.x-tool-collapse-right,
|
|
3882
|
+
.x-tool:hover .x-tool-tool-el.x-tool-collapse-left,
|
|
3883
|
+
.x-tool:hover .x-tool-img.x-tool-collapse-left,
|
|
3884
|
+
.x-tool:hover .x-tool-tool-el.x-tool-expand-right,
|
|
3885
|
+
.x-tool:hover .x-tool-img.x-tool-expand-right,
|
|
3886
|
+
.x-tool:hover .x-tool-tool-el.x-tool-expand-left,
|
|
3887
|
+
.x-tool:hover .x-tool-img.x-tool-expand-left,
|
|
3888
|
+
.x-tool:hover .x-tool-tool-el.x-tool-maximize,
|
|
3889
|
+
.x-tool:hover .x-tool-img.x-tool-maximize,
|
|
3890
|
+
.x-tool:hover .x-tool-tool-el.x-tool-restore,
|
|
3891
|
+
.x-tool:hover .x-tool-img.x-tool-restore,
|
|
3892
|
+
.x-tool:hover .x-tool-tool-el.x-tool-gear,
|
|
3893
|
+
.x-tool:hover .x-tool-img.x-tool-gear,
|
|
3894
|
+
.x-tool:hover .x-tool-tool-el.x-tool-refresh,
|
|
3895
|
+
.x-tool:hover .x-tool-img.x-tool-refresh {
|
|
3896
|
+
color: #DEE0E3 !important;
|
|
3897
|
+
}
|
|
3898
|
+
|
|
3899
|
+
/* Disabled state */
|
|
3900
|
+
.x-tool-disabled .x-tool-tool-el,
|
|
3901
|
+
.x-tool-disabled .x-tool-img {
|
|
3902
|
+
opacity: 0.4 !important;
|
|
3903
|
+
cursor: default !important;
|
|
3904
|
+
}
|
|
3905
|
+
|
|
3906
|
+
/* =====================================================
|
|
3907
|
+
v5.86: GENERIC TOOL ICONS (Inline FontAwesome)
|
|
3908
|
+
Some ExtJS tools use inline style="font-family:FontAwesome"
|
|
3909
|
+
with text content for their icons instead of ::before
|
|
3910
|
+
===================================================== */
|
|
3911
|
+
|
|
3912
|
+
/* Style generic tools that use text content with FontAwesome */
|
|
3913
|
+
.x-tool-tool-el[style*="font-family:FontAwesome"],
|
|
3914
|
+
.x-tool-tool-el[style*="font-family: FontAwesome"] {
|
|
3915
|
+
color: #737C87 !important;
|
|
3916
|
+
font-size: 14px !important;
|
|
3917
|
+
line-height: 16px !important;
|
|
3918
|
+
display: flex !important;
|
|
3919
|
+
align-items: center !important;
|
|
3920
|
+
justify-content: center !important;
|
|
3921
|
+
width: 16px !important;
|
|
3922
|
+
height: 16px !important;
|
|
3923
|
+
transition: color 0.15s ease !important;
|
|
3924
|
+
background-image: none !important;
|
|
3925
|
+
background-color: transparent !important;
|
|
3926
|
+
}
|
|
3927
|
+
|
|
3928
|
+
/* Enabled state - pointer cursor */
|
|
3929
|
+
.x-tool:not(.x-tool-disabled) .x-tool-tool-el[style*="font-family:FontAwesome"],
|
|
3930
|
+
.x-tool:not(.x-tool-disabled) .x-tool-tool-el[style*="font-family: FontAwesome"] {
|
|
3931
|
+
cursor: pointer !important;
|
|
3932
|
+
}
|
|
3933
|
+
|
|
3934
|
+
/* Disabled state - default cursor and reduced opacity */
|
|
3935
|
+
.x-tool.x-tool-disabled .x-tool-tool-el[style*="font-family:FontAwesome"],
|
|
3936
|
+
.x-tool.x-tool-disabled .x-tool-tool-el[style*="font-family: FontAwesome"] {
|
|
3937
|
+
cursor: default !important;
|
|
3938
|
+
opacity: 0.4 !important;
|
|
3939
|
+
}
|
|
3940
|
+
|
|
3941
|
+
/* Fix mask overlay on tool icons - transparent and non-blocking */
|
|
3942
|
+
.x-tool .x-mask {
|
|
3943
|
+
background-color: transparent !important;
|
|
3944
|
+
backdrop-filter: none !important;
|
|
3945
|
+
pointer-events: none !important;
|
|
3946
|
+
}
|
|
3947
|
+
|
|
3948
|
+
/* Hover state for enabled generic tools */
|
|
3949
|
+
.x-tool:not(.x-tool-disabled):hover .x-tool-tool-el[style*="font-family:FontAwesome"],
|
|
3950
|
+
.x-tool:not(.x-tool-disabled):hover .x-tool-tool-el[style*="font-family: FontAwesome"] {
|
|
3951
|
+
color: #DEE0E3 !important;
|
|
3952
|
+
}
|