/* ============================================================
 * Serve & Charge — modernization overlay
 * ============================================================
 *
 * This single file is loaded LAST in the host pages
 * (ServeAndCharge.html / ServeAndCharge-en.html), AFTER all the
 * Ext JS 2.x theme stylesheets, so it wins the cascade.
 *
 * Goal: repaint the 2008-era ExtJS / GWT-Ext look so it doesn't
 * feel like a Windows XP application. Strictly cosmetic — no
 * widths, heights, paddings, or margins are changed where ExtJS
 * measures them in JS, because that would break layout.
 *
 * What changes:
 *   - System font stack instead of Tahoma 11px
 *   - Neutral page palette (slate/indigo) instead of #869ca7
 *   - Flat panel/window/tab/button backgrounds (gradients off)
 *   - Soft shadows + small radii on panels and dialogs
 *   - Visible focus rings on inputs and buttons (a11y)
 *   - Native <select>/<button>/<input> styled to match (User Admin
 *     and other dialogs that bypass ExtJS use raw HTML controls)
 *
 * What does NOT change:
 *   - HTML structure (this file is the only addition aside from a
 *     single <link> tag in each host page)
 *   - ExtJS / GWT widget JS
 *   - Element box dimensions, paddings, or margins (ExtJS pixel-
 *     measures these and breaks if we touch them)
 *   - Icon sprites (.icon-*, expand/collapse arrows, tree elbows)
 *
 * Rollback: delete this file + the matching <link> line from each
 * host page. Nothing else depends on it.
 * ============================================================ */

:root {
  --sac-bg-page:        #eef1f5;
  --sac-bg-panel:       #ffffff;
  --sac-bg-soft:        #f5f7fa;
  --sac-bg-stripe:      #fafbfc;

  --sac-border:         #dde2e8;
  --sac-border-strong:  #b9c2cc;

  --sac-text:           #1f2933;
  --sac-text-muted:     #52606d;
  --sac-text-on-accent: #ffffff;

  --sac-accent:         #2563eb;
  --sac-accent-soft:    #e7efff;
  --sac-accent-strong:  #1e4fc8;

  --sac-header-bg:      #2f4f7f;
  --sac-header-bg-2:    #3a5a8c;
  --sac-footer-bg:      #1f2933;
  --sac-brand-logo:     url("https://local-cdn.labtagon.com/www/wp-content/uploads/LabtagonLogo_transition.svg");
  --sac-brand-dark:     #182338;
  --sac-brand-muted:    #667085;

  --sac-shadow-sm: 0 1px 2px rgba(15,23,42,.06);
  --sac-shadow-md: 0 1px 2px rgba(15,23,42,.05),
                   0 4px 12px rgba(15,23,42,.07);
  --sac-shadow-lg: 0 10px 28px rgba(15,23,42,.18);

  --sac-radius:    5px;
  --sac-radius-sm: 3px;

  --sac-font: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI",
              Roboto, "Helvetica Neue", Arial, sans-serif;
  --sac-font-mono: ui-monospace, SFMono-Regular, "JetBrains Mono",
                   Consolas, "Liberation Mono", monospace;
}

/* ---- Page background ----
 * The host pages set <body bgcolor="#869ca7"> as a presentational
 * HTML attribute. CSS wins, but use !important to be sure. */
html, body {
  background: var(--sac-bg-page) !important;
  color: var(--sac-text);
  font-family: var(--sac-font);
}

/* ---- Typography ----
 * Force the system font stack and a slightly larger base size
 * everywhere ExtJS / GWT widgets pin a font. Do NOT change
 * line-height — ExtJS measures rows by it. */
body, table, table td, select, input, button, textarea,
.gwt-HTML, .gwt-BODY,
.gwt-TextBox, .gwt-TextArea, .gwt-ListBox, .gwt-Button,
.gwt-DialogBox, .gwt-DialogBox .Caption,
.gwt-Label, .gwt-DecoratedTabBar .gwt-Label,
.x-panel, .x-panel-header, .x-panel-body,
.x-window, .x-window-header, .x-window-header-text,
.x-grid3, .x-grid3-cell, .x-grid3-hd-inner,
.x-toolbar, .x-toolbar button, .x-toolbar .ytb-text,
.x-form-text, .x-form-textarea, .x-form-field,
.x-btn, .x-btn-text,
.x-menu-item, .x-menu-list, .x-menu-list-item,
.x-tree-node, .x-tree-node a, .x-tree-node-anchor,
.x-tab-strip-text, .x-tab-strip-top a, .x-tab-strip-top span,
.x-statusbar, .x-statusbar .x-statusbar-text {
  font-family: var(--sac-font) !important;
}

body, table, table td {
  font-size: 12.5px;
  color: var(--sac-text);
}

/* ============================================================
 * Application masthead
 *
 * The GWT frame still autoloads `goeing/header.html`, which is
 * generated from the module's public assets. Repaint the legacy
 * three-image table here instead of editing generated output or
 * GWT source. Keep the external footprint at 82px: Ext lays out
 * the north region around this fixed header height.
 * ============================================================ */

