@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');

/* ── Layout theme variables (dark mode support) ───────────────────────── */
:root, [data-bs-theme=light] {
    --app-shell-bg: #f0f0f0;
    --app-content-card-bg: #fff;
    --app-content-card-shadow: 0 1px 12px rgba(0,0,0,0.08), 0 4px 12px rgba(0,0,0,0.06);
    --app-sidebar-border-color: var(--bs-gray-400);
}

[data-bs-theme=dark] {
    --app-shell-bg: #2b3035;
    --app-content-card-bg: var(--bs-body-bg);
    --app-content-card-shadow: 0 1px 12px rgba(0,0,0,0.4), 0 4px 12px rgba(0,0,0,0.3);
    --app-sidebar-border-color: var(--bs-gray-700);
}

.wasm-loading {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
    gap: 16px;
}

/* Full-screen splash shown from the first (prerendered) paint until the WebAssembly
   runtime has booted and the layout has settled. It hides the prerender→interactive
   handoff repaint (DevExpress Drawer, slide-out filter panels, theme/colors) so the
   user sees a spinner instead of a flash. MainLayout removes it once interactive.
   Defined here in the global, render-blocking stylesheet so the overlay itself is
   painted opaque from the very first frame (no flash of the overlay). */
.app-loading-overlay {
    position: fixed;
    inset: 0;
    z-index: 10000;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--app-shell-bg);
}

.loading-spinner {
    width: 48px;
    height: 48px;
    border: 4px solid var(--bs-border-color);
    border-top-color: var(--bs-primary);
    border-radius: 50%;
    animation: spin 1s linear infinite;
}

@keyframes spin {
    to { transform: rotate(360deg); }
}

/* ── Prerender → interactive handoff guard ─────────────────────────────────
   The app prerenders to static HTML on the server, then re-renders when the
   WebAssembly runtime boots. During that handoff the layout settles into its
   final client state (DevExpress Drawer, slide-out panels, etc.). Without this
   guard those elements visibly animate/slide once on first load, producing a
   "violent" flash (e.g. the filter bar sliding open then closed, the home
   welcome text travelling left→right).

   MainLayout adds `preload-no-transitions` to `.app-shell` during prerender and
   the first interactive render, then removes it once the layout has settled, so
   transitions/animations are only ever played in response to real user actions. */
.app-shell.preload-no-transitions,
.app-shell.preload-no-transitions *,
.app-shell.preload-no-transitions *::before,
.app-shell.preload-no-transitions *::after {
    transition: none !important;
    animation: none !important;
}
/* bootstrap grid */
.no-gutters {
    margin-right: 0;
    margin-left: 0;

    > .col,
    > [class*="col-"] {
        padding-right: 0;
        padding-left: 0;
    }
}
/* grid styling*/
.borderless-grid {
    border: none !important;
    background-color: transparent !important;
}

.selectable-grid td {
    cursor: pointer;
}

.even-row {
    background-color: var(--bs-tertiary-bg) !important;
    border-right: none !important;
    border-right-style: none !important;
}

.odd-row {
    background-color: var(--bs-body-bg) !important;
}

.header-row {
    background-color: var(--bs-body-bg) !important;
    border-bottom: none !important;
}

.data-cell {
    border-right: none !important;
    border-top: none !important;
    border-left: none !important;
    border-bottom: 1px solid var(--bs-border-color) !important;
    padding: 0.5rem !important;
}

.header-cell {
    border-right: none !important;
    border-top: none !important;
    border-left: none !important;
    border-bottom: 1px solid var(--bs-border-color) !important;
    padding: 0.5rem !important;
    background-color: var(--bs-body-bg) !important;
    font-size: small !important;
    font-weight: normal !important;
    color: var(--bs-secondary-color) !important;
}

.toolbar-container {
    border: none !important;
}
.group-row {
    border-right: none !important;
    border-top: none !important;
    border-left: none !important;
    border-bottom: 1px solid var(--bs-border-color) !important;
    padding: 0.5rem !important;
    background-color: var(--bs-body-bg) !important;
    font-size: small !important;
    font-weight: bold !important;
    color: var(--bs-emphasis-color) !important;
}

/* Hyperlink Style */
.hyperlink-style {
    color: var(--bs-link-color);
    text-decoration: underline;
    cursor: pointer;
}

.hyperlink-style:hover {
    color: var(--bs-link-hover-color);
}

/* custom tooltip style */
.custom-tooltip {
    position: relative;
    display: inline-block;
    cursor: pointer;
    overflow: visible;
}

.custom-tooltip .tooltip-text {
    visibility: hidden;
    opacity: 0;
    width: 280px;
    background-color: var(--bs-emphasis-color);
    color: var(--bs-body-bg);
    text-align: left;
    border-radius: 6px;
    padding: 10px 12px;
    position: absolute;
    z-index: 10000;
    font-size: 14px;
    line-height: 1.4;
    box-shadow: 0 2px 8px rgba(0,0,0,0.2);
    transition: opacity 0.2s ease-in-out;
}

/* Default position: top */
.custom-tooltip .tooltip-text,
.custom-tooltip.tooltip-top .tooltip-text {
    bottom: 125%;
    left: 50%;
    transform: translateX(-50%);
}

.custom-tooltip .tooltip-text::after,
.custom-tooltip.tooltip-top .tooltip-text::after {
    content: "";
    position: absolute;
    top: 100%;
    left: 50%;
    margin-left: -5px;
    border-width: 5px;
    border-style: solid;
    border-color: var(--bs-emphasis-color) transparent transparent transparent;
}

/* Position: bottom */
.custom-tooltip.tooltip-bottom .tooltip-text {
    top: 125%;
    bottom: auto;
    left: 50%;
    transform: translateX(-50%);
}

.custom-tooltip.tooltip-bottom .tooltip-text::after {
    content: "";
    position: absolute;
    bottom: 100%;
    top: auto;
    left: 50%;
    margin-left: -5px;
    border-width: 5px;
    border-style: solid;
    border-color: transparent transparent var(--bs-emphasis-color) transparent;
}

