@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;
}

.brand {
    display: flex;
    align-items: center;
    gap: 12px;
}

.brand-logo {
    width: 56px;
    height: 56px;
    object-fit: contain;
    flex-shrink: 0;
    filter: drop-shadow(0 2px 4px rgba(0,0,0,.12));
}

.brand-text h1 {
    margin: 0;
    font-size: 1.4rem;
    font-weight: 800;
    letter-spacing: .5px;
    line-height: 1.1;
    color: #b71c1c;
}

.brand-text .tagline {
    margin: 2px 0 0;
    font-size: .7rem;
    font-weight: 600;
    letter-spacing: .6px;
    text-transform: uppercase;
    color: #b71c1c;
}

.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: 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-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: 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%;
}


/* 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;
}

