Files
proxmorph/themes/theme-github-dark.css

2495 lines
71 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*!GitHub Dark*/
/*
* ProxMorph Theme: GitHub Dark
* Authentic recreation of GitHub's Dark Mode using Primer Design System
* Version: 2.2.23
*
* v2.2.23: Redesign tab indicator — position ::after at bottom:0 (inside tab box)
* instead of bottom:-2px (outside, clipped by ExtJS containers). Remove
* margin-bottom:-2px hack that caused layout shifts on click. Add overflow:
* visible on .x-box-inner/.x-box-target within .x-tab-bar to prevent clipping.
* pointer-events:none on indicator for clean click-through.
* v2.2.22: Fix ExtJS tab click outline effect — aggressively remove outline and box-shadow
* from all tab focus and pressed states (.x-tab-focus, .x-tab-pressed, etc.).
* v2.2.21: Fix GitHub tab underline — switch from border-bottom to ::after pseudo-element
* (ExtJS overrides border-bottom: none, but cannot override ::after). Add
* overflow:visible on .x-tab-bar-body (ExtJS default clips the indicator).
* Fix white focus outline on tab click (outline:none on .x-tab and focus states).
* v2.2.20: GitHub underline-nav tab style — flat tabs, muted inactive text (#848d97),
* bold white active text (#e6edf3), coral underline indicator (#f47067, 2px)
* via border-bottom + margin-bottom: -2px overlap trick. Tab bar gets
* 1px bottom border (#21262d) matching GitHub's separator. Overflow: visible
* on tabs for the border to render past the bar edge.
* v2.2.19: Polish checkbox/radio appearance — brighter unchecked state (bg #161b22,
* border #6e7681 at 1.5px) to match GitHub's actual Primer control look;
* enlarge to 16×16 for crisp circle rendering; translateZ(0) on radios
* for GPU-accelerated anti-aliasing; inner dot 7px to match new size.
* v2.2.18: GitHub Primer checkboxes & radios — replace sprite-inversion approach with
* native CSS custom controls. Checkbox: 14×14 rounded square, blue fill + SVG
* checkmark when checked. Radio: 14×14 circle, blue inner dot via ::after when
* selected. Hover highlights border in #388bfd. Includes github-dark-init.js patch
* to detect ExtJS initial-state (bgPos:-15px) and add .x-form-cb-checked class.
* v2.2.17: Fix System tab dropdown fields clipped on right side in Create VM dialog
* Root cause: padding: 12px 16px on .x-autocontainer-innerCt shifts form items rightward
* by 16px, but ExtJS uses offsetWidth (not clientWidth) so form items are sized to full
* column width AND shifted — overflowing 16px past column boundary. Right column panel body
* (bg: #0d1117) starts at exact column edge, painting over the overflow trigger buttons.
* Solution: Remove horizontal innerCt padding; add overflow:visible on .x-window .x-panel-body;
* add 0 4px on column panel bodies for breathing room (ExtJS reads getPaddingInfo here).
* v2.2.16: Fix nav tree right border cut-off where Edit/Revert toolbar overlaps
* Root cause: content toolbar (z-index:2) renders on top of nav's right border (same z-index)
* Solution: raise .pve-toolbar-bg to z-index:3 so border paints above overlapping content
* v2.2.15: Fix nav tree right border not extending full panel height
* Root cause: border was on .x-treelist (only item-height tall) not the full sidebar toolbar
* Solution: Move border to .pve-toolbar-bg which spans the full docked toolbar height
* v2.2.14: Force dropdown icons left (order override)
* v2.2.13: Fix dropdown icon/text line breaks
* v2.2.12: Fix dropdown icon/text line wrapping
* v2.2.11: Fine-tune dropdown icon vertical alignment
* v2.2.10: Force dropdown icons left alignment
* v2.2.9: Fix dropdown icons left + remove dotted item borders
* v2.2.8: GitHub-profile dropdown styling for menus/boundlists
* v2.2.7: Port full UniFi border-radius rules to element styles
* v2.2.6: Apply UniFi border radius values (4px/6px/8px) for visual consistency
* v2.2.5: Remove hover effect on already-selected treelist items
* v2.2.4: Toolbox tree item hover/selected highlighting using pseudo-element
* for balanced left/right spacing regardless of row padding
* v2.2.1: Remove blue outline from selected/focused items in resource tree
* Add borders to Guest Status panel and Notes panel
* v2.2.0: Dialog form content padding - prevent content flushing against edges
* v2.1.5: Ported layout container reset rules from UniFi theme (prevent ExtJS clipping)
* v2.1.4: Fixed toolbox tree item text overlapping icons (margin-left: 28px)
* v2.1.3: Toolbox tree active item uses GitHub green instead of blue
* v2.1.2: Vertical usage bars (storage progress) use Proxmox default color #e6e6e6
* v2.1.1: Resource tree icons use Proxmox default colors (green=running, red=error, etc.)
*
* GitHub Primer Dark Mode Color Palette:
*
* CANVAS (Backgrounds):
* - canvas-default: #0d1117 - Main page background
* - canvas-muted: #151b23 - Muted/card backgrounds
* - canvas-inset: #010409 - Header, inset areas
* - canvas-subtle: #161b22 - Subtle backgrounds
*
* FOREGROUND (Text):
* - fg-default: #f0f6fc - Primary text
* - fg-muted: #9198a1 - Secondary/muted text
* - fg-subtle: #6e7681 - Tertiary text
* - fg-onEmphasis: #ffffff - Text on colored backgrounds
*
* BORDERS:
* - border-default: #3d444d - Default borders
* - border-muted: rgba(61, 68, 77, 0.7) - Muted borders
* - border-subtle: rgba(240, 246, 252, 0.1) - Subtle borders
*
* ACCENT (Blue):
* - accent-fg: #4493f8 - Links, accent text
* - accent-emphasis: #1f6feb - Active states
*
* SUCCESS (Green):
* - success-fg: #3fb950 - Success text
* - success-emphasis: #238636 - Primary buttons
*
* BORDER RADII (UniFi-aligned):
* - radius-sm: 4px - Form inputs, checkboxes
* - radius-md: 6px - Buttons
* - radius-lg: 8px - Windows, panels, cards
*/
/* =====================================================
CSS VARIABLES
===================================================== */
:root {
/* GitHub Primer Dark Mode Tokens */
--gh-canvas-default: #0d1117;
--gh-canvas-muted: #151b23;
--gh-canvas-inset: #010409;
--gh-canvas-subtle: #161b22;
--gh-fg-default: #f0f6fc;
--gh-fg-muted: #9198a1;
--gh-fg-subtle: #6e7681;
--gh-fg-on-emphasis: #ffffff;
--gh-border-default: #3d444d;
--gh-border-muted: rgba(61, 68, 77, 0.7);
--gh-border-subtle: rgba(240, 246, 252, 0.1);
--gh-accent-fg: #4493f8;
--gh-accent-emphasis: #1f6feb;
--gh-accent-muted: rgba(56, 139, 253, 0.4);
--gh-accent-subtle: rgba(56, 139, 253, 0.15);
--gh-success-fg: #3fb950;
--gh-success-emphasis: #238636;
--gh-success-hover: #29903b;
--gh-success-active: #2ea043;
--gh-danger-fg: #f85149;
--gh-danger-emphasis: #da3633;
--gh-attention-fg: #d29922;
--gh-attention-emphasis: #9e6a03;
/* Select menu active (Primer dark) */
--gh-selectmenu-active: #0c2d6b;
/* Border Radii - UniFi aligned */
--gh-radius-sm: 4px;
--gh-radius-md: 6px;
--gh-radius-lg: 8px;
/* Hover overlay */
--gh-hover-overlay: rgba(101, 108, 118, 0.2);
/* Map to Proxmox widget toolkit vars */
--pwt-panel-background: var(--gh-canvas-default);
--pwt-text-color: var(--gh-fg-default);
--pwt-gauge-default: var(--gh-accent-emphasis);
--pwt-gauge-back: #21262d;
--pwt-gauge-warn: var(--gh-attention-fg);
--pwt-gauge-crit: var(--gh-danger-emphasis);
--pwt-chart-primary: var(--gh-accent-emphasis);
--pwt-chart-grid-stroke: var(--gh-border-default);
color-scheme: dark;
}
/* =====================================================
BASE / BODY
===================================================== */
.x-body,
.x-viewport>.x-body,
body.x-border-layout-ct,
div.x-border-layout-ct {
background-color: var(--gh-canvas-default) !important;
color: var(--gh-fg-default) !important;
}
/* =====================================================
LAYOUT CONTAINER RESET (Prevent ExtJS clipping)
v2.1.5: Ported from UniFi theme for consistent border handling
===================================================== */
/* Tool icons - no rounded corners */
.x-tool,
.x-tool-tool-el,
.x-tool-default,
.x-tool-img {
border-radius: 0 !important;
}
/* Form elements - exclude from global radius, apply 6px (GitHub style) */
.x-form-item,
.x-form-item-default,
.x-form-item-body,
.x-form-item-body-default,
.x-form-text-field-body,
.x-form-text-field-body-default,
.x-form-fieldcontainer,
.x-field,
.x-field-default,
.x-form-type-text {
border-radius: 0 !important;
}
/* Reset layout containers that clip elements with overflow:hidden + radius */
.x-box-layout-ct,
.x-panel-bodyWrap,
.x-panel-bodyWrap-default,
.x-autocontainer-innerCt,
.x-autocontainer-outerCt,
.x-panel.x-tabpanel-child,
.x-panel.x-box-item,
.x-box-inner,
.x-box-target,
.x-container,
.x-container-default,
.x-window .x-panel-body,
.x-window .x-window-body,
.x-window .x-window-bodyWrap {
border-radius: 0 !important;
}
/* Reset everything inside windows to 0 - then re-apply specific radii */
.x-window *,
.x-window .x-autocontainer-innerCt,
.x-window .x-autocontainer-outerCt,
.x-window .x-form-layout-wrap,
.x-window .x-form-layout-auto-label,
.x-window .x-form-layout-colgroup,
.x-window .x-form-layout-column,
.x-window .x-field,
.x-window .x-form-item,
.x-window .x-form-item-body {
border-radius: 0 !important;
}
/* v2.2.0: Dialog form content padding - vertical only (horizontal causes ExtJS layout overflow).
Root cause: ExtJS uses offsetWidth for layout → CSS horizontal padding shifts form items
rightward but doesn't narrow their computed width, causing trigger wraps to overflow 16px past
the column boundary where the adjacent column's opaque background covers them. */
.x-window .x-tabpanel-child .x-autocontainer-innerCt {
padding: 12px 0 !important;
}
/* v2.2.17: Allow column panel bodies to show overflowed form content (e.g. trigger wraps).
overflow:visible prevents the panel's own clipping from hiding elements that extend
slightly past the panel boundary during ExtJS layout calculation. */
.x-window .x-panel-body:not(.x-scroller) {
overflow: visible !important;
}
/* v2.2.17: 4px side padding on column panel bodies for visual breathing room.
ExtJS reads getPaddingInfo() on panel-body when sizing child form items, so this
correctly reduces item widths by 8px total without causing any overflow. */
.x-window .x-panel.x-box-item .x-panel-body {
padding: 0 4px !important;
}
/* Re-apply button styling inside windows (6px) */
.x-window .x-btn {
border-radius: var(--gh-radius-md) !important;
}
/* Re-apply checkbox styling inside windows */
.x-window .x-form-checkbox {
border-radius: var(--gh-radius-sm) !important;
}
/* Re-apply form inputs inside windows (4px with split corners - UniFi style) */
.x-window .x-form-trigger-wrap,
.x-window .x-form-trigger-wrap-default {
border-radius: var(--gh-radius-sm) !important;
}
.x-window .x-form-text-wrap,
.x-window .x-form-text {
border-radius: var(--gh-radius-sm) 0 0 var(--gh-radius-sm) !important;
}
.x-window .x-form-arrow-trigger {
border-radius: 0 var(--gh-radius-sm) var(--gh-radius-sm) 0 !important;
}
/* Form trigger/text wrap - reset and re-apply */
.x-form-trigger-wrap,
.x-form-trigger-wrap *,
.x-form-text-wrap,
.x-form-text-wrap *,
.x-form-text,
.x-form-trigger {
border-radius: 0 !important;
}
.x-form-trigger-wrap,
.x-form-trigger-wrap-default {
border-radius: var(--gh-radius-sm) !important;
overflow: hidden !important;
}
.x-form-text-wrap,
.x-form-text-wrap-default {
border-radius: var(--gh-radius-sm) 0 0 var(--gh-radius-sm) !important;
}
.x-form-text,
.x-form-text-default {
border-radius: var(--gh-radius-sm) 0 0 var(--gh-radius-sm) !important;
}
.x-form-trigger,
.x-form-trigger-default,
.x-form-arrow-trigger,
.x-form-arrow-trigger-default {
border-radius: 0 var(--gh-radius-sm) var(--gh-radius-sm) 0 !important;
}
/* Legend items - no rounded corners */
.x-legend-container,
.x-legend-horizontal .x-legend-item,
.x-legend-item {
border-radius: 0 !important;
}
/* Legend color marker (dot) - keep circular */
.x-legend-item-marker {
border-radius: 50% !important;
}
/* Boundlist - prevent clipping (applied to parent) */
.x-boundlist {
border-radius: var(--gh-radius-lg) !important;
overflow: hidden !important;
}
/* Chart canvas - no rounded corners on data area */
.x-chart-grid,
.x-chart-axis,
canvas.x-surface,
.x-chart canvas {
border-radius: 0 !important;
}
/* Constrain autocontainer width inside windows */
.x-window .x-autocontainer-outerCt {
max-width: 100% !important;
}
/* Fix window header/body width consistency */
.x-window > .x-window-header,
.x-window > .x-window-body,
.x-window > .x-window-bodyWrap,
.x-window-bodyWrap > .x-window-body {
width: 100% !important;
}
.x-window-header > .x-box-inner,
.x-window-header > .x-box-inner > .x-box-target {
width: 100% !important;
}
.x-window-header-title {
width: auto !important;
flex: 1 !important;
max-width: calc(100% - 30px) !important;
}
/* =====================================================
MASKS & OVERLAYS
===================================================== */
.x-mask {
background-color: rgba(1, 4, 9, 0.5) !important;
}
.x-tool .x-mask {
backdrop-filter: blur(4px);
background-color: var(--gh-canvas-muted);
opacity: 0.6;
}
.x-css-shadow {
box-shadow: 0 8px 24px rgba(1, 4, 9, 0.5) !important;
}
/* =====================================================
ICONS - Using Proxmox default colors for dark mode
v2.1.1: Restored PVE base color scheme
===================================================== */
/* General icon colors - visible gray for dark backgrounds */
.x-tree-icon-custom,
.x-grid-icon-custom,
.fa-tags::before,
.fa-file-o::before,
.fa-building::before,
.x-action-col-icon::before,
.fa-shield::before,
.fa-file-text-o::before,
.fa-clock-o::before,
.x-tab-icon-el-default,
.pve-icon-verify-lettering::after,
.x-tree-icon-leaf:not(.x-tree-icon-custom)::before,
.x-tree-icon-parent:not(.x-tree-icon-custom)::before,
.x-tree-icon-parent-expanded:not(.x-tree-icon-custom)::before,
.x-grid-filters-filtered-column .x-column-header-text::after {
color: #aaaaaa !important;
}
/* Folder icons - invert for dark mode */
.x-tree-icon-parent:not(.x-tree-icon-custom)::before,
.x-tree-icon-parent-expanded:not(.x-tree-icon-custom)::before {
filter: invert(90%);
}
/* Various image-based icons - invert for visibility */
.fa-ceph::before,
.fa-sdn::before,
.fa-network-wired::before,
.pve-itype-treelist-item-icon-cdrom,
.fa-chevron-right::before,
.x-grid-row-console,
.x-box-scroller-toolbar-default.x-box-scroller,
.x-tree-elbow-img,
.pve-itype-icon-qemu,
.x-tree-node-computer,
.x-grid-tree-node-expanded .x-tree-node-computer,
.pbs-icon-tape,
.pbs-icon-tape-drive,
.x-tree-icon-leaf:not(.x-tree-icon-custom),
.x-tree-icon-parent:not(.x-tree-icon-custom),
.x-tree-icon-parent-expanded:not(.x-tree-icon-custom) {
filter: invert(90%);
}
/* Hardware icons */
.pve-itype-icon-cpu,
.pve-itype-icon-cdrom,
.pve-itype-icon-memory,
.pve-itype-icon-pci,
.pve-itype-icon-serial,
.pve-itype-icon-die,
.pmx-itype-icon-processor,
.pmx-itype-icon-memory,
.pve-itype-icon-storage,
.x-tree-node-harddisk,
.x-grid-tree-node-expanded .x-tree-node-harddisk {
filter: invert(100%);
}
/* Hardware icons — counter-invert for non-SVG icon cells */
td.pve-itype-icon-storage .x-grid-cell-inner,
td.x-tree-node-harddisk .x-grid-cell-inner {
filter: invert(100%) !important;
}
/* Hardware icons — hide inverted borders for non-SVG icon cells */
td.pve-itype-icon-storage,
td.x-tree-node-harddisk {
border-color: transparent !important;
}
/* Hardware grid icons — mask-image renders SVG icons in theme text color
Replaces filter:invert approach for pve-itype-icon-* and pmx-itype-icon-* grid cells */
td.pve-itype-icon-cpu,
td.pve-itype-icon-cdrom,
td.pve-itype-icon-memory,
td.pve-itype-icon-pci,
td.pve-itype-icon-serial,
td.pve-itype-icon-die,
td.pmx-itype-icon-processor,
td.pmx-itype-icon-memory {
filter: none !important;
background-image: none !important;
padding-left: 0 !important;
border-color: transparent !important;
}
td.pve-itype-icon-cpu .x-grid-cell-inner,
td.pve-itype-icon-cdrom .x-grid-cell-inner,
td.pve-itype-icon-memory .x-grid-cell-inner,
td.pve-itype-icon-pci .x-grid-cell-inner,
td.pve-itype-icon-serial .x-grid-cell-inner,
td.pve-itype-icon-die .x-grid-cell-inner,
td.pmx-itype-icon-processor .x-grid-cell-inner,
td.pmx-itype-icon-memory .x-grid-cell-inner {
padding-left: 3px !important;
}
td.pve-itype-icon-cpu .x-grid-cell-inner::before,
td.pve-itype-icon-cdrom .x-grid-cell-inner::before,
td.pve-itype-icon-memory .x-grid-cell-inner::before,
td.pve-itype-icon-pci .x-grid-cell-inner::before,
td.pve-itype-icon-serial .x-grid-cell-inner::before,
td.pve-itype-icon-die .x-grid-cell-inner::before,
td.pmx-itype-icon-processor .x-grid-cell-inner::before,
td.pmx-itype-icon-memory .x-grid-cell-inner::before {
content: '' !important;
display: inline-block !important;
width: 18px !important;
height: 14px !important;
vertical-align: middle !important;
margin-right: 10px !important;
background-color: currentColor !important;
-webkit-mask-size: contain !important;
mask-size: contain !important;
-webkit-mask-repeat: no-repeat !important;
mask-repeat: no-repeat !important;
-webkit-mask-position: center !important;
mask-position: center !important;
}
td.pve-itype-icon-cpu .x-grid-cell-inner::before {
-webkit-mask-image: url('/pve2/images/icon-cpu.svg') !important;
mask-image: url('/pve2/images/icon-cpu.svg') !important;
}
td.pve-itype-icon-memory .x-grid-cell-inner::before {
-webkit-mask-image: url('/pve2/images/icon-memory.svg') !important;
mask-image: url('/pve2/images/icon-memory.svg') !important;
}
td.pve-itype-icon-cdrom .x-grid-cell-inner::before {
-webkit-mask-image: url('/pve2/images/icon-cd-drive.svg') !important;
mask-image: url('/pve2/images/icon-cd-drive.svg') !important;
}
td.pve-itype-icon-pci .x-grid-cell-inner::before {
-webkit-mask-image: url('/pve2/images/icon-pci.svg') !important;
mask-image: url('/pve2/images/icon-pci.svg') !important;
}
td.pve-itype-icon-serial .x-grid-cell-inner::before {
-webkit-mask-image: url('/pve2/images/icon-serial.svg') !important;
mask-image: url('/pve2/images/icon-serial.svg') !important;
}
td.pve-itype-icon-die .x-grid-cell-inner::before {
-webkit-mask-image: url('/pve2/images/icon-die.svg') !important;
mask-image: url('/pve2/images/icon-die.svg') !important;
}
td.pmx-itype-icon-processor .x-grid-cell-inner::before {
-webkit-mask-image: url('../images/icon-cpu.svg') !important;
mask-image: url('../images/icon-cpu.svg') !important;
}
td.pmx-itype-icon-memory .x-grid-cell-inner::before {
-webkit-mask-image: url('../images/icon-ram.svg') !important;
mask-image: url('../images/icon-ram.svg') !important;
}
/* Icon overlays - default styling */
.x-tree-icon-custom::after,
.x-grid-icon-custom::after {
color: #aaaaaa !important;
text-shadow: -1px 0 1px rgba(0, 0, 0, 0.5);
}
/* RUNNING VMs/CTs - Green status indicator (PVE default) */
.x-tree-icon-custom.running::after,
.x-grid-icon-custom.running::after,
.x-treelist-item-icon.running::after {
color: rgb(33, 191, 75) !important;
text-shadow: -1px 0 1px rgba(0, 0, 0, 0.5);
}
/* ONLINE state - Green */
.x-tree-icon-custom.online::after,
.x-grid-icon-custom.online::after {
color: rgb(33, 191, 75) !important;
text-shadow: -1px 0 1px rgba(0, 0, 0, 0.5);
}
/* Stopped/offline - Muted gray */
.x-tree-icon-custom.stopped,
.x-tree-icon-custom.offline,
.x-grid-icon-custom.stopped,
.x-grid-icon-custom.offline {
color: #888888 !important;
}
/* Unknown state - Gray */
.x-tree-icon-custom.unknown::after,
.x-grid-icon-custom.unknown::after {
color: #888888 !important;
}
/* ERROR states - Red (PVE default) */
.x-tree-icon-custom.error::after,
.x-tree-icon-custom.offline::after,
.x-tree-icon-custom.ha-error::after,
.x-grid-icon-custom.error::after,
.x-grid-icon-custom.offline::after,
.x-grid-icon-custom.ha-error::after {
color: rgb(204, 24, 0) !important;
text-shadow: -1px 0 1px rgba(0, 0, 0, 0.5);
}
/* PAUSED/SUSPENDED - Amber (PVE default) */
.x-tree-icon-custom.paused::after,
.x-tree-icon-custom.suspended::after,
.x-tree-icon-custom.lock-suspending::after,
.x-grid-icon-custom.paused::after,
.x-grid-icon-custom.suspended::after,
.x-grid-icon-custom.lock-suspending::after {
color: rgb(204, 142, 0) !important;
text-shadow: -1px 0 1px rgba(0, 0, 0, 0.5);
}
/* PENDING/WARNING states - Yellow (PVE default) */
.x-tree-icon-custom.pending::after,
.x-tree-icon-custom.io-error::after,
.x-tree-icon-custom.internal-error::after,
.x-tree-icon-custom.guest-panicked::after,
.x-grid-icon-custom.pending::after,
.x-grid-icon-custom.io-error::after,
.x-grid-icon-custom.internal-error::after,
.x-grid-icon-custom.guest-panicked::after {
color: rgb(255, 204, 0) !important;
text-shadow: -1px 0 1px rgba(0, 0, 0, 0.5);
}
/* HA MAINTENANCE - Blue (PVE default) */
.x-tree-icon-custom.ha-maintenance::after,
.x-grid-icon-custom.ha-maintenance::after {
color: rgb(56, 146, 212) !important;
text-shadow: -1px 0 1px rgba(0, 0, 0, 0.5);
}
/* Locked icons */
.x-tree-icon-custom.locked::after,
.x-tree-icon-custom.lock-backup::after,
.x-tree-icon-custom.lock-migrate::after,
.x-tree-icon-custom.lock-suspended::after,
.x-grid-icon-custom.locked::after,
.x-grid-icon-custom.lock-backup::after,
.x-grid-icon-custom.lock-migrate::after,
.x-grid-icon-custom.lock-suspended::after {
color: #aaaaaa !important;
}
/* LXC/QEMU type indicators */
.x-tree-icon-custom.lxc::after,
.x-tree-icon-custom.qemu::after,
.x-grid-icon-custom.lxc::after,
.x-grid-icon-custom.qemu::after {
background-color: transparent;
color: #888888 !important;
}
.x-treelist-item-icon.lxc::after,
.x-treelist-item-icon.qemu::after {
background-color: transparent;
color: #888888 !important;
}
/* Tree expander arrows */
.x-tree-arrows .x-tree-expander {
filter: brightness(200%);
}
/* v2.2.18: cancel old sprite-inversion; custom CSS controls handle appearance now */
.x-form-checkbox-default,
.x-form-radio-default,
.x-column-header-checkbox .x-column-header-checkbox::after,
.x-grid-checkcolumn::after,
.x-menu-item-checked .x-menu-item-icon-default.x-menu-item-checkbox,
.x-menu-item-unchecked .x-menu-item-icon-default.x-menu-item-checkbox {
filter: none !important;
}
/* =====================================================
PANELS - UniFi base radius (8px)
===================================================== */
.x-panel,
.x-panel-default {
border-radius: var(--gh-radius-lg) !important;
padding: 0 !important;
}
/* Column panels — native stacked layout (Issue #23 fix) */
.x-panel.x-column {
padding: 5px !important;
margin: 0 !important;
max-width: none !important;
box-sizing: border-box !important;
}
/* Column panel card styling — borders for summary + chart panels */
.x-panel.x-panel-default.x-column {
border: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-lg) !important;
overflow: hidden !important;
}
/* v2.2.1: Guest status panel and Notes panel borders */
[id^="pveGuestStatusView-"].x-panel,
[id^="pveLxcStatusView-"].x-panel,
[id^="pveQemuStatusView-"].x-panel,
[id^="pmxNotesView-"].x-panel {
border: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-lg) !important;
}
.x-panel-body,
.x-panel-body-default {
background-color: var(--gh-canvas-default) !important;
color: var(--gh-fg-default) !important;
border: none !important;
}
/* Panel headers - only bottom border, flush with edges */
.x-panel-header,
.x-panel-header-default {
background-color: var(--gh-canvas-muted) !important;
border: none !important;
border-bottom: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-lg) var(--gh-radius-lg) 0 0 !important;
margin: 0 !important;
padding: 8px 12px !important;
width: 100% !important;
box-sizing: border-box !important;
overflow: visible !important;
}
/* Title text — prevent border-radius clipping */
.x-title-text,
.x-title-text-default {
overflow: visible !important;
}
.x-panel-bodyWrap,
.x-panel-bodyWrap-default {
margin: 0 !important;
padding: 0 !important;
}
/* Remove borders from nested panels (like gauge widgets inside Resources) */
.x-panel-body>.x-box-layout-ct,
.x-panel-body>.x-container,
.x-panel-body>.x-box-inner,
[id*="pmxGauge"] {
border: none !important;
}
.x-panel-header-title-default,
.x-window-header-title-default {
color: var(--gh-fg-default) !important;
}
.x-panel-header-default .x-tool-tool-el {
background-color: transparent;
}
.x-tool-img {
filter: brightness(175%);
}
.x-tool-over .x-tool-img {
filter: brightness(200%);
}
div[id^="pveResourceTree-"][id$="-body"] {
border-color: var(--gh-canvas-default) !important;
}
/* Resource tree: remove row separators/borders */
[id^="pveResourceTree-"].x-tree-panel td.x-grid-cell,
[id^="pveResourceTree-"].x-tree-panel .x-grid-td,
[id^="pveResourceTree-"].x-tree-panel .x-grid-cell {
border-bottom: none !important;
}
/* Resource tree: slightly increased row spacing */
div[id^="pveResourceTree"] .x-grid-cell {
padding-top: 3px !important;
padding-bottom: 3px !important;
}
.x-panel-bodyWrap {
overflow: visible !important;
}
/* =====================================================
SPLITTERS / SEPARATORS
v2.1.1: Fixed double border issue
===================================================== */
.x-splitter-vertical {
background-color: transparent !important;
border-left: 1px solid var(--gh-border-default) !important;
border-right: none !important;
width: 1px !important;
}
.x-splitter-horizontal {
background-color: var(--gh-canvas-inset) !important;
border-top: 1px solid var(--gh-border-default) !important;
}
/* Toolbox tree (pve-nav) right border - full height */
/* Fix: border must be on .pve-toolbar-bg (the full-height docked toolbar),
not on .x-treelist which only stretches to cover its items.
z-index: 3 needed because content toolbar (z-index: 2, same as nav) renders
on top (later in DOM), covering the nav right border. */
.pve-toolbar-bg {
border-right: 1px solid var(--gh-border-default) !important;
z-index: 3 !important;
}
.x-treelist.x-treelist-pve-nav {
border-right: none !important;
}
/* =====================================================
TOOLBARS
===================================================== */
.x-toolbar,
.x-toolbar-default {
background-color: var(--gh-canvas-default) !important;
border-color: var(--gh-border-default) !important;
}
.x-toolbar-default.x-docked-top {
border: none !important;
border-bottom: 1px solid var(--gh-border-default) !important;
}
.x-toolbar-default .x-toolbar-separator {
border-color: var(--gh-border-default);
}
.x-toolbar-text-default {
color: var(--gh-fg-muted);
}
/* =====================================================
PRIMARY BUTTONS - GitHub Green (6px radius)
===================================================== */
.x-btn-default-small {
background-color: var(--gh-success-emphasis) !important;
border: 1px solid rgba(255, 255, 255, 0.15) !important;
border-radius: var(--gh-radius-md) !important;
}
.x-btn-default-small .x-btn-inner {
color: var(--gh-fg-on-emphasis) !important;
}
.x-btn-default-small.x-btn-over,
.x-keyboard-mode .x-btn-default-small.x-btn-focus {
background-color: var(--gh-success-hover) !important;
}
.x-btn-default-small.x-btn.x-btn-disabled {
background-color: var(--gh-success-emphasis) !important;
opacity: 0.5;
}
.x-btn-default-small.x-btn.x-btn-pressed {
background-color: var(--gh-success-active) !important;
}
/* =====================================================
SECONDARY/TOOLBAR BUTTONS (4px radius)
===================================================== */
.x-btn-default-toolbar-small {
background-color: #21262d !important;
border: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-md) !important;
}
.x-btn-default-toolbar-small .x-btn-inner-default-toolbar-small,
.x-btn-default-toolbar-small .x-btn-icon-el-default-toolbar-small {
color: #f0f6fc !important; /* GitHub Primer default button text color */
}
.x-btn-default-toolbar-small .x-btn-wrap-default-toolbar-small.x-btn-arrow-right::after,
.x-btn-default-toolbar-small .x-btn-wrap-default-toolbar-small.x-btn-split-right::after {
filter: brightness(150%);
}
.x-btn-default-toolbar-small.x-btn-over,
.x-keyboard-mode .x-btn-default-toolbar-small.x-btn-focus {
background-color: #262c36 !important;
border-color: var(--gh-border-default) !important;
}
.x-btn-default-toolbar-small.x-btn.x-btn-disabled {
background-color: #21262d !important;
opacity: 0.5;
}
.x-btn-default-toolbar-small.x-btn.x-btn-menu-active,
.x-btn-default-toolbar-small.x-btn.x-btn-pressed {
background-color: var(--gh-accent-emphasis) !important;
border-color: var(--gh-accent-emphasis) !important;
padding: 4px 8px !important; /* Fix #30: prevent width change on dropdown */
}
.x-btn-default-toolbar-small.x-btn.x-btn-pressed .x-btn-inner-default-toolbar-small,
.x-btn-default-toolbar-small.x-btn.x-btn-pressed .x-btn-icon-el-default-toolbar-small {
color: var(--gh-fg-on-emphasis) !important;
}
/* =====================================================
FORM ELEMENTS (4px radius)
===================================================== */
.x-form-trigger-default {
background-color: #21262d !important;
}
.x-form-text-default {
background-color: #21262d !important;
color: var(--gh-fg-default) !important;
border-radius: var(--gh-radius-sm) !important;
}
.x-form-trigger-wrap,
.x-form-trigger-wrap-default {
border-color: var(--gh-border-default) !important;
background-color: #21262d !important;
border-radius: var(--gh-radius-sm) !important;
}
.x-form-trigger-wrap-default.x-form-trigger-wrap-focus {
border-color: var(--gh-accent-emphasis) !important;
box-shadow: 0 0 0 3px var(--gh-accent-subtle) !important;
}
.x-form-item-label-default,
.x-form-cb-label-default {
color: var(--gh-fg-default) !important;
}
.x-form-display-field-default {
color: var(--gh-fg-muted) !important;
}
.x-form-spinner-default {
background-color: #21262d !important;
}
.x-fieldset,
.x-fieldset-default {
border-color: var(--gh-border-default) !important;
border-radius: var(--gh-radius-lg) !important;
}
.x-fieldset-header-default>.x-fieldset-header-text {
color: var(--gh-fg-default) !important;
}
/* =====================================================
BOUNDLIST / DROPDOWNS (4px radius)
===================================================== */
.x-boundlist {
background-color: var(--gh-canvas-muted) !important;
border: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-lg) !important;
box-shadow: 0 8px 24px rgba(1, 4, 9, 0.5);
overflow: hidden !important;
}
.x-boundlist-item {
background-color: transparent !important;
color: var(--gh-fg-default) !important;
}
.x-boundlist-selected {
background-color: var(--gh-accent-subtle) !important;
}
.x-boundlist-item-over {
background-color: var(--gh-hover-overlay) !important;
}
/* =====================================================
GRIDS / TABLES (square corners)
===================================================== */
.x-grid,
.x-grid-view {
border-radius: 0 !important;
}
.x-column-header {
border-color: var(--gh-border-default) !important;
background-color: transparent !important;
}
.x-column-header-inner,
.x-column-header-text {
color: var(--gh-fg-default) !important;
font-weight: 600 !important;
}
.x-column-header-trigger {
border-color: var(--gh-border-muted) !important;
}
.x-grid-item,
.x-column-header-default,
.x-grid-cell-row-numberer {
color: var(--gh-fg-default) !important;
background-color: var(--gh-canvas-default) !important;
}
.x-grid-cell-special {
border-color: var(--gh-border-default) !important;
}
.x-grid-group-hd {
background-color: var(--gh-canvas-default) !important;
border-color: var(--gh-border-default) !important;
}
.x-grid-group-title {
color: var(--gh-fg-default) !important;
}
.x-grid-header-ct {
background-color: var(--gh-canvas-muted) !important;
border: 1px solid var(--gh-border-muted) !important;
border-radius: var(--gh-radius-lg) var(--gh-radius-lg) 0 0 !important;
}
.x-grid-item-alt {
background-color: #0b0f14 !important; /* Slightly darker than canvas-default */
}
.x-grid-with-row-lines .x-grid-item {
border-color: var(--gh-border-muted) !important;
}
.x-grid-cell {
border-bottom: 1px solid var(--gh-border-subtle) !important;
}
.x-grid-item-over,
.x-grid-with-row-lines .x-grid-item.x-grid-item-over {
background-color: var(--gh-hover-overlay) !important;
}
.x-grid-item-selected,
.x-grid-with-row-lines .x-grid-item.x-grid-item-selected {
background-color: var(--gh-accent-subtle) !important;
}
.x-column-header-over,
.x-column-header-open {
background-color: var(--gh-hover-overlay) !important;
}
.x-column-header-sort-ASC,
.x-column-header-sort-DESC {
background-color: #1b384c !important;
}
.x-grid-row-summary .x-grid-cell,
.x-grid-row-summary .x-grid-rowwrap,
.x-grid-row-summary .x-grid-cell-rowbody {
background-color: var(--gh-canvas-default) !important;
border-color: var(--gh-border-default);
}
.x-grid-with-col-lines .x-grid-cell,
.x-grid-with-col-lines .x-grid-item-over .x-grid-cell,
.x-grid-with-col-lines .x-grid-item-selected .x-grid-cell {
border-color: var(--gh-border-default) !important;
}
.x-dd-drag-proxy {
background-color: var(--gh-canvas-muted);
border-color: var(--gh-border-default);
color: var(--gh-fg-default);
}
.x-keyboard-mode .x-grid-item-focused {
background-color: var(--gh-hover-overlay) !important;
color: var(--gh-fg-on-emphasis) !important;
}
/* v2.2.1: Remove blue outline from selected/focused items in resource tree */
.x-keyboard-mode .x-grid-item-focused .x-grid-cell-inner::before,
.x-keyboard-mode .x-grid-item-selected .x-grid-cell-inner::before,
.x-grid-item-selected .x-grid-cell-inner::before,
.x-grid-item-focused .x-grid-cell-inner::before,
[id^="pveResourceTree"] .x-grid-item-selected .x-grid-cell-inner::before,
[id^="pveResourceTree"] .x-grid-item-focused .x-grid-cell-inner::before {
content: none !important;
display: none !important;
border: none !important;
}
.x-grid-empty {
background-color: var(--gh-canvas-default) !important;
color: var(--gh-fg-muted) !important;
}
/* =====================================================
/* =====================================================
MENUS (variable radius)
===================================================== */
.x-menu,
.x-menu-default {
border: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-lg) !important;
box-shadow: 0 8px 24px rgba(1, 4, 9, 0.5) !important;
overflow: hidden !important;
}
.x-menu-body-default {
background-color: var(--gh-canvas-muted) !important;
}
.x-menu-header {
background-color: var(--gh-accent-emphasis) !important;
}
/* Menu Layout Fix (Flexbox reordering) */
.x-menu-item-default > .x-menu-item-link {
display: flex !important;
align-items: center !important;
flex-direction: row !important;
padding: 6px 8px !important;
line-height: 20px !important;
text-decoration: none !important;
}
.x-menu-item-text-default {
color: var(--gh-fg-default) !important;
font-size: 14px !important;
margin-left: 0 !important;
}
.x-menu-item-icon-default {
color: var(--gh-fg-muted) !important;
order: -1 !important; /* Move icon to start */
position: relative !important;
float: none !important;
margin-right: 8px !important;
margin-left: 0 !important;
left: auto !important;
top: auto !important;
width: 16px !important;
text-align: center !important;
}
/* Remove the gutter/separator line */
.x-menu-icon-separator-default {
display: none !important;
}
.x-menu-item-default.x-menu-item-separator {
background-color: var(--gh-canvas-muted);
border-color: var(--gh-border-default);
margin: 4px 0 !important;
}
.x-menu-item-default.x-menu-item-focus,
.x-menu-item-default.x-menu-item-active {
background-color: var(--gh-accent-emphasis) !important;
color: var(--gh-fg-on-emphasis) !important;
}
.x-menu-item-active .x-menu-item-text-default,
.x-menu-item-focus .x-menu-item-text-default,
.x-menu-item-active .x-menu-item-icon-default,
.x-menu-item-focus .x-menu-item-icon-default {
color: var(--gh-fg-on-emphasis) !important;
}
/* =====================================================
PROGRESS BARS (5px radius)
===================================================== */
.x-progress,
.x-progress-default {
background-color: #21262d !important;
border-radius: var(--gh-radius-md) !important;
}
.x-progress-default .x-progress-bar-default {
background-color: var(--gh-accent-emphasis) !important;
border-radius: var(--gh-radius-md) !important;
}
.x-progress-default .x-progress-text {
color: var(--gh-fg-default) !important;
}
.x-progress.warning .x-progress-bar {
background-color: var(--pwt-gauge-warn) !important;
}
.x-progress.critical .x-progress-bar {
background-color: var(--pwt-gauge-crit) !important;
}
/* =====================================================
SPLITTERS
===================================================== */
.x-splitter {
background-color: var(--gh-canvas-inset) !important;
}
.x-splitter-horizontal {
background-color: var(--gh-canvas-inset) !important;
border-top: 1px solid var(--gh-border-default) !important;
}
.x-keyboard-mode .x-splitter-focus::after {
border-color: var(--gh-accent-emphasis) !important;
}
.x-layout-split-bottom {
opacity: 0.7;
}
/* =====================================================
TABS — GitHub UnderlineNav style (v2.2.21)
Flat tabs, coral ::after underline on active tab.
Uses ::after (not border-bottom — ExtJS overrides it).
===================================================== */
.x-tab-bar,
.x-tab-bar-default {
background-color: var(--gh-canvas-default) !important;
border-radius: 0 !important;
border-bottom: 1px solid #21262d !important;
padding-bottom: 0 !important;
}
/* v2.2.23: overflow visible on ALL containers within tab bar to prevent clipping */
.x-tab-bar .x-box-inner,
.x-tab-bar .x-box-target,
.x-tab-bar-body,
.x-tab-bar-body-default {
overflow: visible !important;
}
/* Base tab — no margin-bottom hack, position relative, no outlines */
.x-tab,
.x-tab-default,
.x-tab-default-top {
background-color: transparent !important;
border: none !important;
border-radius: 0 !important;
padding: 8px 16px 8px !important;
overflow: visible !important;
margin-bottom: 0 !important;
transition: color .12s ease !important;
outline: none !important;
box-shadow: none !important;
}
/* Remove ::after from inactive tabs */
.x-tab::after {
display: none !important;
}
.x-tab-inner-default {
color: #848d97 !important;
font-size: 13px !important;
}
.x-tab-default.x-tab-over {
background-color: transparent !important;
}
.x-tab-default.x-tab-over .x-tab-inner-default {
color: #e6edf3 !important;
}
/* Active tab */
.x-tab-default.x-tab.x-tab-active {
background-color: transparent !important;
border: none !important;
overflow: visible !important;
margin-bottom: 0 !important;
outline: none !important;
box-shadow: none !important;
}
/* v2.2.23: coral underline INSIDE the tab at bottom:0 — immune to parent clipping */
.x-tab-default.x-tab.x-tab-active::after {
content: '' !important;
display: block !important;
position: absolute !important;
bottom: 0 !important;
left: 0 !important;
right: 0 !important;
height: 2px !important;
background: #f47067 !important;
z-index: 10 !important;
border-radius: 0 !important;
pointer-events: none !important;
}
.x-tab-active .x-tab-inner-default {
color: #e6edf3 !important;
font-weight: 600 !important;
}
.x-tab-default.x-tab.x-tab-disabled {
background-color: transparent !important;
border: none !important;
color: var(--gh-fg-subtle) !important;
margin-bottom: 0 !important;
}
/* Keyboard mode focus: keep the same indicator, no outline */
.x-keyboard-mode .x-tab-default.x-tab-focus,
.x-keyboard-mode .x-tab-default.x-tab-focus.x-tab-active {
background-color: transparent !important;
border: none !important;
outline: none !important;
box-shadow: none !important;
margin-bottom: 0 !important;
}
.x-keyboard-mode .x-tab-default.x-tab-focus.x-tab-active::after {
content: '' !important;
display: block !important;
position: absolute !important;
bottom: 0 !important;
left: 0 !important;
right: 0 !important;
height: 2px !important;
background: #f47067 !important;
z-index: 10 !important;
pointer-events: none !important;
}
/* Kill ALL interaction outlines/shadows — every possible state */
.x-tab:focus,
.x-tab *:focus,
.x-tab-focus,
.x-tab-active.x-tab-focus,
.x-tab-inner-focus,
.x-tab-button-focus,
.x-tab-pressed,
.x-tab-active.x-tab-pressed,
.x-tab-over,
.x-tab:active,
.x-tab *:active {
outline: none !important;
box-shadow: none !important;
}
.x-tabpanel-child {
border-radius: 0 0 var(--gh-radius-lg) var(--gh-radius-lg) !important;
}
/* =====================================================
TOOLTIPS (6px radius)
===================================================== */
.x-tip,
.x-tip-default {
background-color: var(--gh-canvas-muted) !important;
border: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-md) !important;
box-shadow: 0 4px 12px rgba(1, 4, 9, 0.4);
}
.x-tip-body-default {
color: var(--gh-fg-default) !important;
}
.x-tip-form-invalid {
background-color: var(--gh-canvas-muted) !important;
border-color: var(--gh-danger-emphasis) !important;
}
.x-tip-body-form-invalid {
color: var(--gh-danger-fg) !important;
}
/* =====================================================
TREE NAVIGATION (4px radius)
===================================================== */
.x-treelist-item {
background-color: var(--gh-canvas-default) !important;
border-radius: var(--gh-radius-md) !important;
}
/* v2.2.4: Pseudo-element approach for balanced hover/selected highlighting */
.x-treelist-row {
border-radius: var(--gh-radius-md) !important;
background-color: transparent !important;
position: relative !important;
z-index: 0 !important;
}
.x-treelist-row::before {
content: "";
position: absolute;
top: 1px;
bottom: 1px;
left: 0;
right: 4px;
border-radius: var(--gh-radius-md);
background-color: transparent;
z-index: -1;
pointer-events: none;
}
/* v2.1.4: Fix toolbox tree item text overlapping icons (icon is 24px absolute positioned) */
.x-treelist-item-text {
margin-left: 28px !important;
}
/* Toolbox tree items - increased visibility */
.x-treelist-item-text,
.x-treelist-item-icon,
.x-treelist.x-treelist-pve-nav .x-treelist-item-text,
.x-treelist.x-treelist-pve-nav .x-treelist-item-icon {
color: #b1bac4 !important; /* Brighter than --gh-fg-muted */
}
/* Hover state - apply to pseudo-element */
.x-treelist-row-over {
background-color: transparent !important;
}
.x-treelist-row-over::before {
background-color: var(--gh-hover-overlay) !important;
}
.x-treelist-row-over .x-treelist-item-icon,
.x-treelist-row-over .x-treelist-item-text {
background-color: transparent !important;
color: var(--gh-fg-default) !important;
}
/* Toolbox tree - selected/active item uses GitHub green (pseudo-element) */
.x-treelist-item-selected>.x-treelist-row {
background-color: transparent !important;
}
.x-treelist-item-selected>.x-treelist-row::before,
.x-treelist-item-selected>.x-treelist-row:hover::before {
background-color: var(--gh-success-emphasis) !important;
}
.x-treelist-item-selected .x-treelist-item-text,
.x-treelist-item-selected .x-treelist-item-icon {
color: var(--gh-fg-on-emphasis) !important;
}
.x-treelist-pve-nav {
background-color: var(--gh-canvas-default) !important;
border-color: var(--gh-border-default) !important;
}
/* =====================================================
WINDOWS / MODALS (variable radius)
===================================================== */
.x-window,
.x-window-default {
background-color: var(--gh-canvas-inset) !important;
border: 1px solid var(--gh-border-default) !important;
border-radius: var(--gh-radius-lg) !important;
box-shadow: 0 8px 24px rgba(1, 4, 9, 0.5) !important;
overflow: hidden !important;
}
.x-window .x-window-header,
.x-window-header-default {
background-color: var(--gh-canvas-muted) !important;
border-color: transparent !important;
border-radius: var(--gh-radius-lg) var(--gh-radius-lg) 0 0 !important;
}
.x-window-header-default .x-mask {
background-color: rgba(1, 4, 9, 0.7);
}
.x-window .x-window-body,
.x-window-body-default {
background-color: var(--gh-canvas-default) !important;
border-color: var(--gh-border-default) !important;
color: var(--gh-fg-default) !important;
border-radius: 0 0 var(--gh-radius-lg) var(--gh-radius-lg) !important;
}
.x-window-ghost {
background-color: var(--gh-canvas-default) !important;
}
.x-window-header-default .x-tool-img {
background-color: transparent;
}
.x-message-box .x-window-body {
background-color: var(--gh-canvas-muted) !important;
}
/* =====================================================
LEGEND / CHARTS
===================================================== */
.x-legend-container {
background-color: var(--gh-canvas-default) !important;
}
.x-legend-horizontal .x-legend-item {
background-color: var(--gh-canvas-muted) !important;
color: var(--gh-fg-default) !important;
border: 1px solid var(--gh-border-muted) !important;
}
/* =====================================================
PROXMOX-SPECIFIC
===================================================== */
img[id^="proxmoxlogo-"][id$="-img"],
img[id^="proxmoxLogoSvg-"][id$="-img"] {
filter: invert(1) hue-rotate(180deg);
}
.proxmox-invalid-row {
background-color: #521414 !important;
}
.proxmox-warning-row {
background-color: #640 !important;
}
.proxmox-disabled-row td {
color: var(--gh-fg-subtle) !important;
}
.pmx-hint {
background-color: #640 !important;
}
.pmx-hint a {
color: var(--gh-accent-fg) !important;
}
.info-blue {
color: var(--gh-accent-fg) !important;
}
.critical {
color: var(--gh-danger-fg) !important;
}
/* Inline buttons (Documentation, Help) - GitHub Primer dark secondary button style */
.proxmox-inline-button {
height: 28px !important;
min-height: 28px !important;
display: flex !important;
align-items: center !important;
padding: 3px 8px !important;
background-color: #21262d !important;
border: 1px solid #3d444d !important;
border-radius: var(--gh-radius-md) !important;
color: #f0f6fc !important;
transition: background 0.08s cubic-bezier(0.33, 1, 0.68, 1) !important;
}
.proxmox-inline-button:hover,
.proxmox-inline-button.x-btn-over {
background-color: #262c36 !important;
border-color: #6e7681 !important;
}
.proxmox-inline-button:active,
.proxmox-inline-button.x-btn-pressed {
background-color: #2a313c !important;
}
.proxmox-inline-button .x-btn-inner,
.proxmox-inline-button .x-btn-icon-el {
color: #f0f6fc !important;
}
/* Loading states */
.x-grid-row-loading,
.x-treelist-item-loading .x-treelist-item-icon,
.x-mask-msg-text,
.x-grid-tree-loading .x-tree-icon {
filter: invert(90%);
}
.x-mask-msg {
background-color: var(--gh-canvas-muted) !important;
border: 1px solid var(--gh-border-default) !important;
}
/* Markdown */
.pmx-md code {
background-color: var(--gh-canvas-muted) !important;
}
.pmx-md pre code {
border-color: var(--gh-border-default) !important;
}
.pmx-md a {
color: var(--gh-accent-fg) !important;
}
/* Tags */
.pve-edit-tag.editable span {
background-color: var(--gh-canvas-muted) !important;
color: var(--gh-fg-default) !important;
border-color: var(--gh-border-default) !important;
}
/* Datepicker */
.x-datepicker,
.x-datepicker-column-header,
.x-monthpicker {
background-color: var(--gh-canvas-default) !important;
color: var(--gh-fg-default) !important;
border-color: transparent !important;
}
.x-datepicker-header,
.x-datepicker-footer,
.x-monthpicker-buttons {
background-color: var(--gh-canvas-inset) !important;
}
.x-datepicker-date,
.x-monthpicker-item-inner {
color: var(--gh-fg-default) !important;
}
.x-datepicker-selected div.x-datepicker-date,
.x-monthpicker-item a.x-monthpicker-selected,
a.x-monthpicker-item-inner:hover,
div.x-datepicker-date:hover {
background-color: var(--gh-hover-overlay) !important;
color: var(--gh-fg-on-emphasis) !important;
}
/* =====================================================
SCROLLBARS - Modern minimal styling
v2.1.1: Reduced width, GitHub Dark colors
===================================================== */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: var(--gh-canvas-default);
border-radius: var(--gh-radius-sm);
}
::-webkit-scrollbar-thumb {
background: var(--gh-border-default);
border-radius: var(--gh-radius-sm);
border: 1px solid transparent;
background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover {
background: var(--gh-border-muted);
}
::-webkit-scrollbar-corner {
background: var(--gh-canvas-default);
}
/* Firefox scrollbar styling */
* {
scrollbar-width: thin;
scrollbar-color: var(--gh-border-default) var(--gh-canvas-default);
}
/* =====================================================
USAGE BARS (Vertical progress indicators)
v2.1.2: Using Proxmox dark theme default #e6e6e6
===================================================== */
.usage {
background-color: #e6e6e6 !important;
}
/* =====================================================
DROPDOWNS - GitHub profile menu styling (dark)
===================================================== */
.x-menu,
.x-menu-default {
background-color: var(--gh-canvas-inset) !important; /* #010409 */
border: 1px solid var(--gh-border-muted) !important; /* #3d444db3 */
border-radius: 6px !important;
box-shadow: 0 8px 24px rgba(1, 4, 9, 0.8) !important;
padding: 4px !important;
}
.x-menu-body-default {
background-color: transparent !important;
padding: 4px !important;
}
.x-menu-header {
background-color: transparent !important;
color: var(--gh-fg-default) !important;
}
.x-menu-item-default > .x-menu-item-link {
display: flex !important;
align-items: center !important;
flex-direction: row !important;
gap: 8px !important;
justify-content: flex-start !important;
flex-wrap: nowrap !important;
min-height: 28px !important;
border-radius: 6px !important;
padding: 6px 8px !important;
line-height: 20px !important;
border: none !important;
cursor: pointer !important;
outline: none !important;
box-shadow: none !important;
white-space: nowrap !important;
}
.x-menu-item-text-default {
color: var(--gh-fg-default) !important;
font-size: 13px !important;
}
.x-menu-item-icon-default {
color: var(--gh-fg-muted) !important;
order: -1 !important;
margin-left: 0 !important;
margin-right: 8px !important;
position: relative !important;
left: 0 !important;
right: auto !important;
text-align: left !important;
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
height: 20px !important;
line-height: 20px !important;
vertical-align: middle !important;
top: 1px !important;
flex: 0 0 16px !important;
width: 16px !important;
align-self: center !important;
float: none !important;
}
.x-menu-item-text-default {
order: 1 !important;
margin-left: 0 !important;
text-align: left !important;
line-height: 20px !important;
display: inline-flex !important;
align-items: center !important;
flex: 1 1 auto !important;
width: auto !important;
white-space: nowrap !important;
}
.x-menu-item-default > .x-menu-item-link > .x-menu-item-icon-default,
.x-menu-item-default > .x-menu-item-link > .x-menu-item-text-default {
width: auto !important;
max-width: none !important;
}
.x-menu-item-arrow,
.x-menu-item-arrow-default {
order: 2 !important;
margin-left: auto !important;
}
.x-menu-item-default.x-menu-item-separator {
background-color: #21262d !important;
border: none !important;
height: 1px !important;
margin: 6px 4px !important;
}
.x-menu-item-default.x-menu-item-focus,
.x-menu-item-default.x-menu-item-active,
.x-menu-item:hover {
background-color: var(--gh-canvas-muted) !important; /* #151b23 */
color: var(--gh-fg-default) !important;
border-radius: 6px !important;
}
.x-menu-item-active .x-menu-item-text-default,
.x-menu-item-focus .x-menu-item-text-default {
color: var(--gh-fg-default) !important;
}
/* Combo dropdowns (selects, boundlists) */
.x-boundlist {
background-color: var(--gh-canvas-inset) !important;
border: 1px solid var(--gh-border-muted) !important;
border-radius: 6px !important;
box-shadow: 0 8px 24px rgba(1, 4, 9, 0.8) !important;
padding: 2px !important;
overflow: hidden !important;
}
.x-boundlist-item {
border-radius: 6px !important;
padding: 2px 6px !important;
line-height: normal !important;
border: none !important;
cursor: pointer !important;
outline: none !important;
box-shadow: none !important;
}
.x-boundlist-item-over {
background-color: var(--gh-canvas-muted) !important; /* #151b23 */
}
.x-boundlist-selected {
background-color: var(--gh-selectmenu-active) !important; /* #0c2d6b */
color: var(--gh-fg-on-emphasis) !important;
}
/* Floating grid pickers (storage/ISO selectors) */
.x-layer.x-grid .x-grid-view,
.x-panel.x-layer.x-grid .x-grid-view,
.x-panel.x-layer.x-grid,
.x-layer.x-panel.x-grid {
border-radius: 6px !important;
}
.x-layer.x-grid .x-grid-item-over,
.x-layer.x-grid .x-grid-item-selected,
.x-panel.x-layer.x-grid .x-grid-item-over,
.x-panel.x-layer.x-grid .x-grid-item-selected {
border-radius: 6px !important;
outline: none !important;
box-shadow: none !important;
}
.x-layer.x-grid .x-grid-item-over td:first-child,
.x-layer.x-grid .x-grid-item-selected td:first-child,
.x-panel.x-layer.x-grid .x-grid-item-over td:first-child,
.x-panel.x-layer.x-grid .x-grid-item-selected td:first-child {
border-radius: 6px 0 0 6px !important;
}
.x-layer.x-grid .x-grid-item-over td:last-child,
.x-layer.x-grid .x-grid-item-selected td:last-child,
.x-panel.x-layer.x-grid .x-grid-item-over td:last-child,
.x-panel.x-layer.x-grid .x-grid-item-selected td:last-child {
border-radius: 0 6px 6px 0 !important;
}
/* =====================================================
UNIFI BORDER-RADIUS PARITY (ported from theme-unifi.css)
===================================================== */
.x-border-box,
.x-border-box * {
border-radius: var(--gh-radius-lg);
}
/* Remove rounded corners from grids/tables/lists (Tasks, logs) */
.x-grid,
.x-grid *,
.x-grid-header-ct,
.x-grid-header-ct *,
.x-grid-view,
.x-grid-view *,
.x-column-header,
.x-column-header *,
.x-grid-item,
.x-grid-cell,
.x-grid-cell-inner,
.x-grid-row,
table,
table *,
tr,
td,
th,
.x-legend,
.x-legend *,
.x-legend-container,
.x-legend-container *,
.x-legend-item,
.x-legend-horizontal .x-legend-item,
.x-legend-vertical .x-legend-item,
.x-legend-horizontal .x-legend-item:first-child,
.x-legend-horizontal .x-legend-item:last-child,
.x-legend-vertical .x-legend-item:first-child,
.x-legend-vertical .x-legend-item:last-child,
.x-tool,
.x-tool-tool-el,
.x-tool-default,
.x-tool-img {
border-radius: 0 !important;
}
/* Form elements - exclude from global radius */
.x-form-item,
.x-form-item-default,
.x-form-item-body,
.x-form-item-body-default,
.x-form-text-field-body,
.x-form-text-field-body-default,
.x-form-fieldcontainer,
.x-field,
.x-field-default,
.x-form-type-text {
border-radius: 0 !important;
}
/* Reset layout containers that clip form elements */
.x-box-layout-ct,
.x-panel-bodyWrap,
.x-panel-bodyWrap-default,
.x-autocontainer-innerCt,
.x-autocontainer-outerCt,
.x-panel.x-tabpanel-child,
.x-panel.x-box-item,
.x-box-inner,
.x-box-target,
.x-container,
.x-container-default,
.x-window .x-panel-body,
.x-window .x-window-body,
.x-window .x-window-bodyWrap {
border-radius: 0 !important;
}
/* Reset everything inside windows to 0 - then re-apply specific radii */
.x-window *,
.x-window .x-autocontainer-innerCt,
.x-window .x-autocontainer-outerCt,
.x-window .x-form-layout-wrap,
.x-window .x-form-layout-auto-label,
.x-window .x-form-layout-colgroup,
.x-window .x-form-layout-column,
.x-window .x-field,
.x-window .x-form-item,
.x-window .x-form-item-body {
border-radius: 0 !important;
}
.x-window,
.x-window-default {
border-radius: 8px !important;
}
.x-window-header,
.x-window-header-default {
border-radius: 8px 8px 0 0 !important;
}
.x-window .x-window-body,
.x-window-body-default {
border-radius: 0 !important;
}
.x-window .x-btn {
border-radius: 6px !important;
}
.x-window .x-form-checkbox {
border-radius: 4px !important;
}
.x-window .x-form-trigger-wrap,
.x-window .x-form-trigger-wrap-default {
border-radius: 4px !important;
}
.x-window .x-form-text-wrap,
.x-window .x-form-text {
border-radius: 4px 0 0 4px !important;
}
.x-window .x-form-arrow-trigger {
border-radius: 0 4px 4px 0 !important;
}
.x-form-trigger-wrap,
.x-form-trigger-wrap *,
.x-form-text-wrap,
.x-form-text-wrap *,
.x-form-text,
.x-form-trigger {
border-radius: 0 !important;
}
.x-form-trigger-wrap,
.x-form-trigger-wrap-default {
border-radius: 4px !important;
}
.x-form-text-wrap,
.x-form-text-wrap-default {
border-radius: 4px 0 0 4px !important;
}
.x-form-text,
.x-form-text-default {
border-radius: 4px 0 0 4px !important;
}
.x-form-trigger,
.x-form-trigger-default,
.x-form-arrow-trigger,
.x-form-arrow-trigger-default {
border-radius: 0 4px 4px 0 !important;
}
.x-legend-item-marker {
border-radius: 50% !important;
}
/* =====================================================
CHECKBOXES & RADIOS — GitHub Primer (v2.2.18)
===================================================== */
/* Base: remove sprite, styled as clean custom control */
.x-form-checkbox, .x-form-checkbox-default,
.x-form-radio, .x-form-radio-default {
background-image: none !important;
background-color: #161b22 !important;
border: 1.5px solid #6e7681 !important;
width: 16px !important;
height: 16px !important;
display: inline-block !important;
box-sizing: border-box !important;
cursor: pointer !important;
transition: border-color .12s ease, background-color .12s ease !important;
}
/* Checkbox: rounded square */
.x-form-checkbox, .x-form-checkbox-default {
border-radius: 3px !important;
}
/* Radio: circle + ::after inner dot */
.x-form-radio, .x-form-radio-default {
border-radius: 50% !important;
position: relative !important;
transform: translateZ(0) !important;
box-shadow: inset 0 0 0 0 transparent !important;
}
.x-form-radio::after {
content: '' !important;
position: absolute !important;
top: 50% !important;
left: 50% !important;
width: 7px !important;
height: 7px !important;
border-radius: 50% !important;
background: transparent !important;
transform: translate(-50%, -50%) scale(0) !important;
transition: transform .15s ease, background .15s ease !important;
pointer-events: none !important;
}
/* Hover */
.x-form-checkbox:hover, .x-form-checkbox-default:hover,
.x-form-cb-wrap:hover .x-form-checkbox {
border-color: #388bfd !important;
}
.x-form-radio:hover, .x-form-radio-default:hover,
.x-form-cb-wrap:hover .x-form-radio {
border-color: #388bfd !important;
}
/* CHECKED checkbox — .x-form-cb-checked lives on the .x-form-item ancestor */
.x-form-cb-checked .x-form-checkbox,
.x-form-cb-checked .x-form-checkbox-default {
background-color: #1f6feb !important;
border-color: #1f6feb !important;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 8'%3E%3Cpath d='M1 4l3 3 5-6' fill='none' stroke='%23fff' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
background-repeat: no-repeat !important;
background-position: center !important;
background-size: 9px 7px !important;
}
/* SELECTED radio */
.x-form-cb-checked .x-form-radio,
.x-form-cb-checked .x-form-radio-default {
border-color: #1f6feb !important;
background-color: #0d1117 !important;
}
.x-form-cb-checked .x-form-radio::after {
background: #1f6feb !important;
transform: translate(-50%, -50%) scale(1) !important;
}
/* Buttons */
.x-btn-default-small {
border-radius: 6px !important;
}
.x-btn-default-toolbar-small {
border-radius: 4px !important;
}
.x-btn.x-btn-default-small:has(.fa-check) {
border-radius: 4px !important;
}
/* Boundlist dropdowns */
.x-boundlist {
border-radius: 4px !important;
}
.x-boundlist-item {
border-radius: 4px !important;
}
.x-boundlist-list-ct {
border-radius: 4px !important;
}
.x-boundlist-item-over,
.x-boundlist-selected {
border-radius: 4px !important;
}
/* Menus */
.x-menu,
.x-menu-default {
border-radius: 8px !important;
}
.x-menu-item-default.x-menu-item-focus,
.x-menu-item-default.x-menu-item-active,
.x-menu-item:hover {
border-radius: 6px !important;
}
/* Tooltips */
.x-tip-default {
border-radius: 6px !important;
}
/* Tree list items */
.x-treelist-item,
.x-treelist-item-tool {
border-radius: 4px !important;
}
.x-treelist-row,
.x-treelist-row:hover,
.x-treelist-row-over,
.x-treelist-item-selected>.x-treelist-row,
.x-treelist-item-selected>.x-treelist-row:hover,
.x-treelist-item-expanded>.x-treelist-row,
.x-treelist-item-expanded>.x-treelist-row-over,
.x-treelist-item-expandable>.x-treelist-row,
.x-treelist-item-expandable>.x-treelist-row-over {
border-radius: 4px !important;
}
.x-treelist-row::before {
border-radius: 4px !important;
}
.x-treelist-item-wrap,
.x-treelist-item-text,
.x-treelist-row,
.x-treelist-container,
.x-treelist-root-container,
.x-treelist,
.x-treelist-pve-nav {
border-radius: 4px !important;
}
/* Window message mask */
.x-mask-msg {
border-radius: 8px !important;
}
/* Tags */
.pve-edit-tag {
border-radius: 6px !important;
}
.x-tree-node-text .proxmox-tag-dark,
.x-tree-node-text .proxmox-tag-light,
.x-grid-cell-inner .proxmox-tag-dark,
.x-grid-cell-inner .proxmox-tag-light,
span.proxmox-tag-dark,
span.proxmox-tag-light {
border-radius: 6px !important;
}
/* Usage bars */
.usage-wrapper,
.usage {
border-radius: 2px !important;
}
/* Progress bars */
.x-progress,
.x-progress-default {
border-radius: 5px !important;
}
.x-progress-bar,
.x-progress-bar-default,
.x-progress-default .x-progress-bar-default {
border-radius: 5px !important;
}
/* Scrollbar thumb */
::-webkit-scrollbar-thumb {
border-radius: 4px !important;
}
/* Summary/stats panels */
.pveStatusPanel,
.x-panel-default-framed,
.x-panel-body-default-framed {
border-radius: 12px !important;
}
[id^="pveGuestStatusView-"][id$="-body"],
[id^="pmxNotesView-"] .x-panel-body {
border-radius: 8px !important;
}
.x-panel-header-default-framed {
border-radius: 12px 12px 0 0 !important;
}
.pve-info-grid {
border-radius: 12px !important;
}
.x-form-display-field-default {
border-radius: 6px !important;
}
.pve-rrdview,
.rrdview {
border-radius: 12px !important;
}
.pve-summary-status,
.x-container .pve-status {
border-radius: 8px !important;
}
.x-panel-default[id*="notes"],
.pve-notes-view {
border-radius: 8px !important;
}
.x-fieldset {
border-radius: 8px !important;
}
/* Tab hover/active corners */
.x-tab-default.x-tab-over,
.x-tab-default.x-tab.x-tab-active {
border-radius: 6px 6px 0 0 !important;
}
/* Segmented buttons */
.x-segmented-button {
border-radius: 6px !important;
}
.x-segmented-button .x-btn,
.x-segmented-button .x-btn-default-small,
.x-segmented-button .x-btn-inner,
.x-segmented-button .x-btn-wrap {
border-radius: 6px !important;
}
/* Summary page widget panels */
.x-panel.x-column>.x-panel-bodyWrap>.x-panel-body.x-panel-body-default {
border-radius: 8px !important;
}
/* Floating grid pickers (storage/ISO selectors) */
.x-layer.x-grid .x-grid-view,
.x-panel.x-layer.x-grid .x-grid-view {
border-radius: 4px !important;
}
.x-panel.x-layer.x-grid,
.x-layer.x-panel.x-grid {
border-radius: 4px !important;
}
.x-layer.x-grid .x-grid-item-over,
.x-layer.x-grid .x-grid-item-selected,
.x-panel.x-layer.x-grid .x-grid-item-over,
.x-panel.x-layer.x-grid .x-grid-item-selected {
border-radius: 4px !important;
}
.x-layer.x-grid .x-grid-item-over td,
.x-layer.x-grid .x-grid-item-selected td,
.x-layer.x-grid .x-grid-item-over .x-grid-cell,
.x-layer.x-grid .x-grid-item-selected .x-grid-cell,
.x-panel.x-layer.x-grid .x-grid-item-over td,
.x-panel.x-layer.x-grid .x-grid-item-selected td,
.x-panel.x-layer.x-grid .x-grid-item-over .x-grid-cell,
.x-panel.x-layer.x-grid .x-grid-item-selected .x-grid-cell {
border-radius: 0 !important;
}
.x-layer.x-grid .x-grid-item-over td:first-child,
.x-layer.x-grid .x-grid-item-selected td:first-child,
.x-panel.x-layer.x-grid .x-grid-item-over td:first-child,
.x-panel.x-layer.x-grid .x-grid-item-selected td:first-child {
border-radius: 4px 0 0 4px !important;
}
.x-layer.x-grid .x-grid-item-over td:last-child,
.x-layer.x-grid .x-grid-item-selected td:last-child,
.x-panel.x-layer.x-grid .x-grid-item-over td:last-child,
.x-panel.x-layer.x-grid .x-grid-item-selected td:last-child {
border-radius: 0 4px 4px 0 !important;
}
/* Charts - remove border-radius from data area only */
canvas.x-surface-canvas,
.x-surface-canvas,
.x-draw-component canvas,
.proxmox-rrd-chart canvas {
border-radius: 0 !important;
}
svg.x-surface {
border-radius: 0 !important;
}
.x-draw-container,
.x-surface {
border-radius: 0 !important;
}
/* =====================================================
TOOL ICONS - FontAwesome Replacements
(Ported from UniFi v5.86)
Replace sprite-based ExtJS tool icons with crisp
FontAwesome icons for better consistency and clarity
===================================================== */
/* Base styling for all tool icons - remove sprite backgrounds */
.x-tool-tool-el.x-tool-minus,
.x-tool-img.x-tool-minus,
.x-tool-tool-el.x-tool-collapse-right,
.x-tool-img.x-tool-collapse-right,
.x-tool-tool-el.x-tool-collapse-left,
.x-tool-img.x-tool-collapse-left,
.x-tool-tool-el.x-tool-expand-right,
.x-tool-img.x-tool-expand-right,
.x-tool-tool-el.x-tool-expand-left,
.x-tool-img.x-tool-expand-left,
.x-tool-tool-el.x-tool-maximize,
.x-tool-img.x-tool-maximize,
.x-tool-tool-el.x-tool-restore,
.x-tool-img.x-tool-restore,
.x-tool-tool-el.x-tool-gear,
.x-tool-img.x-tool-gear,
.x-tool-tool-el.x-tool-refresh,
.x-tool-img.x-tool-refresh,
.x-tool-tool-el.x-tool-close,
.x-tool-img.x-tool-close {
background-image: none !important;
font-family: "FontAwesome" !important;
font-size: 14px !important;
line-height: 16px !important;
text-align: center !important;
color: var(--pm-text-dim) !important;
transition: color 0.15s ease !important;
filter: none !important;
width: 16px !important;
height: 16px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
}
/* Close button - slightly larger */
.x-tool-tool-el.x-tool-close,
.x-tool-img.x-tool-close {
font-size: 20px !important;
}
/* Individual glyph assignments */
.x-tool-tool-el.x-tool-minus::before,
.x-tool-img.x-tool-minus::before {
content: "\f010" !important; /* fa-search-minus (zoom out) */
}
.x-tool-tool-el.x-tool-collapse-right::before,
.x-tool-img.x-tool-collapse-right::before {
content: "\f054" !important; /* fa-chevron-right */
}
.x-tool-tool-el.x-tool-expand-left::before,
.x-tool-img.x-tool-expand-left::before {
content: "\f053" !important; /* fa-chevron-left */
}
.x-tool-tool-el.x-tool-collapse-left::before,
.x-tool-img.x-tool-collapse-left::before {
content: "\f053" !important; /* fa-chevron-left */
}
.x-tool-tool-el.x-tool-expand-right::before,
.x-tool-img.x-tool-expand-right::before {
content: "\f054" !important; /* fa-chevron-right */
}
.x-tool-tool-el.x-tool-maximize::before,
.x-tool-img.x-tool-maximize::before {
content: "\f065" !important; /* fa-expand */
}
.x-tool-tool-el.x-tool-restore::before,
.x-tool-img.x-tool-restore::before {
content: "\f066" !important; /* fa-compress */
}
.x-tool-tool-el.x-tool-gear::before,
.x-tool-img.x-tool-gear::before {
content: "\f013" !important; /* fa-cog */
}
.x-tool-tool-el.x-tool-refresh::before,
.x-tool-img.x-tool-refresh::before {
content: "\f021" !important; /* fa-refresh */
}
.x-tool-tool-el.x-tool-close::before,
.x-tool-img.x-tool-close::before {
content: "\f00d" !important; /* fa-times */
}
/* Hover state - all tool icons */
.x-tool:hover .x-tool-tool-el.x-tool-minus,
.x-tool:hover .x-tool-img.x-tool-minus,
.x-tool:hover .x-tool-tool-el.x-tool-collapse-right,
.x-tool:hover .x-tool-img.x-tool-collapse-right,
.x-tool:hover .x-tool-tool-el.x-tool-collapse-left,
.x-tool:hover .x-tool-img.x-tool-collapse-left,
.x-tool:hover .x-tool-tool-el.x-tool-expand-right,
.x-tool:hover .x-tool-img.x-tool-expand-right,
.x-tool:hover .x-tool-tool-el.x-tool-expand-left,
.x-tool:hover .x-tool-img.x-tool-expand-left,
.x-tool:hover .x-tool-tool-el.x-tool-maximize,
.x-tool:hover .x-tool-img.x-tool-maximize,
.x-tool:hover .x-tool-tool-el.x-tool-restore,
.x-tool:hover .x-tool-img.x-tool-restore,
.x-tool:hover .x-tool-tool-el.x-tool-gear,
.x-tool:hover .x-tool-img.x-tool-gear,
.x-tool:hover .x-tool-tool-el.x-tool-refresh,
.x-tool:hover .x-tool-img.x-tool-refresh,
.x-tool:hover .x-tool-tool-el.x-tool-close,
.x-tool:hover .x-tool-img.x-tool-close {
color: var(--pm-text) !important;
}
/* Disabled state */
.x-tool-disabled .x-tool-tool-el,
.x-tool-disabled .x-tool-img {
opacity: 0.4 !important;
cursor: default !important;
}
/* Inline FontAwesome tools (PVE-injected) */
.x-tool-tool-el[style*="font-family:FontAwesome"],
.x-tool-tool-el[style*="font-family: FontAwesome"] {
color: var(--pm-text-dim) !important;
font-size: 14px !important;
line-height: 16px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
width: 16px !important;
height: 16px !important;
transition: color 0.15s ease !important;
background-image: none !important;
background-color: transparent !important;
}
.x-tool:not(.x-tool-disabled) .x-tool-tool-el[style*="font-family:FontAwesome"],
.x-tool:not(.x-tool-disabled) .x-tool-tool-el[style*="font-family: FontAwesome"] {
cursor: pointer !important;
}
.x-tool.x-tool-disabled .x-tool-tool-el[style*="font-family:FontAwesome"],
.x-tool.x-tool-disabled .x-tool-tool-el[style*="font-family: FontAwesome"] {
cursor: default !important;
opacity: 0.4 !important;
}
.x-tool .x-mask {
background-color: transparent !important;
backdrop-filter: none !important;
pointer-events: none !important;
}
.x-tool:not(.x-tool-disabled):hover .x-tool-tool-el[style*="font-family:FontAwesome"],
.x-tool:not(.x-tool-disabled):hover .x-tool-tool-el[style*="font-family: FontAwesome"] {
color: var(--pm-text) !important;
}