body table:has(img[src$="messe_li.jpg"]):has(img[src$="messe_mi.png"]):has(img[src$="getinge.jpg"]) {
  position: relative;
  width: 100% !important;
  height: 82px !important;
  min-height: 82px !important;
  max-height: 82px !important;
  border-collapse: collapse !important;
  table-layout: fixed !important;
  overflow: hidden !important;
  background:
    radial-gradient(circle at 12% 20%, rgba(37, 99, 235, .14), transparent 30%),
    linear-gradient(135deg, #ffffff 0%, #f8fbff 52%, #eef4ff 100%) !important;
  border: 0 !important;
  border-bottom: 1px solid rgba(37, 99, 235, .16) !important;
  box-shadow: 0 8px 24px rgba(24, 35, 56, .08) !important;
}

body table:has(img[src$="messe_li.jpg"]):has(img[src$="messe_mi.png"]):has(img[src$="getinge.jpg"]) td {
  position: relative;
  height: 82px !important;
  padding: 0 28px !important;
  vertical-align: middle !important;
  background: transparent !important;
  border: 0 !important;
  color: var(--sac-brand-dark) !important;
  white-space: nowrap;
}

body table:has(img[src$="messe_li.jpg"]):has(img[src$="messe_mi.png"]):has(img[src$="getinge.jpg"]) img {
  width: 1px !important;
  height: 1px !important;
  max-width: 1px !important;
  max-height: 1px !important;
  opacity: 0 !important;
}

body table:has(img[src$="messe_li.jpg"]):has(img[src$="messe_mi.png"]):has(img[src$="getinge.jpg"]) td:first-child::before {
  content: "";
  display: inline-block;
  width: 244px;
  height: 52px;
  vertical-align: middle;
  background: var(--sac-brand-logo) left center / contain no-repeat;
}

body table:has(img[src$="messe_li.jpg"]):has(img[src$="messe_mi.png"]):has(img[src$="getinge.jpg"]) td:nth-child(2)::before {
  content: "Serve & Charge";
  display: block;
  margin-bottom: 4px;
  color: var(--sac-brand-dark);
  font-size: 21px;
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.1;
}

body table:has(img[src$="messe_li.jpg"]):has(img[src$="messe_mi.png"]):has(img[src$="getinge.jpg"]) td:nth-child(2)::after {
  content: "Service accounting platform";
  display: block;
  color: var(--sac-brand-muted);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .14em;
  line-height: 1.1;
  text-transform: uppercase;
}

/* ============================================================
 * ExtJS panels (the four "Required data / Base charging / ..."
 * boxes on the home view, plus every accordion section)
 * ============================================================ */

.x-panel {
  background-color: var(--sac-bg-panel) !important;
}

/* Panel header — kill the indigo gradient sprite, paint a flat slate */
.x-panel-header,
.x-panel-tl .x-panel-header,
.x-panel-tc {
  background: var(--sac-header-bg) !important;
  background-image: none !important;
  border-color: var(--sac-header-bg-2) !important;
  color: var(--sac-text-on-accent) !important;
}

.x-panel-header span.x-panel-header-text,
.x-panel-header .x-panel-header-text {
  color: var(--sac-text-on-accent) !important;
  font-weight: 600 !important;
  letter-spacing: 0.01em;
}

/* Ext panel headers.
 *
 * Some panel titles are rendered directly on
 * `.x-panel-header.x-unselectable` instead of inside a nested
 * `.x-panel-header-text` span. The old sprite frame expected the
 * left cap to provide visual breathing room; once the sprite is gone,
 * titles like "Required data" sit too close to the left edge. */
body .x-panel-header,
body .x-panel-header.x-unselectable,
body .x-panel-tl .x-panel-header,
body .x-panel-tl .x-panel-header.x-unselectable {
  padding-left: 8px !important;
  padding-right: 8px !important;
}

/* Panel corners / sides (the sprite-based rounded indigo frames) */
.x-panel-tl, .x-panel-tr, .x-panel-bl, .x-panel-br,
.x-panel-tc, .x-panel-bc,
.x-panel-ml, .x-panel-mr {
  background-image: none !important;
}

.x-panel-bwrap, .x-panel-mc {
  background-color: var(--sac-bg-panel) !important;
}

.x-panel-body {
  background-color: var(--sac-bg-panel) !important;
}

/* ============================================================
 * Ext windows (login dialog, error dialogs, modal forms)
 * ============================================================ */

.x-window {
  background-color: var(--sac-bg-panel) !important;
  border: 1px solid var(--sac-border-strong) !important;
  border-radius: var(--sac-radius) !important;
  box-shadow: var(--sac-shadow-lg) !important;
}

/* Window 9-cell sprite frame — flatten everything to white;
 * the title row is repainted by the .x-window-tc / .x-window-header
 * block below. */
.x-window-tl, .x-window-tr,
.x-window-bl, .x-window-br, .x-window-bc,
.x-window-ml, .x-window-mr, .x-window-mc {
  background-image: none !important;
  background-color: var(--sac-bg-panel) !important;
  border: none !important;
}

.x-window-tc,
.x-window-header {
  background: var(--sac-header-bg) !important;
  background-image: none !important;
  color: var(--sac-text-on-accent) !important;
  border-bottom: 1px solid var(--sac-header-bg-2) !important;
}

/* Top-left and top-right sprite cells of the window header carry
 * the rounded-corner gradient sprite. Repaint them slate so the
 * title bar reads as one continuous solid bar. */
.x-window .x-window-tl,
.x-window .x-window-tr {
  background-color: var(--sac-header-bg) !important;
}

/* Brute-force nuker: kill background-images on every node Ext
 * uses for the title-bar 9-slice frame on both windows AND
 * panels. The "going" indigo theme layers `panel_white-top-
 * bottom.gif` (a dotted texture) on .x-panel-header and bleeds
 * it through. */
.x-window-tl, .x-window-tc, .x-window-tr,
.x-window-bl, .x-window-bc, .x-window-br,
.x-window-ml, .x-window-mc, .x-window-mr,
.x-window-header,
.x-panel-tl, .x-panel-tc, .x-panel-tr,
.x-panel-bl, .x-panel-bc, .x-panel-br,
.x-panel-ml, .x-panel-mc, .x-panel-mr,
.x-panel-header,
.x-window-tl .x-window-header,
.x-panel-tl .x-panel-header {
  background-image: none !important;
}

.x-window-header-text {
  color: var(--sac-text-on-accent) !important;
  font-weight: 600 !important;
}

/* Modal mask: cleaner, lighter overlay so the page behind the
 * login dialog stays readable. The original Ext theme renders an
 * almost-opaque grey panel; this drops it to a subtle slate tint. */
.ext-el-mask, .x-mask {
  background: rgba(31, 41, 51, .35) !important;
  opacity: 1 !important;
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
}

/* ============================================================
 * Tabs (the "Home" + "User administration" tab strip at the top
 * of the main content area)
 * ============================================================ */

.x-tab-panel-header,
.x-tab-strip-wrap,
.x-tab-strip-top {
  background: transparent !important;
  background-image: none !important;
  border-bottom: 1px solid var(--sac-header-bg-2) !important;
}

.x-tab-strip li {
  background: var(--sac-bg-soft) !important;
  background-image: none !important;
  border: 1px solid var(--sac-border) !important;
  border-bottom: none !important;
  border-radius: var(--sac-radius) var(--sac-radius) 0 0 !important;
}

.x-tab-strip li.x-tab-strip-active {
  background: var(--sac-header-bg) !important;
  border-color: var(--sac-header-bg-2) !important;
}

.x-tab-strip-active .x-tab-strip-text,
.x-tab-strip li.x-tab-strip-active .x-tab-strip-text,
.x-tab-strip li.x-tab-strip-active a {
  color: var(--sac-text-on-accent) !important;
  font-weight: 600 !important;
}

.x-tab-strip-text {
  color: var(--sac-text) !important;
}

/* The sprite-based tab corners — flatten them all */
.x-tab-strip li .x-tab-left,
.x-tab-strip li .x-tab-right,
.x-tab-strip li .x-tab-strip-inner,
.x-tab-strip-active .x-tab-left,
.x-tab-strip-active .x-tab-right,
.x-tab-strip-over .x-tab-left,
.x-tab-strip-over .x-tab-right,
.x-tab-strip-bottom li .x-tab-left,
.x-tab-strip-bottom li .x-tab-right {
  background-image: none !important;
}

/* ============================================================
 * Toolbars
 *
 * Used both at the top of grids/panels (button bars) AND as the
 * application footer (Menu / User: admin / Version: debug — see
 * GoeingFrame.createFooter()). Style as a single neutral light
 * surface; text is dark for contrast. The dark slate footer
 * idea was abandoned because the same .x-toolbar class is
 * reused everywhere and a south-only selector isn't reliable.
 * ============================================================ */

.x-toolbar {
  background: var(--sac-bg-soft) !important;
  background-image: none !important;
  border-color: var(--sac-border) !important;
  color: var(--sac-text) !important;
}

/* Toolbar text items (e.g. footer labels "User:", "Version:",
 * "admin", "debug"). Default Ext color is faded/legacy white;
 * force readable dark text on the light bar. */
.x-toolbar .ytb-text,
.x-toolbar .x-toolbar-text,
.x-toolbar .x-form-item,
.x-toolbar td.ytb-sep,
.x-toolbar .xtb-sep {
  color: var(--sac-text) !important;
  font-family: var(--sac-font) !important;
}

/* Toolbar separators */
.x-toolbar .ytb-sep,
.x-toolbar .xtb-sep,
.x-toolbar .x-toolbar-separator {
  border-color: var(--sac-border-strong) !important;
}

/* ============================================================
 * Ext buttons (the green-checkmark Login, the red-X Close, etc.)
 *
 * Ext 2.x renders each button as a 3x3 <table> with a 9-slice
 * sprite for the rounded gradient. The icon (icon-accept,
 * icon-delete, ...) lives as a background-image on the inner
 * `.x-btn-text` <button> element; that one MUST be left alone
 * or every button loses its icon.
 *
 * Strategy: paint the wrapping `.x-btn` table itself with
 * border + bg + radius, and clear background-image on the 8
 * chrome cells (NOT .x-btn-mc which contains the icon-bearing
 * <button> — and definitely NOT .x-btn-text).
 * Do not touch padding/width — Ext measures them.
 * ============================================================ */

.x-btn {
  background: var(--sac-bg-panel) !important;
  background-image: none !important;
  border: 1px solid var(--sac-border-strong) !important;
  border-radius: var(--sac-radius-sm) !important;
  box-shadow: var(--sac-shadow-sm) !important;
  color: var(--sac-text) !important;
}

.x-btn-tl, .x-btn-tr, .x-btn-tc,
.x-btn-ml, .x-btn-mr,
.x-btn-bl, .x-btn-br, .x-btn-bc,
.x-btn-left, .x-btn-right, .x-btn-center {
  background-image: none !important;
  background-color: transparent !important;
}

/* `.x-btn-mc` is the center cell that *contains* the icon-bearing
 * <button class="x-btn-text icon-foo">. Keep it transparent so
 * the wrapping `.x-btn` paints through, but don't touch its
 * children. */
.x-btn-mc {
  background-color: transparent !important;
  background-image: none !important;
}

/* Hover */
.x-btn-over {
  background: var(--sac-accent-soft) !important;
  background-image: none !important;
  border-color: var(--sac-accent) !important;
}

/* Pressed */
.x-btn-pressed,
.x-btn-click {
  background: var(--sac-accent) !important;
  background-image: none !important;
  border-color: var(--sac-accent-strong) !important;
}

.x-btn-pressed .x-btn-text,
.x-btn-click .x-btn-text {
  color: var(--sac-text-on-accent) !important;
}

/* ============================================================
 * Form fields (Ext)
 * ============================================================ */

.x-form-text, .x-form-textarea, .x-form-field {
  border: 1px solid var(--sac-border-strong) !important;
  border-radius: var(--sac-radius-sm) !important;
  background-image: none !important;
  background-color: var(--sac-bg-panel) !important;
  color: var(--sac-text) !important;
}

.x-form-field-wrap,
.x-form-field-trigger-wrap {
  background-image: none !important;
}

.x-form-focus, .x-form-text:focus, .x-form-field:focus {
  border-color: var(--sac-accent) !important;
  outline: none !important;
  box-shadow: 0 0 0 3px var(--sac-accent-soft) !important;
}

/* Combo trigger (the chevron next to a dropdown) — leave the
 * sprite alone, just give the wrapper a clean background. */

/* ============================================================
 * Trees (Period sidebar: Industrie / Jahr 2021 ...)
 * ============================================================ */

.x-tree-node-el {
  border-radius: var(--sac-radius-sm);
}

.x-tree-node-el a span,
.x-tree-node-anchor span {
  color: var(--sac-text);
}

.x-tree-selected,
.x-tree-selected .x-tree-node-anchor {
  background-color: var(--sac-accent-soft) !important;
}

.x-tree-node .x-tree-node-over {
  background-color: var(--sac-bg-soft) !important;
}

/* ============================================================
 * Grids (data tables — every list view)
 * ============================================================ */

.x-grid3 {
  background-color: var(--sac-bg-panel) !important;
  border-color: var(--sac-border) !important;
}

.x-grid3-header,
.x-grid3-hd,
.x-grid3-hd-row td,
.x-grid3-header-pop,
.x-grid3-header-pop-inner {
  background: var(--sac-header-bg) !important;
  background-image: none !important;
  color: var(--sac-text-on-accent) !important;
  border-color: var(--sac-header-bg-2) !important;
}

.x-grid3-hd-inner,
.x-grid3-hd-text {
  color: var(--sac-text-on-accent) !important;
  font-weight: 600 !important;
}

/* Grid header hover / sort / menu-open state.
 * xtheme-going.css line 485 paints the inner cell with
 *   background:#ebf3fd url(.../grid_grid3-hrow-over.gif) repeat-x
 * which renders near-white with the legacy yellow-tinted Ext
 * sprite — our white header text becomes invisible on hover.
 * Kill the sprite and use a slightly lighter slate so the
 * hover affordance is visible while the white text stays
 * legible. Also recolor the (#fff / #ccc) side borders the
 * theme adds for the hover indicator. */
td.x-grid3-hd-over,
td.x-grid3-hd-menu-open,
td.sort-asc,
td.sort-desc {
  background: var(--sac-header-bg-2) !important;
  background-image: none !important;
  border-left-color: var(--sac-header-bg-2) !important;
  border-right-color: var(--sac-header-bg-2) !important;
}
td.x-grid3-hd-over .x-grid3-hd-inner,
td.x-grid3-hd-menu-open .x-grid3-hd-inner,
td.sort-asc .x-grid3-hd-inner,
td.sort-desc .x-grid3-hd-inner {
  background: var(--sac-header-bg-2) !important;
  background-image: none !important;
  color: var(--sac-text-on-accent) !important;
}

.x-grid3-row {
  background-color: var(--sac-bg-panel) !important;
  border-bottom: 1px solid #eef0f3 !important;
}

.x-grid3-row-alt {
  background-color: var(--sac-bg-stripe) !important;
}

.x-grid3-row-over {
  background-color: var(--sac-accent-soft) !important;
}

.x-grid3-row-selected,
.x-grid3-row-selected td {
  background-color: var(--sac-accent-soft) !important;
  border-color: var(--sac-accent) !important;
}

/* (No .x-statusbar in this app — the footer is a regular
 * .x-toolbar, styled in the Toolbars block above.) */

/* ============================================================
 * Menus (the right-click menu / the "Menu" button popup)
 * ============================================================ */

.x-menu {
  background: var(--sac-bg-panel) !important;
  background-image: none !important;
  border: 1px solid var(--sac-border-strong) !important;
  border-radius: var(--sac-radius) !important;
  box-shadow: var(--sac-shadow-md) !important;
}

.x-menu-item-active,
.x-menu-list-item:hover {
  background: var(--sac-accent-soft) !important;
  background-image: none !important;
  color: var(--sac-text) !important;
}

/* ============================================================
 * GWT widgets (anything not wrapped by GWT-Ext)
 * ============================================================ */

.gwt-DialogBox {
  border-radius: var(--sac-radius) !important;
  box-shadow: var(--sac-shadow-lg) !important;
  background: var(--sac-bg-panel) !important;
}

.gwt-DialogBox .Caption {
  background: var(--sac-header-bg) !important;
  background-image: none !important;
  color: var(--sac-text-on-accent) !important;
  border: none !important;
  font-family: var(--sac-font) !important;
  font-weight: 600 !important;
}

.gwt-DialogBox .dialogMiddleCenter {
  background: var(--sac-bg-panel) !important;
}

.gwt-Button {
  background: var(--sac-bg-panel) !important;
  border: 1px solid var(--sac-border-strong) !important;
  border-radius: var(--sac-radius-sm) !important;
  color: var(--sac-text) !important;
  font-family: var(--sac-font) !important;
}
.gwt-Button:hover {
  background: var(--sac-accent-soft) !important;
  border-color: var(--sac-accent) !important;
}
.gwt-Button:active {
  background: var(--sac-accent) !important;
  color: var(--sac-text-on-accent) !important;
}

/* ============================================================
 * Native HTML form controls
 *
 * The User Administration view (and others) skip ExtJS and use
 * bare <select multiple>, <button>, <input>. These get the
 * ancient browser-default look. Repaint them to match.
 *
 * Scoped narrowly: only elements that don't already have an
 * x-* / gwt-* class wrapper paint themselves.
 * ============================================================ */

button:not([class*="x-btn"]):not([class*="gwt-"]):not(.x-tool):not([class*="x-form-trigger"]),
input[type="button"]:not([class*="x-form"]),
input[type="submit"]:not([class*="x-form"]),
input[type="reset"]:not([class*="x-form"]) {
  background: var(--sac-bg-panel);
  border: 1px solid var(--sac-border-strong);
  border-radius: var(--sac-radius-sm);
  padding: 3px 12px;
  color: var(--sac-text);
  font-family: var(--sac-font);
  font-size: 12px;
  cursor: pointer;
  transition: background-color .08s linear, border-color .08s linear;
}

button:not([class*="x-btn"]):not([class*="gwt-"]):not(.x-tool):hover,
input[type="button"]:not([class*="x-form"]):hover,
input[type="submit"]:not([class*="x-form"]):hover,
input[type="reset"]:not([class*="x-form"]):hover {
  background: var(--sac-accent-soft);
  border-color: var(--sac-accent);
}

button:not([class*="x-btn"]):not([class*="gwt-"]):not(.x-tool):active,
input[type="button"]:not([class*="x-form"]):active,
input[type="submit"]:not([class*="x-form"]):active,
input[type="reset"]:not([class*="x-form"]):active {
  background: var(--sac-accent);
  color: var(--sac-text-on-accent);
}

select:not([class*="x-form"]):not([class*="gwt-"]),
input[type="text"]:not([class*="x-form"]):not([class*="gwt-"]),
input[type="password"]:not([class*="x-form"]):not([class*="gwt-"]),
input[type="number"]:not([class*="x-form"]):not([class*="gwt-"]),
input[type="email"]:not([class*="x-form"]):not([class*="gwt-"]),
input[type="search"]:not([class*="x-form"]):not([class*="gwt-"]),
textarea:not([class*="x-form"]):not([class*="gwt-"]) {
  background: var(--sac-bg-panel);
  color: var(--sac-text);
  border: 1px solid var(--sac-border-strong);
  border-radius: var(--sac-radius-sm);
  padding: 2px 6px;
  font-family: var(--sac-font);
  font-size: 12px;
  outline: none;
  transition: border-color .08s linear, box-shadow .08s linear;
}

select:not([class*="x-form"]):not([class*="gwt-"]):focus,
input:not([class*="x-form"]):not([class*="gwt-"]):focus,
textarea:not([class*="x-form"]):not([class*="gwt-"]):focus {
  border-color: var(--sac-accent);
  box-shadow: 0 0 0 3px var(--sac-accent-soft);
}

/* Listbox-style <select multiple> (User / Roles / All Role
 * Definitions / References boxes in User Admin). Give them a
 * proper background and a usable selected-row color. */
select[multiple]:not([class*="x-form"]):not([class*="gwt-"]) {
  padding: 0;
  background: var(--sac-bg-panel);
}
select[multiple]:not([class*="x-form"]):not([class*="gwt-"]) option {
  padding: 2px 6px;
  font-family: var(--sac-font);
}
select[multiple]:not([class*="x-form"]):not([class*="gwt-"]) option:checked {
  background: var(--sac-accent) linear-gradient(0deg, var(--sac-accent), var(--sac-accent));
  color: var(--sac-text-on-accent);
}

/* GWT-native ListBox controls.
 *
 * User Administration renders its category dropdown and large user /
 * role assignment boxes as `select.gwt-ListBox`, so the generic
 * native-control selectors above deliberately skip them. Repaint the
 * same widget family explicitly without touching ExtJS combo boxes. */
body select.gwt-ListBox,
body .gwt-ListBox {
  background: var(--sac-bg-panel) !important;
  border: 1px solid var(--sac-border) !important;
  border-radius: var(--sac-radius-sm) !important;
  color: var(--sac-text) !important;
  font-family: var(--sac-font) !important;
  font-size: 12px !important;
  outline: none !important;
}
body select.gwt-ListBox:focus,
body .gwt-ListBox:focus {
  border-color: var(--sac-accent) !important;
  box-shadow: 0 0 0 3px var(--sac-accent-soft) !important;
}
body select.gwt-ListBox[multiple],
body select.gwt-ListBox[size] {
  background: linear-gradient(90deg, var(--sac-bg-panel), var(--sac-bg-stripe)) !important;
  padding: 0 !important;
}
body select.gwt-ListBox option {
  padding: 2px 6px !important;
}
body select.gwt-ListBox option:checked {
  background: var(--sac-accent) linear-gradient(0deg, var(--sac-accent), var(--sac-accent)) !important;
  color: var(--sac-text-on-accent) !important;
}

/* ============================================================
 * Loading splash (briefly shown during GWT bootstrap)
 * ============================================================ */

#loading {
  left: 50% !important;
  top: 42% !important;
  width: 300px !important;
  margin-left: -150px !important;
  padding: 0 !important;
  border: 1px solid rgba(37, 99, 235, .16) !important;
  border-radius: 14px !important;
  box-shadow: 0 18px 46px rgba(24, 35, 56, .16) !important;
  background:
    radial-gradient(circle at 18% 12%, rgba(37, 99, 235, .16), transparent 34%),
    linear-gradient(135deg, #ffffff 0%, #f8fbff 55%, #eef4ff 100%) !important;
  overflow: hidden !important;
}

#loading .loading-indicator {
  font-family: var(--sac-font) !important;
  color: var(--sac-brand-dark) !important;
  background: transparent !important;
  padding: 24px 26px 22px !important;
  text-align: left !important;
}

