/* =====================================================================
   PREMIUM THEME OVERLAY  ·  BasicProjectLaravel admin CMS
   ---------------------------------------------------------------------
   A design-token layer that re-skins the Argon (Bootstrap 5) shell and
   the legacy Metronic components (.kt-*) into a 2026-class premium SaaS
   look. Loaded LAST in the <head> so it wins the cascade.

   - Zero markup/JS dependency for the look (maps onto existing classes).
   - Light = :root ; Dark = html[data-theme="dark"].
   - RTL-safe: logical properties (margin-inline / inset) only.
   - Motion gated behind prefers-reduced-motion.
   ===================================================================== */

/* Poppins import removed — the admin now uses the TriangleCMS system-UI font stack.
   (JetBrains Mono is still loaded via the layout's Google Fonts <link> for monospace.) */

/* ---------------------------------------------------------------------
   1. DESIGN TOKENS — LIGHT (default)
   --------------------------------------------------------------------- */
:root {
    /* =================================================================
       TRIANGLE BRAND PRIMITIVES  (single source of truth — brand palette)
       Ref: Triangle brand guidelines v1.0 (2025)
         primary dark grey #2E2D32 · off-white #F5F5F5 · white #FFFFFF
         accent red #ED1A2F (used sparingly: CTA / active / danger)
       All semantic --pt-* tokens below map onto these. Never hardcode a
       brand colour in a component rule — reference a token.
       ================================================================= */
    --tri-red: #ed1a2f;       /* secondary/accent — RGB 237,26,47 */
    --tri-red-600: #d11528;   /* hover / pressed */
    --tri-red-700: #b01020;   /* active text on light tints (AA-safe) */
    --tri-red-300: #f2637a;   /* tint (secondary ramp) */
    --tri-red-100: #fbd0d7;   /* faint tint */
    --tri-grey: #2e2d32;      /* primary — RGB 46,45,50 */
    --tri-grey-2: #3a3940;    /* raised dark surface */
    --tri-offwhite: #f5f5f5;  /* RGB 245,245,245 */
    --tri-white: #ffffff;

    /* Brand red ramp (TriangleCMS spec) */
    --tri-red-50: #fef2f3;
    --tri-red-200: #f8b9bf;

    /* Surfaces — flat TriangleCMS spec */
    --pt-bg: #f4f4f5;
    --pt-bg-subtle: #ececef;
    --pt-surface: var(--tri-white);
    --pt-surface-2: #fafafa;
    --pt-surface-3: #f6f6f7;
    --pt-surface-hover: #f2f1f4;
    --pt-border: #e7e6ea;
    --pt-border-2: #efeef1;
    --pt-border-strong: #d8d7dd;

    /* Text */
    --pt-text: var(--tri-grey);
    --pt-text-muted: #66646d;
    --pt-text-soft: #9795a0;
    --pt-text-on-accent: var(--tri-white);

    /* Accents — brand red. Legacy indigo/cyan/violet names kept as
       aliases so existing component rules resolve without edits. */
    --pt-indigo: var(--tri-red);
    --pt-indigo-600: var(--tri-red-600);
    --pt-indigo-700: var(--tri-red-700);
    --pt-cyan: var(--tri-red-300);
    --pt-violet: #7a5ae0;
    --pt-accent: var(--tri-red);
    --pt-accent-600: var(--tri-red-600);
    --pt-accent-soft: rgba(237, 26, 47, 0.10);
    --pt-accent-soft-2: rgba(237, 26, 47, 0.16);
    --pt-accent-tint: #fef2f3;
    --pt-focus-ring: rgba(237, 26, 47, 0.28);
    --pt-cta-grad: var(--tri-red); /* flattened — was liquid-chrome gradient */

    /* Semantic — desaturated to match TriangleCMS spec; danger = brand red */
    --pt-success: #2a9d6f;
    --pt-success-soft: rgba(42, 157, 111, 0.12);
    --pt-warning: #de9526;
    --pt-warning-soft: rgba(222, 149, 38, 0.14);
    --pt-danger: var(--tri-red);
    --pt-danger-soft: rgba(237, 26, 47, 0.10);
    --pt-info: #3b79d4;
    --pt-info-soft: rgba(59, 121, 212, 0.12);

    /* Alert body text — darker than the fill colour for AA contrast on the soft tints */
    --pt-alert-success-text: #1b7a53;
    --pt-alert-danger-text: #ae0e23;
    --pt-alert-warning-text: #9a6612;
    --pt-alert-info-text: #2a5ba8;

    /* Legacy palette remap (consumed by custom.css refactor) */
    --pt-navy: var(--tri-grey);    /* was #061222 → brand dark grey */
    --pt-slate: #4a4951;           /* neutral dark accent */
    --pt-chip: #ececef;            /* was #e9ecef */

    /* Sidebar — ALWAYS charcoal in BOTH themes (TriangleCMS spec) */
    --sb-bg: #232227;
    --sb-bg-2: #2a2930;
    --sb-border: rgba(255, 255, 255, 0.07);
    --sb-text: rgba(255, 255, 255, 0.66);
    --sb-text-hi: #ffffff;
    --sb-muted: rgba(255, 255, 255, 0.40);
    --sb-hover: rgba(255, 255, 255, 0.06);
    --sb-active: rgba(255, 255, 255, 0.10);

    /* Spacing — 8px scale (refined in Phase 2) */
    --sp-1: 4px;
    --sp-2: 8px;
    --sp-3: 12px;
    --sp-4: 16px;
    --sp-5: 24px;
    --sp-6: 32px;
    --sp-7: 48px;
    --sp-8: 64px;

    /* Radii — TriangleCMS flat spec (base 12 / sm 8 / lg 16) */
    --r-xs: 5px;
    --r-sm: 8px;
    --r-md: 10px;
    --r-lg: 12px;
    --r-xl: 16px;
    --r-pill: 999px;

    /* Elevation — flat, cool-tinted depth (TriangleCMS spec) */
    --shadow-sm: 0 1px 2px rgba(26, 25, 29, 0.05), 0 1px 1px rgba(26, 25, 29, 0.04);
    --shadow-md: 0 4px 14px rgba(26, 25, 29, 0.07), 0 1px 3px rgba(26, 25, 29, 0.05);
    --shadow-lg: 0 18px 50px -8px rgba(26, 25, 29, 0.16), 0 4px 14px rgba(26, 25, 29, 0.10);
    --shadow-pop: 0 12px 32px rgba(26, 25, 29, 0.13), 0 2px 6px rgba(26, 25, 29, 0.07);
    --shadow-accent: 0 1px 2px rgba(237, 26, 47, 0.25);
    --shadow-glow: none; /* flattened — was red glow */

    /* Glass/chrome/mesh tokens REPOINTED to flat values so all consumers
       resolve to flat surfaces without editing each rule. Literal
       backdrop-filter declarations are stripped individually below. */
    --glass-bg: var(--pt-surface);
    --glass-bg-strong: var(--pt-surface);
    --glass-border: var(--pt-border);
    --glass-top: var(--pt-surface);
    --glass-blur: none;
    --glass-blur-strong: none;

    /* CTA — flat brand fill (was liquid-chrome gradient + specular shadow) */
    --accent-gradient: var(--tri-red);
    --chrome-shadow: none;

    /* Hero — flattened (was atmospheric mesh-gradient) */
    --mesh-base: var(--pt-surface);
    --mesh-header: none;

    /* Typography — system-UI stack to match the TriangleCMS design (native feel;
       Segoe UI on Windows, SF on macOS). "Cairo" retained for Arabic / RTL.
       JetBrains Mono kept for monospace (code/kbd/file paths). */
    --pt-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Cairo", sans-serif;
    --pt-font-heading: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Cairo", sans-serif;
    --pt-font-mono: "JetBrains Mono", "Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;

    /* Motion */
    --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
    --ease-out: cubic-bezier(0.22, 0.61, 0.36, 1);
    --dur: 200ms;

    color-scheme: light;
}

/* ---------------------------------------------------------------------
   2. DESIGN TOKENS — DARK
   --------------------------------------------------------------------- */
html[data-theme="dark"] {
    /* Dark surfaces — TriangleCMS dark ramp (cool near-black) */
    --pt-bg: #141317;
    --pt-bg-subtle: #1d1c21;
    --pt-surface: #1d1c21;
    --pt-surface-2: #232227;
    --pt-surface-3: #26252b;
    --pt-surface-hover: #2a2930;
    --pt-border: #2f2e35;
    --pt-border-2: #2a2930;
    --pt-border-strong: #3b3a42;

    --pt-text: #edecef;
    --pt-text-muted: #a3a1ab;
    --pt-text-soft: #76747d;
    --pt-text-on-accent: #ffffff;

    --pt-accent-soft: rgba(237, 26, 47, 0.18);
    --pt-accent-soft-2: rgba(237, 26, 47, 0.26);
    --pt-accent-tint: rgba(237, 26, 47, 0.14);
    --pt-focus-ring: rgba(237, 26, 47, 0.42);

    --pt-success-soft: rgba(42, 157, 111, 0.18);
    --pt-warning-soft: rgba(222, 149, 38, 0.20);
    --pt-danger-soft: rgba(237, 26, 47, 0.20);
    --pt-info-soft: rgba(59, 121, 212, 0.18);

    /* Lighter alert text for legibility on dark soft tints */
    --pt-alert-success-text: #52c79a;
    --pt-alert-danger-text: #f0808d;
    --pt-alert-warning-text: #e7b463;
    --pt-alert-info-text: #7aa6e8;

    --pt-navy: var(--tri-offwhite);
    --pt-slate: #c4c3c9;
    --pt-chip: #2a2930;

    /* Sidebar — even darker charcoal in dark mode (TriangleCMS spec) */
    --sb-bg: #131215;
    --sb-bg-2: #1a191d;

    --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.30);
    --shadow-md: 0 4px 14px rgba(0, 0, 0, 0.34);
    --shadow-lg: 0 18px 50px rgba(0, 0, 0, 0.55), 0 4px 14px rgba(0, 0, 0, 0.40);
    --shadow-pop: 0 12px 32px rgba(0, 0, 0, 0.50);
    --shadow-accent: 0 1px 2px rgba(237, 26, 47, 0.35);
    --shadow-glow: none;

    /* Glass tokens repointed to flat dark surfaces */
    --glass-bg: var(--pt-surface);
    --glass-bg-strong: var(--pt-surface);
    --glass-border: var(--pt-border);
    --glass-top: var(--pt-surface);

    /* Hero — flattened */
    --mesh-base: var(--pt-surface);
    --mesh-header: none;

    color-scheme: dark;
}

/* ---------------------------------------------------------------------
   2b. GLASS CAPABILITY FALLBACK + SIGNATURE KEYFRAMES
   ---------------------------------------------------------------------
   Where backdrop-filter is unsupported, collapse every glass surface to an
   opaque one in a single place (all glass rules read these tokens). Keyframes
   power the mesh drift and the liquid-chrome CTA sheen.
   --------------------------------------------------------------------- */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    :root {
        --glass-bg: var(--pt-surface);
        --glass-bg-strong: var(--pt-surface);
    }
    html[data-theme="dark"] {
        --glass-bg: var(--pt-surface);
        --glass-bg-strong: var(--pt-surface);
    }
}

@keyframes ptMeshDrift {
    0%   { transform: translate3d(0, 0, 0) scale(1.02); }
    50%  { transform: translate3d(2%, -2%, 0) scale(1.08); }
    100% { transform: translate3d(-2%, 1%, 0) scale(1.05); }
}
@keyframes ptChromeShift {
    0%   { background-position: 0% 50%; }
    100% { background-position: 100% 50%; }
}

/* ---------------------------------------------------------------------
   3. BASE / TYPOGRAPHY
   --------------------------------------------------------------------- */
/* Metronic's style.bundle.css ends with `html,body{font-size:13px!important}`, which
   pins the root at 13px and shrinks every rem-based size ~19% below the TriangleCMS
   design spec (the overlay + argon/Bootstrap layout are authored for a 16px root) and
   forces Poppins. Restore the intended 16px root + system font so rem values match. */
html {
    font-size: 16px !important;
    font-family: var(--pt-font) !important;
}
body {
    font-family: var(--pt-font) !important;
    background-color: var(--pt-bg) !important;
    color: var(--pt-text);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    letter-spacing: -0.006em;
}
body.bg-gray-100 { background-color: var(--pt-bg) !important; }
/* Metronic hardcodes `font-family: Poppins` on these containers (it was masked while
   Poppins was our brand font). Re-point them to the system-UI stack so the whole
   admin is consistent. Container-level only — icon fonts on inner <i> are untouched. */
.tooltip, .popover, .modal-content, .dropdown-menu, .swal2-popup, .select2-container, .ql-toolbar, .ql-container { font-family: var(--pt-font) !important; }
/* Remaining hardcoded-Poppins plugin containers in style.bundle.css that the list
   above doesn't reach (jstree menus, uppy uploader, apexcharts, leaflet maps). */
.vakata-context, .vakata-context ul, .uppy-Root, .uppy-Root *,
.apexcharts-text, .apexcharts-title-text, .apexcharts-legend-text,
.leaflet-container, .leaflet-popup-content { font-family: var(--pt-font) !important; }

h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
    font-family: var(--pt-font-heading);
    color: var(--pt-text);
    font-weight: 700;
    letter-spacing: -0.02em;
    line-height: 1.25;
}
p, span, label, td, th, li, .text-sm, .text-xs { color: inherit; }
a { color: var(--pt-accent); }
a:hover { color: var(--pt-indigo-700); }
.text-muted, .text-secondary { color: var(--pt-text-muted) !important; }
hr.horizontal.dark, hr.horizontal {
    background-color: transparent;
    background-image: linear-gradient(90deg, transparent, var(--pt-border-strong), transparent);
    opacity: 1;
}

/* Selection */
::selection { background: var(--pt-accent-soft-2); }

/* ---------------------------------------------------------------------
   4. LAYOUT  ·  mesh-gradient hero header
   --------------------------------------------------------------------- */
/* Hero band REMOVED — the prototype has a clean page background, no dark header
   slab. Neutralise Argon's .bg-primary hero so no dark strip shows behind the
   topbar / beside the sidebar (the topbar is now a theme-aware glass bar). */
.min-height-300.bg-primary,
.position-absolute.bg-primary.w-100 {
    background: transparent !important;
    background-image: none !important;
    min-height: 0 !important;
    box-shadow: none !important;
}
.min-height-300.bg-primary::before,
.position-absolute.bg-primary.w-100::before { display: none !important; }
/* Profile-page hero mask over its photo: keep a soft neutral wash (not a slab) */
.mask.bg-primary {
    background-image: linear-gradient(180deg, rgba(46, 45, 50, 0.50), rgba(46, 45, 50, 0.12)) !important;
    background-color: transparent !important;
}

main.main-content { color: var(--pt-text); }

/* Dashboard welcome hero (flat, brand mark + greeting) */
.pt-dash-welcome { max-width: 560px; margin: clamp(40px, 9vh, 110px) auto 0; text-align: center; display: flex; flex-direction: column; align-items: center; gap: var(--sp-3); }
.pt-dash-welcome__mark { inline-size: 72px; block-size: 72px; border-radius: var(--r-xl); display: grid; place-items: center; background: var(--tri-grey); border: 0; box-shadow: var(--shadow-md); }
.pt-dash-welcome__mark img { inline-size: 44px; height: auto; }
.pt-dash-welcome__title { font-family: var(--pt-font-heading); font-size: 1.9rem; font-weight: 700; letter-spacing: -0.02em; color: var(--pt-text); margin: 0; }
.pt-dash-welcome__sub { font-size: 0.95rem; color: var(--pt-text-muted); margin: 0; line-height: 1.6; }

/* ---------------------------------------------------------------------
   5. SIDEBAR
   --------------------------------------------------------------------- */
/* Sidebar is theme-aware: light surface in light mode, brand-grey (#2E2D32)
   in dark mode. Colours come from --pt-* tokens so they flip automatically.
   (Logo renders fine on both; supply a reversed/white logomark asset if it
   ever needs more contrast on the dark surface — never recolour via filter.) */
.sidenav,
.navbar-vertical.navbar-expand-xs {
    background: var(--sb-bg) !important;
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
    border: 1px solid var(--sb-border) !important;
    box-shadow: none !important;
    border-radius: var(--r-lg) !important;
}

.sidenav .navbar-brand,
.sidenav .navbar-brand span { color: var(--sb-text-hi) !important; font-weight: 700; }
.sidenav .navbar-brand { padding-block: var(--sp-3); }
.sidenav .navbar-brand-img { filter: none; width: auto; }
.sidenav .pt-brand-pill__logo img { height: auto !important; max-height: 28px; max-width: 100%; width: auto; }
/* Header GROWS with the brand pill — Argon hardcodes a fixed height:4.875rem
   that the pill can exceed, which made it overlap the first menu item. */
.sidenav .sidenav-header { height: auto !important; min-height: 56px; padding-block: var(--sp-2); }

.navbar-vertical .navbar-nav .nav-link {
    color: var(--sb-text) !important;
    border-radius: var(--r-sm);
    margin: 1px var(--sp-2);    /* 1px vertical matches TriangleCMS margin-bottom:1px */
    padding-block: 9px;
    font-weight: 500;
    transition: background-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.navbar-vertical .navbar-nav .nav-link .icon,
.navbar-vertical .navbar-nav .nav-link > i {
    color: var(--sb-muted);
    transition: color var(--dur) var(--ease-out);
}
.navbar-vertical .navbar-nav .nav-link:hover {
    background-color: var(--sb-hover) !important;
    color: var(--sb-text-hi) !important;
}
/* Hover: icon inherits white from parent — NOT brand-red (TriangleCMS pattern) */
.navbar-vertical .navbar-nav .nav-link:hover > i { color: inherit; }
/* Selected item: white overlay, white text. Red is ONLY the ::before accent bar. */
.navbar-vertical .navbar-nav .nav-link.active {
    background: var(--sb-active) !important;
    color: var(--sb-text-hi) !important;
    box-shadow: none !important;
    font-weight: 600;
}
/* Active icon: white (inherits from parent text colour) — the accent bar is red */
.navbar-vertical .navbar-nav .nav-link.active > i,
.navbar-vertical .navbar-nav .nav-link.active .icon i,
.navbar-vertical .navbar-nav .nav-link.active i.kt-menu__link-icon { color: var(--sb-text-hi) !important; }
/* collapsible parent caret — right-pointing chevron (→), rotates 90° ↓ when open (TriangleCMS pattern) */
.navbar-vertical .navbar-nav .nav-link[data-bs-toggle="collapse"]::after {
    content: "";
    display: inline-block;
    flex: 0 0 14px;
    width: 14px;
    height: 14px;
    margin-inline-start: auto;
    /* chevron-right in --sb-muted colour (rgba 255,255,255,0.40) */
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.40)' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'/%3E%3C/svg%3E");
    background-size: contain;
    background-repeat: no-repeat;
    background-position: center;
    transform: rotate(0deg);
    transition: transform 0.2s cubic-bezier(0.4, 0.2, 0.2, 1);
    /* suppress any inherited font-icon character */
    font-family: unset;
    font-size: 0;
    color: transparent;
    border: none;
    vertical-align: middle;
}
/* Open state: rotate 90° so the chevron points ↓ */
.navbar-vertical .navbar-nav .nav-link[data-bs-toggle="collapse"]:not(.collapsed)::after {
    transform: rotate(90deg);
}
/* RTL: chevron faces LEFT (←), absolutely pinned to a fixed left edge so all items
   align in one clean vertical column regardless of indentation depth */
[dir="rtl"] .navbar-vertical .navbar-nav .nav-link[data-bs-toggle="collapse"] {
    position: relative;
    padding-inline-end: 28px !important;
}
[dir="rtl"] .navbar-vertical .navbar-nav .nav-link[data-bs-toggle="collapse"]::after {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.40)' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 18 9 12 15 6'/%3E%3C/svg%3E");
    position: absolute;
    left: 10px;
    top: 50%;
    margin-inline-start: 0;
    transform: translateY(-50%);
}
[dir="rtl"] .navbar-vertical .navbar-nav .nav-link[data-bs-toggle="collapse"]:not(.collapsed)::after {
    transform: translateY(-50%) rotate(-90deg);
}
/* When a parent group is OPEN (active child inside), suppress the parent's own
   red accent bar — the active child carries it (TriangleCMS design). */
.navbar-vertical .navbar-nav .nav-link[data-bs-toggle="collapse"].active:not(.collapsed)::before { display: none; }
/* thin brand rule under the sidebar header */
.sidenav hr.horizontal { background-image: linear-gradient(90deg, transparent, var(--sb-border), transparent); }

/* ---------------------------------------------------------------------
   5b. SIDEBAR SHELL — prototype active accent bar, brand pill, footer, rail
   --------------------------------------------------------------------- */
/* Active-item accent bar (RTL-safe via logical inset) */
.navbar-vertical .navbar-nav .nav-link.active { position: relative; }
.navbar-vertical .navbar-nav .nav-link.active::before {
    content: "";
    position: absolute;
    inset-inline-start: -8px;  /* flush with sidebar left edge (8px = item margin) */
    top: 50%;
    transform: translateY(-50%);
    inline-size: 3px;
    block-size: 20px;
    border-radius: var(--r-pill);
    background: var(--tri-red);
}

/* Make the aside a flex column so the footer pins to the bottom.
   align-items:stretch is REQUIRED — overriding Argon's display:block to flex
   would otherwise inherit .navbar's align-items:center and shove every child
   (brand pill, menu, footer) into a centered/offset column (the empty gutter). */
/* flex-wrap:nowrap is CRITICAL — the base .navbar sets flex-wrap:wrap, so a
   tall menu (height:auto, below) would otherwise wrap the items into extra
   columns to the right (cut-off labels, footer beside the menu). nowrap keeps
   ONE vertical column; the menu scrolls instead. */
.sidenav.pt-sidenav { display: flex; flex-direction: column; flex-wrap: nowrap; align-items: stretch; overflow-x: hidden; }
.sidenav.pt-sidenav > * { width: 100%; max-width: 100%; min-width: 0; flex-shrink: 0; }
/* height:auto !important overrides Argon's fixed `height: calc(100vh - 360px)`
   on .navbar-collapse so the menu becomes a proper flex child that scrolls
   VERTICALLY, letting the footer pin to the viewport bottom on EVERY page.
   width:100% beats the markup's `.w-auto`, and overflow-x:hidden defeats
   Argon's `overflow:auto` → no horizontal scrollbar. */
.sidenav.pt-sidenav #sidenav-collapse-main {
    flex: 1 1 auto;
    min-height: 0;
    height: auto !important;
    width: 100% !important;
    max-width: 100%;
    overflow-y: auto;
    overflow-x: hidden !important;
}
.sidenav.pt-sidenav .pt-sidenav-footer { flex: 0 0 auto; }

/* Brand pill (display-only workspace identity) */
.pt-brand-pill {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    inline-size: 100%;
    padding: var(--sp-2);
    border-radius: 0;
    border: 0;
    background: transparent;
    transition: border-color var(--dur) var(--ease-out), background var(--dur) var(--ease-out);
}
.pt-brand-pill:hover { background: transparent; }
/* Specificity-matched (0,2,0) so it beats Argon's .navbar-vertical .navbar-brand:
   keep the logo + name on ONE row, never stacked. */