/* Position: right */
.custom-tooltip.tooltip-right .tooltip-text {
    left: 125%;
    top: 50%;
    bottom: auto;
    transform: translateY(-50%);
}

.custom-tooltip.tooltip-right .tooltip-text::after {
    content: "";
    position: absolute;
    top: 50%;
    right: 100%;
    left: auto;
    margin-top: -5px;
    margin-left: 0;
    border-width: 5px;
    border-style: solid;
    border-color: transparent var(--bs-emphasis-color) transparent transparent;
}

/* Position: left */
.custom-tooltip.tooltip-left .tooltip-text {
    right: 125%;
    left: auto;
    top: 50%;
    bottom: auto;
    transform: translateY(-50%);
}

.custom-tooltip.tooltip-left .tooltip-text::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 100%;
    right: auto;
    margin-top: -5px;
    margin-left: 0;
    border-width: 5px;
    border-style: solid;
    border-color: transparent transparent transparent var(--bs-emphasis-color);
}

.custom-tooltip:hover .tooltip-text {
    visibility: visible;
    opacity: 1;
}

/* Fixed tooltip variant - renders outside of overflow containers */
.custom-tooltip-fixed {
    position: relative;
    display: inline-block;
    cursor: pointer;
}

.custom-tooltip-fixed .tooltip-text-fixed {
    visibility: hidden;
    opacity: 0;
    width: 280px;
    background-color: var(--bs-emphasis-color);
    color: var(--bs-body-bg);
    text-align: left;
    border-radius: 6px;
    padding: 10px 12px;
    position: fixed;
    z-index: 10000;
    font-size: 14px;
    line-height: 1.4;
    box-shadow: 0 2px 8px rgba(0,0,0,0.2);
    transition: opacity 0.2s ease-in-out;
    pointer-events: none;
}

/* Fixed tooltip arrows - default (top) */
.custom-tooltip-fixed .tooltip-text-fixed::after,
.custom-tooltip-fixed.tooltip-top .tooltip-text-fixed::after {
    content: "";
    position: absolute;
    top: 100%;
    left: 50%;
    margin-left: -5px;
    border-width: 5px;
    border-style: solid;
    border-color: var(--bs-emphasis-color) transparent transparent transparent;
}

/* Fixed tooltip arrow - bottom */
.custom-tooltip-fixed.tooltip-bottom .tooltip-text-fixed::after {
    content: "";
    position: absolute;
    bottom: 100%;
    top: auto;
    left: 50%;
    margin-left: -5px;
    border-width: 5px;
    border-style: solid;
    border-color: transparent transparent var(--bs-emphasis-color) transparent;
}

/* Fixed tooltip arrow - right */
.custom-tooltip-fixed.tooltip-right .tooltip-text-fixed::after {
    content: "";
    position: absolute;
    top: 50%;
    right: 100%;
    left: auto;
    margin-top: -5px;
    margin-left: 0;
    border-width: 5px;
    border-style: solid;
    border-color: transparent var(--bs-emphasis-color) transparent transparent;
}

/* Fixed tooltip arrow - left */
.custom-tooltip-fixed.tooltip-left .tooltip-text-fixed::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 100%;
    right: auto;
    margin-top: -5px;
    margin-left: 0;
    border-width: 5px;
    border-style: solid;
    border-color: transparent transparent transparent var(--bs-emphasis-color);
}

.custom-tooltip-fixed:hover .tooltip-text-fixed {
    visibility: visible;
    opacity: 1;
}

/* Fallback class for tooltip overflow in containers */
.tooltip-overflow-visible {
    overflow: visible !important;
}

/* Login Page Styles */
.brand-block {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    height: 100px;
    padding: 0 1.5rem;
    border-bottom: 1px solid #e0e0e0;
    flex-shrink: 0;
}

/* Full logo (mark + text) scaled to fit the brand-block header */
.brand-logo-full {
    display: block;
    width: 100%;
    height: 100%;
    min-width: 0;
    object-fit: contain;
}

.auth-page {
    --brand-red: #e53935;
    --brand-red-deep: #b71c1c;
    --text-muted: #6b7685;

    min-height: 100dvh;
    padding: 16px;
    background: #F0F0F0;
}
.auth-page.center {
    display: grid;
    place-items: center;
}

/* Single white rectangular card */
.auth-card {
    width: 400px;
    max-width: 100%;
    min-height: 600px;
    display: flex;
    flex-direction: column;
    gap: 0;
    position: relative;
    border-radius: 10px;
    padding: 0;
    background: #ffffff;
    border: 1px solid #e0e0e0;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 1px 4px rgba(0, 0, 0, 0.08);
    overflow: visible;
}

/* Remove old texture overlay */
.auth-card::after {
    content: none;
}

/* Form area below brand header */
.auth-card > .form-area {
    flex: 1;
    padding: 1.5rem;
    display: flex;
    flex-direction: column;
    align-items: stretch;
}

@media (max-width: 440px) {
    .auth-card {
        width: 100%;
        min-height: auto;
        border-radius: 0;
    }
}
.login-form-wrapper {
    /* Login form CSS variables - shared across all login-related components */
    --login-radius: 14px;
    --login-max-width: 420px;

    --login-bg: #ffffff;
    --login-bg-alt: #f8f8fb;
    --login-border: #e3e6ec;
    --login-border-strong: #cfd6df;
    --login-shadow: 0 4px 18px -4px rgba(28, 39, 49, 0.18), 0 2px 4px rgba(28, 39, 49, 0.12);

    --login-color: #1f2732;
    --login-color-subtle: #5a6b80;

    /* Red accent palette */
    --login-accent: #e53935;
    --login-accent-hover: #d32f2f;
    --login-accent-active: #b71c1c;

    /* Inputs and focus */
    --login-input-bg: #ffffff;
    --login-input-border: #c5ced8;
    --login-input-border-hover: #aab7c5;
    --login-input-border-focus: var(--login-accent);
    --login-shadow-focus: 0 0 0 3px rgba(229, 57, 53, 0.28);

    /* Validation */
    --login-danger: #d93025;
    --login-danger-bg: #ffecea;

    /* Secondary accent */
    --login-success: #14804a;

    --login-font-stack: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif;
    --login-transition: 120ms cubic-bezier(.4,0,.2,1);

    /* Default contained mode - no page background */
    background: transparent;
    min-height: 0;
    padding: 0;
    display: block;
}