#loading .loading-indicator img {
  display: none !important;
}

#loading .loading-indicator::before {
  content: "Serve & Charge";
  display: block;
  margin-bottom: 8px;
  color: var(--sac-brand-dark);
  font-size: 20px;
  font-weight: 700;
  letter-spacing: -0.02em;
}

#loading .loading-indicator::after {
  content: "Loading application...";
  display: block;
  min-height: 18px;
  padding-left: 30px;
  color: var(--sac-brand-muted);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .08em;
  line-height: 18px;
  text-transform: uppercase;
  background:
    radial-gradient(circle at center, transparent 45%, var(--sac-accent) 47%, var(--sac-accent) 62%, transparent 64%)
    left center / 18px 18px no-repeat;
  animation: sac-loading-pulse 1s ease-in-out infinite;
}

#loading-msg {
  font-family: var(--sac-font) !important;
  color: var(--sac-text-muted) !important;
}

@keyframes sac-loading-pulse {
  0%, 100% {
    opacity: .58;
  }

  50% {
    opacity: 1;
  }
}

/* ============================================================
 * Misc polish
 * ============================================================ */

/* Soft-wrap long text in panel bodies so labels don't blow out */
.x-panel-body, .x-grid3-cell { word-wrap: break-word; }

/* Less aggressive text selection */
::selection {
  background: var(--sac-accent);
  color: var(--sac-text-on-accent);
}

/* Slimmer scrollbars on WebKit-based browsers */
::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}
::-webkit-scrollbar-track {
  background: var(--sac-bg-page);
}
::-webkit-scrollbar-thumb {
  background: #c5cdd6;
  border: 2px solid var(--sac-bg-page);
  border-radius: 6px;
}
::-webkit-scrollbar-thumb:hover {
  background: #a6b1bd;
}

/* ============================================================
 * Icon system
 *
 * The original icons are 16x16 famfamfam Silk PNGs from ~2008
 * (`goeing/images/accept.png`, `delete.png`, `user.png`, ...).
 * Every .icon-* class in `goeing.css` points at one of those
 * with `background-image: url(images/foo.png) !important`.
 *
 * Strategy: override each .icon-* class with a Lucide-style
 * SVG inlined as a `data:image/svg+xml` URI. No extra files,
 * no network dependency, no Java/GWT change. Colors are baked
 * into the SVG (URL-encoded `#` as `%23`) so semantic intent
 * (red=delete, green=accept, blue=info, amber=lock) survives.
 *
 * Sizing: SVGs without intrinsic px size scale to background-
 * size; we set 14×14 so the icon sits comfortably in the 16×16
 * slot the Ext widget reserved. background-position is left
 * untouched so the original Ext rule (usually `0 50%` for
 * button-text icons, `center` for tree/menu) still applies.
 *
 * The Ext sprite-based chrome icons (combo trigger chevron,
 * tab close X, panel collapse tool, tree expand +/-, ...) get
 * the same treatment further down: a single SVG replaces the
 * sprite, killing the last "glassy" 2008-era visual cues.
 * ============================================================ */