.sidenav .pt-brand-pill { display: flex; flex-direction: row; align-items: center; }
.pt-brand-pill__logo {
    inline-size: 34px;
    block-size: 34px;
    border-radius: var(--r-sm);
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    overflow: hidden;
    background: transparent;
}
.pt-brand-pill__logo img { max-block-size: 28px; width: auto; }
.pt-brand-pill__meta { display: flex; flex-direction: column; line-height: 1.2; min-width: 0; }
.pt-brand-pill__name {
    font-size: 0.9rem;
    font-weight: 700;
    color: var(--sb-text-hi);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.pt-brand-pill__sub { font-size: 0.72rem; color: var(--sb-muted); white-space: nowrap; }

/* Brand logo: white wordmark (expanded) ↔ red triangle mark (collapsed rail) */
.sidenav .pt-brand-pill { gap: 0; padding-inline: 20px; }
.pt-brand-logo { display: block; width: auto; }
.pt-brand-logo--full { block-size: 24px; max-inline-size: 100%; }
.pt-brand-logo--mark { block-size: 26px; display: none; }
.g-sidenav-hidden .navbar-vertical .pt-brand-logo--full { display: none !important; }
.g-sidenav-hidden .navbar-vertical .pt-brand-logo--mark { display: block !important; }

/* Sidebar footer: user-mini only (collapse toggle moved to topbar) */
.pt-sidenav-footer {
    margin-top: auto;
    padding: var(--sp-3);
    border-top: 1px solid var(--sb-border);
    display: flex;
    flex-direction: column;
    gap: 0;
}
.pt-collapse-toggle {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    inline-size: 100%;
    padding: 9px var(--sp-3);
    border: 0;
    background: transparent;
    border-radius: var(--r-sm);
    color: var(--sb-text);
    font-weight: 500;
    cursor: pointer;
    transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.pt-collapse-toggle:hover { background: var(--sb-hover); color: var(--sb-text-hi); }
.pt-collapse-toggle svg { width: 20px; height: 20px; flex: 0 0 auto; }
.pt-user-mini {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: 8px 10px;
    border-radius: var(--r-sm);
    cursor: pointer;
}
.pt-user-mini:hover { background: var(--sb-hover); }
.pt-user-mini__avatar {
    inline-size: 34px;
    block-size: 34px;
    border-radius: 50%;
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    font-size: 0.78rem;
    font-weight: 700;
    letter-spacing: 0.02em;
    color: #fff;
}
.pt-user-mini__meta { display: flex; flex-direction: column; line-height: 1.25; min-width: 0; }
.pt-user-mini__name {
    font-size: 0.8125rem;   /* 13px — TriangleCMS .nm */
    font-weight: 600;
    color: var(--sb-text-hi);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.pt-user-mini__role { font-size: 0.71875rem; color: var(--sb-muted); }  /* 11.5px */
.pt-user-mini__chev { margin-inline-start: auto; flex: 0 0 auto; color: var(--sb-muted); opacity: 0.5; }

/* =====================================================================
   COLLAPSED ICON RAIL (g-sidenav-hidden) — prototype behaviour
   ---------------------------------------------------------------------
   The rail is FIXED. Argon + custom.css expand it back on :hover, which
   meant clicking "Collapse" while the cursor was over the menu didn't take
   effect until the cursor left. The prototype keeps it collapsed until
   toggled again, so we disable the hover-expand entirely.
   ===================================================================== */
/* Kill the hover-expand (custom.css uses 0,4,0 + !important; premium loads
   last so an equal-specificity rule wins): keep rail width + content margin. */
.g-sidenav-show.g-sidenav-hidden .navbar-vertical:hover { max-width: 6rem !important; }
.g-sidenav-hidden .navbar-vertical:hover.fixed-start + .main-content { margin-inline-start: 7.5rem !important; margin-inline-end: 0 !important; }
.g-sidenav-hidden .navbar-vertical:hover .nav-item .nav-link .nav-link-text,
.g-sidenav-hidden .navbar-vertical:hover .nav-item .nav-link .sidenav-normal { opacity: 0 !important; width: 0 !important; }

/* Footer stays visible in the rail (Argon hides it by default) */
.g-sidenav-hidden .sidenav-footer.pt-sidenav-footer { display: flex !important; }

/* Keep the brand LOGO visible — Argon blanks EVERY .navbar-brand span with
   opacity:0, and our logo is wrapped in a span (0,4,0 beats Argon's 0,3,0). */
.g-sidenav-hidden .navbar-vertical .navbar-brand .pt-brand-pill__logo { opacity: 1 !important; }

/* Hide all text/meta + every text span inside nav-links — only icons remain.
   Using display:none (not opacity/width tricks) so no margin/padding residue
   from ms-1 etc. can push an icon off-centre. */
.g-sidenav-hidden .navbar-vertical .pt-brand-pill__meta,
.g-sidenav-hidden .navbar-vertical .pt-user-mini__meta,
.g-sidenav-hidden .navbar-vertical .pt-user-mini__chev,
.g-sidenav-hidden .navbar-vertical .nav-item .nav-link .sidenav-mini-icon,
.g-sidenav-hidden .navbar-vertical .nav-item .nav-link .sidenav-normal,
.g-sidenav-hidden .navbar-vertical .nav-item .nav-link .nav-link-text { display: none !important; }

/* Centre the icons + shell bits in the rail — reset inline padding so the
   logo-mark / avatar / icons sit centred in the narrow 6rem rail, not offset
   by the expanded 20px / 10px block padding. */
.g-sidenav-hidden .navbar-vertical .pt-brand-pill { justify-content: center; padding-inline: 0; }
.g-sidenav-hidden .navbar-vertical .pt-user-mini { justify-content: center; padding-inline: 0; }
.g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link { justify-content: center; padding-inline: 0 !important; }
/* Collapsed rail: drop the icon's label-gap (margin-inline-end:10px) so it
   centres exactly. Otherwise the trailing margin offsets the icon ~5px toward
   the inline-start — barely visible in LTR but obvious in RTL (Arabic). */
.g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link > i,
.g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link i.kt-menu__link-icon,
.g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link span.kt-menu__link-icon,
.g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link .icon.icon-shape { margin-inline-end: 0 !important; }
/* RTL parent items reserve padding-inline-end:28px for the left-pinned chevron
   (see ~L423); that chevron is hidden in the rail, so the leftover padding shoves
   the icon off-centre in Arabic. Drop it so the icon centres like LTR. */
[dir="rtl"] .g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link[data-bs-toggle="collapse"] { padding-inline-end: 0 !important; }

/* In icon-rail mode, collapse all open accordion sub-menus so they don't bleed
   into the rail as invisible blank rows. Bootstrap restores the open state when
   the sidebar expands again (g-sidenav-hidden is removed from body). */
.g-sidenav-hidden .navbar-vertical .navbar-nav .collapse,
.g-sidenav-hidden .navbar-vertical .navbar-nav .collapsing { display: none !important; }

/* PerfectScrollbar rail sits position:absolute at the right edge of the nav
   container (z-index:3), invisibly overlapping the collapse chevrons. On
   Windows, where Argon initialises PS, clicking near a chevron fires the PS
   rail's mousedown instead of reaching the nav-link — Bootstrap's collapse
   handler never fires and the menu appears frozen.
   Removing pointer-events from the rail lets clicks pass through to nav-links;
   the thumb retains pointer-events so drag-to-scroll still works. */
#sidenav-main .ps__rail-y { pointer-events: none; }
#sidenav-main .ps__thumb-y { pointer-events: auto; }

/* Zero out the inherited font-size on nav-links so the leading 3×&nbsp; text
   node collapses to zero width (centering the icon perfectly). The <i> already
   has an explicit font-size: 0.95rem so it renders at full size regardless. */
.g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link { font-size: 0; }


/* ROOT-CAUSE FIX: the collapse-toggle ::after chevron has margin-left:auto
   (argon-dashboard.css line 19297) which absorbs all free space and defeats
   justify-content:center — pinning parent-item icons hard-left while leaf
   items (Settings, Pages, SEO) that have no ::after sit centred. Removing the
   pseudo-element from layout with display:none makes every icon centre at the
   same point in the icon rail. */
.g-sidenav-hidden .navbar-vertical .navbar-nav .nav-link[data-bs-toggle=collapse]::after { display: none !important; }

/* ---------------------------------------------------------------------
   5c. SIDEBAR SECTION LABELS (tab group headers — TriangleCMS design)
   --------------------------------------------------------------------- */
/* Section labels are <li class="pt-nav-section-label"> items inside
   the navbar-nav <ul>. They function as non-clickable group headings. */
.navbar-vertical .navbar-nav .pt-nav-section-label {
    font-size: 10.5px;
    font-weight: 700;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: var(--sb-muted);
    padding: 18px 20px 6px;
    list-style: none;
    pointer-events: none;
    user-select: none;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* First section label sits closer to the header — reduce top gap */
.navbar-vertical .navbar-nav .pt-nav-section-label:first-child { padding-top: 8px; }
/* In icon-rail mode, hide labels entirely (no space to show them) */
.g-sidenav-hidden .navbar-vertical .navbar-nav .pt-nav-section-label { display: none !important; }
/* R8.9 merged menu: GetNavigation() puts a toggle button in each tab heading. The label
   itself stays non-interactive; only the button takes clicks. */
.navbar-vertical .navbar-nav .pt-nav-section-toggle {
    pointer-events: auto;
    display: flex;
    align-items: center;
    gap: 6px;
    width: 100%;
    padding: 0;
    border: 0;
    background: transparent;
    color: inherit;
    font: inherit;
    letter-spacing: inherit;
    text-transform: inherit;
    text-align: start;
    cursor: pointer;
}
.navbar-vertical .navbar-nav .pt-nav-section-toggle > span { overflow: hidden; text-overflow: ellipsis; }
.navbar-vertical .navbar-nav .pt-nav-section-toggle::after {
    content: "";
    margin-inline-start: auto;
    width: 6px;
    height: 6px;
    border-right: 1.5px solid currentColor;
    border-bottom: 1.5px solid currentColor;
    transform: rotate(45deg);
    transition: transform .15s ease;
}
.navbar-vertical .navbar-nav .pt-nav-section-toggle[aria-expanded="false"]::after { transform: rotate(-45deg); }
[dir="rtl"] .navbar-vertical .navbar-nav .pt-nav-section-toggle[aria-expanded="false"]::after { transform: rotate(135deg); }
.navbar-vertical .navbar-nav .pt-nav-section-toggle:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
.navbar-vertical .navbar-nav .pt-nav-group-hidden { display: none !important; }
/* Icon rail: headings are hidden, so a collapsed group must not hide its icons */
.g-sidenav-hidden .navbar-vertical .navbar-nav .pt-nav-group-hidden { display: list-item !important; }
/* Top bar / profile toggle between merged and tab-at-a-time menus */
.pt-menu-display-form { display: inline-flex; margin: 0; }
.pt-menu-display-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border: 1px solid rgba(0, 0, 0, .12);
    border-radius: 8px;
    background: transparent;
    color: inherit;
    font-size: 12.5px;
    white-space: nowrap;
    cursor: pointer;
}
.pt-menu-display-toggle:hover { background: rgba(0, 0, 0, .04); }
.pt-menu-display-toggle:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

/* ---------------------------------------------------------------------
   5d. SIDEBAR MENU ITEMS — prototype list polish
   ---------------------------------------------------------------------
   The server menu prefixes each item with 3×&nbsp; + a bare
   <i class="kt-menu__link-icon {db-icon}">. Pure CSS — GetNavigation() HTML
   is untouched.
   --------------------------------------------------------------------- */
/* Flex row + font-size:0 collapses the leading 3×&nbsp; text node so EVERY icon
   (DB items + the hardcoded Dashboard) starts at the same x and lines up with its
   label. Label/icon font-sizes are restored on their own elements below. */
.navbar-vertical .navbar-nav .nav-link {
    display: flex !important;
    align-items: center !important;
    font-size: 0;
    padding-inline: var(--sp-3);
}
/* Force Argon's mini-icon (which carries the FULL name here) to truly collapse
   in the expanded sidebar — its flex min-width:auto + nowrap text otherwise
   reserves a wide gap between the icon and the visible label. */
.g-sidenav-show:not(.g-sidenav-hidden) .navbar-vertical .nav-item .nav-link span.sidenav-mini-icon {
    width: 0 !important;
    min-width: 0 !important;
    margin: 0 !important;
    overflow: hidden !important;
}

/* Icon: uniform 22px box, vertically centred, muted; brand-red on hover (active in §5).
   Covers DB items (i.kt-menu__link-icon) AND the hardcoded Dashboard (.icon.icon-shape). */
.navbar-vertical .navbar-nav .nav-link > i,
.navbar-vertical .navbar-nav .nav-link i.kt-menu__link-icon,
.navbar-vertical .navbar-nav .nav-link .icon.icon-shape {
    min-width: 22px;
    inline-size: 22px;
    height: auto;
    text-align: center;
    font-size: 0.95rem;
    line-height: 1;
    color: var(--sb-muted);
    background: transparent !important;
    box-shadow: none !important;
    margin: 0 !important;
    margin-inline-end: 10px !important;
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: color var(--dur) var(--ease-out);
}
.navbar-vertical .navbar-nav .nav-link .icon.icon-shape i { font-size: 0.95rem; color: inherit; margin: 0; }
/* Hover icon inherits white from parent — NOT brand-red */
.navbar-vertical .navbar-nav .nav-link:hover > i,
.navbar-vertical .navbar-nav .nav-link:hover i.kt-menu__link-icon,
.navbar-vertical .navbar-nav .nav-link:hover .icon.icon-shape { color: inherit; }

/* Labels wrap to full text (override Argon's white-space:nowrap); long tokens
   break instead of forcing a horizontal scrollbar */
.navbar-vertical .navbar-nav .nav-link .nav-link-text,
.navbar-vertical .navbar-nav .nav-link .sidenav-normal {
    font-size: 13.5px;          /* TriangleCMS nav-item exact spec */
    font-weight: 500;
    white-space: normal;
    line-height: 1.3;
    overflow-wrap: anywhere;
    min-width: 0;
}

/* Nested submenu → TREE VIEW. Every nesting level steps in by one consistent
   amount AND draws a vertical guide rail, so a child always sits further in
   than its parent across 3+ level trees (e.g. Manage users › Admin users ›
   Add / View / Activity logs, or Companies › Sectors / Content). The indent
   compounds because every <ul.nav.ms-4> nests inside the previous level's
   <li>. All properties are logical (…-inline-…) so the whole tree mirrors
   automatically for RTL (Arabic). */
.navbar-vertical .navbar-nav .collapse .nav.ms-4 {
    margin-inline-start: 1.15rem !important;  /* one indent step per nesting level */
    padding-inline-start: 0 !important;
    /* vertical tree-guide rail — a touch brighter than --sb-border so it reads */
    border-inline-start: 1.5px solid rgba(255, 255, 255, 0.12) !important;
}
.navbar-vertical .navbar-nav .collapse .nav .nav-link {
    margin-inline: 4px;                       /* sit closer to the guide rail */
    padding-block: 7px;
    padding-inline-start: 0.5rem;             /* small gap rail → marker; sub-parents show their icon here */
    position: relative;
}
/* Sub-parents KEEP their icon (it is the depth marker); leaves have no icon so
   they reserve the SAME 32px icon column and drop their dot into it. Result:
   every same-depth label lines up in one column while deeper levels still step
   further in — alignment now depends only on nesting depth, never on whether a
   row happens to carry an icon (that dependency was the original bug). */
.navbar-vertical .navbar-nav .collapse .nav .nav-link:not([data-bs-toggle="collapse"]) {
    padding-inline-start: calc(0.5rem + 32px);
}
/* Neutralise the 4px `ms-1` the server adds to sub-parent labels so their text
   lines up exactly with sibling leaf labels at the same depth. */
.navbar-vertical .navbar-nav .collapse .nav .nav-link .nav-link-text {
    margin-inline-start: 0 !important;
}
/* Leaf sub-items get a small dot bullet. Collapsible sub-parents
   (data-bs-toggle, e.g. "Admin users") are EXCLUDED here so their caret
   shows instead — this is what gives the 2nd-through-before-last levels an
   expand/collapse arrow in a 3+ level tree. */
.navbar-vertical .navbar-nav .collapse .nav .nav-link:not([data-bs-toggle="collapse"])::after {
    content: "";
    position: absolute;
    inset-inline-start: calc(0.5rem + 8px);   /* centre of the 22px marker column (aligns under sub-parent icons) */
    top: 50%;
    transform: translateY(-50%);
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
    opacity: 0.3;
    transition: opacity 0.15s;
}
/* Active leaf sub-item: hide dot, accent bar (::before) takes over.
   Toggles are excluded so an active sub-parent keeps its caret. */
.navbar-vertical .navbar-nav .collapse .nav .nav-link:not([data-bs-toggle="collapse"]).active::after { opacity: 0; }
/* 3rd-level active item: argon-dashboard.css sets `content:none` on `::before` at
   this nesting depth (specificity 0,8,1), which kills the accent bar entirely. Re-
   enable it — same specificity but premium-theme.css loads AFTER argon-dashboard.css
   so cascade order wins. The base rule's inset-inline-start:-8px already positions
   the bar correctly at the left of the item row (no position override needed). */
.navbar-vertical .navbar-nav .collapse .nav .collapse .nav .nav-link.active::before {
    content: "";
}
/* Hide the per-item DB icon on LEAF rows only — sub-parents keep theirs as the
   depth marker, leaves show a dot in that same reserved column (see above). The
   old bug (2nd level looking deeper than the 3rd) is gone because leaves now
   reserve the icon column, so alignment tracks nesting depth, not icons. */
.navbar-vertical .navbar-nav .collapse .nav .nav-link:not([data-bs-toggle="collapse"]) i.kt-menu__link-icon {
    display: none !important;
}

/* Submenu open/close = INSTANT. Bootstrap's ~0.35s height animation ignores
   further clicks while `.collapsing` is mid-flight (its `_isTransitioning`
   guard), so rapid clicking felt frozen and an interrupted animation could
   leave a submenu stuck half-open. No transition → the toggle completes on the
   same tick, so every click registers immediately. */
.navbar-vertical .navbar-nav .collapse,
.navbar-vertical .navbar-nav .collapsing {
    transition: none !important;
    -webkit-transition: none !important;
}

/* ---------------------------------------------------------------------
   6. TOP NAVBAR  ·  theme-aware glass bar (prototype topbar)
   --------------------------------------------------------------------- */
/* Theme-aware chrome text (overrides the hardcoded .text-white in the blade) */
.navbar-main .text-white,
.navbar-main h6,
.navbar-main .nav-link,
.navbar-main .breadcrumb-item,
.navbar-main .breadcrumb-item.active { color: var(--pt-text) !important; }
.navbar-main .breadcrumb-item a,
.navbar-main .breadcrumb-item a > i { color: var(--pt-text-muted) !important; }
.navbar-main .breadcrumb-item a:hover,
.navbar-main .nav-link:hover { color: var(--pt-accent) !important; }
.navbar-main .sidenav-toggler-line { background-color: var(--pt-text-muted) !important; }
/* Hide Argon's native topbar hamburger — our custom .pt-topbar-collapse button takes its place.
   (Only the desktop toggler carries .sidenav-toggler; the mobile #iconNavbarSidenav is untouched.) */
.navbar-main .sidenav-toggler { display: none !important; }
/* The team and tab selectors share .menu-tabs in the topbar. Keep both visible. */

/* Hamburger collapse toggle (TriangleCMS design: leftmost element in topbar).
   The SINGLE sidebar toggle on EVERY breakpoint: on desktop (≥1200px) it
   collapses the icon-rail; on mobile its JS handler proxies a click to the
   Argon drawer toggle (#iconNavbarSidenav). */
.pt-topbar-collapse {
    display: grid;
    width: 38px;
    height: 38px;
    place-items: center;
    border-radius: var(--r-sm);
    border: 0;
    padding: 0;
    background: transparent;
    color: var(--pt-text-muted);
    cursor: pointer;
    flex-shrink: 0;
    transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.pt-topbar-collapse:hover { background: var(--pt-surface-3); color: var(--pt-text); }

/* Collapse-toggle icon swap — burger (☰) while the sidebar is EXPANDED; the
   collapsed glyph while it is collapsed (g-sidenav-hidden) OR on mobile (<768px). */
#ptSidebarCollapse .pt-collapse-ico--collapsed { display: none; }
#ptSidebarCollapse .pt-collapse-ico--menu { display: block; }
body.g-sidenav-hidden #ptSidebarCollapse .pt-collapse-ico--menu { display: none; }
body.g-sidenav-hidden #ptSidebarCollapse .pt-collapse-ico--collapsed { display: block; }
/* fa-grip-lines renders at 1em — size it to sit level with the 19px burger. */
#ptSidebarCollapse .pt-collapse-ico--collapsed { font-size: 18px; }
@media (max-width: 767.98px) {
    #ptSidebarCollapse .pt-collapse-ico--menu { display: none !important; }
    #ptSidebarCollapse .pt-collapse-ico--collapsed { display: block !important; }
}

/* Legacy Metronic subheader hamburger — superseded by .pt-topbar-collapse.
   Hide it on every page so the only sidebar toggle is the topbar one (top-start). */
.kt-subheader__mobile-toggle { display: none !important; }
/* Argon's legacy mobile drawer toggle is superseded by .pt-topbar-collapse plus
   the permanent icon-rail; hide its list item so it leaves no empty gap on the
   topbar's end side (#iconNavbarSidenav itself is already hidden ≤1199px). */
.navbar-main .nav-item:has(> #iconNavbarSidenav) { display: none !important; }

/* theme toggle → subtle surface chip */
.navbar-main .pt-theme-toggle {
    background: var(--pt-surface-2);
    border: 1px solid var(--pt-border);
    color: var(--pt-text-muted);
    width: 38px;
    height: 38px;
    border-radius: var(--r-sm);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background-color var(--dur) var(--ease-out), transform var(--dur) var(--ease-spring), color var(--dur) var(--ease-out);
}
.navbar-main .pt-theme-toggle:hover { background: var(--pt-surface-hover); color: var(--pt-text); transform: translateY(-1px); }
.navbar-main .pt-theme-toggle:active { transform: translateY(0); }

/* Action buttons (purge cache) → neutral surface chip on the glass bar */
.navbar-main .btn-info,
.navbar-main .btn-info:focus {
    background: var(--pt-surface-2) !important;
    background-image: none !important;
    border: 1px solid var(--pt-border) !important;
    color: var(--pt-text) !important;
    box-shadow: none !important;
}
.navbar-main .btn-info:hover { background: var(--pt-surface-hover) !important; color: var(--pt-text) !important; }

/* ---------------------------------------------------------------------
   6b. GLASS TOPBAR + ⌘K SEARCH TRIGGER
   ---------------------------------------------------------------------
   The bar floats over the dark mesh hero, so it stays a frosted DARK glass in
   BOTH themes — the existing white chrome text remains AA-legible.
   --------------------------------------------------------------------- */
.navbar-main.pt-topbar {
    /* Theme-aware frosted glass: light in light mode, dark in dark mode.
       !important + the 0,2,0 specificity beats Argon's blur-mode .bg-white. */
    background: var(--glass-bg-strong) !important;
    -webkit-backdrop-filter: var(--glass-blur-strong);
    backdrop-filter: var(--glass-blur-strong);
    border: 1px solid var(--glass-border);
    border-top-color: var(--glass-top);
    box-shadow: var(--shadow-md) !important;
}

/* Centre zone holding the command-palette trigger */
.pt-topbar__center { flex: 1 1 auto; display: flex; justify-content: center; min-width: 0; padding-inline: var(--sp-4); }
.pt-cmdk-trigger {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-2);
    inline-size: min(440px, 100%);
    height: 38px;
    padding: 0 var(--sp-3);
    border-radius: var(--r-sm);
    border: 1px solid var(--pt-border);
    background: var(--pt-surface-2);
    color: var(--pt-text-muted);
    font-size: 0.85rem;
    cursor: text;
    transition: background var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out);
}
.pt-cmdk-trigger:hover { background: var(--pt-surface-hover); border-color: var(--pt-border-strong); }
.pt-cmdk-trigger > i { font-size: 0.85rem; opacity: 0.7; }
.pt-cmdk-trigger__placeholder { flex: 1 1 auto; text-align: start; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pt-kbd {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 22px;
    height: 20px;
    padding: 0 6px;
    font-family: var(--pt-font-mono);
    font-size: 11px;
    font-weight: 500;
    color: var(--pt-text-muted);
    background: var(--pt-surface);
    border: 1px solid var(--pt-border-strong);
    border-radius: 5px;
    flex: 0 0 auto;
    /* Bootstrap Reboot sets `direction: ltr; unicode-bidi: bidi-override` on code/kbd/samp,
       which lays every glyph out left-to-right and renders Arabic chip labels backwards
       ("تشغيل" → "ليغشت"). These chips hold translated words, not code, so drop the
       override and let the bidi algorithm order each run — Latin shortcuts (ESC, ↵) stay
       LTR on their own. */
    unicode-bidi: normal;
    direction: inherit;
}

/* ---------------------------------------------------------------------
   6c. FLUSH APP SHELL — sidebar + topbar flush to the viewport edges
   ---------------------------------------------------------------------
   Argon FLOATS the sidebar (my-3 ms-2 + rounding + shadow) and the topbar
   (mx-4 + rounding), leaving gaps around them. The prototype shell is flush:
   a full-height sidebar with a right border + a full-width sticky topbar with
   a bottom border. Override the utility-class margins/radius — CSS only.
   --------------------------------------------------------------------- */
/* Sidebar → flush left, full height, right border (no float) */
.sidenav.pt-sidenav {
    margin: 0 !important;
    inset-block: 0 !important;
    inset-inline-start: 0 !important;
    height: 100vh !important;
    max-height: 100vh !important;
    border-radius: 0 !important;
    border: 0 !important;
    border-inline-end: 1px solid var(--pt-border) !important;
    box-shadow: none !important;
}
/* Topbar → flush, full width, sticky, bottom border (no float/rounding) */
.navbar-main.pt-topbar {
    margin: 0 !important;
    border-radius: 0 !important;
    border: 0 !important;
    border-bottom: 1px solid var(--glass-border) !important;
    position: sticky !important;
    top: 0 !important;
    /* BS5 gives every .alert `position: relative`, so a page banner (e.g. the teams
       "nobody can manage their roles and users" one) is a positioned element LATER in
       the DOM than the topbar: with both at z-index auto it painted over an open
       team/tab switcher menu. Raise the bar so its dropdowns stay on top. */
    z-index: 1030 !important;
}
/* Remove the top gap above the topbar + the rounded content float */
.main-content { margin-top: 0 !important; padding-top: 0 !important; border-radius: 0 !important; }
.navbar-main.pt-topbar { box-shadow: none !important; }

/* Content sits flush against the sidebar (16rem) / icon rail (6rem).
   margin-inline-END:0 is REQUIRED for RTL: Argon ships no RTL build, so its
   physical `.fixed-start + .main-content{margin-left:17.125rem}` (argon-
   dashboard.css) is NOT flipped under dir=rtl and would push the whole shell
   right, leaving a blank strip on the left. margin-inline-end:0 → margin-left:0
   in RTL kills it; harmless (margin-right:0) in LTR. */
@media (min-width: 768px) {
    /* TriangleCMS sidebar width = 256px (16rem), matching the design (was 20rem).
       Scoped to the EXPANDED state only (:not(.g-sidenav-hidden)) so the 6rem
       collapsed rail keeps its width, and ≥768px so the <768px phone drawer is
       untouched. High specificity (body + 4 classes) beats custom.css max-width:20rem. */
    body.g-sidenav-show:not(.g-sidenav-hidden) .sidenav.navbar-vertical.navbar-expand-xs.pt-sidenav { max-width: 16rem !important; }
    .g-sidenav-show .sidenav.fixed-start + .main-content { margin-inline-start: 16rem !important; margin-inline-end: 0 !important; }
    .g-sidenav-show.g-sidenav-hidden .sidenav.fixed-start + .main-content,
    .g-sidenav-hidden .navbar-vertical.fixed-start + .main-content,
    .g-sidenav-hidden .navbar-vertical:hover.fixed-start + .main-content { margin-inline-start: 6rem !important; margin-inline-end: 0 !important; }
}

/* Tablet (768–1199px): keep the sidebar on-screen and use the desktop
   expanded ⇄ icon-rail model instead of the phone drawer. Overrides Argon's
   <1200px off-canvas translateX (argon-dashboard.css §sidenav) for BOTH the
   expanded and the collapsed (g-sidenav-hidden) states. The phone drawer block
   further down now starts at <768px. */
@media (min-width: 768px) and (max-width: 1199.98px) {
    .g-sidenav-show .sidenav.navbar-vertical.navbar-expand-xs.pt-sidenav,
    .g-sidenav-show.g-sidenav-pinned .sidenav.navbar-vertical.navbar-expand-xs.pt-sidenav { transform: none !important; }
    /* Content margin — body-prefixed (specificity 0,4,1) to unambiguously beat
       Argon's `.g-sidenav-show .sidenav.fixed-start + .main-content{margin-left:0!important}`
       (0,4,0) that lives inside its own max-width:1199.98 block. RTL-safe
       (logical margin only — never a physical margin-left). */
    body.g-sidenav-show .sidenav.fixed-start + .main-content { margin-inline-start: 16rem !important; margin-inline-end: 0 !important; }
    body.g-sidenav-show.g-sidenav-hidden .sidenav.fixed-start + .main-content,
    body.g-sidenav-hidden .navbar-vertical.fixed-start + .main-content,
    body.g-sidenav-hidden .navbar-vertical:hover.fixed-start + .main-content { margin-inline-start: 6rem !important; margin-inline-end: 0 !important; }
}

/* ---------------------------------------------------------------------
   7. CARDS  (Argon .card + content wrapper)
   --------------------------------------------------------------------- */
.card {
    background-color: var(--pt-surface) !important;
    border: 1px solid var(--pt-border) !important;
    border-radius: var(--r-lg) !important;
    box-shadow: var(--shadow-md) !important;
    color: var(--pt-text);
}
.card .card-header { background-color: transparent !important; border-bottom: 1px solid var(--pt-border); }
/* The layout's CRUD content wrapper (<div class="card card-body mt-4">) blends
   into the page base bg (prototype: content sits on --bg-base #F5F5F5, not a
   white card) and drops the top gap. Inner cards/portlets/inputs stay white. */
main .card.card-body {
    padding: 0 !important;            /* flush — content (portlet) aligns with the #kt_subheader title */
    padding-top: var(--sp-4) !important;  /* small top breathing margin (on the card-body, not the container) */
    margin: 0 !important;
    background-color: var(--pt-bg) !important;
    border: 0 !important;
    box-shadow: none !important;
}
.card.card-custom { box-shadow: var(--shadow-md) !important; }

/* ---------------------------------------------------------------------
   8. BUTTONS
   --------------------------------------------------------------------- */
.btn {
    font-family: var(--pt-font);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    font-size: 0.84rem;            /* ~13.5px (TriangleCMS) */
    font-weight: 600;
    border-radius: var(--r-sm) !important;
    letter-spacing: -0.01em;
    box-shadow: none;
    transition: background-color var(--dur) var(--ease-out),
                filter var(--dur) var(--ease-out),
                box-shadow var(--dur) var(--ease-out) !important;
}
/* Icon + text buttons: consistent glyph size + gap (no Metronic margin jumps) */
.btn > i, .btn svg { font-size: 1rem; line-height: 1; }
.btn-sm, .btn-xs, .btn-icon-sm { font-size: 0.78rem; }
.btn-sm > i, .btn-xs > i, .btn-icon-sm > i, .btn-sm svg, .btn-xs svg { font-size: 0.85rem; }
.btn:active { transform: translateY(0.5px); }

/* Primary / brand CTA — FLAT brand fill (TriangleCMS spec). */
.btn-brand, .btn-primary {
    border: 0 !important;
    color: var(--pt-text-on-accent) !important;
    background-image: none !important;
    background-color: var(--tri-red) !important;
    box-shadow: var(--shadow-accent);
}
.btn-brand:hover, .btn-primary:hover {
    color: #fff !important;
    background-color: var(--tri-red-600) !important;
    box-shadow: var(--shadow-accent);
}
.btn-brand:active, .btn-primary:active { filter: brightness(0.97); }

/* Secondary / default / neutral */
.btn-default, .btn-secondary {
    background-color: var(--pt-surface) !important;
    color: var(--pt-text) !important;
    border: 1px solid var(--pt-border-strong) !important;
}
.btn-default:hover, .btn-secondary:hover {
    background-color: var(--pt-surface-hover) !important;
    border-color: var(--pt-border-strong) !important;
    color: var(--pt-text) !important;
}

/* Outline buttons → design GHOST. TriangleCMS has no colored outline buttons:
   every secondary action is a uniform ghost (white surface, dark text, strong
   border) and destructive ones are ghost + red text (design .btn-danger). This
   kills the Bootstrap/Metronic blue/cyan/orange outline rainbow CMS-wide
   (generator relation cards, activity pills, etc.). */
.btn-outline-brand, .btn-outline-primary, .btn-outline-secondary, .btn-outline-info,
.btn-outline-success, .btn-outline-warning, .btn-outline-dark, .btn-outline-light {
    background-color: var(--pt-surface) !important;
    color: var(--pt-text) !important;
    border: 1px solid var(--pt-border-strong) !important;
}
.btn-outline-brand:hover, .btn-outline-primary:hover, .btn-outline-secondary:hover,
.btn-outline-info:hover, .btn-outline-success:hover, .btn-outline-warning:hover,
.btn-outline-dark:hover, .btn-outline-light:hover,
.btn-outline-brand:focus, .btn-outline-primary:focus, .btn-outline-secondary:focus,
.btn-outline-info:focus, .btn-outline-success:focus, .btn-outline-warning:focus,
.btn-outline-dark:focus, .btn-outline-light:focus {
    background-color: var(--pt-surface-hover) !important;
    color: var(--pt-text) !important;
    border-color: var(--pt-border-strong) !important;
    box-shadow: none !important;
}
.btn-outline-danger {
    background-color: var(--pt-surface) !important;
    color: var(--tri-red-600) !important;
    border: 1px solid var(--pt-border-strong) !important;
}
.btn-outline-danger:hover, .btn-outline-danger:focus {
    background-color: var(--tri-red-50) !important;
    color: var(--tri-red-700) !important;
    border-color: var(--tri-red-200) !important;
    box-shadow: none !important;
}
html[data-theme="dark"] .btn-outline-danger:hover,
html[data-theme="dark"] .btn-outline-danger:focus {
    background-color: rgba(237, 26, 47, 0.12) !important;
    border-color: var(--pt-border-strong) !important;
}

/* Semantic buttons */
.btn-success { background-color: var(--pt-success) !important; border-color: var(--pt-success) !important; color: #fff !important; }
.btn-info    { background-color: var(--pt-info) !important;    border-color: var(--pt-info) !important;    color: #fff !important; }
.btn-warning { background-color: var(--pt-warning) !important; border-color: var(--pt-warning) !important; color: #fff !important; }
.btn-danger  { background-color: var(--pt-danger) !important;  border-color: var(--pt-danger) !important;  color: #fff !important; }
.btn-success:hover, .btn-info:hover, .btn-warning:hover, .btn-danger:hover { filter: brightness(1.05); }

/* Disabled / loading buttons keep their brand colour (faded) — overrides
   Argon's navy (#061222) disabled rule and any legacy yellow/grey state.
   Triggered e.g. by the kt-spinner loading class on form submits. */
.btn-brand:disabled, .btn-primary:disabled,
.btn-brand.disabled, .btn-primary.disabled,
.btn-brand[disabled], .btn-primary[disabled] {
    background-color: var(--tri-red) !important;
    background-image: none !important;
    border-color: var(--tri-red) !important;
    color: #fff !important;
    animation: none !important;
    box-shadow: none !important;
}
/* No chrome sheen on disabled/loading CTAs */
.btn-brand:disabled::after, .btn-primary:disabled::after,
.btn-brand.disabled::after, .btn-primary.disabled::after,
.btn-brand[disabled]::after, .btn-primary[disabled]::after { display: none !important; }
.btn-success:disabled, .btn-success.disabled, .btn-success[disabled] { background-color: var(--pt-success) !important; border-color: var(--pt-success) !important; color: #fff !important; }
.btn-info:disabled,    .btn-info.disabled,    .btn-info[disabled]    { background-color: var(--pt-info) !important;    border-color: var(--pt-info) !important;    color: #fff !important; }
.btn-warning:disabled, .btn-warning.disabled, .btn-warning[disabled] { background-color: var(--pt-warning) !important; border-color: var(--pt-warning) !important; color: #fff !important; }
.btn-danger:disabled,  .btn-danger.disabled,  .btn-danger[disabled]  { background-color: var(--pt-danger) !important;  border-color: var(--pt-danger) !important;  color: #fff !important; }
.btn:disabled, .btn.disabled, .btn[disabled] {
    opacity: .62 !important;
    box-shadow: none !important;
    cursor: not-allowed !important;
    transform: none !important;
}

.btn-label-brand {
    background-color: var(--pt-accent-soft) !important;
    color: var(--pt-indigo-700) !important;
    border: 0 !important;
}
html[data-theme="dark"] .btn-label-brand { color: var(--tri-red-300) !important; }

/* ---------------------------------------------------------------------
   9. FORMS
   --------------------------------------------------------------------- */
.form-control, .form-select, textarea.form-control, .kt-input {
    background-color: var(--pt-surface) !important;
    border: 1px solid var(--pt-border-strong) !important;
    border-radius: var(--r-sm) !important;
    color: var(--pt-text) !important;
    font-size: 13.5px;                /* TriangleCMS field text (was 0.84rem — broke at 13px root) */
    min-height: 40px;
    padding: 8px 13px;
    transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out);
}
textarea.form-control { min-height: 84px; line-height: 1.55; padding: 6px 8px; }
/* style_custom.bundle.css forces `.form-control{height:37px!important}` (and crushes
   textareas to 37px too); restore the design's 40px field height. */
input.form-control, select.form-control, .form-select, .kt-input:not(textarea) { height: 40px !important; }
textarea.form-control { height: auto !important; min-height: 84px !important; }
.form-control::placeholder, textarea.form-control::placeholder { color: var(--pt-text-soft); }
.form-control:hover, .form-select:hover, textarea.form-control:hover { border-color: var(--pt-border-strong); }
.form-control:focus, .form-select:focus, textarea.form-control:focus {
    border-color: var(--pt-accent) !important;
    box-shadow: 0 0 0 3px var(--pt-accent-soft) !important;
    background-color: var(--pt-surface) !important;
}
.form-control:disabled, .form-control[readonly] { background-color: var(--pt-bg-subtle) !important; }
.form-label, label { color: var(--pt-text); font-weight: 500; }
/* Field labels → compact 12.5px/600 (TriangleCMS .field-label) */
.form-group > label, .kt-form__label > label, .form-label, label.control-label { font-size: 12.5px; font-weight: 600; color: var(--pt-text); }
.form-text, .form-text.text-muted { color: var(--pt-text-muted); font-size: 11.5px; }

/* invalid */
.form-control.is-invalid { border-color: var(--pt-danger) !important; }
.form-control.is-invalid:focus { box-shadow: 0 0 0 4px var(--pt-danger-soft) !important; }
.invalid-feedback { color: var(--pt-danger); }

/* Legacy pink (#fd397a) error colour lives in inline blade <style> blocks
   (blog / newsEvent / newsEventsStatic / settings edit) that load AFTER this
   overlay — the `body` prefix raises specificity above them so errors read brand-red. */
body .form-group.has-error .form-control,
body .form-group.has-error .select2-container--default .select2-selection--single,
body .form-group.has-error .select2-container--default .select2-selection--multiple,
body .form-group.has-error input[type="file"] { border-color: var(--tri-red) !important; }
body .generator-field-error { color: var(--tri-red) !important; }

/* search input icon (Metronic) */
.kt-input-icon .form-control { padding-inline-start: 38px; }
.kt-input-icon textarea.form-control { padding-inline-start: 13px; }

/* ---------------------------------------------------------------------
   10. METRONIC PORTLETS → card-ify
   --------------------------------------------------------------------- */
/* Portlet → clean prototype card with a FOUR-corner atmospheric mesh gradient
   (matches design-system .mesh: red TL, grey TR, deep-red BR, grey BL). */
.kt-portlet {
    background-color: var(--pt-surface) !important;
    background-image: none !important; /* flattened — was 4-corner atmospheric mesh */
    border: 1px solid var(--pt-border) !important;
    border-radius: var(--r-lg) !important;
    box-shadow: var(--shadow-sm) !important;
    margin-bottom: var(--sp-4) !important;
}
.kt-portlet .kt-portlet__head {
    border-bottom: 1px solid var(--pt-border) !important;
    min-height: auto !important;
    padding: var(--sp-4) var(--sp-5) !important;
}
.kt-portlet .kt-portlet__head .kt-portlet__head-title {
    color: var(--pt-text) !important;
    font-weight: 650;
    letter-spacing: -0.018em;
}
.kt-portlet .kt-portlet__body { padding: var(--sp-5) !important; }
/* Restore zero padding for --fit bodies (datatable wrapper) — our !important above defeats the base style */
.kt-portlet .kt-portlet__body.kt-portlet__body--fit { padding: 0 !important; }
/* Remove bottom padding of search form body when directly followed by a datatable body */
.kt-portlet .kt-portlet__body:has(+ .kt-portlet__body--fit) { padding-bottom: 0 !important; }
.kt-portlet .kt-portlet__foot {
    border-top: 1px solid var(--pt-border) !important;
    background: transparent !important;
    padding: var(--sp-4) var(--sp-5) !important;
}

/* ---------------------------------------------------------------------
   11. DATATABLES (kt-datatable)
   --------------------------------------------------------------------- */
/* Prototype content-library table look (clean header, subtle rows, hover) */
.kt-datatable.kt-datatable--default > .kt-datatable__table {
    background-color: var(--pt-surface) !important;
    color: var(--pt-text);
}
/* Header → rounded pill strip with #EBEBEB background, separated from body rows */
.kt-datatable .kt-datatable__head,
.kt-datatable .kt-datatable__row.kt-datatable__row--head {
    background-color: var(--pt-surface-2) !important;
    border-bottom: 1px solid var(--pt-border) !important;
    border-radius: var(--r-lg) var(--r-lg) 0 0 !important;
    overflow: hidden;
    margin-bottom: 0 !important;
}
.kt-datatable .kt-datatable__head .kt-datatable__row {
    border-bottom: none !important;
}
html[data-theme="dark"] .kt-datatable .kt-datatable__head,
html[data-theme="dark"] .kt-datatable .kt-datatable__row.kt-datatable__row--head {
    background-color: var(--pt-surface-2) !important;
}
/* Header titles = TriangleCMS .tbl thead th spec (11px / 700 / .04em / uppercase / subtle).
   font-weight needs !important: style.bundle sets 500 on the same spans at (0,6,1)
   specificity, which beats this low-specificity selector regardless of load order.
   NO white-space:nowrap here (despite the design spec): KTDatatable clamps auto
   columns to 110px and Metronic head spans are overflow:hidden+ellipsis, so long
   generated titles ("News & Event …" ×8) would truncate indistinguishably with no
   tooltip. Short titles never wrap anyway, so wrapping only kicks in where it helps. */
.kt-datatable__head .kt-datatable__cell > span {
    color: var(--pt-text-soft) !important;
    font-weight: 700 !important;
    text-transform: uppercase;
    font-size: 11px;
    letter-spacing: 0.04em;
}
/* Header strip height → design 42px: Metronic pads head cells 16px vertically,
   which renders a 50px strip (16+18+16). 12px + the 18px line box = 42px. */
.kt-datatable__head .kt-datatable__cell { padding-block: 12px !important; }
/* Sort-direction arrow: Metronic paints it brand-blue #5d78ff; use a neutral
   theme token like the design's sorted-column glyph. */
.kt-datatable__head .kt-datatable__cell > span > i { color: var(--pt-text-muted) !important; }
/* Body → subtle row dividers (none on the last row), a touch more height, hover */
.kt-datatable__body .kt-datatable__row {
    border-bottom: 1px solid var(--pt-border) !important;
    transition: background-color var(--dur) var(--ease-out);
}
.kt-datatable__body .kt-datatable__row:last-child { border-bottom: 0 !important; }
.kt-datatable__body .kt-datatable__row:hover { background-color: var(--pt-surface-hover) !important; }
.kt-datatable__cell { color: var(--pt-text); }
.kt-datatable.kt-datatable--default > .kt-datatable__table > .kt-datatable__body .kt-datatable__cell { padding-block: 11px !important; }
/* First column reads as the primary cell (bolder), like the prototype */
.kt-datatable__body .kt-datatable__row > .kt-datatable__cell:first-child > span {
    color: var(--pt-text) !important;
    font-weight: 600;
}

/* pager */
.kt-datatable .kt-datatable__pager { border-top: 1px solid var(--pt-border); background: transparent; }
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--active {
    background: var(--tri-grey) !important;
    color: #fff !important;
    border: 0 !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > a {
    border-radius: var(--r-sm) !important;
    border: 1px solid var(--pt-border) !important;
    color: var(--pt-text-muted) !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > a:hover {
    background: var(--pt-surface-hover) !important;
    color: var(--pt-text) !important;
}
/* Pager links → evenly-spaced square buttons (TriangleCMS .pg: 32px box, 12.5px/600
   text) + muted 12.5px info text. !important px: style.bundle sizes these in rem
   (2.25rem box, 1rem text) at higher specificity, which inflates at the 16px root. */
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > a {
    min-width: 32px !important; height: 32px !important; line-height: 30px !important;
    font-size: 12.5px !important; font-weight: 600 !important;
    text-align: center; margin-inline: 2px; padding: 0 8px !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info { color: var(--pt-text-soft); font-size: 12.5px; }
/* Jump-to-page input + page-size dropdown button: same 32px control height. */
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-pager-input { height: 32px !important; width: 45px !important; }
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle {
    height: 32px !important; padding-block: 0 !important;
}

/* ── Datatable SEARCH → flat rounded pill (TriangleCMS .search-box) ── */
.kt-portlet .kt-input-icon--left { max-width: 360px; }
.kt-portlet .kt-input-icon #generalSearch {
    background: var(--pt-surface-2) !important;
    border: 1px solid transparent !important;
    border-radius: var(--r-sm) !important;
    transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out), background-color var(--dur) var(--ease-out);
}
.kt-portlet .kt-input-icon #generalSearch:focus {
    background: var(--pt-surface) !important;
    border-color: var(--pt-accent) !important;
    box-shadow: 0 0 0 3px var(--pt-accent-soft) !important;
}
.kt-portlet .kt-input-icon .kt-input-icon__icon,
.kt-portlet .kt-input-icon .kt-input-icon__icon i { color: var(--pt-text-soft) !important; }

/* ── Datatable BULK-ACTION BAR → dark charcoal (TriangleCMS .bulkbar) ──
   Shared id across EVERY list view (incl. generated), so this styles them all. */
#kt_datatable_group_action_form {
    background: var(--tri-grey) !important;
    border-radius: var(--r-md) !important;
    padding: var(--sp-3) var(--sp-4) !important;
    margin-top: var(--sp-3) !important;
    margin-bottom: var(--sp-2) !important;
    border: 0 !important;
}
#kt_datatable_group_action_form .row,
#kt_datatable_group_action_form .col-xl-12 { margin: 0 !important; padding: 0 !important; }
#kt_datatable_group_action_form .kt-form__group--inline { display: flex; align-items: center; width: 100%; margin: 0; flex-wrap: nowrap; }
#kt_datatable_group_action_form .kt-form__label { margin: 0; padding: 0; }
#kt_datatable_group_action_form .kt-form__label label,
#kt_datatable_group_action_form #kt_datatable_selected_number { color: #fff !important; font-weight: 600; margin: 0; }
#kt_datatable_group_action_form .kt-form__control { margin-inline-start: auto; }
#kt_datatable_group_action_form .btn-toolbar { margin: 0; }
#kt_datatable_group_action_form #kt_datatable_delete_all {
    background: rgba(255, 255, 255, 0.12) !important;
    border: 0 !important;
    color: #fff !important;
    border-radius: var(--r-sm) !important;
    font-weight: 600;
}
#kt_datatable_group_action_form #kt_datatable_delete_all:hover { background: var(--tri-red) !important; color: #fff !important; }

/* ---------------------------------------------------------------------
   12. TABS & PILLS
   --------------------------------------------------------------------- */
.nav.nav-pills { background: transparent !important; gap: var(--sp-1); }
.nav.nav-pills .nav-link {
    background-color: var(--pt-chip) !important;
    color: var(--pt-text-muted) !important;
    border-radius: var(--r-sm) !important;
    font-weight: 600;
    transition: all var(--dur) var(--ease-out);
}
.nav.nav-pills .nav-link:hover { color: var(--pt-text) !important; }
.nav-pills .nav-item .nav-link.active,
.nav-pills .nav-item .nav-link.active:hover {
    background: var(--pt-surface) !important;
    color: var(--pt-text) !important;
    box-shadow: var(--shadow-sm);
}
/* menu-tabs inherit the generic flat nav-pills look (grey chip default,
   white raised active) — they now sit on the flat light topbar. */
.menu-tabs .nav-pills .nav-item .nav-link.active { color: var(--pt-text) !important; }

/* line tabs (relation tabs) */
.nav-tabs-line .nav-link, .nav.nav-tabs .nav-link {
    color: var(--pt-text-muted);
    border: 0;
    border-bottom: 2px solid transparent;
    font-weight: 600;
    transition: color var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out);
}
.nav-tabs-line .nav-link.active, .nav.nav-tabs .nav-link.active {
    color: var(--pt-accent) !important;
    border-bottom-color: var(--pt-accent) !important;
    background: transparent !important;
}
.nav-tabs-line .nav-link .nav-icon i, .nav.nav-tabs .nav-link.active .nav-icon i { color: inherit; }

/* analytics tabs */
.analytics-tabs .dashboard-tab { color: var(--pt-text-muted); border-radius: var(--r-md); }
.analytics-tabs .dashboard-tab::before { background: var(--pt-cta-grad) !important; border-radius: var(--r-md); }

/* Relation-tab tables (generated + baked): theme-aware sticky last column + grey
   Inactive badge. The baked inline rules set these without !important, so these win. */
.relation-tab-content .table thead th:last-child,
.relation-tab-content .table tbody td:last-child { background-color: var(--pt-surface) !important; }
.relation-tab-content .table thead th:last-child { background-color: var(--pt-surface-2) !important; }
.relation-tab-content .table-hover tbody tr:hover td:last-child { background-color: var(--pt-surface-hover) !important; }
.relation-tab-content .badge-secondary { background-color: var(--pt-chip) !important; color: var(--pt-text-muted) !important; }

/* =====================================================================
   ADMIN + GENERATOR primitives the overlay previously missed — flat values
   (Bootstrap badge variants, legacy validation classes, permission-tree
   checkbox tick, generator/customApi config surfaces).
   ===================================================================== */
/* Bootstrap BS4 badge colour variants (relation tabs, generator, admin) → flat */
.badge-primary   { background-color: var(--pt-accent) !important; color: #fff !important; }
.badge-secondary { background-color: var(--pt-chip) !important; color: var(--pt-text-muted) !important; }
.badge-success   { background-color: var(--pt-success-soft) !important; color: var(--pt-alert-success-text) !important; }
.badge-info      { background-color: var(--pt-info-soft) !important;    color: var(--pt-alert-info-text) !important; }
.badge-warning   { background-color: var(--pt-warning-soft) !important; color: var(--pt-alert-warning-text) !important; }
.badge-danger    { background-color: var(--pt-danger-soft) !important;  color: var(--pt-alert-danger-text) !important; }
.badge-dark      { background-color: var(--tri-grey) !important; color: #fff !important; }
.badge-purple, .badge-light-purple { background-color: rgba(122, 90, 224, 0.14) !important; color: var(--pt-violet) !important; }

/* Legacy jQuery-validate error visuals (settings/user/etc.) → brand red */
body .error-border, body .error-border .form-control { border-color: var(--tri-red) !important; }
.kt-form .error, .kt-form label.error, .form-group label.error { color: var(--tri-red) !important; }

/* Permission-tree checkbox ticks → brand red (was Metronic green/indigo) */
#adminMenuPermission .kt-checkbox > input:checked ~ span,
#webMenuPermission .kt-checkbox > input:checked ~ span { background: var(--tri-red) !important; border-color: var(--tri-red) !important; }

/* Generator / Custom-API config surfaces → flat */
.card-header.bg-light { background-color: var(--pt-surface-2) !important; border-bottom: 1px solid var(--pt-border) !important; color: var(--pt-text) !important; }
.btn-link { color: var(--pt-accent) !important; }
.alert-light { background-color: var(--pt-surface-2) !important; color: var(--pt-text) !important; border: 1px solid var(--pt-border) !important; }
.alert-info  { background-color: var(--pt-info-soft) !important; color: var(--pt-alert-info-text) !important; border-color: transparent !important; }
.font-monospace { font-family: var(--pt-font-mono) !important; }

/* Auth brand panel (reset / change-password / expiry — old split layout) →
   charcoal with the white wordmark, matching the rebuilt login split. */
.page-header .bg-gradient-primary {
    background-color: var(--sb-bg) !important;
    background-image: url("/images/triangle-logo-white.png") !important;
    background-size: 44% auto !important;
    background-position: center !important;
    background-repeat: no-repeat !important;
}
.page-header .mask.bg-gradient-primary { background: rgba(35, 34, 39, 0.35) !important; background-image: none !important; }

/* ---------------------------------------------------------------------
   13. MODALS
   --------------------------------------------------------------------- */
.modal-content {
    background-color: var(--pt-surface) !important;
    border: 1px solid var(--pt-border) !important;
    border-radius: var(--r-lg) !important;
    box-shadow: var(--shadow-lg) !important;
    color: var(--pt-text);
}
.modal-header {
    border-bottom: 1px solid var(--pt-border) !important;
    padding: var(--sp-4) var(--sp-5);
}
.modal-title { color: var(--pt-text) !important; font-weight: 700; }
.modal-body { padding: var(--sp-5); }
.modal-footer { border-top: 1px solid var(--pt-border) !important; padding: var(--sp-4) var(--sp-5); }
.modal-backdrop.show {
    background-color: rgba(8, 11, 18, 0.55);
    -webkit-backdrop-filter: blur(4px);
    backdrop-filter: blur(4px);
}
html[data-theme="dark"] .btn-close { filter: invert(1) grayscale(1) brightness(1.6); }

/* Keep secondary / dismiss buttons neutral in modal footers.
   (custom.css paints all .modal-footer buttons with the red CTA; override the
   cancel/secondary so it doesn't clash with the red confirm. Specificity 0,3,0
   beats custom.css 0,2,1; id-scoped #deleteModal rules intentionally still win.) */
.modal .modal-footer .btn-secondary,
.modal .modal-footer button[data-bs-dismiss="modal"] {
    background: var(--pt-surface) !important;
    background-image: none !important;
    color: var(--pt-text) !important;
    border: 1px solid var(--pt-border-strong) !important;
}
.modal .modal-footer .btn-secondary:hover,
.modal .modal-footer button[data-bs-dismiss="modal"]:hover {
    background: var(--pt-surface-hover) !important;
    color: var(--pt-text) !important;
}

/* ---------------------------------------------------------------------
   14. ALERTS & TOASTS
   --------------------------------------------------------------------- */
.alert { border: 1px solid transparent; border-radius: var(--r-md); font-weight: 500; }
.alert.alert-success { background: var(--pt-success-soft) !important; border-color: var(--pt-success) !important; color: var(--pt-alert-success-text) !important; }
.alert.alert-danger  { background: var(--pt-danger-soft) !important;  border-color: var(--pt-danger) !important;  color: var(--pt-alert-danger-text) !important; }
.alert.alert-warning { background: var(--pt-warning-soft) !important; border-color: var(--pt-warning) !important; color: var(--pt-alert-warning-text) !important; }
.alert.alert-info    { background: var(--pt-info-soft) !important;    border-color: var(--pt-info) !important;    color: var(--pt-alert-info-text) !important; }
.alert .alert-text { color: inherit !important; }
/* Alert body text inherits the alert's semantic colour. The package alert
   component hardcodes <p class="text-white"> (legacy dark-gradient design);
   on the new light alerts that would be invisible, so force inherit. */
.alert .text-white,
.alert p { color: inherit !important; }

#adminToast { border-radius: var(--r-md) !important; box-shadow: var(--shadow-lg) !important; }
#adminToast.bg-success { background-color: var(--pt-success) !important; }
#adminToast.bg-danger  { background-color: var(--pt-danger) !important; }
#adminToast.bg-warning { background-color: var(--pt-warning) !important; }
#adminToast.bg-info    { background-color: var(--pt-info) !important; }

/* ---------------------------------------------------------------------
   15. BADGES
   --------------------------------------------------------------------- */
.badge { border-radius: var(--r-pill); font-weight: 600; letter-spacing: 0.01em; padding: 0.4em 0.7em; }
.badge.badge-success, .badge.bg-success { background-color: var(--pt-success-soft) !important; color: var(--pt-success) !important; }
.badge.badge-danger,  .badge.bg-danger  { background-color: var(--pt-danger-soft) !important;  color: var(--pt-danger) !important; }
.badge.badge-secondary, .badge.bg-secondary { background-color: var(--pt-chip) !important; color: var(--pt-text-muted) !important; }

/* ---------------------------------------------------------------------
   16. SWITCHES / CHECKBOXES / RADIOS (Metronic)
   --------------------------------------------------------------------- */
.kt-switch.kt-switch--icon input:checked ~ span:before,
.kt-switch input:checked ~ span:before { background-color: var(--pt-accent) !important; }
.kt-switch span:before { transition: background-color var(--dur) var(--ease-out) !important; }

/* Metronic checkbox box — theme-aware border + surface (Metronic hardcodes a
   light #d1d7e2 border that looks wrong in dark mode). Checked = brand red. */
/* Metronic forces the kt-checkbox box border transparent in several states
   (.kt-checkbox--solid > span at 0,2,1; > input:focus ~ span at 0,3,1; and the
   :hover variant at 0,4,1 — all with !important). So a checked→unchecked box kept
   focus and went invisible again. We restate a visible mid-grey border keyed on
   :not(:checked) at specificity 0,4,1, which covers base + focus + hover. */
.kt-checkbox > span,
.kt-checkbox.kt-checkbox--solid > input:not(:checked):not([disabled]) ~ span,
.kt-checkbox.kt-checkbox--tick > input:not(:checked):not([disabled]) ~ span {
    border: 1px solid var(--pt-text-soft) !important;   /* mid-grey: visible on any surface in both themes */
    background-color: transparent !important;
    border-radius: var(--r-xs) !important;
}
/* Checked → brand red fill + border. Declared AFTER (equal 0,4,1 specificity) so it
   wins for the checked + checked-hover cases. */
.kt-checkbox.kt-checkbox--solid > input:checked:not([disabled]) ~ span,
.kt-checkbox.kt-checkbox--tick > input:checked:not([disabled]) ~ span,
.kt-checkbox > input:checked ~ span {
    background: var(--tri-red) !important;
    border-color: var(--tri-red) !important;
}
.radio-inline input:checked { background: var(--pt-accent) !important; border: 0 !important; }

/* ---------------------------------------------------------------------
   17. TAGIFY
   --------------------------------------------------------------------- */
.tagify { border-radius: var(--r-sm); border-color: var(--pt-border-strong); background: var(--pt-surface); }
.tagify .tagify__tag { background: var(--pt-chip) !important; border-radius: var(--r-pill); }
.tagify .tagify__tag > div .tagify__tag-text, .tagify .tagify__tag .tagify__tag__removeBtn { color: var(--pt-text-muted) !important; }

/* ---------------------------------------------------------------------
   18. SELECT2
   --------------------------------------------------------------------- */
.select2-container--default .select2-selection--single,
.select2-container--default .select2-selection--multiple {
    background-color: var(--pt-surface) !important;
    border: 1px solid var(--pt-border-strong) !important;
    border-radius: var(--r-sm) !important;
    color: var(--pt-text) !important;
}
/* Single select: match the 40px input height and vertically CENTRE the value via
   flex — removes Select2's default line-height gap that pushed the text down. */
.select2-container--default .select2-selection--single {
    height: 40px !important;
    display: flex !important;
    align-items: center !important;
    padding: 0 !important;
}
.select2-container--default .select2-selection--multiple { min-height: 40px; padding: 3px 6px; }
.select2-container--default .select2-selection--single .select2-selection__rendered {
    flex: 1 1 auto;
    color: var(--pt-text) !important;
    line-height: 1.2 !important;
    padding-inline-start: 13px !important;
    padding-inline-end: 30px !important;
}
.select2-container--default .select2-selection--single .select2-selection__placeholder { color: var(--pt-text-soft) !important; }
/* Centre the dropdown caret within the full height */
.select2-container--default .select2-selection--single .select2-selection__arrow {
    height: 100% !important;
    top: 0 !important;
    inset-inline-end: 8px !important;
}
/* Select2 focus → same accent border + soft ring as native inputs (TriangleCMS) */
.select2-container--default.select2-container--focus .select2-selection--single,
.select2-container--default.select2-container--focus .select2-selection--multiple,
.select2-container--default.select2-container--open .select2-selection--single,
.select2-container--default.select2-container--open .select2-selection--multiple {
    border-color: var(--pt-accent) !important;
    box-shadow: 0 0 0 3px var(--pt-accent-soft) !important;
}
.select2-container--default .select2-search__field:focus {
    border-color: var(--pt-accent) !important;
    box-shadow: 0 0 0 3px var(--pt-accent-soft) !important;
    outline: none !important;
}
.select2-dropdown { background-color: var(--pt-surface) !important; border-color: var(--pt-border-strong) !important; border-radius: var(--r-sm); box-shadow: var(--shadow-lg); }
.select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: var(--pt-accent-soft) !important; color: var(--pt-accent) !important; border-left: 3px solid var(--pt-accent) !important; }
.select2-container--default .select2-results__option[aria-selected=true] { background-color: var(--pt-surface-hover) !important; color: var(--pt-text-muted) !important; }
.select2-container--default .select2-selection--multiple .select2-selection__choice { background: var(--pt-accent-soft) !important; border: 0 !important; color: var(--pt-indigo-700) !important; border-radius: var(--r-xs); }

/* ---------------------------------------------------------------------
   19. SUBHEADER → prototype .page__head (clean, box-less header)
   ---------------------------------------------------------------------
   Was a boxed bar (surface + radius + shadow). The prototype page head is a
   plain title + actions row with no chrome, so strip the box and reduce
   spacing (also overrides custom.css's radius:13px / padding / shadow).
   --------------------------------------------------------------------- */
.kt-subheader {
    background: transparent !important;
    border: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
    margin-bottom: var(--sp-2) !important;
}
.kt-subheader .kt-container,
.kt-subheader .kt-container--fluid {
    padding-inline: 0 !important;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-3);
    flex-wrap: wrap;
}
.kt-subheader .kt-subheader__main { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2) var(--sp-3); min-width: 0; }
.kt-subheader .kt-subheader__title {
    color: var(--pt-text) !important;
    font-size: 1.5rem !important;
    font-weight: 650 !important;
    letter-spacing: -0.018em;
    margin: 0 !important;
}
.kt-subheader .kt-subheader__breadcrumbs { color: var(--pt-text-muted); }
.breadcrumb { background: transparent; }

/* ---------------------------------------------------------------------
   20. SCROLLBARS
   --------------------------------------------------------------------- */
* { scrollbar-width: thin; scrollbar-color: var(--pt-border-strong) transparent; }
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-thumb { background: var(--pt-border-strong); border-radius: var(--r-pill); border: 2px solid transparent; background-clip: content-box; }
*::-webkit-scrollbar-thumb:hover { background: var(--pt-text-soft); background-clip: content-box; }

/* ---------------------------------------------------------------------
   21. FOCUS-VISIBLE (a11y)
   --------------------------------------------------------------------- */
a:focus-visible, button:focus-visible, .btn:focus-visible,
.nav-link:focus-visible, [tabindex]:focus-visible {
    outline: 2px solid var(--pt-accent);
    outline-offset: 2px;
}
/* Text inputs / selects / textareas show ONLY the soft accent ring from :focus
   (border + 3px ring) — never the hard outline above. Matches TriangleCMS focus. */
.form-control:focus-visible, .form-select:focus-visible,
textarea:focus-visible, textarea.form-control:focus-visible,
input.form-control:focus-visible, .kt-input:focus-visible { outline: none !important; }

/* ---------------------------------------------------------------------
   21b. AUTH PAGES (login / forgot / reset / change password) — shared
        split-screen TriangleCMS layout. Used by every view under
        resources/views/vendor/admin/argon/auth/.
   --------------------------------------------------------------------- */
.pt-login { min-height: 100vh; display: grid; grid-template-columns: 1fr 1fr; background: var(--pt-bg); }

/* Brand panel (charcoal + triangle pattern) */
.pt-login__brand { position: relative; overflow: hidden; background: #232227; color: #fff; display: flex; flex-direction: column; padding: 48px; }
.pt-login__pattern { position: absolute; inset: 0; width: 100%; height: 100%; opacity: .5; }
.pt-login__mark { position: absolute; inset-inline-end: -70px; bottom: -50px; width: 380px; height: auto; opacity: .14; pointer-events: none; }
.pt-login__logo { height: 76px; width: auto; display: block; position: relative; }
.pt-login__pill { display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px; border-radius: 30px; background: rgba(255, 255, 255, .08); font-size: 12px; font-weight: 600; margin-bottom: 24px; }
.pt-login__pill .dot { width: 8px; height: 8px; border-radius: 50%; background: #ED1A2F; display: inline-block; }
.pt-login__headline { font-family: var(--pt-font-heading); font-size: 42px; font-weight: 600; line-height: 1.1; letter-spacing: -.03em; margin: 0; max-width: 460px; color: #fff; }
.pt-login__sub { font-size: 15px; color: rgba(255, 255, 255, .6); margin-top: 18px; max-width: 420px; line-height: 1.6; }

/* Form panel */
.pt-login__form-wrap { display: grid; place-items: center; padding: 48px; background: var(--pt-bg); }
.pt-login__form { width: 100%; max-width: 380px; }
.pt-login__title { font-family: var(--pt-font-heading); font-size: 27px; font-weight: 600; letter-spacing: -.02em; margin: 0; color: var(--pt-text); }
.pt-login__lead { margin: 6px 0 30px; font-size: 14px; color: var(--pt-text-muted); }
.pt-login__form form { display: flex; flex-direction: column; gap: 18px; }

/* field + label (label row supports a right-aligned action link) */
.pt-field { display: flex; flex-direction: column; gap: 7px; }
.pt-field__label { font-size: 12.5px; font-weight: 600; color: var(--pt-text); display: flex; align-items: center; margin: 0; }
.pt-field__label--row { justify-content: space-between; }
.pt-field__action { font-size: 12px; color: var(--pt-accent); font-weight: 600; text-decoration: none; }
.pt-field__action:hover { text-decoration: underline; color: var(--pt-accent); }

/* input group: lead icon (left) + optional affix (right) over a .form-control */
.pt-login .pt-input-group { position: relative; display: flex; align-items: center; }
.pt-login .pt-input-lead { position: absolute; inset-inline-start: 12px; color: var(--pt-text-soft); display: grid; place-items: center; pointer-events: none; font-size: .9rem; z-index: 2; }
.pt-login .pt-input-group .form-control { width: 100%; }
.pt-login .pt-input--lead { padding-inline-start: 36px !important; }
.pt-login .pt-input--affix { padding-inline-end: 50px !important; }
.pt-login .pt-input-affix { position: absolute; inset-inline-end: 1px; height: calc(100% - 2px); display: flex; align-items: center; padding: 0 13px; color: var(--pt-text-soft); border-inline-start: 1px solid var(--pt-border); background: var(--pt-surface-2); border-radius: 0 var(--r-sm) var(--r-sm) 0; cursor: pointer; transition: color .14s; z-index: 2; }
.pt-login .pt-input-affix:hover { color: var(--pt-text); }
.pt-login .pt-input-affix i { cursor: pointer; }
/* Validation errors: red border + soft ring exactly like :focus (jQuery Validate adds
   .error to the input; server-side may add .is-invalid), with NO Bootstrap icon (it
   collides with the eye affix). The message label is forced BELOW the field at full
   width so the input never changes size when an error appears. */
.pt-login .form-control.error,
.pt-login .form-control.is-invalid,
.pt-login .was-validated .form-control:invalid {
    border-color: var(--pt-accent) !important;
    box-shadow: 0 0 0 3px var(--pt-accent-soft) !important;
    background-image: none !important;
}
.pt-login label.error,
.pt-login .invalid-feedback.error {
    display: block;
    width: 100%;
    margin-top: 5px;
    color: var(--pt-danger);
    font-size: 12px;
    font-weight: 500;
}

/* checkbox (Keep me signed in) */
.pt-check { display: inline-flex; align-items: center; gap: 9px; cursor: pointer; margin: 0; font-size: 13px; color: var(--pt-text); user-select: none; }
.pt-check__input { position: absolute; opacity: 0; width: 0; height: 0; }
.pt-check__box { width: 18px; height: 18px; border-radius: 5px; border: 1.5px solid var(--pt-border-strong); background: var(--pt-surface); display: grid; place-items: center; flex-shrink: 0; transition: .14s; }
.pt-check__box i { font-size: 10px; color: #fff; opacity: 0; transition: opacity .14s; }
.pt-check__input:checked + .pt-check__box { background: var(--pt-accent); border-color: var(--pt-accent); }
.pt-check__input:checked + .pt-check__box i { opacity: 1; }
.pt-check__input:focus-visible + .pt-check__box { box-shadow: 0 0 0 3px var(--pt-accent-soft); }

/* submit + footer */
.pt-login__submit { width: 100%; height: 46px; font-size: 14.5px; display: inline-flex; align-items: center; justify-content: center; gap: 8px; margin-top: 2px; }
.pt-login__submit i { font-size: 1rem; color: #fff; }
.pt-login #alert { margin-top: 14px; }
.pt-login__foot { font-size: 12px; text-align: center; margin-top: 32px; color: var(--pt-text-soft); }
.pt-login__foot span { color: var(--pt-text-muted); }
.pt-login__back { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--pt-text-muted); text-decoration: none; }
.pt-login__back:hover { color: var(--pt-accent); }
.pt-login__backwrap { text-align: center; margin-top: 22px; }
.pt-login .invalid-feedback { margin-top: 4px; }

@media (max-width: 991.98px) {
    /* Stack layout — same treatment as the login page on mobile */
    .pt-login { grid-template-columns: 1fr; min-height: 100vh; align-items: start; }
    /* Brand header: dark slab with a diagonal bottom cut, logo centred */
    .pt-login__brand {
        padding: 48px 32px 72px;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        text-align: center;
        min-height: unset;
        clip-path: polygon(0 0, 100% 0, 100% 82%, 0 100%);
        margin-bottom: -2px;
    }
    .pt-login__pattern { opacity: .35; }
    .pt-login__mark { display: none; }
    .pt-login__logo { height: 60px; }
    .pt-login__pill, .pt-login__headline, .pt-login__sub { display: none; }
    .pt-login__brand > div { margin-top: 0 !important; position: relative; }
    .pt-login__form-wrap { padding: 36px 28px 40px; align-items: start; }
    .pt-login__form { max-width: 100%; }
}
@media (max-width: 479.98px) {
    .pt-login__brand { padding: 40px 24px 64px; }
    .pt-login__logo { height: 50px; }
    .pt-login__form-wrap { padding: 28px 20px 36px; }
}

/* ---------------------------------------------------------------------
   22. REDUCED MOTION
   --------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.001ms !important;
        scroll-behavior: auto !important;
    }
    .btn:hover, .navbar-main .pt-theme-toggle:hover { transform: none; }
    .btn-brand:hover, .btn-primary:hover { animation: none !important; }
    .min-height-300.bg-primary::before,
    .position-absolute.bg-primary.w-100::before,
    .mask.bg-primary::before { animation: none !important; }
    .page-header::before, .bg-gradient-primary { animation: none !important; }
}

/* =====================================================================
   EXTENSION  ·  coverage gaps (guest screens, BS components)
   Appended after the base layer. Higher-specificity rules win where
   they overlap the generic component rules above.
   ===================================================================== */

/* ---------------------------------------------------------------------
   23. GUEST / AUTH SCREENS  (login · reset · change-password)
   --------------------------------------------------------------------- */
.page-header {
    position: relative;
    background-color: var(--pt-bg) !important;
}
.page-header::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 0;
    pointer-events: none;
    /* Brand: single subtle red apex glow on a clean neutral field (flat) */
    background: radial-gradient(46% 46% at 50% -4%, var(--pt-accent-soft), transparent 70%);
}
.page-header > .container,
.page-header > .row { position: relative; z-index: 1; }

/* Plain cards (login form) must NOT inherit the solid .card surface */
.card.card-plain {
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
}
.card.card-plain .card-header { border-bottom: 0 !important; }

/* Auth showcase panel + any gradient hero → mesh atmosphere */
/* Flattened to solid fills (brand is matte; red kept sparing → primary = grey) */
/*.bg-gradient-primary { background-image: none !important; background-color: var(--tri-grey) !important; }*/
.bg-gradient-info    { background-image: none !important; background-color: var(--pt-info) !important; }
.bg-gradient-success { background-image: none !important; background-color: var(--pt-success) !important; }
.bg-gradient-danger  { background-image: none !important; background-color: var(--pt-danger) !important; }
.bg-gradient-warning { background-image: none !important; background-color: var(--pt-warning) !important; }
.bg-gradient-dark    { background-image: none !important; background-color: var(--tri-grey) !important; }

/* Brand text — flat (was gradient-clipped) */
.text-gradient {
    color: var(--pt-accent);
    -webkit-text-fill-color: var(--pt-accent);
}
.text-primary { color: var(--pt-accent) !important; }

/* ---------------------------------------------------------------------
   24. BOOTSTRAP DROPDOWN MENUS  (navbar purge, row actions, etc.)
   --------------------------------------------------------------------- */
.dropdown-menu {
    background-color: var(--glass-bg-strong) !important;
    -webkit-backdrop-filter: var(--glass-blur-strong);
    backdrop-filter: var(--glass-blur-strong);
    border: 1px solid var(--glass-border) !important;
    border-top-color: var(--glass-top) !important;
    border-radius: var(--r-md) !important;
    box-shadow: var(--shadow-lg) !important;
    padding: var(--sp-2);
    color: var(--pt-text);
}
.dropdown-item {
    color: var(--pt-text) !important;
    border-radius: var(--r-sm);
    padding: 8px 12px;
    font-weight: 500;
    transition: background-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.dropdown-item:hover,
.dropdown-item:focus {
    background-color: var(--pt-accent-soft) !important;
    color: var(--pt-indigo-700) !important;
}
html[data-theme="dark"] .dropdown-item:hover,
html[data-theme="dark"] .dropdown-item:focus { color: var(--tri-red-300) !important; }
.dropdown-item.active,
.dropdown-item:active { background: var(--pt-accent-soft) !important; color: var(--pt-indigo-700) !important; }
.dropdown-item > i { color: var(--pt-text-soft); margin-inline-end: 2px; }
.dropdown-item:hover > i, .dropdown-item:focus > i { color: var(--pt-accent); }
.dropdown-divider { border-top-color: var(--pt-border) !important; opacity: 1; }
.dropdown-header { color: var(--pt-text-soft); text-transform: uppercase; font-size: 0.72rem; letter-spacing: 0.04em; }

/* ---------------------------------------------------------------------
   25. NATIVE FORM CHECK / SWITCH / RADIO  (Bootstrap .form-check)
   --------------------------------------------------------------------- */
.form-check-input {
    background-color: var(--pt-surface);
    border: 1px solid var(--pt-border-strong);
    transition: background-color var(--dur) var(--ease-out),
                border-color var(--dur) var(--ease-out),
                box-shadow var(--dur) var(--ease-out);
}
.form-check-input:checked {
    background-color: var(--pt-accent) !important;
    border-color: var(--pt-accent) !important;
}
.form-check-input:focus {
    border-color: var(--pt-accent);
    box-shadow: 0 0 0 4px var(--pt-focus-ring);
}
.form-switch .form-check-input { width: 2.4em; }
.form-check-label { color: var(--pt-text); }

/* ---------------------------------------------------------------------
   26. INPUT GROUPS  (e.g. purge-URL modal)
   --------------------------------------------------------------------- */
.input-group-text {
    background-color: var(--pt-surface-3) !important;
    border: 1px solid var(--pt-border-strong) !important;
    color: var(--pt-text-muted) !important;
    font-size: 0.78rem;
    padding: 0 11px;
}
.input-group > :not(:first-child):not(.dropdown-menu):not(.invalid-feedback):not(.valid-feedback) {
    border-start-start-radius: 0 !important;
    border-end-start-radius: 0 !important;
}
.input-group > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu) {
    border-start-end-radius: 0 !important;
    border-end-end-radius: 0 !important;
}

/* ---------------------------------------------------------------------
   27. BOOTSTRAP TABLES  (.table — non-datatable lists)
   --------------------------------------------------------------------- */
.table {
    color: var(--pt-text);
    --bs-table-bg: transparent;
    border-color: var(--pt-border);
}
.table > :not(caption) > * > * {
    background-color: transparent;
    border-bottom-color: var(--pt-border) !important;
    color: inherit;
}
/* Same TriangleCMS .tbl thead th spec as the kt-datatable headers (§11) so every
   table header in the CMS reads identically. */
.table > thead th,
.table > thead td {
    color: var(--pt-text-soft) !important;
    text-transform: uppercase;
    font-size: 11px;
    letter-spacing: 0.04em;
    font-weight: 700;
    border-bottom: 1px solid var(--pt-border) !important;
}
.table-hover > tbody > tr:hover > * {
    background-color: var(--pt-surface-hover) !important;
    color: var(--pt-text);
}
/* bordered tables (e.g. permission tree) — vertical/cell borders follow theme */
.table-bordered, .table-bordered > :not(caption) > * { border-color: var(--pt-border) !important; }
.table-bordered > :not(caption) > * > * { border-color: var(--pt-border) !important; }

/* ---------------------------------------------------------------------
   28. PAGINATION  (Bootstrap / Laravel paginator)
   --------------------------------------------------------------------- */
.pagination .page-link {
    color: var(--pt-text-muted);
    background-color: var(--pt-surface);
    border: 1px solid var(--pt-border);
    border-radius: var(--r-sm) !important;
    margin-inline: 2px;
    transition: background-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.pagination .page-link:hover { background-color: var(--pt-surface-hover); color: var(--pt-text); }
.pagination .page-link:focus { box-shadow: 0 0 0 4px var(--pt-focus-ring); }
.pagination .page-item.active .page-link {
    background: var(--tri-grey);
    border-color: transparent;
    color: #fff;
    box-shadow: none;
}
.pagination .page-item.disabled .page-link {
    color: var(--pt-text-soft);
    background-color: var(--pt-bg-subtle);
    border-color: var(--pt-border);
}

/* ---------------------------------------------------------------------
   29. CARD HEADER / FOOTER · LIST GROUP
   --------------------------------------------------------------------- */
.card .card-footer { background-color: transparent !important; border-top: 1px solid var(--pt-border); }
.card .card-header { color: var(--pt-text); }
.list-group { border-radius: var(--r-md); }
.list-group-item {
    background-color: var(--pt-surface);
    border-color: var(--pt-border);
    color: var(--pt-text);
}
.list-group-item.active {
    background: var(--pt-accent-soft) !important;
    border-color: transparent !important;
    color: var(--pt-indigo-700) !important;
}

/* ---------------------------------------------------------------------
   30. TOOLTIPS & POPOVERS
   --------------------------------------------------------------------- */
.tooltip .tooltip-inner {
    background-color: #11151c !important;
    color: #ffffff !important;
    border-radius: var(--r-sm);
    box-shadow: var(--shadow-lg);
    padding: 6px 10px;
    font-weight: 500;
}
.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before { border-top-color: #11151c !important; }
.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before { border-bottom-color: #11151c !important; }
.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before { border-left-color: #11151c !important; }
.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before { border-right-color: #11151c !important; }
.popover {
    background-color: var(--pt-surface) !important;
    border: 1px solid var(--pt-border) !important;
    border-radius: var(--r-md);
    box-shadow: var(--shadow-lg);
}
.popover .popover-header { background: transparent; border-bottom: 1px solid var(--pt-border); color: var(--pt-text); }
.popover .popover-body { color: var(--pt-text-muted); }

/* ---------------------------------------------------------------------
   31. PROGRESS · AVATARS
   --------------------------------------------------------------------- */
.progress { background-color: var(--pt-bg-subtle); border-radius: var(--r-pill); }
.progress .progress-bar { background-color: var(--pt-accent); border-radius: var(--r-pill); }
.avatar { border-radius: var(--r-md); }
.avatar.rounded-circle, .avatar.avatar-circle { border-radius: 50%; }

/* ---------------------------------------------------------------------
   32. DETACHED / FLOATING NAVBAR DROPDOWN ON MESH HERO
   keep the purge-cache menu readable when opened over the gradient
   --------------------------------------------------------------------- */
.navbar-main .dropdown-menu { color: var(--pt-text); }
.navbar-main .dropdown-menu .dropdown-item { color: var(--pt-text) !important; }

/* =====================================================================
   33. TRIANGLEMENA · MEDIA LIBRARY PACKAGE ALIGNMENT
   ---------------------------------------------------------------------
   media-library.css (package, loaded earlier) hardcodes #db5d50 (orange-
   red), #061222/#344767 (navy) and #35424D (slate). We remap to brand
   tokens here — in the CMS layer — so package source stays publishable.
   Selectors mirror the package's; !important added only where it does.
   ===================================================================== */
.form-1-box input[type="text"]:focus,
.form-1-box textarea:focus { border-color: var(--tri-red) !important; }
.form-1-box button.btn-customized { background: var(--tri-red) !important; }
.form-1-box button.btn-customized:hover,
.form-1-box button.btn-customized:active,
.form-1-box button.btn-customized:focus { background: var(--tri-red-600) !important; }

/* =====================================================================
   MEDIA FIELD (getMediaBtn) — flat dropzone (empty) / preview (filled)
   matching the TriangleCMS "Featured image" field. Shared by every form.
   ===================================================================== */
.pt-media-field { display: block; }
.pt-media-field__label { display: block; font-size: 0.8rem; font-weight: 600; color: var(--pt-text); margin-bottom: 6px; }
.pt-media-field__req { color: var(--pt-accent); }

.pt-media-field .pt-media-preview { display: none; }
.pt-media-field.has-media .pt-media-dropzone { display: none; }
.pt-media-field.has-media .pt-media-preview { display: block; }

/* Empty state — dashed dropzone */
.pt-media-dropzone {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    inline-size: 100%; gap: 5px; padding: 22px 16px; text-align: center; cursor: pointer;
    background: var(--pt-surface-2); border: 1.5px dashed var(--pt-border-strong);
    border-radius: var(--r-md); color: var(--pt-text);
    transition: border-color var(--dur) var(--ease-out), background-color var(--dur) var(--ease-out);
}
.pt-media-dropzone:hover { border-color: var(--pt-accent); background: var(--pt-accent-soft); }
.pt-media-dropzone__icon { color: var(--pt-accent); font-size: 1.5rem; line-height: 1; }
.pt-media-dropzone__title { font-size: 0.85rem; font-weight: 600; color: var(--pt-text); }
.pt-media-dropzone__hint { font-size: 0.74rem; color: var(--pt-text-soft); }

/* Filled state — preview card with filename (download) + replace + delete */
.pt-media-preview { border: 1px solid var(--pt-border); border-radius: var(--r-md); overflow: hidden; background: var(--pt-surface); max-width: 340px; }
.pt-media-preview__thumb { background: var(--pt-surface-2); display: block; }
.pt-media-preview__bar { display: flex; align-items: center; gap: 6px; padding: 8px 11px; border-top: 1px solid var(--pt-border); background: var(--pt-surface-2); }
.pt-media-preview__name { flex: 1 1 auto; min-width: 0; font-family: var(--pt-font-mono); font-size: 0.78rem; font-weight: 500; color: var(--pt-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pt-media-preview__name:hover { color: var(--pt-accent); text-decoration: underline; }
.pt-media-preview__act { inline-size: 30px; block-size: 30px; flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; border: 0; background: transparent; border-radius: var(--r-sm); color: var(--pt-text-soft); cursor: pointer; transition: background-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out); }
.pt-media-preview__act:hover { background: var(--pt-surface-hover); color: var(--pt-text); }
.pt-media-preview__delete:hover { background: var(--pt-danger-soft); color: var(--tri-red) !important; }
.pt-media-field__hint { display: block; margin-top: 6px; }
/* =====================================================================
   34. METRONIC BADGES · FONT COLOURS · TIMELINE  (activity logs, etc.)
   ---------------------------------------------------------------------
   Metronic's "brand" is #5d78ff (blue) and its kt-badge / kt-font utilities
   are not covered by the Bootstrap .badge rules. Remap onto brand tokens.
   kt-font-* use !important in the bundle, so we match it.
   ===================================================================== */
/* Solid badges */
.kt-badge.kt-badge--brand   { background-color: var(--tri-red) !important; color: #fff !important; }
.kt-badge.kt-badge--primary { background-color: var(--tri-grey) !important; color: #fff !important; }
.kt-badge.kt-badge--success { background-color: var(--pt-success) !important; color: #fff !important; }
.kt-badge.kt-badge--info    { background-color: var(--pt-info) !important;    color: #fff !important; }
.kt-badge.kt-badge--warning { background-color: var(--pt-warning) !important; color: #fff !important; }
.kt-badge.kt-badge--danger  { background-color: var(--pt-danger) !important;  color: #fff !important; }
/* Unified (soft) badges → soft tint + high-contrast text */
.kt-badge.kt-badge--unified-brand   { background-color: var(--pt-accent-soft) !important;  color: var(--tri-red-700) !important; }
.kt-badge.kt-badge--unified-primary { background-color: var(--pt-chip) !important;          color: var(--pt-text) !important; }
.kt-badge.kt-badge--unified-success { background-color: var(--pt-success-soft) !important;  color: var(--pt-alert-success-text) !important; }
.kt-badge.kt-badge--unified-info    { background-color: var(--pt-info-soft) !important;     color: var(--pt-alert-info-text) !important; }
.kt-badge.kt-badge--unified-warning { background-color: var(--pt-warning-soft) !important;  color: var(--pt-alert-warning-text) !important; }
.kt-badge.kt-badge--unified-danger  { background-color: var(--pt-danger-soft) !important;   color: var(--pt-alert-danger-text) !important; }
.kt-badge.kt-badge--unified-metal   { background-color: var(--pt-chip) !important;          color: var(--pt-text-muted) !important; }
html[data-theme="dark"] .kt-badge.kt-badge--unified-brand { color: var(--tri-red-300) !important; }
/* Inline text pills (activity log cells etc.) → design .badge: 11.5px / 3px 9px.
   Metronic sizes them in rem (0.8rem text, .15rem .75rem padding), inflated at
   the 16px root. */
.kt-badge.kt-badge--inline {
    font-size: 11.5px !important;
    padding: 3px 9px !important;
}
/* Font-colour utilities (timeline dots, labels) */
.kt-font-brand   { color: var(--tri-red) !important; }
.kt-font-primary { color: var(--pt-text-muted) !important; }
.kt-font-success { color: var(--pt-success) !important; }
.kt-font-info    { color: var(--pt-info) !important; }
.kt-font-warning { color: var(--pt-warning) !important; }
.kt-font-danger  { color: var(--pt-danger) !important; }
/* Timeline (kt-timeline-v2) surfaces */
.kt-timeline-v2__item-cricle { background: var(--pt-surface) !important; box-shadow: 0 0 0 2px var(--pt-border); }
.kt-timeline-v2__items::before,
.kt-timeline-v2__items:before { background: var(--pt-border) !important; }

/* =====================================================================
   35. MENU PERMISSIONS TREE — DARK MODE ONLY
   ---------------------------------------------------------------------
   adminMenuPermission/view ships an inline <style> with hardcoded light
   surfaces (#fff / #f9f9f9) and gives the title <strong> no colour, so in
   dark mode titles render light-on-white = invisible. These dark-only rules
   adapt the rows to the theme (light mode is left exactly as the package
   designed it). The inline <style> sits later in the DOM, so we win with
   higher specificity + !important.
   ===================================================================== */
html[data-theme="dark"] .kt-portlet__head-title { color: var(--pt-text) !important; }

/* Tree connectors */
html[data-theme="dark"] .child-list,
html[data-theme="dark"] .child-list.empty-list { border-inline-start-color: var(--pt-border) !important; }

/* Row surface + elevation (raised active, recessed inactive) */
html[data-theme="dark"] .node-row {
    background: var(--pt-surface-hover) !important;
    border-color: var(--pt-border) !important;
}
html[data-theme="dark"] .tree-node--inactive > .node-row {
    background: var(--pt-surface-2) !important;
}
html[data-theme="dark"] .node-row:hover {
    border-color: var(--tri-red) !important;
    box-shadow: 0 2px 8px rgba(237, 26, 47, 0.18) !important;
}

/* Text + icons */
html[data-theme="dark"] .node-title-text strong { color: var(--pt-text) !important; }
html[data-theme="dark"] .node-route-name { color: var(--pt-text-muted) !important; }
html[data-theme="dark"] .node-icon { color: var(--pt-text-soft) !important; }
html[data-theme="dark"] .drag-handle { color: var(--pt-text-soft) !important; }
html[data-theme="dark"] .node-toggle { color: var(--pt-text-muted) !important; }

/* Drag / sortable states */
html[data-theme="dark"] .sortable-ghost {
    background: var(--pt-accent-soft) !important;
    border-color: var(--tri-red) !important;
}
html[data-theme="dark"] .sortable-drag { background: var(--pt-surface) !important; }
html[data-theme="dark"] .sortable-chosen { background: var(--pt-surface-hover) !important; }

/* Edit (outline-primary) action button stays visible on dark rows */
html[data-theme="dark"] .node-actions .btn-outline-primary {
    color: var(--pt-text) !important;
    border-color: var(--pt-border-strong) !important;
}
html[data-theme="dark"] .node-actions .btn-outline-primary:hover {
    background: var(--tri-red) !important;
    border-color: var(--tri-red) !important;
    color: #fff !important;
}

/* =====================================================================
   36. LARAVEL GENERATOR — brand + dark-mode polish
   (generator.css hardcodes Metronic blue/light surfaces; rebrand + adapt)
   ===================================================================== */
/* Add Field button hover → brand red (was Metronic blue #5d78ff) */
#addFieldBtn:hover { background-color: var(--tri-red) !important; border-color: var(--tri-red) !important; color: #fff !important; }

/* Dark mode: Bootstrap "light" utilities → theme surfaces/borders so panels,
   card headers and table heads stop rendering as light strips on dark. */
html[data-theme="dark"] .bg-light { background-color: var(--pt-surface-2) !important; }
html[data-theme="dark"] .thead-light th,
html[data-theme="dark"] .table .thead-light th {
    background-color: var(--pt-surface-2) !important;
    color: var(--pt-text-muted) !important;
    border-color: var(--pt-border) !important;
}
html[data-theme="dark"] .border,
html[data-theme="dark"] .border-top,
html[data-theme="dark"] .border-bottom,
html[data-theme="dark"] .border-start,
html[data-theme="dark"] .border-end { border-color: var(--pt-border) !important; }

/* Fields-config table: row hover + drag states (were hardcoded light blue) */
html[data-theme="dark"] #fieldsList tr[data-index]:hover { background-color: var(--pt-surface-hover) !important; }
html[data-theme="dark"] #fieldsList tr.dragging { background-color: var(--pt-surface-2) !important; }
html[data-theme="dark"] #fieldsList tr.drag-over,
html[data-theme="dark"] #fieldsList tr.drag-over td {
    background-color: var(--pt-accent-soft) !important;
    border-color: var(--tri-red) !important;
}

/* =====================================================================
   37. OUTLINE BUTTONS + UTILITY BADGES — DARK MODE
   ---------------------------------------------------------------------
   Argon's .btn-outline-* use light/mid colours that wash out on the dark
   surfaces (e.g. Dry Run = outline-secondary, API Drift = outline-warning,
   per-row edit/delete/regen/sync). Theme them for contrast + brand, keeping
   actions distinguishable: edit→neutral, delete→red, regen/sync→blue,
   drift→amber. Also lift the low-contrast badge-secondary / badge-light pills
   (e.g. the field TYPE chips: TEXT / SELECT / PHONE / SLUG / EDITOR).
   ===================================================================== */
html[data-theme="dark"] .btn-outline-secondary,
html[data-theme="dark"] .btn-outline-primary {
    color: var(--pt-text-muted) !important;
    border-color: var(--pt-border-strong) !important;
    background-color: transparent !important;
}
html[data-theme="dark"] .btn-outline-secondary:hover,
html[data-theme="dark"] .btn-outline-primary:hover {
    background-color: var(--pt-surface-hover) !important;
    color: var(--pt-text) !important;
    border-color: var(--pt-text-soft) !important;
}
html[data-theme="dark"] .btn-outline-brand,
html[data-theme="dark"] .btn-outline-danger {
    color: var(--tri-red-300) !important;
    border-color: var(--tri-red) !important;
    background-color: transparent !important;
}
html[data-theme="dark"] .btn-outline-brand:hover,
html[data-theme="dark"] .btn-outline-danger:hover {
    background-color: var(--tri-red) !important;
    color: #fff !important;
    border-color: var(--tri-red) !important;
}
html[data-theme="dark"] .btn-outline-warning {
    color: #ffce6a !important;
    border-color: var(--pt-warning) !important;
    background-color: transparent !important;
}
html[data-theme="dark"] .btn-outline-warning:hover {
    background-color: var(--pt-warning) !important;
    color: #1b1a1e !important;
    border-color: var(--pt-warning) !important;
}
html[data-theme="dark"] .btn-outline-info {
    color: #93b4ff !important;
    border-color: var(--pt-info) !important;
    background-color: transparent !important;
}
html[data-theme="dark"] .btn-outline-info:hover {
    background-color: var(--pt-info) !important;
    color: #fff !important;
    border-color: var(--pt-info) !important;
}
html[data-theme="dark"] .btn-outline-success {
    color: #5fe0b5 !important;
    border-color: var(--pt-success) !important;
    background-color: transparent !important;
}
html[data-theme="dark"] .btn-outline-success:hover {
    background-color: var(--pt-success) !important;
    color: #06281e !important;
    border-color: var(--pt-success) !important;
}

/* Utility badges → readable outlined chips on dark (field TYPE pills, order/count) */
html[data-theme="dark"] .badge.badge-secondary,
html[data-theme="dark"] .badge.bg-secondary {
    background-color: var(--pt-surface-2) !important;
    color: var(--pt-text) !important;
    border: 1px solid var(--pt-border-strong) !important;
}
html[data-theme="dark"] .badge.badge-light {
    background-color: var(--pt-surface-2) !important;
    color: var(--pt-text-muted) !important;
    border-color: var(--pt-border-strong) !important;
}

/* =====================================================================
   38-B. CUSTOM API BUILDER — DARK MODE
   ---------------------------------------------------------------------
   builder.blade.php inline <style> hardcodes light surfaces (#fff rows,
   #e0e6ef connectors, #f4f6f9 table tag). Rules below are dark-only.
   ===================================================================== */

/* -- Section node row (#fff → theme surface) ------------------------- */
html[data-theme="dark"] .capi-node-row {
    background: var(--pt-surface) !important;
    border-color: var(--pt-border) !important;
}
html[data-theme="dark"] .capi-node-row:hover {
    border-color: var(--tri-red) !important;
    box-shadow: 0 2px 8px rgba(237, 26, 47, 0.14) !important;
}

/* -- Drag handle icon (lift visibility slightly) --------------------- */
html[data-theme="dark"] .capi-node-drag {
    color: var(--pt-text-soft) !important;
}

/* -- Child list connector lines (#e0e6ef → theme border) ------------- */
html[data-theme="dark"] .capi-child-list,
html[data-theme="dark"] .capi-child-list.capi-empty-list {
    border-left-color: var(--pt-border) !important;
}

/* -- Table name tag (#f4f6f9 bg → dark surface) ---------------------- */
html[data-theme="dark"] .section-table-tag {
    background: var(--pt-surface-2) !important;
    color: var(--pt-text-muted) !important;
}

/* -- Variable-bound section (#faf8ff → dark surface with purple tint) - */
html[data-theme="dark"] .capi-node-variable > .capi-node-row {
    background: rgba(137, 80, 252, 0.08) !important;
}

/* -- Drag states (#eef1ff / #f0f3ff → dark equivalents) -------------- */
html[data-theme="dark"] .capi-section-node.sortable-ghost > .capi-node-row {
    background: var(--pt-accent-soft) !important;
    border-color: var(--tri-red) !important;
}
html[data-theme="dark"] .capi-section-node.sortable-chosen > .capi-node-row {
    background: var(--pt-surface-hover) !important;
}

/* -- Field item grid (columns + media collections) ------------------- */
html[data-theme="dark"] .capi-field-item,
html[data-theme="dark"] .capi-var-field-item {
    border-color: var(--pt-border) !important;
    background: transparent !important;
}
html[data-theme="dark"] .capi-field-item:hover,
html[data-theme="dark"] .capi-var-field-item:hover {
    background: var(--pt-surface-hover) !important;
    border-color: var(--pt-border-strong) !important;
}
html[data-theme="dark"] .capi-field-item.is-checked,
html[data-theme="dark"] .capi-var-field-item.is-checked {
    background: var(--pt-accent-soft) !important;
    border-color: var(--tri-red) !important;
}
html[data-theme="dark"] .capi-field-name {
    color: var(--pt-text) !important;
}
html[data-theme="dark"] .capi-field-type {
    background: var(--pt-surface-2) !important;
    color: var(--pt-text-muted) !important;
}

/* -- Badge chips inside field items ---------------------------------- */
html[data-theme="dark"] .capi-badge-fk   { background: rgba(21,101,192,.25) !important; color: #93b4ff !important; }
html[data-theme="dark"] .capi-badge-img  { background: rgba(46,125,50,.25)  !important; color: #5fe0b5 !important; }
html[data-theme="dark"] .capi-badge-file { background: rgba(230,81,0,.25)   !important; color: #ffce6a !important; }
html[data-theme="dark"] .capi-badge-ts   { background: var(--pt-surface-2)  !important; color: var(--pt-text-muted) !important; }
html[data-theme="dark"] .capi-badge-pk   { background: rgba(237,26,47,.20)  !important; color: var(--tri-red-300) !important; }

/* -- Variable mapping block ------------------------------------------ */
html[data-theme="dark"] .capi-var-block {
    background: var(--pt-surface-2) !important;
    border-color: var(--pt-border) !important;
}

/* -- "Select All" / "Deselect All" — bordered outline (both modes) -- */
#selectAllFieldsBtn,
#deselectAllFieldsBtn {
    border: 1px solid var(--pt-accent) !important;
    border-radius: var(--r-sm) !important;
    color: var(--pt-accent) !important;
}
#selectAllFieldsBtn:hover,
#deselectAllFieldsBtn:hover {
    background: var(--pt-accent-soft) !important;
    color: var(--pt-accent) !important;
}
/* Dark mode: swap to the lighter red-300 tint for better contrast */
html[data-theme="dark"] #selectAllFieldsBtn,
html[data-theme="dark"] #deselectAllFieldsBtn {
    color: var(--tri-red-300) !important;
    border-color: var(--tri-red) !important;
}
html[data-theme="dark"] #selectAllFieldsBtn:hover,
html[data-theme="dark"] #deselectAllFieldsBtn:hover {
    color: var(--tri-red) !important;
}

/* -- Empty / disabled field items ------------------------------------ */
html[data-theme="dark"] .capi-child-field-item.capi-field-empty {
    background: var(--pt-surface-2) !important;
}

/* -- Keyed-mode child cards (#fff / #fafbfd → dark surfaces) --------- */
html[data-theme="dark"] .capi-child-card {
    background: var(--pt-surface) !important;
    border-color: var(--pt-border) !important;
}
html[data-theme="dark"] .capi-child-card.sortable-ghost {
    background: var(--pt-accent-soft) !important;
}
html[data-theme="dark"] .capi-child-body {
    background: var(--pt-surface-2) !important;
    border-top-color: var(--pt-border) !important;
}
/* -- Numbered index circle (#5867dd Metronic blue → brand red) ------- */
html[data-theme="dark"] .capi-child-index {
    background: var(--tri-red) !important;
}
/* -- Drag handle + field-arrow icons (lift on dark surface) ----------- */
html[data-theme="dark"] .capi-child-drag,
html[data-theme="dark"] .capi-child-field-arrow {
    color: var(--pt-text-soft) !important;
}
/* -- Preview underline (dotted #a0a4b8) ------------------------------ */
html[data-theme="dark"] .capi-has-preview {
    border-bottom-color: var(--pt-text-soft) !important;
}

/* =====================================================================
   38. KT-DATATABLE — DARK MODE COMPLETE FIX
   ---------------------------------------------------------------------
   style.bundle.ltr.css hardcodes a light-theme palette (#595d6e cell
   text, #f0f3ff pager surfaces, #93a2dd link colour). Every rule below
   is scoped to html[data-theme="dark"] so light mode is unchanged.
   ===================================================================== */

/* -- Body cell text (#595d6e → theme text) --------------------------- */
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__table > .kt-datatable__body .kt-datatable__row > .kt-datatable__cell > span {
    color: var(--pt-text) !important;
}

/* -- Head cell spans (same --pt-text-soft as the light-mode base rule; this
      later/higher-specificity rule must not drift to a different token) ---- */
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__table > .kt-datatable__head .kt-datatable__row > .kt-datatable__cell > span {
    color: var(--pt-text-soft) !important;
}

/* -- Pager nav: base links (remove #f0f3ff / #93a2dd hardcodes) ------- */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link {
    color: var(--pt-text-muted) !important;
    background: transparent !important;
}

/* -- First / prev / next / last icon buttons (#f0f3ff → dark surface) - */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--first,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--prev,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--next,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--last {
    background: var(--pt-surface-2) !important;
    color: var(--pt-text-muted) !important;
}

/* -- Hover: all nav link types --------------------------------------- */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link:hover,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--first:hover,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--prev:hover,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--next:hover,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--last:hover {
    background: var(--pt-accent) !important;
    color: #fff !important;
}

/* -- Active page number (#5d78ff → brand red) ------------------------ */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--active {
    background: var(--pt-accent) !important;
    color: #fff !important;
    border-color: transparent !important;
}

/* -- Disabled nav links (#f0f3ff → dark surface, fade out) ----------- */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--disabled,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--disabled:hover {
    color: var(--pt-text-soft) !important;
    background: var(--pt-surface-2) !important;
    opacity: 0.45;
}

/* -- Go-to-page input (#f0f3ff background) --------------------------- */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-pager-input {
    background: var(--pt-surface-2) !important;
    border-color: var(--pt-border) !important;
    color: var(--pt-text) !important;
}
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-pager-input:focus {
    background: var(--pt-surface-hover) !important;
    border-color: var(--pt-accent) !important;
}

/* -- Page-size dropdown button: white text on CHARCOAL (light mode) ----
   Charcoal (not red) so the per-page selector matches the active page
   number — user request. Dark mode keeps its own treatment below. */
/* Use .kt-datatable--default to beat custom.css's [0,6,1] specificity rule */
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle {
    background: var(--tri-grey) !important;
    color: #fff !important;
    border: 0 !important;
}
/* Explicitly target every child element bootstrap-select puts inside the button */
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .filter-option,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .filter-option-inner-inner,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .caret,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle i {
    color: #fff !important;
}
/* The ::after arrow uses border-top — override border-top-color directly */
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle::after {
    border-top-color: #fff !important;
    border-bottom-color: #fff !important;
}
/* .caret span triangle */
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .caret {
    border-top-color: #fff !important;
    border-bottom-color: #fff !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle {
    background: var(--tri-grey) !important;
    color: #fff !important;
    opacity: 0.88;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus .filter-option,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover .filter-option,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle .filter-option,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus .caret,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover .caret,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle .caret,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus i,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover i,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle i {
    color: #fff !important;
}

/* -- Page-size dropdown button (dark mode: brand gradient, white text) ------- */
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle {
    background: var(--pt-cta-grad) !important;
    color: #fff !important;
    border: 0 !important;
}
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .filter-option,
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .filter-option-inner-inner,
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .caret,
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle i {
    color: #fff !important;
}
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle::after {
    border-top-color: #fff !important;
    border-bottom-color: #fff !important;
}
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .caret {
    border-top-color: #fff !important;
    border-bottom-color: #fff !important;
}
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle {
    background: var(--pt-cta-grad) !important;
    color: #fff !important;
    opacity: 0.88;
}
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus .filter-option,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover .filter-option,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle .filter-option,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus .caret,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover .caret,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle .caret,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:focus i,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle:hover i,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size.show > .btn.dropdown-toggle i {
    color: #fff !important;
}

/* -- "Showing X – Y of Z records" text ----------------------------- */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info {
    color: var(--pt-text-muted) !important;
}

/* -- Page-size dropdown menu: selected item → charcoal bg, white text (light) -- */
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li.selected > a,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li.selected > a:hover {
    background: var(--tri-grey) !important;
    color: #fff !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li.selected > a .text {
    color: #fff !important;
}

/* -- Page-size dropdown menu (bootstrap-select inner list — dark mode) ------- */
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu {
    background-color: var(--pt-surface) !important;
    border-color: var(--pt-border) !important;
}
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li > a {
    color: var(--pt-text-muted) !important;
    background: transparent !important;
}
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li > a:hover,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li.selected > a {
    background: var(--pt-cta-grad) !important;
    color: #fff !important;
}
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li.selected > a .text,
html[data-theme="dark"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li > a:hover .text {
    color: #fff !important;
}

/* -- Even row & active row backgrounds ------------------------------ */
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__table > .kt-datatable__body .kt-datatable__row.kt-datatable__row--even > .kt-datatable__cell {
    background: transparent !important;
}
html[data-theme="dark"] .kt-datatable.kt-datatable--default > .kt-datatable__table > .kt-datatable__body .kt-datatable__row.kt-datatable__row--active > .kt-datatable__cell {
    background: var(--pt-accent-soft) !important;
}

/* -- RTL: flip the directional nav icons so they point the right way --- */
[dir="rtl"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--first i,
[dir="rtl"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--prev i,
[dir="rtl"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--next i,
[dir="rtl"] .kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--last i {
    display: inline-block;
    transform: scaleX(-1);
}

/* =====================================================================
   38. TINYMCE CHROME — DARK MODE  (toolbar / menus / dialogs / statusbar)
   ---------------------------------------------------------------------
   These live in the PARENT document, so CSS themes them and they flip
   instantly with the theme. The iframe content area is themed separately
   (live) by premium-theme.js. Light mode = untouched oxide default.
   ===================================================================== */
html[data-theme="dark"] .tox.tox-tinymce {
    border-color: var(--pt-border-strong) !important;
    border-radius: var(--r-sm) !important;
}

/* Top chrome: menubar + toolbar */
html[data-theme="dark"] .tox .tox-editor-header,
html[data-theme="dark"] .tox .tox-menubar,
html[data-theme="dark"] .tox .tox-toolbar,
html[data-theme="dark"] .tox .tox-toolbar__primary,
html[data-theme="dark"] .tox .tox-toolbar-overlord {
    background-color: var(--pt-surface-2) !important;
    background-image: none !important;
    border-color: var(--pt-border) !important;
}
html[data-theme="dark"] .tox .tox-toolbar__group { border-color: var(--pt-border) !important; }

/* Menubar buttons */
html[data-theme="dark"] .tox .tox-mbtn { color: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-mbtn:hover:not(:disabled),
html[data-theme="dark"] .tox .tox-mbtn--active { background-color: var(--pt-surface-hover) !important; }

/* Toolbar buttons + icons */
html[data-theme="dark"] .tox .tox-tbtn { color: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-tbtn svg { fill: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-tbtn:hover { background-color: var(--pt-surface-hover) !important; }
html[data-theme="dark"] .tox .tox-tbtn:hover svg { fill: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-tbtn--enabled,
html[data-theme="dark"] .tox .tox-tbtn--enabled:hover { background-color: var(--pt-accent-soft) !important; }
html[data-theme="dark"] .tox .tox-tbtn--enabled svg { fill: var(--tri-red-300) !important; }
html[data-theme="dark"] .tox .tox-tbtn__select-label { color: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-tbtn__select-chevron svg { fill: var(--pt-text-soft) !important; }

/* Editing-area frame + statusbar */
html[data-theme="dark"] .tox .tox-edit-area__iframe { background-color: var(--pt-surface) !important; }
html[data-theme="dark"] .tox .tox-statusbar {
    background-color: var(--pt-surface-2) !important;
    border-top-color: var(--pt-border) !important;
    color: var(--pt-text-muted) !important;
}
html[data-theme="dark"] .tox .tox-statusbar a,
html[data-theme="dark"] .tox .tox-statusbar__path-item,
html[data-theme="dark"] .tox .tox-statusbar__wordcount { color: var(--pt-text-muted) !important; }

/* Dropdown menus / collections (parent document) */
html[data-theme="dark"] .tox .tox-menu,
html[data-theme="dark"] .tox .tox-collection--toolbar,
html[data-theme="dark"] .tox .tox-collection--list {
    background-color: var(--pt-surface) !important;
    border-color: var(--pt-border) !important;
    box-shadow: var(--shadow-lg) !important;
}
html[data-theme="dark"] .tox .tox-collection__item { color: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-collection__item-icon svg { fill: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-collection__item--active,
html[data-theme="dark"] .tox .tox-collection__item--enabled {
    background-color: var(--pt-accent-soft) !important;
    color: var(--tri-red-300) !important;
}
html[data-theme="dark"] .tox .tox-collection__group { border-color: var(--pt-border) !important; }

/* Dialogs (image / link / table / code, etc.) */
html[data-theme="dark"] .tox .tox-dialog,
html[data-theme="dark"] .tox .tox-dialog__header,
html[data-theme="dark"] .tox .tox-dialog__footer,
html[data-theme="dark"] .tox .tox-dialog__body-nav {
    background-color: var(--pt-surface) !important;
    border-color: var(--pt-border) !important;
    color: var(--pt-text) !important;
}
html[data-theme="dark"] .tox .tox-dialog__title,
html[data-theme="dark"] .tox .tox-label,
html[data-theme="dark"] .tox .tox-dialog__body-nav-item { color: var(--pt-text) !important; }
html[data-theme="dark"] .tox .tox-dialog__body-nav-item--active {
    color: var(--tri-red-300) !important;
    border-bottom-color: var(--tri-red) !important;
}
html[data-theme="dark"] .tox .tox-textfield,
html[data-theme="dark"] .tox .tox-textarea,
html[data-theme="dark"] .tox .tox-selectfield select,
html[data-theme="dark"] .tox .tox-toolbar-textfield {
    background-color: var(--pt-bg-subtle) !important;
    border-color: var(--pt-border-strong) !important;
    color: var(--pt-text) !important;
}
html[data-theme="dark"] .tox .tox-dialog__body-content { color: var(--pt-text) !important; }

/* =====================================================================
   39. ⌘K COMMAND PALETTE  (markup injected by premium-theme.js)
   ---------------------------------------------------------------------
   Frosted glass dialog. Index built client-side from the rendered sidebar
   links + feature-detected quick actions — zero server calls.
   ===================================================================== */
.pt-cmdk-backdrop {
    position: fixed;
    inset: 0;
    z-index: 10600; /* above media-library (9999) and app modals */
    background: rgba(8, 10, 14, 0.55);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--dur) var(--ease-out);
    display: flex;
    justify-content: center;
    align-items: flex-start;
    padding-top: 14vh;
}
.pt-cmdk-backdrop.is-open { opacity: 1; pointer-events: auto; }
.pt-cmdk {
    inline-size: min(620px, calc(100vw - 32px));
    background: var(--glass-bg-strong);
    -webkit-backdrop-filter: var(--glass-blur-strong);
    backdrop-filter: var(--glass-blur-strong);
    border: 1px solid var(--glass-border);
    border-top-color: var(--glass-top);
    border-radius: var(--r-xl);
    box-shadow: var(--shadow-lg);
    overflow: hidden;
    transform: translateY(-12px) scale(0.98);
    opacity: 0;
    transition: transform var(--dur) var(--ease-spring), opacity var(--dur) var(--ease-out);
}
.pt-cmdk-backdrop.is-open .pt-cmdk { transform: translateY(0) scale(1); opacity: 1; }
.pt-cmdk__input-wrap {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: var(--sp-4) var(--sp-5);
    border-bottom: 1px solid var(--pt-border);
}
.pt-cmdk__input-wrap > i { color: var(--pt-text-soft); font-size: 1rem; flex: 0 0 auto; }
.pt-cmdk__input {
    flex: 1 1 auto;
    background: none;
    border: 0;
    outline: none;
    color: var(--pt-text);
    font-size: 1rem;
    font-family: var(--pt-font);
}
.pt-cmdk__input::placeholder { color: var(--pt-text-soft); }
.pt-cmdk__results { max-height: 52vh; overflow-y: auto; padding: var(--sp-2); }
.pt-cmdk__group-label {
    padding: var(--sp-3) var(--sp-3) var(--sp-1);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--pt-text-soft);
    font-weight: 600;
}
.pt-cmdk__item {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    padding: 10px var(--sp-3);
    border-radius: var(--r-sm);
    cursor: pointer;
    color: var(--pt-text-muted);
    font-size: 0.9rem;
}
.pt-cmdk__item > i { color: var(--pt-text-soft); inline-size: 18px; text-align: center; flex: 0 0 auto; }
.pt-cmdk__item-label { flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pt-cmdk__item.is-active,
.pt-cmdk__item:hover { background: var(--pt-accent-soft); color: var(--pt-text); }
.pt-cmdk__item.is-active > i,
.pt-cmdk__item:hover > i { color: var(--pt-accent); }
.pt-cmdk__empty { padding: var(--sp-6); text-align: center; color: var(--pt-text-soft); font-size: 0.9rem; }
.pt-cmdk__footer {
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    padding: var(--sp-2) var(--sp-5);
    border-top: 1px solid var(--pt-border);
    font-size: 0.72rem;
    color: var(--pt-text-soft);
}
.pt-cmdk__footer .pt-kbd {
    color: var(--pt-text-muted);
    background: var(--pt-surface-2);
    border-color: var(--pt-border-strong);
}

/* =====================================================================
   40. ATLAS UTILITY CLASSES  ·  prototype design-system elements
   ---------------------------------------------------------------------
   Direct ports of design-system.css signatures, adapted to work alongside
   Argon + Bootstrap. Use these classes in Blade views to access the full
   prototype look without touching the Bootstrap layer.
   ===================================================================== */

/* ── Mesh gradient background ──────────────────────────────────────── */
.mesh {
    position: relative;
    isolation: isolate;
    overflow: hidden;
}
.mesh::before { content: none; } /* flattened — was animated mesh-gradient */

/* ── Glass surfaces ────────────────────────────────────────────────── */
.glass {
    background: var(--glass-bg);
    -webkit-backdrop-filter: var(--glass-blur);
    backdrop-filter: var(--glass-blur);
    border: 1px solid var(--glass-border);
    border-top-color: var(--glass-top);
    box-shadow: var(--shadow-md);
    border-radius: var(--r-lg);
}
.glass-strong {
    background: var(--glass-bg-strong);
    -webkit-backdrop-filter: var(--glass-blur-strong);
    backdrop-filter: var(--glass-blur-strong);
    border: 1px solid var(--glass-border);
    border-top-color: var(--glass-top);
    box-shadow: var(--shadow-lg);
    border-radius: var(--r-lg);
}

/* ── Spotlight (cursor-follow radial highlight) ─────────────────────── */
.u-spotlight {
    position: relative;
    overflow: hidden;
}
.u-spotlight::after {
    content: "";
    position: absolute;
    inset: 0;
    background: radial-gradient(180px circle at var(--mx, 50%) var(--my, 0%), rgba(255, 255, 255, .08), transparent 60%);
    opacity: 0;
    transition: opacity var(--dur) var(--ease-out);
    pointer-events: none;
}
.u-spotlight:hover::after { opacity: 0; } /* flattened — cursor sheen removed */

/* ── Button ghost & icon-only variants ─────────────────────────────── */
.btn-ghost {
    background: transparent !important;
    border: 1px solid transparent !important;
    color: var(--pt-text-muted) !important;
    box-shadow: none !important;
}
.btn-ghost:hover {
    background: var(--pt-accent-soft) !important;
    color: var(--pt-text) !important;
    border-color: transparent !important;
}

.btn-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    /* !important px: style.bundle sets 3rem (48px at the 16px root) at
       .btn.btn-icon specificity. No btn-lg icon buttons exist in the CMS. */
    width: 38px !important;
    height: 38px !important;
    padding: 0 !important;
    background: transparent !important;
    border: 1px solid transparent !important;
    border-radius: var(--r-sm) !important;
    color: var(--pt-text-muted) !important;
    box-shadow: none !important;
    transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.btn-icon:hover {
    background: var(--pt-accent-soft) !important;
    color: var(--pt-text) !important;
}
/* Small icon buttons (datatable row actions) → design .row-act: 30×30 box, 16px
   glyph. !important px: style.bundle sizes them in rem at .btn.btn-icon.btn-sm /
   .btn-icon-sm specificity (2.5rem box, 1.15–1.25rem glyph), which inflates to
   40px / 18–20px at the 16px root and beats the plain selectors here. */
.btn-icon.btn-sm, .btn.btn-icon-sm { width: 30px !important; height: 30px !important; }
.btn-icon.btn-sm i, .btn.btn-icon-sm i,
.btn-icon.btn-sm svg, .btn.btn-icon-sm svg { font-size: 14px !important; }

/* ── Field wrapper (.field › __label, __hint, __error) ─────────────── */
.field {
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    margin-bottom: var(--sp-4);
}
.field__label {
    font-size: 0.84rem;
    font-weight: 560;
    color: var(--pt-text-muted);
}
.field__hint {
    font-size: 0.75rem;
    color: var(--pt-text-soft);
    margin-top: -var(--sp-1);
}
.field__error {
    font-size: 0.75rem;
    color: var(--pt-danger);
    display: none;
}
.field.is-error .field__error { display: block; }
.field.is-error .form-control,
.field.is-error .form-select,
.field.is-error textarea {
    border-color: var(--pt-danger) !important;
    box-shadow: 0 0 0 3px var(--pt-danger-soft) !important;
}

/* ── Radio buttons (Bootstrap .form-check-input[type="radio"]) ──────── */
.form-check-input[type="radio"] {
    width: 18px;
    height: 18px;
    border-radius: 50% !important;
    background-color: var(--pt-surface);
    border: 1.5px solid var(--pt-border-strong);
    cursor: pointer;
    transition: border-color var(--dur) var(--ease-out),
                background-color var(--dur) var(--ease-out),
                box-shadow var(--dur) var(--ease-out);
    appearance: none;
    -webkit-appearance: none;
    position: relative;
    flex-shrink: 0;
}
.form-check-input[type="radio"]::after {
    content: "";
    position: absolute;
    inset: 50%;
    transform: translate(-50%, -50%) scale(0);
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #fff;
    transition: transform var(--dur) var(--ease-spring);
}
.form-check-input[type="radio"]:checked {
    background-color: var(--pt-accent) !important;
    border-color: var(--pt-accent) !important;
}
.form-check-input[type="radio"]:checked::after {
    transform: translate(-50%, -50%) scale(1);
}
.form-check-input[type="radio"]:focus {
    border-color: var(--pt-accent);
    box-shadow: 0 0 0 4px var(--pt-focus-ring) !important;
    outline: none;
}
.form-check-input[type="radio"]:hover:not(:checked):not(:disabled) {
    border-color: var(--pt-text-soft);
}

/* ── Native select — custom chevron arrow ───────────────────────────── */
select.form-select,
select.form-control {
    appearance: none;
    -webkit-appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236B7488' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") !important;
    background-repeat: no-repeat !important;
    background-position: right 12px center !important;
    padding-right: 40px !important;
    cursor: pointer;
}
html[data-theme="dark"] select.form-select,
html[data-theme="dark"] select.form-control {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23A6AEC2' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E") !important;
}

/* ── Chip (interactive filter/selection pill) ───────────────────────── */
.chip {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-2);
    height: 28px;
    padding: 0 var(--sp-3);
    font-size: 0.84rem;
    font-weight: 500;
    border-radius: var(--r-pill);
    background: var(--pt-surface-2);
    border: 1px solid var(--pt-border);
    color: var(--pt-text-muted);
    cursor: pointer;
    transition: border-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out), background var(--dur) var(--ease-out);
    user-select: none;
    white-space: nowrap;
}
.chip:hover { border-color: var(--pt-border-strong); color: var(--pt-text); }
.chip.is-active,
.chip--active { background: var(--pt-accent-soft); border-color: transparent; color: var(--pt-accent); }
.chip__close {
    display: inline-grid;
    place-items: center;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    opacity: .6;
    cursor: pointer;
}
.chip__close:hover { opacity: 1; background: var(--pt-border-strong); }

/* ── Tag (mono label, non-interactive) ──────────────────────────────── */
.tag {
    display: inline-flex;
    align-items: center;
    height: 22px;
    padding: 0 8px;
    font-size: 0.72rem;
    font-weight: 500;
    border-radius: var(--r-sm);
    background: var(--pt-bg-subtle);
    color: var(--pt-text-muted);
    font-family: var(--pt-font-mono);
    border: 1px solid var(--pt-border);
    white-space: nowrap;
}

/* ── Segmented control ──────────────────────────────────────────────── */
.segmented {
    display: inline-flex;
    padding: 3px;
    gap: 2px;
    background: var(--pt-bg-subtle);
    border: 1px solid var(--pt-border);
    border-radius: var(--r-md);
}
.segmented__btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px var(--sp-3);
    border: none;
    background: none;
    font-size: 0.75rem;
    font-weight: 560;
    color: var(--pt-text-soft);
    border-radius: var(--r-sm);
    cursor: pointer;
    transition: color var(--dur) var(--ease-out), background var(--dur) var(--ease-out);
    white-space: nowrap;
    font-family: var(--pt-font);
}
.segmented__btn svg, .segmented__btn i { width: 16px; height: 16px; font-size: 0.875rem; }
.segmented__btn:hover { color: var(--pt-text-muted); }
.segmented__btn.active,
.segmented__btn.is-active {
    background: var(--pt-surface);
    color: var(--pt-text);
    box-shadow: var(--shadow-sm);
    border-radius: var(--r-sm);
}
html[data-theme="dark"] .segmented__btn.active,
html[data-theme="dark"] .segmented__btn.is-active {
    background: var(--pt-surface-hover);
}

/* ── Stat card ──────────────────────────────────────────────────────── */
.stat-card {
    background: var(--pt-surface);
    border: 1px solid var(--pt-border);
    border-radius: var(--r-lg);
    padding: var(--sp-5);
    display: flex;
    flex-direction: column;
    gap: var(--sp-3);
    position: relative;
    overflow: hidden;
    box-shadow: var(--shadow-sm);
    transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out);
}
.stat-card:hover { border-color: var(--pt-border-strong); box-shadow: var(--shadow-md); }
.stat-card__label {
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: .06em;
    font-weight: 600;
    color: var(--pt-text-soft);
    display: flex;
    align-items: center;
    gap: var(--sp-2);
}
.stat-card__value {
    font-size: 28px;
    font-weight: 700;
    letter-spacing: -.02em;
    line-height: 1;
    color: var(--pt-text);
    font-feature-settings: "tnum";
}
.stat-card__delta {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    font-size: 0.72rem;
    font-weight: 600;
    padding: 2px 8px;
    border-radius: var(--r-pill);
}
.stat-card__delta--up   { color: var(--pt-success); background: var(--pt-success-soft); }
.stat-card__delta--down { color: var(--pt-danger);  background: var(--pt-danger-soft); }
.stat-card__delta--flat { color: var(--pt-text-soft); background: var(--pt-bg-subtle); }

/* ── Skeleton / shimmer loading placeholder ─────────────────────────── */
.skeleton {
    position: relative;
    overflow: hidden;
    background: var(--pt-bg-subtle);
    border-radius: var(--r-sm);
}
.skeleton::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .08), transparent);
    transform: translateX(-100%);
    animation: ptShimmer 1.6s infinite;
}
html[data-theme="dark"] .skeleton::after {
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .04), transparent);
}
.skeleton--text   { height: 12px; border-radius: var(--r-pill); }
.skeleton--title  { height: 18px; width: 55%; border-radius: var(--r-pill); }
.skeleton--circle { border-radius: 50%; }
.skeleton--block  { height: 80px; border-radius: var(--r-md); }
.skeleton--avatar { width: 32px; height: 32px; border-radius: 50%; }
@keyframes ptShimmer { to { transform: translateX(100%); } }

/* ── Empty state ────────────────────────────────────────────────────── */
.empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: var(--sp-4);
    padding: var(--sp-8) var(--sp-5);
    border: 1.5px dashed var(--pt-border-strong);
    border-radius: var(--r-xl);
    position: relative;
    overflow: hidden;
}
.empty-state__icon {
    width: 80px;
    height: 80px;
    border-radius: var(--r-xl);
    display: grid;
    place-items: center;
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    border-top-color: var(--glass-top);
    box-shadow: var(--shadow-md);
    color: var(--pt-accent);
    font-size: 2rem;
}
.empty-state__title {
    font-size: 1.15rem;
    font-weight: 650;
    color: var(--pt-text);
    letter-spacing: -.015em;
}
.empty-state__desc {
    color: var(--pt-text-muted);
    max-width: 380px;
    font-size: 0.875rem;
    line-height: 1.6;
}
.empty-state__actions { display: flex; gap: var(--sp-2); margin-top: var(--sp-1); }

/* ── Progress bar (atlas style) ─────────────────────────────────────── */
.progress-atlas {
    width: 100%;
    height: 7px;
    border-radius: var(--r-pill);
    background: var(--pt-bg-subtle);
    overflow: hidden;
}
.progress-atlas__bar {
    height: 100%;
    border-radius: var(--r-pill);
    background: var(--accent-gradient);
    transition: width 250ms var(--ease-spring);
}
.progress-atlas--thin { height: 4px; }

/* ── Divider ────────────────────────────────────────────────────────── */
.divider {
    height: 1px;
    background: var(--pt-border);
    border: none;
    margin: var(--sp-5) 0;
}
.divider--v {
    width: 1px;
    height: auto;
    align-self: stretch;
    margin: 0 var(--sp-2);
    background: var(--pt-border);
}

/* ── kbd (keyboard shortcut pill) ───────────────────────────────────── */
.kbd-atlas {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    height: 20px;
    padding: 0 5px;
    font-family: var(--pt-font-mono);
    font-size: 11px;
    font-weight: 500;
    color: var(--pt-text-muted);
    background: var(--pt-surface-2);
    border: 1px solid var(--pt-border-strong);
    border-bottom-width: 2px;
    border-radius: 5px;
}

/* ── Typography helpers ─────────────────────────────────────────────── */
.t-display { font-size: 34px; font-weight: 700; letter-spacing: -.02em; line-height: 1.15; color: var(--pt-text); }
.t-h1      { font-size: 26px; font-weight: 650; letter-spacing: -.018em; color: var(--pt-text); }
.t-h2      { font-size: 20px; font-weight: 620; letter-spacing: -.012em; color: var(--pt-text); }
.t-h3      { font-size: 16px; font-weight: 600; color: var(--pt-text); }
.t-body    { font-size: 14px; font-weight: 450; color: var(--pt-text); }
.t-sm      { font-size: 13px; color: inherit; }
.t-xs      { font-size: 11.5px; color: inherit; }
.t-label {
    font-size: 11.5px;
    text-transform: uppercase;
    letter-spacing: .06em;
    font-weight: 600;
    color: var(--pt-text-soft);
}
.t-mono      { font-family: var(--pt-font-mono); font-feature-settings: "tnum"; }
.t-secondary { color: var(--pt-text-muted) !important; }
.t-tertiary  { color: var(--pt-text-soft) !important; }
.t-gradient  {
    background: var(--accent-gradient);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}

/* ── Utility layout helpers ─────────────────────────────────────────── */
.u-flex          { display: flex; }
.u-iflex         { display: inline-flex; }
.u-grid          { display: grid; }
.u-items-center  { align-items: center; }
.u-items-start   { align-items: flex-start; }
.u-items-end     { align-items: flex-end; }
.u-justify-between { justify-content: space-between; }
.u-justify-center  { justify-content: center; }
.u-justify-end     { justify-content: flex-end; }
.u-col    { flex-direction: column; }
.u-wrap   { flex-wrap: wrap; }
.u-flex-1 { flex: 1; }
.u-gap-1  { gap: var(--sp-1); } .u-gap-2 { gap: var(--sp-2); } .u-gap-3 { gap: var(--sp-3); }
.u-gap-4  { gap: var(--sp-4); } .u-gap-5 { gap: var(--sp-5); } .u-gap-6 { gap: var(--sp-6); }
.u-w-full     { width: 100%; }
.u-truncate   { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.u-hidden     { display: none !important; }
.u-relative   { position: relative; }
.u-grid-2     { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--sp-4); }
.u-grid-3     { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-4); }
.u-grid-4     { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-4); }
.u-grid-auto  { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--sp-4); }

/* Staggered entrance animation */
.u-fade-in  { animation: fadeIn var(--dur) var(--ease-out) both; }
.u-rise-in  { animation: riseIn 250ms var(--ease-spring) both; }
.u-stagger > *                 { animation: riseIn 250ms var(--ease-spring) both; }
.u-stagger > *:nth-child(1)    { animation-delay: .02s; }
.u-stagger > *:nth-child(2)    { animation-delay: .06s; }
.u-stagger > *:nth-child(3)    { animation-delay: .10s; }
.u-stagger > *:nth-child(4)    { animation-delay: .14s; }
.u-stagger > *:nth-child(5)    { animation-delay: .18s; }
.u-stagger > *:nth-child(6)    { animation-delay: .22s; }

@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes riseIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }

/* ── Responsive grids ───────────────────────────────────────────────── */
@media (max-width: 1100px) {
    .u-grid-4 { grid-template-columns: repeat(2, 1fr); }
    .u-grid-3 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
    .u-grid-2, .u-grid-3, .u-grid-4 { grid-template-columns: 1fr; }
}

/* =====================================================================
   SUB-DESKTOP — sidebar becomes a permanent ICON RAIL (prototype responsive)
   ---------------------------------------------------------------------
   Argon hides the sidebar off-canvas (+ hamburger) for the WHOLE range below
   xl (≤1199.98px). The prototype instead keeps it visible as a narrow icon
   rail. Replicate that across the entire off-canvas zone and remove the
   off-canvas controls, so there's no hamburger anywhere below 1200px.
   ===================================================================== */
/* PHONE drawer (<768px): the sidebar is a permanent icon-rail that expands into
   a 16rem overlay on tap. Tablet & desktop (≥768px) use the expanded ⇄ icon-rail
   model above (see the §6 content-margin + tablet transform-override blocks). */
@media (max-width: 767.98px) {
    /* ALWAYS (rail OR expanded): sidebar visible (override Argon off-canvas),
       content past the 4.5rem rail, logo shown, off-canvas controls hidden. */
    .g-sidenav-show .sidenav.navbar-vertical.navbar-expand-xs.pt-sidenav,
    .g-sidenav-show.g-sidenav-pinned .sidenav.navbar-vertical.navbar-expand-xs.pt-sidenav {
        transform: none !important;
    }
    .g-sidenav-show main.main-content,
    .g-sidenav-show .sidenav.fixed-start + .main-content { margin-inline-start: 4.5rem !important; margin-inline-end: 0 !important; }
    .sidenav.pt-sidenav .navbar-brand .pt-brand-pill__logo { opacity: 1 !important; }
    #iconNavbarSidenav,
    #iconSidenav,
    .sidenav.pt-sidenav .pt-sidenav-footer .pt-collapse-toggle { display: none !important; }

    /* RAIL (default) — narrow 4.5rem, icons only. Suppressed once .pt-rail-open. */
    body:not(.pt-rail-open) .sidenav.navbar-vertical.navbar-expand-xs.pt-sidenav {
        inline-size: 4.5rem !important;
        min-width: 4.5rem !important;
        max-width: 4.5rem !important;
    }
    body:not(.pt-rail-open) .sidenav.pt-sidenav .nav-link .nav-link-text,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .nav-link .sidenav-normal,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .nav-item .nav-link .sidenav-mini-icon,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .pt-brand-pill__meta,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .pt-user-mini__meta { display: none !important; }
    body:not(.pt-rail-open) .sidenav.pt-sidenav .navbar-nav .nav-link,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .pt-brand-pill,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .pt-user-mini { justify-content: center !important; padding-inline: 0 !important; }
    /* Centre the icon exactly: drop its label-gap margin (RTL alignment fix) */
    body:not(.pt-rail-open) .sidenav.pt-sidenav .navbar-nav .nav-link > i,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .navbar-nav .nav-link i.kt-menu__link-icon,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .navbar-nav .nav-link span.kt-menu__link-icon,
    body:not(.pt-rail-open) .sidenav.pt-sidenav .navbar-nav .nav-link .icon.icon-shape { margin-inline-end: 0 !important; }
    /* RTL: drop the parent items' chevron padding (28px inline-end) — the chevron
       is hidden in the rail, so it would otherwise push the icon off-centre. */
    [dir="rtl"] body:not(.pt-rail-open) .sidenav.pt-sidenav .navbar-nav .nav-link[data-bs-toggle="collapse"] { padding-inline-end: 0 !important; }
    body:not(.pt-rail-open) .sidenav.pt-sidenav .nav-link[data-bs-toggle="collapse"]::after { display: none !important; }
    body:not(.pt-rail-open) .sidenav.pt-sidenav .collapse .nav.ms-4 { margin-inline-start: 0 !important; padding-inline-start: 0 !important; border: 0 !important; }

    /* EXPANDED — tapping a parent (with children) opens a full 16rem overlay
       drawer over the content (labels + the expanded submenu become usable).
       The :not(.pt-rail-open) rail rules above stop applying, so the base
       sidebar layout (labels, left-aligned items) returns automatically. */
    body.pt-rail-open .sidenav.navbar-vertical.navbar-expand-xs.pt-sidenav {
        inline-size: 16rem !important;
        min-width: 16rem !important;
        max-width: 16rem !important;
        box-shadow: var(--shadow-lg) !important;
        z-index: 1400 !important;
    }
    /* Dim/blur the page behind the open drawer (tap it to close) */
    body.pt-rail-open::after {
        content: "";
        position: fixed;
        inset: 0;
        z-index: 1399;
        background: rgba(8, 10, 14, 0.4);
        -webkit-backdrop-filter: blur(2px);
        backdrop-filter: blur(2px);
    }
}

/* ── Reduced motion ─────────────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
    .skeleton::after   { animation: none !important; }
    .u-fade-in         { animation: none !important; }
    .u-rise-in         { animation: none !important; }
    .u-stagger > *     { animation: none !important; }
    .mesh::before      { animation: none !important; }
    .u-spotlight:hover::after { opacity: 0 !important; }
}

/* ── Spotlight pointer tracking (extends premium-theme.js listener) ─── */
/* Also track .u-spotlight via the existing pointermove handler in premium-theme.js */

/* =====================================================================
   39. LIST PAGE LAYOUT  ·  TriangleCMS prototype spec (view.blade.php)
   ===================================================================== */

/* — Page header: title + lang tabs left / action buttons right — */
.pt-list-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 14px;
    margin-bottom: 16px;
}
.pt-list-header__left {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    min-width: 0;
}
.pt-list-title {
    font-size: 1.05rem;
    font-weight: 700;
    letter-spacing: -0.015em;
    color: var(--pt-text);
    margin: 0;
    white-space: nowrap;
}
.pt-list-header__actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-shrink: 0;
}

/* — Language tabs (CmsAvailableLanguage → .card-toolbar.pl-4.pt-4 .nav-pills) —
   Map the Bootstrap nav-pills onto the TriangleCMS .langtabs segmented control.
   Scoped to the helper's output signature `.card-toolbar.pl-4.pt-4` (produced
   ONLY by CmsAvailableLanguage — no blade hardcodes it) so it styles the
   language switcher on EVERY page it appears: list views AND add/edit CRUD
   pages (where it also carries `.cmsLangSwitcher`), not just the list header. */
.card-toolbar.pl-4.pt-4 {
    display: inline-flex;
    padding: 3px !important;
    margin: 0 !important;
    background: var(--pt-surface-3);
    border-radius: 9px;
    vertical-align: middle;
}
.card-toolbar.pl-4.pt-4 .nav.nav-pills {
    position: relative;
    gap: 3px !important;
    flex-wrap: nowrap;
    background: transparent !important;
    padding: 0 !important;
    margin: 0 !important;
}
/* Hide Argon's JS-injected sliding indicator (the stray "-" `.moving-tab`) —
   our segmented `.active` style is the sole active indicator. */
.card-toolbar.pl-4.pt-4 .nav.nav-pills .moving-tab { display: none !important; }
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-item .nav-link {
    display: inline-flex !important;
    align-items: center !important;
    gap: 7px !important;
    background: transparent !important;
    color: var(--pt-text-muted) !important;
    height: 30px !important;
    line-height: 1 !important;
    padding: 0 12px !important;
    border-radius: 6px !important;
    font-size: 12.5px !important;
    font-weight: 600;
    box-shadow: none !important;
    white-space: nowrap;
}
/* Flag emoji before each language name (design `.langtab .flag`, 13px).
   Driven off the ?lang= query in the tab href — no PHP change needed. */
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-link::before {
    font-size: 13px;
    line-height: 1;
}
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-link[href*="lang=en"]::before { content: "\01F1EC\01F1E7"; }
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-link[href*="lang=ar"]::before { content: "\01F1E6\01F1EA"; }
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-link[href*="lang=fr"]::before { content: "\01F1EB\01F1F7"; }
/* Inactive tab hover → subtle text darken only (design has no hover fill) */
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-item .nav-link:hover:not(.active) {
    background: transparent !important;
    color: var(--pt-text) !important;
}
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-item .nav-link.active,
.card-toolbar.pl-4.pt-4 .nav.nav-pills .nav-item .nav-link.active:hover {
    background: var(--pt-surface) !important;
    color: var(--pt-text) !important;
    box-shadow: var(--shadow-sm) !important;
}

/* — Form language switcher (cmsLangSwitcher) hardening — the rules above set
   flex-wrap but rely on Bootstrap's `.nav{display:flex}`, which the Metronic
   kt-form / kt-portlet__head-label context does NOT apply, so the <li> items
   fell back to a vertical list. Force an explicit single horizontal row and add
   inline-start breathing room from the section title. — */
.card-toolbar.pl-4.pt-4:has(.cmsLangSwitcher) {
    display: inline-flex !important;
    margin-inline-start: 16px !important;
    vertical-align: middle;
}
.nav.nav-pills.cmsLangSwitcher {
    display: inline-flex !important;
    flex-flow: row nowrap !important;
    align-items: center !important;
    width: auto !important;
    margin: 0 !important;
    list-style: none !important;
}
.nav.nav-pills.cmsLangSwitcher > .nav-item { flex: 0 0 auto !important; width: auto !important; }
.nav.nav-pills.cmsLangSwitcher > .nav-item > .nav-link { white-space: nowrap !important; }

/* — Header action buttons: consistent height 38px (TriangleCMS --field-h) — */
.pt-list-header__actions .btn {
    height: 40px !important;
    padding: 0 16px !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    gap: 8px !important;
    font-size: 0.84rem !important;
    font-weight: 600 !important;
    white-space: nowrap;
}
.pt-list-header__actions .btn > i {
    font-size: 1rem !important;
    line-height: 1 !important;
}
/* Export (ghost) hover → match design `.btn-ghost:hover`: surface-3 fill +
   a visibly darker border (design ink-300 #c6c5cb). The old rule reused
   the resting border colour, so hover looked dead. Add New (.btn-brand)
   hover is already brand-red-600 via §8. */
.pt-list-header__actions .btn-default:hover,
.pt-list-header__actions .btn-secondary:hover {
    background-color: var(--pt-surface-3) !important;
    border-color: #c6c5cb !important;
    color: var(--pt-text) !important;
}
html[data-theme="dark"] .pt-list-header__actions .btn-default:hover,
html[data-theme="dark"] .pt-list-header__actions .btn-secondary:hover {
    background-color: var(--pt-surface-3) !important;
    border-color: var(--pt-text-soft) !important;
}
/* Keep the Export icon its resting colour on hover. Metronic flips
   `.btn.btn-default:hover i` to #fff (style.bundle.ltr.css:8700) — on the
   light hover fill the white icon vanished. Re-assert the resting #93a2dd
   (Metronic `.btn.btn-default i`) so the glyph never changes on hover. */
.pt-list-header__actions .btn-default:hover i,
.pt-list-header__actions a:hover .btn-default i {
    color: #93a2dd !important;
}

/* — Portlet toolbar body (search row) — */
.kt-portlet .kt-portlet__body.pt-list-toolbar {
    display: flex !important;
    /* Metronic's .kt-portlet__body is flex-direction:column — without
       forcing row, align-items:center centres the search horizontally. */
    flex-direction: row !important;
    justify-content: flex-start !important;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    padding: 14px var(--sp-5) !important;
    border-bottom: 1px solid var(--pt-border);
}
.pt-list-search {
    flex: 1;
    max-width: 360px;
    min-width: 180px;
    margin: 0 !important;
}
.pt-list-search .form-control {
    height: 40px !important;
    padding-inline-start: 38px !important;
    padding-inline-end: 14px !important;
    background: var(--pt-surface-3) !important;
    border: 1px solid transparent !important;
    border-radius: var(--r-sm) !important;
    transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out), background-color var(--dur) var(--ease-out);
}
.pt-list-search .form-control:focus {
    background: var(--pt-surface) !important;
    border-color: var(--pt-accent) !important;
    box-shadow: 0 0 0 3px var(--pt-accent-soft) !important;
}
/* Tighten the leading-icon column so the placeholder sits close to the
   left edge (kills Metronic's wide ~3.5rem icon gutter) — matches the
   TriangleCMS .search-box (icon · 9px gap · text). RTL-safe (logical). */
.pt-list-search .kt-input-icon__icon--left {
    width: 38px !important;
    justify-content: flex-start !important;
    padding-inline-start: 13px !important;
}
.pt-list-search .kt-input-icon__icon,
.pt-list-search .kt-input-icon__icon i { color: var(--pt-text-soft) !important; }

/* inline filter row (e.g. contact-request radio buttons) */
.pt-list-filter-group {
    display: flex;
    align-items: center;
    gap: 16px;
    flex-wrap: wrap;
}
.pt-list-filter-group .kt-radio { margin-bottom: 0 !important; }

/* — Generated listing filter bar (is_filterable fields, beside the global search) — */
.pt-list-filters {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}
.pt-list-filter { min-width: 190px; }
.pt-list-filter .select2-container { width: 100% !important; }

/* ⚠️ SIZING IS NOT RESTATED HERE, on purpose. The canonical rules above give
   .select2-selection--single `display:flex; align-items:center; height:40px; padding:0`
   and let .select2-selection__rendered centre itself with `line-height:1.2`. A more
   specific rule here that sets `height`/`line-height` wins WITHOUT re-declaring the
   flex centring, which drops the value to the bottom of the box (the bug this bar
   shipped with). Only the filter bar's own SKIN belongs in this block. */
.pt-list-filter select.form-control { height: 40px !important; }
.pt-list-filter select.form-control,
.pt-list-filter .select2-container--default .select2-selection--single {
    background-color: var(--pt-surface-3) !important;
    border-color: transparent !important;
    border-radius: var(--r-sm) !important;
    transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out), background-color var(--dur) var(--ease-out);
}
.pt-list-filter select.form-control:focus,
.pt-list-filter .select2-container--default.select2-container--focus .select2-selection--single,
.pt-list-filter .select2-container--default.select2-container--open .select2-selection--single {
    background-color: var(--pt-surface) !important;
    border-color: var(--pt-accent) !important;
    box-shadow: 0 0 0 3px var(--pt-accent-soft) !important;
}
/* allowClear's "×" sits before the caret; keep the value clear of both, and let a
   long option truncate rather than run underneath them ("Media Production Support"
   in a 190px box). The canonical rule makes __rendered a flex ITEM, so it needs its
   own min-width:0 before overflow can take effect. */
.pt-list-filter .select2-container--default .select2-selection--single .select2-selection__rendered {
    min-width: 0;
    padding-inline-end: 46px !important;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}
.pt-list-filter .select2-container--default .select2-selection--single .select2-selection__clear {
    position: absolute;
    inset-inline-end: 26px;
    top: 50%;
    transform: translateY(-50%);
    margin: 0 !important;
    color: var(--pt-text-soft) !important;
}
.pt-list-filter .select2-container--default .select2-selection--single { position: relative; }

/* — Bulk bar (charcoal strip, shown when rows are checked) — */
.pt-bulkbar { border-bottom: 1px solid var(--pt-border); }
.pt-bulkbar__inner {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 11px var(--sp-5);
    background: var(--tri-grey);
    color: #fff;
}
.pt-bulkbar__cnt { font-size: 13px; font-weight: 600; color: #fff; }
.pt-bulkbar__spacer { flex: 1; }
.pt-bulkbar__delete {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    height: 32px;
    padding: 0 12px;
    border-radius: 7px;
    background: rgba(255, 255, 255, .12);
    color: #fff;
    border: none;
    font-family: var(--pt-font);
    font-size: 12.5px;
    font-weight: 600;
    cursor: pointer;
    transition: background var(--dur) var(--ease-out);
}
.pt-bulkbar__delete:hover { background: var(--tri-red) !important; color: #fff !important; }
.pt-bulkbar__delete i { font-size: 0.85rem; }

/* — Selected rows: light red tint (TriangleCMS .tbl tbody tr.sel) — */
.kt-datatable .kt-datatable__body .kt-datatable__row.kt-datatable__row--active,
.kt-datatable .kt-datatable__body .kt-datatable__row.kt-datatable__row--active:hover {
    background-color: var(--pt-accent-tint) !important;
}
html[data-theme="dark"] .kt-datatable .kt-datatable__body .kt-datatable__row.kt-datatable__row--active,
html[data-theme="dark"] .kt-datatable .kt-datatable__body .kt-datatable__row.kt-datatable__row--active:hover {
    background-color: var(--pt-accent-soft) !important;
}

/* — Row action buttons (.btn-clean.btn-icon → TriangleCMS .row-act) — */
.kt-datatable .btn.btn-clean.btn-icon {
    width: 30px !important;
    height: 30px !important;
    min-width: 30px !important;
    padding: 0 !important;
    border-radius: 7px !important;
    background: transparent !important;
    border: 0 !important;
    color: var(--pt-text-soft) !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
    box-shadow: none !important;
}
.kt-datatable .btn.btn-clean.btn-icon:hover {
    background: var(--pt-surface-3) !important;
    color: var(--pt-text) !important;
}
.kt-datatable .btn.btn-clean.btn-icon.deleteRecord:hover {
    background: var(--tri-red-50) !important;
    color: var(--tri-red-700) !important;
}
.kt-datatable .btn.btn-clean.btn-icon i {
    /* Design row-act glyph is a 16px STROKE icon (thin, inset paths); FA solid
       glyphs fill the em box, so 14px is the perceived-size equivalent. */
    font-size: 14px !important;
    line-height: 1 !important;
    color: inherit !important;
}

/* — Pager layout: info left · per-page selector · nav right — */
.kt-datatable .kt-datatable__pager {
    display: flex !important;
    align-items: center !important;
    padding: 13px var(--sp-5) !important;
    gap: 8px;
    flex-wrap: wrap;
}
.kt-datatable .kt-datatable__pager-info {
    order: -1 !important;
    display: flex !important;
    align-items: center;
    gap: 10px;
    margin: 0 !important;
    padding: 0 !important;
}
.kt-datatable .kt-datatable__pager-nav {
    margin-inline-start: auto !important;
    display: flex !important;
    align-items: center;
    gap: 3px;
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    padding: 0 !important;
    list-style: none !important;
}
/* Per-page size selector: keep visible, align with info text */
.kt-datatable .kt-datatable__pager-size {
    display: flex !important;
    align-items: center;
    margin: 0 !important;
    padding: 0 !important;
}
/* Hide First / Last nav buttons (Prev · numbers · Next only) */
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--first,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--last {
    display: none !important;
}
/* Pager nav button size — match TriangleCMS .pg button */
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > a {
    min-width: 32px !important;
    height: 32px !important;
    line-height: 30px !important;
    padding: 0 8px !important;
    border-radius: 7px !important;
    border: 1px solid var(--pt-border) !important;
    background: var(--pt-surface) !important;
    color: var(--pt-text-muted) !important;
    font-size: 12.5px !important;
    font-weight: 600;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > a:hover {
    background: var(--pt-surface-3) !important;
    color: var(--pt-text) !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--active {
    background: var(--tri-grey) !important;
    color: #fff !important;
    border-color: var(--tri-grey) !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > a i {
    font-size: 0.8rem !important;
    line-height: 1 !important;
}
/* "Showing X – Y of Z records" detail text */
.kt-datatable .kt-datatable__pager-detail {
    font-size: 12.5px !important;
    color: var(--pt-text-soft) !important;
}

/* =====================================================================
   39b. PAGER BUTTONS + ROW SELECTION — authoritative overrides
   premium-theme.css loads AFTER custom.css, so these equal-specificity
   !important rules win the cascade.
   ---------------------------------------------------------------------
   • Number / prev / next buttons → flat 7px squares (NOT circles) with a
     tight 3px gap — beats custom.css [0,4,2] `… > li a {border-radius:50%}`.
   • Active page → charcoal fill + white text (design `.pg button.on`).
   • Checkbox-selected row → red tint painted at CELL level so it shows
     above the even-row cell background (light; dark = §37, line ~2811).
   ===================================================================== */
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-nav {
    display: flex !important;
    align-items: center !important;
    gap: 3px !important;
    margin-inline-start: auto !important;
    margin-block: 0 !important;
    padding: 0 !important;
    list-style: none !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-nav > li {
    border-radius: 7px !important;
    margin: 0 !important;
    padding: 0 !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-nav > li > a {
    min-width: 32px !important;
    width: auto !important;
    height: 32px !important;
    margin: 0 !important;
    padding: 0 8px !important;
    border-radius: 7px !important;
    border: 1px solid var(--pt-border) !important;
    background: var(--pt-surface) !important;
    color: var(--pt-text-muted) !important;
    font-size: 12.5px !important;
    font-weight: 600 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-nav > li > a:hover {
    background: var(--pt-surface-3) !important;
    color: var(--pt-text) !important;
    border-color: var(--pt-border-strong) !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--active {
    background: var(--tri-grey) !important;
    color: #fff !important;
    border-color: var(--tri-grey) !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link--disabled {
    opacity: 0.45 !important;
    cursor: not-allowed !important;
}
/* style_custom.bundle.css paints prev/next/first/last (base #EFEFEF, hover #F6D64C
   yellow) and disabled (#EFEFEF/#AAAAAA) at (0,5,1)/(0,6,1) !important, beating the
   (0,4,2)/(0,5,2) rules above in LIGHT mode (dark is re-skinned by §38). Match its
   selectors verbatim — this file loads later, so equal specificity wins the tie. */
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--first,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--prev,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--next,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--last {
    background: var(--pt-surface) !important;
    color: var(--pt-text-muted) !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--first:hover,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--prev:hover,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--next:hover,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--last:hover {
    background: var(--pt-surface-3) !important;
    color: var(--pt-text) !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--disabled,
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-nav > li > .kt-datatable__pager-link.kt-datatable__pager-link--disabled:hover {
    background: var(--pt-surface) !important;
    color: var(--pt-text-soft) !important;
}
/* Selected (checkbox-checked) row → red tint at cell level (light mode) */
.kt-datatable.kt-datatable--default > .kt-datatable__table > .kt-datatable__body .kt-datatable__row.kt-datatable__row--active > .kt-datatable__cell {
    background-color: var(--pt-accent-tint) !important;
}

/* — Per-page (bootstrap-select) dropdown → clean rounded popover.
   Tokens are theme-aware, so one block covers light + dark. The selected
   item already renders charcoal (light) / red (dark) via the rules above. */
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu {
    margin: 6px 0 !important;
    padding: 6px !important;
    min-width: 92px !important;
    background-color: var(--pt-surface) !important;
    border: 1px solid var(--pt-border) !important;
    border-radius: var(--r-sm) !important;
    box-shadow: var(--shadow-pop) !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner {
    padding: 0 !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li {
    margin: 0 !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li > a {
    padding: 7px 11px !important;
    border-radius: 6px !important;
    font-size: 12.5px !important;
    font-weight: 500 !important;
    color: var(--pt-text) !important;
}
.kt-datatable > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .dropdown-menu .inner > li:not(.selected) > a:hover {
    background-color: var(--pt-surface-3) !important;
    color: var(--pt-text) !important;
}

/* ===================================================================
   LANGUAGE SWITCHER — Metronic output restyled for TriangleCMS topbar
   =================================================================== */
/* Topbar LANGUAGE SWITCHER — identical structure & behaviour to the user/profile
   dropdown: a flag trigger button with data-bs-toggle/data-bs-display="static"
   (BS5 delegation, no Popper) + a .dropdown-menu.pt-menu that §6f positions
   directly under the trigger (RTL-aware: right edge LTR / left edge RTL). The
   menu inherits the full .pt-menu card + .pt-menu__item design; only the flag
   images need sizing here. */
.pt-lang-switcher { position: relative; }
.pt-lang-switcher .pt-lang-trigger { overflow: hidden; }
.pt-lang-switcher .pt-lang-trigger .pt-lang-flag {
    width: 24px;
    height: 17px;
    object-fit: cover;
    border-radius: 3px;
    display: block;
}
.pt-lang-dropdown .pt-menu__item .pt-lang-flag {
    width: 22px;
    height: 16px;
    object-fit: cover;
    border-radius: 2px;
    flex-shrink: 0;
}
/* current language highlighted in brand red (like the design's active item) */
.pt-lang-dropdown .pt-menu__item.is-active.dropdown-item,
.pt-lang-dropdown .pt-menu__item.is-active.dropdown-item span { color: var(--tri-red) !important; font-weight: 600; }
html[data-theme="dark"] .pt-lang-dropdown .pt-menu__item.is-active.dropdown-item,
html[data-theme="dark"] .pt-lang-dropdown .pt-menu__item.is-active.dropdown-item span { color: var(--tri-red-300) !important; }
html[data-theme="dark"] .pt-lang-dropdown .pt-lang-flag { filter: brightness(1.08) saturate(1.1); }

/* =====================================================================
   6d. TOPBAR — notification bell + user avatar account menu
   Clone of the TriangleCMS shell Topbar (shell.jsx): borderless icon
   buttons (.tb-icon), circular avatar trigger, and design .menu dropdowns
   (surface · hairline · shadow-pop · rounded items, red "Sign out").
   ===================================================================== */
/* Icon buttons (bell + theme toggle) → flat, borderless (design .tb-icon).
   The later [0,2,0] rule also neutralises §6's bordered .pt-theme-toggle. */
.navbar-main .pt-topbar-icon {
    position: relative;
    width: 38px;
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 0;
    border-radius: var(--r-sm);
    background: transparent;
    color: var(--pt-text-muted);
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
    transition: background-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.navbar-main .pt-topbar-icon > i { color: inherit; }
.navbar-main .pt-topbar-icon:hover,
.navbar-main .pt-topbar-icon[aria-expanded="true"] {
    background: var(--pt-surface-3);
    color: var(--pt-text);
    transform: none;
}
/* Unread dot (design .tb-dot) */
.navbar-main .pt-topbar-dot {
    position: absolute;
    top: 7px;
    inset-inline-end: 8px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--tri-red);
    border: 2px solid var(--pt-surface);
}

/* User avatar trigger (design Avatar) — colour set inline per user */
.navbar-main .pt-user-avatar {
    width: 36px;
    height: 36px;
    flex-shrink: 0;
    border: 0;
    padding: 0;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 0.8rem;
    font-weight: 700;
    line-height: 1;
    color: #fff;
    cursor: pointer;
    transition: box-shadow var(--dur) var(--ease-out), transform var(--dur) var(--ease-out);
}
.navbar-main .pt-user-avatar:hover { transform: translateY(-1px); }
.navbar-main .pt-user-avatar[aria-expanded="true"] { box-shadow: 0 0 0 3px var(--pt-accent-soft); }

/* Dropdown popovers (design .menu) — shared by the user + bell menus */
.navbar-main .dropdown-menu.pt-menu {
    margin-top: 10px !important;
    min-width: 224px;
    padding: 6px !important;
    background: var(--pt-surface) !important;
    border: 1px solid var(--pt-border) !important;
    border-radius: var(--r) !important;
    box-shadow: var(--shadow-pop) !important;
    color: var(--pt-text) !important;
}
.pt-menu .pt-menu__label {
    font-size: 10.5px;
    font-weight: 700;
    letter-spacing: 0.07em;
    text-transform: uppercase;
    color: var(--pt-text-soft);
    padding: 8px 10px 5px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.pt-menu .pt-menu__sep {
    height: 1px;
    background: var(--pt-border);
    margin: 5px 4px;
}
.pt-menu .pt-menu__item.dropdown-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 10px !important;
    border-radius: 7px;
    font-size: 13px;
    font-weight: 500;
    color: var(--pt-text) !important;
    white-space: nowrap;
    transition: background-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.pt-menu .pt-menu__item.dropdown-item > i {
    width: 16px;
    flex-shrink: 0;
    font-size: 0.9rem;
    text-align: center;
    color: var(--pt-text-muted);
}
.pt-menu .pt-menu__item.dropdown-item:hover,
.pt-menu .pt-menu__item.dropdown-item:focus,
.pt-menu .pt-menu__item.dropdown-item:active {
    background: var(--pt-surface-3) !important;
    color: var(--pt-text) !important;
}
.pt-menu .pt-menu__item.dropdown-item:hover > i { color: var(--pt-text); }
/* Danger item (Sign out) */
.pt-menu .pt-menu__item--danger.dropdown-item,
.pt-menu .pt-menu__item--danger.dropdown-item > i {
    color: var(--tri-red) !important;
}
.pt-menu .pt-menu__item--danger.dropdown-item:hover,
.pt-menu .pt-menu__item--danger.dropdown-item:focus {
    background: var(--tri-red-50) !important;
    color: var(--tri-red-700) !important;
}
.pt-menu .pt-menu__item--danger.dropdown-item:hover > i { color: var(--tri-red-700) !important; }
html[data-theme="dark"] .pt-menu .pt-menu__item--danger.dropdown-item:hover,
html[data-theme="dark"] .pt-menu .pt-menu__item--danger.dropdown-item:focus {
    background: var(--pt-accent-soft) !important;
    color: var(--tri-red) !important;
}

/* Notification dropdown specifics */
.navbar-main .dropdown-menu.pt-notif-menu { min-width: 300px; max-width: 340px; }
.pt-notif-menu .pt-notif-item.dropdown-item { align-items: flex-start; white-space: normal; }
.pt-notif-item__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.pt-notif-item__text { font-size: 13px; font-weight: 500; color: var(--pt-text); line-height: 1.4; }
.pt-notif-item__time { display: flex; align-items: center; gap: 5px; font-size: 11px; color: var(--pt-text-soft); }
.pt-notif-item__time > i { font-size: 0.68rem; }
.pt-notif-empty { padding: 18px 12px; text-align: center; font-size: 13px; color: var(--pt-text-soft); }

/* =====================================================================
   6e. TOPBAR RTL FIX — keep the action cluster flush to the inline-end.
   Argon ships NO RTL stylesheet (argon-dashboard.css + custom.css load in
   both directions), so Bootstrap's `ms-md-auto` on the empty leftover
   search wrapper does not push the bell/theme/avatar cluster to the end
   under dir=rtl → a wide blank gap opened before it. Drop that empty
   wrapper and pin the <ul> to the inline-end with LOGICAL auto margins
   (direction-aware → correct in both LTR and RTL).
   ===================================================================== */
@media (min-width: 992px) {
    .navbar-main #navbar.navbar-collapse > .ms-md-auto { display: none !important; }
    .navbar-main #navbar.navbar-collapse .navbar-nav {
        margin-inline-start: auto !important;
        margin-inline-end: 0 !important;
        margin-block: 0 !important;
    }
}

/* ---------------------------------------------------------------------
   6f. TOPBAR DROPDOWN RTL FIX — account + notification menus open INWARD.
   The toggles carry data-bs-display="static" (no Popper). Argon ships no
   RTL build, so its physical `.dropdown .dropdown-menu.dropdown-menu-end
   {right:0 !important}` (argon-dashboard.css:17425) keeps the menu pinned to
   the right edge of the trigger → under dir=rtl (trigger at the far LEFT) the
   menu slides off the left of the viewport and renders cropped. Pin the menu
   below the trigger and flip its horizontal anchor per direction so it always
   opens toward the content.
   --------------------------------------------------------------------- */
.navbar-main .nav-item.dropdown .dropdown-menu.pt-menu {
    position: absolute !important;
    inset-block-start: 100% !important;
    inset-block-end: auto !important;
    right: 0 !important;
    left: auto !important;
    transform: none !important;
    /* Argon sets display:block + animation:hide-navbar-dropdown (starts at opacity:1)
       on all .dropdown .dropdown-menu at ≥992px, causing a visible flash on every page
       load. Override to Bootstrap's standard display:none/display:block approach. */
    display: none !important;
    animation: none !important;
}
.navbar-main .nav-item.dropdown .dropdown-menu.pt-menu.show {
    display: block !important;
    opacity: 1 !important;
    visibility: visible !important;
    pointer-events: auto !important;
    animation: none !important;
}
[dir="rtl"] .navbar-main .nav-item.dropdown .dropdown-menu.pt-menu {
    right: auto !important;
    left: 0 !important;
}
/* Same fix for the language switcher dropdown (uses dropdown-menu-anim class from
   the LanguageSelection() helper — also affected by Argon's hide-navbar-dropdown flash). */
.pt-lang-switcher .dropdown-menu {
    display: none !important;
    animation: none !important;
}
.pt-lang-switcher .dropdown-menu.show {
    display: block !important;
    opacity: 1 !important;
    visibility: visible !important;
    pointer-events: auto !important;
    animation: none !important;
}

/* ===================================================================
   PURGE-SPECIFIC-URL MODAL  —  TriangleCMS flat design
   =================================================================== */

/* Override Bootstrap header coloring */
#purgeSpecificUrlModal .pt-modal-content {
    border-radius: var(--r-lg) !important;
    overflow: hidden;
}
#purgeSpecificUrlModal .pt-modal-header {
    background: var(--pt-surface) !important;
    border-bottom: 1px solid var(--pt-border) !important;
    padding: 18px 22px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    color: var(--pt-text) !important;
}
#purgeSpecificUrlModal .pt-modal-title {
    display: flex;
    align-items: center;
    gap: 9px;
    font-size: 15px;
    font-weight: 700;
    letter-spacing: -.01em;
    color: var(--pt-text) !important;
    margin: 0;
}
#purgeSpecificUrlModal .pt-modal-title i {
    color: var(--pt-text-muted);
    font-size: 14px;
}
#purgeSpecificUrlModal .pt-modal-close {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border: none;
    background: transparent;
    border-radius: var(--r-sm);
    color: var(--pt-text-muted);
    cursor: pointer;
    flex-shrink: 0;
    transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
    padding: 0;
}
#purgeSpecificUrlModal .pt-modal-close:hover {
    background: var(--pt-surface-3);
    color: var(--pt-text);
}

/* Body */
#purgeSpecificUrlModal .pt-modal-body {
    padding: 22px 22px 18px;
    background: var(--pt-surface);
}
#purgeSpecificUrlModal .pt-modal-desc {
    font-size: 13.5px;
    color: var(--pt-text-muted);
    margin-bottom: 14px;
}

/* Custom input row — prefix + field */
#purgeSpecificUrlModal .pt-modal-input-wrap {
    display: flex;
    align-items: stretch;
    border: 1px solid var(--pt-border-strong);
    border-radius: var(--r-sm);
    overflow: hidden;
    transition: border-color var(--dur) var(--ease-out);
    background: var(--pt-input-bg);
}
#purgeSpecificUrlModal .pt-modal-input-wrap:focus-within {
    border-color: var(--tri-red);
    box-shadow: 0 0 0 3px rgba(237, 26, 47, 0.12);
}
#purgeSpecificUrlModal .pt-modal-input-prefix {
    padding: 0 12px;
    font-size: 13px;
    font-weight: 500;
    color: var(--pt-text-muted);
    background: var(--pt-surface-3);
    border-right: 1px solid var(--pt-border-strong);
    display: flex;
    align-items: center;
    white-space: nowrap;
    flex-shrink: 0;
    user-select: none;
}
[dir="rtl"] #purgeSpecificUrlModal .pt-modal-input-prefix {
    border-right: none;
    border-left: 1px solid var(--pt-border-strong);
}
#purgeSpecificUrlModal .pt-modal-input {
    flex: 1;
    border: none !important;
    outline: none !important;
    box-shadow: none !important;
    background: transparent !important;
    padding: 9px 12px;
    font-size: 13.5px;
    color: var(--pt-text) !important;
    min-width: 0;
}
#purgeSpecificUrlModal .pt-modal-input::placeholder {
    color: var(--pt-text-muted);
    opacity: .7;
}
#purgeSpecificUrlModal .pt-modal-error {
    font-size: 12.5px;
    color: var(--tri-red);
    margin-top: 6px;
}

/* Footer */
#purgeSpecificUrlModal .pt-modal-footer {
    background: var(--pt-surface-3) !important;
    border-top: 1px solid var(--pt-border) !important;
    padding: 14px 22px;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 10px;
}
#purgeSpecificUrlModal .pt-modal-btn-cancel {
    background: var(--pt-surface) !important;
    background-image: none !important;
    color: var(--pt-text) !important;
    border: 1px solid var(--pt-border-strong) !important;
    font-size: 13px;
    font-weight: 500;
    padding: 8px 16px;
    border-radius: var(--r-sm);
    transition: background var(--dur) var(--ease-out);
}
#purgeSpecificUrlModal .pt-modal-btn-cancel:hover {
    background: var(--pt-surface-hover) !important;
}
#purgeSpecificUrlModal .pt-modal-btn-primary {
    background: var(--tri-red) !important;
    background-image: none !important;
    color: #fff !important;
    border: none !important;
    font-size: 13px;
    font-weight: 600;
    padding: 8px 18px;
    border-radius: var(--r-sm);
    display: inline-flex;
    align-items: center;
    gap: 7px;
    transition: background var(--dur) var(--ease-out), opacity var(--dur) var(--ease-out);
}
#purgeSpecificUrlModal .pt-modal-btn-primary:hover {
    background: var(--tri-red-600) !important;
}
#purgeSpecificUrlModal .pt-modal-btn-primary:disabled {
    opacity: .6;
    cursor: not-allowed;
}
html[data-theme="dark"] #purgeSpecificUrlModal .pt-modal-input-prefix {
    background: var(--pt-surface-2);
}

/* =====================================================================
   §42 — TRIANGLECMS FORM PAGES ("Edit Article" pattern, TriangleCMS/cms/form.jsx)
   Shared layer for ALL add/edit pages: page head (back + title + status +
   actions), portlet lang row, form tabs, two-column grid (main + 340px
   sidebar on surface-2), sidebar switch cards, design toast.
   Markup contract (per page):
     #kt_subheader > .kt-container > .kt-subheader__main.pt-form-head
                                   + .kt-subheader__toolbar.pt-form-head__actions
     .kt-portlet > .pt-form-langrow > {!! CmsAvailableLanguage() !!}
                 > .pt-form-tabs > button.pt-tab[data-pttab][data-ptform?]
                 > form.splitted-form > .kt-portlet__body > .left-side > .pt-form-pane[data-ptpanel]
                                                          > .right-side (sidebar)
                 > .pt-relation-pane[data-ptpanel][hidden] (AJAX relation tabs)
   ===================================================================== */

/* ---- page head ---- */
#kt_subheader .pt-form-head {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
    min-width: 0;
}
.pt-form-back {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    height: 32px;
    padding: 0 12px;
    border-radius: 7px;
    border: 1px solid var(--pt-border-strong);
    background: var(--pt-surface);
    color: var(--pt-text) !important;
    font-size: 12.5px;
    font-weight: 600;
    text-decoration: none !important;
    white-space: nowrap;
    flex-shrink: 0;
    transition: background var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out);
}
.pt-form-back:hover {
    background: var(--pt-surface-3);
    border-color: #c6c5cb;
}
html[data-theme="dark"] .pt-form-back:hover {
    border-color: var(--pt-text-soft);
}
.pt-form-back i {
    font-size: .7rem;
    color: var(--pt-text-muted);
}
.pt-form-head__info {
    min-width: 0;
}
#kt_subheader .pt-form-head__title {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: 17px !important;
    font-weight: 700 !important;
    letter-spacing: -.01em;
    color: var(--pt-text);
    line-height: 1.25;
    margin: 0;
    padding: 0;
    flex-wrap: wrap;
}
.pt-form-head__sub {
    font-family: var(--pt-font-mono);
    font-size: 11.5px;
    color: var(--pt-text-soft);
    margin-top: 3px;
}
#kt_subheader .pt-form-head__actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}
.pt-form-head__actions .btn {
    height: 40px;
    padding: 0 16px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: .84rem;
    border-radius: var(--r-sm);
}
.pt-form-head__actions .btn-default:hover {
    background: var(--pt-surface-3);
    border-color: #c6c5cb;
}
.pt-form-head__actions .btn-default:hover i {
    color: #93a2dd !important; /* keep Metronic resting glyph colour (see PROGRESS 11b) */
}

/* ---- status badge (design StatusBadge: soft pill + pip) ---- */
.pt-badge {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 11.5px;
    font-weight: 600;
    padding: 3px 9px;
    border-radius: 20px;
    line-height: 1.4;
    vertical-align: middle;
}
.pt-badge .pip {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: currentColor;
}
.pt-badge--green  { color: #1b7a53; background: var(--pt-success-soft); }
.pt-badge--grey   { color: var(--pt-text-muted); background: var(--pt-surface-3); }
.pt-badge--amber  { color: #9a6612; background: var(--pt-warning-soft); }
.pt-badge--red    { color: var(--tri-red-700); background: var(--pt-accent-soft); }
.pt-badge--blue   { color: #2a5ba8; background: var(--pt-info-soft); }
html[data-theme="dark"] .pt-badge--green { color: #52c79a; }
html[data-theme="dark"] .pt-badge--amber { color: #e7b463; }
html[data-theme="dark"] .pt-badge--red   { color: #f0808d; }
html[data-theme="dark"] .pt-badge--blue  { color: #7aa6e8; }

/* ---- portlet language row ---- */
.pt-form-langrow {
    display: flex;
    align-items: center;
    gap: 14px;
    flex-wrap: wrap;
    padding: 12px 22px;
    border-bottom: 1px solid var(--pt-border);
}
.pt-form-langrow__label {
    font-size: 12.5px;
    font-weight: 600;
    color: var(--pt-text-muted);
}
/* CmsAvailableLanguage() emits .card-toolbar.pl-4.pt-4 — flush it inside the lang row */
.pt-form-langrow .card-toolbar.pl-4.pt-4 {
    padding: 0 !important;
    margin: 0 !important;
}

/* ---- form tabs (design .tabs / .tab) ---- */
.pt-form-tabs {
    display: flex;
    gap: 2px;
    padding: 0 22px;
    border-bottom: 1px solid var(--pt-border);
    overflow-x: auto;
    scrollbar-width: thin;
}
.pt-form-tabs .pt-tab {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 15px;
    font-size: 13px;
    font-weight: 600;
    font-family: inherit;
    color: var(--pt-text-muted);
    cursor: pointer;
    background: transparent;
    border: 0;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    white-space: nowrap;
    transition: color var(--dur) var(--ease-out);
}
.pt-form-tabs .pt-tab:hover {
    color: var(--pt-text);
}
.pt-form-tabs .pt-tab.on {
    color: var(--pt-text);
    border-bottom-color: var(--pt-accent);
}
.pt-form-tabs .pt-tab i {
    font-size: .85rem;
    color: inherit;
}
.pt-form-tabs .pt-tab .tcount {
    font-size: 11px;
    font-weight: 700;
    background: var(--pt-surface-3);
    color: var(--pt-text-muted);
    padding: 1px 7px;
    border-radius: 20px;
}
.pt-form-tabs .pt-tab.on .tcount {
    background: var(--pt-accent-tint);
    color: var(--pt-accent-600);
}

/* ---- two-column form grid (overrides Metronic 75/25 splitted-form) ---- */
.kt-portlet .kt-form.splitted-form .kt-portlet__body {
    display: grid !important;
    grid-template-columns: minmax(0, 1fr);
    gap: 0;
    padding: 0 !important;
}
.kt-portlet .kt-form.splitted-form .kt-portlet__body:has(> .right-side) {
    grid-template-columns: minmax(0, 1fr) 340px;
}
.kt-portlet .kt-form.splitted-form .kt-portlet__body > * {
    grid-column: 1 / -1;
    min-width: 0;
}
.kt-portlet .kt-form.splitted-form .kt-portlet__body > .alert {
    margin: 18px 22px 0;
    width: auto;
}
.kt-portlet .kt-form.splitted-form .kt-portlet__body > .left-side {
    grid-column: 1;
    width: auto !important;
    padding: 22px;
    display: flex;
    flex-direction: column;
    min-width: 0;
}
.kt-portlet .kt-form.splitted-form .kt-portlet__body:has(> .right-side) > .left-side {
    border-inline-end: 1px solid var(--pt-border);
}
.kt-portlet .kt-form.splitted-form .kt-portlet__body > .right-side {
    grid-column: 2;
    width: auto !important;
    padding: 22px !important;
    background: var(--pt-surface-2);
    display: flex;
    flex-direction: column;
    min-width: 0;
}
.kt-portlet .kt-form.splitted-form .kt-portlet__body > .right-side .form-group {
    margin-bottom: 20px;
}
@media (max-width: 1100px) {
    .kt-portlet .kt-form.splitted-form .kt-portlet__body:has(> .right-side) {
        grid-template-columns: minmax(0, 1fr);
    }
    .kt-portlet .kt-form.splitted-form .kt-portlet__body > .right-side {
        grid-column: 1;
        border-top: 1px solid var(--pt-border);
    }
    .kt-portlet .kt-form.splitted-form .kt-portlet__body:has(> .right-side) > .left-side {
        border-inline-end: 0;
    }
}

/* ---- tab panes ---- */
.kt-portlet [data-ptpanel][hidden],
.kt-portlet form.splitted-form[hidden] {
    display: none !important;
}
.pt-form-pane {
    display: flex;
    flex-direction: column;
}
.pt-form-pane > .form-group,
.pt-relation-pane > .form-group {
    margin-bottom: 20px;
}
.pt-relation-pane {
    padding: 22px;
}

/* ---- sidebar switch / info cards (design Featured row) ---- */
.pt-side-card {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 12px 14px;
    background: var(--pt-surface);
    border: 1px solid var(--pt-border);
    border-radius: var(--r-sm);
}
.pt-side-card__text {
    min-width: 0;
}
.pt-side-card__title {
    font-size: 13px;
    font-weight: 600;
    color: var(--pt-text);
    display: flex;
    align-items: center;
    gap: 6px;
}
.pt-side-card__title i {
    font-size: .8rem;
}
.pt-side-card__hint {
    font-size: 11.5px;
    color: var(--pt-text-soft);
    margin-top: 2px;
}

/* ---- switch (design .switch; same markup contract as the Settings page) ---- */
.pt-switch {
    position: relative;
    display: inline-block;
    width: 38px;
    height: 22px;
    flex-shrink: 0;
    cursor: pointer;
    margin: 0;
    line-height: 0;
    vertical-align: middle;
}
.pt-switch input[type="checkbox"] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
    z-index: 1;
}
.pt-switch__track {
    position: absolute;
    inset: 0;
    border-radius: 20px;
    background: #c6c5cb;
    transition: background .18s var(--ease-out);
}
.pt-switch__track::after {
    content: "";
    position: absolute;
    top: 2px;
    inset-inline-start: 2px;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 1px 2px rgba(0, 0, 0, .25);
    transition: transform .18s var(--ease-out);
}
.pt-switch input:checked + .pt-switch__track {
    background: var(--pt-accent);
}
.pt-switch input:checked + .pt-switch__track::after {
    transform: translateX(16px);
}
[dir="rtl"] .pt-switch input:checked + .pt-switch__track::after {
    transform: translateX(-16px);
}
.pt-switch input:focus-visible + .pt-switch__track {
    box-shadow: 0 0 0 3px var(--pt-accent-soft);
}
html[data-theme="dark"] .pt-switch__track {
    background: #56555d;
}

/* ---- design toast (dark pill, bottom-right, coloured icon disc) ---- */
.pt-toast-wrap {
    top: auto !important;
    bottom: 22px !important;
    inset-inline-end: 22px !important;
    inset-inline-start: auto !important;
}
#adminToast {
    background: #232227 !important;
    color: #fff !important;
    border: 0 !important;
    border-radius: 10px !important;
    box-shadow: var(--shadow-lg, 0 18px 50px rgba(26, 25, 29, .16), 0 4px 14px rgba(26, 25, 29, .10));
    font-size: 13px;
    font-weight: 500;
    min-width: 260px;
    max-width: 520px;
}
#adminToast.bg-success,
#adminToast.bg-danger,
#adminToast.bg-warning,
#adminToast.bg-info {
    background-color: #232227 !important;
}
#adminToast > .d-flex {
    align-items: center;
}
#adminToast .toast-body {
    display: flex;
    align-items: center;
    gap: 11px;
    padding: 12px 16px;
}
#adminToast #toastIcon {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 10.5px;
    color: #fff;
    flex: 0 0 auto;
    margin: 0 !important;
    background: var(--pt-text-soft);
}
#adminToast.bg-success #toastIcon { background: var(--pt-success); }
#adminToast.bg-danger  #toastIcon { background: var(--tri-red); }
#adminToast.bg-warning #toastIcon { background: var(--pt-warning); }
#adminToast.bg-info    #toastIcon { background: var(--pt-info); }
#adminToast .btn-close {
    filter: none !important;
    opacity: .7;
}
#adminToast .btn-close:hover {
    opacity: 1;
}
/* RTL: force the whole pill to the bottom-LEFT with explicit physical props.
   The logical inset-inline-end above can resolve to the right when the fixed
   container's computed direction isn't rtl, so we override it outright. */
body.rtl .pt-toast-wrap,
[dir="rtl"] .pt-toast-wrap {
    left: 22px !important;
    right: auto !important;
    inset-inline-start: 22px !important;
    inset-inline-end: auto !important;
}
/* Spread the row so the close button pins to the far left while the icon+message
   group stays on the right; keep the icon-then-message order reading L→R. */
body.rtl #adminToast > .d-flex,
[dir="rtl"] #adminToast > .d-flex {
    justify-content: space-between;
    width: 100%;
}
body.rtl #adminToast .toast-body,
[dir="rtl"] #adminToast .toast-body {
    direction: rtl;
    justify-content: flex-start;
    text-align: right;
}

