/* Hero BI dark theme — "Command deck", RESIDUAL layer for Superset 6.1.
 *
 * Since the 6.1 upgrade the dark chrome comes from THEME_DEFAULT's AntD-v5
 * tokens in superset_config.py (algorithm:"dark" + the full Command-deck
 * surface palette). This file covers ONLY what tokens cannot reach:
 *   - FAB Bootstrap-3 admin pages + select2 (server-rendered, not AntD)
 *   - ACE editor (ships a light theme), nvd3/d3 SVG text, DataTables, pivot
 *   - brand gradients (reserved for CTAs/accents — tokens are flat colors)
 *   - the classic branded login card (rendered only when
 *     SUPERSET_CLASSIC_LOGIN=1 flips register_superset_auth_view off)
 * Pruned 2026-08-10 from the 4.1.2-era 970-line file: the ~240 AntD-v4
 * chrome clauses are now redundant under the token algorithm (6 were dead —
 * v5 removed .ant-popover-inner-content / arrow-content nodes). History of
 * the dropped rules: git log of this file; finding ids (P0-x/P1-x/P2-x) refer
 * to docs/bi-review-20260801/design-review-live.md.
 *
 * Served at /static/assets/hero/hero_dark.css via tail_js_custom_extra.html —
 * BUMP THE ?v= CACHE-BUSTER there (and in login_oauth.html) on every change.
 *
 * Palette: page #0b0b0d · chrome #0e0e11 · card #141418 · hover #1d1d22
 * inner #0f0f13 · border #1e1e23 / #26262c · fg #FAFAFA / #C9C9CF / #8A8A93
 * brand #7A05C6 #D80073 #A30DFF #C98BFF
 */