/* Default sizing/positioning for every .icon-* used as a
 * background-image carrier. Avoids SVG-natural-size overflow.
 *
 * IMPORTANT: every concrete icon rule below is prefixed with
 * `body ` to bump specificity from (0,1,0) to (0,2,0). Without
 * the bump the rule loses to whatever GWT-Ext sets — even
 * though `goeing.css` only declares `.icon-X { background-image:
 * url(images/X.png) !important }` (same selector + !important
 * as ours, ours loaded later, mine should win). It empirically
 * doesn't, so we cheat with one extra `body` ancestor. See
 * PROGRAMMING_HORROR_LOG.md "Lost CSS cascade duel against
 * goeing.css's own .icon-* rules".
 *
 * Sizing applied via the catch-all selector below so that we
 * don't have to repeat background-size on every rule. */
body [class*="icon-"]:not(.x-tree-icon):not(.x-tree-ec-icon):not(.x-tree-elbow-plus):not(.x-tree-elbow-minus):not(.x-tree-elbow-end-plus):not(.x-tree-elbow-end-minus):not(.x-tab-strip-close):not(.x-tool):not([class*="x-tool-"]):not([class*="x-form-"]) {
  background-size: 14px 14px !important;
  background-repeat: no-repeat !important;
}

/* --- Status / action icons --------------------------------- */

/* check / accept — green */
body .icon-accept {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") !important;
}

/* X / delete — red */
body .icon-delete {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc2626' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='6' x2='6' y2='18'/><line x1='6' y1='6' x2='18' y2='18'/></svg>") !important;
}

/* plus / add — blue */
body .icon-add {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='12' y1='5' x2='12' y2='19'/><line x1='5' y1='12' x2='19' y2='12'/></svg>") !important;
}

/* save / disk — slate */
body .icon-disk {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z'/><polyline points='17 21 17 13 7 13 7 21'/><polyline points='7 3 7 8 15 8'/></svg>") !important;
}

/* lock — amber, used in the login dialog header */
body .icon-lock {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d97706' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='11' width='18' height='11' rx='2' ry='2'/><path d='M7 11V7a5 5 0 0 1 10 0v4'/></svg>") !important;
}

/* printer */
body .icon-print {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 6 2 18 2 18 9'/><path d='M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2'/><rect x='6' y='14' width='12' height='8'/></svg>") !important;
}

/* book — handbook / docs */
body .icon-book {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M4 19.5A2.5 2.5 0 0 1 6.5 17H20'/><path d='M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z'/></svg>") !important;
}

/* help / handbuch — blue help bubble */
body .icon-handbuch {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3'/><line x1='12' y1='17' x2='12.01' y2='17'/></svg>") !important;
}

/* paragraph (used in some message dialogs) */
body .icon-paragraph {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M13 4v16'/><path d='M17 4v16'/><path d='M19 4H9.5a4.5 4.5 0 0 0 0 9H13'/></svg>") !important;
}

/* chart / diagram */
body .icon-diagramm {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='20' x2='18' y2='10'/><line x1='12' y1='20' x2='12' y2='4'/><line x1='6' y1='20' x2='6' y2='14'/></svg>") !important;
}

/* --- People icons ------------------------------------------ */

body .icon-user,
body .icon-anonym {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'/><circle cx='12' cy='7' r='4'/></svg>") !important;
}

body .icon-users,
body .icon-usertab {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2'/><circle cx='9' cy='7' r='4'/><path d='M23 21v-2a4 4 0 0 0-3-3.87'/><path d='M16 3.13a4 4 0 0 1 0 7.75'/></svg>") !important;
}

body .icon-user-edit {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2'/><circle cx='9' cy='7' r='4'/><path d='M18.5 4.5a2.121 2.121 0 0 1 3 3L17 12l-4 1 1-4 4.5-4.5z'/></svg>") !important;
}

/* --- Edit / pencil ----------------------------------------- */

body .icon-editPen,
body .icon-notebook_add {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 20h9'/><path d='M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z'/></svg>") !important;
}

/* --- Process / loader -------------------------------------- */

body .icon-process {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='23 4 23 10 17 10'/><polyline points='1 20 1 14 7 14'/><path d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10'/><path d='M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/></svg>") !important;
}

/* --- Database stack ---------------------------------------- */

body .icon-database,
body .icon-databasep,
body .icon-databasen {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><ellipse cx='12' cy='5' rx='9' ry='3'/><path d='M21 12c0 1.66-4 3-9 3s-9-1.34-9-3'/><path d='M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5'/></svg>") !important;
}

/* --- Documents / files ------------------------------------- */

body .icon-add_document {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/><polyline points='14 2 14 8 20 8'/><line x1='12' y1='18' x2='12' y2='12'/><line x1='9' y1='15' x2='15' y2='15'/></svg>") !important;
}

body .icon-add_folder {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z'/><line x1='12' y1='11' x2='12' y2='17'/><line x1='9' y1='14' x2='15' y2='14'/></svg>") !important;
}

/* --- Settings / gear --------------------------------------- */

body .icon-page_gear {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='3'/><path d='M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z'/></svg>") !important;
}

/* --- Computer / monitor ------------------------------------ */

body .icon-computerblack {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='3' width='20' height='14' rx='2' ry='2'/><line x1='8' y1='21' x2='16' y2='21'/><line x1='12' y1='17' x2='12' y2='21'/></svg>") !important;
}

/* --- Language flags ---------------------------------------- *
 * Replace the bitmap flag icons with simple glyphs. Anything
 * fancier (real flag artwork) would need either a vendored
 * SVG flag pack or a webfont, both out of scope. Use circled
 * country letters for instant recognisability without artwork.
 */
body .icon-de {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><circle cx='12' cy='12' r='10' fill='%23dc2626'/><text x='12' y='16' font-family='-apple-system,Segoe UI,Roboto,Arial,sans-serif' font-size='10' font-weight='700' fill='%23ffffff' text-anchor='middle'>DE</text></svg>") !important;
}
body .icon-en {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><circle cx='12' cy='12' r='10' fill='%231e4fc8'/><text x='12' y='16' font-family='-apple-system,Segoe UI,Roboto,Arial,sans-serif' font-size='10' font-weight='700' fill='%23ffffff' text-anchor='middle'>EN</text></svg>") !important;
}

/* --- File-format badges ------------------------------------ */

body .csv-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/><polyline points='14 2 14 8 20 8'/><text x='12' y='19' font-size='6' font-weight='700' stroke='none' fill='%2316a34a' text-anchor='middle'>CSV</text></svg>") !important;
}
body .xls-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/><polyline points='14 2 14 8 20 8'/><text x='12' y='19' font-size='6' font-weight='700' stroke='none' fill='%2316a34a' text-anchor='middle'>XLS</text></svg>") !important;
}

/* GWT-AF ships a second icon naming convention in
 * `gwtaf-images.css`: `.disk-icon`, `.delete-icon`, `.house-icon`,
 * etc. These bypass the app-level `.icon-*` rules above, so mirror
 * the same flat SVG vocabulary here. */
body .house-icon,
body .layout-icon,
body .cancel-icon,
body .bullet_go-icon,
body .search-icon,
body .edit-icon,
body .cross-icon,
body .disk-icon,
body .refresh-icon,
body .delete-icon,
body .new-icon,
body .beginedit-icon,
body .square-icon {
  background-position: center !important;
  background-repeat: no-repeat !important;
  background-size: 14px 14px !important;
}

/* Contextual icon placement.
 *
 * The generic `*-icon` rules above are fine for pure 16px icon
 * carriers, but Ext tabs and GWT-AF action rows put the icon class on
 * the same element that also contains text. Centering the SVG there
 * drops the icon under the label. In those contexts, force a left
 * gutter and align the icon to the text baseline. */
body .x-tab-strip .x-tab-with-icon span.x-tab-strip-text,
body .x-tab-strip span.x-tab-strip-text.house-icon,
body .x-tab-strip span.x-tab-strip-text.layout-icon,
body .x-tab-strip span.x-tab-strip-text.cancel-icon,
body .x-tab-strip span.x-tab-strip-text.cross-icon,
body .x-tab-strip span.x-tab-strip-text.disk-icon,
body .x-tab-strip span.x-tab-strip-text.delete-icon,
body .x-tab-strip span.x-tab-strip-text.new-icon,
body .x-tab-strip span.x-tab-strip-text.beginedit-icon,
body .x-tab-strip span.x-tab-strip-text.edit-icon {
  background-position: 0 50% !important;
  background-size: 13px 13px !important;
  padding-left: 18px !important;
}
body .x-tab-strip .x-tab-strip-closable span.x-tab-strip-text {
  padding-right: 12px !important;
}
body .gwtaf-action-item.gwtaf-action-item-icon,
body .gwtaf-action-item-multiline.gwtaf-action-item-icon,
body .gwtaf-action-item-icon.beginedit-icon,
body .gwtaf-action-item-icon.edit-icon,
body .gwtaf-action-item-icon.disk-icon,
body .gwtaf-action-item-icon.delete-icon,
body .gwtaf-action-item-icon.cancel-icon,
body .gwtaf-action-item-icon.cross-icon,
body .gwtaf-action-item-icon.refresh-icon,
body .gwtaf-action-item-icon.new-icon,
body .gwtaf-action-item-icon.search-icon {
  background-position: 3px 50% !important;
  background-size: 14px 14px !important;
  line-height: 16px !important;
  padding-left: 22px !important;
}

/* Home menu semantic icons.
 *
 * Most period action links are emitted as the same `beginedit-icon`, so
 * there is no semantic class to hook. Scope the row mapping to the stable
 * home menu columns instead: required data, base charging, secondary
 * charging, analyses, tools, benchmarking. Gap columns are the even
 * siblings in the same `.x-column-inner`, hence 1/3/5/7/9/11 below. */