/* =====================================================================
   §43 — ADMIN ROLES (TriangleCMS "Roles" design, TriangleCMS/cms/misc.jsx)
   Index = role list with shield cells; Create/Edit = permission accordion
   (collapsible groups + tri-state checkboxes) replacing the nested-table tree.
   Markup contract (commonMenuPermission/menuPermissions + child_row):
     .pt-perm-tree > .pt-perm-toolbar (#SelectAll master + #pt-perm-count)
                   > .pt-perm-group[data-perm-node] (top-level node)
                       > .pt-perm-group__head (.pt-perm-caret + .pt-perm-check>input.pt-perm-input + title + .pt-perm-group__count)
                       > .pt-perm-group__body > .pt-perm-node[data-perm-node]
                           > .pt-perm-row (.pt-perm-check>input.pt-perm-input + title)
                           > .pt-perm-children (nested .pt-perm-node…)
   Every checkbox keeps class "adminMenuPermission webSection_parent",
   name="WebSectionIDs[]" — the submit/cascade contract is unchanged.
   ===================================================================== */

/* ---- page description line (design PageHead) ---- */
.pt-page-desc {
    margin: 0 0 var(--sp-4);
    font-size: 14px;
    color: var(--pt-text-muted);
    max-width: 560px;
    line-height: 1.5;
}