@font-face {
  font-family: "Montserrat";
  src: url("/static/assets/hero/fonts/montserrat-var.woff2") format("woff2");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

/* --------------------------------------------------- brand logo cap (P0)
 * The 6.1 SPA sizes the navbar logo from the brandLogoHeight token (fixed in
 * superset_config.py). This is belt-and-braces so the 1210x349 wordmark can
 * NEVER render at native size again (the regression that blew up the top nav
 * on every SPA page). alt="Hero Seguros" comes from the brandLogoAlt token;
 * the FAB navbar logo is separately capped by APP_ICON_WIDTH and unaffected. */
img[alt="Hero Seguros"] {
  height: 28px !important;
  width: auto !important;
  max-width: 150px !important;
}

/* ---------------------------------------- native filter date-picker (P0)
 * The native filter TIME-RANGE calendar is click-dead (found 2026-08-10 via
 * live headless): when the antd date/time picker opens INSIDE the filter
 * popover, antd v5 leaves pointer-events:none on the .ant-picker-dropdown
 * container (a nested-popup motion state), so every day/time cell swallows
 * clicks — users report "I cannot select a date". Restore interactivity on
 * the OPEN dropdown only (leave the closing/-hidden state alone so a fading
 * calendar doesn't eat a stray click). Confirmed: after this, clicking a day
 * updates the range. Applies to the picker everywhere it renders. */
.ant-picker-dropdown:not(.ant-picker-dropdown-hidden),
.ant-picker-dropdown:not(.ant-picker-dropdown-hidden) * {
  pointer-events: auto !important;
}

/* ---------------------------------------------------------------- base
 * Mostly for the FAB pages (no AntD theme there); on the SPA these agree
 * with the tokens, so they are harmless belt-and-braces. Emoji families in
 * the stack: markdown emoji rendered as tofu without them (P3-26). */

body {
  background: #0b0b0d !important;
  color: #fafafa;
  font-family: "Montserrat", "Segoe UI", system-ui, -apple-system,
    "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif !important;
}
h1, h2, h3, h4, h5, h6 { color: #fafafa; font-weight: 600; }
/* Global link tint (FAB pages have no token engine). The two rules further
 * down (chart titles, list names) deliberately re-override to #fafafa. */
a { color: #c98bff !important; }
a:hover { color: #a30dff !important; }

::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: #0b0b0d; }
::-webkit-scrollbar-thumb { background: #26262c; border-radius: 6px; }
::-webkit-scrollbar-thumb:hover { background: #33333a; }

/* -------------------------------------------------- brand accents (SPA)
 * Gradients are the one brand element flat tokens can't express — the
 * magenta→purple gradient is reserved for CTAs (docs/BRAND.md). Selector
 * list covers every primary-button spelling Superset uses (P0-1: its own
 * Button carries superset-button-primary but NOT ant-btn-primary). */

.ant-btn.superset-button-primary,
.superset-button.superset-button-primary:not(.superset-button-link),
.ant-btn-primary {
  background-image: linear-gradient(135deg, #d80073 0%, #7a05c6 80%) !important;
  background-color: #7a05c6 !important;   /* fallback so it never goes flat-card */
  border: none !important;
  border-radius: 9px !important;
  color: #fff !important;
  box-shadow: 0 8px 22px -8px rgba(122, 5, 198, 0.75);
  font-weight: 600;
}
.ant-btn-primary:hover { filter: brightness(1.05); }
.ant-btn-primary:active { transform: scale(0.97); }
/* sentence case, not shouting (P2-20) */
.superset-button, .ant-btn { text-transform: none !important; letter-spacing: 0 !important; }
/* active-tab underline carries the brand gradient */
.ant-tabs-ink-bar { background: linear-gradient(90deg, #d80073, #7a05c6) !important; height: 2px !important; }

/* -------------------------------------------- chart plugin DOM (not AntD)
 * Big-number, table charts, pivot: these plugins render their own DOM with
 * plugin CSS, outside the token engine. */

.superset-legacy-chart-big-number .header-line,
.header-line, [data-test="chart-container"] .header-line {
  color: #fafafa !important;
  font-weight: 700 !important;
  letter-spacing: -0.02em;
}
/* pinned type scale (P2-24) + ellipsis instead of mid-digit clipping (P0-8;
 * the durable fix is D3_FORMAT in superset_config.py) */
.superset-legacy-chart-big-number .header-line, .header-line {
  max-width: 100% !important; overflow: hidden !important; text-overflow: ellipsis !important;
  white-space: nowrap !important; padding-right: 8px !important;
  font-size: clamp(26px, 3.2vw, 34px) !important;
}
.superset-legacy-chart-big-number .subheader-line,
.subheader-line { color: #8a8a93 !important; font-size: 12px !important; font-weight: 500 !important; }

/* dashboard chart tiles keep the bordered-card identity (12px radius) */
.dashboard-component-chart-holder, .dashboard-component.dashboard-component-chart-holder {
  background: #141418 !important;
  border: 1px solid #26262c !important;
  border-radius: 12px !important;
}
/* chart titles are <a> — they must read as titles, not links (see global a) */
.dashboard-component-chart-holder .header-title a,
.dashboard-component-chart-holder .header-title span {
  color: #fafafa !important;
  font-size: 14.5px;
  font-weight: 600;
}
/* list-view entity names likewise (P1-14) */
.ant-table-tbody > tr > td a, .table > tbody > tr > td a:first-child,
[class*="TableView"] tbody tr td:nth-child(2) a { color: #fafafa !important; font-weight: 600 !important; }
[class*="TableView"] tbody tr td a:hover { color: #c98bff !important; }

/* DOM table charts */
[data-test="chart-container"] table, .table-chart-container table {
  color: #c9c9cf !important;
  background: transparent !important;
}
[data-test="chart-container"] table td { border-color: #1e1e23 !important; }
/* .echarts-tooltip bg/text now come from the AntD tokens (Echart.tsx baseTheme:
 * backgroundColor=colorBgContainer, textStyle=colorText) and its hairline border
 * from echartsOptionsOverrides.tooltip in superset_config.py — so the ECharts
 * tooltip is themed natively. Only the legacy `.chart-tooltip` (non-ECharts
 * engines) still needs the DOM rule. */
.chart-tooltip { background: #141418 !important; color: #fafafa !important; border-color: #26262c !important; }

/* one head treatment across every table style — ant, FAB, chart, pivot
 * (P2-25: three coexisting head styles read as three products) */
.ant-table-thead > tr > th, .table > thead > tr > th, .table-chart-container thead th, .pvtTable th {
  background: #0f0f13 !important;
  color: #8a8a93 !important;
  font-size: 10.5px !important;
  text-transform: uppercase !important;
  letter-spacing: 0.1em !important;
  border-bottom: 1px solid #1e1e23 !important;
}

/* pivot tables (pivot_table_v2) — NOT scoped under the chart container: on
 * dashboards .pvtTable renders OUTSIDE it (verified headless 2026-07-26).
 * The plugin's emotion CSS paints brand purple/near-black cells otherwise. */
.pvtTable { background: transparent !important; color: #c9c9cf !important; }
.pvtTable th { background: #0f0f13 !important; color: #8a8a93 !important; border-color: #1e1e23 !important; }
.pvtTable th.pvtRowLabel, .pvtTable th.pvtColLabel { color: #c9c9cf !important; }
.pvtTable td { border-color: #1e1e23 !important; color: #e8e8ee !important; }
.pvtTable td.pvtTotal, .pvtTable td.pvtGrandTotal,
.pvtTable th.pvtTotalLabel { color: #fafafa !important; font-weight: 600 !important; }
.pvtTable th *, .pvtTable td * { color: inherit !important; background: transparent !important; }
.pvtTable .hoverable:hover { background: #1d1d22 !important; }
.pvtTable, .superset-pivot-table, [class*="pivot"] > div { overflow-x: auto !important; }

/* legacy (nvd3/d3) charts — SVG text nodes, invisible to the token engine
 * (P0-3; verified selectors: plain g.tick, .slice_container > svg) */
.slice_container svg text,
.dashboard-component-chart-holder .chart-container svg text {
  fill: #c9c9cf !important; color: #c9c9cf !important;
}
.slice_container svg g.tick text { fill: #8a8a93 !important; }
.slice_container svg g.tick line,
.slice_container svg line,
.slice_container svg path.domain {
  stroke: #1e1e23 !important; stroke-opacity: 1 !important;
}
.slice_container svg .domain { stroke: #26262c !important; }

/* legacy table-chart toolbars + native <select> (P0-7) */
.dt-select-page-size, .dt-global-filter,
.dataTables_wrapper label, .dataTables_length, .dataTables_filter, .dataTables_info {
  color: #8a8a93 !important;
}
.dt-select-page-size select, .dataTables_wrapper select, .table-chart-container select, select {
  background: #0f0f13 !important; color: #fafafa !important;
  border: 1px solid #26262c !important; border-radius: 8px !important; padding: 2px 6px !important;
}
.dt-global-filter input, .dataTables_filter input {
  background: #0f0f13 !important; color: #fafafa !important;
  border: 1px solid #26262c !important; border-radius: 8px !important;
}
.dt-global-filter input::placeholder { color: #5b5b63 !important; }

/* dashboard markdown — Superset-specific treatments (P0-5, P1-17) */
.dashboard-markdown, .dashboard-markdown * { color: #c9c9cf; }
.dashboard-markdown h1, .dashboard-markdown h2, .dashboard-markdown h3,
.dashboard-markdown strong { color: #fafafa; }
.dashboard-markdown code, .dashboard-markdown pre, .dashboard-markdown kbd {
  background: #0f0f13 !important;
  color: #c98bff !important;
  border: 1px solid #26262c !important;
  border-radius: 6px !important;
  padding: 1px 5px !important;
  font-size: .92em !important;
}
.dashboard-markdown pre { padding: 10px 12px !important; overflow-x: auto !important; }
/* blockquote = the estate's "⚠ Atenção" callout → semantic-warning treatment */
.dashboard-markdown blockquote {
  border-left: 3px solid #f0c060 !important; color: #c9c9cf !important;
  background: rgba(232,169,60,.06); padding: 8px 12px; border-radius: 0 8px 8px 0;
}
.dashboard-markdown { overflow-y: auto !important; }
.dashboard-markdown::after { /* fade hint that there is more (P1-17) */
  content: ""; position: sticky; bottom: 0; display: block; height: 24px;
  background: linear-gradient(rgba(20,20,24,0), #141418); pointer-events: none;
}

/* orphan "no chart definition" containers (P2-25b) */
.missing-chart-body, .missing-chart-container {
  display: flex !important; align-items: center; justify-content: center; text-align: center;
  color: #8a8a93 !important; border: 1px dashed #33333a !important; border-radius: 12px !important;
}

/* Superset's own light-oriented empty-state illustrations (P1-13) */
.ant-empty-image img, img[src*="/images/document.svg"], img[src*="/images/empty"],
[class*="EmptyState"] img, [class*="empty-state"] img {
  filter: invert(1) hue-rotate(180deg) brightness(1.4) !important; opacity: .38 !important;
}

/* status chips as brand pills (P2-22): published/default + draft pair.
 * `:not([class*="pvt"])` is LOAD-BEARING (2026-08-10 P1 fix): react-pivottable
 * cells are th.pvtColLabel / pvtRowLabel / pvtTotalLabel / pvtAxisLabel — all
 * contain "Label", so the bare [class*="Label"] rule (specificity 0,2,0) was
 * painting every pivot header/row-label cell brand-purple and BEATING the
 * `.pvtTable th` head rule (0,1,1). Excluding pvt lets the #0f0f13 head win.
 * (Confirmed via live-DOM probe: the "solid purple" cubes were THIS rule.) */
[class*="Label"]:not([class*="pvt"]), .ant-tag { border-radius: 999px !important;
  font-size: 10.5px !important; letter-spacing: .06em !important; text-transform: uppercase !important; }
[class*="Label"]:not([class*="draft"]):not([class*="pvt"]) { background: rgba(122,5,198,.16) !important;
  color: #c98bff !important; border: 1px solid rgba(163,13,255,.35) !important; }
[class*="Label"][class*="draft" i]:not([class*="pvt"]) { background: rgba(138,138,147,.12) !important;
  color: #a1a1aa !important; border: 1px solid rgba(138,138,147,.3) !important; }

/* avatar initials on the brand gradient (P2-25c) */
.ant-avatar, .ant-avatar-string { background: linear-gradient(135deg,#7a05c6,#a30dff) !important; color:#fff !important; }

/* ------------------------------------------------------------ SQL Lab ACE
 * Superset ships the LIGHT 'ace-github' theme; tokens never reach ACE. */

.ace_editor, .ace-github { background: #0f0f13 !important; color: #e6e6ea !important; }
.ace-github .ace_gutter, .ace_editor .ace_gutter { background: #141418 !important; color: #5b5b63 !important; }
.ace-github .ace_gutter-active-line { background: #1d1d22 !important; }
.ace-github .ace_marker-layer .ace_active-line, .ace_marker-layer .ace_active-line { background: #17171c !important; }
.ace-github .ace_keyword, .ace_editor .ace_keyword { color: #c98bff !important; }
.ace-github .ace_string, .ace_editor .ace_string { color: #4ade9b !important; }
.ace-github .ace_constant.ace_numeric, .ace_editor .ace_numeric { color: #e0a458 !important; }
.ace-github .ace_comment, .ace_editor .ace_comment { color: #8a8a93 !important; font-style: italic; }
.ace-github .ace_variable, .ace-github .ace_identifier, .ace_editor .ace_identifier { color: #e6e6ea !important; }
.ace-github .ace_support.ace_function, .ace-github .ace_function { color: #79c0ff !important; }
.ace-github .ace_paren, .ace-github .ace_punctuation, .ace_editor .ace_operator { color: #c9c9cf !important; }
.ace_cursor { color: #fafafa !important; border-left: 2px solid #fafafa !important; }
.ace_editor .ace_marker-layer .ace_selection { background: #2a2140 !important; }
.ace_editor .ace_print-margin { display: none !important; }

/* ============================ FAB ADMIN (Bootstrap 3) — full dark theme ====
 * The Flask-AppBuilder security/CRUD pages (Users, Roles, DB connections,
 * uploads, …) are server-rendered Bootstrap 3 + jQuery select2, NOT the Ant
 * SPA — the token engine never touches them. These rules are GLOBAL
 * (unscoped) BY DESIGN: the 2026-07-19 headless sweep proved scoped anchors
 * (.navbar-inverse, .container) never match the runtime DOM (Superset's JS
 * removes them), and the Ant SPA barely renders Bootstrap classes. */

/* -- buttons -- */
.btn, .btn-default {
  background: #1d1d22 !important; color: #fafafa !important; border-color: #33333a !important;
}
.btn:hover, .btn-default:hover,
.btn:focus { background: #26262c !important; color: #fff !important; }
.btn-primary { background: #7a05c6 !important; border-color: #7a05c6 !important; color: #fff !important; }
.btn-danger { background: #7a1f34 !important; border-color: #a5324c !important; color: #fff !important; }
.btn-link { background: transparent !important; border-color: transparent !important; color: #c98bff !important; }
.btn[disabled], .btn.disabled { opacity: .45 !important; }

/* -- panels / wells (role-edit permission accordion, form sections) -- */
.panel, .well {
  background: #141418 !important; border: 1px solid #26262c !important;
  border-radius: 12px !important; color: #e6e6ea !important;
}
.panel-heading, .panel-default > .panel-heading,
.panel-footer {
  background: #17171c !important; border-color: #26262c !important; color: #fafafa !important;
}
.panel-primary > .panel-heading {
  background: #24123a !important; border-color: #4a2a6b !important; color: #fafafa !important;
}
.panel-title, .panel-title > a,
.panel-title > a:hover, .accordion-toggle { color: #fafafa !important; }
.panel-body { background: #141418 !important; color: #e6e6ea !important; }

/* -- tables (list views) -- */
.table { background: transparent !important; color: #e6e6ea !important; }
.table > tbody > tr > td, .table > tbody > tr > th {
  color: #e6e6ea !important; border-color: #26262c !important;
}
.table-bordered, .table-bordered > tbody > tr > td,
.table-bordered > thead > tr > th, .table-bordered > tbody > tr > th {
  border-color: #26262c !important;
}
.table-hover > tbody > tr:hover { background: #1d1d22 !important; }
.table-striped > tbody > tr:nth-of-type(odd) { background: #101014 !important; }

/* -- forms -- */
.form-control { background: #0f0f13 !important; color: #fafafa !important; border-color: #26262c !important; }
.form-control::placeholder { color: #5b5b63 !important; }
label, .control-label, .help-block { color: #c9c9cf !important; }
legend { color: #fafafa !important; border-color: #26262c !important; }
.input-group-addon { background: #1d1d22 !important; color: #c9c9cf !important; border-color: #26262c !important; }
hr { border-color: #26262c !important; }

/* -- nav tabs (edit-form sections) -- */
.nav-tabs { border-color: #26262c !important; }
.nav-tabs > li > a { color: #c9c9cf !important; border-color: transparent !important; }
.nav-tabs > li > a:hover { background: #1d1d22 !important; border-color: #26262c !important; }
.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
  background: #141418 !important; color: #fafafa !important; border-color: #26262c #26262c transparent !important;
}

/* -- pagination -- */
.pagination > li > a, .pagination > li > span {
  background: #141418 !important; color: #c9c9cf !important; border-color: #26262c !important;
}
.pagination > li > a:hover { background: #1d1d22 !important; color: #fafafa !important; }
.pagination > .active > a, .pagination > .active > span,
.pagination > .active > a:hover { background: #7a05c6 !important; border-color: #7a05c6 !important; color: #fff !important; }

/* -- inline dropdown (row Actions menu) -- */
.dropdown-menu { background: #141418 !important; border-color: #26262c !important; }
.dropdown-menu > li > a { color: #c9c9cf !important; }
.dropdown-menu > li > a:hover { background: #1d1d22 !important; color: #fafafa !important; }
.dropdown-menu .divider { background: #26262c !important; }

/* -- alerts (flash messages) -- */
.alert { background: #17171c !important; border-color: #26262c !important; color: #e6e6ea !important; }
.alert-success { border-left: 3px solid #4ade9b !important; }
.alert-danger, .alert-error { border-left: 3px solid #ff5ca8 !important; }
.alert-warning { border-left: 3px solid #e0a458 !important; }
.alert-info { border-left: 3px solid #c98bff !important; }
.alert .close { color: #fafafa !important; opacity: .7 !important; text-shadow: none !important; }

/* -- badges / text helpers -- */
.badge { background: #33333a !important; color: #fafafa !important; }
.text-primary { color: #c98bff !important; }
.text-muted { color: #8a8a93 !important; }

/* -- FAB confirm dialog (#modal-confirm, at <body> level) -- */
.modal-content { background: #141418 !important; color: #fafafa !important; border-color: #26262c !important; }
.modal-header, .modal-footer { border-color: #26262c !important; }
.modal-title, .modal-body, .modal-text { color: #fafafa !important; }
.close { color: #fafafa !important; opacity: .8 !important; text-shadow: none !important; }

/* -- select2 (FAB widgets; popup renders at <body> level, SPA has no rendered
 *    select2, so global) -- */
.select2-container--default .select2-selection--single,
.select2-container--default .select2-selection--multiple,
.select2-container .select2-selection {
  background: #0f0f13 !important; border: 1px solid #26262c !important; color: #fafafa !important;
}
.select2-container--default .select2-selection--single .select2-selection__rendered,
.select2-selection__rendered { color: #fafafa !important; }
.select2-selection__placeholder,
.select2-container--default .select2-selection--single .select2-selection__placeholder {
  color: #8a8a93 !important;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
  background: #24123a !important; border: 1px solid #4a2a6b !important; color: #fafafa !important;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
  color: #c9c9cf !important;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
  color: #fafafa !important;
}
.select2-dropdown, .select2-container--open .select2-dropdown, .select2-results {
  background: #141418 !important; border-color: #26262c !important; color: #fafafa !important;
}
.select2-results__option { background: #141418 !important; color: #c9c9cf !important; }
.select2-container--default .select2-results__option--highlighted[aria-selected] {
  background: #24123a !important; color: #fafafa !important;
}
.select2-container--default .select2-results__option[aria-selected="true"] {
  background: #1d1d22 !important; color: #fafafa !important;
}
.select2-search--dropdown .select2-search__field {
  background: #0f0f13 !important; color: #fafafa !important; border: 1px solid #26262c !important;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b {
  border-color: #8a8a93 transparent transparent transparent !important;
}

/* -------------------- classic branded login (SUPERSET_CLASSIC_LOGIN=1) ----
 * Rendered by our login_oauth.html override of FAB's template — only when
 * register_superset_auth_view is flipped off in superset_config.py. Inert
 * otherwise (the default 6.1 SPA login carries no .hero-login markup). */

.hero-login-bg {
  position: fixed;
  inset: 0;
  z-index: -1;
  background:
    radial-gradient(ellipse at 82% 8%, rgba(216, 0, 115, 0.5), transparent 55%),
    radial-gradient(ellipse at 5% 118%, rgba(163, 13, 255, 0.45), transparent 55%),
    linear-gradient(135deg, #2a0148 0%, #4a0782 62%, #5c0a9c 100%);
}
.hero-login {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: "Montserrat", "Segoe UI", system-ui,
    "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif;
}
/* anon visitors must not see the app nav behind the card (P1-18) */
body:has(.hero-login) header.top, body:has(.hero-login) .navbar { display: none !important; }
.hero-login-card {
  background: #0b0b0d;
  border: 1px solid #26262c;
  border-radius: 14px;
  padding: 36px 34px;
  width: 376px;
  max-width: 92vw;
  box-shadow: 0 24px 60px -20px rgba(0, 0, 0, 0.5);
  text-align: center;
}
.hero-login-mono {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 10px;
  background: linear-gradient(135deg, #d80073 0%, #7a05c6 80%);
  color: #fff;
  font-weight: 700;
  font-size: 24px;
  margin-bottom: 14px;
}
.hero-login-word { font-size: 19px; font-weight: 700; color: #fafafa; margin-bottom: 4px; }
.hero-login-word .bi { color: #5b5b63; }
.hero-login-title { font-size: 24px; font-weight: 600; color: #fafafa; margin: 18px 0 4px; }
.hero-login-sub { font-size: 13px; color: #8a8a93; margin-bottom: 24px; }
.hero-login .btn, .hero-login .btn-primary {
  display: block;
  width: 100%;
  background: linear-gradient(135deg, #d80073 0%, #7a05c6 80%) !important;
  border: none !important;
  border-radius: 9px !important;
  color: #fff !important;
  font-weight: 600;
  font-size: 14px;
  padding: 13px 16px;
  box-shadow: 0 8px 22px -8px rgba(122, 5, 198, 0.75);
  cursor: pointer;
}
.hero-login .btn:hover { filter: brightness(1.05); }
.hero-login-foot { margin-top: 22px; font-size: 13px; color: #c9c9cf; }

/* NOTE (2026-08-19): a fullscreen-only zoom (CSS `zoom: 1.5` on the
   .full-size holder) was tried and REMOVED the same day: zoom breaks
   ECharts' mouse-coordinate mapping (tooltips/hover track the wrong
   position) and its viewport math varies by browser version. Font scaling
   for presentations goes through the SUPERSET_BASE_FONT_SIZE env toggle
   (superset_config.py) instead — native re-render, exact hit-testing. */