body .x-column-inner > .x-panel.x-column:is(:nth-of-type(1), :nth-of-type(3), :nth-of-type(5), :nth-of-type(7), :nth-of-type(9), :nth-of-type(11)) tr > td > button.gwt-Button > .gwtaf-action-item-icon {
  background-image: var(--sac-menu-item-icon, url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 20h9'/><path d='M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z'/></svg>")) !important;
  background-position: 3px 50% !important;
  background-size: 14px 14px !important;
}

/* Required data. */
body .x-column-inner > .x-panel.x-column:nth-of-type(1) tr:nth-child(1) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2'/><circle cx='9' cy='7' r='4'/><path d='M23 21v-2a4 4 0 0 0-3-3.87'/><path d='M16 3.13a4 4 0 0 1 0 7.75'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(1) tr:nth-child(2) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M4 2h16v20l-3-2-3 2-3-2-3 2-4-2z'/><path d='M8 7h8'/><path d='M8 11h8'/><path d='M8 15h5'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(1) tr:nth-child(3) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d97706' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M3 21h18'/><path d='M5 21V7l8-4v18'/><path d='M19 21V11l-6-4'/><path d='M9 9v.01'/><path d='M9 13v.01'/><path d='M9 17v.01'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(1) tr:nth-child(4) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='3' width='7' height='7' rx='1'/><rect x='14' y='3' width='7' height='7' rx='1'/><rect x='3' y='14' width='7' height='7' rx='1'/><rect x='14' y='14' width='7' height='7' rx='1'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(1) tr:nth-child(5) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237c3aed' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21.21 15.89A10 10 0 1 1 8 2.83'/><path d='M22 12A10 10 0 0 0 12 2v10z'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(1) tr:nth-child(6) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230f766e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='18' cy='5' r='3'/><circle cx='6' cy='12' r='3'/><circle cx='18' cy='19' r='3'/><path d='M8.59 13.51l6.83 3.98'/><path d='M15.41 6.51 8.59 10.49'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(1) tr:nth-child(7) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M9 11l3 3L22 4'/><path d='M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11'/></svg>"); }

/* Base charging. */
body .x-column-inner > .x-panel.x-column:nth-of-type(3) tr:nth-child(1) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='4' y='2' width='16' height='20' rx='2'/><path d='M8 6h8'/><path d='M8 10h.01'/><path d='M12 10h.01'/><path d='M16 10h.01'/><path d='M8 14h.01'/><path d='M12 14h.01'/><path d='M16 14h.01'/><path d='M8 18h8'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(3) tr:nth-child(2) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='20' x2='18' y2='10'/><line x1='12' y1='20' x2='12' y2='4'/><line x1='6' y1='20' x2='6' y2='14'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(3) tr:nth-child(3) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d97706' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20.59 13.41 11 3H4v7l9.59 9.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82z'/><circle cx='7.5' cy='7.5' r='.5'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(3) tr:nth-child(4) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc2626' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><circle cx='12' cy='12' r='6'/><circle cx='12' cy='12' r='2'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(3) tr:nth-child(5) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/><polyline points='14 2 14 8 20 8'/><line x1='8' y1='13' x2='16' y2='13'/><line x1='8' y1='17' x2='16' y2='17'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(3) tr:nth-child(6) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 6 2 18 2 18 9'/><path d='M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2'/><rect x='6' y='14' width='12' height='8'/></svg>"); }

/* Secondary charging. */
body .x-column-inner > .x-panel.x-column:nth-of-type(5) tr:nth-child(1) > td > button.gwt-Button > .gwtaf-action-item-icon,
body .x-column-inner > .x-panel.x-column:nth-of-type(5) tr:nth-child(2) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237c3aed' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='3' width='18' height='18' rx='2'/><path d='M3 9h18'/><path d='M3 15h18'/><path d='M9 3v18'/><path d='M15 3v18'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(5) tr:nth-child(3) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='23 4 23 10 17 10'/><polyline points='1 20 1 14 7 14'/><path d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10'/><path d='M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(5) tr:nth-child(4) > td > button.gwt-Button > .gwtaf-action-item-icon,
body .x-column-inner > .x-panel.x-column:nth-of-type(5) tr:nth-child(5) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230f766e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M17 3l4 4-4 4'/><path d='M21 7H9'/><path d='M7 21l-4-4 4-4'/><path d='M3 17h12'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(5) tr:nth-child(6) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d97706' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20.59 13.41 11 3H4v7l9.59 9.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82z'/><path d='M8 8h.01'/><path d='M14 8l-4 8'/><path d='M16 15h.01'/></svg>"); }

/* Analyses + controlling. */
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(1) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polygon points='12 2 2 7 12 12 22 7 12 2'/><polyline points='2 17 12 22 22 17'/><polyline points='2 12 12 17 22 12'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(2) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M4 19.5A2.5 2.5 0 0 1 6.5 17H20'/><path d='M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(3) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230f766e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><polygon points='10 8 16 12 10 16 10 8'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(4) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237c3aed' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='20' x2='18' y2='10'/><line x1='12' y1='20' x2='12' y2='4'/><line x1='6' y1='20' x2='6' y2='14'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(5) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><ellipse cx='12' cy='5' rx='8' ry='3'/><path d='M4 5v6c0 1.66 3.58 3 8 3s8-1.34 8-3V5'/><path d='M4 11v6c0 1.66 3.58 3 8 3s8-1.34 8-3v-6'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(6) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2'/><circle cx='9' cy='7' r='4'/><path d='M23 21v-2a4 4 0 0 0-3-3.87'/><path d='M16 3.13a4 4 0 0 1 0 7.75'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(7) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc2626' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M16 3h5v5'/><path d='M4 20 21 3'/><path d='M21 16v5h-5'/><path d='M15 15l6 6'/><path d='M4 4l5 5'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(7) tr:nth-child(8) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 3v12'/><circle cx='18' cy='6' r='3'/><circle cx='6' cy='18' r='3'/><path d='M18 9a9 9 0 0 1-9 9'/></svg>"); }

/* Tools and benchmarking use dynamic row sets, so map common positions to
 * neutral operations instead of pretending the text is always identical. */
body .x-column-inner > .x-panel.x-column:nth-of-type(9) tr:nth-child(1) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc2626' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='3 6 5 6 21 6'/><path d='M19 6 18 20a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6'/><path d='M10 11v6'/><path d='M14 11v6'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(9) tr:nth-child(2) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20 6 9 17l-5-5'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(9) tr:nth-child(3) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='4' width='18' height='18' rx='2'/><path d='M16 2v4'/><path d='M8 2v4'/><path d='M3 10h18'/><path d='M12 14v4'/><path d='M10 16h4'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(9) tr:nth-child(4) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237c3aed' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='5' r='3'/><circle cx='6' cy='19' r='3'/><circle cx='18' cy='19' r='3'/><path d='M12 8v5'/><path d='M6 16l6-3 6 3'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(9) tr:nth-child(5) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230f766e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><ellipse cx='12' cy='5' rx='9' ry='3'/><path d='M21 12c0 1.66-4 3-9 3s-9-1.34-9-3'/><path d='M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(9) tr:nth-child(6) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d97706' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polygon points='13 2 3 14 12 14 11 22 21 10 12 10 13 2'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(11) tr:nth-child(1) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230f766e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/><polyline points='17 8 12 3 7 8'/><line x1='12' y1='3' x2='12' y2='15'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(11) tr:nth-child(2) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/><polyline points='7 10 12 15 17 10'/><line x1='12' y1='15' x2='12' y2='3'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(11) tr:nth-child(3) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M9 11l3 3L22 4'/><path d='M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(11) tr:nth-child(4) > td > button.gwt-Button > .gwtaf-action-item-icon,
body .x-column-inner > .x-panel.x-column:nth-of-type(11) tr:nth-child(5) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237c3aed' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='20' x2='18' y2='10'/><line x1='12' y1='20' x2='12' y2='4'/><line x1='6' y1='20' x2='6' y2='14'/></svg>"); }
body .x-column-inner > .x-panel.x-column:nth-of-type(11) tr:nth-child(6) > td > button.gwt-Button > .gwtaf-action-item-icon { --sac-menu-item-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316a34a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/><polyline points='14 2 14 8 20 8'/><path d='M12 18v-6'/><path d='M9 15h6'/></svg>"); }
body .house-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M3 11 12 3l9 8'/><path d='M5 10v10h14V10'/><path d='M9 20v-6h6v6'/></svg>") !important;
}
body .layout-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='3' width='18' height='18' rx='2'/><line x1='3' y1='9' x2='21' y2='9'/><line x1='9' y1='21' x2='9' y2='9'/></svg>") !important;
}
body .cancel-icon,
body .cross-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc2626' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='6' x2='6' y2='18'/><line x1='6' y1='6' x2='18' y2='18'/></svg>") !important;
}
body .delete-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc2626' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='3 6 5 6 21 6'/><path d='M19 6 18 20a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6'/><path d='M10 11v6'/><path d='M14 11v6'/><path d='M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2'/></svg>") !important;
}
body .bullet_go-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='5' y1='12' x2='19' y2='12'/><polyline points='12 5 19 12 12 19'/></svg>") !important;
}
body .search-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='11' cy='11' r='8'/><line x1='21' y1='21' x2='16.65' y2='16.65'/></svg>") !important;
}
body .edit-icon,
body .beginedit-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 20h9'/><path d='M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z'/></svg>") !important;
}
body .disk-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231f2933' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z'/><polyline points='17 21 17 13 7 13 7 21'/><polyline points='7 3 7 8 15 8'/></svg>") !important;
}
body .refresh-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='23 4 23 10 17 10'/><polyline points='1 20 1 14 7 14'/><path d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10'/><path d='M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/></svg>") !important;
}
body .new-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><line x1='12' y1='5' x2='12' y2='19'/><line x1='5' y1='12' x2='19' y2='12'/></svg>") !important;
}
body .square-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='5' y='5' width='14' height='14' rx='2'/></svg>") !important;
}

/* ============================================================
 * Ext chrome icons — combo trigger, tab close, panel tools,
 * tree expand/collapse glyphs.
 *
 * These are 9-slice or single-cell sprite images that bake
 * 2008-vintage "glassy" look (dark borders, drop shadows,
 * pixel-perfect 16×16 PNGs). Replaced with flat SVG glyphs.
 * ============================================================ */

/* Combo dropdown chevron — was sprite at
 * `images/default/form/trigger.gif`. Now a simple chevron-down. */
.x-form-trigger,
.x-form-arrow-trigger {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  cursor: pointer;
}
.x-form-trigger-over {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
}

/* Tab close X — was a tiny gradient sprite */
.x-tab-strip-close {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='6' x2='6' y2='18'/><line x1='6' y1='6' x2='18' y2='18'/></svg>") !important;
  background-size: 10px 10px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  opacity: .7;
}
.x-tab-strip-close:hover {
  opacity: 1;
}
/* Inactive tabs use a dark X (white wouldn't read on light bg) */
.x-tab-strip li:not(.x-tab-strip-active) .x-tab-strip-close {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='6' x2='6' y2='18'/><line x1='6' y1='6' x2='18' y2='18'/></svg>") !important;
}

/* Panel tools (collapse arrow, close X, refresh) in panel
 * headers and dialog title bars. The Ext sprite is at
 * `images/default/panel/tool-sprites.gif` — a single 60×135 px
 * sprite indexed by background-position. We replace with one
 * SVG per common variant. */