/* ---- index: role name cell with shield tile (design role rail) ---- */
.pt-role-cell {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
}
.pt-role-ico {
    width: 30px;
    height: 30px;
    flex: 0 0 auto;
    border-radius: 8px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--pt-accent-soft);
    color: var(--pt-accent);
    font-size: 13px;
}
.pt-role-cell__name {
    font-weight: 600;
    color: var(--pt-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ---- shared checkbox (design .cbx) — used across the accordion ---- */
.pt-perm-check {
    position: relative;
    display: inline-flex;
    align-items: center;
    margin: 0;
    cursor: pointer;
    flex: 0 0 auto;
    line-height: 0;
}
.pt-perm-check input {
    position: absolute;
    opacity: 0;
    width: 18px;
    height: 18px;
    margin: 0;
    cursor: pointer;
    z-index: 1;
}
.pt-perm-box {
    width: 18px;
    height: 18px;
    border-radius: 5px;
    border: 1.5px solid var(--pt-border-strong);
    background: var(--pt-surface);
    display: inline-grid;
    place-items: center;
    transition: background .14s var(--ease-out), border-color .14s var(--ease-out);
}
.pt-perm-box::after {
    content: "";
    width: 10px;
    height: 10px;
    background: #fff;
    opacity: 0;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") center/contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") center/contain no-repeat;
}
.pt-perm-check input:checked ~ .pt-perm-box {
    background: var(--pt-accent);
    border-color: var(--pt-accent);
}
.pt-perm-check input:checked ~ .pt-perm-box::after { opacity: 1; }
/* indeterminate → red box with a dash */
.pt-perm-check input:indeterminate ~ .pt-perm-box {
    background: var(--pt-accent);
    border-color: var(--pt-accent);
}
.pt-perm-check input:indeterminate ~ .pt-perm-box::after {
    opacity: 1;
    width: 10px;
    height: 2px;
    border-radius: 1px;
    -webkit-mask: none;
    mask: none;
}
.pt-perm-check input:focus-visible ~ .pt-perm-box {
    box-shadow: 0 0 0 3px var(--pt-accent-soft);
}

/* ---- permission section header (design editor-panel head) ---- */
.pt-perm-section {
    margin-top: 22px;
    padding-top: 22px;
    border-top: 1px solid var(--pt-border);
}
.pt-perm-section__head { margin-bottom: 16px; }
.pt-perm-section__title {
    font-size: 14.5px;
    font-weight: 700;
    letter-spacing: -.01em;
    color: var(--pt-text);
}
.pt-perm-section__hint {
    font-size: 12.5px;
    color: var(--pt-text-soft);
    margin-top: 3px;
}

/* ---- tree wrapper + toolbar ---- */
.pt-perm-tree {
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.pt-perm-toolbar {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 4px 2px 6px;
}
.pt-perm-toolbar .pt-perm-check { gap: 9px; }
.pt-perm-master-label {
    font-size: 12.5px;
    font-weight: 600;
    color: var(--pt-text);
    margin-inline-start: 9px;
}
.pt-perm-toggle-all {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    height: 30px;
    padding: 0 12px;
    border-radius: 7px;
    border: 1px solid var(--pt-border-strong);
    background: var(--pt-surface);
    color: var(--pt-text-muted);
    font-size: 12px;
    font-weight: 600;
    cursor: pointer;
    transition: background .14s var(--ease-out), border-color .14s var(--ease-out), color .14s var(--ease-out);
}
.pt-perm-toggle-all:hover {
    background: var(--pt-surface-3);
    color: var(--pt-text);
}
.pt-perm-toggle-all i { font-size: .7rem; }
.pt-perm-summary {
    margin-inline-start: auto;
    font-size: 12px;
    color: var(--pt-text-soft);
}
.pt-perm-summary #pt-perm-count { color: var(--pt-text); font-weight: 700; }

/* ---- group (top-level node) ---- */
.pt-perm-group {
    border: 1px solid var(--pt-border);
    border-radius: var(--r-sm);
    overflow: hidden;
    background: var(--pt-surface);
}
.pt-perm-group__head {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 12px 14px;
    background: var(--pt-surface-2);
    cursor: default;
}
.pt-perm-caret {
    width: 22px;
    height: 22px;
    flex: 0 0 auto;
    border: 0;
    background: transparent;
    color: var(--pt-text-soft);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    border-radius: 5px;
    padding: 0;
}
.pt-perm-caret:hover { background: var(--pt-surface-3); color: var(--pt-text); }
.pt-perm-caret i { font-size: .7rem; transition: transform .2s var(--ease-out); }
.pt-perm-group.open .pt-perm-caret i { transform: rotate(90deg); }
[dir="rtl"] .pt-perm-caret i { transform: rotate(180deg); }
[dir="rtl"] .pt-perm-group.open .pt-perm-caret i { transform: rotate(90deg); }
.pt-perm-caret--empty { cursor: default; visibility: hidden; }
.pt-perm-group__title {
    font-size: 13.5px;
    font-weight: 600;
    color: var(--pt-text);
    flex: 1 1 auto;
    min-width: 0;
}
.pt-perm-group__count {
    font-size: 12px;
    font-weight: 600;
    color: var(--pt-text-soft);
    flex: 0 0 auto;
    font-variant-numeric: tabular-nums;
}
.pt-perm-group.has-selection .pt-perm-group__count { color: var(--pt-accent-600); }

/* collapsible body */
.pt-perm-group__body { display: none; padding: 4px 14px 12px 44px; }
.pt-perm-group.open .pt-perm-group__body { display: block; }
[dir="rtl"] .pt-perm-group__body { padding: 4px 44px 12px 14px; }

/* ---- descendant rows ---- */
.pt-perm-node { display: block; }
.pt-perm-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 7px 0;
    padding-inline-start: calc(var(--lvl, 0) * 20px);
}
.pt-perm-row__title { font-size: 13px; color: var(--pt-text); }
.pt-perm-children { display: block; }

/* ---- grants this editor cannot change (Spatie teams plan R5 step 6) ---- */
.pt-perm-tree .pt-perm-lock {
    flex: 0 0 auto;
    margin-inline-start: 8px;
    padding: 2px 8px;
    border-radius: 999px;
    font-size: 11px;
    font-weight: 600;
    line-height: 1.4;
    color: var(--pt-text-soft);
    background: rgba(100, 116, 139, .14);
    white-space: nowrap;
}
.pt-perm-group.is-locked > .pt-perm-group__head .pt-perm-check,
.pt-perm-node.is-locked > .pt-perm-row .pt-perm-check { opacity: .55; cursor: not-allowed; }

/* ---- permission matrix over the tree (Spatie teams plan R8.2) ---- */
.pt-matrix { margin-bottom: 18px; }
.pt-matrix__toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 14px; }
.pt-matrix__search { max-width: 260px; }
.pt-matrix__presets-label { margin-inline-start: auto; font-size: 12.5px; color: var(--pt-text-soft); }
.pt-matrix__summary {
    margin-bottom: 14px;
    padding: 8px 12px;
    border: 1px solid rgba(100, 116, 139, .22);
    border-radius: 10px;
    font-size: 13px;
    line-height: 1.6;
    color: var(--pt-text);
}
.pt-matrix__summary .is-added { color: #1f7a4d; }
.pt-matrix__summary .is-removed { color: #b42318; }
.pt-matrix__tab { margin-bottom: 18px; }
.pt-matrix__tab-title {
    margin: 0 0 6px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--pt-text-soft);
}
.pt-matrix__table { margin: 0; }
.pt-matrix__table th,
.pt-matrix__table td { vertical-align: middle; font-size: 13px; }
.pt-matrix__table thead th {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    white-space: nowrap;
    color: var(--pt-text-soft);
}
.pt-matrix__label { min-width: 180px; font-weight: 500; color: var(--pt-text); text-align: start; }
.pt-matrix__col { display: inline-flex; align-items: center; gap: 6px; margin: 0; cursor: pointer; }
.pt-matrix__col > span { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
.pt-matrix-cell,
.pt-matrix-column { width: 16px; height: 16px; cursor: pointer; accent-color: var(--pt-accent-600); }
.pt-matrix-cell:disabled,
.pt-matrix-column:disabled { cursor: not-allowed; opacity: .5; }
.pt-matrix-cell:focus-visible,
.pt-matrix-column:focus-visible { outline: 2px solid var(--pt-accent-600); outline-offset: 2px; }
.pt-matrix__lock { margin-inline-start: 4px; font-size: 11px; color: var(--pt-text-soft); }
.pt-matrix-preset { min-width: 120px; }
.pt-matrix__empty { padding: 12px 0; font-size: 13px; color: var(--pt-text-soft); }
.pt-perm-advanced { margin-top: 8px; }
.pt-perm-advanced > summary { padding: 6px 0; font-size: 13px; font-weight: 600; color: var(--pt-text-soft); cursor: pointer; }
.pt-perm-advanced[open] > summary { margin-bottom: 10px; }

/* ---- legacy error banner inside the tree ---- */
.pt-perm-tree ~ .webSectionError,
#adminMenuPermission .webSectionError { margin-bottom: 12px; }

/* ---- responsive: stack on small screens (index two-col not used here) ---- */
@media (max-width: 720px) {
    .pt-perm-group__body { padding-inline-start: 24px; }
}

/* =====================================================================
   §44 — USER ACTIVITY LOGS (TriangleCMS "Dashboard" look & feel)
   KPI cards, dashboard-style portlet heads, and the recent-activity list
   (icon disc + who/description + time). Charts/datatable keep their ids;
   only the surrounding chrome is restyled.
   ===================================================================== */

/* ---- page description (under the subheader title) ---- */
.pt-dash-desc {
    margin: 0 0 var(--sp-4);
    font-size: 14px;
    color: var(--pt-text-muted);
    max-width: 620px;
    line-height: 1.5;
}

/* ---- KPI cards (design .kpi) ---- */
.pt-kpi {
    background: var(--pt-surface);
    border: 1px solid var(--pt-border);
    border-radius: var(--r-lg);
    box-shadow: var(--shadow-sm);
    padding: 20px;
    display: flex;
    flex-direction: column;
    gap: 14px;
    height: 100%;
    margin-bottom: var(--sp-4);
}
.pt-kpi__top {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
}
.pt-kpi__ico {
    width: 38px;
    height: 38px;
    border-radius: 10px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 17px;
}
.pt-kpi__ico--red   { background: var(--pt-accent-soft);  color: var(--pt-accent); }
.pt-kpi__ico--blue  { background: var(--pt-info-soft);    color: var(--pt-info); }
.pt-kpi__ico--green { background: var(--pt-success-soft); color: var(--pt-success); }
.pt-kpi__ico--amber { background: var(--pt-warning-soft); color: var(--pt-warning); }
.pt-kpi__val {
    font-size: 30px;
    font-weight: 800;
    letter-spacing: -.02em;
    line-height: 1;
    color: var(--pt-text);
}
.pt-kpi__lbl {
    font-size: 12.5px;
    color: var(--pt-text-muted);
    font-weight: 500;
    margin-top: 5px;
}

/* ---- dashboard-style portlet head subtitle (under the title) ---- */
.pt-portlet-sub {
    font-size: 12px;
    color: var(--pt-text-soft);
    margin-top: 2px;
    font-weight: 400;
}
.kt-portlet__head-title .pt-portlet-sub { display: block; }

/* ---- recent-activity list (design Recent activity) ---- */
.pt-activity-list { padding: 4px 0; }
.pt-activity-row {
    display: flex;
    align-items: flex-start;
    gap: 13px;
    padding: 13px 4px;
    border-bottom: 1px solid var(--pt-border-2);
}
.pt-activity-row:last-child { border-bottom: none; }
.pt-activity-ico {
    width: 34px;
    height: 34px;
    border-radius: 9px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    font-size: 15px;
    margin-top: 1px;
}
.pt-activity-ico--green  { background: var(--pt-success-soft); color: var(--pt-success); }
.pt-activity-ico--amber  { background: var(--pt-warning-soft); color: var(--pt-warning); }
.pt-activity-ico--blue   { background: var(--pt-info-soft);    color: var(--pt-info); }
.pt-activity-ico--violet { background: rgba(122, 90, 224, 0.14); color: var(--pt-violet); }
.pt-activity-ico--red    { background: var(--pt-accent-soft);  color: var(--pt-accent); }
.pt-activity-ico--grey   { background: var(--pt-surface-3);    color: var(--pt-text-muted); }
.pt-activity-body { flex: 1 1 auto; min-width: 0; font-size: 13.5px; line-height: 1.5; }
.pt-activity-who { font-weight: 600; color: var(--pt-text); margin-inline-end: 5px; }
.pt-activity-desc { color: var(--pt-text-muted); }
.pt-activity-meta { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; align-items: center; }
.pt-activity-chip {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 11px;
    font-weight: 600;
    padding: 2px 8px;
    border-radius: 20px;
    background: var(--pt-surface-3);
    color: var(--pt-text-muted);
}
.pt-activity-chip i { font-size: .65rem; }
.pt-activity-ip { font-size: 11.5px; color: var(--pt-text-soft); display: inline-flex; align-items: center; gap: 5px; }
.pt-activity-side { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; flex: 0 0 auto; }
.pt-activity-time { font-size: 12px; color: var(--pt-text-soft); white-space: nowrap; }
.pt-activity-details {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    height: 28px;
    padding: 0 11px;
    border-radius: 7px;
    border: 1px solid var(--pt-border-strong);
    background: var(--pt-surface);
    color: var(--pt-text-muted);
    font-size: 12px;
    font-weight: 600;
    cursor: pointer;
    transition: background .14s var(--ease-out), color .14s var(--ease-out);
}
.pt-activity-details:hover { background: var(--pt-surface-3); color: var(--pt-text); }
.pt-activity-empty { padding: 24px 4px; color: var(--pt-text-soft); font-size: 13.5px; text-align: center; }
@media (max-width: 600px) {
    .pt-activity-row { flex-wrap: wrap; }
    .pt-activity-side { flex-direction: row; width: 100%; justify-content: space-between; margin-inline-start: 47px; }
}

/* =====================================================================
   §45 — FIXES: activity-details modal overflow + datatable per-page box
   ===================================================================== */

/* (1) Activity Details modal: long descriptions / change values overflowed the
   modal width because the "Basic Information" table had no fixed layout or
   wrapping. Force every table in the modal body to stay within width and wrap. */
#activityDetailsContent { overflow-x: hidden; }
#activityDetailsContent table {
    width: 100% !important;
    max-width: 100% !important;
    table-layout: fixed;
}
#activityDetailsContent th,
#activityDetailsContent td {
    overflow-wrap: anywhere;
    word-break: break-word;
    white-space: normal !important;
    vertical-align: top;
}
#activityDetailsContent th:first-child,
#activityDetailsContent td:first-child { width: 130px; }
#activityDetailsContent pre {
    white-space: pre-wrap;
    word-break: break-word;
    overflow-wrap: anywhere;
}

