.bg-layer {
    position: fixed; 
    top: 0;
    left: 0;
    height: 100vh;
    width: 100vw;
    background-size: cover;  
    background-position: center;  
    background-repeat: no-repeat;
    opacity: 0;
    transition: opacity 1s ease-in-out;
    z-index: 0;
}

@media (max-width: 768px) {
    .bg-layer {
        background-attachment: scroll; /* fixes mobile rendering issues */
    }
}

.container-fluid.position-relative {
    position: relative;
    overflow: hidden;
    min-height: 100vh;
} 

.custom-label {
    font-size: 85px; /* your default size */
    margin-top: 65px; /* default for md and below */
    color: #fff;
    /* Floating look */
    text-shadow: 0 6px 18px rgba(0, 0, 0, 1); /* soft drop shadow */
    animation: float 5s ease-in-out infinite alternate; /* gentle drift */
    position: relative;
    z-index: 1;
}

/* XXL override -------------------------------------------------- */
@media (min-width: 1600px) {
    .custom-label {
        font-size: 103px; /* adjust as you like */
        margin-top: 165px;
    }
}

.bg-layer {
    position: fixed;
    top: 0;
    left: 0;
    height: 100vh;
    width: 100vw;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    opacity: 0;
    transition: opacity 1s ease-in-out;
    z-index: 0;
}

@media (max-width: 768px) {
    .bg-layer {
        background-attachment: scroll; /* fixes mobile rendering issues */
    }
}

.container-fluid.position-relative {
    position: relative;
    overflow: hidden;
    min-height: 100vh;
}

.custom-label {
    font-size: 85px; /* your default size */
    margin-top: 65px; /* default for md and below */
    color: #fff;
    /* Floating look */
    text-shadow: 0 6px 18px rgba(0, 0, 0, 1); /* soft drop shadow */
    animation: float 5s ease-in-out infinite alternate; /* gentle drift */
    position: relative;
    z-index: 1;
}

/* XXL override -------------------------------------------------- */
@media (min-width: 1600px) {
    .custom-label {
        font-size: 103px; /* adjust as you like */
        margin-top: 165px;
    }
}

/* .e-sortfilterdiv / .e-filtermenudiv / .e-rhandler aren't icon elements themselves (that's the
   .e-icons span they wrap), so they weren't excluded here — but Syncfusion sizes and positions
   them (and the header row height) using its own theme's font metrics. Forcing Poppins onto them
   changes those metrics enough to stack the sort/filter icons instead of laying them out inline
   and inflate the column header row height. Header label text keeps using Poppins as before. */
.e-control *:not(.e-icons):not(.fa):not(.fas):not(.far):not(.fab):not(.material-symbols-outlined):not(.e-sortfilterdiv):not(.e-filtermenudiv):not(.e-rhandler) {
    font-family: "Poppins", sans-serif !important;
}

/* The theme's .show-hide uses a fixed top:52px tuned for its non-floating .form-group
   layout. Our login field uses Bootstrap's .form-floating instead, whose height differs,
   so that fixed offset doesn't land on center. Override with a percentage-based center
   relative to .form-floating (already position:relative), which tracks the input's actual
   height. */
.form-floating .show-hide {
    top: 50%;
    transform: translateY(-50%);
}

/* Grid header height standardization ----------------------------------
   Syncfusion applies each ejs-grid's rowHeight attribute as an inline
   height on BOTH the header row (tr.e-columnheader) and the body rows,
   so pages that set rowHeight (e.g. 52/56/72, for taller body rows with
   badges/wrapped text) end up with a header that tall too, while pages
   that never set rowHeight keep Syncfusion's default ~34px header.
   BDD/Projects/Projects (no rowHeight set) is the visual standard, so
   pin every grid's header row to that height with !important to beat
   the inline style Syncfusion sets per-grid. Body rows are untouched -
   they keep using each page's own rowHeight. */
.e-grid .e-gridheader .e-columnheader {
    height: 34px !important;
}

.e-grid .e-gridheader .e-headercell,
.e-grid .e-gridheader .e-detailheadercell {
    height: 34px !important;
    vertical-align: middle;
}

/* Column width auto-fit (grid-header-autofit.js) relies on header text
   being allowed to measure at its natural width; keep it single-line
   (no wrap) so the fixed 34px header height above never gets squeezed
   or overflowed once columns are correctly sized. */
.e-grid .e-gridheader .e-headercelldiv {
    white-space: nowrap;
}

/* Header/body/subtext font sizing standardization -----------------------
   Syncfusion's default renders both header and body text at 14px, which
   reads too large. Drop header + body row text to 12px, and shrink any
   secondary/muted "subtext" line inside a row cell (name + detail pattern
   used across grid templates) further to 10px. !important on every rule
   here because column templates (arbitrary HTML rendered via `template:`)
   often hardcode their own font-size - inline style or otherwise - and
   this must win everywhere, not just on plain untemplated cells. The
   `.e-rowcell *` catch-all forces every templated element to 12px by
   default; the more specific .e-rowcell .small/.text-muted (and their
   descendants) selectors below still win over it on specificity, so
   subtext nested inside a template's muted/small wrapper lands at 10px.
   Scoped to .e-rowcell so the subtext rule doesn't affect .text-muted/
   .small usage elsewhere in the app outside of grids. */
.e-grid .e-headercell,
.e-grid .e-headertext {
    font-size: 12px !important;
}

.e-grid .e-rowcell,
.e-grid .e-rowcell * {
    font-size: 12px !important;
}

.e-grid .e-rowcell .small,
.e-grid .e-rowcell small,
.e-grid .e-rowcell .text-muted,
.e-grid .e-rowcell .small *,
.e-grid .e-rowcell small *,
.e-grid .e-rowcell .text-muted * {
    font-size: 10px !important;
}