.x-tool {
  background-image: none !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  background-size: 12px 12px !important;
  opacity: .8;
}
.x-tool:hover {
  opacity: 1;
}

.x-tool-close {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='6' x2='6' y2='18'/><line x1='6' y1='6' x2='18' y2='18'/></svg>") !important;
}

.x-tool-toggle {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
}
/* When collapsed, point chevron the other way */
.x-panel-collapsed .x-tool-toggle {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
}

.x-tool-refresh {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='23 4 23 10 17 10'/><polyline points='1 20 1 14 7 14'/><path d='M3.51 9a9 9 0 0 1 14.85-3.36L23 10'/><path d='M1 14l4.64 4.36A9 9 0 0 0 20.49 15'/></svg>") !important;
}

.x-tool-maximize {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='15 3 21 3 21 9'/><polyline points='9 21 3 21 3 15'/><line x1='21' y1='3' x2='14' y2='10'/><line x1='3' y1='21' x2='10' y2='14'/></svg>") !important;
}
.x-tool-restore {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='4 14 10 14 10 20'/><polyline points='20 10 14 10 14 4'/><line x1='14' y1='10' x2='21' y2='3'/><line x1='3' y1='21' x2='10' y2='14'/></svg>") !important;
}

/* Tools rendered on light panel headers (rare) need dark glyphs */
.x-panel-header-light .x-tool,
.x-toolbar .x-tool {
  background-image: none !important;
}
.x-toolbar .x-tool-close {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='18' y1='6' x2='6' y2='18'/><line x1='6' y1='6' x2='18' y2='18'/></svg>") !important;
}

/* ============================================================
 * Tree expand/collapse glyphs and folder icons
 *
 * The Ext default tree uses GIF sprites with dotted "elbow"
 * connector lines plus +/- boxes — extremely 2008. Replace
 * +/- with chevrons (right when collapsed, down when
 * expanded) and hide the connector lines for a flat tree.
 * ============================================================ */

.x-tree-elbow,
.x-tree-elbow-end,
.x-tree-elbow-line {
  background-image: none !important;
}

/* Closed node — chevron-right */
.x-tree-elbow-plus,
.x-tree-elbow-end-plus {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  cursor: pointer;
}

/* Open node — chevron-down */
.x-tree-elbow-minus,
.x-tree-elbow-end-minus {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  cursor: pointer;
}

/* Folder & leaf icons — overrides the 2008 yellow folder.gif */
.x-tree-node-collapsed .x-tree-node-icon,
.x-tree-node-expanded .x-tree-node-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d97706' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z'/></svg>") !important;
  background-size: 14px 14px !important;
  background-repeat: no-repeat !important;
}

.x-tree-node-leaf .x-tree-node-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/><polyline points='14 2 14 8 20 8'/></svg>") !important;
  background-size: 14px 14px !important;
  background-repeat: no-repeat !important;
}

/* ============================================================
 * Final flatten pass — remaining sprite-based glass
 * ============================================================ */

/* Form text inputs had a faint inset gradient via
 * `images/default/form/text-bg.gif`. Already mostly nuked above
 * but a few subselectors slip through. Belt-and-braces:           */
.x-form-text,
.x-form-textarea,
.x-form-field,
.x-form-field-wrap,
.x-form-field-trigger-wrap,
.x-trigger-wrap-focus,
.x-trigger-wrap {
  background-image: none !important;
}

/* Grid sort indicator was an arrow GIF — replace with chevron */
.x-grid3-sort-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
  background-size: 10px 10px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
}
.sort-asc .x-grid3-sort-icon {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='18 15 12 9 6 15'/></svg>") !important;
}

/* Resize splitters between regions had a gradient — flatten */
.x-layout-split,
.x-layout-mini,
.x-layout-collapsed {
  background-image: none !important;
  background-color: var(--sac-border) !important;
}

/* Loading spinner backgrounds in trees/grids */
.x-tree-node-loading .x-tree-node-icon,
.x-grid-empty,
.loading-indicator {
  background-image: none !important;
}

/* ============================================================
 * Contrast fixes
 *
 * After the first round of repaint, several things still ended
 * up illegible because ext-all.css (which we do load) has
 * higher-specificity rules that bake legacy "blue on light blue"
 * combinations. Examples:
 *
 *   ext-all.css line 89:
 *     .x-tab-strip-active span.x-tab-strip-text {color:#15428b;...}
 *   ext-all.css line 365:
 *     .x-grid3-cell-text,.x-grid3-hd-text {color:black;}
 *   ext-all.css line 367:
 *     .x-grid3-hd-text {color:#15428b;}
 *
 * Our overlay's selectors had matching or lower specificity, so
 * even with !important the rules sometimes lost (or matched the
 * wrong element). All overrides below are deliberately selector-
 * heavy and !important so they win the cascade unconditionally.
 *
 * Same trick used for the .icon-* fight: if a rule needs
 * `(0,3,1)` specificity to beat `span.x-tab-strip-text`, we
 * write `body .x-tab-strip-active span.x-tab-strip-text` to
 * reach `(0,3,1)` and add !important on top. Cheap and reliable.
 * ============================================================ */

/* --- Active tab title text -----------------------------------
 *
 * The tab strip at the top of the content area uses a slate
 * background for the active tab (set above), but ext-all.css
 * forces `color:#15428b` (dark blue) on
 * `.x-tab-strip-active span.x-tab-strip-text` — which is dark
 * blue text on dark slate, unreadable. Force readable white. */
body .x-tab-strip-active span.x-tab-strip-text,
body .x-tab-strip li.x-tab-strip-active span.x-tab-strip-text,
body .x-tab-strip li.x-tab-strip-active a span,
body .x-tab-strip li.x-tab-strip-active a {
  color: var(--sac-text-on-accent) !important;
  font-weight: 600 !important;
}

/* Inactive tab text — keep dark on the light tab bg */
body .x-tab-strip li:not(.x-tab-strip-active) span.x-tab-strip-text {
  color: var(--sac-text) !important;
}
/* Hovered inactive tab — slightly accent */
body .x-tab-strip-over span.x-tab-strip-text {
  color: var(--sac-accent-strong) !important;
}

/* --- Toolbar text -------------------------------------------
 *
 * The footer (`GoeingFrame.createFooter`) is a `.x-toolbar` with
 * `ToolbarTextItem`s rendered as `<span class="ytb-text">`.
 * Without an explicit color, browsers inherit from the toolbar.
 * Pin it to dark on the light bg we paint above. Same for any
 * `<a>` inside (used for menu separators and right-aligned items). */
body .x-toolbar,
body .x-toolbar td,
body .x-toolbar span,
body .x-toolbar div,
body .x-toolbar label,
body .x-toolbar .ytb-text,
body .x-toolbar a,
body .x-toolbar a:link,
body .x-toolbar a:visited {
  color: var(--sac-text) !important;
}

/* The Menu button at the bottom-left of the footer renders the
 * label text inside `.x-btn-text`. Default Ext styling makes it
 * blend with the toolbar bg. Force readable text. */
body .x-toolbar .x-btn .x-btn-text,
body .x-toolbar button.x-btn-text {
  color: var(--sac-text) !important;
  font-weight: 500 !important;
}
body .x-toolbar .x-btn-over .x-btn-text {
  color: var(--sac-accent-strong) !important;
}

/* --- Grid header text ---------------------------------------
 *
 * ext-all.css line 367 sets `.x-grid3-hd-text { color:#15428b; }`
 * (no !important). Our header bg is slate, so dark blue on slate
 * is illegible. Force white at high specificity. */
body .x-grid3-hd-text,
body .x-grid3-hd-inner,
body .x-grid3-header .x-grid3-hd-text {
  color: var(--sac-text-on-accent) !important;
  font-weight: 600 !important;
}

/* --- Form item labels ---------------------------------------
 *
 * The `<label class="x-form-item-label">` next to every form
 * field (Global settings dialog, Client editor, etc.) gets no
 * explicit color and inherits a faint default. Force a clearly
 * legible dark color. */
body label.x-form-item-label,
body .x-form-item label,
body .x-form-item-label,
body .x-form-cb-label,
body .x-fieldset legend {
  color: var(--sac-text) !important;
  font-family: var(--sac-font) !important;
}
body .x-fieldset legend {
  font-weight: 600 !important;
}

/* Disabled form items: the default `color:gray` is too light on
 * a white field. Use a slightly darker muted color so disabled
 * fields are still readable while clearly distinct from active. */
body .x-item-disabled,
body .x-item-disabled *,
body .x-toolbar .x-item-disabled,
body .x-toolbar .x-item-disabled * {
  color: var(--sac-text-muted) !important;
  opacity: .85 !important;
}

/* --- GWT widgets / dialog labels ----------------------------
 *
 * The "Server session terminated" / "You are not logged in!" /
 * "The data could not be loaded." dialogs render the body text
 * with default browser color which can render too light on the
 * GWT dialog body's near-white panel. Pin to readable dark. */
body .gwt-DialogBox,
body .gwt-DialogBox td,
body .gwt-DialogBox div,
body .gwt-DialogBox label,
body .gwt-DialogBox span,
body .gwt-Label,
body .gwt-HTML {
  color: var(--sac-text) !important;
}
body .gwt-DialogBox .Caption,
body .gwt-DialogBox .Caption * {
  color: var(--sac-text-on-accent) !important;
}

/* --- Tree text ----------------------------------------------
 *
 * `.x-tree-node a span` is set to `color:black` in ext-all.css
 * which is OK against the white panel bg, but selected rows
 * paint our accent-soft (light blue) bg — black is fine on it,
 * but make selected rows extra clear with the accent color. */
body .x-tree-selected .x-tree-node-anchor span,
body .x-tree-selected a span {
  color: var(--sac-accent-strong) !important;
  font-weight: 600 !important;
}

/* --- Window header X close button --------------------------
 *
 * The close `[x]` on Ext window headers (e.g. "Server session
 * terminated") was only styled as `.x-tool-close { color:white }`
 * but the SVG glyph above carries its own white stroke — make
 * sure the surrounding hover area stays visible. */
body .x-window-header .x-tool,
body .x-window-tc .x-tool {
  filter: brightness(1.2);
}

/* --- Status icons (info/warning/error in dialogs) ----------
 *
 * Some dialogs use `.ext-mb-error`, `.ext-mb-warning`,
 * `.ext-mb-info`, `.ext-mb-question` to put a 32x32 icon next
 * to the message. The originals are 2008 PNGs — we don't bother
 * replacing them (they render once per dialog) but make sure
 * the message text next to them stays dark. */
