html, body {
    font-family: "Source Sans Pro", arial, sans-serif;
}

/* ============================================================================
   Application shell (SSR + vanilla JS, no MudBlazor layout dependency)

   Structure (MainLayout.razor):
     .sk-shell
       > aside.app-navigation-drawer   left navigation (full height)
       > .sk-shell__backdrop           mobile overlay backdrop
       > .sk-shell__body
           > header.app-topbar         top bar + hamburger toggle + top menu
           > main.app-main             routed page content

   State is held as classes on <html>, toggled by wwwroot/js/nav-shell.js:
     html.sk-nav-collapsed   desktop: drawer slid out of view
     html.sk-nav-open        mobile: overlay drawer open

   All colors come from the active tenant's --sk-shell-* variables
   (ApplicationStylesComponent.razor); fallbacks keep the shell usable when no
   tenant style component is configured.
   ============================================================================ */

.sk-shell {
    --sk-topbar-height: 56px;
    --sk-drawer-width: 292px;
    display: flex;
    min-height: 100vh;
}

.app-navigation-drawer {
    flex: 0 0 var(--sk-drawer-width);
    width: var(--sk-drawer-width);
    height: 100vh;
    position: sticky;
    top: 0;
    overflow: hidden;
    z-index: 1200;
    background: var(--sk-shell-bg, #0e2a4f);
    box-shadow: var(--sk-shell-drawer-shadow, 18px 0 42px rgba(9, 18, 40, .18));
    transition: margin-left .22s ease, transform .22s ease;
}

.sk-shell__body {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.app-topbar {
    position: sticky;
    top: 0;
    z-index: 1100;
    display: flex;
    align-items: center;
    gap: 8px;
    height: var(--sk-topbar-height);
    padding: 0 16px;
    color: var(--sk-shell-topbar-text, var(--sk-shell-text, #ffffff));
    background: var(--sk-shell-topbar-bg, #0e2a4f);
    box-shadow: var(--sk-shell-topbar-shadow, 0 10px 26px rgba(9, 18, 40, .26));
}

.app-topbar__toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    padding: 0;
    border: 0;
    border-radius: 8px;
    background: transparent;
    color: var(--sk-shell-topbar-text, var(--sk-shell-text, #ffffff));
    cursor: pointer;
    transition: background-color .16s ease, color .16s ease;
}

.app-topbar__toggle:hover {
    background: var(--sk-shell-hover-bg, rgba(255, 255, 255, .08));
    color: var(--sk-shell-accent, #4f93e6);
}

.app-topbar__toggle .sk-icon {
    display: block;
    width: 24px;
    height: 24px;
    fill: currentColor;
}

.app-topbar__spacer {
    flex: 1 1 auto;
}

.app-main {
    flex: 1 1 auto;
    min-width: 0;
}

.app-main__container {
    width: 100%;
    box-sizing: border-box;
    /* Generous horizontal padding mirrors the previous MudMainContent px-16 gutter. */
    padding: 24px 48px;
}

.sk-shell__backdrop {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 1150;
    background: rgba(0, 0, 0, .45);
}

/* Desktop: persistent drawer that can be collapsed by sliding it out of view. */
@media (min-width: 1280px) {
    html.sk-nav-collapsed .app-navigation-drawer {
        margin-left: calc(-1 * var(--sk-drawer-width));
    }
}

/* Tablet / mobile: drawer becomes an overlay, hidden by default. */
@media (max-width: 1279.98px) {
    .app-navigation-drawer {
        position: fixed;
        top: 0;
        left: 0;
        transform: translateX(-100%);
        box-shadow: none;
    }

    html.sk-nav-open .app-navigation-drawer {
        transform: translateX(0);
        box-shadow: var(--sk-shell-drawer-shadow, 18px 0 42px rgba(9, 18, 40, .18));
    }

    html.sk-nav-open .sk-shell__backdrop {
        display: block;
    }

    .app-main__container {
        padding: 16px 44px 16px 16px;
    }
}

/* ============================================================================
   Enhanced-navigation feedback (driven by wwwroot/js/nav-shell.js)

   Enhanced navigation fetches the next page in the background, so a clicked link
   feels unresponsive until the body swaps. These give immediate feedback:
   a top progress bar plus a highlighted, pulsing clicked link.
   ============================================================================ */

/* Top progress bar. It crawls toward 90% while the next page is fetched, then
   jumps to 100% and fades out once enhancedload fires. */
.sk-nav-progress {
    position: fixed;
    top: 0;
    left: 0;
    width: 0;
    height: 3px;
    z-index: 2000;
    opacity: 0;
    background: var(--sk-shell-accent, #4f93e6);
    pointer-events: none;
}

.sk-nav-progress--active {
    opacity: 1;
    width: 90%;
    /* Ease that moves fast at first then slows to a crawl, like a real loader. */
    transition: width 8s cubic-bezier(0.1, 0.7, 0.1, 1);
}

.sk-nav-progress--done {
    opacity: 0;
    width: 100%;
    transition: width .2s ease, opacity .4s ease .15s;
}

/* Immediate state for the clicked navigation link while its page loads.
   Prefixed with .app-navigation-drawer so it reliably beats the scoped
   NavMenu .nav-link rules. */
.app-navigation-drawer .nav-link.is-loading {
    color: var(--sk-shell-text, #fff);
    background: var(--sk-shell-hover-bg, rgba(255, 255, 255, .08));
}

.app-navigation-drawer .nav-link.is-loading .nav-link__icon {
    color: var(--sk-shell-accent, #4f93e6);
    animation: sk-nav-pulse 1s ease-in-out infinite;
}

@keyframes sk-nav-pulse {
    0%, 100% { opacity: 1; }
    50% { opacity: .4; }
}

@media (prefers-reduced-motion: reduce) {
    .sk-nav-progress--active {
        transition: width 12s linear;
    }

    .app-navigation-drawer .nav-link.is-loading .nav-link__icon {
        animation: none;
    }
}

a, .btn-link {
    color: #006bb7;
}

.btn-primary {
    color: #fff;
    background-color: #1b6ec2;
    border-color: #1861ac;
}

.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
    box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}

.content {
    padding-top: 1.1rem;
}

h1:focus {
    outline: none;
}

.valid.modified:not([type=checkbox]) {
    outline: 1px solid #26b050;
}

.invalid {
    outline: 1px solid rgb(220, 53, 69);
}

.validation-message {
    color: rgb(220, 53, 69);
}

.blazor-error-boundary {
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, rgb(220, 53, 69);
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}

.blazor-error-boundary::after {
    content: "An error has occurred."
}


.custom-tab .mud-tab {
    justify-content: left !important;
}

.flex-grow-2 {
    flex-grow: 2;
}


.mud-tabs.mud-tabs-vertical .mud-tabs-panels {
    width: 100%;
    flex: 1 1 auto;
    display: block;
    overflow-x: auto;
    min-width: 0;
}

.mud-tabs-vertical .mud-tooltip-root,
.mud-tabs-vertical .mud-tabs-tabbar-wrapper > .d-inline-block {
    width: auto;
}

.roles-shell {
    /* Vertical space the app shell takes above and below this screen. The role rail's height is capped
       against it so the rail scrolls on its own and the page as a whole does not grow with the role
       count. One variable, so a change to the header/banner chrome is a one-line adjustment. */
    --roles-chrome-offset: 260px;
    --roles-rail-width: 300px;
    border: 1px solid var(--mud-palette-lines-default, #e4e7ec);
    border-radius: var(--mud-default-borderradius, 8px);
    background: var(--mud-palette-surface, #ffffff);
    padding: 24px;
}

.roles-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 24px;
    border-bottom: 1px solid var(--mud-palette-lines-default, #edf0f4);
    padding-bottom: 18px;
}

.roles-title {
    color: var(--mud-palette-text-primary, #182230);
    font-weight: 700;
    letter-spacing: 0;
}

.roles-subtitle {
    color: var(--mud-palette-text-secondary, #667085);
    margin-top: 4px;
}

.roles-not-authorized {
    margin: 24px 0;
}

.roles-layout {
    display: grid;
    grid-template-columns: var(--roles-rail-width) minmax(0, 1fr);
    gap: 24px;
    margin-top: 16px;
}

.roles-rail {
    display: flex;
    flex-direction: column;
    /* min-height: 0 is what actually lets the list child scroll instead of stretching the grid row. */
    min-height: 0;
    max-height: calc(100vh - var(--roles-chrome-offset));
    border-right: 1px solid var(--mud-palette-lines-default, #edf0f4);
    padding-right: 16px;
}

.roles-rail-toolbar {
    position: sticky;
    top: 0;
    z-index: 2;
    display: flex;
    flex-direction: column;
    gap: 8px;
    background: var(--mud-palette-surface, #ffffff);
    padding-bottom: 12px;
}

.roles-rail-list {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
}

.roles-rail-empty {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 6px;
    color: var(--mud-palette-text-secondary, #667085);
    padding: 16px 4px;
}

.roles-group + .roles-group {
    margin-top: 2px;
}

.roles-group-header {
    display: flex;
    align-items: center;
    gap: 6px;
    cursor: pointer;
    border-radius: var(--mud-default-borderradius, 8px);
    color: var(--mud-palette-text-primary, #344054);
    font-size: 0.86rem;
    font-weight: 700;
    letter-spacing: 0.02em;
    padding: 8px 6px;
    text-transform: uppercase;
    user-select: none;
}

.roles-group-header:hover {
    background: var(--mud-palette-action-default-hover, rgba(0, 0, 0, .04));
}

.roles-group-name {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.roles-group-count {
    color: var(--mud-palette-text-secondary, #667085);
    font-size: 0.72rem;
    font-weight: 700;
    white-space: nowrap;
}

.roles-list {
    padding: 0;
}

.roles-list-nested {
    padding-left: 12px;
}

/* The first group carries no top margin: it sits directly under the sticky toolbar. */
.roles-group:first-child .roles-group-header {
    padding-top: 4px;
}

.roles-entry {
    display: grid;
    grid-template-columns: 20px minmax(0, 1fr);
    align-items: center;
    column-gap: 10px;
    row-gap: 4px;
    width: 100%;
    padding: 2px 0;
    color: var(--mud-palette-text-primary, #344054);
}

.roles-entry-global {
    color: var(--mud-palette-primary, #175cd3);
    font-weight: 700;
}

.roles-entry-icon {
    color: currentColor;
}

.roles-entry-name {
    justify-self: start;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 0.94rem;
}

.roles-entry-badge {
    grid-column: 2;
    justify-self: start;
    border: 1px solid var(--mud-palette-primary-lighten, #b2ddff);
    border-radius: 999px;
    background: var(--sk-shell-active-bg, rgba(23, 92, 211, .1));
    color: var(--mud-palette-primary, #175cd3);
    font-size: 0.68rem;
    font-weight: 700;
    line-height: 1;
    padding: 3px 7px;
    text-transform: uppercase;
}

.roles-detail {
    min-width: 0;
    max-height: calc(100vh - var(--roles-chrome-offset));
    overflow-y: auto;
}

.roles-permissions-panel {
    display: flex;
    flex-direction: column;
    gap: 16px;
}

.roles-permissions-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 16px;
    border-bottom: 1px solid var(--mud-palette-lines-default, #edf0f4);
    padding-bottom: 14px;
}

.roles-permissions-title {
    color: var(--mud-palette-text-primary, #182230);
    font-weight: 700;
    letter-spacing: 0;
}

.roles-permissions-subtitle {
    color: var(--mud-palette-text-secondary, #667085);
    margin-top: 2px;
}

.role-workspaces-toolbar {
    margin-bottom: 8px;
}

.role-workspaces-search {
    max-width: 320px;
}

.role-workspaces-list {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    max-height: 360px;
    overflow-y: auto;
    border: 1px solid var(--mud-palette-lines-default, #edf0f4);
    border-radius: 8px;
    padding: 4px 12px;
}

.permission-matrix-wrapper {
    overflow-x: auto;
}

.permission-matrix {
    width: 100%;
    border-collapse: collapse;
}

.permission-matrix th,
.permission-matrix td {
    border-bottom: 1px solid var(--mud-palette-lines-default, #edf0f4);
    padding: 8px 12px;
    text-align: left;
    white-space: nowrap;
}

.permission-matrix-resource-header,
.permission-matrix-action-header {
    color: var(--mud-palette-text-secondary, #667085);
    font-size: 0.78rem;
    font-weight: 700;
    text-transform: uppercase;
}

.permission-matrix-action-header,
.permission-matrix-cell {
    text-align: center;
}

.permission-matrix-header-control {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}

.permission-matrix-resource-cell {
    font-weight: 500;
}

.permission-matrix-na {
    color: var(--mud-palette-text-disabled, #98a2b3);
}

.permission-matrix-additional {
    display: flex;
    flex-direction: column;
    margin-top: 20px;
    border-top: 1px solid var(--mud-palette-lines-default, #edf0f4);
    padding-top: 14px;
}

.permission-matrix-additional-title {
    color: var(--mud-palette-text-secondary, #667085);
    margin-bottom: 4px;
}

@media (max-width: 960px) {
    .roles-shell {
        padding: 16px;
    }

    .roles-header {
        flex-direction: column;
        align-items: stretch;
    }

    /* One column, and the rail drops its height cap: two nested scroll areas on a phone traps the
       user's scroll, so the page scrolls as a single column instead. */
    .roles-layout {
        grid-template-columns: minmax(0, 1fr);
    }

    .roles-rail {
        max-height: none;
        border-right: none;
        border-bottom: 1px solid var(--mud-palette-lines-default, #edf0f4);
        padding-right: 0;
        padding-bottom: 12px;
    }

    .roles-rail-list {
        overflow-y: visible;
    }

    .roles-detail {
        max-height: none;
        overflow-y: visible;
    }

    .roles-permissions-header {
        flex-direction: column;
    }
}