/* (2) Datatable per-page select: bootstrap-select sized the button so tight the
   selected value cropped. Widen + shrink the font + keep the value vertically
   centered (its .filter-option is position:absolute, so Metronic's padding — not
   flex — centers it; we re-center it explicitly) so the box lines up with the
   "Showing … records" detail. Matches the §pager-size prefix + appended last → wins. */
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info {
    display: flex !important;
    align-items: center !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-detail {
    display: inline-flex !important;
    align-items: center !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size {
    min-width: 74px !important;
    width: auto !important;
    display: inline-flex !important;
    align-items: center !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle {
    min-width: 74px !important;
    width: auto !important;
    height: 32px !important; /* px-locked, matches the 32px pager controls */
    padding: 0 30px 0 12px !important;
    font-size: 0.78rem !important;
}
/* .filter-option is absolutely positioned (inset 0) — flex-center its value within the box */
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .filter-option {
    display: flex !important;
    align-items: center !important;
    padding: 0 30px 0 12px !important;
}
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .filter-option-inner,
.kt-datatable.kt-datatable--default > .kt-datatable__pager > .kt-datatable__pager-info .kt-datatable__pager-size .btn.dropdown-toggle .filter-option-inner-inner {
    font-size: 0.78rem !important;
    line-height: 1 !important;
    overflow: visible !important;
    text-overflow: clip !important;
    width: 100% !important;
}

/* =====================================================================
   §46 — FONT NORMALISATION to the TriangleCMS design
   Metronic forces `html,body{font-size:13px; font-family:Poppins}`. The root is
   already corrected to 16px and form fields are px-locked; these rules close the
   remaining gaps: a Poppins leak on the date-range picker and a few widgets whose
   text used 1rem/inherited sizes instead of the design's px sizes.
   Design ref (cms.css): input 13.5px · label 12.5px · hint 11.5px · table 13.5px.
   ===================================================================== */

/* (a) Font-FAMILY leak — .daterangepicker was the one Metronic Poppins selector
   the earlier override list missed (date pickers on blog / forms). */
.daterangepicker, .daterangepicker * { font-family: var(--pt-font) !important; }

/* (b) Datatable BODY cell text → design 13.5px (Metronic set 1rem = 16px, too
   large). Scoped to __body: an unscoped .kt-datatable__cell selector also catches
   the HEAD cells and, being later at equal specificity, silently overrides the
   11px header-title spec in §11. */
.kt-datatable .kt-datatable__body .kt-datatable__cell,
.kt-datatable .kt-datatable__body .kt-datatable__cell > span { font-size: 13.5px !important; }

/* (c) Select2 single/multi rendered value + results → match the input text (13.5px). */
.select2-container--default .select2-selection--single .select2-selection__rendered,
.select2-container--default .select2-selection--multiple .select2-selection__rendered,
.select2-container .select2-selection__choice,
.select2-results__option { font-size: 13.5px !important; }

/* (d) Inherited body text → design 13.5px (Metronic's html,body{font-size:13px}
   makes plain inherited text render a touch small; this nudges it to spec without
   touching the explicit px sizes on inputs/labels/buttons). */
body { font-size: 13.5px; }

/* =======================================================================
   §  adminMenuPermission — menu permissions tree
   ======================================================================= */

/* ---- Tree Layout ---- */
.menu-tree-container { overflow-x: auto; }

.nested-sortable {
    list-style: none;
    padding: 0;
    margin: 0;
}

.tree-root { padding: 4px 0; }

/* Logical properties, not left/*: the tree must indent away from the reading edge,
   so it mirrors under dir="rtl" (Arabic) instead of nesting the wrong way. */
.child-list {
    padding-inline-start: 32px;
    margin-top: 2px;
    border-inline-start: 2px solid var(--pt-border, #e0e6ef);
    margin-inline-start: 18px;
}

.child-list.empty-list {
    min-height: 16px;
    border-inline-start: 2px dashed var(--pt-border, #e0e6ef);
}

/* ---- Node Row ---- */
.tree-node {
    margin: 3px 0;
    position: relative;
}

.node-row {
    display: flex;
    align-items: center;
    background: var(--pt-surface, #fff);
    border: 1px solid var(--pt-border, #e5eaf2);
    border-radius: 6px;
    padding: 7px 10px;
    gap: 6px;
    transition: box-shadow 0.15s, border-color 0.15s;
    cursor: default;
}

.node-row:hover {
    border-color: var(--tri-red, #5d78ff);
    box-shadow: 0 2px 8px rgba(237, 26, 47, 0.10);
}

.tree-node--inactive > .node-row {
    background: var(--pt-surface-2, #f9f9f9);
    opacity: 0.8;
}

/* ---- Drag Handle ---- */
.drag-handle {
    cursor: grab;
    color: var(--pt-text-soft, #b0bec5);
    font-size: 14px;
    flex-shrink: 0;
    padding: 0 2px;
    user-select: none;
}

.drag-handle:active { cursor: grabbing; }

/* ---- Toggle ---- */
.node-toggle {
    cursor: pointer;
    color: var(--pt-text-muted, #90a4ae);
    width: 18px;
    flex-shrink: 0;
    transition: transform 0.2s;
    font-size: 11px;
}

.node-toggle.collapsed .fa-chevron-down { transform: rotate(-90deg); }
.node-toggle.invisible { visibility: hidden; }

/* ---- Icon & Title ---- */
.node-icon {
    width: 20px;
    text-align: center;
    color: var(--tri-red, #5d78ff);
    flex-shrink: 0;
}

.node-title-text {
    flex: 1;
    min-width: 0;
    overflow: hidden;
}

.node-title-text strong {
    font-size: 13px;
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.node-route-name {
    font-size: 10px;
    color: var(--pt-text-muted, #90a4ae);
    font-family: monospace;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    display: block;
}

/* ---- Badges ---- */
.node-badge {
    font-size: 10px;
    flex-shrink: 0;
}

/* ---- Actions ---- */
.node-actions {
    display: flex;
    gap: 5px;
    flex-shrink: 0;
}

.node-actions .btn-xs {
    padding: 0 3px;
    width: 30px;
    height: 30px;
    font-size: 12px;
    line-height: 1;
    border-radius: 4px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.node-actions .btn-xs > i {
    font-size: 13px;
    padding-inline-start: 5px;
}

/* ---- Sortable states ---- */
.sortable-ghost {
    opacity: 0.35;
    background: var(--pt-accent-soft) !important;
    border: 2px dashed var(--tri-red, #5d78ff) !important;
}

.sortable-drag {
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
    background: var(--pt-surface, #fff);
}

.sortable-chosen { background: var(--pt-accent-soft); }

/* ---- Tree toast ---- */
.tree-toast {
    position: fixed;
    bottom: 24px;
    right: 24px;
    z-index: 9999;
    padding: 12px 20px;
    border-radius: 6px;
    font-size: 14px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);
    color: #fff;
    min-width: 220px;
    transition: opacity 0.3s;
}

.tree-toast.toast-success { background: var(--pt-success, #0abb87); }
.tree-toast.toast-danger  { background: var(--tri-red, #fd397a); }
.tree-toast.toast-info    { background: var(--pt-info, #5578eb); }

/* ---- Tree legend ---- */
.tree-legend {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
}

/* ---- Reorder status ---- */
#reorder-status {
    color: var(--pt-text-muted, #90a4ae);
    font-size: 12px;
}

/* ---- pt-switch-row / pt-switch-label (shared by modal switches) ---- */
.pt-switch-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding-top: 4px;
}

.pt-switch-label {
    font-size: 13px;
    color: var(--pt-text-soft, #6c757d);
    min-width: 26px;
}

/* ══════════════════════════════════════════════════════════════════════
   §  Listing drag & drop reordering (kt-datatable)
   ══════════════════════════════════════════════════════════════════════
   A grip column sits at the very start of every reorderable row. There is
   no mode to switch on, so the handle is always visible — it is kept
   narrow and low-contrast so it reads as furniture, not as a control
   competing with the row's own actions. */

/* ⚠️ The width is pinned with !important, on the cell AND on the inner span, for BOTH the <th>
   and the <td> — that is what keeps the header aligned with the body.

   KTDatatable sizes a column by writing an INLINE width onto each cell's inner span
   (Plugin.adjustCellsWidth), and it reaches the header and the body through different paths: body
   cells get the column's declared width via setupCellField(), the header row is built separately by
   setHeadTitle(). When the two disagree, the header cell keeps the computed "share of the table"
   width (~80px) while the body cell is 28px, and every header label from that point on is pushed
   right by the difference. An inline style loses to !important, so pinning both ends removes the
   divergence whatever the plugin decided. */
.kt-datatable__cell[data-field="__reorder"],
.kt-datatable__cell[data-field="__reorder"] > span {
    width: 28px !important;
    min-width: 28px !important;
    max-width: 28px !important;
    padding-inline-start: 6px !important;
    padding-inline-end: 0 !important;
}
.kt-datatable__cell[data-field="__reorder"] > span {
    padding-inline-start: 0 !important;
}
.pt-reorder {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--pt-text-soft, #6c757d);
    opacity: 0.45;
    cursor: grab;
    transition: opacity var(--dur, 0.15s) var(--ease-out, ease), color var(--dur, 0.15s) var(--ease-out, ease);
    /* A drag must never begin as a text selection of the row underneath. */
    user-select: none;
    touch-action: none;
}
.kt-datatable__row:hover .pt-reorder {
    opacity: 1;
}
.pt-reorder:hover {
    opacity: 1;
    color: var(--pt-accent, #5578eb);
}
.pt-reorder:active {
    cursor: grabbing;
}

/* Sorted by something other than Rank: a drop would be erased by the next load, so the handle is
   shown as unavailable. It still answers a click by putting the list back into rank order. */
.pt-reorder--locked {
    cursor: pointer;
    opacity: 0.2;
}
.kt-datatable__row:hover .pt-reorder--locked {
    opacity: 0.45;
}
.pt-reorder--locked:hover {
    opacity: 0.7;
    color: var(--pt-text-soft, #6c757d);
}

/* Rank sits at the end of the row, just before Actions, and is exempt from the responsive
   auto-hide so the column the list is ordered by survives a narrow window. No `width` is declared
   for it — see the __reorder note above for why that desynchronizes the header. */
.kt-datatable__cell[data-field="rank"] {
    white-space: nowrap;
}
.pt-rank {
    font-variant-numeric: tabular-nums;
}

/* Hidden where it does not apply: the grip on a list that cannot be reordered,
   and the rank column on a section that never listed one. */
.kt-datatable__cell.pt-reorder-col--off {
    display: none !important;
}

/* While a drag is being saved the rows must not be clickable — a half-saved
   order plus a navigation away is how a list ends up scrambled. */
.pt-reordering--busy .kt-datatable__body {
    pointer-events: none;
    opacity: 0.6;
}
.pt-reorder-ghost {
    opacity: 0.4;
    background: var(--pt-accent-soft, #e8edfb) !important;
}

/* =====================================================================
   Team context and access screens (Spatie teams plan R8.3, R8.4)
   ===================================================================== */
.pt-team-crumb { display: inline-flex; align-items: center; }
.pt-team-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 2px 10px;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    line-height: 1.6;
    white-space: nowrap;
    color: var(--pt-text);
    background: rgba(100, 116, 139, .14);
}
.pt-access-denied__icon { color: var(--pt-text-soft); }
.pt-access-denied__title { margin-bottom: 8px; font-size: 20px; font-weight: 700; color: var(--pt-text); }
.pt-access-denied__text,
.pt-access-denied__note { margin-bottom: 6px; font-size: 14px; color: var(--pt-text-soft); }
.pt-access-denied__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-top: 22px; }
.pt-access-denied__teams,
.pt-empty-access__teams { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px; margin-top: 18px; font-size: 13px; color: var(--pt-text-soft); }
.pt-empty-access {
    margin: 18px 0 0;
    padding: 16px 18px;
    border: 1px solid rgba(100, 116, 139, .22);
    border-radius: 12px;
    background: transparent;
    color: var(--pt-text);
}
.pt-empty-access__title { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; font-weight: 700; }
.pt-empty-access__text { margin: 0; font-size: 14px; color: var(--pt-text-soft); }
.pt-empty-access__teams { justify-content: flex-start; margin-top: 12px; }

/* Team / tab switcher dropdown (more than 3 entries; team-tab-switchers.blade.php). One compact chip instead of
   pills wrapping the top bar over several rows. */
.pt-switcher { display: flex; align-items: center; position: relative; }
.pt-switcher__trigger {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    max-width: 260px;
    padding: 6px 12px;
    border: 1px solid var(--pt-border);
    border-radius: 999px;
    background: var(--pt-surface);
    color: var(--pt-text);
    font-size: 13px;
    line-height: 1.4;
    white-space: nowrap;
    cursor: pointer;
}
.pt-switcher__trigger:hover { background: var(--pt-surface-hover); }
.pt-switcher__trigger:focus-visible { outline: 2px solid var(--pt-accent); outline-offset: 2px; }
.pt-switcher__label { color: var(--pt-text-muted); font-weight: 500; }
.pt-switcher__value { font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
.pt-switcher__trigger .fa-chevron-down { font-size: 10px; color: var(--pt-text-muted); }
.pt-switcher__menu { min-width: 220px; max-height: 60vh; overflow-y: auto; }
/* Not a .nav-item, so §6f's show/hide fix does not reach it: without this Argon's hide-navbar-dropdown animation
   leaves the closed menu ghosted on the page. */
.navbar-main .pt-switcher .dropdown-menu.pt-menu {
    position: absolute !important;
    inset-block-start: 100% !important;
    inset-block-end: auto !important;
    left: 0 !important;
    right: auto !important;
    transform: none !important;
    display: none !important;
    animation: none !important;
}
.navbar-main .pt-switcher .dropdown-menu.pt-menu.show {
    display: block !important;
    opacity: 1 !important;
    visibility: visible !important;
    pointer-events: auto !important;
}
[dir="rtl"] .navbar-main .pt-switcher .dropdown-menu.pt-menu { left: auto !important; right: 0 !important; }
[dir="rtl"] .pt-switcher.ms-3 { margin-left: 0 !important; margin-right: 1rem !important; }

/* Menu sections tree — per-tab groups and the tab filter (the page lists every tab by default). */
.tree-tab-filter {
    display: flex;
    align-items: center;
}

.tree-tab-group + .tree-tab-group {
    margin-top: 22px;
    padding-top: 18px;
    border-top: 1px solid var(--pt-border, #e9ecef);
}

.tree-tab-group__title {
    margin: 0 0 10px;
    font-size: 13px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--pt-text-muted, #6c757d);
}

/* Menu tab editor — who sees the tab (universal or chosen teams). */
.pt-tab-scope {
    display: flex;
    gap: 18px;
    flex-wrap: wrap;
}

.pt-tab-scope__option {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    margin: 0;
    font-weight: 500;
    cursor: pointer;
}

.pt-tab-scope__option input {
    margin: 0;
}

/* Role editor → "Move users to another role": the select and its button sit on one baseline.
   The form used Bootstrap 4's .form-inline, which BS5 dropped, so the select stretched and the
   button fell out of line with it. */
.pt-move-users { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.pt-move-users .form-control { width: auto; min-width: 18rem; max-width: 100%; margin-bottom: 0; }
.pt-move-users .btn { margin-bottom: 0; }

/* "Move users to another role": who moves, and what the move means, before the picker. */
.pt-move-users__holders { display: flex; flex-wrap: wrap; align-items: center; gap: .375rem; margin-bottom: .75rem; }
.pt-move-users__holders-label { font-size: 12px; color: var(--pt-text-muted, #6b7280); margin-inline-end: .25rem; }
.pt-move-users__holder { display: inline-block; padding: .125rem .5rem; border: 1px solid var(--pt-border, #d8d7dd); border-radius: 999px; font-size: 12px; line-height: 1.8; }
.pt-move-users__holder.is-rest { border-style: dashed; }
.pt-move-users__notes { margin: .75rem 0 0; padding-inline-start: 1.1rem; font-size: 12px; line-height: 1.7; }
.pt-move-users__notes li { margin: 0; }

/* ── Server-rendered list pages (access changes, access review) ──
   They are plain Blade, not KTDatatable, so the toolbar and the pager are matched here rather than inherited: the
   filter reads as the datatable's own control, and pagination/datatable.blade.php reuses the datatable pager markup,
   which the block above already styles. */
.pt-list-toolbar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .5rem; margin-bottom: 1rem; }
.pt-list-toolbar .form-label { font-size: 11px; font-weight: 700; letter-spacing: .02em; text-transform: uppercase; color: var(--pt-text-soft); margin-bottom: .25rem; }
.pt-list-toolbar__field .form-control { width: auto; min-width: 15rem; max-width: 100%; margin-bottom: 0; }
.pt-list-toolbar .btn { margin-bottom: 0; }
.pt-pager { border: 0; background: transparent; margin-top: .5rem; }
.pt-pager > .kt-datatable__pager { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .75rem; padding: 12px 0 0; }
.pt-pager > .kt-datatable__pager > .kt-datatable__pager-nav { display: flex; align-items: center; list-style: none; margin: 0; padding: 0; }
.pt-pager > .kt-datatable__pager > .kt-datatable__pager-nav > li > a { display: inline-block; cursor: pointer; text-decoration: none; }
.pt-pager > .kt-datatable__pager > .kt-datatable__pager-nav > li > a.kt-datatable__pager-link--disabled { opacity: .45; pointer-events: none; }
.pt-pager > .kt-datatable__pager > .kt-datatable__pager-info { display: flex; align-items: center; gap: .5rem; }
/* The page-size control is the dark pill the datatable uses; there it is a bootstrap-select button, here a select. */
.pt-pager > .kt-datatable__pager > .kt-datatable__pager-info .pt-pager__size .form-control {
    height: 32px !important; min-height: 32px !important; width: auto !important; min-width: 4.5rem; padding: 0 1.75rem 0 .75rem !important;
    margin-bottom: 0; font-size: 12.5px !important; font-weight: 600;
    background-color: var(--tri-grey) !important; color: #fff !important; border: 0 !important; border-radius: var(--r-sm) !important;
}
.pt-pager .pt-pager__size .form-control option { background-color: var(--pt-surface); color: var(--pt-text); }

/* Access review: a strip of checks, then only what needs a look. Attention is amber, clear is green, and the note
   lines carry the why/what-to-do so a row never has to be interpreted. */
.pt-review__stamp { font-size: 12px; color: var(--pt-text-soft); white-space: nowrap; }
.pt-review__total { font-size: 13.5px; margin-bottom: .75rem; }
.pt-review__summary { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: 1.5rem; }
.pt-review__tile {
    display: flex; align-items: center; gap: .5rem; min-width: 12rem; flex: 1 1 12rem;
    padding: .625rem .75rem; border: 1px solid var(--pt-border); border-radius: var(--r-sm);
    color: var(--pt-text); text-decoration: none; background: var(--pt-surface);
    transition: border-color var(--dur) var(--ease-out), background-color var(--dur) var(--ease-out);
}
.pt-review__tile:hover { background: var(--pt-surface-hover); color: var(--pt-text); }
.pt-review__tile-count { min-width: 28px; height: 28px; line-height: 28px; text-align: center; border-radius: var(--r-sm); font-size: 13px; font-weight: 700; }
.pt-review__tile-label { font-size: 12.5px; line-height: 1.35; }
.pt-review__tile.is-attention { border-color: #f0c36d; }
.pt-review__tile.is-attention .pt-review__tile-count { background: #fbeccd; color: #8a5a00; }
.pt-review__tile.is-clear .pt-review__tile-count { background: var(--pt-surface-2); color: var(--pt-text-soft); }
.pt-review__section { margin-bottom: 2rem; }
.pt-review__section-title { display: flex; align-items: center; gap: .5rem; font-size: 14px; margin-bottom: .5rem; }
.pt-review__note { font-size: 12.5px; line-height: 1.6; color: var(--pt-text-muted); margin-bottom: .25rem; }
.pt-review__note:last-of-type { margin-bottom: .75rem; }
.pt-review__table thead th { font-size: 11px; font-weight: 700; letter-spacing: .02em; text-transform: uppercase; color: var(--pt-text-soft); }
.pt-review__open a { white-space: nowrap; }
.pt-review__clear { border-top: 1px solid var(--pt-border); padding-top: 1rem; }
.pt-review__clear-list { margin: 0; padding-inline-start: 1.1rem; font-size: 12.5px; color: var(--pt-text-muted); line-height: 1.8; }

/* Turbo Drive navigation progress bar, in the brand accent. */
.turbo-progress-bar { height: 3px; background: var(--pt-accent); box-shadow: 0 0 8px var(--pt-accent-soft-2); }