body .ext-mb-text,
body .ext-mb-content,
body .x-window-body .ext-mb-text {
  color: var(--sac-text) !important;
  font-family: var(--sac-font) !important;
}

/* MessageBox status icons / details panel.
 *
 * ExtJS message boxes still use glossy 2008 `icon-error.gif`,
 * `icon-warning.gif`, `icon-info.gif`, and `icon-question.gif`
 * sprites via `.ext-mb-*`. Replace them with the same flat
 * stroke vocabulary used by the main `.icon-*` rules, and clean
 * up the boxed "Cause:" textarea used by login/service failures. */
body .x-window-dlg .ext-mb-icon {
  background-position: center !important;
  background-repeat: no-repeat !important;
  background-size: 32px 32px !important;
  height: 36px !important;
  margin-right: 12px !important;
  width: 40px !important;
}
body .x-window-dlg .ext-mb-error {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dc2626' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><line x1='15' y1='9' x2='9' y2='15'/><line x1='9' y1='9' x2='15' y2='15'/></svg>") !important;
}
body .x-window-dlg .ext-mb-warning {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23d97706' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><path d='M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/><line x1='12' y1='9' x2='12' y2='13'/><line x1='12' y1='17' x2='12.01' y2='17'/></svg>") !important;
}
body .x-window-dlg .ext-mb-info {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><line x1='12' y1='16' x2='12' y2='12'/><line x1='12' y1='8' x2='12.01' y2='8'/></svg>") !important;
}
body .x-window-dlg .ext-mb-question {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232563eb' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3'/><line x1='12' y1='17' x2='12.01' y2='17'/></svg>") !important;
}
body .x-window-dlg h2,
body .x-window-dlg .ext-mb-text {
  color: var(--sac-text) !important;
  font-size: 13px !important;
  line-height: 1.4 !important;
}
body .x-window-dlg h2 {
  font-weight: 600 !important;
  margin: 8px 0 6px !important;
}
body .x-window-dlg .ext-mb-textarea,
body .x-window-dlg textarea.ext-mb-textarea {
  background: var(--sac-bg-soft) !important;
  border: 1px solid var(--sac-border) !important;
  border-radius: var(--sac-radius-sm) !important;
  box-sizing: border-box !important;
  color: var(--sac-text-muted) !important;
  font-family: var(--sac-font) !important;
  line-height: 1.35 !important;
  padding: 8px !important;
  width: 100% !important;
}

/* ============================================================
 * Padding / margin / stray-line cleanup
 *
 * Several visible artefacts after the slate repaint come not
 * from missing color rules but from `ext-all.css`'s leftover
 * decorative borders and padding that were designed for the
 * 2008 indigo theme and look broken on a flat slate look:
 *
 *   ext-all.css line 68:
 *     .x-tab-panel-header,.x-tab-panel-footer {
 *       background:#deecfd;border:1px solid #8db2e3; ...
 *     }
 *   ext-all.css line 69:
 *     .x-tab-panel-header { ...padding-bottom:2px; }
 *   ext-all.css line 77:
 *     .x-tab-panel-header-plain .x-tab-strip-spacer {
 *       border:1px solid #8db2e3; height:2px; background:#deecfd;
 *     }
 *   ext-all.css line 646-648:
 *     .x-panel-bbar .x-toolbar,
 *     .x-panel-tbar .x-toolbar {
 *       border:1px solid #99bbe8; padding:2px;
 *     }
 *
 * Each of these renders as a thin blue/grey line on top of our
 * white panel bg, and on a 4K monitor they read as "the layout
 * has loose seams". Override:
 * ============================================================ */

/* Kill the residual blue tab-strip frame + spacer.
 * The tab strip was originally drawn as a `#deecfd` panel with
 * a 1px `#8db2e3` border and a 2px decorative spacer below the
 * tabs. On the flat layout we want a single hairline at the
 * bottom of the strip and nothing else. */
body .x-tab-panel-header,
body .x-tab-panel-footer {
  background: transparent !important;
  background-image: none !important;
  border: none !important;
  padding-bottom: 0 !important;
  border-bottom: 1px solid var(--sac-border) !important;
}

/* The 2-3px decorative spacer that used to sit *below* the
 * active tab (carrying the indigo gradient continuation). On
 * the slate look it shows up as a stray blue stripe. Hide. */
body .x-tab-strip-spacer,
body .x-tab-panel-header-plain .x-tab-strip-spacer,
body .ext-border-box .x-tab-panel-header-plain .x-tab-strip-spacer {
  background: transparent !important;
  background-image: none !important;
  border: none !important;
  height: 0 !important;
  font-size: 0 !important;
  line-height: 0 !important;
}

/* Toolbars docked to a panel as top-bar (`.x-panel-tbar`) or
 * bottom-bar (`.x-panel-bbar`) had a 1px `#99bbe8` indigo
 * border. On our light toolbar bg this reads as a stray blue
 * frame around every grid pager, every dialog action row, and
 * the application footer. Replace with our muted neutral. */
body .x-panel-bbar .x-toolbar,
body .x-panel-tbar .x-toolbar,
body .x-panel-tbar-noheader .x-toolbar,
body .x-tab-panel-bbar .x-toolbar,
body .x-tab-panel-tbar .x-toolbar {
  border-color: var(--sac-border) !important;
}
/* The same selectors but for the noborder variants — keep them
 * borderless instead of falling back to the indigo line. */
body .x-panel-noborder .x-panel-tbar-noborder .x-toolbar,
body .x-panel-noborder .x-panel-bbar-noborder .x-toolbar,
body .x-tab-panel-bbar-noborder .x-toolbar,
body .x-tab-panel-tbar-noborder .x-toolbar {
  border-color: var(--sac-border) !important;
}

/* Footer toolbar: the application's bottom strip needs a clean
 * 1px top border so it visually separates from content above
 * (and nothing else — no side or bottom border, no shadow). */
body .x-toolbar {
  border-left: none !important;
  border-right: none !important;
  border-bottom: none !important;
}

/* Active tab vertical alignment.
 *
 * `ext-all.css:94`: `.x-tab-strip-top .x-tab-strip-active
 * .x-tab-right { margin-bottom:-1px; }` is what makes the
 * active tab "merge" with the panel below by overhanging 1px
 * past the tab strip's bottom border. With our flat
 * border-bottom the overhang produces a 1px-tall fragment of
 * tab background sticking past the line. Reset. */
body .x-tab-strip-top .x-tab-strip-active .x-tab-right,
body .x-tab-strip-top .x-tab-strip-active .x-tab-left {
  margin-bottom: 0 !important;
}

/* Tree expand glyphs in column-trees and grid-trees.
 *
 * The Cost-drivers/services panel in the Employee scheduling
 * editor renders a *column tree* (gwtaf), where each parent
 * row carries a `.x-tree-elbow-plus`/`-minus`. ext-all.css
 * scopes its sprite background under three modes:
 *
 *   .x-tree-lines      .x-tree-elbow-plus { ... }   (0,2,0)
 *   .x-tree-no-lines   .x-tree-elbow-plus { ... }   (0,2,0)
 *   .x-tree-arrows     .x-tree-elbow-plus { ... }   (0,2,0)
 *
 * Our previous rule `.x-tree-elbow-plus { ... }` is `(0,1,0)`
 * and lost the cascade for trees rendered in any of the three
 * configured modes (the tree-path tree on the left was fine
 * because it doesn't carry the wrapper class, but the column
 * tree does). Match the same selector depth + add `body `. */
body .x-tree-lines .x-tree-elbow-plus,
body .x-tree-no-lines .x-tree-elbow-plus,
body .x-tree-arrows .x-tree-elbow-plus,
body .x-tree-lines .x-tree-elbow-end-plus,
body .x-tree-no-lines .x-tree-elbow-end-plus,
body .x-tree-arrows .x-tree-elbow-end-plus {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  cursor: pointer;
}
body .x-tree-lines .x-tree-elbow-minus,
body .x-tree-no-lines .x-tree-elbow-minus,
body .x-tree-arrows .x-tree-elbow-minus,
body .x-tree-lines .x-tree-elbow-end-minus,
body .x-tree-no-lines .x-tree-elbow-end-minus,
body .x-tree-arrows .x-tree-elbow-end-minus {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  cursor: pointer;
}
/* Hide the "elbow" connector line (vertical/horizontal dotted
 * grey lines linking parent to child in `.x-tree-lines` mode). */
body .x-tree-lines .x-tree-elbow,
body .x-tree-lines .x-tree-elbow-end,
body .x-tree-lines .x-tree-elbow-line,
body .x-tree-no-lines .x-tree-elbow,
body .x-tree-no-lines .x-tree-elbow-end,
body .x-tree-no-lines .x-tree-elbow-line {
  background-image: none !important;
}

/* Grid panel: ext-all sets `.x-grid-group-hd { border-bottom:
 * 2px solid #99bbe8; }`. Replace with our muted neutral
 * 1px so grouped grids look the same as non-grouped ones. */
body .x-grid-group-hd {
  border-bottom: 1px solid var(--sac-border) !important;
}

/* Column-tree headers had their own 1px `#eee` left border
 * and `#d0d0d0` right border (column-tree.css:57-58) that
 * showed as faint vertical gridlines. Use our standard border. */
body .x-tree-hd {
  border-left: 1px solid var(--sac-border) !important;
  border-right: 1px solid var(--sac-border) !important;
}

/* Splitbar (between accordion panels / between west and
 * center regions) had a default `#aaa` background. Use the
 * border color so it reads as a line instead of a bar. */
body .x-splitbar,
body .x-splitbar-h,
body .x-splitbar-v,
body .x-layout-split-h,
body .x-layout-split-v,
body .x-layout-split {
  background: var(--sac-border) !important;
  background-image: none !important;
}

/* Window/Dialog: kill the 5px solid `#D0E4F6` *top* border
 * that `goeing.css` puts on `.gwt-DialogBox .Caption`. It
 * adds a stripe of light blue above our slate header.
 *   goeing.css line ~140:
 *     .gwt-DialogBox .Caption { ...border-top:5px solid
 *     #D0E4F6; ... }
 */
body .gwt-DialogBox .Caption {
  border-top: none !important;
  border-bottom: none !important;
  background-image: none !important;
}