/* Center the card within its parent without affecting the whole page */
.login-form-shell {
    width: 100%;
    max-width: var(--login-max-width);
    background: transparent;
    border: none;
    border-radius: 0;
    box-shadow: none;
    margin: 0 auto;
    position: relative;
    overflow: visible;
    padding: 0 1.5rem 1.5rem;
}

.login-form-shell::before {
    content: none;
}

/* Remove old decorative accent bar */
.login-form-shell::after {
    content: none;
}

/* Login Form Header */
.login-form-header { 
    margin-bottom: 1.75rem; 
    text-align: center; 
    position: relative;
    z-index: 1;
}
.login-form-header h1 {
    font-size: clamp(1.4rem, 2.1vw, 1.9rem);
    line-height: 1.15;
    margin: 0 0 .5rem;
    font-weight: 600;
    letter-spacing: .5px;
}
.login-form-header p { 
    margin: 0; 
    color: var(--login-color-subtle); 
    font-size: .95rem; 
}

/* Login Form Footer */
.login-form-footer {
    margin-top: 1.85rem;
    text-align: center;
    font-size: .8rem;
    color: var(--login-color-subtle);
}
.login-form-footer a {
    color: var(--login-accent);
    font-weight: 600;
    text-decoration: none;
    position: relative;
}
.login-form-footer a::after {
    content: "";
    position: absolute;
    left: 0; bottom: -2px;
    width: 100%; height: 2px;
    background: var(--login-accent);
    transform: scaleX(0);
    transform-origin: left;
    transition: transform var(--login-transition);
}
.login-form-footer a:hover::after,
.login-form-footer a:focus-visible::after { transform: scaleX(1); }

/* Login Form Meta Row */
.login-form-meta-row {
    text-align: center;
    position: relative;
    z-index: 1;
}

/* Password Toggle - shared across login forms */
.pw-toggle {
    position: static;
    background: var(--login-bg-alt, #f8f8fb);
    border: 1px solid var(--login-border, #e3e6ec);
    padding: .45rem .65rem;
    border-radius: 8px;
    font-size: .72rem;
    line-height: 1;
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    cursor: pointer;
    white-space: nowrap;
    transition: background-color var(--login-transition, 120ms cubic-bezier(.4,0,.2,1)), 
                border-color var(--login-transition, 120ms cubic-bezier(.4,0,.2,1)), 
                color var(--login-transition, 120ms cubic-bezier(.4,0,.2,1));
}
.pw-toggle:hover {
    background: color-mix(in srgb, var(--login-bg-alt, #f8f8fb) 86%, var(--login-accent, #e53935) 14%);
    border-color: var(--login-border-strong, #cfd6df);
}

/* Icons */

.mdi--pencil {
    display: inline-block;
    width: 1.5rem;
    height: 1.5rem;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--content-copy {
    display: inline-block;
    width: 1.5rem;
    height: 1.5rem;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.ix--copy-filled {
    display: inline-block;
    width: 1.5em;
    height: 1.5em;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='black' fill-rule='evenodd' d='M85.334 384V42.667h255.999v42.666H128V384zm341.333-256h-256v341.333h256z' clip-rule='evenodd'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}


.mdi--logout {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='m17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5M4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--layers {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='m12 16l7.36-5.73L21 9l-9-7l-9 7l1.63 1.27M12 18.54l-7.38-5.73L3 14.07l9 7l9-7l-1.63-1.27z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--settings {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M12 15.5A3.5 3.5 0 0 1 8.5 12A3.5 3.5 0 0 1 12 8.5a3.5 3.5 0 0 1 3.5 3.5a3.5 3.5 0 0 1-3.5 3.5m7.43-2.53c.04-.32.07-.64.07-.97s-.03-.66-.07-1l2.11-1.63c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.31-.61-.22l-2.49 1c-.52-.39-1.06-.73-1.69-.98l-.37-2.65A.506.506 0 0 0 14 2h-4c-.25 0-.46.18-.5.42l-.37 2.65c-.63.25-1.17.59-1.69.98l-2.49-1c-.22-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64L4.57 11c-.04.34-.07.67-.07 1s.03.65.07.97l-2.11 1.66c-.19.15-.25.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1.01c.52.4 1.06.74 1.69.99l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.63-.26 1.17-.59 1.69-.99l2.49 1.01c.22.08.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--user-add {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M15 14c-2.67 0-8 1.33-8 4v2h16v-2c0-2.67-5.33-4-8-4m-9-4V7H4v3H1v2h3v3h2v-3h3v-2m6 2a4 4 0 0 0 4-4a4 4 0 0 0-4-4a4 4 0 0 0-4 4a4 4 0 0 0 4 4'/%3E%3C/svg%3E");
    /*background-color: var(--bs-primary);*/ background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}
.mdi--keyboard-return {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M19 7v4H5.83l3.58-3.59L8 6l-6 6l6 6l1.41-1.42L5.83 13H21V7z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}
.mdi--information-outline {
    display: inline-block;
    width: 24px;
    height: 24px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M11 9h2V7h-2m1 13c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10a10 10 0 0 0 10-10A10 10 0 0 0 12 2m-1 15h2v-6h-2z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--email-resend-outline {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M3 4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10.5a6.5 6.5 0 0 1-.5-2H3V8l8 5l8-5v3a7 7 0 0 1 .5 0a6.5 6.5 0 0 1 1.5.18V6c0-1.1-.9-2-2-2zm0 2h16l-8 5zm16 6l-2.25 2.25L19 16.5V15a2.5 2.5 0 0 1 2.5 2.5c0 .4-.09.78-.26 1.12l1.09 1.09c.42-.63.67-1.39.67-2.21c0-2.21-1.79-4-4-4zm-3.33 3.29c-.42.63-.67 1.39-.67 2.21c0 2.21 1.79 4 4 4V23l2.25-2.25L19 18.5V20a2.5 2.5 0 0 1-2.5-2.5c0-.4.09-.78.26-1.12z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--email-resend {
    display: inline-block;
    width: 24px;
    height: 24px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M3 4c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h10.5a6.5 6.5 0 0 1-.5-2.5a6.5 6.5 0 0 1 6.5-6.5a6.5 6.5 0 0 1 1.5.18V6a2 2 0 0 0-2-2zm0 2l8 5l8-5v2l-8 5l-8-5zm16 6l-2.25 2.25L19 16.5V15a2.5 2.5 0 0 1 2.5 2.5c0 .4-.09.78-.26 1.12l1.09 1.09c.42-.63.67-1.39.67-2.21c0-2.21-1.79-4-4-4zm-3.33 3.29c-.42.63-.67 1.39-.67 2.21c0 2.21 1.79 4 4 4V23l2.25-2.25L19 18.5V20a2.5 2.5 0 0 1-2.5-2.5c0-.4.09-.78.26-1.12z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}
.mdi--delete-forever-outline {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M14.12 10.47L12 12.59l-2.13-2.12l-1.41 1.41L10.59 14l-2.12 2.12l1.41 1.41L12 15.41l2.12 2.12l1.41-1.41L13.41 14l2.12-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4zM6 19a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7H6zM8 9h8v10H8z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--delete {
    display: inline-block;
    width: 24px;
    height: 24px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M19 4h-3.5l-1-1h-5l-1 1H5v2h14M6 19a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7H6z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--delete-forever {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M6 19a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7H6zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12l1.41 1.41L13.41 14l2.12 2.12l-1.41 1.41L12 15.41l-2.12 2.12l-1.41-1.41L10.59 14zM15.5 4l-1-1h-5l-1 1H5v2h14V4z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}
.mdi--restore {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M13 3a9 9 0 0 0-9 9H1l3.89 3.89l.07.14L9 12H6a7 7 0 0 1 7-7a7 7 0 0 1 7 7a7 7 0 0 1-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42A8.9 8.9 0 0 0 13 21a9 9 0 0 0 9-9a9 9 0 0 0-9-9'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.ion--arrow-undo-circle-sharp {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='%23000' d='M256 48C141.13 48 48 141.13 48 256s93.13 208 208 208s208-93.13 208-208S370.87 48 256 48m-9.17 241.14V344L146 248l100.83-96v54.86c96.5 0 119.17 69 119.17 137.14c-27.85-35.57-52.48-54.86-119.17-54.86'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--edit {
    display: inline-block;
    width: 20px;
    height: 20px;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='black' d='M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83l3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--dots-vertical {
    display: inline-block;
    width: 1.25em;
    height: 1.5em;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='black' d='M12 16a2 2 0 0 1 2 2a2 2 0 0 1-2 2a2 2 0 0 1-2-2a2 2 0 0 1 2-2m0-6a2 2 0 0 1 2 2a2 2 0 0 1-2 2a2 2 0 0 1-2-2a2 2 0 0 1 2-2m0-6a2 2 0 0 1 2 2a2 2 0 0 1-2 2a2 2 0 0 1-2-2a2 2 0 0 1 2-2'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--cellphone {
    display: inline-block;
    width: 1.25em;
    height: 1.5em;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='black' d='M17 19H7V5h10m0-4H7c-1.11 0-2 .89-2 2v18a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2'/%3E%3C/svg%3E");
    background-color: var(--bs-primary);
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--cellphone-plus {
    display: inline-block;
    width: 1.25em;
    height: 1.5em;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='black' d='M16 1H6a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-7h-2v5H6V5h10v3h2V3a2 2 0 0 0-2-2m5 6h-2v3h-3v2h3v3h2v-3h3v-2h-3z'/%3E%3C/svg%3E");
    background-color: var(--bs-primary);
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}


/* Shared Utility Classes */
.text-muted {
    color: var(--bs-secondary-color);
}

.loading-container {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 3rem 1rem;
    gap: 1rem;
}

.loading-container p {
    margin: 0;
    color: var(--bs-secondary-color);
}

.success-icon {
    width: 64px;
    height: 64px;
    background: var(--bs-success-bg-subtle);
    color: var(--bs-success-text-emphasis);
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2rem;
    font-weight: bold;
    margin: 0 auto 1rem;
}

.error-icon {
    width: 64px;
    height: 64px;
    background: var(--bs-danger-bg-subtle);
    color: var(--bs-danger-text-emphasis);
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 2rem;
    font-weight: bold;
    margin: 0 auto 1rem;
}

/* Shared Button Styles */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.75rem 1.5rem;
    font-size: 0.95rem;
    font-weight: 500;
    border: none;
    border-radius: 8px;
    cursor: pointer;
    text-decoration: none;
    transition: all 0.2s;
}

.btn:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

.btn-primary {
    background: var(--bs-primary);
    color: var(--bs-primary-contrast, #fff);
}

.btn-primary:hover:not(:disabled) {
    filter: brightness(0.85);
}

.btn-secondary {
    background: var(--bs-secondary-bg);
    color: var(--bs-body-color);
    border: 1px solid var(--bs-border-color);
}

.btn-secondary:hover:not(:disabled) {
    background: var(--bs-tertiary-bg);
}

.btn-danger {
    background: var(--bs-danger);
    color: #fff;
}

.btn-danger:hover:not(:disabled) {
    filter: brightness(0.85);
}

.btn-ghost {
    background: transparent;
    color: var(--bs-primary);
    border: none;
}

.btn-ghost:hover:not(:disabled) {
    background: var(--bs-tertiary-bg);
}

.btn-sm {
    padding: 0.5rem 0.75rem;
    font-size: 0.8rem;
}

.button-group {
    display: flex;
    gap: 1rem;
    justify-content: center;
    margin-top: 1.5rem;
    flex-wrap: wrap;
}

/* styles for a button that consists of an icon and text with no border */
.btn-icon-text {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;              /* space between icon and text */
    padding: 0.25rem 0.5rem;   /* adjust as needed */
    background-color: transparent;
    border: none;              /* or use a border if you want */
    color: var(--bs-link-color); /* lightens for dark mode if necessary*/
    cursor: pointer;
    font: inherit;
    font-size: small
}

/* Use Bootstrap primary color for the SVG */
.btn-icon-text .btn-icon {
    width: 1em;
    height: 1em;
    /*fill: var(--bs-primary);   !* uses Bootstrap theme primary color *!*/
    /*stroke: var(--bs-primary);*/
    fill: currentColor;
    stroke: currentColor;
    flex-shrink: 0;
}

/* Hover state */
.btn-icon-text:hover {
    background-color: rgba(var(--bs-emphasis-color-rgb), 0.04); /* subtle hover background */
}

/* Optional: darken icon/text a bit on hover */
.btn-icon-text:hover .btn-icon {
    filter: brightness(0.9);
}

.btn-icon-text:hover .btn-label {
    /*color: var(--bs-body-color);*/
    color: inherit;
}

/* Active (click) state */
.btn-icon-text:active {
    background-color: rgba(var(--bs-emphasis-color-rgb), 0.08);
    transform: translateY(1px);
}

/* Focus-visible outline for accessibility */
.btn-icon-text:focus-visible {
    outline: 2px solid var(--bs-primary);
    outline-offset: 2px;
}

/* Disabled state */
.btn-icon-text:disabled {
    color: var(--bs-secondary-color);
    cursor: not-allowed;
    opacity: 0.55;
}

.btn-icon-text:disabled:hover {
    background-color: transparent;
}

.btn-icon-text:disabled:hover .btn-icon {
    filter: none;
}

/* styles for a button that is just an icon */

/* Icon-only buttons */
.btn-icon-only {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0.25rem;
    background-color: transparent;
    border: none;
    cursor: pointer;
    border-radius: 4px;
    color: var(--bs-link-color);
    /*border: 1px solid var(--bs-black);*/
}

.btn-icon-only:hover {
    background-color: rgba(var(--bs-emphasis-color-rgb), 0.08);
}

.btn-danger-icon {
    color: var(--bs-danger);
}

.btn-danger-icon:hover {
    background-color: rgba(var(--bs-danger-rgb), 0.1);
}
/* Shared Alert Styles */
.alert {
    padding: 1rem;
    border-radius: 8px;
    margin: 1rem 0;
}

.alert-error {
    background: var(--bs-danger-bg-subtle);
    color: var(--bs-danger-text-emphasis);
    border: 1px solid var(--bs-danger-border-subtle);
}

.alert-success {
    background: var(--bs-success-bg-subtle);
    color: var(--bs-success-text-emphasis);
    border: 1px solid var(--bs-success-border-subtle);
}

.alert-warning {
    background: var(--bs-warning-bg-subtle);
    color: var(--bs-warning-text-emphasis);
    border: 1px solid var(--bs-warning-border-subtle);
}

.alert-warning p {
    margin: 0.5rem 0 0;
}

/* Shared Card Styles */
.card {
    background: var(--bs-body-bg);
    border: 1px solid var(--bs-border-color);
    border-radius: 18px;
    box-shadow: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 1px rgba(16, 24, 40, 0.04);
    padding: 24px;
}

.card-header {
    padding: 2rem 2rem 1rem;
    border-bottom: 1px solid var(--bs-border-color);
}

.card-header h1 {
    margin: 0 0 0.5rem;
    font-size: 1.5rem;
    font-weight: 600;
}

.card-footer {
    padding: 1.5rem 2rem;
    border-top: 1px solid var(--bs-border-color);
    background: var(--bs-secondary-bg);
}

/* Shared Form Validation Styles */
.input-validation-error {
    color: var(--bs-danger);
    font-size: 0.85rem;
    margin-top: 0.5rem;
    display: block;
}

/* Shared Spinner Animation */
.spinner {
    width: 40px;
    height: 40px;
    border: 3px solid var(--bs-border-color);
    border-top-color: var(--bs-primary);
    border-radius: 50%;
    animation: spin 1s linear infinite;
}

.spinner-small {
    width: 16px;
    height: 16px;
    border: 2px solid rgba(255, 255, 255, 0.3);
    border-top-color: #fff;
    border-radius: 50%;
    animation: spin 1s linear infinite;
    display: inline-block;
    margin-right: 0.5rem;
}

/*!* override devexpress tab component to be compatible with customization *!*/
/*.dxbl-tabs>.dxbl-tabs-tablist>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled).dxbl-active, .dxbl-tabs>.dxbl-tabs-tablist>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled).dxbl-active {*/
/*    background-color: var(--bs-primary) !important;*/
/*    color: var(--bs-white) !important;*/
/*}*/

/* override devexpress tab component to be compatible with customization */
.dxbl-tabs>.dxbl-tabs-tablist>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled).dxbl-active,
.dxbl-tabs>.dxbl-tabs-tablist>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled).dxbl-active {
    /*background-color: rgba(var(--bs-primary) / 50%) !important;*/
    /*background: var(--bs-primary-bg-subtle) !important;*/
    background: var(--app-shell-bg) !important;
    /*border-color: var(--bs-primary) !important;*/
    color: var(--bs-body-color) !important;
    /*color: var(--bs-primary-contrast, #fff) !important;*/
}

/* Inactive tab text: use body color in light mode, lighter color in dark mode */
.dxbl-tabs>.dxbl-tabs-tablist>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled):not(.dxbl-active),
.dxbl-tabs>.dxbl-tabs-tablist>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled):not(.dxbl-active) {
    color: var(--bs-body-color) !important;
}

/* Hover state for inactive tabs */
.dxbl-tabs>.dxbl-tabs-tablist>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled):not(.dxbl-active):hover,
.dxbl-tabs>.dxbl-tabs-tablist>ul>li>.dxbl-tabs-item:not(.dxbl-tabs-tmpl):not(.dxbl-disabled):not(:disabled):not(.dxbl-active):hover {
    background-color: rgba(var(--bs-primary-rgb), 0.1) !important;
    color: var(--bs-body-color) !important;
}

/*Override DxListBox Colors*/
.dxbl-list-box-render-container>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li.dxbl-list-box-item-selected:not(.dxbl-list-box-item-disabled)::before, .dxbl-list-box>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li.dxbl-list-box-item-selected:not(.dxbl-list-box-item-disabled)::before {
    background-color: var(--bs-primary-bg-subtle) !important;
}

.dxbl-list-box-render-container>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li.dxbl-list-box-item-selected:not(.dxbl-list-box-item-disabled), .dxbl-list-box>.dxbl-scroll-viewer>.dxbl-scroll-viewer-content>ul>li.dxbl-list-box-item-selected:not(.dxbl-list-box-item-disabled) {
    color: var(--bs-body-color) !important;
}
/* Override btn-outline-primary for dark mode readability with dark primary colors */
.btn-outline-primary {
    color: var(--bs-link-color) !important;
    border-color: var(--bs-link-color) !important;
}

.btn-outline-primary:hover {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast, #fff) !important;
    border-color: var(--bs-primary) !important;
}

.btn-outline-primary:focus-visible {
    outline: 2px solid var(--bs-link-color) !important;
    outline-offset: 2px !important;
}

.btn-outline-primary:active,
.btn-outline-primary.active {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast, #fff) !important;
    border-color: var(--bs-primary) !important;
}

.text-primary-contrast {
    color: var(--bs-primary-contrast, #fff);
}
/*Hide week numbers on dx calendar edit*/
.dxbl-calendar .dxbl-calendar-content .dxbl-calendar-week-number {
    visibility: hidden !important;
}
/*override popup header colors*/
.dxbl-modal>.dxbl-modal-root>.dxbl-popup>.dxbl-modal-content .dxbl-popup-header>.dxbl-modal-header, .dxbl-modal>.dxbl-modal-root>.dxbl-popup>.dxbl-modal-content>.dxbl-modal-header {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast) !important;
}

/*override devexpress group colors*/
.dxbl-group>.dxbl-group-header {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast, #fff) !important;
}

/* ════════════════════════════════════════════════════════════════════
   EXPANDED PRIMARY COLOR OVERRIDES
   Ensures all Bootstrap + DevExpress components respect the custom
   --bs-primary colour set by PrimaryColorCssGenerator.
   ════════════════════════════════════════════════════════════════════ */

/* ── DevExpress Grid pager active page ──────────────────────────── */
.dxbl-grid .dxbl-navigation .dxbl-btn.dxbl-active {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast, #fff) !important;
    border-color: var(--bs-primary) !important;
}

/* ── DevExpress Grid selection checkbox checked ─────────────────── */
.dxbl-grid .dxbl-checkbox.dxbl-checked .dxbl-checkbox-check-element {
    background-color: var(--bs-primary) !important;
    border-color: var(--bs-primary) !important;
}

/* ── DevExpress Grid sort header indicator ──────────────────────── */
.dxbl-grid .dxbl-grid-sort-indicator {
    color: var(--bs-primary) !important;
}

/* ── DevExpress Editors focus ring ──────────────────────────────── */
.dxbl-input-editor.dxbl-focused {
    border-color: var(--bs-primary) !important;
    box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25) !important;
}

/* ── DevExpress ComboBox / ListBox selected item ────────────────── */
.dxbl-listbox .dxbl-listbox-item.dxbl-active,
.dxbl-dropdown .dxbl-listbox-item.dxbl-active {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast, #fff) !important;
}

/* ── DevExpress ComboBox / ListBox item hover ───────────────────── */
.dxbl-listbox .dxbl-listbox-item:hover:not(.dxbl-active),
.dxbl-dropdown .dxbl-listbox-item:hover:not(.dxbl-active) {
    background-color: rgba(var(--bs-primary-rgb), 0.08) !important;
}

/* ── DevExpress Toolbar active/pressed button ───────────────────── */
.dxbl-toolbar .dxbl-btn.dxbl-active {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast, #fff) !important;
}

/* ── DevExpress TagBox tag pills ────────────────────────────────── */
.dxbl-tag-box .dxbl-tag {
    background-color: rgba(var(--bs-primary-rgb), 0.12);
    color: var(--bs-primary);
    border-color: rgba(var(--bs-primary-rgb), 0.25);
}

/* ── DevExpress Calendar selected date ──────────────────────────── */
.dxbl-calendar .dxbl-calendar-day.dxbl-active {
    background-color: var(--bs-primary) !important;
    color: var(--bs-primary-contrast, #fff) !important;
}

.dxbl-calendar .dxbl-calendar-day.dxbl-today:not(.dxbl-active) {
    color: var(--bs-primary) !important;
    border-color: var(--bs-primary) !important;
}

/* ── DevExpress DateEdit today highlight ────────────────────────── */
.dxbl-calendar .dxbl-calendar-footer .dxbl-btn {
    color: var(--bs-primary) !important;
}

/* ── DevExpress Spinner / SpinEdit focus ────────────────────────── */
.dxbl-spin-edit.dxbl-focused {
    border-color: var(--bs-primary) !important;
    box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25) !important;
}

/* ── DevExpress Checkbox checked ────────────────────────────────── */
.dxbl-checkbox.dxbl-checked .dxbl-checkbox-check-element {
    background-color: var(--bs-primary) !important;
    border-color: var(--bs-primary) !important;
}

/* ── DevExpress Radio button checked ────────────────────────────── */
.dxbl-radio.dxbl-checked .dxbl-radio-check-element::after {
    background-color: var(--bs-primary) !important;
}
.dxbl-radio.dxbl-checked .dxbl-radio-check-element {
    border-color: var(--bs-primary) !important;
}

/* ── DevExpress Switch checked ──────────────────────────────────── */
.dxbl-checkbox.dxbl-switch.dxbl-checked .dxbl-checkbox-check-element {
    background-color: var(--bs-primary) !important;
    border-color: var(--bs-primary) !important;
}

/* ── DevExpress Upload drop zone border ─────────────────────────── */
.dxbl-upload .dxbl-upload-drop-zone.dxbl-dragover {
    border-color: var(--bs-primary) !important;
}

/* ── Bootstrap spinner with primary color ───────────────────────── */
.spinner-border.text-primary {
    color: var(--bs-primary) !important;
}
.spinner-grow.text-primary {
    color: var(--bs-primary) !important;
}

/* ── Bootstrap breadcrumb active colour ─────────────────────────── */
.breadcrumb-item.active {
    color: var(--bs-primary);
}

/* ── Bootstrap form-check focus with primary ────────────────────── */
.form-check-input:checked {
    background-color: var(--bs-primary);
    border-color: var(--bs-primary);
}
.form-check-input:focus {
    border-color: rgba(var(--bs-primary-rgb), 0.5);
    box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
}

/* ── Bootstrap form-control / form-select focus ─────────────────── */
.form-control:focus {
    border-color: rgba(var(--bs-primary-rgb), 0.5);
    box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
}
.form-select:focus {
    border-color: rgba(var(--bs-primary-rgb), 0.5);
    box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
}

/* ── Bootstrap floating label focus colour ──────────────────────── */
.form-floating > .form-control:focus ~ label,
.form-floating > .form-select:focus ~ label {
    color: var(--bs-primary);
}

/* ── Bootstrap carousel indicators ──────────────────────────────── */
.carousel-indicators [data-bs-target] {
    background-color: var(--bs-primary);
}

/* ── Bootstrap page-link active / focus ─────────────────────────── */
.page-link:focus {
    box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), 0.25);
}
.page-item.active .page-link {
    background-color: var(--bs-primary);
    border-color: var(--bs-primary);
    color: var(--bs-primary-contrast, #fff);
}

/* Utility class for mask-based icons inside DevExpress components */
.dx-icon {
    display: inline-block;
    width: 1rem;
    height: 1rem;
    min-width: 1rem;
    min-height: 1rem;
    background-color: var(--bs-primary);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

/* makes error dialog text support multiline \n characters */
.dxbl-message-box-body > span {
    white-space: pre-line;
}

/* ── Dashboard KPI icons (Material Design Icons) ────────────────── */
/* Sized and colored by the component that renders them (e.g. KpiTile). */
.mdi--file-document-plus,
.mdi--autorenew,
.mdi--clipboard-list,
.mdi--currency-usd-circle,
.mdi--percent-circle,
.mdi--account-group,
.mdi--pill,
.mdi--basket,
.mdi--finance,
.mdi--cash-register,
.mdi--file-document,
.mdi--chart-bar {
    display: inline-block;
    width: 1.5rem;
    height: 1.5rem;
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--file-document-plus {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M14 2H6C4.89 2 4 2.89 4 4V20C4 21.11 4.89 22 6 22H13.81C13.28 21.09 13 20.05 13 19C13 18.67 13.03 18.33 13.08 18H6V16H13.81C14.27 15.2 14.91 14.5 15.68 14H6V12H18V13.08C18.33 13.03 18.67 13 19 13S19.67 13.03 20 13.08V8L14 2M13 9V3.5L18.5 9H13M18 15V18H15V20H18V23H20V20H23V18H20V15H18Z'/%3E%3C/svg%3E");
}

.mdi--autorenew {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M12,6V9L16,5L12,1V4A8,8 0 0,0 4,12C4,13.57 4.46,15.03 5.24,16.26L6.7,14.8C6.25,13.97 6,13 6,12A6,6 0 0,1 12,6M18.76,7.74L17.3,9.2C17.74,10.04 18,11 18,12A6,6 0 0,1 12,18V15L8,19L12,23V20A8,8 0 0,0 20,12C20,10.43 19.54,8.97 18.76,7.74Z'/%3E%3C/svg%3E");
}

.mdi--clipboard-list {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M19 3H14.82C14.4 1.84 13.3 1 12 1S9.6 1.84 9.18 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3M7 8H9V12H8V9H7V8M10 17V18H7V17.08L9 15H7V14H9.25C9.66 14 10 14.34 10 14.75C10 14.95 9.92 15.14 9.79 15.27L8.12 17H10M11 4C11 3.45 11.45 3 12 3S13 3.45 13 4 12.55 5 12 5 11 4.55 11 4M17 17H12V15H17V17M17 11H12V9H17V11Z'/%3E%3C/svg%3E");
}

/* A filled circle with the MDI currency-usd glyph cut out of it. */
.mdi--currency-usd-circle {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cmask id='cut'%3E%3Ccircle cx='12' cy='12' r='11' fill='%23fff'/%3E%3Cpath fill='%23000' transform='translate(3.6 3.6) scale(0.7)' d='M7,15H9C9,16.08 10.37,17 12,17C13.63,17 15,16.08 15,15C15,13.9 13.96,13.5 11.76,12.97C9.64,12.44 7,11.78 7,9C7,7.21 8.47,5.69 10.5,5.18V3H13.5V5.18C15.53,5.69 17,7.21 17,9H15C15,7.92 13.63,7 12,7C10.37,7 9,7.92 9,9C9,10.1 10.04,10.5 12.24,11.03C14.36,11.56 17,12.22 17,15C17,16.79 15.53,18.31 13.5,18.82V21H10.5V18.82C8.47,18.31 7,16.79 7,15Z'/%3E%3C/mask%3E%3Ccircle cx='12' cy='12' r='11' fill='%23000' mask='url(%23cut)'/%3E%3C/svg%3E");
}

.mdi--percent-circle {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M8.83 7.05C9.81 7.05 10.6 7.84 10.6 8.83C10.6 9.81 9.81 10.6 8.83 10.6C7.84 10.6 7.05 9.81 7.05 8.83C7.05 7.84 7.84 7.05 8.83 7.05M15.22 17C14.24 17 13.45 16.2 13.45 15.22C13.45 14.24 14.24 13.45 15.22 13.45C16.2 13.45 17 14.24 17 15.22C17 16.2 16.2 17 15.22 17M8.5 17.03L7 15.53L15.53 7L17.03 8.5L8.5 17.03Z'/%3E%3C/svg%3E");
}

.mdi--account-group {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M12,5.5A3.5,3.5 0 0,1 15.5,9A3.5,3.5 0 0,1 12,12.5A3.5,3.5 0 0,1 8.5,9A3.5,3.5 0 0,1 12,5.5M5,8C5.56,8 6.08,8.15 6.53,8.42C6.38,9.85 6.8,11.27 7.66,12.38C7.16,13.34 6.16,14 5,14A3,3 0 0,1 2,11A3,3 0 0,1 5,8M19,8A3,3 0 0,1 22,11A3,3 0 0,1 19,14C17.84,14 16.84,13.34 16.34,12.38C17.2,11.27 17.62,9.85 17.47,8.42C17.92,8.15 18.44,8 19,8M5.5,18.25C5.5,16.18 8.41,14.5 12,14.5C15.59,14.5 18.5,16.18 18.5,18.25V20H5.5V18.25M0,20V18.5C0,17.11 1.89,15.94 4.45,15.6C3.86,16.28 3.5,17.22 3.5,18.25V20H0M24,20H20.5V18.25C20.5,17.22 20.14,16.28 19.55,15.6C22.11,15.94 24,17.11 24,18.5V20Z'/%3E%3C/svg%3E");
}

.mdi--pill {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M4.22,11.29L11.29,4.22C13.64,1.88 17.43,1.88 19.78,4.22C22.12,6.56 22.12,10.36 19.78,12.71L12.71,19.78C10.36,22.12 6.56,22.12 4.22,19.78C1.88,17.43 1.88,13.64 4.22,11.29M5.64,12.71C4.59,13.75 4.24,15.24 4.6,16.57L10.59,10.59L14.83,14.83L18.36,11.29C19.93,9.73 19.93,7.2 18.36,5.64C16.8,4.07 14.27,4.07 12.71,5.64L5.64,12.71Z'/%3E%3C/svg%3E");
}

.mdi--basket {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M5.5,21C4.72,21 4.04,20.55 3.71,19.9V19.9L1.1,10.44L1,10A1,1 0 0,1 2,9H6.58L11.18,2.43C11.36,2.17 11.66,2 12,2C12.34,2 12.65,2.17 12.83,2.44L17.42,9H22A1,1 0 0,1 23,10L22.96,10.29L20.29,19.9C19.96,20.55 19.28,21 18.5,21H5.5M12,4.74L9,9H15L12,4.74M12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17A2,2 0 0,0 14,15A2,2 0 0,0 12,13Z'/%3E%3C/svg%3E");
}

.mdi--finance {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M6,16.5L3,19.44V11H6M11,14.66L9.43,13.32L8,14.64V7H11M16,13L13,16V3H16M18.81,12.81L17,11H22V16L20.21,14.21L13,21.36L9.53,18.34L5.75,22H3L9.47,15.66L13,18.64'/%3E%3C/svg%3E");
}

.mdi--cash-register {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M2,17H22V21H2V17M6.25,7H9V6H6V3H14V6H11V7H17.8C18.8,7 19.8,8 20,9L20.5,16H3.5L4.05,9C4.05,8 5.05,7 6.25,7M13,9V11H18V9H13M6,9V10H8V9H6M9,9V10H11V9H9M6,11V12H8V11H6M9,11V12H11V11H9M6,13V14H8V13H6M9,13V14H11V13H9M7,4V5H13V4H7Z'/%3E%3C/svg%3E");
}

.mdi--file-document {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M13,9H18.5L13,3.5V9M6,2H14L20,8V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V4C4,2.89 4.89,2 6,2M15,18V16H6V18H15M18,14V12H6V14H18Z'/%3E%3C/svg%3E");
}

.mdi--chart-bar {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M22,21H2V3H4V19H6V10H10V19H12V6H16V19H18V14H22V21Z'/%3E%3C/svg%3E");
}

/* ── Dashboard chart style menu ─────────────────────────────────── */
.mdi--dots-horizontal {
    display: inline-block;
    width: 1.25rem;
    height: 1.25rem;
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z'/%3E%3C/svg%3E");
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

/* Chart style icons (the bar style reuses .mdi--chart-bar above). */
.mdi--chart-areaspline,
.mdi--chart-line,
.mdi--chart-bar-stacked {
    display: inline-block;
    width: 1.5rem;
    height: 1.5rem;
    background-color: currentColor;
    -webkit-mask-image: var(--svg);
    mask-image: var(--svg);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: 100% 100%;
    mask-size: 100% 100%;
}

.mdi--chart-areaspline {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M17.45,15.18L22,7.31V19L22,21H2V3H4V15.54L9.5,6L16,9.78L20.24,2.45L21.97,3.45L16.74,12.5L10.23,8.75L4.31,19H6.57L10.96,11.44L17.45,15.18Z'/%3E%3C/svg%3E");
}

.mdi--chart-line {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M16,11.78L20.24,4.45L21.97,5.45L16.74,14.5L10.23,10.75L5.46,19H22V21H2V3H4V17.54L9.5,8L16,11.78Z'/%3E%3C/svg%3E");
}

.mdi--chart-bar-stacked {
    --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M22,21H2V3H4V19H6V17H10V19H12V16H16V19H18V17H22V21M18,14H22V16H18V14M12,6H16V9H12V6M16,15H12V10H16V15M6,10H10V12H6V10M10,16H6V13H10V16Z'/%3E%3C/svg%3E");
}

/* The menu items render in a DevExpress popup outside the dashboard components, so they are styled here.
   The doubled class outranks the KPI-sized icon rules above so every menu icon matches .dx-icon. */
.dx-icon.dashboard-chart-style-icon {
    width: 1rem;
    height: 1rem;
    background-color: var(--bs-primary);
}

/* Marks the panel's current style. DevExpress may put an item's CssClass on the list item or on its button,
   so both are covered; the color variable feeds DevExpress's own drop-down item color. */
.dashboard-chart-style-current,
.dashboard-chart-style-current .dxbl-btn {
    --dxbl-btn-dropdown-btn-color: var(--bs-primary);
    font-weight: 600;
}