/* Custom gwt-util tree glyphs.
 *
 * `gwtutil.css` defines its OWN tree-plus / tree-minus / folder
 * / folder-open / leaf classes for the column-tree grid (used
 * by the Cost-drivers/services panel and a few others). These
 * are *not* the standard `.x-tree-*` classes, so our earlier
 * `body .x-tree-elbow-plus` overrides never matched them. They
 * still render as the 2008 `elbow-plus-nl.gif` boxed-plus.
 *
 * Replace with the same chevron + folder vocabulary used
 * everywhere else.
 *
 * gwtutil.css uses `padding-left:20px` and `background-
 * position:left center` to put the icon to the left of the
 * row text. Keep the position; only swap the image. */
body .gwtutil-tree-plus {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: 4px center !important;
  background-repeat: no-repeat !important;
}
body .gwtutil-tree-minus {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: 4px center !important;
  background-repeat: no-repeat !important;
}
body .gwtutil-folder {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23d97757' stroke='%23a0522d' stroke-width='1' stroke-linejoin='round'><path d='M2 6a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z'/></svg>") !important;
  background-size: 14px 14px !important;
  background-position: 2px center !important;
  background-repeat: no-repeat !important;
}
body .gwtutil-folder-open {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23f4a460' stroke='%23a0522d' stroke-width='1' stroke-linejoin='round'><path d='M2 6a2 2 0 0 1 2-2h5l2 2h7a2 2 0 0 1 2 2H2zM2 8h20l-2 9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2z'/></svg>") !important;
  background-size: 14px 14px !important;
  background-position: 2px center !important;
  background-repeat: no-repeat !important;
}
body .gwtutil-leaf {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2352606d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/><polyline points='14 2 14 8 20 8'/></svg>") !important;
  background-size: 12px 12px !important;
  background-position: 3px center !important;
  background-repeat: no-repeat !important;
}

/* GWT-native TabPanel / TabBar (separate from ExtJS .x-tab-strip).
 *
 * The "Create new Useraccount" dialog and a few other gwt-DialogBox
 * forms use GWT's own `gwt-TabPanel` / `gwt-DecoratedTabBar`
 * widgets (defined in `goeing/gwt/standard/standard.css:796-907`)
 * — NOT ExtJS's `.x-tab-strip`. Their default look is the 2008
 * GWT "decorated" theme: `#d0e4f6` light blue tabs, `#92c1f0`
 * medium blue active tab, and a 3px `#92c1f0` border around the
 * content area (`.gwt-TabPanelBottom`).
 *
 * On the slate dialog header above and white form area below
 * this looks like a foreign blue rectangle pasted into the
 * dialog. Repaint to match the rest of the UI.
 *
 * The `corner.png` rounded-corner sprite for the
 * `.gwt-DecoratedTabBar` rounded-tab corners is also nulled
 * (we go flat, not rounded). */

/* Inactive tab */
body .gwt-TabBar .gwt-TabBarItem,
body .gwt-DecoratedTabBar .gwt-TabBarItem .tabTopCenter,
body .gwt-DecoratedTabBar .gwt-TabBarItem .tabMiddleLeft,
body .gwt-DecoratedTabBar .gwt-TabBarItem .tabMiddleRight,
body .gwt-DecoratedTabBar .gwt-TabBarItem .tabMiddleCenter {
  background: var(--sac-bg-soft) !important;
  background-image: none !important;
  color: var(--sac-text) !important;
  font-weight: 500 !important;
}

/* Active tab */
body .gwt-TabBar .gwt-TabBarItem-selected,
body .gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopCenter,
body .gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleLeft,
body .gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleRight,
body .gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabMiddleCenter {
  background: var(--sac-header-bg) !important;
  background-image: none !important;
  color: var(--sac-text-on-accent) !important;
  font-weight: 600 !important;
}

/* Hide the rounded-corner sprite (we go flat) */
body .gwt-DecoratedTabBar .tabTopLeft,
body .gwt-DecoratedTabBar .tabTopRight,
body .gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopLeft,
body .gwt-DecoratedTabBar .gwt-TabBarItem-selected .tabTopRight {
  background-image: none !important;
}

/* The content area below the tab bar.
 *
 * standard.css:823 sets `border:3px 2px 2px solid #92c1f0`
 * (medium blue, 3px on top, 2px on sides/bottom) plus 6px
 * padding. The 3px top is what reads as a "blue strip
 * connecting the tabs to the form" — kill the border, keep
 * the padding so form fields don't sit flush against the
 * tab bar. */
body .gwt-TabPanelBottom {
  border-top: 1px solid var(--sac-border) !important;
  border-left: none !important;
  border-right: none !important;
  border-bottom: none !important;
  background: transparent !important;
}

/* GWT dialog body content padding.
 *
 * `.gwt-DialogBox .dialogContent` (or `.dialogMiddleCenter`)
 * has zero padding by default, so form labels/inputs sit
 * flush against the slate header and the white edges. Add
 * a comfortable 12px on all sides so dialogs read as proper
 * cards, not "form glued to a header". */
body .gwt-DialogBox .dialogContent,
body .gwt-DialogBox .dialogMiddleCenter,
body .gwt-DialogBox > tbody > tr > td.dialogMiddleCenter {
  padding: 12px !important;
}

/* ExtJS .x-shadow drop shadow.
 *
 * `ext-all.css:44-58` builds a 9-slice drop shadow under
 * every floating panel/window from `shadow.png`,
 * `shadow-lr.png`, `shadow-c.png` sprites:
 *
 *     xstl xstc xstr   (top-left / top-center / top-right strip)
 *     xsml xsmc xsmr   (middle-left / center / middle-right strip)
 *     xsbl xsbc xsbr   (bottom-left / bottom-center / bottom-right)
 *
 * This is a 2008-style fuzzy gray gif shadow positioned 4-6px
 * outside the window edges. With our crisp `box-shadow` on
 * `.x-window` (and on `.gwt-DialogBox`) the old sprite shadow
 * is now visible as a *colored vertical strip* hugging the
 * left and right edges of any floating dialog. Hide the
 * sprite shadow entirely; the modern `box-shadow` is enough. */
body .x-shadow,
body .x-shadow * {
  background-image: none !important;
  background: transparent !important;
}
body .x-shadow {
  display: none !important;
}

/* ExtJS window 9-slice frame sprites.
 *
 * `.x-window` is rendered as a 3x3 sprite frame:
 *
 *     tl tc tr     (top-left / top-center / top-right)
 *     ml mc mr     (middle-left / middle-center / middle-right)
 *     bl bc br     (bottom-left / bottom-center / bottom-right)
 *
 * `xtheme-slate.css:308-335` paints these with PNG sprites
 * (`left-right.png`, `top-bottom.png`, `left-corners.png`,
 * `right-corners.png`) and gives `.x-window-mc` a `1px solid
 * #abc` light-blue border. On the modern slate header +
 * shadowed-card look those blue sprites read as a faint
 * vertical stripe glued to the left edge of the dialog body
 * (and a matching one on the right) plus a 1px periwinkle
 * frame around the body. Null them — `.x-window` already
 * carries our shadow + border-radius from the panel pass. */
body .x-window-tl,
body .x-window-tc,
body .x-window-tr,
body .x-window-ml,
body .x-window-mr,
body .x-window-bl,
body .x-window-bc,
body .x-window-br {
  background-image: none !important;
}
body .x-window-mc,
body .x-window-plain .x-window-mc,
body div.x-window-mc,
html body div.x-window-mc {
  border: 0 none !important;
  border-width: 0 !important;
  border-style: none !important;
  background: var(--sac-bg-panel) !important;
  background-image: none !important;
}
body .x-window-body,
body .x-window-plain .x-window-body,
body .x-window-dlg .x-window-body {
  border: 0 none !important;
  border-width: 0 !important;
  background: transparent !important;
}
/* Brutal: every direct child of .x-window gets stripped of its border
 * and sprite background, regardless of which 9-slice cell it is. */
body .x-window > div,
body .x-window > div > div,
body .x-window > div > div > div {
  background-image: none !important;
}
body .x-window-ml,
body .x-window-mr,
body div.x-window-ml,
body div.x-window-mr {
  border: 0 none !important;
  background: transparent !important;
  background-image: none !important;
  width: 0 !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}
body.x-body-masked .x-window-mc,
body.x-body-masked .x-window-plain .x-window-mc {
  background: var(--sac-bg-panel) !important;
}

/* ExtJS resizable window handle visibility.
 *
 * `.x-resizable-handle` is the 6px-wide invisible drag area
 * around an `.x-window`. ExtJS reveals it on hover via
 * `.x-resizable-over`, and `xtheme-slate.css:603-626` paints
 * a light blue `e-handle.gif` / `s-handle.gif` etc. as the
 * "you can resize me" affordance.
 *
 * On the slate header + clean white body those gifs read as
 * a faint blue stripe glued to the left/right/top/bottom
 * edge of the dialog body — visible even in screenshots
 * (see the vertical stripe on the login dialog). The native
 * cursor change is enough of an affordance; null the sprite
 * so the area stays draggable but invisible. */
body .x-resizable-handle,
body .x-resizable-handle-east,
body .x-resizable-handle-west,
body .x-resizable-handle-north,
body .x-resizable-handle-south,
body .x-resizable-handle-northeast,
body .x-resizable-handle-northwest,
body .x-resizable-handle-southeast,
body .x-resizable-handle-southwest,
body .x-resizable-over .x-resizable-handle,
body .x-resizable-pinned .x-resizable-handle {
  background-image: none !important;
  background-color: transparent !important;
  visibility: hidden !important;
}

/* GWT dialog 9-slice border sprite nullification.
 *
 * `standard.css:133-176` paints the dialog edges as a 9-slice
 * with `vborder.png` (left/right edges), `hborder.png` (bottom
 * edge), and `corner.png` (4 corners). On the slate-header +
 * box-shadow look these sprites read as a fuzzy 2008 frame
 * around an otherwise clean card. Null them — the
 * `.gwt-DialogBox`-level `border-radius` + `box-shadow` we
 * already set provide the visual frame. */
body .gwt-DialogBox .dialogMiddleLeft,
body .gwt-DialogBox .dialogMiddleRight,
body .gwt-DialogBox .dialogBottomCenter,
body .gwt-DialogBox .dialogBottomLeft,
body .gwt-DialogBox .dialogBottomRight,
body .gwt-DialogBox .dialogTopLeft,
body .gwt-DialogBox .dialogTopRight {
  background: transparent !important;
  background-image: none !important;
}
