@import '_content/Blazored.Toast/Blazored.Toast.bundle.scp.css';
@import '_content/PSC.Blazor.Components.Chartjs/PSC.Blazor.Components.Chartjs.bundle.scp.css';

/* /Pages/AccessRight/BulkAccessRightEdit.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/AccessRight/BulkAccessRightList.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/ActionItem/ActionItemDetailsPanel.razor.rz.scp.css */
/* CSS Isolation */
[b-5jeo1os8kj] .ActionItemValueEditor {
    max-height: 300px !important;
    min-height: 200px;
}

@media (min-width: 600px) {
    [b-5jeo1os8kj] .monaco-editor-container {
        max-height: 300px !important;
        min-height: 200px;
    }
}
/* /Pages/ActionItem/ActionItemEdit.razor.rz.scp.css */
/* CSS Isolation - styles moved to ActionItemSchedulingPanel.razor.css */
/* /Pages/ActionItem/ActionItemSchedulingPanel.razor.rz.scp.css */
/* CSS Isolation */
[b-llvpjngyd6] .inline-label {
    position: static;
    transform: none;
    font-size: 0.75rem;
    color: var(--mud-palette-text-secondary);
}
/* /Pages/ActionItem/ActionItemTenantEdit.razor.rz.scp.css */
/* CSS Isolation - styles moved to ActionItemSchedulingPanel.razor.css */
/* /Pages/Addon/AddonEditAi.razor.rz.scp.css */
/* Provider logos in the Provider MudSelect dropdown.
   Same onerror toggle as the /admin/aimodels page — if the blob image 404s, the
   img is hidden and the first-letter fallback badge shows in its place. */

.provider-logo-wrap-sm[b-pw6c7x0f5e] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    flex-shrink: 0;
}

.provider-logo-sm[b-pw6c7x0f5e] {
    width: 20px;
    height: 20px;
    object-fit: contain;
    border-radius: 3px;
}

.provider-logo-fallback-sm[b-pw6c7x0f5e] {
    display: none; /* shown by the inline onerror handler if the image 404s */
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    border-radius: 3px;
    background: var(--mud-palette-primary);
    color: white;
    font-weight: 700;
    font-size: 11px;
    text-transform: uppercase;
    font-family: -apple-system, "Segoe UI", Roboto, sans-serif;
}
/* /Pages/Addon/AddonEditServiceNow.razor.rz.scp.css */
body[b-qufowbhrck] {
}
/* /Pages/Addon/Components/ContactSyncAddonPanel.razor.rz.scp.css */
/* Contact Sync Addon Panel Styles */
/* /Pages/Addon/Components/ServiceDeskAddonPanel.razor.rz.scp.css */
/* Service Desk Addon Panel Styles */
/* /Pages/Addon/Dialog/AddonEditInvoicePeriodDialog.razor.rz.scp.css */
.mud-dialog-content[b-5ehez4bh61] {
    max-height: 400px;
    padding-bottom: 10px !important;
}

.mud-dialog-actions[b-5ehez4bh61] {
    position: sticky;
    bottom: 0px;
    padding: 20px 12px !important;
}

.container-lr[b-5ehez4bh61] {
    display: flex;
}

.box-lr[b-5ehez4bh61] {
    display: flex;
    margin: 0;
    padding: 0;
    font-size: 1rem !important;
    align-items: center;
    line-height: 1;
}
/* /Pages/Addon/Edit/AddonEditB2BAPI.razor.rz.scp.css */
.Bullet[b-y6ifuy8jhj] {
    list-style-type: decimal;
    margin-left: 24px;
}
/* /Pages/Admin/AiModels.razor.rz.scp.css */
/* Provider logo styling for the expansion panel headers.
   The inline `onerror` handler on the <img> swaps display:none onto the image
   and display:inline-flex onto its sibling fallback span, so we get a clean
   "image OR icon" toggle without Blazor state or JS interop. */

.provider-logo-wrap[b-0slnq2uizg] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
}

.provider-logo[b-0slnq2uizg] {
    width: 32px;
    height: 32px;
    object-fit: contain;
    border-radius: 4px;
}

.provider-logo-fallback[b-0slnq2uizg] {
    display: none; /* shown by the inline onerror handler if the image 404s */
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 4px;
    background: var(--mud-palette-primary);
    color: white;
    font-weight: 700;
    font-size: 16px;
    text-transform: uppercase;
    font-family: -apple-system, "Segoe UI", Roboto, sans-serif;
}
/* /Pages/Admin/AiModelSummary.razor.rz.scp.css */
/* Provider logo conventions — match /admin/aimodels so the same provider
   reads visually as the same provider across admin pages. */

.provider-logo-wrap[b-p0iplmvokz] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
}

.provider-logo[b-p0iplmvokz] {
    width: 28px;
    height: 28px;
    object-fit: contain;
    border-radius: 4px;
}

.provider-logo-fallback[b-p0iplmvokz] {
    display: none;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 4px;
    background: var(--mud-palette-primary);
    color: white;
    font-weight: 700;
    font-size: 12px;
}
/* /Pages/Agreement/AgreementBillingMethodDialog.razor.rz.scp.css */
.mud-dialog-content[b-zp70q40bbb] {
    max-height: 400px;
    padding-bottom: 10px !important;
}

.mud-dialog-actions[b-zp70q40bbb] {
    position: sticky;
    bottom: 0px;
    padding: 20px 12px !important;
}

.container-lr[b-zp70q40bbb] {
    display: flex;
}

.box-lr[b-zp70q40bbb] {
    display: flex;
    margin: 0;
    padding: 0;
    font-size: 1rem !important;
    align-items: center;
    line-height: 1;
}

.mud-grid-item[b-zp70q40bbb]{
    padding-top: 0 !important;
}

.primary-text[b-zp70q40bbb] {
    color: var(--mud-palette-text-primary) !important;
}

.secondary-text[b-zp70q40bbb] {
    color: var(--mud-palette-text-secondary) !important;
}

.disabled-text[b-zp70q40bbb] {
    color: var(--mud-palette-text-disabled) !important;
}
/* /Pages/Agreement/AgreementBulkUpdate.razor.rz.scp.css */
/* CSS Isolation — placeholder. Page styling driven by MudBlazor classes. */
/* /Pages/Agreement/AgreementEditBillingRulesComponent.razor.rz.scp.css */
.rule-attribute[b-ssfk1e631p] {
    font-size: 0.75rem;
    font-family: monospace;
    letter-spacing: 0.02em;
}

.disabled-rule[b-ssfk1e631p] {
    opacity: 0.55;
}
/* /Pages/Agreement/AgreementInvoicePeriodDialog.razor.rz.scp.css */
.mud-dialog-content[b-r8cgyrar7i] {
    max-height: 400px;
    padding-bottom: 10px !important;
}

.mud-dialog-actions[b-r8cgyrar7i] {
    position: sticky;
    bottom: 0px;
    padding: 20px 12px !important;
}

.container-lr[b-r8cgyrar7i] {
    display: flex;
}

.box-lr[b-r8cgyrar7i] {
    display: flex;
    margin: 0;
    padding: 0;
    font-size: 1rem !important;
    align-items: center;
    line-height: 1;
}
/* /Pages/Agreement/AgreementListItemEditDialog.razor.rz.scp.css */
.mud-dialog-actions[b-p7r3cy85e2] {
    position: sticky;
    bottom: 0px;
    padding: 20px 12px !important;
}

.container-lr[b-p7r3cy85e2] {
    display: flex;
    justify-content: flex-end;
    margin-right: 0;
    padding-right: 0;
}

.box-lr[b-p7r3cy85e2] {
    display: flex;
    margin: 0;
    padding: 0;
    font-size: 1rem !important;
    align-items: center;
    line-height: 1;
}

.custom-switch-container[b-p7r3cy85e2] {
    display: flex;
    align-items: center;
    margin-left: 0;
    padding-left: 0;
}

.custom-switch[b-p7r3cy85e2] {
    margin: 0;
    padding: 0;
}
/* /Pages/Agreement/AgreementPriceSourceDialog.razor.rz.scp.css */
.mud-dialog-content[b-0hdv1209jq] {
    max-height: 400px;
    padding-bottom: 10px !important;
}

.mud-dialog-actions[b-0hdv1209jq] {
    position: sticky;
    bottom: 0px;
    padding: 20px 12px !important;
}
/* /Pages/Agreement/AgreementSubscriptionChartDialog.razor.rz.scp.css */
[b-pl1biolubc] .timeline-panels,
[b-pl1biolubc] .timeline-panels .mud-expand-panel-content {
    padding-left: 0 !important;
    padding-right: 0 !important;
}
/* /Pages/Ai/ChatBot.razor.rz.scp.css */
.ecpbot-sidebar[b-tbpvheki6f] {
    background: transparent;
    height: calc(100vh - 200px);
    overflow-y: auto;
}

.ecpbot-history[b-tbpvheki6f] {
    max-height: calc(100vh - 320px);
    overflow-y: auto;
}

/* Active-conversation highlight is applied via inline Style on the MudListItem
   in ChatBot.razor — CSS isolation doesn't reach MudListItem's rendered root
   because ChatBot.razor's markup has no plain HTML ancestor to anchor the
   scope attribute to. Inline style wins on specificity regardless. */

.ecpbot-transcript[b-tbpvheki6f] {
    background: transparent;
    min-height: 50vh;
    max-height: calc(100vh - 320px);
    overflow-y: auto;
}

/* Header row above the transcript paper — right-aligns the active-provider
   badge so it doesn't overlap the first chat bubble (previously floated as
   position:absolute inside the scrolling paper, which overlapped messages). */
.ecpbot-active-provider-header[b-tbpvheki6f] {
    display: flex;
    justify-content: flex-end;
    margin-bottom: 6px;
}

/* The badge itself — small logo + stacked provider name / model id. */
.ecpbot-active-provider[b-tbpvheki6f] {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 4px 10px;
    border-radius: 6px;
    background: rgba(0, 0, 0, 0.03);
}

.ecpbot-active-provider-logo-wrap[b-tbpvheki6f] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    flex-shrink: 0;
}

.ecpbot-active-provider-logo[b-tbpvheki6f] {
    width: 32px;
    height: 32px;
    object-fit: contain;
    border-radius: 4px;
}

.ecpbot-active-provider-fallback[b-tbpvheki6f] {
    display: none;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 4px;
    background: var(--mud-palette-primary);
    color: white;
    font-weight: 700;
    font-size: 14px;
    text-transform: uppercase;
}

.ecpbot-active-provider-text[b-tbpvheki6f] {
    display: flex;
    flex-direction: column;
    line-height: 1.1;
}

.ecpbot-active-provider-name[b-tbpvheki6f] {
    font-weight: 600;
    color: var(--mud-palette-text-primary);
}

.ecpbot-active-provider-model[b-tbpvheki6f] {
    font-family: 'JetBrains Mono', Consolas, monospace;
    font-size: 0.72rem !important;
    color: var(--mud-palette-text-secondary);
}

.ecpbot-input[b-tbpvheki6f] {
    background: transparent;
}

.ecpbot-empty[b-tbpvheki6f] {
    opacity: 0.7;
    font-style: italic;
}

.ecpbot-bubble-user[b-tbpvheki6f] {
    background: rgba(94, 53, 177, 0.12);
    border-radius: 10px;
    padding: 0.5rem 0.75rem;
    margin: 0.5rem 0;
    margin-left: 20%;
}

.ecpbot-bubble-assistant[b-tbpvheki6f] {
    background: rgba(0, 0, 0, 0.04);
    border-radius: 10px;
    padding: 0.5rem 0.75rem;
    margin: 0.5rem 0;
    margin-right: 20%;
}

.ecpbot-bubble-refusal[b-tbpvheki6f] {
    background: rgba(255, 152, 0, 0.10);
    border: 1px solid rgba(255, 152, 0, 0.35);
    border-radius: 10px;
    padding: 0.5rem 0.75rem 0.5rem 0.5rem;
    margin: 0.5rem 20% 0.5rem 0;
    display: flex;
    gap: 0.5rem;
    align-items: flex-start;
}

.ecpbot-refusal-icon[b-tbpvheki6f] {
    flex-shrink: 0;
    margin-top: 0.1rem;
}

.ecpbot-refusal-body[b-tbpvheki6f] {
    flex-grow: 1;
}

.ecpbot-tool-chips[b-tbpvheki6f] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
    margin-top: 0.35rem;
}

.ecpbot-history-row[b-tbpvheki6f] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.25rem;
    width: 100%;
}

.ecpbot-history-text[b-tbpvheki6f] {
    flex-grow: 1;
    min-width: 0;
    overflow: hidden;
}

.ecpbot-thinking[b-tbpvheki6f] {
    display: flex;
    align-items: center;
}

.ecpbot-meta[b-tbpvheki6f] {
    opacity: 0.6;
    display: block;
    margin-top: 0.25rem;
}

[b-tbpvheki6f] .ecpbot-bubble-assistant pre {
    overflow-x: auto;
    padding: 0.5rem;
    background: rgba(0, 0, 0, 0.05);
    border-radius: 4px;
}

[b-tbpvheki6f] .ecpbot-bubble-assistant table {
    width: 100%;
    border-collapse: collapse;
    margin: 0.5rem 0;
}

[b-tbpvheki6f] .ecpbot-bubble-assistant th,
[b-tbpvheki6f] .ecpbot-bubble-assistant td {
    padding: 0.25rem 0.5rem;
    border: 1px solid rgba(0, 0, 0, 0.1);
    text-align: left;
}
/* /Pages/Alerting/ScheduledReports/BulkScheduledReportAssign.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Alerting/ScheduledReports/EmailTemplatePreview.razor.rz.scp.css */
.template-preview-label[b-7qvmh5z53x] {
    margin-bottom: 4px;
}

.template-preview-status[b-7qvmh5z53x] {
    display: flex;
    align-items: center;
    padding: 12px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
}

/* Window onto a scaled-down render of the email. The iframe is sized 1/scale larger so the
   scaled content still fills the available width. Height is generous because the column has
   the room, and a taller thumbnail reaches past the template header into the report data —
   which is the part worth checking. */
.template-preview-frame[b-7qvmh5z53x] {
    position: relative;
    height: 440px;
    overflow: hidden;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    cursor: pointer;
    background-color: #ffffff;
}

.template-preview-frame:hover[b-7qvmh5z53x] {
    border-color: var(--mud-palette-info);
}

/* Fades the cut-off edge so it reads as a truncated preview rather than a broken render. */
.template-preview-frame[b-7qvmh5z53x]::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 48px;
    background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.95));
    pointer-events: none;
}

.template-preview-frame iframe[b-7qvmh5z53x] {
    /* 200% + scale(0.5) keeps the render full-width at half size — large enough to read
       headings and table structure without opening the dialog. */
    width: 200%;
    height: 880px;
    border: 0;
    transform: scale(0.5);
    transform-origin: top left;
    /* Clicks belong to the wrapper, which opens the full dialog. */
    pointer-events: none;
}
/* /Pages/Alerting/ScheduledReports/ReportFrequencySelector.razor.rz.scp.css */
/* ReportFrequencySelector component-specific styles */
/* CSS isolation file for scoped styling */
/* /Pages/Alerting/ScheduledReports/ScheduledReportBatchList.razor.rz.scp.css */
/* Scoped styles for ScheduledReportBatchList */
/* /Pages/Alerting/ScheduledReports/ScheduledReportEdit.razor.rz.scp.css */
/* ScheduledReportEdit component-specific styles */
/* CSS isolation file for scoped styling */
/* /Pages/Alerting/ScheduledReports/ScheduledReportList.razor.rz.scp.css */
/* ScheduledReportList component-specific styles */
/* CSS isolation file for scoped styling */
/* /Pages/Alerting/ScheduledReports/Wizard/ReportTypeSelectorCard.razor.rz.scp.css */
.report-card[b-uqqhjur9o7] {
    border: 2px solid var(--mud-palette-lines-default);
    transition: border-color 0.15s ease, background-color 0.15s ease;
}

.report-card:hover[b-uqqhjur9o7] {
    border-color: var(--mud-palette-primary);
}

.report-card--selected[b-uqqhjur9o7] {
    border-color: var(--mud-palette-primary);
    background-color: var(--mud-palette-primary-hover);
}

.report-card__description[b-uqqhjur9o7] {
    color: var(--mud-palette-text-secondary);
}
/* /Pages/Alerting/Wizard/AlertTypeSelectorCard.razor.rz.scp.css */
.alert-card[b-euxm473kpg] {
    border: 2px solid var(--mud-palette-lines-default);
    transition: border-color 0.15s ease, background-color 0.15s ease;
}

.alert-card:hover[b-euxm473kpg] {
    border-color: var(--mud-palette-primary);
}

.alert-card--selected[b-euxm473kpg] {
    border-color: var(--mud-palette-primary);
    background-color: var(--mud-palette-primary-hover);
}

.alert-card__description[b-euxm473kpg] {
    color: var(--mud-palette-text-secondary);
}
/* /Pages/AutoProvisionedGroups/AutoProvisionedGroupCatalogPage.razor.rz.scp.css */
/* CSS Isolation */
/* /Pages/Azure/CustomerPermissionPage2.razor.rz.scp.css */
.PermissionStatusLoading[b-hcclpe7sfv] {
    font-size: 0.8rem;
    /*color: var(--mud-palette-info);*/
    text-align: center;
    display: inline-block;
}
/* /Pages/Billing/AgreementSync/AgreementChangeDetailsDialog.razor.rz.scp.css */
.ChangeDetails table[b-zyu0viibft] { border: 1px solid lightgrey }

/*.ChangeDetails .PartOne { width: 100px; }

.ChangeDetails .PartTwo {
    width: 500px;
    text-wrap: normal;
}*/

.ChangeDetails td[b-zyu0viibft],
.ChangeDetails th[b-zyu0viibft] { vertical-align: top; }

.ChangeDetails .Created[b-zyu0viibft] { color: green; }

.ChangeDetails .Updated[b-zyu0viibft] { color: blue; }

.ChangeDetails .Deleted[b-zyu0viibft] { color: purple; }

.ChangeDetails .Error[b-zyu0viibft] { color: red; }

.LineBreak[b-zyu0viibft] {
    flex-basis: 100%;
    height: 0;
}
/* /Pages/Billing/BillingReportAgreementSync.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Billing/BillingRuleGroupEditComponent.razor.rz.scp.css */
.transfer-container[b-tooor6dqx5] {
    display: flex;
    align-items: stretch;
}

.transfer-panel[b-tooor6dqx5] {
    flex: 1;
    min-width: 0;
}

.transfer-shuttle[b-tooor6dqx5] {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    padding: 0 2px;
}

[b-tooor6dqx5] .group-row {
    padding-top: 0;
    padding-bottom: 0;
    padding-left: 0;
    padding-right: 4px;
}

[b-tooor6dqx5] .group-checkbox {
    margin: 0 2px 0 4px;
    padding: 0;
}

[b-tooor6dqx5] .group-list {
    padding-top: 0;
    padding-bottom: 0;
}
/* /Pages/Billing/BillingRuleReviewPage.razor.rz.scp.css */
.raw-section[b-974mv7ircu] {
    padding: 12px 16px;
    margin-bottom: 16px;
    border-radius: var(--mud-default-borderradius);
}

/* Subtle, theme-aware tints + a colored accent so the two raw-data blocks read as distinct cards. */
.raw-section-invoice[b-974mv7ircu] {
    background-color: var(--mud-palette-background-gray);
    border-left: 4px solid var(--mud-palette-info);
}

.raw-section-assignments[b-974mv7ircu] {
    background-color: rgba(var(--mud-palette-primary-rgb), 0.10);
    border-left: 4px solid var(--mud-palette-primary);
}

/* Let the grids sit transparently on the tinted section so the colour reads through. */
.raw-section[b-974mv7ircu]  .mud-table-container,
.raw-section[b-974mv7ircu]  .mud-table-root,
.raw-section[b-974mv7ircu]  .mud-table-toolbar {
    background-color: transparent;
}
/* /Pages/Billing/BillingSubscriptionHistory.razor.rz.scp.css */
[b-ni08iactmg] .timeline-panels,
[b-ni08iactmg] .timeline-panels .mud-expand-panel-content {
    padding-left: 0 !important;
    padding-right: 0 !important;
}
/* /Pages/Billing/DistributorBillingSyncReport.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Boarding/UserProfiles/BoardProfiles.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Boarding/UserProfiles/Edit/GroupAssignments.razor.rz.scp.css */
/* /Pages/Boarding/UserProfiles/Edit/LicenseAssignments.razor.rz.scp.css */
/* /Pages/Boarding/UserProfiles/Edit/RoleAssignments.razor.rz.scp.css */
/* /Pages/Catalogue/CatalogueAdministrationPage.razor.rz.scp.css */
.section-head[b-sek9jtqguc] {
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

.bold[b-sek9jtqguc] {
    font-weight: 600;
}

/* Centres a block/flex child (e.g. MudCheckBox) inside a matrix cell/header —
   text-align alone won't centre the checkbox, which renders as a flex element. */
.hcenter[b-sek9jtqguc] {
    display: flex;
    justify-content: center;
    align-items: center;
}

/* Wordless success feedback beside the availability checkbox — lingers, then
   fades. Keyed per save so the animation replays. Mirrors EcpTenantSelectTree;
   the keyframes name is global (CSS isolation doesn't scope @keyframes), so the
   identical definition in both files is deliberate and harmless. */
[b-sek9jtqguc] .SavedTick {
    animation: ecp-saved-tick-b-sek9jtqguc 1.5s ease 1.2s forwards;
}

@keyframes ecp-saved-tick-b-sek9jtqguc {
    to {
        opacity: 0;
    }
}
/* /Pages/Catalogue/CatalogueBuyPage.razor.rz.scp.css */
.SplitPanels[b-ma61uz4moz] {
    display: flex;
    gap: 16px;
    align-items: flex-start;
}

.LeftPanel[b-ma61uz4moz] {
    flex: 0 0 420px;
    max-height: calc(100vh - 220px);
    overflow-y: auto;
    border-right: 1px solid var(--mud-palette-table-lines);
    padding-right: 8px;
}

.RightPanel[b-ma61uz4moz] {
    flex: 1 1 auto;
    min-width: 0;
}

.ProductList[b-ma61uz4moz] {
    display: flex;
    flex-direction: column;
}

.ProductRow[b-ma61uz4moz] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 8px 12px;
    border-radius: 4px;
    cursor: pointer;
    transition: background-color 120ms ease;
}

.ProductRow:hover[b-ma61uz4moz] {
    background-color: var(--mud-palette-action-default-hover);
}

.ProductRowActive[b-ma61uz4moz] {
    background-color: var(--mud-palette-primary-hover);
}

.ProductRowTitle[b-ma61uz4moz] {
    flex: 1 1 auto;
    font-size: 0.9rem;
    line-height: 1.3;
    word-break: break-word;
}

.ProductGroup[b-ma61uz4moz] {
    background: rgba(128, 128, 128, 0.06);
    border-radius: 4px;
}

.ProductGroupTitle[b-ma61uz4moz] {
    font-weight: 500;
}

.TileGrid[b-ma61uz4moz] {
    display: grid;
    grid-template-columns: repeat(auto-fill, 320px);
    gap: 17px;
    align-items: stretch;
}

/* /Pages/Catalogue/CatalogueDistributorAddDialog.razor.rz.scp.css */
.AddSwatch[b-ng1zj2bnda] {
    width: 32px;
    height: 32px;
    border-radius: 4px;
    border: 1px solid var(--mud-palette-lines-default);
    flex: 0 0 32px;
}

.AddPicker[b-ng1zj2bnda] {
    width: 160px;
    flex: 0 0 160px;
}
.AddPicker[b-ng1zj2bnda]  .mud-picker,
.AddPicker[b-ng1zj2bnda]  .mud-input-control,
.AddPicker[b-ng1zj2bnda]  .mud-input,
.AddPicker[b-ng1zj2bnda]  .mud-input-slot,
.AddPicker[b-ng1zj2bnda]  input {
    width: 100%;
    min-width: 0;
    max-width: 100%;
    box-sizing: border-box;
}
/* /Pages/Catalogue/CatalogueDistributorDeleteDialog.razor.rz.scp.css */
.ReferenceList[b-amqqodfxhs] {
    margin: 0;
    padding-left: 20px;
}
.ReferenceList li[b-amqqodfxhs] {
    line-height: 1.6;
}
/* /Pages/Catalogue/CatalogueDistributorsPage.razor.rz.scp.css */
/* Brand-colour cell: swatch | picker | chip on one row. Use a plain
 * <div> as the flex container so CSS isolation actually applies — a
 * MudStack swallows the scoped [b-xxxx] attribute and silently no-ops. */
.ColourCell[b-fgjqwxs0mb] {
    display: flex;
    align-items: center;
    gap: 12px;
}

/* Small clickable colour swatch — previews the row's BrandColourHex. */
.DistributorColourSwatch[b-fgjqwxs0mb] {
    width: 28px;
    height: 28px;
    border-radius: 4px;
    border: 1px solid var(--mud-palette-lines-default);
    flex: 0 0 28px;
}

/* Wrapping <div> for the MudColorPicker. Scoped isolation lands on this
 * div; ::deep reaches into the Mud internals to force the input/control
 * elements to fill the wrapper rather than auto-sizing to content. */
.DistributorColourPicker[b-fgjqwxs0mb] {
    width: 160px;
    flex: 0 0 160px;
}
.DistributorColourPicker[b-fgjqwxs0mb]  .mud-picker,
.DistributorColourPicker[b-fgjqwxs0mb]  .mud-input-control,
.DistributorColourPicker[b-fgjqwxs0mb]  .mud-input,
.DistributorColourPicker[b-fgjqwxs0mb]  .mud-input-slot,
.DistributorColourPicker[b-fgjqwxs0mb]  input {
    width: 100%;
    min-width: 0;
    max-width: 100%;
    box-sizing: border-box;
}

/* Inline DisplayName edit — same constrained width as the colour picker
 * so the grid columns visually align. */
.DisplayNameField[b-fgjqwxs0mb] {
    width: 240px;
}
/* /Pages/Catalogue/CatalogueListingListPage.razor.rz.scp.css */
.PaperWrapper[b-apdj8eh7hy] {
    display: flex;
    width: max-content;
}

    .PaperWrapper[b-apdj8eh7hy]  .Selector .mud-input-control-input-container {
        min-width: 180px;
        max-width: 200px;
    }
/* /Pages/Catalogue/CatalogueOwnedBuyChoiceDialog.razor.rz.scp.css */
.ChoiceRow[b-7q2zcef94m] {
    display: flex;
    gap: 16px;
    flex-wrap: wrap;
}

.ChoiceCard[b-7q2zcef94m] {
    flex: 1 1 220px;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 8px;
    padding: 20px 16px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    cursor: pointer;
    transition: border-color .15s ease, background-color .15s ease;
}

.ChoiceCard:hover[b-7q2zcef94m],
.ChoiceCard:focus-visible[b-7q2zcef94m] {
    border-color: var(--mud-palette-primary);
    background-color: var(--mud-palette-primary-hover);
    outline: none;
}
/* /Pages/CoachMarks/CoachTagHandOffDialog.razor.rz.scp.css */
/* The hand-off task, shown exactly as it will be pasted: monospace, line breaks kept, long
   selector lines wrapped rather than scrolled so nothing is hidden off the edge of the dialog. */
.coachmark-handoff-text[b-kckvjg6qy8] {
    margin: 0;
    max-height: 60vh;
    overflow: auto;
    font-family: Consolas, "Courier New", monospace;
    font-size: 0.8rem;
    line-height: 1.4;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
    user-select: text;
}
/* /Pages/CoachMarks/CoachTourEdit.razor.rz.scp.css */
/* CSS Isolation - the coach-mark editor.
   Only the anchor picker lives here: a miniature screen with the twelve places a viewport-anchored
   bubble can sit. Everything else on the page is stock MudBlazor. */

/* The miniature screen. 16:10 rather than square so it reads as a browser window at a glance - the
   whole point is that an author recognises what they are looking at without a label. */
.coachmark-grid[b-t61wt45yb7] {
    position: relative;
    width: 240px;
    height: 150px;
    box-sizing: border-box;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    background: var(--mud-palette-background-grey);
}

/* The element-mode variant. Same twelve spots, but arranged around a target in the middle rather
   than inside the edges of a screen — because that is what the choice means here: which side of the
   element the bubble sits on. */
.coachmark-grid-element[b-t61wt45yb7] {
    background: var(--mud-palette-surface);
}

.coachmark-grid-target[b-t61wt45yb7] {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 64px;
    height: 22px;
    margin: -11px 0 0 -32px;
    border: 1px dashed var(--mud-palette-text-secondary);
    border-radius: 3px;
    background: var(--mud-palette-background-grey);
}

/* One of the twelve spots: a small bubble with a triangle showing which way it points. The triangle
   is the reason there are twelve and not nine - "top, right end" and "right, top end" sit in the
   same corner and are told apart only by which way they aim. Showing that is the job of this
   control, so the beak is drawn rather than described. */
.coachmark-spot[b-t61wt45yb7] {
    position: absolute;
    width: 26px;
    height: 16px;
    padding: 0;
    border: 0;
    background: transparent;
    cursor: pointer;
}

.coachmark-spot-body[b-t61wt45yb7] {
    position: absolute;
    inset: 0;
    border: 1px solid var(--mud-palette-text-secondary);
    border-radius: 2px;
    background: var(--mud-palette-surface);
    transition: background 90ms linear, border-color 90ms linear;
}

.coachmark-spot-beak[b-t61wt45yb7] {
    position: absolute;
    border: 4px solid transparent;
}

.coachmark-spot:hover .coachmark-spot-body[b-t61wt45yb7] {
    border-color: #1668b8;
    background: rgba(22, 104, 184, 0.18);
}

.coachmark-spot:focus-visible[b-t61wt45yb7] {
    outline: 2px solid #1668b8;
    outline-offset: 2px;
    border-radius: 3px;
}

.coachmark-spot[aria-pressed="true"] .coachmark-spot-body[b-t61wt45yb7] {
    border-color: #1668b8;
    background: #1668b8;
}

/* Beak geometry, one rule per side. It hangs off the edge of the little bubble and points outward,
   the same way the real one does. */
.coachmark-spot-top-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-top-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-top-end .coachmark-spot-beak[b-t61wt45yb7] {
    bottom: 100%;
    left: 6px;
    border-bottom-color: var(--mud-palette-text-secondary);
}

.coachmark-spot-bottom-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-bottom-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-bottom-end .coachmark-spot-beak[b-t61wt45yb7] {
    top: 100%;
    left: 6px;
    border-top-color: var(--mud-palette-text-secondary);
}

.coachmark-spot-left-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-left-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-left-end .coachmark-spot-beak[b-t61wt45yb7] {
    right: 100%;
    top: 4px;
    border-right-color: var(--mud-palette-text-secondary);
}

.coachmark-spot-right-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-right-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot-right-end .coachmark-spot-beak[b-t61wt45yb7] {
    left: 100%;
    top: 4px;
    border-left-color: var(--mud-palette-text-secondary);
}

.coachmark-spot[aria-pressed="true"].coachmark-spot-top-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-top-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-top-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-bottom-color: #1668b8;
}

.coachmark-spot[aria-pressed="true"].coachmark-spot-bottom-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-bottom-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-bottom-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-top-color: #1668b8;
}

.coachmark-spot[aria-pressed="true"].coachmark-spot-left-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-left-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-left-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-right-color: #1668b8;
}

.coachmark-spot[aria-pressed="true"].coachmark-spot-right-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-right-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-spot[aria-pressed="true"].coachmark-spot-right-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-left-color: #1668b8;
}

/* Beaks point the OTHER way in element mode, and this is the difference between the two pickers
   rather than a detail. A viewport bubble points outward, past the edge it sits against. An element
   bubble points INWARD, at the target in the middle: sitting above the element means the triangle
   is underneath the bubble, aimed down at it. */
.coachmark-grid-element .coachmark-spot-top-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-top-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-top-end .coachmark-spot-beak[b-t61wt45yb7] {
    bottom: auto;
    top: 100%;
    border-bottom-color: transparent;
    border-top-color: var(--mud-palette-text-secondary);
}

.coachmark-grid-element .coachmark-spot-bottom-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-bottom-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-bottom-end .coachmark-spot-beak[b-t61wt45yb7] {
    top: auto;
    bottom: 100%;
    border-top-color: transparent;
    border-bottom-color: var(--mud-palette-text-secondary);
}

.coachmark-grid-element .coachmark-spot-left-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-left-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-left-end .coachmark-spot-beak[b-t61wt45yb7] {
    right: auto;
    left: 100%;
    border-right-color: transparent;
    border-left-color: var(--mud-palette-text-secondary);
}

.coachmark-grid-element .coachmark-spot-right-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-right-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot-right-end .coachmark-spot-beak[b-t61wt45yb7] {
    left: auto;
    right: 100%;
    border-left-color: transparent;
    border-right-color: var(--mud-palette-text-secondary);
}

.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-top-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-top-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-top-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-top-color: #1668b8;
}

.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-bottom-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-bottom-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-bottom-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-bottom-color: #1668b8;
}

.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-left-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-left-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-left-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-left-color: #1668b8;
}

.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-right-start .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-right-middle .coachmark-spot-beak[b-t61wt45yb7],
.coachmark-grid-element .coachmark-spot[aria-pressed="true"].coachmark-spot-right-end .coachmark-spot-beak[b-t61wt45yb7] {
    border-right-color: #1668b8;
}

/* Placement around the perimeter. The two spellings of each corner sit side by side rather than on
   top of each other - they are different choices and have to be separately clickable. */
.coachmark-spot-top-start[b-t61wt45yb7]    { top: 10px; left: 12px; }
.coachmark-spot-top-middle[b-t61wt45yb7]   { top: 10px; left: 50%; margin-left: -13px; }
.coachmark-spot-top-end[b-t61wt45yb7]      { top: 10px; right: 46px; }

.coachmark-spot-right-start[b-t61wt45yb7]  { top: 34px; right: 10px; }
.coachmark-spot-right-middle[b-t61wt45yb7] { top: 50%; margin-top: -8px; right: 10px; }
.coachmark-spot-right-end[b-t61wt45yb7]    { bottom: 34px; right: 10px; }

.coachmark-spot-bottom-start[b-t61wt45yb7] { bottom: 10px; left: 12px; }
.coachmark-spot-bottom-middle[b-t61wt45yb7]{ bottom: 10px; left: 50%; margin-left: -13px; }
.coachmark-spot-bottom-end[b-t61wt45yb7]   { bottom: 10px; right: 46px; }

.coachmark-spot-left-start[b-t61wt45yb7]   { top: 34px; left: 10px; }
.coachmark-spot-left-middle[b-t61wt45yb7]  { top: 50%; margin-top: -8px; left: 10px; }
.coachmark-spot-left-end[b-t61wt45yb7]     { bottom: 34px; left: 10px; }
/* /Pages/ContactSync/AutoContactSyncMap.razor.rz.scp.css */
[b-hvxz8ae3uu] .table-fixed {
    table-layout: auto;
}

[b-hvxz8ae3uu] .table-fixed th,
[b-hvxz8ae3uu] .table-fixed td {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

[b-hvxz8ae3uu] .mud-table-container {
    overflow-x: auto;
}

/* Fix for inline editable customer ID field */
[b-hvxz8ae3uu] .mud-input-text {
    font-size: 0.875rem;
}

/* #7421 — ROW-PER-MAPPING GROUPING, WITHOUT HIERARCHY.
   The dashboard renders one row per PSA mapping, so a tenant with several occupies several adjacent
   rows. An earlier version shaded and indented the second and later rows; that implied a
   parent/child relationship the data does not have, and told the operator a split depended on the
   mapping it came from when either can be removed independently. (Sudhir, 2026-09-15.)

   What remains is a separator line on the row that STARTS each tenant's group — the groups stay
   readable, and no row is rendered as lesser than another. Every colour is a MudBlazor palette
   variable so it tracks the live light/dark toggle. */

/* First row of each tenant's group: a hairline above it separates one tenant from the next. */
[b-hvxz8ae3uu] .contactsync-row-group-start > td {
    border-top: 1px solid var(--mud-palette-lines-default);
}

/* Pending split: a mapping that exists but has no PSA customer yet. Warning-tinted because it is an
   UNFINISHED state that blocks enabling — a state, not a rank. */
[b-hvxz8ae3uu] .contactsync-row-pending-split {
    background-color: var(--mud-palette-warning-hover);
    box-shadow: inset 3px 0 0 0 var(--mud-palette-warning);
}
/* /Pages/ContactSync/Components/ContactSyncApplyDefaultDialog.razor.rz.scp.css */
/* CSS Isolation */
/*
    DEV note: MudBlazor does NOT play well with css-isolation
    Use div or span wrappers
*/
/* /Pages/ContactSync/Components/ContactSyncDefaultSettingsEditor.razor.rz.scp.css */
/* CSS Isolation */
/*
    DEV note: MudBlazor does NOT play well with css-isolation
    Use div or span wrappers
*/
/* /Pages/ContactSync/Components/ContactSyncTrackingLegendDialog.razor.rz.scp.css */
.contactsync-tracking-legend-dialog__layout[b-sdmay035i7] {
    min-width: 920px;
    display: flex;
    flex-direction: column;
    gap: 16px;
}

.contactsync-tracking-legend-dialog__summary-grid[b-sdmay035i7] {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 16px;
}

.contactsync-tracking-legend-dialog__section-grid[b-sdmay035i7] {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 16px;
    align-items: stretch;
}

.contactsync-tracking-legend-dialog__summary-card[b-sdmay035i7],
.contactsync-tracking-legend-dialog__section-card[b-sdmay035i7] {
    height: 100%;
}

.contactsync-tracking-legend-dialog__item-grid[b-sdmay035i7] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 12px;
}

.contactsync-tracking-legend-dialog__item-card[b-sdmay035i7] {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.contactsync-tracking-legend-dialog__visual[b-sdmay035i7] {
    display: grid;
    justify-content: flex-start;
    align-items: center;
    min-width: 0;
}

.contactsync-tracking-legend-dialog__description[b-sdmay035i7] {
    min-width: 0;
}

@media (max-width: 1280px) {
    .contactsync-tracking-legend-dialog__summary-grid[b-sdmay035i7] {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (max-width: 960px) {
    .contactsync-tracking-legend-dialog__layout[b-sdmay035i7] {
        min-width: 0;
    }

    .contactsync-tracking-legend-dialog__summary-grid[b-sdmay035i7] {
        grid-template-columns: minmax(0, 1fr);
    }

    .contactsync-tracking-legend-dialog__section-grid[b-sdmay035i7] {
        grid-template-columns: minmax(0, 1fr);
    }

    .contactsync-tracking-legend-dialog__item-grid[b-sdmay035i7] {
        grid-template-columns: minmax(0, 1fr);
    }
}
/* /Pages/Dashboard/CustomerStatus/DashboardCustomerDisabledTenantNotes.razor.rz.scp.css */
 /* CSS Isolation */

.CardItem[b-nviflih9wf] {
    margin: 4px;
    max-width: 600px;
    min-width: 600px;
    max-height: 600px;
    overflow: auto;
}

.CardItem table td[b-nviflih9wf]{
    vertical-align: top
}
/* /Pages/Dashboard/CustomerStatus/DashboardCustomerStatus.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Dashboard/CustomerStatus/DatesPicker.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Dashboard/DashboardCustomerSecurity.razor.rz.scp.css */

.ChartGrid[b-8gccvffhav] {
    margin-top: 14px;
}

/* /Pages/Dashboard/DashboardTenantAzureBaseline.razor.rz.scp.css */
.baseline-scroll[b-oz8gvisggt] {
    overflow-x: auto;
    border: 1px solid #d1d5db;
    border-radius: 4px;
    background: #fff;
}

.baseline-table[b-oz8gvisggt] {
    border-collapse: collapse;
    font-size: 11px;
    width: max-content;
}

.baseline-table th[b-oz8gvisggt],
.baseline-table td[b-oz8gvisggt] {
    border: 1px solid #d1d5db;
    padding: 2px 4px;
    text-align: right;
    white-space: nowrap;
    min-width: 70px;
}

.baseline-table th[b-oz8gvisggt] {
    background: #f3f4f6;
    font-weight: 600;
    position: sticky;
    top: 0;
    z-index: 2;
    text-align: center;
}

.baseline-table th.sub-col[b-oz8gvisggt],
.baseline-table td.sub-col[b-oz8gvisggt] {
    text-align: left;
    position: sticky;
    left: 0;
    z-index: 3;
    background: #ffffff;
    min-width: 260px;
    font-weight: 500;
}

.baseline-table th.sub-col[b-oz8gvisggt] {
    background: #f3f4f6;
    z-index: 4;
}

.baseline-table .sub-meta[b-oz8gvisggt] {
    color: #6b7280;
    font-size: 10px;
    font-weight: 400;
}

.baseline-table td .cell-main[b-oz8gvisggt] {
    font-weight: 700;
    line-height: 1.1;
}

.baseline-table td .cell-sub[b-oz8gvisggt] {
    color: #475569;
    font-size: 9px;
    line-height: 1.1;
}

.baseline-table td.pending[b-oz8gvisggt] {
    background: #f9fafb;
    color: #9ca3af;
}

.baseline-table td.busy[b-oz8gvisggt] {
    background: #dbeafe;
    color: #1e3a8a;
}

.baseline-table td.has[b-oz8gvisggt] {
    background: #d1fae5;
    color: #065f46;
}

.baseline-table td.cached[b-oz8gvisggt] {
    background: #e0e7ff;
    color: #3730a3;
    font-style: italic;
}

.baseline-table td.empty[b-oz8gvisggt] {
    background: #fef3c7;
    color: #92400e;
}

.baseline-table td.fail[b-oz8gvisggt] {
    background: #fee2e2;
    color: #991b1b;
    cursor: help;
}

.baseline-table td.total-col[b-oz8gvisggt],
.baseline-table th.total-col[b-oz8gvisggt] {
    background: #f9fafb;
    font-weight: 700;
    position: sticky;
    right: 0;
    min-width: 80px;
}

.baseline-table td.total-col.has[b-oz8gvisggt] {
    background: #d1fae5;
}

.baseline-table .year-divider[b-oz8gvisggt] {
    border-right: 2px solid #6b7280 !important;
}

.legend-swatch[b-oz8gvisggt] {
    display: inline-block;
    width: 12px;
    height: 12px;
    vertical-align: middle;
    border: 1px solid #d1d5db;
    margin: 0 4px 0 12px;
}

.legend-swatch.has[b-oz8gvisggt]    { background: #d1fae5; }
.legend-swatch.empty[b-oz8gvisggt]  { background: #fef3c7; }
.legend-swatch.busy[b-oz8gvisggt]   { background: #dbeafe; }
.legend-swatch.fail[b-oz8gvisggt]   { background: #fee2e2; }
.legend-swatch.cached[b-oz8gvisggt] { background: #e0e7ff; }
/* /Pages/Dashboard/DashboardTenantAzureCoverage.razor.rz.scp.css */
.coverage-scroll[b-h7zvk2jz18] {
    overflow-x: auto;
    border: 1px solid #d1d5db;
    border-radius: 4px;
    background: #fff;
}

.coverage-table[b-h7zvk2jz18] {
    border-collapse: collapse;
    font-size: 12px;
    width: max-content;
}

.coverage-table th[b-h7zvk2jz18],
.coverage-table td[b-h7zvk2jz18] {
    border: 1px solid #d1d5db;
    padding: 4px 6px;
    text-align: center;
    white-space: nowrap;
}

.coverage-table th[b-h7zvk2jz18] {
    background: #f3f4f6;
    font-weight: 600;
    position: sticky;
    top: 0;
    z-index: 2;
}

.coverage-table th.sub-col[b-h7zvk2jz18],
.coverage-table td.sub-col[b-h7zvk2jz18] {
    text-align: left;
    position: sticky;
    left: 0;
    z-index: 3;
    background: #ffffff;
    min-width: 240px;
    font-weight: 500;
}

.coverage-table th.sub-col[b-h7zvk2jz18] {
    background: #f3f4f6;
    z-index: 4;
}

.coverage-table .sub-meta[b-h7zvk2jz18] {
    color: #6b7280;
    font-size: 10px;
    font-weight: 400;
}

.coverage-table td.has[b-h7zvk2jz18] {
    background: #d1fae5;
    color: #065f46;
    font-weight: 700;
}

.coverage-table td.empty[b-h7zvk2jz18] {
    background: #fef3c7;
    color: #92400e;
}

.coverage-table td.fail[b-h7zvk2jz18] {
    background: #fee2e2;
    color: #991b1b;
    font-weight: 700;
    cursor: help;
}

.coverage-table td.miss[b-h7zvk2jz18] {
    background: #f3f4f6;
    color: #9ca3af;
}

.coverage-table td.total-col[b-h7zvk2jz18],
.coverage-table th.total-col[b-h7zvk2jz18] {
    background: #f9fafb;
    font-weight: 700;
    position: sticky;
    right: 0;
}

.coverage-table td.total-col.has[b-h7zvk2jz18] {
    background: #d1fae5;
}

.coverage-table td.total-col.empty[b-h7zvk2jz18] {
    background: #fef3c7;
}

.coverage-table td.total-col.fail[b-h7zvk2jz18] {
    background: #fee2e2;
}

.coverage-table .year-divider[b-h7zvk2jz18] {
    border-right: 2px solid #6b7280 !important;
}

.legend-swatch[b-h7zvk2jz18] {
    display: inline-block;
    width: 12px;
    height: 12px;
    vertical-align: middle;
    border: 1px solid #d1d5db;
    margin: 0 4px 0 12px;
}

.legend-swatch.has[b-h7zvk2jz18]   { background: #d1fae5; }
.legend-swatch.empty[b-h7zvk2jz18] { background: #fef3c7; }
.legend-swatch.fail[b-h7zvk2jz18]  { background: #fee2e2; }
/* /Pages/Dashboard/DashboardTenantSecurity.razor.rz.scp.css */
.ChartGrid[b-h8r7nhz6r6] {
    margin-top: -14px;
}
/* /Pages/Dashboard/LicensingSummary/EmptyLayout.razor.rz.scp.css */
*[b-bmq0nns9cv] {
    font-family: Arial, Helvetica, sans-serif;
    line-height: 1.6;
}
@page {
    margin: 1.3cm;
}
/* /Pages/Dashboard/Mailbox/TenantMailboxGrid.razor.rz.scp.css */
body[b-efv47bcfqy] {
}
/* /Pages/Dashboard/SignatureUsage/DashboardEntityBannerResults.razor.rz.scp.css */
.banner-result-thumb[b-sjqi7md5hz] {
    max-height: 40px;
    max-width: 140px;
    object-fit: contain;
}
/* /Pages/Dashboard/SignatureUsage/DashboardEntitySurveyResults.razor.rz.scp.css */
/* Custom rating-distribution bar: one horizontal stacked bar of coloured segments (red -> green),
   with the active score's label centred on it and a "count (percentage)" caption below. Hover-driven
   (no legend) so it matches the reference design. */

.survey-dist[b-7upm5wt8p8] {
    position: relative;
    width: 100%;
    height: 48px;
}

.survey-dist-bar[b-7upm5wt8p8] {
    display: flex;
    width: 100%;
    height: 100%;
    border-radius: 8px;
    overflow: hidden;
    background: var(--mud-palette-background-grey);
}

.survey-dist-seg[b-7upm5wt8p8] {
    height: 100%;
    cursor: pointer;
    transition: filter 120ms ease;
}

.survey-dist-seg:hover[b-7upm5wt8p8] {
    filter: brightness(1.06);
}

.survey-dist-label[b-7upm5wt8p8] {
    position: absolute;
    top: 0;
    bottom: 0;
    display: flex;
    align-items: center;
    transform: translateX(-50%);
    white-space: nowrap;
    color: #fff;
    font-weight: 600;
    font-size: 1rem;
    pointer-events: none;
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
    transition: left 120ms ease;
}

.survey-dist-caption[b-7upm5wt8p8] {
    margin-top: 0.5rem;
    text-align: center;
    color: var(--mud-palette-text-secondary);
}
/* /Pages/Dashboard/TenantMfa/AcceptRiskDialog.razor.rz.scp.css */

.Title[b-xxr3z812wh] {
    font-weight: bolder;
    font-size: larger;
}

.ReasonTextBox[b-xxr3z812wh] {

}

.ButtonContainer button[b-xxr3z812wh] {
    /*min-width: 72px;*/
}
/* /Pages/Diagnostics/DeveloperTools.razor.rz.scp.css */
.ForceAlign[b-4oao7suipk] {
    margin-left: 12px !important;
}
/* /Pages/Diagnostics/DistiApiCheck/DistiApiCheck.razor.rz.scp.css */
 /* CSS Isolation */
/* 
    DEV note: MudBlazor does NOT play well with css-isolation 
    Use div or span wrappers
*/
/* /Pages/Diagnostics/EcpComponents/CodeExample.razor.rz.scp.css */
/* CSS Isolation — editor-style code window. Deliberate custom CSS: MudBlazor has no code
   panel and the token colours target markup injected via MarkupString (hence ::deep). */
.code-window[b-0vlu3kckx9] {
    border-radius: 2px;
    overflow: hidden;
    background: #1e1e2e;
    border: 1px solid #313244;
}

.code-header[b-0vlu3kckx9] {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 12px;
    background: #181825;
    border-bottom: 1px solid #313244;
    border-left: 3px solid #89b4fa;
}

.code-header[b-0vlu3kckx9]  .code-icon {
    color: #89b4fa;
}

.code-header[b-0vlu3kckx9]  .code-title {
    color: #a6adc8;
    font-family: 'Cascadia Code', Consolas, monospace;
}

.code-lang[b-0vlu3kckx9] {
    color: #89b4fa;
    background: rgba(137, 180, 250, 0.12);
    border: 1px solid rgba(137, 180, 250, 0.35);
    border-radius: 2px;
    padding: 1px 8px;
    font-size: 0.7rem;
    font-family: 'Cascadia Code', Consolas, monospace;
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

.code-header[b-0vlu3kckx9]  .code-copy {
    color: #a6adc8;
}

.code-body[b-0vlu3kckx9] {
    margin: 0;
    padding: 14px 16px;
    overflow-x: auto;
    color: #cdd6f4;
    font-family: 'Cascadia Code', Consolas, 'Courier New', monospace;
    font-size: 0.8rem;
    line-height: 1.6;
    tab-size: 4;
}

.code-body[b-0vlu3kckx9]  .tok-tag {
    color: #89b4fa;
}

.code-body[b-0vlu3kckx9]  .tok-attr {
    color: #f9e2af;
}

.code-body[b-0vlu3kckx9]  .tok-str {
    color: #a6e3a1;
}

.code-body[b-0vlu3kckx9]  .tok-razor {
    color: #f38ba8;
}

.code-body[b-0vlu3kckx9]  .tok-kw {
    color: #cba6f7;
}

.code-body[b-0vlu3kckx9]  .tok-com {
    color: #6c7086;
    font-style: italic;
}
/* /Pages/Diagnostics/EcpComponents/EcpComponents.razor.rz.scp.css */
/* CSS Isolation — hero banner for the component library page. ::deep is required because the
   MudPaper/MudText elements are rendered by child components and do not carry the scope attribute. */
.ecp-components-page[b-f9z39wue6o]  .components-hero {
    background: linear-gradient(135deg, var(--mud-palette-primary) 0%, var(--mud-palette-info) 100%);
    border-radius: var(--mud-default-borderradius);
}

.ecp-components-page[b-f9z39wue6o]  .components-hero .mud-typography {
    color: var(--mud-palette-primary-text);
}

.ecp-components-page[b-f9z39wue6o]  .components-hero .mud-icon-root {
    color: var(--mud-palette-primary-text);
    opacity: 0.85;
}
/* /Pages/Diagnostics/EcpGridPageTemplate.razor.rz.scp.css */
.AcknowledgeContainer ul[b-btyrisbp3q] {
    list-style: disc !important;
    padding: revert;
}

.AcknowledgeContainer li[b-btyrisbp3q] {
    display: list-item !important;
    text-align: inherit !important;
    unicode-bidi: inherit !important;
}

.AcknowledgeContainer li > ul[b-btyrisbp3q] {
        padding-left: 20px;
    }

.AcknowledgeContainer button[b-btyrisbp3q] {
    text-transform: lowercase !important;
    max-height: 50px;
}
/* /Pages/Diagnostics/EcpTabbedGridTemplate/EcpTabbedGridTemplate.razor.rz.scp.css */
body[b-8v84gk1zqe] {
}
/* /Pages/Document/DocumentView.razor.rz.scp.css */
@media print {
    .e-richtexteditor[b-cdze3pub88], .e-rte-content[b-cdze3pub88], .e-rte-content .e-content[b-cdze3pub88] {
        height: auto !important;
        overflow: visible !important;
    }

    /* Hide scrollbars */
    .e-rte-content .e-content[b-cdze3pub88] {
        scrollbar-width: none; /* Firefox */
    }
    .e-rte-content .e-content[b-cdze3pub88]::-webkit-scrollbar {
        display: none; /* Chrome, Safari */
    }

    /* Hide app bar*/
    .mud-appbar[b-cdze3pub88] {
        display: none !important;
    }
    .mud-toolbar[b-cdze3pub88] {
        display: none !important;
    }
}

/* Hidden in normal screen unless body has .print-only */
body.print-only *[b-cdze3pub88] {
    display: none !important;
}

body.print-only #content-container[b-cdze3pub88],
body.print-only #content-container *[b-cdze3pub88] {
    display: block !important;
}

body.print-only #content-container[b-cdze3pub88] {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

    body.print-only #content-container img[b-cdze3pub88],
    body.print-only #content-container pre[b-cdze3pub88],
    body.print-only #content-container code[b-cdze3pub88] {
        display: block !important;
    }
/* /Pages/EmailSignature/EmailSignatureCampaignAddDialog.razor.rz.scp.css */
.campaign-banner-thumb[b-qgi0city59] {
    max-height: 48px;
    max-width: 160px;
    object-fit: contain;
}
/* /Pages/EmailSignature/EmailSignatureCampaignEditDialog.razor.rz.scp.css */
.campaign-banner-thumb[b-q6ccltd7g7] {
    max-height: 48px;
    max-width: 160px;
    object-fit: contain;
}
/* /Pages/EmailSignature/EmailSignatureCampaignList.razor.rz.scp.css */
/* Campaigns management page — spacing comes from MudBlazor utility classes; nothing custom yet. */
/* /Pages/EmailSignature/EmailSignatureList.razor.rz.scp.css */
/* Inline signature thumbnail: a fixed, clipped frame that renders the full signature scaled down.
   The iframe is laid out at full size (600x400) then scaled to fit the 96x64 frame, so the preview
   is a faithful miniature of the real signature. pointer-events are disabled on the iframe so the
   click lands on the container (which opens the full preview panel). */
.sig-thumb[b-1fyr3vszgu] {
    width: 96px;
    height: 64px;
    overflow: hidden;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    background: #fff;
    cursor: pointer;
    position: relative;
}

.sig-thumb-frame[b-1fyr3vszgu] {
    width: 600px;
    height: 400px;
    border: 0;
    transform: scale(0.16);
    transform-origin: top left;
    pointer-events: none;
}

.sig-thumb-empty[b-1fyr3vszgu] {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    color: var(--mud-palette-text-disabled);
}

/* Drag-and-drop reorder: the Order cell is both the drag source (grip handle) and the drop
   target. The dashed outline marks the row the dragged component would take the place of. */
.sig-order-cell[b-1fyr3vszgu] {
    min-height: 32px;
    padding: 2px 4px;
    border-radius: 4px;
}

.sig-drag-handle[b-1fyr3vszgu] {
    cursor: grab;
    color: var(--mud-palette-text-secondary);
}

.sig-drag-over[b-1fyr3vszgu] {
    outline: 2px dashed var(--mud-palette-info);
    outline-offset: -2px;
}

/* Secondary halves of the compact columns: rule-summary values and the "by: name" line. */
.sig-summary-value[b-1fyr3vszgu] {
    color: var(--mud-palette-text-secondary);
}

/* The condition tree outline in the Applies-to tooltip keeps its line breaks and indentation. */
.sig-condition-outline[b-1fyr3vszgu] {
    white-space: pre;
    text-align: left;
}
/* /Pages/EmailSignature/EmailSignatureOptionsDialog.razor.rz.scp.css */
/* Fixed dialog-content height so switching tabs never resizes the dialog: the tab header keeps
   its natural height and the panel area fills the rest, scrolling when a tab's content is taller. */
.sig-options-root[b-5mdmvkvfu8] {
    height: 70vh;
    display: flex;
    flex-direction: column;
}

.sig-options-root[b-5mdmvkvfu8]  .mud-tabs {
    height: 100%;
    display: flex;
    flex-direction: column;
}

.sig-options-root[b-5mdmvkvfu8]  .mud-tabs-panels {
    flex: 1;
    overflow-y: auto;
}
/* /Pages/EmailSignature/EmailSignatureUserFieldList.razor.rz.scp.css */
/* Drag-to-reorder cell — matches the signature-components grid look & feel. */
.sig-order-cell[b-6hkvafb16g] {
    min-height: 32px;
    padding: 2px 4px;
    border-radius: 4px;
}

.sig-drag-handle[b-6hkvafb16g] {
    cursor: grab;
    color: var(--mud-palette-text-secondary);
}

.sig-drag-over[b-6hkvafb16g] {
    outline: 2px dashed var(--mud-palette-info);
    outline-offset: -2px;
}
/* /Pages/EmailSignature/EmailSignatureUserSettingsList.razor.rz.scp.css */
/* Cells whose value is inherited (no stored row) are muted, so an explicitly stored value stands out
   and it is obvious which settings "restore default" would actually change. */
[b-fm508cup06] .sig-setting-inherited {
    opacity: 0.55;
}

/* Keep the setting columns compact — the inline editors otherwise stretch the row height. */
[b-fm508cup06] .mud-table-cell .mud-input-control {
    margin-top: 0;
}
/* /Pages/EmailSignature/RibbonInsertIconDialog.razor.rz.scp.css */
/* Icon picker grid — previews use the Font Awesome webfont where available, inline SVG
   otherwise (icons newer than the loaded FA version, e.g. X). */
.sig-icon-grid[b-aylxrlwn1k] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    max-height: 230px;
    overflow-y: auto;
    padding: 4px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
}

.sig-icon-tile[b-aylxrlwn1k] {
    width: 72px;
    height: 58px;
    border: 2px solid transparent;
    border-radius: 4px;
    background: transparent;
    cursor: pointer;
    color: var(--mud-palette-text-primary);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 3px;
    padding: 4px 2px;
}

.sig-icon-tile:hover[b-aylxrlwn1k] {
    background: var(--mud-palette-action-default-hover, rgba(0, 0, 0, 0.06));
}

.sig-icon-tile.selected[b-aylxrlwn1k] {
    border-color: var(--mud-palette-info);
}

.sig-icon-glyph[b-aylxrlwn1k] {
    font-size: 20px;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
}

.sig-icon-glyph svg[b-aylxrlwn1k] {
    width: 20px;
    height: 20px;
}

.sig-icon-label[b-aylxrlwn1k] {
    font-size: 0.62rem;
    line-height: 1.1;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 68px;
}

/* Live preview swatch (approximation of the rendered PNG). */
.sig-icon-preview[b-aylxrlwn1k] {
    display: flex;
    align-items: center;
    justify-content: center;
}

.sig-icon-preview.circle[b-aylxrlwn1k],
.sig-icon-preview.circle-outline[b-aylxrlwn1k] {
    border-radius: 50%;
}

.sig-icon-preview.square[b-aylxrlwn1k],
.sig-icon-preview.square-outline[b-aylxrlwn1k] {
    border-radius: 12%;
}
/* /Pages/EmailSignature/RibbonInsertImageDialog.razor.rz.scp.css */
/* Thumbnail gallery of the entity-shared signature images. */
.sig-image-gallery[b-r3zpx8td22] {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    max-height: 220px;
    overflow-y: auto;
    padding: 4px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
}

.sig-image-tile[b-r3zpx8td22] {
    position: relative;
    width: 84px;
    height: 84px;
    border: 2px solid transparent;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--mud-palette-background-gray, #fafafa);
    cursor: pointer;
}

.sig-image-tile.selected[b-r3zpx8td22] {
    border-color: var(--mud-palette-info);
}

.sig-image-tile img[b-r3zpx8td22] {
    max-width: 76px;
    max-height: 76px;
    object-fit: contain;
}

/* Delete overlay in the tile corner — visible on hover. */
.sig-image-tile[b-r3zpx8td22]  .sig-image-delete {
    position: absolute;
    top: 0;
    right: 0;
    padding: 2px;
    background: rgba(255, 255, 255, 0.85);
    opacity: 0;
}

.sig-image-tile:hover[b-r3zpx8td22]  .sig-image-delete {
    opacity: 1;
}
/* /Pages/EmailSignature/RibbonSurveyDialog.razor.rz.scp.css */
/* Fixed-width label column so the Shape / Fill / Colour radio rows align. ::deep because the
   class lands on MudText's own root element, which Blazor CSS isolation does not scope. */
.survey-option-row[b-ha9e9x9wuu]  .survey-option-label {
    width: 72px;
    flex-shrink: 0;
}
/* /Pages/EmailSignature/RibbonTemplatePickerDialog.razor.rz.scp.css */
/* Vertically scrollable list of template previews; 10px gap between rows. */
.tmpl-list[b-j6fw1le4da] {
    display: flex;
    flex-direction: column;
    gap: 10px;
    max-height: 70vh;
    overflow-y: auto;
    padding-right: 4px;
}

/* One template: near-full-size preview on the left, name + Select on the right. No border of
   its own — the preview box below carries the frame, and a second box around preview + Select
   reads as a border around a border. The radius stays for the current-template outline. */
.tmpl-row[b-j6fw1le4da] {
    display: flex;
    gap: 12px;
    align-items: stretch;
    border-radius: 6px;
    padding: 8px;
}

.tmpl-row-current[b-j6fw1le4da] {
    outline: 2px solid var(--mud-palette-info);
}

.tmpl-preview[b-j6fw1le4da] {
    flex: 1;
    min-width: 0;
    height: 240px;
    overflow: hidden;
    background: #fff;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
}

.tmpl-frame[b-j6fw1le4da] {
    width: 100%;
    height: 100%;
    border: 0;
}

.tmpl-actions[b-j6fw1le4da] {
    flex: 0 0 140px;
    display: flex;
    flex-direction: column;
    align-items: stretch;
    justify-content: center;
    gap: 6px;
}

/* Template name: small, grey, above the Select button. */
.tmpl-name[b-j6fw1le4da] {
    font-size: 0.72rem;
    color: var(--mud-palette-text-secondary);
    text-align: center;
    word-break: break-word;
}
/* /Pages/EmailSignature/SignatureConditionBlock.razor.rz.scp.css */
 /* CSS Isolation */

/* A nested group: indented under its parent with a left rule, so the tree reads as blocks. */
.sig-cond-block[b-96ue0yek9x] {
    border-left: 3px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    background-color: var(--mud-palette-background-gray);
    margin-left: 12px;
}

.sig-cond-root[b-96ue0yek9x] {
    padding: 0;
}

/* The operator written between two items, indented like the items it joins. */
.sig-cond-join[b-96ue0yek9x] {
    display: block;
    padding-left: 32px;
    font-weight: 600;
    letter-spacing: 0.06em;
    color: var(--mud-palette-text-secondary);
}

.sig-cond-not[b-96ue0yek9x] {
    font-weight: 700;
    color: var(--mud-palette-warning);
}

.sig-cond-op-select[b-96ue0yek9x] {
    max-width: 140px;
}
/* /Pages/EmailSignature/SignatureExchangePanel.razor.rz.scp.css */
/* The auth token is a long unbroken base64url string. Without an explicit break it either overflows
   its column or stretches the grid; monospace makes it checkable character by character against what
   ends up in the customer's transport rule. */
.ecp-setup-token[b-wiq84yx8do] {
    font-family: Consolas, "Courier New", monospace;
    font-size: 0.8rem;
    word-break: break-all;
}

/* The generated PowerShell is read, copied and pasted — never edited here — so it renders as a
   scrollable block rather than a text field. Horizontal scrolling is deliberate: wrapping a
   backtick-continued PowerShell line changes what it means when pasted. */
.ecp-setup-script[b-wiq84yx8do] {
    margin: 0.5rem 0 0 0;
    padding: 0.75rem;
    max-height: 26rem;
    overflow: auto;
    font-family: Consolas, "Courier New", monospace;
    font-size: 0.8rem;
    line-height: 1.45;
    background-color: var(--mud-palette-background-grey);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    white-space: pre;
}
/* /Pages/EmailSignature/SignatureHtmlEditor.razor.rz.scp.css */
/* Monaco needs an explicit container height — it sizes to its parent, and inside a
   MudTabPanel the parent otherwise collapses to 0. Matches the design surface height. */
.html-source-editor[b-ry2o5419xr]  .monaco-editor-container {
    height: 550px;
}

/* ── CodeTwo-style ribbon ─────────────────────────────────────────────────── */

.sig-ribbon[b-ry2o5419xr] {
    border: 1px solid var(--mud-palette-lines-default);
    border-bottom: none;
    border-radius: 4px 4px 0 0;
    /* No overflow:hidden here — the colour dropdowns overhang the ribbon's bottom edge
       and would be clipped. The tab strip rounds its own top corners instead. */
    background: var(--mud-palette-surface);
    position: relative;
    z-index: 30; /* keep the colour dropdowns above the editor canvas */
}

/* Tab strip across the top (Main / Table layout) — same surface colour as the ribbon,
   separated by a hairline; the active tab is marked by colour + underline. */
.ribbon-tabs[b-ry2o5419xr] {
    display: flex;
    background: var(--mud-palette-surface);
    border-bottom: 1px solid var(--mud-palette-lines-default);
    border-radius: 3px 3px 0 0;
}

.ribbon-tab[b-ry2o5419xr] {
    border: none;
    background: transparent;
    color: var(--mud-palette-text-secondary);
    padding: 8px 20px;
    font-size: 0.85rem;
    cursor: pointer;
    border-bottom: 3px solid transparent;
    margin-bottom: -1px; /* underline sits on the strip's hairline */
}

.ribbon-tab:hover[b-ry2o5419xr] {
    color: var(--mud-palette-text-primary);
}

.ribbon-tab.active[b-ry2o5419xr] {
    color: var(--mud-palette-info);
    border-bottom-color: var(--mud-palette-info);
}

/* Row of captioned tool groups. */
.ribbon-groups[b-ry2o5419xr] {
    display: flex;
    align-items: stretch;
    flex-wrap: wrap;
    padding: 4px 8px 2px 8px;
}

[b-ry2o5419xr] .ribbon-group {
    display: flex;
    flex-direction: column;
    padding: 0 10px;
    border-right: 1px solid var(--mud-palette-lines-default);
}

[b-ry2o5419xr] .ribbon-group:last-child {
    border-right: none;
}

[b-ry2o5419xr] .ribbon-group-buttons {
    display: flex;
    align-items: center;
    gap: 2px;
    flex: 1;
    min-height: 58px; /* uniform group height — Font group's two rows set the tallest case */
}

[b-ry2o5419xr] .ribbon-group-caption {
    text-align: center;
    font-size: 0.7rem;
    color: var(--mud-palette-text-secondary);
    margin-top: 2px;
    padding-bottom: 2px;
}

/* Large command icons at 32px — MudBlazor's Size.Large (36px) reads too heavy next to
   Office ribbons. Duplicated under ::deep for markup inside child-content fragments. */
.ribbon-btn-inner .mud-icon-root[b-ry2o5419xr],
[b-ry2o5419xr] .ribbon-btn-inner .mud-icon-root {
    font-size: 32px;
}

/* Icon-over-label buttons. */
[b-ry2o5419xr] .ribbon-btn {
    min-width: 56px;
    padding: 4px 6px;
    text-transform: none;
}

[b-ry2o5419xr] .ribbon-btn-inner {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2px;
}

[b-ry2o5419xr] .ribbon-btn-label {
    font-size: 0.7rem;
    line-height: 1.1;
    white-space: normal;
    max-width: 76px;
    color: var(--mud-palette-text-primary);
}

/* Two-row stack inside the Font group (selects above, format buttons below). */
.ribbon-font-stack[b-ry2o5419xr] {
    display: flex;
    flex-direction: column;
}

[b-ry2o5419xr] .ribbon-font-select {
    width: 150px;
}

[b-ry2o5419xr] .ribbon-size-select {
    width: 80px;
}

/* Compact the MudSelects so the Font group's two rows fit the uniform group height. */
[b-ry2o5419xr] .ribbon-font-select .mud-input,
[b-ry2o5419xr] .ribbon-size-select .mud-input {
    font-size: 0.8rem;
}

[b-ry2o5419xr] .ribbon-font-select.mud-input-control,
[b-ry2o5419xr] .ribbon-size-select.mud-input-control {
    margin: 0;
}

/* Active-state highlight on toggle buttons (HTML source, Preview, Sample email, Gridlines)
   and format buttons (bold on bold text, etc.). Must read clearly in BOTH themes — the old
   theme-hover tint was invisible in dark mode: accent fill plus an accent ring. */
[b-ry2o5419xr] .fmt-active {
    background: rgba(33, 150, 243, 0.15); /* fallback for browsers without color-mix */
    background: color-mix(in srgb, var(--mud-palette-info) 25%, transparent);
    box-shadow: inset 0 0 0 1px var(--mud-palette-info);
    border-radius: 4px;
}

/* Dimmed content for disabled ribbon buttons (Table layout tools outside a table). */
[b-ry2o5419xr] .ribbon-btn-disabled {
    opacity: 0.4;
}

/* Text/highlight colour dropdowns — plain in-ribbon elements (no popover portal) so the
   editor's selection survives the interaction. */
.ribbon-color-wrap[b-ry2o5419xr] {
    position: relative;
}

.ribbon-icon-btn[b-ry2o5419xr] {
    display: flex;
    align-items: center;
    background: transparent;
    border: none;
    padding: 6px;
    border-radius: 4px;
    cursor: pointer;
    color: var(--mud-palette-text-primary);
}

.ribbon-icon-btn:hover[b-ry2o5419xr] {
    background: var(--mud-palette-action-default-hover, rgba(0, 0, 0, 0.06));
}

.ribbon-palette-popup[b-ry2o5419xr] {
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 20;
    background: var(--mud-palette-surface);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25);
    width: 250px;
}

/* Inline (static) MudColorPicker inside the colour dropdowns — spectrum, sliders, hex input. */
[b-ry2o5419xr] .ribbon-color-picker {
    width: 100%;
    box-shadow: none;
}

.ribbon-tab:disabled[b-ry2o5419xr] {
    opacity: 0.4;
    cursor: default;
}

/* Preview surface (standalone Preview and the sample email thread). Deliberately WHITE in
   both themes — signatures are judged against how the sent email renders, and emails are
   read on white (same choice Word and CodeTwo make). Text colour is pinned dark so the
   dark theme's light text doesn't wash out on the white surface. */
.sig-email-page[b-ry2o5419xr] {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 0 0 4px 4px;
    background: #fff;
    color: #212121;
    padding: 14px 18px;
}

/* Sandboxed iframe carrying the resolved signature; height is set to the content by
   signatureSelection.resizePreviewFrame after each render. */
.sig-preview-frame[b-ry2o5419xr] {
    display: block;
    width: 100%;
    border: 0;
    background: #fff;
    margin: 12px 0;
}

/* HTML / Plain text switch shown at the top of the preview renditions. */
.sig-preview-tabs[b-ry2o5419xr] {
    display: flex;
    gap: 4px;
    margin-bottom: 10px;
}

/* Fixed colours — the pills sit on the always-white preview surface, so theme variables
   would render light-on-white in dark mode. */
.sig-preview-tab[b-ry2o5419xr] {
    border: 1px solid #c4c4c4;
    background: transparent;
    color: #666;
    padding: 3px 14px;
    font-size: 0.8rem;
    border-radius: 12px;
    cursor: pointer;
}

.sig-preview-tab.active[b-ry2o5419xr] {
    color: #fff;
    background: var(--mud-palette-info);
    border-color: var(--mud-palette-info);
}

/* Plain-text rendition — fixed-width like plain-text emails render in Outlook. */
.sig-preview-text[b-ry2o5419xr] {
    white-space: pre-wrap;
    font-family: Consolas, "Courier New", monospace;
    font-size: 0.85rem;
    color: #000;
    margin: 12px 0;
}

.sig-thread[b-ry2o5419xr] {
    font-family: Calibri, Arial, sans-serif;
    font-size: 0.85rem;
    color: #8a8a8a;
}

.sig-thread p[b-ry2o5419xr] {
    margin: 0 0 10px;
}

/* Symbol dropdown — grid of character tiles, with a footer hint pointing at the Icon dialog
   for the concepts Unicode has no monochrome glyph for (fax, globe, building). */
.ribbon-char-popup[b-ry2o5419xr] {
    width: auto;
}

.ribbon-char-menu[b-ry2o5419xr] {
    display: grid;
    grid-template-columns: repeat(10, 32px);
    gap: 4px;
    padding: 8px;
    width: auto;
    max-height: 320px;
    overflow-y: auto;
}

.ribbon-char-hint[b-ry2o5419xr] {
    border-top: 1px solid var(--mud-palette-lines-default);
    padding: 6px 8px;
    font-size: 0.7rem;
    color: var(--mud-palette-text-secondary);
}

.ribbon-char-item[b-ry2o5419xr] {
    width: 32px;
    height: 32px;
    font-size: 16px;
    background: transparent;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    cursor: pointer;
    color: var(--mud-palette-text-primary);
}

.ribbon-char-item:hover[b-ry2o5419xr] {
    background: var(--mud-palette-action-default-hover, rgba(0, 0, 0, 0.06));
}

/* Raw-button trigger for in-ribbon dropdowns (needs its own reset — no MudButton base). */
[b-ry2o5419xr] .ribbon-menu-trigger {
    background: transparent;
    border: none;
    cursor: pointer;
    border-radius: 4px;
}

[b-ry2o5419xr] .ribbon-menu-trigger:hover {
    background: var(--mud-palette-action-default-hover, rgba(0, 0, 0, 0.06));
}

/* Placeholder dropdown — scrollable token list (descriptions only; token in tooltip).
   Rules are duplicated under ::deep because scope-attribute placement varies for markup
   rendered through the ribbon's child-content fragments. */
.ribbon-token-menu[b-ry2o5419xr],
[b-ry2o5419xr] .ribbon-token-menu {
    width: 230px;
    max-height: 320px;
    overflow-y: auto;
    padding: 4px;
}

.ribbon-token-item[b-ry2o5419xr],
[b-ry2o5419xr] .ribbon-token-item {
    display: block;
    width: 100%;
    text-align: left;
    background: transparent;
    border: none;
    padding: 6px 10px;
    font-size: 0.8rem;
    border-radius: 4px;
    cursor: pointer;
    color: var(--mud-palette-text-primary);
}

.ribbon-token-item:hover[b-ry2o5419xr],
[b-ry2o5419xr] .ribbon-token-item:hover {
    background: var(--mud-palette-action-default-hover, rgba(0, 0, 0, 0.06));
}

/* Colour swatch grids inside the text/highlight colour menus. */
.ribbon-palette[b-ry2o5419xr] {
    display: grid;
    grid-template-columns: repeat(8, 22px);
    gap: 4px;
    padding: 8px;
}

.ribbon-swatch[b-ry2o5419xr] {
    width: 22px;
    height: 22px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 3px;
    cursor: pointer;
    padding: 0;
}

.ribbon-swatch:hover[b-ry2o5419xr] {
    outline: 2px solid var(--mud-palette-info);
}

/* "No fill / clear colour" swatch: a white square crossed by a red diagonal — the
   conventional "no colour" indicator. Clicking it removes the applied colour. */
.ribbon-swatch-clear[b-ry2o5419xr] {
    background-color: #fff;
    background-image: linear-gradient(to top right, transparent 0 calc(50% - 1px), #f44336 calc(50% - 1px) calc(50% + 1px), transparent calc(50% + 1px) 100%);
}

/* The ribbon replaces Radzen's toolbar (ShowToolbar="false") — square off the top
   corners so the canvas visually attaches to the ribbon. */
.sig-editor-shell[b-ry2o5419xr]  .rz-html-editor {
    border-radius: 0 0 4px 4px;
}

/* Editing canvas — same white-in-both-themes rule as the preview surface: signatures are
   authored against the white background emails render on, and the dark theme's inherited
   light text would wash out on it. */
.sig-editor-shell[b-ry2o5419xr]  .rz-html-editor-content {
    background: #fff;
    color: #212121;
}

/* Word-style gridlines editing aid: faint dashed outlines make borderless table structure
   visible. Outlines don't affect layout and exist only in the canvas CSS — the saved HTML
   and the sent email are untouched. */
.sig-editor-shell.show-gridlines[b-ry2o5419xr]  .rz-html-editor-content table,
.sig-editor-shell.show-gridlines[b-ry2o5419xr]  .rz-html-editor-content td,
.sig-editor-shell.show-gridlines[b-ry2o5419xr]  .rz-html-editor-content th {
    outline: 1px dashed #b8b8b8;
    outline-offset: -1px;
}

/* Hide-if-empty region cue: grays and outlines the content wrapped in a
   <!--hide-if-empty-->…<!--/hide-if-empty--> comment so the designer can see what disappears from
   sent mail when its tokens are blank. Editor-only — the "ecp-hide-if-empty" class is added by
   signatureSelection.decorateConditional and stripped by CleanEditorArtifacts before the body is
   stored or sent, so it never reaches the signature. */
.sig-editor-shell[b-ry2o5419xr]  .rz-html-editor-content .ecp-hide-if-empty {
    opacity: 0.5;
    outline: 1px dashed #1976d2;
    outline-offset: 1px;
}
/* /Pages/EmailSignature/SignaturePreviewPanel.razor.rz.scp.css */
/* CSS Isolation */
/*
    DEV note: MudBlazor does NOT play well with css-isolation
    Use div or span wrappers

    These rules live HERE, next to the markup they style, and not on the page that hosts this
    component. Blazor's CSS isolation rewrites each rule to match only elements declared in the
    matching .razor file, so leaving them on the parent page silently styled nothing once this
    markup moved into a component — the thumbnails rendered unscaled and unclipped and the
    verdict backgrounds vanished. Every element below is a plain div or iframe declared in
    SignaturePreviewPanel.razor, which is what makes the scoping work; the MudText elements use
    MudBlazor's own global classes instead, because isolation never reaches inside a child
    component's rendered output.
*/

/* One component's verdict. Deliberately NOT interactive: there is nothing to click, and a
   MudListItem's hover highlight plus click ripple made it look as though there were. */
.sig-trace-row[b-vgrcn4sa8a] {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 8px;
    margin-bottom: 8px;
    border-radius: 4px;
    border: 1px solid var(--mud-palette-lines-default);
}

/* Verdict is carried by the row background, so it reads before any text is parsed. Low-alpha tints of
   the theme's own success/error colours, so they hold up in both light and dark themes rather than
   fighting a hard-coded green/red. */
.sig-trace-included[b-vgrcn4sa8a] {
    background: rgba(var(--mud-palette-success-rgb), 0.16);
}

.sig-trace-skipped[b-vgrcn4sa8a] {
    background: rgba(var(--mud-palette-error-rgb), 0.12);
}

/* Same trick as the components list: lay the iframe out at full size, then scale it down, so the
   miniature is a faithful rendering rather than a squashed one. The fixed, clipping box is what stops
   a full-size signature from taking over the sidebar. pointer-events are off because the thumbnail is
   illustrative — nothing here responds to a click. */
.sig-trace-thumb[b-vgrcn4sa8a] {
    flex: 0 0 auto;
    width: 96px;
    height: 64px;
    overflow: hidden;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    background: #fff;
    position: relative;
}

.sig-trace-thumb-frame[b-vgrcn4sa8a] {
    width: 600px;
    height: 400px;
    border: 0;
    transform: scale(0.16);
    transform-origin: top left;
    pointer-events: none;
}

.sig-trace-thumb-empty[b-vgrcn4sa8a] {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    font-size: 0.7rem;
    text-align: center;
    color: var(--mud-palette-text-disabled);
}

/* min-width:0 lets the text column shrink inside the flex row instead of forcing it wider than the
   sidebar when a component name or reason is long. */
.sig-trace-body[b-vgrcn4sa8a] {
    min-width: 0;
}
/* /Pages/EmailSignature/SignatureUserPreviewPanel.razor.rz.scp.css */
 /* CSS Isolation */
/*
    DEV note: MudBlazor does NOT play well with css-isolation
    Use div or span wrappers

    The "why this signature" trace styles used to live here. They moved to
    SignaturePreviewPanel.razor.css when that markup became its own component: isolation rewrites
    each rule to match only elements declared in the matching .razor file, so rules left behind
    here matched nothing and the trace rendered unstyled.
*/
/* /Pages/EmailSignatureTemplate/EmailSignatureTemplateList.razor.rz.scp.css */
/* Inline template thumbnail: a fixed, clipped frame that renders the full template scaled down.
   The iframe is laid out at full size (600x400) then scaled to fit the 96x64 frame, so the preview
   is a faithful miniature of the real template. pointer-events are disabled on the iframe so the
   click lands on the container (which opens the full preview panel). */
.sig-thumb[b-d7tall7139] {
    width: 96px;
    height: 64px;
    overflow: hidden;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    background: #fff;
    cursor: pointer;
    position: relative;
}

.sig-thumb-frame[b-d7tall7139] {
    width: 600px;
    height: 400px;
    border: 0;
    transform: scale(0.16);
    transform-origin: top left;
    pointer-events: none;
}

.sig-thumb-empty[b-d7tall7139] {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    color: var(--mud-palette-text-disabled);
}
/* /Pages/Esd/EsdHome.razor.rz.scp.css */
 /* CSS Isolation */
/*
    DEV note: MudBlazor does NOT play well with css-isolation
    Use div or span wrappers
*/
/* /Pages/Esd/EsdTicketDetailPage.razor.rz.scp.css */
/* The tabs and the side column sit side by side from the medium breakpoint, stacked below it. */
.esd-ticket-main[b-5bjtjzb0i0] {
    flex: 1 1 auto;
    min-width: 0;
    width: 100%;
}

.esd-ticket-side[b-5bjtjzb0i0] {
    flex: 0 0 auto;
    width: 100%;
}

@media (min-width: 960px) {
    .esd-ticket-side[b-5bjtjzb0i0] {
        width: 380px;
    }
}
/* /Pages/Esd/EsdTicketListPage.razor.rz.scp.css */
/* The queue and its preview panel sit side by side from the medium breakpoint, stacked below it. */
.esd-queue-column[b-4ysi48888o] {
    flex: 1 1 auto;
    min-width: 0;
    width: 100%;
}

.esd-preview-column[b-4ysi48888o] {
    flex: 0 0 auto;
    width: 100%;
}

@media (min-width: 960px) {
    .esd-preview-column[b-4ysi48888o] {
        width: 360px;
    }
}
/* /Pages/Gdap/GdapOnboardingTest/GdapOnboardingTest.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Gdap/Template/ApplyGdapTemplateDialog.razor.rz.scp.css */
/* /Pages/Gdap/Template/GdapRelationshipsPanel.razor.rz.scp.css */
/* /Pages/Gdap/Template/GdapRoleSelectDialog.razor.rz.scp.css */
/* No scoped styles — MudBlazor dialogs render in a portal outside the component tree */
/* /Pages/Gdap/Template/GdapTemplateEdit.razor.rz.scp.css */
/* CSS Isolation */
/* /Pages/Gdap/Template/GdapTemplateList.razor.rz.scp.css */
/* CSS Isolation */
/* /Pages/Integrations/Components/ContactSyncIntegrationPanel.razor.rz.scp.css */
/* Contact Sync Integration Panel Styles */
/* /Pages/Integrations/Components/ContactSyncLicenseSelectionDialog.razor.rz.scp.css */
/* Contact Sync License Selection Dialog Styles */
/* /Pages/Integrations/Components/ServiceDeskIntegrationPanel.razor.rz.scp.css */
/* Service Desk Integration Panel Styles */
/* /Pages/Location/CSV/LocationImporter.razor.rz.scp.css */
.Results[b-96j2ki9azj] {
    max-height: 150px;
    overflow-y: auto;
    padding: 5px;
}

.ResultItem[b-96j2ki9azj]  {
    padding-top: 2px !important;
    padding-bottom: 2px !important;
}
/* /Pages/Location/LocationAdd.razor.rz.scp.css */
.TenantButtonContainer[b-lqyftnu0qp] {
    display: inline-block;
    margin: 5px;
}
/* /Pages/M365/DelegatedConsentTestPage.razor.rz.scp.css */
/* CSS Isolation */
.perm-detail[b-xqdqpcy9tz] {
    color: var(--mud-palette-text-secondary);
    font-size: 0.78rem;
}
/* /Pages/M365/OneDriveDelegationTestPage.razor.rz.scp.css */
/* CSS Isolation */
.perm-detail[b-0bpfqw1jgr] {
    color: var(--mud-palette-text-secondary);
    font-size: 0.78rem;
}

.onedrive-url[b-0bpfqw1jgr] {
    word-break: break-all;
}

.dev-steps[b-0bpfqw1jgr] {
    background: var(--mud-palette-background-grey);
    padding: 12px;
    border-radius: 4px;
    overflow-x: auto;
    font-size: 0.8rem;
    line-height: 1.4;
    white-space: pre;
    margin: 0;
}
/* /Pages/M365/TenantPermissionsPage.razor.rz.scp.css */
/* CSS Isolation */
.perm-detail[b-z33fuhmi3v] {
    color: var(--mud-palette-text-secondary);
}
/* /Pages/My/MyTaskList.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Newsletter/NewsletterList.razor.rz.scp.css */
/* Force card to flex column so thumbnail grows and content pins to bottom */
[b-ikyjqgp9dp] .newsletter-card {
    display: flex !important;
    flex-direction: column !important;
}

/* Thumbnail fills all available space above the card content */
.newsletter-thumbnail[b-ikyjqgp9dp] {
    flex: 1 1 auto;
    min-height: 180px;
    background-color: transparent;
}

/* "Add Newsletter" placeholder card — dashed border with centred content */
[b-ikyjqgp9dp] .newsletter-add-card {
    border: 2px dashed var(--mud-palette-primary);
    background-color: transparent !important;
}

.newsletter-add-content[b-ikyjqgp9dp] {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 280px;
    opacity: 0.7;
    transition: opacity 0.2s ease;
}

.newsletter-add-content:hover[b-ikyjqgp9dp] {
    opacity: 1;
}

/* Override MudItem to 5 columns on large screens (20% each) */
@media (min-width: 1280px) {
    [b-ikyjqgp9dp] .mud-grid > .mud-grid-item-lg-2 {
        flex-basis: 20% !important;
        max-width: 20% !important;
    }
}
/* /Pages/Notifications/DescriptionDialog.razor.rz.scp.css */
/* CSS Isolation */

/* Component-specific styles here */
/* /Pages/Notifications/UserVerificationReport.razor.rz.scp.css */
/* UserVerificationReport Styles */
/* /Pages/Policy/AdHoc/AdHocApplyTemplateWizard.razor.rz.scp.css */
fieldset.UrlContainer[b-8intp4bsn5] {
    border: 1px solid lightgrey !important;
    margin: 4px !important;
    padding: 16px !important;
    border-radius: 5px;
}

.UrlContainer legend[b-8intp4bsn5] {
    padding-left: 4px;
    padding-right: 4px;
}
/* /Pages/Policy/AdHoc/AdHocComplianceObjectsDialog.razor.rz.scp.css */
 /* CSS Isolation */
/*
    DEV note: MudBlazor does NOT play well with css-isolation
    Use div or span wrappers
*/

/* A UPN or display name can be a long unbroken token; wrap it rather than run past the dialog edge. */
.adhoc-compliance-objects-body[b-841oen9mbd] {
    overflow-wrap: anywhere;
}
/* /Pages/Policy/AdHoc/AdHocEnforcementConfirmDialog.razor.rz.scp.css */
/* The preview list wraps instead of clipping at the dialog edge, and scrolls vertically when long.
   Palette variables only, so it reads in light and dark mode. */
.adhoc-enforce-list[b-t7hc4og7gp] {
    list-style: none;
    margin: 0;
    padding: 0;
    max-height: 300px;
    overflow-y: auto;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
}

.adhoc-enforce-item[b-t7hc4og7gp] {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 6px 10px;
    border-bottom: 1px solid var(--mud-palette-divider);
    overflow-wrap: anywhere;
}

.adhoc-enforce-item:last-child[b-t7hc4og7gp] {
    border-bottom: none;
}

.adhoc-enforce-name[b-t7hc4og7gp] {
    color: var(--mud-palette-text-primary);
    font-weight: 500;
}

.adhoc-enforce-change[b-t7hc4og7gp] {
    color: var(--mud-palette-text-secondary);
    font-size: 0.8125rem;
    white-space: pre-wrap;
}
/* /Pages/Policy/AdHoc/AdHocGoldenTenantReviewPage.razor.rz.scp.css */
/* CSS Isolation — Golden Tenant review page */

[b-jxqzaudy57] .golden-warning-row {
    background-color: var(--mud-palette-warning-hover);
}
/* /Pages/Policy/AdHoc/AdHocRollbackConfirmDialog.razor.rz.scp.css */
/* A setting value can be a long unbroken token (a JSON document, a GUID list), and the old message box
   let it run past the dialog edge. Wrap it instead. MudBlazor does not play well with CSS isolation, so
   the rule targets a plain div wrapper, not the MudText inside it. */
.adhoc-rollback-body[b-uter8eglz3] {
    overflow-wrap: anywhere;
}
/* /Pages/Policy/AdHoc/AdHocSettingDetailDialog.razor.rz.scp.css */
/* Restore list styling inside HTML content rendered via MarkupString */
[b-6xp10w7uod] .content-container ul,
[b-6xp10w7uod] .content-container ol {
    list-style-position: outside;
    padding-left: 24px;
    margin-top: 8px;
    margin-bottom: 8px;
}

[b-6xp10w7uod] .content-container ul {
    list-style-type: disc;
}

[b-6xp10w7uod] .content-container ol {
    list-style-type: decimal;
}

[b-6xp10w7uod] .content-container li {
    margin-bottom: 4px;
    line-height: 1.5;
}

/* Conditional Access tabs (#5884, item 6). ::deep because the classes below sit on MudBlazor
   children as well as plain markup — the whole reason 23 rules in the CA folder were inert. */
[b-6xp10w7uod] .adhoc-detail-ca-intro {
    color: var(--mud-palette-text-secondary);
}

/* Policy documents and JSONPaths are both long. Each block scrolls inside its own container so the
   dialog, and the page behind it, never scroll sideways. */
[b-6xp10w7uod] .adhoc-detail-ca-scroll {
    overflow-x: auto;
    max-width: 100%;
}

[b-6xp10w7uod] .adhoc-detail-ca-payload {
    margin: 0;
    padding: 0.75rem;
    background-color: var(--mud-palette-background-gray);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    color: var(--mud-palette-text-primary);
    font-family: var(--mud-typography-caption-family, monospace);
    font-size: 0.8125rem;
    line-height: 1.5;
}

[b-6xp10w7uod] .adhoc-detail-ca-path,
[b-6xp10w7uod] .adhoc-detail-ca-value {
    color: var(--mud-palette-text-secondary);
    font-family: var(--mud-typography-caption-family, monospace);
}
/* /Pages/Policy/AdHoc/AdHocSettingsCatalogPage.razor.rz.scp.css */
/* Non-rectifiable / manual intervention row styling */
[b-ya1janhy48] .manual-intervention-row {
    background-color: rgba(255, 152, 0, 0.18) !important;
}
/* /Pages/Policy/AdHoc/AdHocTemplateEditPage.razor.rz.scp.css */
/* MudDataGrid group header styling */
.template-settings-group-header[b-y216j6sd0r] {
    gap: 12px;
    min-height: 36px;
}

/* Muted row style for excluded/disabled settings */
[b-y216j6sd0r] .template-settings-item-row-muted {
    opacity: 0.55;
}

/* Pending root-removal rows should appear struck through until propagation approval */
[b-y216j6sd0r] .template-settings-item-row-stale {
    text-decoration: line-through;
}

/* Non-rectifiable / manual intervention row styling */
[b-y216j6sd0r] .manual-intervention-row {
    background-color: rgba(255, 152, 0, 0.18) !important;
}

/* Published toggle wrapper */
.publish-toggle-wrapper[b-y216j6sd0r] {
    display: inline-flex;
}

/* ================================================================
   Full-width settings grid
   ================================================================ */

/* Settings MudDataGrid — compact display */
[b-y216j6sd0r] .setting-grid {
    font-size: 0.8125rem;
}
/* /Pages/Policy/AdHoc/AdHocTemplateGroupEditPage.razor.rz.scp.css */
/* Non-rectifiable / manual intervention row styling */
[b-8pm9pbt3nt] .manual-intervention-row {
    background-color: rgba(255, 152, 0, 0.18) !important;
}

/* Settings MudDataGrid — compact display */
[b-8pm9pbt3nt] .templategroup-settings-grid {
    font-size: 0.8125rem;
}
/* /Pages/Policy/AdHoc/AdHocTemplateListPage.razor.rz.scp.css */
/* Blinking dot indicator for "Updates available" chips */
.blink-dot[b-fm4bimlqmm] {
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--mud-palette-error);
    animation: blink-b-fm4bimlqmm 1s ease-in-out infinite;
    margin-right: 4px;
    vertical-align: middle;
}

@keyframes blink-b-fm4bimlqmm {
    0%, 100% { opacity: 1; }
    50% { opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
    .blink-dot[b-fm4bimlqmm] {
        animation: none;
    }
}
/* /Pages/Policy/AdHoc/AdHocTenantAssignmentPage.razor.rz.scp.css */
/* Chart datapoint tooltips — larger, high-contrast text for readability.
   MudBlazor renders tooltips as <g class="svg-tooltip"> containing <rect> + <text>.
   The <text> has inline font-size="12px" and fill="white" — override with !important. */
[b-5rlizmjycn] .mud-chart .svg-tooltip text {
    font-size: 14px !important;
    font-weight: 600 !important;
    letter-spacing: 0.02em;
}

/* Tooltip background — slightly larger, rounded, subtle shadow */
[b-5rlizmjycn] .mud-chart .svg-tooltip rect {
    rx: 6 !important;
    ry: 6 !important;
}
/* /Pages/Policy/AdHoc/AdHocTenantCompliancePage.razor.rz.scp.css */
/* Compliance item row styling for MudDataGrid RowClassFunc */
[b-epvtcewtud] .compliance-item-row-muted {
    opacity: 0.6;
}

/* License or permission restricted — greyed out to indicate the setting cannot run */
[b-epvtcewtud] .compliance-item-row-restricted {
    opacity: 0.45;
    background-color: rgba(158, 158, 158, 0.08) !important;
}

/* Non-rectifiable / manual intervention row styling */
[b-epvtcewtud] .manual-intervention-row {
    background-color: rgba(255, 152, 0, 0.18) !important;
}

/* Paused section — dims the entire compliance area */
.compliance-paused-section[b-epvtcewtud] {
    opacity: 0.4;
}

/* When Enforce mode is active, impact text turns red */
[b-epvtcewtud] .enforce-mode-active .impact-text {
    color: var(--mud-palette-error) !important;
}

/* Chart datapoint tooltips — larger, high-contrast text for readability.
   MudBlazor renders tooltips as <g class="svg-tooltip"> containing <rect> + <text>.
   The <text> has inline font-size="12px" and fill="white" — override with !important. */
[b-epvtcewtud] .mud-chart .svg-tooltip text {
    font-size: 14px !important;
    font-weight: 600 !important;
    letter-spacing: 0.02em;
}

/* Tooltip background — slightly larger, rounded, subtle shadow */
[b-epvtcewtud] .mud-chart .svg-tooltip rect {
    rx: 6 !important;
    ry: 6 !important;
}
/* /Pages/Policy/AdHoc/AdHocTrackingReportPage.razor.rz.scp.css */
/* Scoped styles for AdHocTrackingReportPage */
/* /Pages/Policy/AdHoc/CA/AdHocConditionalAccessBindingsView.razor.rz.scp.css */
/* Plain selectors, NOT ::deep — every element styled here is written in this component's own markup,
   so the scope attribute lands on it. ::deep is for reaching into a CHILD component's rendered DOM,
   and using it unnecessarily widens the selector past this component.

   Nothing here targets a Mud* element. The two requiredness chips are styled entirely through
   MudChip's Color and Variant props, which is what keeps them theme-correct without a stylesheet
   rule that could silently fail to apply. That failure mode is measured twice in this folder: 23 of
   the 31 dialog rules had never applied before 2026-09-01, and after ::deep was added 22 of the 41
   CA rules still did not, because the dialogs have no plain HTML ancestor for ::deep to anchor on.
   The dialog rules now live in wwwroot/css/app.css (#7521). */

.ca-bindings-scroll[b-gwig3ecll7] {
    overflow-x: auto;
    max-width: 100%;
}

/* JSONPaths and default values are both long and both monospace. Palette variables so they track
   the active theme rather than assuming a light ground. */
.ca-bindings-path[b-gwig3ecll7],
.ca-bindings-value[b-gwig3ecll7] {
    color: var(--mud-palette-text-secondary);
    font-family: var(--mud-typography-caption-family, monospace);
}
/* /Pages/Policy/AdHoc/CA/AdHocConditionalAccessBreakGlassDialog.razor.rz.scp.css */
/* Register an account: the object id field and the Check button share one row and centre on each
   other; the helper text sits on its own line below (#5884, DEV-02 2026-09-25). */

/* Replaces the inline min-width. flex-basis lets the field take the spare width, and min() stops a
   24rem floor overflowing a narrow dialog: there, flex-wrap drops the button below the field. */
.breakglass-register[b-e60l0mpgqk]  .breakglass-objectid {
    flex: 1 1 24rem;
    min-width: min(24rem, 100%);
}

/* The field's own helper line would be ~3px below the input box; match that, aligned with the
   field's outlined border. Colour comes from mud-text-secondary, a palette variable, so it follows
   light and dark mode. */
.breakglass-register[b-e60l0mpgqk]  .breakglass-objectid-help {
    display: block;
    margin-top: 3px;
    padding-left: 14px;
}
/* /Pages/Policy/AdHoc/CA/AdHocConditionalAccessCopiesView.razor.rz.scp.css */
/* Plain selectors: the wrapper is this component's own markup, so the scope attribute lands on it.
   Colours come from MudBlazor props and the mud-text-secondary palette class only, so the view
   follows light and dark mode with nothing to override (#5884). */

.ca-copies-scroll[b-4dglxfdzcq] {
    overflow-x: auto;
    max-width: 100%;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
}
/* /Pages/Policy/AdHoc/CA/AdHocConditionalAccessDefinitionView.razor.rz.scp.css */
/* Plain selectors, not ::deep — every element styled here is written in this component's own
   markup. Nothing targets a Mud* element, so nothing needs to reach past the isolation boundary. */

.ca-definition-scroll[b-khklflex4j] {
    overflow-x: auto;
    max-width: 100%;
}

/* Every colour is a palette variable, so the block is legible on the dark ground as well as the
   light one. A hardcoded background here is the classic way a JSON block ends up dark-on-dark. */
.ca-definition-payload[b-khklflex4j] {
    margin: 0;
    padding: 0.75rem;
    background-color: var(--mud-palette-background-gray);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    color: var(--mud-palette-text-primary);
    font-family: var(--mud-typography-caption-family, monospace);
    font-size: 0.8125rem;
    line-height: 1.5;
    white-space: pre;
}

/* PLACEHOLDER vs LITERAL. Both are bare lowercase GUIDs in the stored document and the colour is
   the only thing that separates them, so both colours are semantic — warning for "this is not the
   value a tenant gets", success for "this reaches Graph exactly as printed". Palette variables
   only: a hex here would invert wrongly the moment the theme flips. */
.ca-definition-plain[b-khklflex4j] {
    color: inherit;
}

.ca-definition-placeholder[b-khklflex4j] {
    color: var(--mud-palette-warning);
    background-color: var(--mud-palette-warning-hover);
    border-radius: 3px;
    padding: 0 3px;
    font-weight: 600;
}

.ca-definition-literal[b-khklflex4j] {
    color: var(--mud-palette-success);
    font-weight: 500;
}

.ca-definition-legend[b-khklflex4j] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.375rem 1rem;
    margin-top: 0.5rem;
    font-size: 0.75rem;
    color: var(--mud-palette-text-secondary);
}

.ca-definition-key[b-khklflex4j] {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
}

.ca-definition-key code[b-khklflex4j] {
    font-family: var(--mud-typography-caption-family, monospace);
    color: var(--mud-palette-text-primary);
}

.ca-definition-dot[b-khklflex4j] {
    display: inline-block;
    flex-shrink: 0;
    width: 8px;
    height: 8px;
    border-radius: 50%;
}

.ca-definition-dot-placeholder[b-khklflex4j] {
    background-color: var(--mud-palette-warning);
}

.ca-definition-dot-literal[b-khklflex4j] {
    background-color: var(--mud-palette-success);
}
/* /Pages/Policy/AdHoc/CA/AdHocConditionalAccessSnapshotsDialog.razor.rz.scp.css */
/* Theme-aware only: palette variables track light and dark mode. */
.adhoc-ca-snapshot-muted[b-dax6ue1620] {
    color: var(--mud-palette-text-secondary);
}
/* /Pages/Policy/PayloadComparisonDialog.razor.rz.scp.css */
.mud-dialog .outline-none[b-o22ml5ge0o] {
    height: 100%;
}

[b-o22ml5ge0o] .monaco-editor-container {
    height: 100%;
}
/* /Pages/Policy/PolicyAddFromLibraryDialog.razor.rz.scp.css */
.mud-dialog .outline-none[b-rexh63a2hh] {
    height: 100%;
}

[b-rexh63a2hh] .monaco-editor-container {
    height: 100%;
}

/* /Pages/Policy/PolicyApplyTemplateToTenantDialog.razor.rz.scp.css */
.mud-dialog .outline-none[b-ct9z9jpi0p] {
    height: 100%;
}
/* /Pages/Policy/PolicyComparisonDialog.razor.rz.scp.css */
.mud-dialog .outline-none[b-0k382zrguq] {
    height: 100%;
}

[b-0k382zrguq] .monaco-editor-container {
    height: 100%;
}
/* /Pages/Policy/PolicyManageTemplateDialog.razor.rz.scp.css */
.mud-dialog .outline-none[b-its7onhuph] {
    height: 100%;
}

[b-its7onhuph] .monaco-editor-container {
    height: 100%;
}
/* /Pages/Policy/PolicyTemplateEditComponent.razor.rz.scp.css */
.split[b-vb6kzkghx1] {
    height: 100%;
    width: 50%;
    position: fixed;
    z-index: 1;
    top: 0;
    overflow-x: hidden;
    padding-top: 20px;
    border: solid;
    background: border-box;
    border-style: groove;
    border-width: thin;
    box-shadow: rgba(0,0,0,0.2) 0px 0px 5px 0px;
}

.right[b-vb6kzkghx1] {
    right: 0;
    background-color: white;
}
/* /Pages/Policy/PolicyTemplateEditPage.razor.rz.scp.css */
.split[b-9qh9vpn7oo] {
    height: 100%;
    width: 50%;
    position: fixed;
    z-index: 1;
    top: 0;
    overflow-x: hidden;
    padding-top: 20px;
    border: solid;
    background: border-box;
    border-style: groove;
    border-width: thin;
    box-shadow: rgba(0,0,0,0.2) 0px 0px 5px 0px;
}

.right[b-9qh9vpn7oo] {
    right: 0;
    background-color: white;
}
/* /Pages/Policy/PolicyViewerEditorDialog.razor.rz.scp.css */
.mud-dialog .outline-none[b-45ur9j2b8z] {
    height: 100%;
}

[b-45ur9j2b8z] .monaco-editor-container {
    height: 100%;
}
/* /Pages/Policy/TenantPolicyVariableEditComponent.razor.rz.scp.css */
 /* CSS Isolation */
[b-u8ig3sudvi] .mud-table-dense * .mud-table-row .mud-table-cell {
    padding: 2px !important;
}
/* /Pages/Preview/Preview.razor.rz.scp.css */
/* CSS Isolation */

.Book[b-bqpfiwivvq] {
    font-size: larger;
    font-weight: bolder;
}

.Book1[b-bqpfiwivvq] {
    /* background: red;*/
}

.Book2[b-bqpfiwivvq] {
    /*background: orangered;*/
}

.Book3[b-bqpfiwivvq] {
    /*background: orange;*/
}

.Book4[b-bqpfiwivvq] {
    /*background: yellow;*/
}

.Book5[b-bqpfiwivvq] {
    /*background: yellowgreen;*/
}

.Book6[b-bqpfiwivvq] {
    /*background: green;*/
}

.Link[b-bqpfiwivvq],
a[b-bqpfiwivvq] {
    margin: 10px;
    padding: 5px;
    border: 1px solid grey;
    background: whitesmoke;
    cursor: pointer;
    box-shadow: 0 8px 10px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
}

.Link:hover[b-bqpfiwivvq]{
    box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
}


/* Remove default list styles (bullets and margins) */
.Vertical-Menu[b-bqpfiwivvq] {
    list-style-type: none; /* Remove bullet points */
    padding: 0; /* Remove default padding */
    margin: 0; /* Remove default margin */
    justify-content: center; /* Center the menu items horizontally */
    z-index: 1111;
}

.Horizontal-Menu[b-bqpfiwivvq] {
    list-style-type: none; /* Remove bullet points */
    padding: 0; /* Remove default padding */
    margin: 0; /* Remove default margin */
    display: flex; /* Use flexbox to display items in a row */
    justify-content: center; /* Center the menu items horizontally */
}

    /* Style each list item */
    .Horizontal-Menu li[b-bqpfiwivvq] {
        margin-right: 20px; /* Space between menu items */
    }

.Vertical-Menu li[b-bqpfiwivvq] {
    margin-bottom: 5px;
}

/* Remove margin from the last item */
.Horizontal-Menu li:last-child[b-bqpfiwivvq] {
    margin-right: 0;
}

/* Style links */
.Link[b-bqpfiwivvq],
.Vertical-Menu a[b-bqpfiwivvq],
.Horizontal-Menu a[b-bqpfiwivvq] {
    text-decoration: none; /* Remove underline from links */
    color: orange; /* Dark gray text color */
    font-weight: bold; /* Make text bold */
    padding: 10px 20px; /* Add some padding around the text */
    display: block; /* Make the link fill the entire list item */
    border-radius: 5px; /* Add rounded corners */
    transition: background-color 0.3s; /* Smooth background transition on hover */
}

    /* Add hover effect */
    .Link:hover[b-bqpfiwivvq],
    .Vertical-Menu a:hover[b-bqpfiwivvq],
    .Horizontal-Menu a:hover[b-bqpfiwivvq] {
        background-color: orange; /* Blue background on hover */
        color: #333; /* White text on hover */
    }

    /* Optional: Add a border or highlight to the active menu item */
    .Vertical-Menu a.active[b-bqpfiwivvq],
    .Horizontal-Menu a.active[b-bqpfiwivvq] {
        background-color: whitesmoke; /* Blue background for active link */
        color: orange; /* text for active link */
    }


/* Style for the floating link container */
.Floater[b-bqpfiwivvq] {
    position: fixed; /* Fixed position relative to the viewport */
    /*right: 20px;*/ /* 20px from the right edge of the screen */
    /*bottom: 20px;*/ /* 20px from the bottom edge of the screen */
    background-color: transparent; /* Background color of the link */
    padding: 10px 15px; /* Add some padding around the link */
    /* border-radius: 50px; /* Rounded corners for a pill shape */
    /* box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.2); /* Optional shadow effect */
    z-index: 10000; /* Make sure the floating link appears above other content */
    transition: background-color 0.3s ease; /* Smooth background color change */
}

.Floating-Trial[b-bqpfiwivvq] {
    right: 20px;
    top: 30px;
}

.Floating-Link[b-bqpfiwivvq] {
    right: 20px;
    bottom: 20px;
}

.Floating-Menu[b-bqpfiwivvq] {
    left: 20px;
    top: 250px;
    text-align: center;
}

/* Style for the link itself */
.Floating-Trial a[b-bqpfiwivvq],
.Floating-Link a[b-bqpfiwivvq] {
    color: orange; /* White text color */
    text-decoration: none; /* Remove underline */
    font-size: 16px; /* Set a reasonable font size */
    font-weight: bold; /* Make the link bold */
    display: block; /* Make the link fill the entire container */
    text-align: center; /* Center the text inside the link */
}

/* Hover effect */
.Floating-Trial:hover[b-bqpfiwivvq],
.Floating-Link:hover[b-bqpfiwivvq] {
    background-color: transparent; /* Darker blue on hover */
}
/* /Pages/Preview/SubscriptionMenuEdit.razor.rz.scp.css */
 /* CSS Isolation */

.GroupRow[b-uwss5vpq2y] {
    background: grey !important;
}

th .GroupRowButtons[b-uwss5vpq2y] {
    text-align: end !important;
}
/* /Pages/Room/RoomList.razor.rz.scp.css */
/* CSS isolation for the Rooms list page. Styling is handled by MudBlazor utility classes. */
/* /Pages/ScheduledTasks/ScheduledTaskList.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/ScheduledTasks/ScheduledTaskListRoot.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Search/DocumentSearch.razor.rz.scp.css */
/* EcpBot answer card — typography for the MudMarkdown-rendered content.
   ::deep is required because MudMarkdown emits its own (non-scoped) elements. */

.ecpbot-answer[b-k5qz6q133g]  h1,
.ecpbot-answer[b-k5qz6q133g]  h2,
.ecpbot-answer[b-k5qz6q133g]  h3,
.ecpbot-answer[b-k5qz6q133g]  h4 {
    margin-top: 1.1rem;
    margin-bottom: 0.4rem;
    font-weight: 600;
    line-height: 1.3;
}

.ecpbot-answer[b-k5qz6q133g]  h1 { font-size: 1.4rem; }
.ecpbot-answer[b-k5qz6q133g]  h2 { font-size: 1.25rem; }
.ecpbot-answer[b-k5qz6q133g]  h3 { font-size: 1.1rem; }
.ecpbot-answer[b-k5qz6q133g]  h4 { font-size: 1rem; }

.ecpbot-answer[b-k5qz6q133g]  p {
    margin: 0.5rem 0;
    line-height: 1.6;
}

.ecpbot-answer[b-k5qz6q133g]  ul,
.ecpbot-answer[b-k5qz6q133g]  ol {
    margin: 0.5rem 0;
    padding-left: 1.6rem;
}

.ecpbot-answer[b-k5qz6q133g]  li {
    margin: 0.25rem 0;
    line-height: 1.6;
}

.ecpbot-answer[b-k5qz6q133g]  li > p {
    margin: 0.15rem 0;
}

.ecpbot-answer[b-k5qz6q133g]  code {
    background-color: rgba(0, 0, 0, 0.06);
    padding: 0.1rem 0.35rem;
    border-radius: 3px;
    font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    font-size: 0.9em;
}

.ecpbot-answer[b-k5qz6q133g]  pre {
    background-color: rgba(0, 0, 0, 0.06);
    padding: 0.75rem 1rem;
    border-radius: 6px;
    overflow-x: auto;
    margin: 0.75rem 0;
}

.ecpbot-answer[b-k5qz6q133g]  pre code {
    background: transparent;
    padding: 0;
    font-size: 0.9rem;
}

.ecpbot-answer[b-k5qz6q133g]  blockquote {
    border-left: 3px solid var(--mud-palette-secondary);
    margin: 0.75rem 0;
    padding: 0.25rem 1rem;
    color: var(--mud-palette-text-secondary);
}

.ecpbot-answer[b-k5qz6q133g]  table {
    border-collapse: collapse;
    margin: 0.75rem 0;
    width: 100%;
}

.ecpbot-answer[b-k5qz6q133g]  th,
.ecpbot-answer[b-k5qz6q133g]  td {
    border: 1px solid var(--mud-palette-lines-default);
    padding: 0.4rem 0.7rem;
    text-align: left;
}

.ecpbot-answer[b-k5qz6q133g]  th {
    background-color: rgba(0, 0, 0, 0.04);
    font-weight: 600;
}

.ecpbot-answer[b-k5qz6q133g]  a {
    color: var(--mud-palette-secondary);
    text-decoration: none;
}

.ecpbot-answer[b-k5qz6q133g]  a:hover {
    text-decoration: underline;
}

.ecpbot-answer[b-k5qz6q133g]  hr {
    border: none;
    border-top: 1px solid var(--mud-palette-lines-default);
    margin: 1rem 0;
}

/* Tighten the very first/last element so the card padding does the work. */
.ecpbot-answer[b-k5qz6q133g]  > :first-child {
    margin-top: 0;
}

.ecpbot-answer[b-k5qz6q133g]  > :last-child {
    margin-bottom: 0;
}
/* /Pages/ServiceDesk/ServiceDeskTrackingReport.razor.rz.scp.css */
/* Ensure MudDataGrid child row content uses full width */
[b-v39ee7agli] .mud-table-child-content {
    width: 100%;
}
/* /Pages/ServiceDesk/TicketActionTriage.razor.rz.scp.css */
/* CSS Isolation */
/*
    DEV note: MudBlazor does NOT play well with css-isolation
    Use div or span wrappers
*/
/* /Pages/Settings/FallbackHtmlPreviewDialog.razor.rz.scp.css */
/* Make the preview area large so the fallback HTML has room to show. */
.fallback-html-preview[b-lp5m52yl21] {
    min-height: 70vh;
    overflow: auto;
}
/* /Pages/Settings/PageTenantPermissions.razor.rz.scp.css */
 /* CSS Isolation */

/* The left panel is natural height (the reference). The middle and right
   panels stretch to match it via the grid's default align-items:stretch.
   Their MudPaper carries inline "position:relative; overflow:hidden" (inline
   so it survives CSS-isolation scoping on the component root). The content
   below sits in an absolutely-positioned overlay so a long list can never
   push the row taller than the left panel — it scrolls internally instead.
   This keeps all three panels exactly equal height. */
.panel-body[b-w0jweevoiz] {
    position: absolute;
    inset: 0;
    padding: 16px;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

/* The panel height (calc(100vh - 300px)) lives INLINE on each MudPaper's Style attribute, NOT
   here. MudBlazor renders its own root element, which CSS-isolation does NOT stamp with this
   component's scope attribute, so an isolated class like `.left-panel` never matches a MudPaper
   root — only inline Style (immune to scoping) reliably reaches it. A fixed height (not
   max-height) keeps the panel full-height even with only a few rows; the internal lists scroll,
   so it never clips. The middle/right panels carry the same inline height. */

/* Make the tab body fill the panel below the search so the list grows to the
   panel's full height (no bottom gap) and scrolls internally. The legend is a
   sibling after the tabs, so it stays pinned and visible. */
.left-panel[b-w0jweevoiz]  .mud-tabs {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

.left-panel[b-w0jweevoiz]  .mud-tabs-panels {
    flex: 1 1 auto;
    min-height: 0;
    overflow: hidden;
    display: flex;
    flex-direction: column;
}

.left-panel[b-w0jweevoiz]  .mud-tab-panel {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

.page-tree[b-w0jweevoiz] {
    flex: 1 1 auto;
    min-height: 0;
    max-height: calc(100vh - 440px);
    overflow-y: auto;
}

.legend-dot[b-w0jweevoiz] {
    font-size: 0.9rem;
    line-height: 1;
    margin-right: -0.5rem;
}

.legend-gated[b-w0jweevoiz] {
    color: var(--mud-palette-error);
}

.legend-contains[b-w0jweevoiz] {
    color: #9c27b0;
}

/* Gated-pages quick list (Gated tab). Same scroll box as the tree so switching
   tabs keeps the left panel a stable height. */
.gated-list[b-w0jweevoiz] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    max-height: calc(100vh - 440px);
    overflow-y: auto;
}

.gated-item[b-w0jweevoiz] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.25rem 0.5rem;
    border-radius: var(--mud-default-borderradius);
    cursor: pointer;
    color: var(--mud-palette-text-primary);
}

.gated-item:hover[b-w0jweevoiz] {
    background-color: var(--mud-palette-action-default-hover);
}

.gated-item.selected[b-w0jweevoiz] {
    background-color: var(--mud-palette-primary-hover);
}

.gated-item-icon[b-w0jweevoiz] {
    flex: 0 0 auto;
}

.gated-item-text[b-w0jweevoiz] {
    flex: 1 1 auto;
    font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
    font-size: 0.8rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.gated-item-count[b-w0jweevoiz] {
    flex: 0 0 auto;
    font-size: 0.75rem;
    opacity: 0.8;
}

/* Permission rows (required + available) */
.perm-list[b-w0jweevoiz] {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    overflow: hidden;
    /* This list is a direct flex child of the column-flex .panel-body. Because it has
       overflow:hidden, its automatic flex min-size is 0 (per the flex spec), so when the
       panel content is taller than the panel the flex algorithm would otherwise squeeze it
       to zero height and clip the row entirely. Pin it so it always keeps its content height
       (the available-perms list scrolls inside .perm-scroll, so this never starves that). */
    flex: 0 0 auto;
}

.perm-row[b-w0jweevoiz] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.25rem 0.25rem 0.25rem 0.75rem;
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

.perm-row:last-child[b-w0jweevoiz] {
    border-bottom: none;
}

.perm-row:hover[b-w0jweevoiz] {
    background-color: var(--mud-palette-action-default-hover);
}

.perm-row-icon[b-w0jweevoiz] {
    flex: 0 0 auto;
    color: var(--mud-palette-text-secondary);
}

.perm-value[b-w0jweevoiz] {
    flex: 1 1 auto;
    font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
    font-size: 0.85rem;
}

/* Middle-panel chrome above the available-permissions list (route header, impact, required
   permissions, add-permission heading + search) — pinned at the top at its natural height so
   nothing between the header and the list can grow/push it down, exactly like the right panel's
   .fallback-chrome. The available list (.perm-scroll) is the single grower below it. */
.perm-chrome[b-w0jweevoiz] {
    flex: 0 0 auto;
}

/* Available-permissions area fills the remaining panel height and scrolls. */
.perm-scroll[b-w0jweevoiz] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

/* Fallback HTML editor fills the remaining panel height.
   A plain textarea (not MudTextField) is used here deliberately: it is a
   scoped element we fully control, so it fills reliably without depending on
   MudBlazor's internal input DOM via ::deep (which would not bind reliably). */
.fallback-html[b-w0jweevoiz] {
    flex: 20 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

/* Chrome above the fallback body (heading, hint, component dropdown) — fixed height
   at the top so nothing between the dropdown and the example can grow/push it down. */
.fallback-chrome[b-w0jweevoiz] {
    flex: 0 0 auto;
}

/* Live example of the selected fallback component. Fills the space directly under
   the dropdown (the component renders at the top of this box), scrolls if tall. */
.fallback-preview[b-w0jweevoiz] {
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    padding: 12px;
}

/* The example component (PermissionUpgradeFallback) uses a top margin meant for the
   real full-page fallback; pull it tight under the dropdown in this preview context. */
.fallback-preview[b-w0jweevoiz]  .mud-container {
    margin-top: 0 !important;
}

.fallback-textarea[b-w0jweevoiz] {
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
    resize: none;
    border: 1px solid var(--mud-palette-lines-inputs);
    border-radius: var(--mud-default-borderradius);
    padding: 12px;
    font-family: inherit;
    font-size: 0.875rem;
    line-height: 1.4;
    background: transparent;
    color: var(--mud-palette-text-primary);
}

.fallback-textarea:focus[b-w0jweevoiz] {
    outline: none;
    border-color: var(--mud-palette-primary);
    border-width: 2px;
    padding: 11px;
}
/* /Pages/Subscription/SubscriptionAuthorityButton.razor.rz.scp.css */
/* Spacing for the button, wherever it is hosted - the page header on the tabbed edit page, the
   licenses banner on the workflow one. Deliberately NOT on the button itself: MudTooltip
   anchors its popover to the element it wraps, so a margin there widens the anchor box and the
   tooltip is placed that much further from the button. */
.authority-button[b-zo1yy60p5v] {
    display: inline-flex;
    margin-left: 16px;
}

/* The Authority config tooltip's surface. MudTooltip is set to Color.Transparent so its own
   one-line dark strip does not sit behind this, which leaves the card AND its arrow to be drawn
   here - a MudTooltip arrow takes its colour from the tooltip, so a transparent tooltip has an
   invisible one. Palette variables, not literals, so the card follows the active theme.
   The negative margin cancels .mud-tooltip's own 4px/8px padding, which would otherwise sit
   between this card's edge and the arrow anchored to it. */
.authority-tooltip[b-zo1yy60p5v] {
    position: relative;
    width: 500px;
    margin: -4px -8px;
    padding: 16px;
    text-align: left;
    white-space: normal;
    border-radius: var(--mud-default-borderradius);
    background-color: var(--mud-palette-surface);
    box-shadow: var(--mud-elevation-8);
}

/* Points back at the button. Placement.Left puts the card to the button's left, so the arrow sits
   on the card's right edge, centred vertically. 10px is the exact gap MudBlazor translates a
   Left-placed tooltip away from its owner, so the arrow lands on the button rather than floating
   short of it. The drop shadow is what makes it visible at all - the card is surface-coloured and
   so is the page behind the gap, leaving an unshadowed triangle white on white. */
.authority-tooltip[b-zo1yy60p5v]::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 100%;
    margin-top: -10px;
    border: 10px solid transparent;
    border-left-color: var(--mud-palette-surface);
    filter: drop-shadow(2px 0 1px rgba(0, 0, 0, 0.16));
}
/* /Pages/Subscription/SubscriptionAuthorityEditDialog.razor.rz.scp.css */
/* The cell whose addresses will actually be asked is outlined in the success colour, so the
   grid answers "which of these counts?" at a glance without reading the summary. ::deep because
   the outline lives on MudTextField's own elements, which this component does not render. */
[b-fozon69x6g] .authority-in-effect .mud-input-outlined-border {
    border-color: var(--mud-palette-success);
    border-width: 2px;
}

[b-fozon69x6g] .authority-in-effect .mud-input-label {
    color: var(--mud-palette-success);
}

[b-fozon69x6g] .authority-asked-label {
    min-width: 10rem;
}
/* /Pages/Subscription/SubscriptionTenantEdit/ScheduledItems.razor.rz.scp.css */
/* Alignment is no longer done here.

   This grid was a hand-written MudSimpleTable whose columns were aligned by the legacy global
   HeadAlignCentre / TryCentre classes. Those align the header and the cell through SEPARATE rules,
   so the two drifted apart, and a :first-child rule hard-coded whichever column happened to be
   first — which is how Request ID ended up with a left header in a row of centred ones.

   It is now an EcpGrid: each column declares Alignment (and optionally HeaderAlignment), and
   EcpGridColumn / EcpGridTemplateColumn apply the GridLeft / GridCentre / GridRight class to the
   header AND the cell from that one setting. A header and its cell can no longer disagree. */
/* /Pages/Subscription/SubscriptionTenantEdit/SubscriptionTenantEdit.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/SupportUser/BulkSupportUserCreate.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/TaskType/TaskTypeList.razor.rz.scp.css */
/* CSS Isolation */
/* /Pages/Templates/TemplateComponentBlank.razor.rz.scp.css */
/* CSS Isolation */
/* 
    DEV note: MudBlazor does NOT play well with css-isolation 
    Use div or span wrappers
*/
/* /Pages/Templates/TemplatePageBlank.razor.rz.scp.css */
 /* CSS Isolation */
/* 
    DEV note: MudBlazor does NOT play well with css-isolation 
    Use div or span wrappers
*/
/* /Pages/Tenant/Add/CustomerAcknowledgementDialog.razor.rz.scp.css */
.MarkDownContainer[b-375h3s3ghh] {
    border: grey solid 2px;
    border-radius: 15px;
    padding: 5px;
    margin-top: 5px;
    margin-bottom: 5px;
}

.HtmlContainer[b-375h3s3ghh] {
    border: grey solid 2px;
    border-radius: 15px;
    padding: 5px;
    margin-top: 5px;
    margin-bottom: 5px;
}

.HR[b-375h3s3ghh] {
    min-width: 90vw;
}
/* /Pages/Tenant/Bulk/BulkUnmanagedTenantOnboard.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/Tenant/Components/OnboardingDiagnosticsDialog.razor.rz.scp.css */
.onboarding-diagnostics-detail[b-iw6lyllwei] {
    white-space: pre-wrap;
    word-break: break-word;
    font-size: 0.75rem;
    background: var(--mud-palette-background-grey);
    padding: 6px 8px;
    border-radius: 4px;
    margin: 4px 0 0 0;
}
/* /Pages/Tenant/Components/TenantTagColorSwatch.razor.rz.scp.css */
/* The swatch fill comes from an inline style (it is data); everything else lives here.
   The element is a <button>, so the browser's own padding and font are reset away - the swatch
   is a colour surface, not a labelled control. */
.TenantTagColorSwatch[b-7fzuvktmth] {
    width: 36px;
    height: 36px;
    padding: 0;
    margin: 0;
    font: inherit;
    border-radius: 6px;
    border: 2px solid transparent;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
}

.TenantTagColorSwatch:hover[b-7fzuvktmth] {
    border-color: var(--mud-palette-lines-default);
}

/* Keyboard focus must be visible: the hover border alone never appears for a keyboard user. */
.TenantTagColorSwatch:focus-visible[b-7fzuvktmth] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: 2px;
}

.TenantTagColorSwatch.Selected[b-7fzuvktmth] {
    border-color: var(--mud-palette-text-primary);
}
/* /Pages/Tenant/NamedLocations/NamedLocations.razor.rz.scp.css */
:host[b-y67hqg9uzw] {
  /* CSS Isolation: placeholder to satisfy linter; styles TBD */
}
/* /Pages/Tenant/NamedLocations/NamedLocationsEditDialog.razor.rz.scp.css */
.MarkDownContainer[b-b1wptj3zu7] {
    border: grey solid 2px;
    border-radius: 15px;
    padding: 5px;
    margin-top: 5px;
    margin-bottom: 5px;
}

.HtmlContainer[b-b1wptj3zu7] {
    border: grey solid 2px;
    border-radius: 15px;
    padding: 5px;
    margin-top: 5px;
    margin-bottom: 5px;
}

.HR[b-b1wptj3zu7] {
    min-width: 90vw;
}

.Progress[b-b1wptj3zu7] {
    display: flex;
    align-items: center; 
    justify-content: center;
    height: 70vh;
}
/* /Pages/Tenant/TenantSubscribeBillingOnlyV2.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/TestHarness/AdaptiveCards/AdaptiveCardsTestHarness.razor.rz.scp.css */
/* Adaptive Cards Test Harness Styles */

.preview-container[b-e8qm1g1l75] {
    min-height: 200px;
    padding: 16px;
    border-radius: 8px;
    background-color: #f8f9fa;
    position: relative;
}

.preview-teams[b-e8qm1g1l75] {
    background-color: #f3f2f1;
    border: 1px solid #e1dfdd;
}

.preview-outlook[b-e8qm1g1l75] {
    background-color: #faf9f8;
    border: 1px solid #edebe9;
}

.preview-copilot[b-e8qm1g1l75] {
    background-color: #f5f4f7;
    border: 1px solid #e5e3e8;
}

.preview-default[b-e8qm1g1l75] {
    background-color: #ffffff;
    border: 1px solid #e0e0e0;
}

.card-preview-content[b-e8qm1g1l75] {
    min-height: 150px;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    flex-direction: column;
}

.editor-container[b-e8qm1g1l75] {
    width: 100%;
    height: 100%;
}

/* Custom scrollbar for code editors */
.editor-container [b-e8qm1g1l75]::-webkit-scrollbar {
    width: 8px;
    height: 8px;
}

.editor-container [b-e8qm1g1l75]::-webkit-scrollbar-track {
    background: #f1f1f1;
    border-radius: 4px;
}

.editor-container [b-e8qm1g1l75]::-webkit-scrollbar-thumb {
    background: #c1c1c1;
    border-radius: 4px;
}

.editor-container [b-e8qm1g1l75]::-webkit-scrollbar-thumb:hover {
    background: #a8a8a8;
}

/* Adaptive Card Preview Styling */
#adaptive-card-preview .ac-container[b-e8qm1g1l75] {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    font-size: 14px;
    line-height: 1.4;
}

/* Teams-specific styling */
.preview-teams #adaptive-card-preview[b-e8qm1g1l75] {
    color: #252423;
}

.preview-teams #adaptive-card-preview .ac-container[b-e8qm1g1l75] {
    background: white;
    border-radius: 8px;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    padding: 16px;
}

/* Outlook-specific styling */
.preview-outlook #adaptive-card-preview[b-e8qm1g1l75] {
    color: #323130;
}

.preview-outlook #adaptive-card-preview .ac-container[b-e8qm1g1l75] {
    background: white;
    border: 1px solid #edebe9;
    border-radius: 4px;
    padding: 16px;
}

/* CoPilot-specific styling */
.preview-copilot #adaptive-card-preview[b-e8qm1g1l75] {
    color: #201f1e;
}

.preview-copilot #adaptive-card-preview .ac-container[b-e8qm1g1l75] {
    background: white;
    border: 1px solid #e1dfdd;
    border-radius: 6px;
    padding: 12px;
}

/* Error state styling */
.card-preview-error[b-e8qm1g1l75] {
    background-color: #fef2f2;
    border: 1px solid #fecaca;
    color: #dc2626;
    padding: 16px;
    border-radius: 8px;
    text-align: center;
}

/* Loading state */
.card-preview-loading[b-e8qm1g1l75] {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 150px;
}

/* Header row alignment */
.header-actions[b-e8qm1g1l75] {
    display: flex;
    gap: 8px;
    align-items: center;
}

/* Responsive adjustments */
@media (max-width: 1200px) {
    .preview-container[b-e8qm1g1l75] {
        margin-top: 16px;
    }
}

@media (max-width: 768px) {
    .editor-container[b-e8qm1g1l75] {
        height: 300px;
    }
    
    .preview-container[b-e8qm1g1l75] {
        margin-top: 16px;
        padding: 12px;
    }
}

/* Code block styling for JSON display */
.mud-code[b-e8qm1g1l75] {
    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
    font-size: 12px;
    line-height: 1.4;
}

/* Expansion panel customization */
.mud-expand-panel .mud-expand-panel-header[b-e8qm1g1l75] {
    padding: 12px 16px;
}

.mud-expand-panel .mud-expand-panel-content[b-e8qm1g1l75] {
    padding: 0 16px 16px 16px;
}
/* /Pages/TestHarness/ContactSync/ContactSyncTestHarness.razor.rz.scp.css */
body[b-qd9i1aobw2] {
}
/* /Pages/TestHarness/EcpPickerTests/EcpPickerTests.razor.rz.scp.css */
/* CSS Isolation */
/* /Pages/User/Components/UserListHeader.razor.rz.scp.css */
/* One uniform control height across the header action row so the outlined text buttons,
   borderless icon buttons and the Add User menu button all align on the same baseline.
   MudBlazor gives each control type its own natural height, which no utility class fixes. */

[b-5sm5krqt4s] .mud-button-root {
    height: 36px;
}

/* Icon buttons: fixed square, with the icon (or busy spinner) dead-centre. The label span
   and the svg itself must also be flexed/blocked — an inline svg sits on the text baseline,
   which reads as the icon hanging a few pixels off-centre. */
[b-5sm5krqt4s] .mud-icon-button {
    width: 36px;
    padding: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

[b-5sm5krqt4s] .mud-icon-button .mud-icon-button-label {
    display: flex;
    align-items: center;
    justify-content: center;
}

[b-5sm5krqt4s] .mud-icon-button .mud-icon-root {
    display: block;
}
/* /Pages/User/Security/UserIdentityVerification.razor.rz.scp.css */

.Verify button[b-ot2m3fcx11] {
    min-width: 240px;
}
/* /Pages/User/Security/UserSecurityDialog.razor.rz.scp.css */
@keyframes fadeOut-b-6d7cfrz0sv {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

[b-6d7cfrz0sv] .fade-alert {
    animation: fadeOut-b-6d7cfrz0sv 0.5s ease-in-out 2.5s forwards;
}

[b-6d7cfrz0sv] .user-security-dialog-content {
    height: 600px;
}
/* /Pages/User/UserLicenseAssignedList.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/User/UserVerificationDetailsDialog.razor.rz.scp.css */
/* CSS Isolation */

/* Component-specific styles here */
/* /Pages/UserActionItem/ActionItemEventConfiguration.razor.rz.scp.css */
/* CSS Isolation */
/* /Pages/UserActionItem/UserActionItemAdd.razor.rz.scp.css */
/* /Pages/UserCalendarPermissions/UserCalendarPermissionsEdit.razor.rz.scp.css */
.strikethrough[b-c3lhe3olg2] {
    text-decoration-line: line-through;
    text-decoration-color: #ff0258cc;
}
/* /Pages/UserMail/Edit/ExchangeSettings.razor.rz.scp.css */
 /* CSS Isolation */
/* /Pages/UserMail/Edit/SearchForwardingAddressDialog.razor.rz.scp.css */
.EmailList[b-cvbmrzh56w] {
    overflow-y: auto;
    overflow-x: hidden;
    border-bottom: solid lightgrey 1px;
    margin-bottom: 4px;
    height: 75vh;
}

.EmailItem[b-cvbmrzh56w] {
    border: solid lightgrey 1px;
    cursor: pointer;
    margin: 4px;
    padding: 8px;
    -moz-box-shadow: 1px 2px 1px lightgrey;
    -webkit-box-shadow: 1px 2px 1px lightgrey;
    box-shadow: 1px 2px 1px lightgrey;
}
.EmailItem:hover[b-cvbmrzh56w] {
    background: rgb(235, 231, 231)!important;
}

.Selected[b-cvbmrzh56w] {
    background: rgb(199, 244, 199) !important;
}
/* /Pages/UserMail/UserMailTrust.razor.rz.scp.css */
.GridWidthMax[b-zocj0gxs12] {
    width: 1200px;
    max-width: 1200px;
}
/* /Pages/Version/VersionList.razor.rz.scp.css */
.access-chip[b-o6dnt4x07k] {
    min-width: 80px;
}

[b-o6dnt4x07k] .delete-menu-item {
    color: var(--mud-palette-error);
}
/* /Pages/Workflow/Bulk/BulkWorkflowAdd.razor.rz.scp.css */
/* Layout (sidebar/content/footer/scroll) is owned by the shared EcpWizard shell — only
   page-specific styling lives here. All rules are ::deep because they style Mud
   components; the scope attribute lives on the page's .bulk-wizard-host wrapper div
   (see BulkWorkflowAdd.razor). */

/* "Chosen so far" chip strip. The min-height that reserves the row before the first
   selection lives INLINE in the markup (a cached styles bundle must not be able to
   collapse it); flex-none keeps the strip out of the grid steps' flex growth, and
   nowrap holds it to one line (the view model counts rather than listing). */
[b-e8d20ul1zw] .selection-chips {
    display: flex;
    flex: 0 0 auto;
    flex-wrap: nowrap;
    align-items: center;
    gap: 6px;
    overflow: hidden;
}

/* A single long name (a group or license titled in full) shortens with an ellipsis rather
   than wrapping the strip onto a second row. */
[b-e8d20ul1zw] .selection-chips .EcpChip {
    min-width: 0;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

/* Grid steps: the grid takes the space left under the step heading and scrolls its ROWS
   only, so the toolbar, column headers and the Back/Next footer never move. Relies on
   the shell's .wizard-content being a flex column with overflow hidden. */
[b-e8d20ul1zw] .wizard-grid {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

[b-e8d20ul1zw] .wizard-grid .mud-table-container {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

/* Schedule step: a date and a time are short values — sized to their content instead of
   stretching to fill the pane (MudStack rows stretch children by default). */
[b-e8d20ul1zw] .schedule-date {
    flex: 0 0 auto;
    width: 200px;
}

[b-e8d20ul1zw] .schedule-time {
    flex: 0 0 auto;
    width: 140px;
}

[b-e8d20ul1zw] .attr-field {
    flex-grow: 1;
    border-radius: 4px;
    padding: 0 6px;
}

/* Attribute will be SET on every selected user */
[b-e8d20ul1zw] .attr-changed {
    background: var(--mud-palette-primary-hover);
}

/* Attribute will be CLEARED on every selected user */
[b-e8d20ul1zw] .attr-clear {
    background: var(--mud-palette-error-hover);
}

/* Single-select manager list: the picked row keeps the primary tint (MudDataGrid has no
   single-selection highlight of its own). */
[b-e8d20ul1zw] .manager-row--selected > td {
    background-color: var(--mud-palette-primary-hover);
}

/* Operation cards: hover = neutral tint + primary border; selected = primary tint so the
   two states read differently at a glance. */
[b-e8d20ul1zw] .op-card {
    border: 2px solid var(--mud-palette-lines-default);
    transition: border-color 0.15s ease, background-color 0.15s ease;
}

[b-e8d20ul1zw] .op-card:hover {
    border-color: var(--mud-palette-primary);
    background-color: var(--mud-palette-action-default-hover);
}

[b-e8d20ul1zw] .op-card--selected {
    border-color: var(--mud-palette-primary);
    background-color: var(--mud-palette-primary-hover);
}

[b-e8d20ul1zw] .op-card--selected:hover {
    background-color: var(--mud-palette-primary-hover);
}

/* The "not available for this tenant" section: visibly present but completely inert —
   pointer-events none also suppresses the shared .op-card hover styling. */
[b-e8d20ul1zw] .op-card--disabled {
    opacity: 0.55;
    pointer-events: none;
}

/* Off-board template step panels: what the selected template will run, beside the
   picker, with the per-step option editors. Takes the width and height left in the pane
   (a flex column on this step, like the grid steps) and scrolls internally so the
   footer never moves. */
[b-e8d20ul1zw] .template-preview {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    flex: 1 1 auto;
    min-width: 320px;
    min-height: 0;
    overflow-y: auto;
}

/* /Pages/Workflow/Bulk/BulkWorkflowDetail.razor.rz.scp.css */
/*
    A run and its detail are one thing to the operator, so the separator moves off the run's
    own cells and onto the child cell — one line under the pair instead of a line between them.

    MudDataGrid emits the ChildRowContent cell for EVERY row when there is no HierarchyColumn,
    so a clean run still gets an empty <td>. With no padding it collapses to nothing and its
    border lands directly under the run, exactly where the run's own border used to be.
*/
.runs-grid[b-vfw3jqcjg6]  .mud-table-body .mud-table-row > td.mud-table-cell:not(.mud-table-child-content) {
    border-bottom: none;
}

.runs-grid[b-vfw3jqcjg6]  .mud-table-body .mud-table-row > td.mud-table-child-content {
    padding: 0;
    border-bottom: 1px solid var(--mud-palette-table-lines);
}

/* Indented from the User column so the detail reads as part of the row above it. */
.runs-grid[b-vfw3jqcjg6]  .run-issues {
    margin: 0 16px 8px 40px;
}

/* Separates one run's block from the next in the Results roll-up. */
.issue-run[b-vfw3jqcjg6] {
    margin-bottom: 12px;
}

/*
    Striping is on by default and MudBlazor bands on tr:nth-of-type(odd). Every run now owns
    two rows (itself plus its detail row), so the plain rule lands every run on an odd index
    and shades them all identically. Re-band on a four-row cycle instead, so a run and its
    detail share one stripe and the zebra survives. The selectors mirror MudBlazor's own chain
    because its rule is highly specific and would otherwise win.
*/
.runs-grid[b-vfw3jqcjg6]  .mud-table-striped .mud-table-container .mud-table-root .mud-table-body .mud-table-row:nth-of-type(odd) {
    background-color: transparent;
}

.runs-grid[b-vfw3jqcjg6]  .mud-table-striped .mud-table-container .mud-table-root .mud-table-body .mud-table-row:nth-of-type(4n+1),
.runs-grid[b-vfw3jqcjg6]  .mud-table-striped .mud-table-container .mud-table-root .mud-table-body .mud-table-row:nth-of-type(4n+2) {
    background-color: var(--mud-palette-table-striped);
}

/*
    Hover the pair, not the halves. MudBlazor highlights the hovered <tr> only, so a run and
    its detail lit up separately; these three selectors are "the row itself", "the detail of
    the hovered run", and "the run of the hovered detail" (the last two identify the detail
    row by its child-content cell, since MudBlazor gives it no distinguishing class).

    The selectors carry the full MudBlazor chain plus the table element so they outrank both
    MudBlazor's own hover rule and the re-banded striping above.
*/
@media (hover: hover) and (pointer: fine) {
    .runs-grid[b-vfw3jqcjg6]  .mud-table-hover.mud-table-striped .mud-table-container table.mud-table-root .mud-table-body .mud-table-row:hover,
    .runs-grid[b-vfw3jqcjg6]  .mud-table-hover.mud-table-striped .mud-table-container table.mud-table-root .mud-table-body .mud-table-row:hover + .mud-table-row:has(> td.mud-table-child-content),
    .runs-grid[b-vfw3jqcjg6]  .mud-table-hover.mud-table-striped .mud-table-container table.mud-table-root .mud-table-body .mud-table-row:has(+ .mud-table-row:hover > td.mud-table-child-content) {
        background-color: var(--mud-palette-table-hover);
    }
}
/* /Pages/Workflow/OffBoard.razor.rz.scp.css */
 /* CSS Isolation */

.CheckCol[b-9vsz8mjiwh] {
    padding: 5px;
}
/*.mud-input-control-input-container p {
    width: 150px;
}*/

.CheckCol2  .mud-input-control-boolean-input  label > p[b-9vsz8mjiwh] {
    width: 176px !important;
}
/* /Pages/Workflow/Onboarding/WorkflowOnboardingWizard.razor.rz.scp.css */
/* Layout (sidebar/content/footer/scroll) is owned by the shared EcpWizard shell —
   only page-specific styling lives here. ::deep because the rule targets a Mud
   component; the scope attribute sits on the EcpWizard's .wizard-root ancestor via
   this page's own elements inside it. */

/* The "already in this MSP" section: visibly present but completely inert. */
[b-khw1jb1uoc] .template-table--disabled {
    opacity: 0.55;
    pointer-events: none;
}
/* /Shared/AdHocFrameworkMedallions.razor.rz.scp.css */
.adhoc-framework-medallion[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, rgba(255, 255, 255, 0.92) 0%, rgba(241, 245, 249, 0.98) 100%);
    --medallion-border: rgba(71, 85, 105, 0.28);
    --medallion-text: #1e293b;
    --medallion-seal-background: #334155;
    --medallion-seal-text: #ffffff;
    align-items: center;
    background: var(--medallion-background);
    border: 1px solid var(--medallion-border);
    border-radius: 999px;
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.75),
        0 1px 2px rgba(15, 23, 42, 0.1);
    color: var(--medallion-text);
    display: inline-flex;
    font-size: 0.72rem;
    font-weight: 700;
    gap: 0.4rem;
    letter-spacing: 0.01em;
    line-height: 1;
    max-width: 100%;
    min-height: 1.9rem;
    padding: 0.18rem 0.65rem 0.18rem 0.22rem;
}

.adhoc-framework-medallion__seal[b-09sm5056rp] {
    align-items: center;
    background: var(--medallion-seal-background);
    border: 1px solid rgba(255, 255, 255, 0.45);
    border-radius: 999px;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
    color: var(--medallion-seal-text);
    display: inline-flex;
    font-size: 0.63rem;
    font-weight: 800;
    height: 1.35rem;
    justify-content: center;
    min-width: 1.35rem;
    padding: 0 0.2rem;
    text-transform: uppercase;
}

.adhoc-framework-medallion__label[b-09sm5056rp] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.adhoc-framework-medallion--cis[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #eef5ff 0%, #dcecff 100%);
    --medallion-border: rgba(18, 82, 163, 0.35);
    --medallion-text: #0f3f7f;
    --medallion-seal-background: #1252a3;
}

.adhoc-framework-medallion--cisa[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #eff7ff 0%, #dbeafe 100%);
    --medallion-border: rgba(0, 94, 162, 0.35);
    --medallion-text: #0b4f86;
    --medallion-seal-background: #005ea2;
}

.adhoc-framework-medallion--essential-eight[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #f7fbef 0%, #e7f4d7 100%);
    --medallion-border: rgba(74, 124, 24, 0.32);
    --medallion-text: #35591a;
    --medallion-seal-background: #6a8b1f;
}

.adhoc-framework-medallion--lighthouse[b-09sm5056rp],
.adhoc-framework-medallion--ms-baseline[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #eef6ff 0%, #dcecff 100%);
    --medallion-border: rgba(0, 120, 212, 0.32);
    --medallion-text: #005ea6;
    --medallion-seal-background: #0078d4;
}

.adhoc-framework-medallion--nist[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #f4f4fb 0%, #e5e7f5 100%);
    --medallion-border: rgba(67, 56, 202, 0.28);
    --medallion-text: #3730a3;
    --medallion-seal-background: #4f46e5;
}

.adhoc-framework-medallion--iso27001[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #eef5ff 0%, #dbeafe 100%);
    --medallion-border: rgba(37, 99, 235, 0.3);
    --medallion-text: #1d4ed8;
    --medallion-seal-background: #2563eb;
}

.adhoc-framework-medallion--soc2[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #f8fafc 0%, #e2e8f0 100%);
    --medallion-border: rgba(51, 65, 85, 0.32);
    --medallion-text: #1f2937;
    --medallion-seal-background: #334155;
}

.adhoc-framework-medallion--best-practice[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #f4fbf2 0%, #dcfce7 100%);
    --medallion-border: rgba(22, 101, 52, 0.25);
    --medallion-text: #166534;
    --medallion-seal-background: #15803d;
}

.adhoc-framework-medallion--smb-bronze[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #f9efe9 0%, #edd4c5 100%);
    --medallion-border: rgba(146, 64, 14, 0.26);
    --medallion-text: #9a3412;
    --medallion-seal-background: #b45309;
}

.adhoc-framework-medallion--smb-silver[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #f8fafc 0%, #e5e7eb 100%);
    --medallion-border: rgba(100, 116, 139, 0.28);
    --medallion-text: #475569;
    --medallion-seal-background: #64748b;
}

.adhoc-framework-medallion--smb-gold[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #fff8db 0%, #fde68a 100%);
    --medallion-border: rgba(180, 83, 9, 0.28);
    --medallion-text: #92400e;
    --medallion-seal-background: #ca8a04;
}

.adhoc-framework-medallion--smb-diamond[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #eef8ff 0%, #dbeafe 100%);
    --medallion-border: rgba(14, 116, 144, 0.28);
    --medallion-text: #155e75;
    --medallion-seal-background: #0891b2;
}

.adhoc-framework-medallion--default[b-09sm5056rp] {
    --medallion-background: linear-gradient(180deg, #f8fafc 0%, #edf2f7 100%);
    --medallion-border: rgba(71, 85, 105, 0.25);
    --medallion-text: #334155;
    --medallion-seal-background: #475569;
}

/* Overflow "+N" indicator for truncated framework lists */
.adhoc-framework-medallion--overflow[b-09sm5056rp] {
    --medallion-background: #ffffff;
    --medallion-border: rgba(36, 115, 190, 0.4);
    --medallion-text: #2473be;
    border-style: dashed;
    cursor: pointer;
    padding: 0.18rem 0.55rem;
}
/* /Shared/Azure/AzurePermissionsUrlGenerator.razor.rz.scp.css */
fieldset.UrlContainer[b-fawsqc0myc] {
    border: 1px solid lightgrey !important;
    margin: 4px !important;
    padding: 16px !important;
    border-radius: 5px;
}

.UrlContainer legend[b-fawsqc0myc] {
    padding-left: 4px;
    padding-right: 4px;
}
/* /Shared/BreadcrumbMenuContents.razor.rz.scp.css */
/* Stack the level vertically. A flex column forces every child onto its own row so the popout
   reads as a menu list.
   Every match renders (issue #6577) so the level scrolls once it outgrows the viewport instead of
   truncating; the max-height keeps the popover's own bounds on-screen. */
.breadcrumb-menu-contents[b-x248upgjci] {
    display: flex;
    flex-direction: column;
    min-width: 220px;
    max-height: 60vh;
    overflow-y: auto;
    overflow-x: hidden;
}

/* Flex children default to flex-shrink:1 - with the level's height now capped for scrolling, the
   browser crams every row into the max-height (overlapping micro-text) instead of letting the
   content overflow into the scrollbar. Pin every row type (filter, section headers, leaf items,
   nested-menu roots) to its natural height so overflow actually scrolls. */
.breadcrumb-menu-contents .breadcrumb-menu-filter[b-x248upgjci],
.breadcrumb-menu-contents .breadcrumb-menu-section[b-x248upgjci],
.breadcrumb-menu-contents[b-x248upgjci]  .mud-menu-item,
.breadcrumb-menu-contents[b-x248upgjci]  .mud-menu {
    flex-shrink: 0;
}

/* Container rows render as a nested MudMenu; its root is inline-width by default, which centres the
   activator and makes the text shift on hover. Stretch the menu and its activator to full width so a
   container row sits and left-aligns exactly like a leaf MudMenuItem. */
.breadcrumb-menu-contents[b-x248upgjci]  .mud-menu {
    width: 100%;
}

.breadcrumb-menu-contents[b-x248upgjci]  .mud-menu > .mud-menu-activator {
    width: 100%;
}

/* The clickable cascade row (tenant group / customer that has children). MudBlazor wraps our
   ActivatorContent in its OWN .mud-menu-item (the .mud-menu-sub-menu-activator), which already
   supplies the same 8px/12px inset as the plain MudMenuItem leaf rows. So this anchor must add
   NO padding of its own - any padding here stacks on top of the wrapper and pushes the label
   deeper than the leaf rows (the exact indent bug Ryan reported). Zero padding => the label lines
   up pixel-for-pixel with the childless-group and tenant rows. Full width + space-between pins the
   "has children" chevron to the right edge without shifting the label. */
.breadcrumb-menu-contents[b-x248upgjci]  a.breadcrumb-popout-activator {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    width: 100%;
    padding: 0;
    color: inherit;
    text-decoration: none;
    /* The anchor has no href (navigation resolves through the nav menu on click), so the browser
       no longer supplies the link cursor. */
    cursor: pointer;
}

/* Right-aligned "expand" affordance on cascade rows - the standard nested-menu chevron, muted so it
   reads as an affordance rather than content. flex-shrink:0 keeps it pinned to the right edge. */
.breadcrumb-menu-contents[b-x248upgjci]  .breadcrumb-popout-chevron {
    flex-shrink: 0;
    color: var(--mud-palette-text-secondary);
}

/* Section header carrying the type chip (TG / T / C). */
.breadcrumb-menu-section[b-x248upgjci] {
    padding: 4px 12px 2px 12px;
}

/* Indent every row's label (leaf tenants AND cascade group activators, which both render inside a
   .mud-menu-item) deeper than the 12px section headers, so the list reads as items nested under a
   heading. Left only - keeps the 12px right inset for the chevron. */
.breadcrumb-menu-contents[b-x248upgjci]  .mud-menu-item {
    padding-left: 24px;
}

/* Filter input row, shown when a level exceeds the configured maximum. Sticky so it stays reachable
   while the (now scrollable) level is scrolled; the surface background stops rows showing through. */
.breadcrumb-menu-filter[b-x248upgjci] {
    position: sticky;
    top: 0;
    z-index: 1;
    padding: 4px 8px;
    min-width: 220px;
    background: var(--mud-palette-surface);
}
/* /Shared/Breadcrumbs.razor.rz.scp.css */
.ecp-breadcrumbs[b-e8btne5whu] {
    display: contents;
}

/* Replicate MudBlazor's default breadcrumb link layout for the anchor nested
   inside the hover menu activator (the stock .mud-breadcrumb-item > a rules
   no longer match because the anchor is not a direct child of the li). */
[b-e8btne5whu] .mud-breadcrumb-item a.breadcrumb-popout-activator {
    display: flex;
    align-items: center;
}

[b-e8btne5whu] .mud-breadcrumb-item.mud-disabled a.breadcrumb-popout-activator {
    pointer-events: none;
    color: var(--mud-palette-action-disabled);
}

/* Keep the menu wrapper from stretching the crumb inside the flex list. */
[b-e8btne5whu] .mud-breadcrumb-item .mud-menu {
    width: auto;
    display: inline-flex;
}

/* Down-caret shown after a popout-capable crumb so the user knows it opens a menu.
   Sized just above the crumb text and nudged in so it reads as part of the word.
   Qualify with .mud-icon-root so this beats MudBlazor's own .mud-icon-size-* rule
   (equal class count) and the size override reliably wins. */
[b-e8btne5whu] .mud-icon-root.breadcrumb-popout-caret {
    font-size: 1.1rem;
    margin-left: 2px;
    opacity: 0.75;
}
/* /Shared/CoachMarks/CoachTourHost.razor.rz.scp.css */
/* CSS Isolation - the coach-mark bubble.
   Deliberately NOT a MudPopover: that anchors to its own child content, and a coach mark points at
   an arbitrary element somewhere else in the tree. Position comes from the code-behind as an inline
   fixed-position style; everything else is here. */

.coachmark[b-8ha4n9086q] {
    --coachmark-width: 384px;   /* must match BubbleWidth in the code-behind */
    --coachmark-bg: #1668b8;
    --coachmark-beak: 9px;

    position: fixed;
    z-index: 1390;              /* above the app bar (1300), below the dialog layer (1400) */
    width: var(--coachmark-width);
    max-width: calc(100vw - 16px);
    box-sizing: border-box;
    padding: 16px 16px 12px 16px;
    border-radius: 4px;
    background: var(--coachmark-bg);
    color: #ffffff;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);
    animation: coachmark-in-b-8ha4n9086q 120ms ease-out;
}

@keyframes coachmark-in-b-8ha4n9086q {
    from {
        opacity: 0;
        transform: translateY(4px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* The beak. One triangle, rotated per side by which border gets the colour. Centred on the bubble
   rather than tracked to the target's exact centre: the bubble is already clamped to the viewport,
   so a tracked beak would have to handle the clamped case anyway for a few pixels of accuracy. */
.coachmark[b-8ha4n9086q]::after {
    content: "";
    position: absolute;
    border: var(--coachmark-beak) solid transparent;
}

.coachmark-bottom[b-8ha4n9086q]::after {
    bottom: 100%;
    left: 24px;
    border-bottom-color: var(--coachmark-bg);
}

.coachmark-top[b-8ha4n9086q]::after {
    top: 100%;
    left: 24px;
    border-top-color: var(--coachmark-bg);
}

.coachmark-right[b-8ha4n9086q]::after {
    right: 100%;
    top: 20px;
    border-right-color: var(--coachmark-bg);
}

.coachmark-left[b-8ha4n9086q]::after {
    left: 100%;
    top: 20px;
    border-left-color: var(--coachmark-bg);
}

/* WHERE ALONG ITS EDGE the beak sits. The rules above put it near the START of that edge, which is
   right for a bubble hanging off an element but wrong for a viewport-anchored one: a bubble pinned
   to the top-MIDDLE of the screen with its triangle at the far left reads as top-left, which is
   exactly what it looked like. The beak has to follow the alignment the author chose.

   Only middle and end need rules - start is what the base classes already do. */
.coachmark-beak-middle.coachmark-top[b-8ha4n9086q]::after,
.coachmark-beak-middle.coachmark-bottom[b-8ha4n9086q]::after {
    left: 50%;
    margin-left: calc(var(--coachmark-beak) * -1);
}

.coachmark-beak-end.coachmark-top[b-8ha4n9086q]::after,
.coachmark-beak-end.coachmark-bottom[b-8ha4n9086q]::after {
    left: auto;
    right: 24px;
}

.coachmark-beak-middle.coachmark-left[b-8ha4n9086q]::after,
.coachmark-beak-middle.coachmark-right[b-8ha4n9086q]::after {
    top: 50%;
    margin-top: calc(var(--coachmark-beak) * -1);
}

.coachmark-beak-end.coachmark-left[b-8ha4n9086q]::after,
.coachmark-beak-end.coachmark-right[b-8ha4n9086q]::after {
    top: auto;
    bottom: 20px;
}

/* No beak when the bubble is not attached to anything - an authored viewport anchor, or a step
   whose element could not be found. A triangle pointing at empty page reads as a mistake, and on a
   centred bubble it points at whatever happens to be underneath. The shadow is deepened to carry
   the same "floating above the page" cue the beak was giving. */
.coachmark-unanchored[b-8ha4n9086q]::after {
    content: none;
}

.coachmark-unanchored[b-8ha4n9086q] {
    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.36);
}

.coachmark-head[b-8ha4n9086q] {
    display: flex;
    align-items: flex-start;
    gap: 8px;
}

/* ::deep because the markup uses MudBlazor components, whose rendered elements are not part of this
   component's scope. */
.coachmark-head[b-8ha4n9086q]  .coachmark-title {
    flex: 1 1 auto;
    color: #ffffff;
    font-weight: 600;
    line-height: 1.3;
}

.coachmark-head[b-8ha4n9086q]  .coachmark-close {
    flex: 0 0 auto;
    margin: -6px -6px 0 0;
    color: #ffffff;
}

.coachmark[b-8ha4n9086q]  .coachmark-body {
    margin-top: 8px;
    color: #ffffff;
    line-height: 1.45;
}

.coachmark-foot[b-8ha4n9086q] {
    display: flex;
    align-items: center;
    margin-top: 20px;
}

.coachmark-foot[b-8ha4n9086q]  .coachmark-counter {
    color: rgba(255, 255, 255, 0.85);
}

.coachmark-foot[b-8ha4n9086q]  .coachmark-back {
    border-color: rgba(255, 255, 255, 0.7);
    color: #ffffff;
}

/* White fill with dark text, matching the reference: the primary action has to read as the primary
   action against a saturated background, which an outlined button does not. */
.coachmark-foot[b-8ha4n9086q]  .coachmark-next {
    background-color: #ffffff;
    color: #10457b;
}

.coachmark-foot[b-8ha4n9086q]  .coachmark-next:focus-visible {
    outline: 2px solid #ffffff;
    outline-offset: 2px;
}

/* The spotlight backdrop: a fixed box sitting exactly over the target, whose enormous box-shadow is
   what dims everything else. One element, no clip-path, works everywhere. It takes no pointer events
   so the page stays usable — Driver.js's approach, minus the broken-input-focus complaints that
   came with the libraries that block interaction. Below the bubble (1390) and above the app bar
   (1300) so the bar dims with the rest of the page. A centred step lights nothing, so the box
   collapses to a point at the bubble and the whole page dims evenly. */
.coachmark-spotlight[b-8ha4n9086q] {
    position: fixed;
    z-index: 1380;
    pointer-events: none;
    border-radius: 6px;
    /* A fixed pixel spread, as Intro.js uses. `100vmax` computed correctly (1560px on a 1560px
       viewport) and Chrome painted nothing at all; the same declaration with a pixel value paints.
       9999px covers any display in use. */
    box-shadow: 0 0 0 9999px rgba(15, 23, 42, 0.55);
    transition: top 120ms ease, left 120ms ease, width 120ms ease, height 120ms ease;
}

@media (prefers-reduced-motion: reduce) {
    .coachmark-spotlight[b-8ha4n9086q] {
        transition: none;
    }
}

/* The hotspot: a pulsing dot on the first step's target, offered instead of opening the bubble.
   A real button so it is focusable and announces what it opens. Same blue as the bubble, so the
   two read as one feature. */
.coachmark-hotspot[b-8ha4n9086q] {
    position: fixed;
    z-index: 1390;
    width: 18px;
    height: 18px;
    padding: 0;
    border: 2px solid #ffffff;
    border-radius: 50%;
    background: #1668b8;
    box-shadow: 0 0 0 0 rgba(22, 104, 184, 0.55);
    cursor: pointer;
    animation: coachmark-hotspot-pulse-b-8ha4n9086q 1.8s ease-out infinite;
    transition: top 120ms ease, left 120ms ease;
}

.coachmark-hotspot:hover[b-8ha4n9086q] {
    background: #125494;
}

.coachmark-hotspot:focus-visible[b-8ha4n9086q] {
    outline: 2px solid #1668b8;
    outline-offset: 3px;
}

@keyframes coachmark-hotspot-pulse-b-8ha4n9086q {
    0%   { box-shadow: 0 0 0 0 rgba(22, 104, 184, 0.55); }
    70%  { box-shadow: 0 0 0 12px rgba(22, 104, 184, 0); }
    100% { box-shadow: 0 0 0 0 rgba(22, 104, 184, 0); }
}

@media (prefers-reduced-motion: reduce) {
    .coachmark-hotspot[b-8ha4n9086q] {
        animation: none;
        box-shadow: 0 0 0 4px rgba(22, 104, 184, 0.35);
        transition: none;
    }
}

/* The "click an element" bar shown during an authoring pick. Bottom-centre so it stays clear of the
   app bar and the nav drawer, which are the two things authors most often want to point at. */
.coachmark-pickbar[b-8ha4n9086q] {
    position: fixed;
    z-index: 2001;              /* above the pick highlight (2000) so it is never dimmed by it */
    bottom: 24px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    align-items: center;
    max-width: calc(100vw - 48px);  /* on a narrow window the text wraps; the button never clips */
    padding: 12px 20px;
    border-radius: 4px;
    background: #1668b8;
    color: #ffffff;
    pointer-events: none;       /* the author is aiming at the page, not at this */
}

.coachmark-pickbar[b-8ha4n9086q]  .mud-icon-root {
    color: #ffffff;
}

/* The one thing on the bar that IS clickable. The bar itself stays pointer-events:none so the
   author can aim through it; the button opts back in, and the picker's own handlers ignore clicks
   that land inside the bar so this click reaches the button rather than becoming a pick. */
.coachmark-pickbar[b-8ha4n9086q]  .coachmark-pickbar-back {
    pointer-events: auto;
    flex-shrink: 0;             /* the text wraps before the button is ever clipped */
    color: #ffffff;
    border-color: rgba(255, 255, 255, 0.7);
    white-space: nowrap;
}

.coachmark-pickbar[b-8ha4n9086q]  .coachmark-pickbar-back:hover {
    background: rgba(255, 255, 255, 0.14);
    border-color: #ffffff;
}

.coachmark-pickbar[b-8ha4n9086q]  .coachmark-pickbar-back:focus-visible {
    outline: 2px solid #ffffff;
    outline-offset: 2px;
}
/* /Shared/DeveloperTools/DevLoadTimes.razor.rz.scp.css */
.DevLoadTimes[b-kpnfdv67e7] {
    position: fixed !important;
    bottom: 0;
    right: 0;
    background: whitesmoke;
    color: black;
}
/* /Shared/DialogIconPicker.razor.rz.scp.css */
/* Icon Picker Dialog - CSS Isolation */

/* Tile wrapper for click handling */
[b-2h2z3w14fd] .icon-tile-wrapper {
    cursor: pointer;
}

[b-2h2z3w14fd] .icon-tile-wrapper:hover .mud-paper {
    background-color: var(--mud-palette-action-default-hover);
}

/* Selected tile styling */
[b-2h2z3w14fd] .icon-item.selected {
    background-color: var(--mud-palette-primary-lighten);
    border: 2px solid var(--mud-palette-primary);
}

/* Scrollable panel content */
[b-2h2z3w14fd] .icon-panel-content {
    max-height: calc(80vh - 250px);
    overflow-y: auto;
    padding: 8px;
}

/* Icon item base styling */
[b-2h2z3w14fd] .icon-item {
    cursor: pointer;
    transition: background-color 0.2s;
}

[b-2h2z3w14fd] .icon-item:hover {
    background-color: var(--mud-palette-action-default-hover);
}
/* /Shared/Dialogs/UpdateTenantPermissionsDialog.razor.rz.scp.css */
fieldset.UrlContainer[b-qqixijigcf] {
    border: 1px solid lightgrey !important;
    margin: 4px !important;
    padding: 16px !important;
    border-radius: 5px;
}

.UrlContainer legend[b-qqixijigcf] {
    padding-left: 4px;
    padding-right: 4px;
}
/* /Shared/EcpCatalogue/EcpCatalogueListingPicker.razor.rz.scp.css */
.SplitPanels[b-4lpytb45h5] {
    display: flex;
    gap: 16px;
    align-items: flex-start;
}

/* The panel itself does NOT scroll — it is a column whose search bar is fixed
   and whose product list takes the remaining height and scrolls inside it.
   Scrolling the whole panel used to carry the search box out of view. */
.LeftPanel[b-4lpytb45h5] {
    flex: 0 0 420px;
    display: flex;
    flex-direction: column;
    max-height: calc(100vh - 220px);
    overflow: hidden;
    border-right: 1px solid var(--mud-palette-table-lines);
    padding-right: 8px;
}

.RightPanel[b-4lpytb45h5] {
    flex: 1 1 auto;
    min-width: 0;
}

.ProductList[b-4lpytb45h5] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    /* Without this a flex child refuses to shrink below its content height,
       so the list would push past the panel instead of scrolling. */
    min-height: 0;
    overflow-y: auto;
}

.ProductRow[b-4lpytb45h5] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 8px 12px;
    border-radius: 4px;
    cursor: pointer;
    transition: background-color 120ms ease;
}

.ProductRow:hover[b-4lpytb45h5] {
    background-color: var(--mud-palette-action-default-hover);
}

.ProductRowActive[b-4lpytb45h5] {
    background-color: var(--mud-palette-primary-hover);
}

.ProductRowTitle[b-4lpytb45h5] {
    flex: 1 1 auto;
    font-size: 0.9rem;
    line-height: 1.3;
    word-break: break-word;
}

/* Fixed row of the LeftPanel column — the ProductList beside it takes the
   remaining height and does the scrolling, so the search never moves.
   Deliberately NOT position:sticky: .LeftPanel is overflow:hidden and would be
   the nearest scroll container, so a sticky offset would never resolve. */
.SearchBar[b-4lpytb45h5] {
    gap: 4px;
    flex: 0 0 auto;
}

.SearchField[b-4lpytb45h5] {
    flex: 1 1 auto;
}

[b-4lpytb45h5] .AddAllButton {
    flex: 0 0 auto;
}

[b-4lpytb45h5] .AddAllTooltip {
    max-width: 280px;
    padding: 4px 2px;
    text-align: left;
}

[b-4lpytb45h5] .AddAllTooltipHeader {
    display: flex;
    align-items: center;
}

[b-4lpytb45h5] .AddAllTooltipFooter {
    color: var(--mud-palette-text-secondary);
}
/* /Shared/EcpCatalogue/EcpDistributorChip.razor.rz.scp.css */
.DistributorChip[b-uewkhyqfs9] {
    display: inline-flex;
    align-items: center;
    height: 24px;
    padding: 0 10px;
    border-radius: 12px;
    border: 1.5px solid transparent;
    font-size: 0.75rem;
    font-weight: 600;
    line-height: 1;
    white-space: nowrap;
    user-select: none;
}
/* /Shared/EcpCatalogue/EcpListingBuyActions.razor.rz.scp.css */
/* Inline "why can't I buy" reason, stacked above the disabled Buy button in the tile action row. */
.BuyBlockWrap[b-uaq057u6yy] {
    display: flex;
    flex-direction: column;
    gap: 4px;
    width: 100%;
}

.BuyBlockReason[b-uaq057u6yy] {
    font-size: 0.68rem;
    line-height: 0.9rem;
    font-weight: 600;
    text-align: center;
    color: var(--mud-palette-error);
}
/* /Shared/EcpCatalogue/EcpListingGrid.razor.rz.scp.css */
.EcpListingGrid[b-zttr75h65i] {
    width: 100%;
}

.ListingGridImageCell[b-zttr75h65i] {
    width: 56px;
}

.ListingGridImage[b-zttr75h65i] {
    width: 40px;
    height: 40px;
}

.ListingGridImage[b-zttr75h65i]  img {
    width: 40px;
    height: 40px;
    object-fit: contain;
}

.ListingGridTitle[b-zttr75h65i] {
    font-weight: 600;
    line-height: 1.15rem;
}

.ListingGridSub[b-zttr75h65i] {
    font-size: 0.75rem;
    line-height: 1rem;
}

.ListingGridSub-Muted[b-zttr75h65i] {
    opacity: 0.7;
}

.ListingGridPrice[b-zttr75h65i] {
    font-weight: 600;
    white-space: nowrap;
}

.ListingGridRrpSaving[b-zttr75h65i] {
    text-decoration: line-through;
    opacity: 0.7;
}

.ListingGridActionCell[b-zttr75h65i] {
    width: 1%;
    white-space: nowrap;
}

.ListingGridActions[b-zttr75h65i] {
    display: flex;
    gap: 0.4rem;
    align-items: center;
    justify-content: flex-end;
    flex-wrap: wrap;
}

/* Action buttons in the grid are natural-width — the host fragment uses
   FullWidth for the tile footer, which would otherwise blow the cell out. */
.ListingGridActions[b-zttr75h65i]  .mud-button-root {
    width: auto;
    min-width: 0;
}

.ListingGridRow-Selected[b-zttr75h65i] {
    background-color: var(--mud-palette-action-default-hover);
}
/* /Shared/EcpCatalogue/EcpListingGroupCard.razor.rz.scp.css */
.ProductGroup[b-9f4tlsal9o] {
    background: rgba(128, 128, 128, 0.06);
    border-radius: 4px;
    transition: background-color 120ms ease;
}

.ProductGroup:hover[b-9f4tlsal9o] {
    background: rgba(128, 128, 128, 0.12);
}

.ProductGroupTitle[b-9f4tlsal9o] {
    font-weight: 500;
}

.TileGrid[b-9f4tlsal9o] {
    display: grid;
    grid-template-columns: repeat(auto-fill, 320px);
    gap: 17px;
    align-items: stretch;
}
/* /Shared/EcpCatalogue/EcpListingTile.razor.rz.scp.css */
/* Tile — V11 layout. Header banner (image + title), body (categories,
   depends-on, spacer pushing foot down), foot row (segment chips left,
   price right), action panel at the bottom. Tile width fixed at 320px;
   height stretches to its grid cell so all tiles in a row match the
   tallest. Consumers (CatalogueBuyPage, EcpCatalogueListingPicker) wrap
   tiles in a CSS-grid container with `align-items: stretch`. */

.Tile[b-972i47sz1h] {
    position: relative;
    width: 320px;
    height: 100%;
    background: var(--mud-palette-surface);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 10px;
    box-shadow:
        0 1px 2px rgba(0, 0, 0, 0.04),
        0 2px 6px rgba(0, 0, 0, 0.05);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    transition:
        box-shadow 180ms ease,
        border-color 180ms ease,
        transform 180ms ease;
}

.Tile:hover[b-972i47sz1h] {
    border-color: var(--mud-palette-primary);
    box-shadow:
        0 4px 10px rgba(0, 0, 0, 0.08),
        0 8px 24px rgba(0, 0, 0, 0.06);
    transform: translateY(-2px);
}

.Tile.Tile-Selected[b-972i47sz1h] {
    border-color: var(--mud-palette-success);
}

.Tile.Tile-Selected:hover[b-972i47sz1h] {
    border-color: var(--mud-palette-success);
}

/* ─── Hero layout (Test mode) ─────────────────────────────────────────── */
/* Title bar keeps the dark banner (inherited from .TileHeader) and shows just
   the title. The central body becomes a row: image left, details right. */
.Tile-Hero .TileBody[b-972i47sz1h] {
    flex-direction: row;
    align-items: flex-start;
    gap: 12px;
}

.TileHeroImageInline[b-972i47sz1h] {
    flex: 0 0 auto;
}

/* Wraps the body content (chips, depends-on, price) so it stacks as a column
   and, in hero mode, occupies the space to the right of the inline image. */
.TileBodyMain[b-972i47sz1h] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-width: 0;
    min-height: 0;
    gap: 8px;
}

/* ─── Header banner ───────────────────────────────────────────────── */
.TileHeader[b-972i47sz1h] {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 10px 12px;
    background: linear-gradient(135deg, rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.02));
    border-bottom: 1px solid var(--mud-palette-lines-default);
    flex: 0 0 auto;
}

.TileImageCol[b-972i47sz1h] {
    flex: 0 0 50px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
}

.TileImage[b-972i47sz1h] {
    width: 50px;
    height: 50px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.TileImageIcons[b-972i47sz1h] {
    display: flex;
    gap: 4px;
    justify-content: center;
    min-height: 1.4rem;
}

.TileHeaderText[b-972i47sz1h] {
    flex: 1 1 auto;
    min-width: 0;
}

.TileTitle[b-972i47sz1h] {
    font-weight: 700;
    font-size: 0.85rem;
    line-height: 1.05rem;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
    color: var(--mud-palette-text-primary);
    cursor: default;
}

.TileVariant[b-972i47sz1h] {
    margin-top: 3px;
    font-size: 0.68rem;
    font-weight: 600;
    color: var(--mud-palette-primary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.TilePublisher[b-972i47sz1h] {
    margin-top: 2px;
    font-size: 0.7rem;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ─── Body ────────────────────────────────────────────────────────── */
.TileBody[b-972i47sz1h] {
    flex: 1 1 auto;
    min-height: 0;
    padding: 10px 12px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.TileCats[b-972i47sz1h] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
}

.TileCat[b-972i47sz1h] {
    font-size: 0.6rem;
    padding: 1px 6px;
    border-radius: 8px;
    background: var(--mud-palette-action-default-hover);
    color: var(--mud-palette-text-secondary);
}

.TileDependsOn[b-972i47sz1h] {
    padding: 6px 8px;
    background: var(--mud-palette-action-default-hover);
    border-left: 2px solid var(--mud-palette-info-darken);
    border-radius: 4px;
    font-size: 0.7rem;
    line-height: 1.05rem;
    color: var(--mud-palette-text-secondary);
}

.TileDependsOn-Blocked[b-972i47sz1h] {
    background: var(--mud-palette-error-hover);
    border-left-color: var(--mud-palette-error-darken);
    color: var(--mud-palette-error-darken);
}

.TileDependsOnLabel[b-972i47sz1h] {
    display: flex;
    align-items: center;
    gap: 4px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-size: 0.6rem;
    margin-bottom: 4px;
}

.TileDependsOnList[b-972i47sz1h] {
    margin: 0;
    padding-left: 16px;
    list-style-type: disc;
}

.TileDependsOnList li[b-972i47sz1h] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 100%;
}

.TileDependsOnMore[b-972i47sz1h] {
    list-style: none;
    margin-left: -12px;
    font-style: italic;
    opacity: 0.85;
}

.TileSpacer[b-972i47sz1h] {
    flex: 1 1 auto;
    min-height: 4px;
}

.TileFoot[b-972i47sz1h] {
    display: flex;
    justify-content: space-between;
    align-items: flex-end;
    gap: 8px;
}

.TileFootChips[b-972i47sz1h] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    align-content: flex-end;
}

.TilePrice[b-972i47sz1h] {
    flex: 0 0 auto;
    text-align: right;
    line-height: 1;
}

.TilePriceLabel[b-972i47sz1h] {
    font-size: 0.62rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--mud-palette-text-secondary);
    margin-bottom: 0.15rem;
}

.TilePriceMain[b-972i47sz1h] {
    font-size: 1.1rem;
    font-weight: 700;
    color: var(--mud-palette-text-primary);
    line-height: 1.25rem;
    font-variant-numeric: tabular-nums;
}

/* Small "ex GST" qualifier sitting beside the headline price. */
.TilePriceGst[b-972i47sz1h] {
    font-size: 0.58rem;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
}

/* Secondary "inc GST" amount under the headline. */
.TilePriceInc[b-972i47sz1h] {
    margin-top: 0.05rem;
    font-size: 0.74rem;
    font-weight: 600;
    color: var(--mud-palette-text-primary);
    line-height: 0.95rem;
    font-variant-numeric: tabular-nums;
}

.TilePriceUnit[b-972i47sz1h] {
    margin-top: 0.15rem;
    font-size: 0.58rem;
    line-height: 0.72rem;
    color: var(--mud-palette-text-secondary);
    font-weight: 500;
    text-transform: lowercase;
    letter-spacing: 0.01em;
}

.TilePriceRrp[b-972i47sz1h] {
    margin-top: 0.1rem;
    font-size: 0.68rem;
    line-height: 0.85rem;
    color: var(--mud-palette-text-secondary);
    font-weight: 500;
    font-variant-numeric: tabular-nums;
}

/* Strike-through only when RRP is shown as a saving (tenant price < RRP). The
   admin RRP reference is shown plain — it's informational, not a "was" price. */
.TilePriceRrp-Saving[b-972i47sz1h] {
    text-decoration: line-through;
}

.TilePriceMarkup[b-972i47sz1h] {
    margin-top: 0.1rem;
    font-size: 0.66rem;
    line-height: 0.82rem;
    font-weight: 700;
    color: var(--mud-palette-primary);
    font-variant-numeric: tabular-nums;
}

/* ─── Action panel ────────────────────────────────────────────────── */
.TileActionRow[b-972i47sz1h] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    background: rgba(0, 0, 0, 0.05);
    border-top: 1px solid var(--mud-palette-lines-default);
}

/* ─── Image-column icons (pencil sits under the image) ─────────────── */
.TilePencil[b-972i47sz1h] {
    width: 1.4rem;
    height: 1.4rem;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--mud-palette-surface);
    border-radius: 50%;
    cursor: pointer;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
    opacity: 0.92;
    transition: opacity 120ms ease, background 120ms ease;
}

.TilePencil:hover[b-972i47sz1h] {
    opacity: 1;
    background: var(--mud-palette-action-default-hover);
}

[b-972i47sz1h] .TileOwned {
    position: absolute;
    top: 0.5rem;
    right: 0.5rem;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

[b-972i47sz1h] .TileChipIcon {
    width: 0.78rem !important;
    height: 0.78rem !important;
    font-size: 0.78rem !important;
}
/* /Shared/EcpCatalogue/EcpTenantSelectTree.razor.rz.scp.css */
/* Greyed rows for tenants that can never receive the selected catalogue —
   rendered outside the MudTreeView (see the markup comment). */
.DisabledTenantRow[b-bpeeoft09b] {
    opacity: 0.55;
}

/* Wordless success feedback: the green tick lingers briefly, then fades out.
   The icon is @key-ed per save so the animation replays on every success. */
[b-bpeeoft09b] .SavedTick {
    animation: ecp-saved-tick-b-bpeeoft09b 1.5s ease 1.2s forwards;
}

/* @keyframes names are NOT scoped by CSS isolation — keep it prefixed. */
@keyframes ecp-saved-tick-b-bpeeoft09b {
    to {
        opacity: 0;
    }
}
/* /Shared/EcpChipBody.razor.rz.scp.css */
/* EcpChip visuals (scoped to EcpChipBody, which renders the pill element) — filled pill
   matching MudChip Variant="Filled" Size="Size.Small".
   Backgrounds use the MudBlazor palette per Color; text uses each palette's
   pre-computed contrast text variable so the chip stays legible across light
   and dark themes. TextColour* classes are optional overrides applied last. */

.EcpChip[b-jj0eqgefaa] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 0 10px;
    height: 24px;
    border-radius: 16px;
    font-size: 0.75rem;
    line-height: 1.25rem;
    font-weight: 500;
    white-space: nowrap;
    user-select: none;
}

.EcpChip.Dense[b-jj0eqgefaa] {
    height: auto;
    padding: 1px 8px;
    border-radius: 10px;
    font-size: 0.62rem;
    font-weight: 600;
    gap: 3px;
}

.CanClick[b-jj0eqgefaa] {
    cursor: pointer;
}

/* Disabled — faded but still hoverable so the tooltip can explain why. */
.EcpChip.Disabled[b-jj0eqgefaa] {
    opacity: 0.45;
    cursor: default;
}

/* Leading-icon sizing — icon proportional to chip font so it scales with Dense. */
[b-jj0eqgefaa] .EcpChipIcon {
    width: 0.85rem !important;
    height: 0.85rem !important;
    font-size: 0.85rem !important;
}

.Dense[b-jj0eqgefaa]  .EcpChipIcon {
    width: 0.78rem !important;
    height: 0.78rem !important;
    font-size: 0.78rem !important;
}

/* --- Subtle variant: lighter tint + darker text. Pairs with ColourXxx ---- */

.Subtle.ColourPrimary[b-jj0eqgefaa]   { background: var(--mud-palette-primary-hover);   color: var(--mud-palette-primary-darken); }
.Subtle.ColourSecondary[b-jj0eqgefaa] { background: var(--mud-palette-secondary-hover); color: var(--mud-palette-secondary-darken); }
.Subtle.ColourInfo[b-jj0eqgefaa]      { background: var(--mud-palette-info-hover);      color: var(--mud-palette-info-darken); }
.Subtle.ColourSuccess[b-jj0eqgefaa]   { background: var(--mud-palette-success-hover);   color: var(--mud-palette-success-darken); }
.Subtle.ColourWarning[b-jj0eqgefaa]   { background: var(--mud-palette-warning-hover);   color: var(--mud-palette-warning-darken); }
.Subtle.ColourError[b-jj0eqgefaa]     { background: var(--mud-palette-error-hover);     color: var(--mud-palette-error-darken); }
.Subtle.ColourDark[b-jj0eqgefaa]      { background: var(--mud-palette-dark-hover);      color: var(--mud-palette-dark); }
.Subtle.ColourDefault[b-jj0eqgefaa]   { background: var(--mud-palette-action-default-hover); color: var(--mud-palette-text-primary); }

/* --- Outlined variant: transparent fill, coloured border + matching text - */

.Outlined[b-jj0eqgefaa] {
    background: transparent !important;
    border: 1px solid;
    box-sizing: border-box;
}

.Outlined.ColourPrimary[b-jj0eqgefaa]   { border-color: var(--mud-palette-primary);   color: var(--mud-palette-primary); }
.Outlined.ColourSecondary[b-jj0eqgefaa] { border-color: var(--mud-palette-secondary); color: var(--mud-palette-secondary); }
.Outlined.ColourInfo[b-jj0eqgefaa]      { border-color: var(--mud-palette-info);      color: var(--mud-palette-info); }
.Outlined.ColourSuccess[b-jj0eqgefaa]   { border-color: var(--mud-palette-success);   color: var(--mud-palette-success); }
.Outlined.ColourWarning[b-jj0eqgefaa]   { border-color: var(--mud-palette-warning);   color: var(--mud-palette-warning); }
.Outlined.ColourError[b-jj0eqgefaa]     { border-color: var(--mud-palette-error);     color: var(--mud-palette-error); }
.Outlined.ColourDark[b-jj0eqgefaa]      { border-color: var(--mud-palette-dark);      color: var(--mud-palette-dark); }
.Outlined.ColourDefault[b-jj0eqgefaa]   { border-color: var(--mud-palette-lines-default); color: var(--mud-palette-text-primary); }

/* --- Dashed outline: informational chip, not a control ------------------- */

.Outlined.Dashed[b-jj0eqgefaa] {
    border-style: dashed;
}

.TextAlignLeft[b-jj0eqgefaa]   { text-align: left; }
.TextAlignRight[b-jj0eqgefaa]  { text-align: right; }
.TextAlignCentre[b-jj0eqgefaa] { text-align: center; }

/* --- Backgrounds (paired with palette contrast text) -------------------- */

.ColourPrimary[b-jj0eqgefaa] {
    background: var(--mud-palette-primary);
    color: var(--mud-palette-primary-text);
}

.ColourSecondary[b-jj0eqgefaa] {
    background: var(--mud-palette-secondary);
    color: var(--mud-palette-secondary-text);
}

.ColourInfo[b-jj0eqgefaa] {
    background: var(--mud-palette-info);
    color: var(--mud-palette-info-text);
}

.ColourSuccess[b-jj0eqgefaa] {
    background: var(--mud-palette-success);
    color: var(--mud-palette-success-text);
}

.ColourWarning[b-jj0eqgefaa] {
    background: var(--mud-palette-warning);
    color: var(--mud-palette-warning-text);
}

.ColourError[b-jj0eqgefaa] {
    background: var(--mud-palette-error);
    color: var(--mud-palette-error-text);
}

.ColourDark[b-jj0eqgefaa] {
    background: var(--mud-palette-dark);
    color: var(--mud-palette-dark-text);
}

.ColourDefault[b-jj0eqgefaa] {
    background: var(--mud-palette-action-default-hover);
    color: var(--mud-palette-text-primary);
}

.ColourTransparent[b-jj0eqgefaa] {
    background: transparent;
    color: var(--mud-palette-text-primary);
}

/* --- Optional text-colour overrides (win over .Colour* paired text) ----- */

.TextColourPrimary[b-jj0eqgefaa]   { color: var(--mud-palette-primary)   !important; }
.TextColourSecondary[b-jj0eqgefaa] { color: var(--mud-palette-secondary) !important; }
.TextColourInfo[b-jj0eqgefaa]      { color: var(--mud-palette-info)      !important; }
.TextColourSuccess[b-jj0eqgefaa]   { color: var(--mud-palette-success)   !important; }
.TextColourWarning[b-jj0eqgefaa]   { color: var(--mud-palette-warning)   !important; }
.TextColourError[b-jj0eqgefaa]     { color: var(--mud-palette-error)     !important; }
.TextColourDark[b-jj0eqgefaa]      { color: var(--mud-palette-dark)      !important; }
.TextColourTransparent[b-jj0eqgefaa] { color: transparent !important; }
/* /Shared/EcpGrid/EcpGridToolbar.razor.rz.scp.css */
 /* CSS Isolation */

/*
    The search field is the last toolbar item. margin-left: auto pins it hard against the
    toolbar's right edge (independent of the MudSpacer), and the fixed flex basis holds it at
    a third of the toolbar width instead of growing to fill all remaining space.
*/
.ecp-grid-search-field[b-hazh86eqeh] {
    flex: 0 0 33%;
    margin-left: auto;
}
/* /Shared/EcpSwitch.razor.rz.scp.css */
.container-lr[b-y03dezjpf6] {
    display: flex;
}

.box-lr[b-y03dezjpf6] {
    display: flex;
    margin: 0;
    padding: 0;
    font-size: 1rem !important;
    align-items: center;
    line-height: 1;
}

.mud-grid-item[b-y03dezjpf6] {
    padding-top: 0 !important;
}

.primary-text[b-y03dezjpf6] {
    color: var(--mud-palette-text-primary) !important;
}

.description-text[b-y03dezjpf6] {
    color: var(--mud-palette-text-secondary) !important;
}

.impact-text[b-y03dezjpf6] {
    color: var(--mud-palette-text-disabled) !important;
}

.switch-inline-label-row[b-y03dezjpf6] {
    gap: 0.75rem;
}

.switch-inline-label[b-y03dezjpf6] {
    min-width: 5.5rem;
}

.switch-inline-label-active[b-y03dezjpf6] {
    font-weight: 600;
}

.title-above[b-y03dezjpf6] {
    margin-bottom: -8px;
}

.title-above-row[b-y03dezjpf6] {
    gap: 0.5rem;
}

.title-above-label[b-y03dezjpf6] {
    font-size: 0.75rem;
    color: var(--mud-palette-text-secondary);
    line-height: 1.15rem;
    padding-left: 12px;
}
/* /Shared/EcpWizard.razor.rz.scp.css */
/* The scope attribute lands on .wizard-root (this component's own div); every Mud component
   and page-supplied step body below it needs ::deep. The root's height is inline (it is
   parameterised) — here it becomes a non-scrolling flex column so the footer stays pinned
   and only div.step-scroll regions inside the content pane ever scroll. */
.wizard-root[b-ezs0mz3rru] {
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

[b-ezs0mz3rru] .wizard-body {
    flex: 1 1 auto;
    min-height: 0;
}

[b-ezs0mz3rru] .wizard-sidebar {
    width: 220px;
    border-right: 1px solid var(--mud-palette-lines-default);
}

[b-ezs0mz3rru] .wizard-content {
    flex-grow: 1;
    min-height: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

/* The ONE scrolling region per step — pages wrap their tables/lists in this. */
[b-ezs0mz3rru] .step-scroll {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

[b-ezs0mz3rru] .wizard-footer {
    background: var(--mud-palette-surface);
}

/* ── Horizontal orientation ──────────────────────────────────────────────────────────────
   MudStepper is a plain block: nav, then content, then an actions row. These rules give it
   the same non-scrolling flex column the sidebar layout has, so div.step-scroll above keeps
   working unchanged and the stepper's own button row stays pinned to the foot of the shell,
   where the sidebar layout's footer sits. Nothing else is touched — MudBlazor's own nav and
   content spacing stand, so a page that used a raw MudStepper comes out identical. */
.wizard-stepper[b-ezs0mz3rru] {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

[b-ezs0mz3rru] .wizard-stepper .mud-stepper {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

[b-ezs0mz3rru] .wizard-stepper .mud-stepper-nav {
    flex: 0 0 auto;
}

/* The step body, standing in for .wizard-content — the same flex column, so div.step-scroll
   inside it is the one region that scrolls. */
[b-ezs0mz3rru] .wizard-stepper .mud-stepper-content {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}

/* The stepper's own Previous/Next/Complete row — left as MudBlazor styles it. It only needs to
   stop flexing, so the content pane above takes the slack and this stays pinned to the bottom. */
[b-ezs0mz3rru] .wizard-stepper .mud-stepper-actions {
    flex: 0 0 auto;
}

/* The stepper marks the active step only by darkening its label text, which is invisible at a
   glance — a background is the only cue MudBlazor does not already spend on something else
   (hover uses gray, and the circles are already carrying done-vs-current colour). The colour
   arrives from the ActiveStepTint parameter as a variable on the wrapper. */
[b-ezs0mz3rru] .wizard-stepper .mud-stepper-nav .mud-step.active {
    background-color: rgba(var(--wizard-active-rgb), 0.1);
    border-radius: var(--mud-default-borderradius);
}

/* Locked: the page is mid-operation, so the nav AND the stepper's own button row stop responding
   rather than showing a pointer over controls whose clicks the guard would only throw away. */
[b-ezs0mz3rru] .wizard-stepper-locked .mud-stepper-nav,
[b-ezs0mz3rru] .wizard-stepper-locked .mud-stepper-actions {
    pointer-events: none;
}

/* ...and the buttons take MudBlazor's own disabled look (the same palette entries its
   .mud-button-root:disabled rules use), so a locked wizard cannot LOOK clickable either. */
[b-ezs0mz3rru] .wizard-stepper-locked .mud-stepper-actions .mud-button-root {
    color: var(--mud-palette-action-disabled) !important;
    border-color: var(--mud-palette-action-disabled-background) !important;
}

[b-ezs0mz3rru] .wizard-stepper-locked .mud-stepper-actions .mud-button-filled {
    background-color: var(--mud-palette-action-disabled-background);
}
/* /Shared/Layout/EcpBotDrawer.razor.rz.scp.css */
/* EcpBot drawer — right-anchored panel surfaced from the top-bar button.
   Layout matches the EcpDocumentsDrawer pattern (header + scrollable body +
   fixed footer-style input). */

.ecpbot-drawer[b-olercbom8w] {
    background-color: var(--mud-palette-surface);
}

.ecpbot-drawer-body[b-olercbom8w] {
    display: flex;
    flex-direction: column;
    flex-grow: 1;
    min-height: 0;
    height: 100%;
}

.ecpbot-drawer-transcript[b-olercbom8w] {
    flex-grow: 1;
    overflow-y: auto;
    padding: 12px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.ecpbot-drawer-input[b-olercbom8w] {
    flex-shrink: 0;
    padding: 8px 12px 12px 12px;
    border-top: 1px solid rgba(0, 0, 0, 0.08);
    background: var(--mud-palette-background);
}

.ecpbot-drawer-empty[b-olercbom8w] {
    color: var(--mud-palette-text-secondary);
    font-style: italic;
    padding: 16px;
    text-align: center;
}

.ecpbot-drawer-bubble-user[b-olercbom8w] {
    align-self: flex-end;
    background: var(--mud-palette-primary);
    color: white;
    padding: 8px 12px;
    border-radius: 12px 12px 2px 12px;
    max-width: 90%;
}

.ecpbot-drawer-bubble-user .mud-typography[b-olercbom8w] {
    color: white;
}

.ecpbot-drawer-bubble-assistant[b-olercbom8w] {
    align-self: flex-start;
    background: rgba(0, 0, 0, 0.04);
    padding: 8px 12px;
    border-radius: 12px 12px 12px 2px;
    max-width: 95%;
}

.ecpbot-drawer-thinking[b-olercbom8w] {
    display: flex;
    align-items: center;
    padding: 8px 12px;
    color: var(--mud-palette-text-secondary);
}

/* Header logo + title block */
.ecpbot-drawer-logo-wrap[b-olercbom8w] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
}

.ecpbot-drawer-logo[b-olercbom8w] {
    width: 32px;
    height: 32px;
    object-fit: contain;
    border-radius: 4px;
}

.ecpbot-drawer-logo-fallback[b-olercbom8w] {
    display: none;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 4px;
    background: var(--mud-palette-primary);
    color: white;
    font-weight: 700;
    font-size: 14px;
}

.ecpbot-drawer-title[b-olercbom8w] {
    line-height: 1.1;
}

.ecpbot-drawer-subtitle[b-olercbom8w] {
    color: var(--mud-palette-text-secondary);
    line-height: 1.1;
}

/* Context-aware "Currently viewing" hint above the input */
.ecpbot-drawer-context[b-olercbom8w] {
    display: flex;
    align-items: center;
    padding: 6px 12px;
    background: rgba(33, 150, 243, 0.08);
    border-bottom: 1px solid rgba(0, 0, 0, 0.06);
}
/* /Shared/MainLayout.razor.rz.scp.css */
/* /Shared/NavMenu.razor.rz.scp.css */
/* Tag sub-items under a "Tenants" nav group: a swatch dot in the tag's colour (the colour itself
   is user data and comes from an inline style) and a muted tenant count after the name. */
.TenantTagDot[b-hmckh62rq1] {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    margin-right: 8px;
    vertical-align: middle;
    border: 1px solid var(--mud-palette-lines-default);
}

.TenantTagCount[b-hmckh62rq1] {
    margin-left: 4px;
    opacity: 0.6;
    font-size: 0.75rem;
}
/* /Shared/Notifications/EcpDrawerNotifications.razor.rz.scp.css */
.Row[b-vdcdxhroqn] {
}

.Header[b-vdcdxhroqn] {
    width: 100%;
    display: table;
    padding: 8px;
}

.Header-Row[b-vdcdxhroqn] {
    display: table-row;
}

.Header-Left[b-vdcdxhroqn] {
    display: table-cell;
    width: 25px;
}

.Header-Left > div[b-vdcdxhroqn] {
    margin-left: 8px;
    margin-right: 20px;
}

.Header-Middle[b-vdcdxhroqn] {
    display: table-cell;
    margin-right: auto;
    text-align: left;
    vertical-align: top;
}

.Header-Right[b-vdcdxhroqn] {
    display: table-cell;
    width: 25px;
    height: 25px;
    margin-left: auto;
    vertical-align: top;
    padding-left: 2px;
}

.Content[b-vdcdxhroqn] {
    padding-left: 32px;
}

.Font[b-vdcdxhroqn] {
    font-size: 18px;
}
/* /Shared/Onboarding/OnboardingWizard.razor.rz.scp.css */
/* CSS Isolation */
/* /Shared/Security/SecureAction.razor.rz.scp.css */
/* The wrapper must stay hoverable — it is what raises the hover that opens the tooltip, because the
   disabled control inside it cannot. display: inline-flex keeps it from changing the layout of the
   control it wraps the way a default inline span would around a block-ish MudButton.

   Deliberately NO pointer-events: none here. That is exactly the mistake this wrapper exists to
   avoid: it would suppress the hover and the tooltip would silently never appear. The disabled
   control already refuses to act, so the wrapper does not need to block anything.

   The fade is left to MudBlazor's own disabled styling on the control — this wrapper only carries
   the hover target, so it must not restyle the child and diverge from every other disabled control
   in the app. */
.SecureActionDenied[b-0eg7qwyfqe] {
    display: inline-flex;
    cursor: not-allowed;
}

/* Keyboard focus must be visible, since the wrapper is focusable via tabindex="0" and would
   otherwise take focus with no indication. Uses the palette variable so it tracks light and dark
   mode rather than hardcoding a colour. */
.SecureActionDenied:focus-visible[b-0eg7qwyfqe] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: 2px;
}
/* /Shared/ServiceDesk/ServiceDeskReadOnlyBody.razor.rz.scp.css */
/* State strip — horizontal chips */
.sd-state-strip[b-43ytdqamlb] {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    padding-bottom: 14px;
    border-bottom: 1px solid var(--mud-palette-lines-default);
    margin-bottom: 14px;
}

.sd-state-chip[b-43ytdqamlb] {
    background: var(--mud-palette-background-grey);
    border-radius: 8px;
    padding: 6px 12px;
}

.sd-status-dot[b-43ytdqamlb] {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    display: inline-block;
}

/* Two-column body — reuse panel grid */
.sd-body[b-43ytdqamlb] {
    display: grid;
    grid-template-columns: 1fr 1fr;
}

.sd-col[b-43ytdqamlb] {
    padding: 14px 18px;
}

.sd-col-left[b-43ytdqamlb] {
    border-right: 1px solid var(--mud-palette-lines-default);
}

.sd-meta-label[b-43ytdqamlb] {
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.3px;
    margin-bottom: 3px;
}

.sd-meta-value[b-43ytdqamlb] {
    font-size: 13.5px;
}

.sd-ro-group + .sd-ro-group[b-43ytdqamlb] {
    margin-top: 14px;
}

/* Configured note — structured key/value */
.sd-cnote[b-43ytdqamlb] {
    background: var(--mud-palette-background-grey);
    border-radius: 8px;
    padding: 10px 12px;
}

.sd-cnote-dl[b-43ytdqamlb] {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 3px 10px;
}

[b-43ytdqamlb] .sd-cnote-dl dt {
    font-size: 12px;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

[b-43ytdqamlb] .sd-cnote-dl dd {
    font-size: 12.5px;
    margin: 0;
}

/* Activity log */
.sd-activity-log[b-43ytdqamlb] {
    display: flex;
    flex-direction: column;
    gap: 8px;
    max-height: 240px;
    overflow-y: auto;
}

.sd-log-item[b-43ytdqamlb] {
    display: flex;
    gap: 10px;
    align-items: flex-start;
}

.sd-log-icon[b-43ytdqamlb] {
    width: 22px;
    height: 22px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    margin-top: 1px;
}

.sd-log-icon-ok[b-43ytdqamlb] {
    background: var(--mud-palette-success-lighten);
    color: var(--mud-palette-success);
}

.sd-log-icon-fail[b-43ytdqamlb] {
    background: var(--mud-palette-error-lighten);
    color: var(--mud-palette-error);
}

.sd-log-icon-pending[b-43ytdqamlb] {
    background: var(--mud-palette-warning-lighten);
    color: var(--mud-palette-warning);
}

.sd-log-main[b-43ytdqamlb] {
    flex: 1;
}

.sd-log-title[b-43ytdqamlb] {
    font-size: 12.5px;
    font-weight: 500;
    display: flex;
    align-items: center;
    gap: 8px;
}

.sd-log-time[b-43ytdqamlb] {
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    font-weight: 400;
    margin-left: auto;
    white-space: nowrap;
}

.sd-log-detail[b-43ytdqamlb] {
    font-size: 12px;
    color: var(--mud-palette-text-secondary);
    margin-top: 2px;
}

@media (max-width: 820px) {
    .sd-body[b-43ytdqamlb] {
        grid-template-columns: 1fr;
    }

    .sd-col-left[b-43ytdqamlb] {
        border-right: none;
        border-bottom: 1px solid var(--mud-palette-lines-default);
    }
}
/* /Shared/ServiceDesk/ServiceDeskSessionChip.razor.rz.scp.css */
/* The chip and its FLOATING HOST only. Everything inside the panel is styled by
   ServiceDeskSessionPanel.razor.css, so a second placement of the panel inherits none of the
   positioning below.

   No hardcoded theme colours: every value is a MudBlazor palette variable so the app's live
   light/dark toggle carries through. */

/* Small "session is live" pulse on the chip. */
.sd-active-dot[b-z0xp5m96jd] {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--mud-palette-success);
    display: inline-block;
    margin-right: 5px;
    flex: none;
}

/* The floating window. Fixed, above the app bar, sized so the panel's own capped history keeps
   the whole thing inside the viewport. */
.sd-floating-work-panel[b-z0xp5m96jd] {
    position: fixed;
    /* Declared in app.css alongside the backdrop and the menu, so the three cannot drift. Below
       MudBlazor's dialog layer (1400) — at 1401 this panel covered every dialog opened from it. */
    z-index: var(--sd-z-floating-panel);
    width: 475px;
    max-width: calc(100vw - 32px);
    max-height: calc(100vh - 96px);
    display: flex;
    flex-direction: column;
    /* No border or radius here: the panel carries the accent shell, so a second frame around it
       would double up and the corners would not line up. The host contributes only elevation. */
    background: transparent;
    box-shadow: 0 12px 30px rgba(0, 0, 0, 0.22);
    border-radius: 8px;
}

.sd-floating-work-panel-backdrop[b-z0xp5m96jd] {
    position: fixed;
    inset: 0;
    z-index: var(--sd-z-floating-backdrop);
    background: transparent;
}
/* /Shared/ServiceDesk/ServiceDeskSessionDock.razor.rz.scp.css */
/* Placement shells only. Nothing here styles the panel or the strip — those own their own
   stylesheets, so a placement cannot restyle their internals. Palette variables throughout. */

.sd-dock[b-dxcfjbmqlm] {
    display: flex;
    flex-direction: column;
    background: var(--mud-palette-surface);
}

.sd-dock-top[b-dxcfjbmqlm] {
    margin-bottom: 4px;
}

/* Fixed so the bar stays reachable however far the page scrolls. Below MudBlazor's dialogs and
   popovers (1400+) but above page content, so a dialog is never trapped behind it. */
.sd-dock-bottom[b-dxcfjbmqlm] {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1200;
    box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.12);
}

/* A horizontal band cannot grow without bound: cap the expanded panel and let it scroll. Without
   this a long session would push a top dock past the viewport and hide the page entirely. */
.sd-dock-panel[b-dxcfjbmqlm] {
    max-height: 320px;
    min-height: 0;
    overflow-y: auto;
}

.sd-dock-drawer[b-dxcfjbmqlm] {
    display: flex;
    flex-direction: column;
}

/* The panel must fill the drawer for "the space left over" to mean anything - without a definite
   height on the column, flex: 1 on the history resolves to its content height and nothing changes. */
.sd-dock-drawer[b-dxcfjbmqlm]  .sd-session-panel {
    flex: 1;
    min-height: 0;
    max-height: 100%;
}

/* ───── Docked frame ─────
   The fixed ticket panel's shell, so a docked session reads as the same component family as the
   ticket panel on the User and Mailbox pages. Palette variables, so it follows the tenant's brand
   colour and the active theme. */
.sd-dock-frame[b-dxcfjbmqlm] {
    border: 1px solid var(--mud-palette-warning-lighten);
    border-radius: 8px;
    overflow: hidden;
    background: var(--mud-palette-surface);
    margin: 8px 12px;
}

/* The panel brings its own accent shell for the floating and drawer placements. Inside this frame
   that would be a border within a border, so it is suppressed here rather than made conditional in
   the panel - the placement is what knows it has already drawn a frame. */
.sd-dock-frame[b-dxcfjbmqlm]  .sd-session-panel {
    border: none;
    border-radius: 0;
}
/* /Shared/ServiceDesk/ServiceDeskSessionPanel.razor.rz.scp.css */
/* ─── MudTimeline styling fixes ─── */

[b-toyr3bz2qv] .mud-timeline-item-opposite {
    display: none !important;
}
[b-toyr3bz2qv] .mud-timeline-item {
    padding: 2px 0 !important;
}
@keyframes sd-pulse-b-toyr3bz2qv {
    0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.5; transform: scale(0.7); }
}
.sd-ticket-num[b-toyr3bz2qv] {
    font-weight: 700;
    font-size: 14px;
    font-variant-numeric: tabular-nums;
    letter-spacing: -.2px;
    white-space: nowrap;
    color: var(--mud-palette-text-primary);
}
/* The status pill's own rules moved to ServiceDeskStatusPicker.razor.css with the pill itself
   (#7380). They are not kept here as a fallback: CSS isolation scopes this file to this component,
   so they could never have reached the picker's markup — keeping them would be dead weight that
   reads like a live style. */
/* ─── Zone 2: Title line ─── */

/* The row that carries the title and, right-justified, the ticket status. The background and the
   bottom border moved OFF .sd-panel-title and onto this row: the title is now one flex child of two,
   so leaving them on the child painted a band that stopped short of the status pill. */
.sd-panel-title-row[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 4px 14px 8px;
    background: var(--mud-palette-background-gray);
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

/* Single-line, ellipsised. 30ch is the requirement expressed in the unit that actually means
   characters; the full title stays in the DOM and in the tooltip.
   min-width:0 is load-bearing — a flex child defaults to min-width:auto, which refuses to shrink
   below its content and defeats text-overflow entirely. */
.sd-panel-title[b-toyr3bz2qv] {
    flex: 1 1 auto;
    min-width: 0;
    max-width: 30ch;
    font-size: 13px;
    font-weight: 600;
    color: var(--mud-palette-text-primary);
    line-height: 1.35;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Pushed to the right edge, and never squeezed by a long title. */
.sd-panel-title-status[b-toyr3bz2qv] {
    flex: 0 0 auto;
    margin-left: auto;
}
/* Linked-tenant line: shows the tenant the session ticket belongs to, as a click-to-navigate link. */
.sd-tenant-line[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 6px 14px;
    font-size: 12px;
    border-bottom: 1px solid var(--mud-palette-lines-default);
    background: var(--mud-palette-surface);
    color: var(--mud-palette-text-secondary);
}
.sd-tenant-name[b-toyr3bz2qv] {
    color: var(--mud-palette-text-primary);
    font-weight: 600;
}
/* Pinned marker, sitting immediately after the pin button in the ticket header. Warning-toned to
   match the pin icon so the state and its control read as one thing rather than two unrelated bits
   of colour. Palette variables only — this has to hold up on the dark surface as well as the light
   one. */
.sd-sla-warn[b-toyr3bz2qv] { color: var(--mud-palette-warning); }
.sd-sla-crit[b-toyr3bz2qv] { color: var(--mud-palette-error); }
/* ─── Activity rows ─── */

.sd-grp-label[b-toyr3bz2qv] {
    font-size: 10.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .5px;
    color: var(--mud-palette-text-secondary);
    display: flex;
    align-items: baseline;
    gap: 6px;
    margin: 2px 0 6px;
}
.sd-grp-hint[b-toyr3bz2qv] {
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
    color: var(--mud-palette-text-disabled);
    font-size: 10.5px;
}
.sd-activity-row[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 6px 8px;
    border-radius: 8px;
    transition: .12s;
    position: relative;
}
.sd-activity-row:hover[b-toyr3bz2qv] {
    background: var(--mud-palette-action-default-hover);
}
.sd-stat[b-toyr3bz2qv] {
    width: 18px;
    height: 18px;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
}
/* Status pucks: palette fill with its paired contrast text, so the glyph stays readable
   in whichever theme is active. */
.sd-stat-done[b-toyr3bz2qv] { background: var(--mud-palette-success); color: var(--mud-palette-success-text); }
.sd-stat-queued[b-toyr3bz2qv] { background: var(--mud-palette-warning-hover); color: var(--mud-palette-warning); border: 1.5px solid var(--mud-palette-warning); }
.sd-stat-pending[b-toyr3bz2qv] { background: var(--mud-palette-warning-hover); color: var(--mud-palette-warning); border: 1.5px solid var(--mud-palette-warning); }
.sd-stat-failed[b-toyr3bz2qv] { background: var(--mud-palette-error); color: var(--mud-palette-error-text); }
.sd-stat-int[b-toyr3bz2qv] { background: var(--mud-palette-action-default-hover); color: var(--mud-palette-text-secondary); border: 1.5px solid var(--mud-palette-text-disabled); }
.sd-row-mid[b-toyr3bz2qv] {
    flex: 1;
    min-width: 0;
}
.sd-row-top[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 6px;
}
.sd-entity-tag[b-toyr3bz2qv] {
    font-size: 10px;
    font-weight: 700;
    padding: 1px 7px;
    border-radius: 6px;
    letter-spacing: .2px;
}
/* Entity tags: categorical, not semantic — each takes a distinct palette slot so the set
   stays tellable apart in both themes. */
.sd-ent-User[b-toyr3bz2qv] { background: var(--mud-palette-primary-hover); color: var(--mud-palette-primary); }
.sd-ent-Mailbox[b-toyr3bz2qv] { background: var(--mud-palette-secondary-hover); color: var(--mud-palette-secondary); }
.sd-ent-Subscription[b-toyr3bz2qv] { background: var(--mud-palette-success-hover); color: var(--mud-palette-success); }
.sd-ent-ActionItem[b-toyr3bz2qv] { background: var(--mud-palette-info-hover); color: var(--mud-palette-info); }
.sd-ent-Note[b-toyr3bz2qv] { background: var(--mud-palette-tertiary-hover); color: var(--mud-palette-tertiary); }
.sd-ent-Internal[b-toyr3bz2qv] { background: var(--mud-palette-action-default-hover); color: var(--mud-palette-text-secondary); }
.sd-ent-Device[b-toyr3bz2qv] { background: var(--mud-palette-warning-hover); color: var(--mud-palette-warning); }
.sd-row-when[b-toyr3bz2qv] {
    font-size: 10.5px;
    color: var(--mud-palette-text-disabled);
    font-variant-numeric: tabular-nums;
}
.sd-row-desc[b-toyr3bz2qv] {
    font-size: 11.5px;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    margin-top: 2px;
}
.sd-row-state[b-toyr3bz2qv] {
    font-size: 10.5px;
    font-weight: 700;
    white-space: nowrap;
}
.sd-state-done[b-toyr3bz2qv] { color: var(--mud-palette-success); }
.sd-state-queued[b-toyr3bz2qv] { color: var(--mud-palette-warning); }
.sd-state-pending[b-toyr3bz2qv] { color: var(--mud-palette-warning); }
.sd-state-failed[b-toyr3bz2qv] { color: var(--mud-palette-error); }
.sd-note-cust[b-toyr3bz2qv] { border-left-color: var(--mud-palette-tertiary); }
.sd-note-int[b-toyr3bz2qv] { border-left-color: var(--mud-palette-text-secondary); }
/* ═══════════════════════════════════════════════════════════════════════════════
   Panel shell, tabs, composer and history.

   No hardcoded theme colours anywhere below: every surface, text and line value is a
   --mud-palette-* variable, so the app's live dark-mode toggle carries through without this
   stylesheet knowing which theme is active. Low-alpha black overlays are the one exception —
   they read correctly on any background.
   ═══════════════════════════════════════════════════════════════════════════════ */

.sd-session-panel[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    min-height: 0;
    max-height: 100%;
    background: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);

    /* Accent shell, lifted from ServiceDeskTicketPanel.razor.css so the session panel and the fixed
       ticket panel read as the same component family. Warning is a PER-TENANT brand value from
       EcpBranding, so this tracks whatever the tenant sets — which is also why it must stay a
       variable rather than the amber literal the mockup used to stand in for it.

       Deliberately limited to the border and the tinted bands. The fixed panel accents its frame
       and header only and leaves its content neutral; carrying amber into tabs and buttons as well
       would make the accent the loudest thing on screen instead of the frame around it. */
    border: 1px solid var(--mud-palette-warning-lighten);
    border-radius: 8px;
    overflow: hidden;
}

/* OPERATION IN PROGRESS. The root is also inert (see the markup), which is what actually blocks
   input; this only makes the lock visible. Opacity and cursor carry no colour, so they read the
   same in light and dark mode. The progress bar is inside the root and dims with it, but it is
   the one moving element, so it stays unmistakable. */
.sd-session-panel.sd-sp-busy[b-toyr3bz2qv] {
    opacity: 0.65;
    cursor: progress;
    transition: opacity 120ms ease-in;
}
/* ───── Header ───── */
.sd-sp-header[b-toyr3bz2qv] {
    background: color-mix(in srgb, var(--mud-palette-warning-lighten) 12%, var(--mud-palette-surface));
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 8px 10px 6px;
    flex: none;
    cursor: default;
}
/* TWO HEADER ROWS, not one.
   The chrome row (session switcher, search, dock, close) and the ticket row (number, copy,
   open-in-PSA, unlink) were competing for the same ~400px, and the switcher grows with the session
   name — so the ticket number and its buttons were the ones that got squeezed. */
.sd-sp-header-chrome[b-toyr3bz2qv] {
    /* Tighter than the ticket row below it: this is a control strip, not a title. The bottom
       padding goes to zero so the two rows read as one header block rather than two bars. */
    padding-bottom: 0;
    min-height: 34px;

    /* WRAP IS LOAD-BEARING, not cosmetic. The expanded session list is a flex CHILD of this row
       carrying flex-basis:100%, so it can only drop onto its own line if the row wraps. Without
       this it squeezes in beside the controls and the row never grows — which is precisely the
       popover behaviour the inline list exists to replace. */
    flex-wrap: wrap;
}

.sd-sp-header-ticket[b-toyr3bz2qv] {
    /* No background of its own — it inherits the header tint, so the pair looks like a single
       header. A separate colour here would draw a line the operator has no reason to care about. */
    padding-top: 2px;
}

.sd-sp-header-icon[b-toyr3bz2qv] {
    color: var(--mud-palette-primary);
    flex: none;
}
.sd-sp-header-title[b-toyr3bz2qv] {
    font-size: 13px;
    font-weight: 600;
    color: var(--mud-palette-text-primary);
}
.sd-sp-header-spacer[b-toyr3bz2qv] {
    flex: 1;
}
.sd-sp-icon-btn[b-toyr3bz2qv] {
    padding: 2px;
}
/* ───── Unlinked state ───── */
.sd-sp-unlinked[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 4px 12px 14px;
}
.sd-sp-unlinked-msg[b-toyr3bz2qv] {
    font-size: 12px;
    line-height: 1.45;
    color: var(--mud-palette-text-secondary);
}
.sd-sp-hint[b-toyr3bz2qv] {
    font-size: 11px;
    color: var(--mud-palette-text-disabled);
}
/* ───── Unlink confirmation ───── */
.sd-sp-confirm[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 9px 11px;
    flex: none;
    background: var(--mud-palette-error-hover);
    border-top: 1px solid var(--mud-palette-error);
    border-bottom: 1px solid var(--mud-palette-error);
}
.sd-sp-confirm-text[b-toyr3bz2qv] {
    flex: 1;
    min-width: 0;
}
.sd-sp-confirm-q[b-toyr3bz2qv] {
    display: block;
    font-size: 12px;
    font-weight: 600;
    color: var(--mud-palette-text-primary);
}
.sd-sp-confirm-why[b-toyr3bz2qv] {
    display: block;
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
}
/* ───── Tabs ───── */
.sd-sp-tabs[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 2px;
    padding: 0 8px;
    flex: none;
    border-bottom: 1px solid var(--mud-palette-lines-default);
}
.sd-sp-tab[b-toyr3bz2qv] {
    padding: 8px 10px 7px;
    font-size: 12px;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
    border-bottom: 2px solid transparent;
    cursor: pointer;
    user-select: none;
}
.sd-sp-tab:hover[b-toyr3bz2qv] {
    color: var(--mud-palette-text-primary);
}
.sd-sp-tab.active[b-toyr3bz2qv] {
    color: var(--mud-palette-primary);
    border-bottom-color: var(--mud-palette-primary);
}
.sd-sp-tab-badge[b-toyr3bz2qv] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    margin-left: 4px;
    border-radius: 999px;
    background: var(--mud-palette-warning);
    color: var(--mud-palette-warning-text);
    font-size: 10px;
    font-weight: 700;
}
/* The tab body scrolls; the history below it does not move. */
.sd-sp-body[b-toyr3bz2qv] {
    padding: 10px 12px;
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}
.sd-sp-label[b-toyr3bz2qv] {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--mud-palette-text-secondary);
}
/* ───── Audience + time chip ───── */
.sd-sp-audience[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 5px;
    margin-bottom: 8px;
    flex-wrap: wrap;
}
.sd-sp-aud-opt[b-toyr3bz2qv] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    border-radius: 999px;
    border: 1px solid var(--mud-palette-lines-default);
    font-size: 11.5px;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
    cursor: pointer;
    user-select: none;
}
.sd-sp-aud-opt.active.cust[b-toyr3bz2qv] {
    border-color: var(--mud-palette-success);
    background: var(--mud-palette-success-hover);
    color: var(--mud-palette-success);
}
.sd-sp-aud-opt.active.int[b-toyr3bz2qv] {
    border-color: var(--mud-palette-primary);
    background: var(--mud-palette-primary-hover);
    color: var(--mud-palette-primary);
}
/* ───── Note type & visibility (issue #7475) ─────
   Green appears in exactly one place per provider: the customer-visible checkbox row where one
   exists, or the customer-facing type option where the type IS the visibility. Nothing else in the
   composer uses the success palette. */
.sd-sp-notetype-block[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin-bottom: 6px;
}
.sd-sp-notetype[b-toyr3bz2qv] {
    display: flex;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 8px;
    overflow: hidden;
}
.sd-sp-type-opt[b-toyr3bz2qv] {
    flex: 1;
    text-align: center;
    padding: 5px 8px;
    font-size: 11.5px;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
    cursor: pointer;
    user-select: none;
}
.sd-sp-type-opt + .sd-sp-type-opt[b-toyr3bz2qv] {
    border-left: 1px solid var(--mud-palette-lines-default);
}
.sd-sp-type-opt.active[b-toyr3bz2qv] {
    background: var(--mud-palette-primary-hover);
    color: var(--mud-palette-primary);
}
/* The green option: where the type IS the visibility, the customer-facing type carries the green
   that the checkbox carries elsewhere. */
.sd-sp-type-opt.active.cust-facing[b-toyr3bz2qv] {
    background: var(--mud-palette-success-hover);
    color: var(--mud-palette-success);
}
.sd-sp-vis-row[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 8px;
    padding: 0 8px;
    margin-bottom: 6px;
}
.sd-sp-vis-row.checked[b-toyr3bz2qv] {
    border-color: var(--mud-palette-success);
    background: var(--mud-palette-success-hover);
}
.sd-sp-vis-row.locked[b-toyr3bz2qv] {
    /* Locked ON: the fact stays visible but reads as a statement, not a control. */
    opacity: 0.85;
}
/* A stated limit, not a bug: why there is no checkbox, or why the type list is absent. */
.sd-sp-type-note[b-toyr3bz2qv] {
    border: 1px dashed var(--mud-palette-lines-default);
    border-radius: 8px;
    padding: 5px 8px;
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    margin-bottom: 6px;
}
.sd-sp-type-hint[b-toyr3bz2qv] {
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    margin-bottom: 6px;
}
.sd-sp-email-warn[b-toyr3bz2qv] {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    border: 1px solid var(--mud-palette-warning);
    background: var(--mud-palette-warning-hover);
    color: var(--mud-palette-warning-darken);
    border-radius: 8px;
    padding: 6px 8px;
    font-size: 11.5px;
    margin-bottom: 6px;
}
.sd-sp-onpost-caption[b-toyr3bz2qv] {
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    margin-top: 2px;
}
.sd-sp-time-intervals[b-toyr3bz2qv] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    padding: 2px;
}
.sd-sp-draft[b-toyr3bz2qv] {
    margin-bottom: 8px;
}
/* ───── Auto Post notice ─────
   Palette variables throughout, so it tracks light and dark mode. Info rather than warning: Auto
   Post working as configured is not a problem, it is a fact the operator needs before they type. */
.sd-sp-autopost[b-toyr3bz2qv] {
    display: flex;
    align-items: flex-start;
    gap: 7px;
    margin-bottom: 9px;
    padding: 7px 9px;
    border-radius: 8px;
    border: 1px solid var(--mud-palette-info);
    background: var(--mud-palette-info-hover);
    color: var(--mud-palette-text-primary);
}
.sd-sp-autopost .mud-icon-root[b-toyr3bz2qv] {
    flex: none;
    color: var(--mud-palette-info);
}
/* Auto Post OFF with work staged. Warning rather than info because there is now something to lose:
   the staged changes are not on the ticket, and nothing sends them but the operator. Same layout as
   the base, only the palette differs, so the two notices never drift apart in shape. */
.sd-sp-autopost.warn[b-toyr3bz2qv] {
    border-color: var(--mud-palette-warning);
    background: var(--mud-palette-warning-hover);
}
.sd-sp-autopost.warn .mud-icon-root[b-toyr3bz2qv] {
    color: var(--mud-palette-warning);
}
/* NOT-TRACKED page. Shares the warning palette with the staged-work notice rather than introducing
   a third colour — the two never appear together (the untracked notice folds the staged count into
   its own text), so one attention colour cannot be confused for the other. The class exists so the
   state is addressable in markup and in tests, not to carry a different look. */
.sd-sp-autopost.untracked[b-toyr3bz2qv] {
    border-color: var(--mud-palette-warning);
    background: var(--mud-palette-warning-hover);
}
.sd-sp-autopost.untracked .mud-icon-root[b-toyr3bz2qv] {
    color: var(--mud-palette-warning);
}
.sd-sp-autopost-text[b-toyr3bz2qv] {
    font-size: 0.72rem;
    line-height: 1.45;
    min-width: 0;
}
.sd-sp-count-autopost[b-toyr3bz2qv] {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    color: var(--mud-palette-info);
    font-weight: 600;
}
.sd-sp-count-autopost .mud-icon-root[b-toyr3bz2qv] {
    font-size: 0.9rem;
}
/* ───── On posting ───── */

/* One choice per line. MudBlazor lays a radio group out in a row by default, which put "Post the
   note only" and "Resolve the ticket" side by side — they read as one sentence rather than two
   options, and a third or fourth choice wraps into an unscannable block. */
.sd-sp-onpost[b-toyr3bz2qv]  .mud-input-control-boolean-input,
.sd-sp-onpost[b-toyr3bz2qv]  .mud-radio-group {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
}
.sd-sp-onpost[b-toyr3bz2qv] {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 8px;
    padding: 6px 8px;
    margin-bottom: 10px;
}
.sd-sp-onpost-head[b-toyr3bz2qv] {
    margin-bottom: 2px;
}
.sd-sp-post-row[b-toyr3bz2qv] {
    display: flex;
    /* The two post buttons sat edge to edge with nothing between them, so they read as one
       segmented control rather than two separate choices — and the destructive one (post AND
       unlink) was the easier of the two to hit by accident. */
    gap: 8px;
}
/* Both buttons carry MudBlazor's FullWidth (width:100%), so each one alone would claim the whole
   row and flex would resolve the overflow by shrinking them unequally once the labels differ in
   length — which they always do ("Add internal note" vs "Post internally and unlink and resolve").
   An explicit equal basis makes the split independent of label length. */
.sd-sp-post-row > *[b-toyr3bz2qv] {
    flex: 1 1 0;
    min-width: 0;
}
/* ───── Activity counts ───── */
.sd-sp-counts[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 10px;
    font-size: 11.5px;
    color: var(--mud-palette-text-secondary);
}
.sd-sp-count[b-toyr3bz2qv] {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    white-space: nowrap;
}
.sd-sp-count-sep[b-toyr3bz2qv] {
    width: 1px;
    height: 11px;
    background: var(--mud-palette-lines-default);
}
/* ───── Ticket facts ───── */
.sd-sp-facts[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
}
.sd-sp-fact[b-toyr3bz2qv] {
    display: flex;
    align-items: baseline;
    gap: 9px;
    padding: 6px 0;
    border-bottom: 1px solid var(--mud-palette-divider);
}
.sd-sp-fact-label[b-toyr3bz2qv] {
    width: 92px;
    flex: none;
    font-size: 10.5px;
    color: var(--mud-palette-text-secondary);
}
.sd-sp-fact-value[b-toyr3bz2qv] {
    flex: 1;
    min-width: 0;
    font-size: 12px;
    color: var(--mud-palette-text-primary);
    overflow-wrap: anywhere;
}
/* ───── History ─────
   Capped height with its own scroll, so a long-running session cannot push the panel past the
   viewport. Nothing is truncated — the list scrolls inside the cap. */
.sd-sp-history[b-toyr3bz2qv] {
    /* flex: none by default so the history sits under the body at its capped height. The fill
       variant overrides this - see .sd-sp-history-fill. */
    flex: none;
    padding: 8px 12px 10px;
    border-top: 1px solid var(--mud-palette-lines-default);
    /* Same tint as the header, so the panel is bookended rather than having one warm band and one
       cold one. */
    background: color-mix(in srgb, var(--mud-palette-warning-lighten) 12%, var(--mud-palette-surface));
}
.sd-sp-history-head[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 5px;
}
.sd-sp-history-title[b-toyr3bz2qv] {
    font-size: 10px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--mud-palette-text-secondary);
}
.sd-sp-history-count[b-toyr3bz2qv] {
    font-size: 10px;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 999px;
    background: var(--mud-palette-lines-default);
    color: var(--mud-palette-text-secondary);
}
.sd-sp-history-rule[b-toyr3bz2qv] {
    height: 1px;
    flex: 1;
    background: var(--mud-palette-divider);
}
/* History filter chips (#7622). The chip set's root is rendered by MudBlazor, so it is reached
   through ::deep anchored on this component's own .sd-sp-history element; the count span lives in
   the chip's child content and so keeps this component's scope. Palette variables only. */
.sd-sp-history[b-toyr3bz2qv]  .sd-sp-history-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin: 2px 0 6px;
}
.sd-sp-history-tab-count[b-toyr3bz2qv] {
    margin-left: 5px;
    font-size: 10px;
    font-weight: 700;
    color: var(--mud-palette-text-secondary);
}
/* The time read failed: said once, quietly, above the list — the notes below are still real. */
.sd-sp-history-notice[b-toyr3bz2qv] {
    font-size: 11px;
    margin-bottom: 4px;
    color: var(--mud-palette-warning);
}
/* The minutes on a time row, or on a note carrying its time entry's minutes. Filled in the info
   tone so it reads as a measurement, distinct from the audience and type badges beside it. */
.sd-sp-hist-time[b-toyr3bz2qv] {
    flex: none;
    font-size: 9.5px;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 999px;
    background: var(--mud-palette-info);
    color: var(--mud-palette-info-text);
}
.sd-sp-history-empty[b-toyr3bz2qv] {
    font-size: 11px;
    color: var(--mud-palette-text-disabled);
}
.sd-sp-history-list[b-toyr3bz2qv] {
    max-height: 178px;
    min-height: 0;
    overflow-y: auto;
    /* A visible track: an invisible scrollbar on a capped list reads as "that is all there is". */
    scrollbar-width: thin;
}
.sd-sp-history-list[b-toyr3bz2qv]::-webkit-scrollbar {
    width: 8px;
}
.sd-sp-history-list[b-toyr3bz2qv]::-webkit-scrollbar-thumb {
    background: var(--mud-palette-lines-default);
    border-radius: 4px;
}
.sd-sp-hist-row[b-toyr3bz2qv] {
    display: flex;
    align-items: baseline;
    gap: 7px;
    padding: 5px 0;
    border-bottom: 1px solid var(--mud-palette-divider);
    /* The whole row toggles the note open, so it has to read as clickable. */
    cursor: pointer;
}
.sd-sp-hist-row:hover[b-toyr3bz2qv] {
    background-color: var(--mud-palette-action-default-hover);
}
/* Keyboard focus must be visible — the row is a role="button" built from a div, so it gets no
   focus treatment of its own. */
.sd-sp-hist-row:focus-visible[b-toyr3bz2qv] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: -2px;
}
.sd-sp-hist-badge[b-toyr3bz2qv] {
    flex: none;
    font-size: 9.5px;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 999px;
}
.sd-sp-hist-badge.cust[b-toyr3bz2qv] {
    background: var(--mud-palette-success-hover);
    color: var(--mud-palette-success);
}
.sd-sp-hist-badge.int[b-toyr3bz2qv] {
    background: var(--mud-palette-lines-default);
    color: var(--mud-palette-text-secondary);
}
/* The note's TYPE beside its audience (issue #7475) — outlined rather than filled so the audience
   badge stays the row's loudest mark and the green keeps meaning "the customer sees it". */
.sd-sp-hist-type[b-toyr3bz2qv] {
    flex: none;
    font-size: 9.5px;
    font-weight: 600;
    padding: 1px 6px;
    border-radius: 999px;
    border: 1px solid var(--mud-palette-lines-default);
    color: var(--mud-palette-text-secondary);
}
.sd-sp-hist-text[b-toyr3bz2qv] {
    flex: 1;
    min-width: 0;
    font-size: 11.5px;
    line-height: 1.45;
    color: var(--mud-palette-text-primary);
    /* Two lines then ellipsis by default — enough to recognise a note. Clicking the row lifts the
       clamp (.expanded below) so the operator can read the whole thing without opening the PSA. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
/* Expanded: drop the line clamp and let the text wrap in full. -webkit-line-clamp only takes effect
   with display:-webkit-box, so returning display to block is what actually releases it — raising the
   clamp value would still cap it. white-space:pre-wrap keeps the note's own line breaks, which the
   formatted progress notes rely on. */
.sd-sp-hist-text.expanded[b-toyr3bz2qv] {
    display: block;
    -webkit-line-clamp: none;
    overflow: visible;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}
.sd-sp-hist-when[b-toyr3bz2qv] {
    flex: none;
    font-size: 10px;
    color: var(--mud-palette-text-disabled);
    font-variant-numeric: tabular-nums;
    /* The cell now carries a date as well as a clock reading, so it must not break between the two
       — a timestamp wrapped mid-value is harder to read than a narrower note. The text cell beside
       it already clamps and ellipsises, so it absorbs the extra width without overflowing. */
    white-space: nowrap;
}
/* ───── Composer layout ─────
   The same three cells, stacked in a tall placement and side by side in a docked band. One grid
   definition apart, so there is no second copy of the composer to keep in step. */
.sd-sp-compose[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
}
.sd-sp-compose-h[b-toyr3bz2qv] {
    /* FLEX, not grid. The number of cells varies - the staged-summary cell is absent when nothing is
       staged - and a fixed three-column template then left an empty column, which showed up as a
       large blank space beside the composer. Flex simply distributes what is there. */
    display: flex;
    gap: 16px;
    align-items: stretch;
}
/* Note and summary share the room; the post-action cell is sized to its content because a radio
   list gains nothing from extra width. */
.sd-sp-compose-h > .sd-sp-cell[b-toyr3bz2qv] {
    flex: 1 1 0;
    min-width: 0;
}
.sd-sp-compose-h > .sd-sp-cell:last-child[b-toyr3bz2qv] {
    flex: 0 0 clamp(220px, 28%, 320px);
}
/* In the horizontal layout the post button belongs at the foot of its own cell rather than
   floating mid-column, so the cell stretches and the row is pushed down. */
.sd-sp-compose-h .sd-sp-cell[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    min-width: 0;
    height: 100%;
}
.sd-sp-compose-h .sd-sp-post-row[b-toyr3bz2qv] {
    margin-top: auto;
    padding-top: 9px;
}
/* Stacked, the cells are just sequential blocks. */
.sd-sp-compose:not(.sd-sp-compose-h) .sd-sp-cell[b-toyr3bz2qv] {
    min-width: 0;
}
/* ───── Working area ─────
   Stacked by default: tabs and body, then the history beneath. */
.sd-sp-work[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    min-height: 0;
    flex: 1;
}
.sd-sp-workmain[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    min-height: 0;
    flex: 1;
}
/* In a horizontal dock the history becomes its own COLUMN on the right. A band has width and no
   height, so stacked underneath it fell outside the capped area and could not be reached. */
.sd-sp-work-split[b-toyr3bz2qv] {
    display: grid;
    /* Even halves. The history is no longer a narrow sidebar: with the details grid gone it is one
       of the two things a docked session is FOR, so it gets equal room rather than the remainder.
       minmax(0, ...) on both so a long note cannot push its column past its half. */
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    align-items: stretch;
}
.sd-sp-work-split .sd-sp-history[b-toyr3bz2qv] {
    border-top: none;
    border-left: 1px solid var(--mud-palette-lines-default);
    display: flex;
    flex-direction: column;
    min-height: 0;
}
/* Given a column of its own, the history can use the height instead of a fixed cap. */
.sd-sp-work-split .sd-sp-history-list[b-toyr3bz2qv] {
    max-height: none;
    flex: 1;
}
@media (max-width: 900px) {
    /* Too narrow to sit side by side — fall back to stacked so neither column is unusable. */
    .sd-sp-work-split[b-toyr3bz2qv] {
        display: flex;
        flex-direction: column;
    }
.sd-sp-work-split .sd-sp-history[b-toyr3bz2qv] {
        border-left: none;
        border-top: 1px solid var(--mud-palette-lines-default);
    }
.sd-sp-work-split .sd-sp-history-list[b-toyr3bz2qv] {
        max-height: 178px;
    }
}
/* ───── History in a full-height placement ─────
   The right dock is a full-height drawer, so the history takes the remaining space rather than
   scrolling inside a fixed box with emptiness beneath it. The floating window keeps its cap: there
   the panel must not grow past the viewport. */
/* In a full-height placement the MAIN section is not height-restricted: it takes whatever it needs
   and the history starts after it, claiming only the space left over.

   The previous version gave the history flex: 1 while the body also had flex: 1, so the two SPLIT
   the column - the composer ended up in its own scrollbox with the history occupying half the
   drawer. Only one of them can be the flexible one, and it is the history. */
.sd-sp-fill .sd-sp-body[b-toyr3bz2qv] {
    flex: 0 0 auto;
    overflow-y: visible;
}
.sd-sp-fill .sd-sp-workmain[b-toyr3bz2qv] {
    flex: 0 0 auto;
    min-height: 0;
}
.sd-sp-fill .sd-sp-work[b-toyr3bz2qv] {
    flex: 1;
    min-height: 0;
}
.sd-sp-history-fill[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    min-height: 0;
    /* Takes the remainder BELOW the main section, rather than competing with it. */
    flex: 1;
}
.sd-sp-history-fill .sd-sp-history-list[b-toyr3bz2qv] {
    max-height: none;
    min-height: 0;
    flex: 1;
    overflow-y: auto;
}
/* ───── Session clock, on the tab row ─────
   ONE bordered pill: [pause] | [stopwatch] [elapsed] (+ PAUSED). The button and the reading are
   siblings inside it, so the control visibly owns the number instead of floating beside it.

   26px is load-bearing. The tab row is 32px (.sd-sp-tab: 8px/7px padding on 12px text), so the pill
   has to be smaller than that or it grows the row - which is exactly what a default 40px+
   MudIconButton was doing. flex:none stops the pill being squeezed by the spacer. */
.sd-sp-clock[b-toyr3bz2qv] {
    display: inline-flex;
    align-items: center;
    height: 26px;
    flex: none;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 999px;
    background: var(--mud-palette-surface);
}
/* Square inner edge so the button reads as one END of the pill rather than a circle inside it. */
.sd-sp-clock-btn[b-toyr3bz2qv] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    padding: 0;
    border: none;
    border-radius: 999px 0 0 999px;
    background: transparent;
    color: var(--mud-palette-text-secondary);
    cursor: pointer;
}
.sd-sp-clock-btn:hover[b-toyr3bz2qv] {
    background: var(--mud-palette-action-default-hover);
    color: var(--mud-palette-text-primary);
}
/* Keyboard focus must be visible: a native button loses the UA ring once background is restyled. */
.sd-sp-clock-btn:focus-visible[b-toyr3bz2qv] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: -2px;
}
/* Both icons in the pill. 16px keeps them inside 26px with room to breathe; MudIcon's own Size
   would set a font-size we then have to fight. */
.sd-sp-clock-icon[b-toyr3bz2qv] {
    font-size: 16px;
    width: 16px;
    height: 16px;
}
.sd-sp-clock-div[b-toyr3bz2qv] {
    width: 1px;
    height: 16px;
    flex: none;
    background: var(--mud-palette-lines-default);
}
/* ALL THREE ITEMS CENTRE ON THE SAME 26px AXIS.
   The button is a direct flex child with an explicit height, so it centres exactly. The reading is
   wrapped in a MudTooltip, and it is the TOOLTIP ROOT that is the flex child - with no height of
   its own it sizes to its content, which includes the tooltip's own markup, so centring that taller
   root left the visible stopwatch and figure sitting above the pill's centre line. Reported by
   Sudhir 2026-09-09: "vertically aligned slightly higher than the play/pause icon".

   Fixed by giving the wrapper the same fixed height and centring as the button, rather than by
   nudging the text down with a magic offset - an offset would be tuned to one font and would drift
   the moment the row or the icon size changed. ::deep because the wrapper is MudBlazor's element,
   not ours, so CSS isolation would not otherwise reach it. */
.sd-sp-clock[b-toyr3bz2qv]  .mud-tooltip-root {
    display: inline-flex;
    align-items: center;
    height: 26px;
}
/* tabular-nums so the digits do not jitter as the clock ticks - the one property that must survive
   any refactor of this block, since without it the whole pill shuffles once a second.
   line-height:1 removes the font's leading, which is the other half of the misalignment: the extra
   space sits below the glyphs, so a line box taller than the text pushes them visually upward. */
.sd-sp-clock-read[b-toyr3bz2qv] {
    display: inline-flex;
    align-items: center;
    height: 26px;
    line-height: 1;
    gap: 4px;
    padding: 0 9px 0 8px;
    font-size: 11.5px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    color: var(--mud-palette-text-primary);
    white-space: nowrap;
}
/* ───── Paused: a state of the whole group ─────
   Border, ground and icon go to warning, and the readout drops to secondary so the number visibly
   STOPS. That combination is what distinguishes a paused clock from a running one - a dimmed number
   on its own did not, which is why the state moved onto the whole pill rather than the figure.
   The worded PAUSED badge that once sat here is screen-reader-only now (.sd-sp-clock-state), so
   colour and border are the whole VISIBLE signal. (Copilot spotted this comment still promising a
   visible word, PR #7311.) */
.sd-sp-clock-paused[b-toyr3bz2qv] {
    border-color: var(--mud-palette-warning);
    background: var(--mud-palette-warning-hover);
}
.sd-sp-clock-paused .sd-sp-clock-btn[b-toyr3bz2qv] {
    color: var(--mud-palette-warning);
}
.sd-sp-clock-paused .sd-sp-clock-div[b-toyr3bz2qv] {
    background: var(--mud-palette-warning);
}
.sd-sp-clock-paused .sd-sp-clock-read[b-toyr3bz2qv] {
    color: var(--mud-palette-text-secondary);
}
/* SCREEN-READER ONLY, in both states. The visible PAUSED word was removed at Sudhir's request
   (2026-09-09): the pill's warning border and ground already say paused, and a word beside them was
   a third statement of the same fact.
   NOT display:none or visibility:hidden - either takes the element out of the accessibility tree and
   the announcement with it, which is the whole reason it is rendered unconditionally. */
.sd-sp-clock-state[b-toyr3bz2qv] {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
/* The draft field carries the staged detail now, so it has to show a real note rather than three
   lines of it. Lines="8" roughly doubles the old starting height; past that the textarea scrolls
   rather than pushing the post button out of reach. Expressed in em so the cap tracks the font
   instead of a magic pixel value. */
/* The row count grows to 16 in C# (DraftLines); this is the hard scroll cap past that. */
.sd-sp-draft[b-toyr3bz2qv]  textarea {
    max-height: 22em;
    overflow-y: auto;
}
/* ───── Withdrawn (queued note removed) ─────
   Muted rather than coloured: the change happened, its note simply will not be sent, so it is neither
   a success nor a failure. Palette variables so it tracks light and dark. */
.sd-stat-removed .mud-icon-root[b-toyr3bz2qv],
.sd-state-removed[b-toyr3bz2qv] {
    color: var(--mud-palette-text-disabled);
}
.sd-state-removed[b-toyr3bz2qv] {
    font-style: italic;
}
/* Hover target for a tooltip on a DISABLED button. The button swallows pointer events, so the
   explanation has to hang off a wrapper; block so it does not collapse the full-width button. */
.sd-sp-gate[b-toyr3bz2qv] {
    display: block;
    width: 100%;
}

/* Create button plus its compact close affordance, so replacing the toggle does not strand the
   operator in an open search with no way out. */
.sd-sp-create-row[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 4px;
}

/* The inline search shown while a session is already linked — the switcher's "Search Ticket" path. */
.sd-sp-linked-search[b-toyr3bz2qv] {
    padding: 8px 14px 4px;
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

/* One definition for both search surfaces: the unlinked panel's inline search and the linked-search
   branch. They render the same scope controls, so they must not drift apart visually either. */
.sd-sp-linked-search-head[b-toyr3bz2qv],
.sd-sp-search-head[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 4px;
}

/* Explains why the "On posting" choices are absent on a finished ticket. Palette variables, never
   literals, so it holds in both themes. */
.sd-sp-onpost-note[b-toyr3bz2qv] {
    font-size: 0.78rem;
    line-height: 1.45;
    color: var(--mud-palette-text-secondary);
    background: var(--mud-palette-background-gray);
    border-left: 2px solid var(--mud-palette-lines-default);
    border-radius: 2px;
    padding: 0.4rem 0.55rem;
    margin-bottom: 0.5rem;
}

/* ----- Attachments -----
   Every colour comes from a MudBlazor palette variable so the strip tracks the live dark-mode
   toggle. No hex here by design — see .claude/rules/blazor-dark-mode.md. */
.sd-sp-attach-row[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.25rem;
}

.sd-sp-attach-hint[b-toyr3bz2qv] {
    color: var(--mud-palette-text-secondary);
}

.sd-sp-attach-list[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    gap: 0.375rem;
    margin-top: 0.5rem;
}

.sd-sp-attach-item[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.25rem 0.5rem;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    background-color: var(--mud-palette-background-gray);
}

/* Fixed box with object-fit so a tall screenshot cannot stretch the row — the thumbnail is
   cropped to a consistent tile rather than driving the layout. */
.sd-sp-attach-thumb[b-toyr3bz2qv] {
    width: 32px;
    height: 32px;
    object-fit: cover;
    border-radius: 3px;
    flex-shrink: 0;
}

.sd-sp-attach-thumb-icon[b-toyr3bz2qv] {
    color: var(--mud-palette-text-secondary);
    flex-shrink: 0;
}

/* min-width:0 is what actually lets the name ellipsis work — without it the flex item refuses to
   shrink below its content width and the remove button gets pushed out of the row. */
.sd-sp-attach-meta[b-toyr3bz2qv] {
    display: flex;
    flex-direction: column;
    min-width: 0;
    flex: 1;
}

.sd-sp-attach-name[b-toyr3bz2qv] {
    font-size: 0.8125rem;
    color: var(--mud-palette-text-primary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.sd-sp-attach-size[b-toyr3bz2qv] {
    font-size: 0.6875rem;
    color: var(--mud-palette-text-secondary);
}

/* The post-and-finish button, stacked under the ordinary post. Separated so the pair reads as
   "post" and then "post and leave", rather than as two equal choices competing for the click. */
.sd-sp-post-finish[b-toyr3bz2qv] {
    /* Intentionally carries no margin-top. The row is a flex ROW, so a top margin never applied
       horizontally at all; the row's gap now owns the spacing in both directions. */
}

/* ─── Paused timer (#7294) ───
   The rules moved into the .sd-sp-clock block above, where the pill they style now lives. This
   comment previously argued that the transport icon alone carried the state and no worded badge was
   needed; that has been REVERSED. Dimming the figure was not enough — a stopped clock still read as
   a running one, because the only difference was a 16px glyph and a number that had stopped moving,
   and neither is something an operator notices without looking for it. Paused is now a state of the
   whole group: border, ground, icon and a dimmed readout. The worded PAUSED badge that this
   once mentioned is screen-reader-only (.sd-sp-clock-state) since Sudhir removed the visible
   word on 2026-09-09, so colour and border are the entire visible signal. */

/* Session-scoped Auto Post controls, directly under the notice that explains the current state. */
.sd-sp-autopost-actions[b-toyr3bz2qv] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 4px;
    margin: -2px 0 6px;
}

/* Restore-auto-notes control, right-aligned above the composer field. Pulled tight against the
   field with a negative bottom margin so the affordance reads as part of the composer, not a
   separate toolbar; appears only while staged detail is missing from the draft. */
.sd-sp-draft-tools[b-toyr3bz2qv] {
    display: flex;
    justify-content: flex-end;
    margin: 0 0 -4px;
}

/* The armed state of the clock-restart control: the first click arms, and the button itself is
   the confirmation, so the armed state must be unmistakable at 16px. Palette error tones so it
   tracks light and dark. */
.sd-sp-clock-btn-armed[b-toyr3bz2qv] {
    color: var(--mud-palette-error);
    background: var(--mud-palette-error-hover);
    border-radius: 4px;
}
/* /Shared/ServiceDesk/ServiceDeskSessionSearchDialog.razor.rz.scp.css */
/*
    Ticket search dialog.

    EVERY colour here is a MudBlazor palette variable. Dark mode in EcpPro is a live runtime toggle
    on MudThemeProvider, not a prefers-color-scheme media query, so a hardcoded hex does not "look
    wrong in dark mode" — it stays light while everything around it flips. The palette variables are
    the mechanism that tracks the active theme.
*/

/* Scope sentence — one line, above the field, wrapping as a unit rather than breaking mid-sentence. */
.sd-search-scope[b-ercfngbtrm] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    padding-bottom: 0.25rem;
    color: var(--mud-palette-text-primary);
}

/* Secondary weight: the icon labels the sentence, it is not the thing being read. */
.sd-search-scope-icon[b-ercfngbtrm] {
    color: var(--mud-palette-text-secondary);
}

/*
    The reason a chip cannot be used. Indented to sit under the chip row it explains, and in
    secondary text because it is an explanation rather than a warning — the filter being
    unavailable is not an error state.
*/
.sd-search-chip-reason[b-ercfngbtrm] {
    display: block;
    padding-top: 0.25rem;
    padding-left: 0.25rem;
    color: var(--mud-palette-text-secondary);
}

/* Count line. Same secondary weight so it reads as a footnote to the chips, not a third control. */
.sd-search-summary[b-ercfngbtrm] {
    display: block;
    padding-top: 0.25rem;
    padding-left: 0.25rem;
    color: var(--mud-palette-text-secondary);
}

/*
    THE RESULTS REGION.

    A FIXED height, not a min-height. The region is occupied in every state, so the dialog keeps one
    size as the operator types — the buttons below never move under the pointer, and the dialog does
    not jump each time a search returns a different number of rows.
*/
.sd-search-results[b-ercfngbtrm] {
    height: 18rem;
    margin-top: 0.5rem;
    overflow-y: auto;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius);
    background-color: var(--mud-palette-surface);
}

/* The three non-result states: centred, secondary, deliberately quiet. */
.sd-search-results-hint[b-ercfngbtrm] {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    height: 100%;
    padding: 1rem;
    text-align: center;
    color: var(--mud-palette-text-secondary);
}

.sd-search-row[b-ercfngbtrm] {
    display: flex;
    flex-direction: column;
    gap: 0.125rem;
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--mud-palette-divider);
    cursor: pointer;
}

.sd-search-row:last-child[b-ercfngbtrm] {
    border-bottom: none;
}

.sd-search-row:hover[b-ercfngbtrm] {
    background-color: var(--mud-palette-action-default-hover);
}

/*
    The KEYBOARD highlight. A background alone is not enough — it has to be distinguishable from the
    mouse hover, or arrowing through the list looks identical to hovering it. The left border is what
    carries that difference.
*/
.sd-search-row-active[b-ercfngbtrm] {
    background-color: var(--mud-palette-action-default-hover);
    box-shadow: inset 3px 0 0 0 var(--mud-palette-primary);
}

/* Customer leads on a widened search — the field that tells two similar tickets apart. */
/* Customer left, assignee right. The line is a MudStack and the parts are MudText, so every rule
   reaches them with ::deep from .sd-search-row, the element THIS component renders — CSS isolation
   does not tag a child component's elements. Colour is not set here: it comes from each MudText's
   own palette-driven Color parameter. The ellipsis lives on the customer, which gives way first;
   min-width: 0 is what lets a flex child shrink below its content at all. */
.sd-search-row[b-ercfngbtrm]  .sd-search-row-top {
    min-width: 0;
}

.sd-search-row[b-ercfngbtrm]  .sd-search-row-customer {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 500;
}

/* Right-justified whether or not a customer precedes it. Never shrinks; max-width caps it. */
.sd-search-row[b-ercfngbtrm]  .sd-search-row-assignee {
    margin-left: auto;
    flex: 0 0 auto;
    max-width: 50%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sd-search-row-main[b-ercfngbtrm] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
}

.sd-search-row-number[b-ercfngbtrm] {
    color: var(--mud-palette-text-primary);
    white-space: nowrap;
}

/* Titles are long and arbitrary; the row must not grow to fit one. */
.sd-search-row-title[b-ercfngbtrm] {
    color: var(--mud-palette-text-primary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

.sd-search-row-meta[b-ercfngbtrm] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    color: var(--mud-palette-text-secondary);
}

/*
    Status pill. Hand-rolled rather than a MudChip: a chip inside a clickable row swallows the click
    on its own surface, which is the same class of trap as MudMenu's ActivatorContent.
*/
/* Unassigned is the claimable case, so it reads as information rather than as
   secondary text. Palette variable only, so it follows light and dark mode. */
.sd-search-row[b-ercfngbtrm]  .sd-search-row-assignee.sd-search-row-unassigned {
    font-weight: 600;
}

.sd-search-row-status[b-ercfngbtrm] {
    padding: 0.0625rem 0.5rem;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 1rem;
    font-size: 0.75rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}
/* /Shared/ServiceDesk/ServiceDeskSessionStrip.razor.rz.scp.css */
/* The docked summary band. No hardcoded theme colours: the tint comes from the ThemeColour
   parameter applied inline over a palette surface, and everything else is a palette variable. */

.sd-strip[b-radi1oqc35] {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    flex-wrap: wrap;
    /* The tinted header band, same recipe as ServiceDeskTicketPanel's .sd-header. The dock frame
       draws the border, so this contributes the fill only. ThemeColour is layered over the top
       inline (see BandStyle) for the tenant's own brand tint. */
    background: color-mix(in srgb, var(--mud-palette-warning-lighten) 12%, var(--mud-palette-surface));
    min-height: 48px;
    color: var(--mud-palette-text-primary);
}

.sd-strip-icon[b-radi1oqc35] {
    color: var(--mud-palette-primary);
    flex: none;
}

.sd-strip-ticket[b-radi1oqc35] {
    font-weight: 700;
    font-size: 13px;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.sd-strip-pill[b-radi1oqc35] {
    font-size: 10px;
    font-weight: 700;
    padding: 2px 8px;
    border-radius: 999px;
    background: var(--mud-palette-primary-hover);
    color: var(--mud-palette-primary);
    white-space: nowrap;
}

.sd-strip-tenant[b-radi1oqc35] {
    font-size: 11.5px;
    color: var(--mud-palette-text-secondary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 200px;
}

.sd-strip-spacer[b-radi1oqc35] {
    flex: 1;
}

.sd-strip-chip[b-radi1oqc35] {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 3px 10px;
    border-radius: 999px;
    border: 1px solid var(--mud-palette-lines-default);
    background: var(--mud-palette-surface);
    font-size: 11.5px;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
    cursor: pointer;
    user-select: none;
    white-space: nowrap;
}

.sd-strip-chip:hover[b-radi1oqc35] {
    border-color: var(--mud-palette-primary);
    color: var(--mud-palette-primary);
}

.sd-strip-chip-warn[b-radi1oqc35] {
    border-color: var(--mud-palette-warning);
    background: var(--mud-palette-warning-hover);
    color: var(--mud-palette-warning);
}

.sd-strip-chip-action[b-radi1oqc35] {
    border-color: var(--mud-palette-success);
    background: var(--mud-palette-success-hover);
    color: var(--mud-palette-success);
}

.sd-strip-menu-row[b-radi1oqc35] {
    display: block;
    max-width: 320px;
    font-size: 12px;
    overflow-wrap: anywhere;
}

.sd-strip-title[b-radi1oqc35] {
    font-size: 13px;
    color: var(--mud-palette-text-primary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 620px;
}

.sd-strip-unlink[b-radi1oqc35],
.sd-strip-details[b-radi1oqc35] {
    min-width: 0;
    padding: 2px 8px;
    font-size: 11px;
}
/* /Shared/ServiceDesk/ServiceDeskSessionSwitcher.razor.rz.scp.css */
/* Theme-driven throughout: no literal colours, so the switcher tracks light and dark mode. */
/* Styled as a chip rather than inheriting MudButton's look, because the activator is now a plain
   span — see the note on ActivatorContent for why it cannot be a MudButton. */
.sd-session-switch[b-hqkv42332n] {
    display: inline-flex;
    align-items: center;
    gap: 1px;
    font-size: 0.72rem;
    font-weight: 600;
    line-height: 1;
    padding: 3px 4px 3px 8px;
    border-radius: 6px;
    cursor: pointer;
    user-select: none;
    white-space: nowrap;
    color: var(--mud-palette-text-secondary);
    background: var(--mud-palette-action-default-hover);
}

.sd-session-switch:hover[b-hqkv42332n] {
    color: var(--mud-palette-text-primary);
    background: var(--mud-palette-action-disabled-background);
}

/* Keyboard focus must be visible — the span carries role="button" and tabindex, so it is reachable
   by tab and would otherwise give no sign of where focus is. */
.sd-session-switch:focus-visible[b-hqkv42332n] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: 1px;
}

.sd-session-row[b-hqkv42332n] {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
}

.sd-session-row-label[b-hqkv42332n] {
    font-weight: 600;
    color: var(--mud-palette-text-primary);
}

/* Time spent. Pushed to the right of the tenant name and never shrunk, so the figure stays readable
   whatever the tenant is called — it is the one number on the row that is about to be billed.
   Palette variables, so it tracks the tenant's brand colour and the active theme. */
/* The reason a row is greyed out. Muted and italic so it reads as an explanation rather than as part
   of the ticket's own label. */
.sd-session-row-foreign[b-hqkv42332n] {
    font-size: 0.7rem;
    font-style: italic;
    color: var(--mud-palette-text-disabled);
}

.sd-session-row-time[b-hqkv42332n] {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    margin-left: auto;
    flex: none;
    font-size: 0.75rem;
    font-variant-numeric: tabular-nums;
    color: var(--mud-palette-text-secondary);
}

.sd-session-row-tenant[b-hqkv42332n] {
    font-size: 0.75rem;
    color: var(--mud-palette-text-secondary);

    /* A long tenant name must not stretch the menu past the panel it hangs off. */
    max-width: 14rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sd-session-row-badge[b-hqkv42332n] {
    margin-left: auto;
}

/* Hover target for the tooltip on the disabled "Link another ticket" item — a disabled MudMenuItem
   emits no pointer events, so the explanation has to hang off a wrapper. Block, or the wrapper
   collapses the item's full-width layout inside the popover. */
.sd-session-gate[b-hqkv42332n] {
    display: block;
    width: 100%;
}

/* Sits at the end of the row, after the time and the unposted badge. */
.sd-session-row-unlink[b-hqkv42332n] {
    flex: none;
    margin-left: 4px;
}

/* ─── Inline session list ───
   Replaces the popover. This is a flex CHILD of the panel header's chrome row, and flex-basis:100%
   is what drops it onto its own line so the row grows and the panel's contents move DOWN — the
   whole point of the change. The row must carry flex-wrap for this to take effect. */
.sd-session-inline-list[b-hqkv42332n] {
    flex: 0 0 100%;

    /* ORDER IS LOAD-BEARING. The switcher is the FIRST child of the header row, so without this the
       list wraps to line two and shunts the search, dock and close buttons down to line three —
       they appeared below the sessions instead of staying beside the activator. A high order value
       lays the list out last, so those controls keep line one and the list takes line two. */
    order: 99;
    display: flex;
    flex-direction: column;
    gap: 2px;
    margin-top: 6px;

    /* Its OWN ground, so the operator can tell the session-management strip from the ticket they
       are working on. background-gray sits a step off the header tint rather than fighting it, and
       the inset margin plus rounding make it read as a panel within the header rather than another
       full-width bar. */
    background: var(--mud-palette-background-gray);
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 6px;
    padding: 4px;

    /* Capped so a full set of sessions cannot swallow the composer. The cap is generous enough for
       the five-session limit; beyond that it scrolls rather than pushing the work off screen. */
    max-height: 40vh;
    overflow-y: auto;
}

/* The rows are now clickable divs rather than MudMenuItems, so they carry their own affordance. */
.sd-session-inline-list .sd-session-row[b-hqkv42332n] {
    cursor: pointer;
    border-radius: 6px;
    padding: 4px 6px;
}

.sd-session-inline-list .sd-session-row:hover[b-hqkv42332n] {
    background: var(--mud-palette-action-default-hover);
}

/* Keyboard focus must be visible — these rows are tabbable and were previously menu items, which
   got focus styling from MudBlazor for free. */
.sd-session-inline-list .sd-session-row:focus-visible[b-hqkv42332n] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: -2px;
}

/* The active session is marked by its radio icon; this adds a quiet ground so it is findable in a
   list of five without relying on the icon alone. */
.sd-session-inline-list .sd-session-row-active[b-hqkv42332n] {
    background: var(--mud-palette-primary-hover);
}

/* Paused marker on a session row (#7294). Warning-toned rather than the disabled grey used by
   "switches tenant": that one is an aside, this one is a state the operator may need to act on —
   a session whose clock they stopped and have not restarted. Palette variables, both themes. */
/* Now a pause GLYPH rather than the word, so the type rules that shaped the text are gone and only
   the size remains. Colour stays on the component (Color.Warning) so it tracks the palette in both
   themes; sizing it here keeps it from crowding the row's other icons. */
.sd-session-row-paused[b-hqkv42332n] {
    font-size: 1rem;
    flex: none;
}
/* /Shared/ServiceDesk/ServiceDeskStatusPicker.razor.rz.scp.css */
/* Status picker — pill and chip appearances.

   EVERY colour is a MudBlazor palette variable. Dark mode in EcpPro is a live runtime toggle, not
   a prefers-color-scheme query, so a literal hex here would survive the theme flip and end up
   unreadable on the opposite surface. The only literals are low-alpha black overlays, which read
   correctly on any background. */

.sd-sp-pick-pill[b-16l17q414c],
.sd-sp-pick-chip[b-16l17q414c] {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    line-height: 1.2;
}

/* The session panel's rounded pill, sitting against the ticket title. Metrics copied from the
   panel's own .sd-status-pill so moving the pill into this component is not also a restyle. */
.sd-sp-pick-pill[b-16l17q414c] {
    font-size: 10px;
    font-weight: 700;
    padding: 2px 7px;
    border-radius: 20px;
    letter-spacing: .3px;
    max-width: 170px;
}

/* The ticket panel's compact chip on the header row. That panel used a FILLED MudChip, so the tone
   rules below are overridden to a solid fill for this appearance only — the two hosts genuinely
   looked different before this component and keeping that difference is the point of the
   appearance parameter. */
.sd-sp-pick-chip[b-16l17q414c] {
    padding: 1px 10px;
    border-radius: 16px;
    font-size: 0.75rem;
    font-weight: 500;
    flex-shrink: 0;
    min-height: 24px;
}

.sd-sp-pick-chip.sd-sp-tone-new[b-16l17q414c] {
    background: var(--mud-palette-primary);
    color: var(--mud-palette-primary-text);
}

.sd-sp-pick-chip.sd-sp-tone-inprog[b-16l17q414c] {
    background: var(--mud-palette-warning);
    color: var(--mud-palette-warning-text);
}

.sd-sp-pick-chip.sd-sp-tone-resolved[b-16l17q414c] {
    background: var(--mud-palette-success);
    color: var(--mud-palette-success-text);
}

.sd-sp-pick-chip.sd-sp-tone-default[b-16l17q414c] {
    background: var(--mud-palette-action-default-hover);
    color: var(--mud-palette-text-primary);
}

/* Interactive state. Applied only on the activator, so the read-only render keeps the flat look it
   had before this component existed — the affordance is what tells an operator a pick is possible,
   and showing it without the permission would be a lie. */
.sd-sp-pick[b-16l17q414c] {
    cursor: pointer;
    transition: box-shadow 120ms ease-in-out, filter 120ms ease-in-out;
}

.sd-sp-pick:hover[b-16l17q414c] {
    filter: brightness(1.08);
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
}

/* A REAL focus ring, drawn on the span because the element that TAKES focus is MudMenu's own
   activator wrapper (it carries the tabindex and role — pinned by this component's tests), and that
   wrapper is display:contents, so it has no box to draw an outline on.

   The selector matches the span INSIDE a focused wrapper. This comment used to say the wrapper was
   not focusable, and the rule was ".sd-sp-pick:focus-visible" — which never matched, because the
   span is never the focused element; keyboard users got no ring at all (CodeRabbit, review round 2,
   #7599). CSS isolation adds its scope attribute to the LAST compound only, so the unscoped
   .mud-menu-activator ancestor needs no ::deep. */
.mud-menu-activator:focus-visible .sd-sp-pick[b-16l17q414c] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: 2px;
}

.sd-sp-pick-caret[b-16l17q414c] {
    margin-right: -4px;
    opacity: 0.8;
}

/* Status tones — the SAME palette pairs the session panel's pill used before this component, so
   the control looks identical to what it replaced. Each is a low-emphasis *-hover tint carrying the
   solid colour as TEXT, not a filled block: the pill sits next to the ticket title and a saturated
   fill competed with it. Both halves come from the palette, so both track the theme. */
.sd-sp-tone-new[b-16l17q414c] {
    background: var(--mud-palette-primary-hover);
    color: var(--mud-palette-primary);
}

.sd-sp-tone-inprog[b-16l17q414c] {
    background: var(--mud-palette-warning-hover);
    color: var(--mud-palette-warning);
}

.sd-sp-tone-resolved[b-16l17q414c] {
    background: var(--mud-palette-success-hover);
    color: var(--mud-palette-success);
}

.sd-sp-tone-default[b-16l17q414c] {
    background: var(--mud-palette-action-default-hover);
    color: var(--mud-palette-text-secondary);
}

/* Menu state rows: loading, failed and empty. Not MudMenuItems — they are not choosable, and
   rendering them as items would put keyboard focus on rows that do nothing. */
.sd-sp-pick-state[b-16l17q414c] {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 16px;
    font-size: 0.8125rem;
    color: var(--mud-palette-text-secondary);
    max-width: 320px;
}

.sd-sp-pick-error[b-16l17q414c] {
    color: var(--mud-palette-error);
    white-space: normal;
}

.sd-sp-pick-item[b-16l17q414c] {
    display: flex;
    align-items: center;
    gap: 8px;
}

/* Holds the tick column's width on rows that are not the current status, so the labels line up
   instead of shifting by an icon width. */
.sd-sp-pick-item-gutter[b-16l17q414c] {
    display: inline-block;
    width: 20px;
    flex-shrink: 0;
}
/* /Shared/ServiceDesk/ServiceDeskTicketInbox.razor.rz.scp.css */
/* Palette variables only — the panel renders in both light and dark mode and these must track the
   active theme. See .claude/rules/blazor-dark-mode.md. */
.sd-inbox[b-6sol7vc449] {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.sd-inbox-search[b-6sol7vc449] {
    margin-bottom: 2px;
}

.sd-inbox-toggles[b-6sol7vc449] {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
}

.sd-inbox-progress[b-6sol7vc449] {
    margin: 6px 0;
}

.sd-inbox-head[b-6sol7vc449] {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 4px;
}

.sd-inbox-head-title[b-6sol7vc449] {
    font-size: 11.5px;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
}

.sd-inbox-head-count[b-6sol7vc449] {
    font-size: 11px;
    color: var(--mud-palette-text-disabled);
}

.sd-inbox-note[b-6sol7vc449] {
    font-size: 11.5px;
    color: var(--mud-palette-text-secondary);
    line-height: 1.45;
}

/* ── Ticket row ────────────────────────────────────────────────────────────────
   THREE STACKED LINES, not a flat string. Each line is its own flex row and each
   fact inside it is nowrap, so a narrow dock can only break BETWEEN facts — never
   between a label and its date, which is what produced "Created" on one line and
   its date on the next. Colours come from palette variables so both themes hold.

   The row is a NATIVE <button> so the browser supplies Enter/Space activation, focus behaviour and
   the correct accessibility tree. That means undoing the user-agent button styling it arrives with:
   without width/text-align/font/color below, a button renders centred, at the UA font, and only as
   wide as its text, so the row would not span the panel or align with the others. */

.sd-inbox-row[b-6sol7vc449] {
    display: flex;
    flex-direction: column;
    gap: 3px;
    padding: 8px 10px;
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 3px solid var(--mud-palette-lines-default);
    border-radius: 8px;
    background: var(--mud-palette-surface);
    cursor: pointer;
    width: 100%;
    text-align: left;
    font: inherit;
    color: inherit;
}

.sd-inbox-row:hover[b-6sol7vc449],
.sd-inbox-row:focus-visible[b-6sol7vc449] {
    background: var(--mud-palette-action-default-hover);
    border-color: var(--mud-palette-primary);
}

.sd-inbox-line[b-6sol7vc449] {
    display: flex;
    align-items: baseline;
    gap: 6px;
    min-width: 0;
    width: 100%;
}

.sd-inbox-line-title[b-6sol7vc449] {
    align-items: center;
}

.sd-inbox-num[b-6sol7vc449] {
    font-size: 11px;
    font-weight: 600;
    color: var(--mud-palette-primary);
    flex: 0 0 auto;
    font-variant-numeric: tabular-nums;
}

/* The title takes every pixel the fixed items leave. It is the thing an operator
   scans, and it previously lost its width to an unbounded status chip. */
.sd-inbox-title[b-6sol7vc449] {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 12.5px;
    font-weight: 500;
    color: var(--mud-palette-text-primary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sd-inbox-who[b-6sol7vc449] {
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

/* The ellipsis lives on the TEXT, not the line: the line is now a flex row shared with the
   assignee, and text-overflow on a flex container truncates nothing. min-width: 0 is what lets
   a flex child shrink below its content width at all. */
.sd-inbox-who[b-6sol7vc449]  .sd-inbox-who-text {
    font-size: inherit;
    color: inherit;
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

.sd-inbox-dates[b-6sol7vc449] {
    flex-wrap: wrap;
    row-gap: 3px;
}

/* Each date is indivisible — this is the rule that stops the mid-label wrap. */
.sd-inbox-fact[b-6sol7vc449] {
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
    flex: 0 0 auto;
}

/* Assignee: right-justified on the who line. It never shrinks (flex 0 0 auto) — the customer
   text gives way instead — and max-width caps it so a long name cannot take the whole line.
   Full text stays in the title attribute and the row's accessible name. */
.sd-inbox-who[b-6sol7vc449]  .sd-inbox-assignee {
    font-size: inherit;
    margin-left: auto;
    flex: 0 0 auto;
    max-width: 45%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Unassigned is the claimable case, so it reads as information rather than as
   secondary text. Palette variable only, so it follows light and dark mode. */
.sd-inbox-who[b-6sol7vc449]  .sd-inbox-unassigned {
    font-weight: 600;
}

/* Bounded so an arbitrary PSA status cannot starve the title. Full text stays in
   the title attribute and the row's accessible name. */
.sd-inbox-status[b-6sol7vc449] {
    margin-left: auto;
    max-width: 55%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 10.5px;
    line-height: 1.5;
    padding: 1px 7px;
    border-radius: 10px;
    flex: 0 1 auto;
}

.sd-inbox-pri[b-6sol7vc449] {
    flex: 0 0 auto;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-transform: uppercase;
    padding: 1px 6px;
    border-radius: 3px;
    white-space: nowrap;
}

/* ── Priority ──────────────────────────────────────────────────────────────────
   Foreground is the *-darken variant on a *-hover background, matching
   EcpChipBody.razor.css. The plain --mud-palette-warning/info on their own hover
   tint is not reliably legible at this size in either theme, and a custom tenant
   palette makes it less so. (Codex review.)

   Priority is FILLED, status is OUTLINED — see .sd-inbox-status. Both use amber
   for their middle state and can appear on the same row, so shape carries the
   distinction rather than colour alone. */
.sd-pri-critical[b-6sol7vc449] { background: var(--mud-palette-error-hover);   color: var(--mud-palette-error-darken); }
.sd-pri-high[b-6sol7vc449]     { background: var(--mud-palette-warning-hover); color: var(--mud-palette-warning-darken); }
.sd-pri-medium[b-6sol7vc449]   { background: var(--mud-palette-info-hover);    color: var(--mud-palette-info-darken); }
.sd-pri-low[b-6sol7vc449]      { background: var(--mud-palette-action-default-hover); color: var(--mud-palette-text-secondary); }
.sd-pri-none[b-6sol7vc449]     { background: var(--mud-palette-action-default-hover); color: var(--mud-palette-text-secondary); }

.sd-stripe-critical[b-6sol7vc449] { border-left-color: var(--mud-palette-error); }
.sd-stripe-high[b-6sol7vc449]     { border-left-color: var(--mud-palette-warning); }
.sd-stripe-medium[b-6sol7vc449]   { border-left-color: var(--mud-palette-info); }
.sd-stripe-low[b-6sol7vc449]      { border-left-color: var(--mud-palette-lines-default); }

/* ── Status ────────────────────────────────────────────────────────────────────
   Outlined, so a waiting status never reads as a second priority token. */
.sd-inbox-status[b-6sol7vc449] { background: transparent; border: 1px solid var(--mud-palette-lines-default); }
.sd-st-active[b-6sol7vc449]  { border-color: var(--mud-palette-info);    color: var(--mud-palette-info-darken); }
.sd-st-waiting[b-6sol7vc449] { border-color: var(--mud-palette-warning); color: var(--mud-palette-warning-darken); }
.sd-st-done[b-6sol7vc449]    { border-color: var(--mud-palette-success); color: var(--mud-palette-success-darken); }
.sd-st-none[b-6sol7vc449]    { border-color: var(--mud-palette-lines-default); color: var(--mud-palette-text-secondary); }
/* /Shared/ServiceDesk/ServiceDeskTicketPanel.razor.rz.scp.css */
/* Panel styling: full accent border, tinted header, two-column read-only body */

.sd-panel[b-ov6plylrsd] {
    border: 1px solid var(--mud-palette-warning-lighten);
    border-radius: 8px;
    overflow: hidden;
    background: var(--mud-palette-surface);
}

.sd-header[b-ov6plylrsd] {
    background: color-mix(in srgb, var(--mud-palette-warning-lighten) 12%, var(--mud-palette-surface));
    min-height: 48px;
    padding: 8px 14px;
}

.sd-header-divider[b-ov6plylrsd] {
    border-top: 1px solid var(--mud-palette-lines-default);
}

.sd-body[b-ov6plylrsd] {
    display: grid;
    grid-template-columns: 1fr 1fr;
}

.sd-col[b-ov6plylrsd] {
    padding: 14px 18px;
}

.sd-col-left[b-ov6plylrsd] {
    border-right: 1px solid var(--mud-palette-lines-default);
}

.sd-meta-grid[b-ov6plylrsd] {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px 20px;
}

.sd-meta-full[b-ov6plylrsd] {
    grid-column: 1 / -1;
}

.sd-meta-label[b-ov6plylrsd] {
    font-size: 11px;
    color: var(--mud-palette-text-secondary);
    text-transform: uppercase;
    letter-spacing: 0.3px;
    margin-bottom: 1px;
}

.sd-meta-value[b-ov6plylrsd] {
    font-size: 13.5px;
}

/* Unlinked state: left-only accent border with warm tint background.
   The tint is a palette variable, not a literal: this panel renders on eight pages and the
   previous #fff8ec stayed cream in dark mode, leaving near-black text on a light block. */
.sd-panel-unlinked[b-ov6plylrsd] {
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 3px solid var(--mud-palette-warning-lighten);
    border-radius: 8px;
    overflow: hidden;
    background: var(--mud-palette-warning-hover);
    min-height: 52px;
    padding: 8px 14px;
}

/* The unlinked panel opens the ticket search on click. The class is applied ONLY when the operator
   has CanList, so there is no disabled variant to style — `:disabled` would not match anyway, since
   this is a div with role="button" rather than a native <button>. An operator without CanList simply
   renders the plain .sd-panel-unlinked with no role, tabindex or cursor change. */
.sd-panel-unlinked-action[b-ov6plylrsd] {
    cursor: pointer;
    transition: background-color 120ms ease, border-color 120ms ease;
}

.sd-panel-unlinked-action:hover[b-ov6plylrsd],
.sd-panel-unlinked-action:focus-visible[b-ov6plylrsd] {
    /* warning-hover over warning-hover reads as no change, so the hover step goes one level up.
       Both are palette variables, so the pair tracks light and dark rather than pinning a tint. */
    background: var(--mud-palette-warning-lighten);
    border-left-color: var(--mud-palette-warning);
}

/* Keyboard focus must be visible on its own — the hover tint alone is too subtle to serve as a
   focus indicator, and this is the panel's only affordance for a keyboard user. */
.sd-panel-unlinked-action:focus-visible[b-ov6plylrsd] {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: 2px;
}

@media (max-width: 820px) {
    .sd-body[b-ov6plylrsd] {
        grid-template-columns: 1fr;
    }

    .sd-col-left[b-ov6plylrsd] {
        border-right: none;
        border-bottom: 1px solid var(--mud-palette-lines-default);
    }
}
/* /Shared/Tasks/Dialogs/MyTasksReminderDialog.razor.rz.scp.css */
/* The daily reminder popup should use the full dialog height (the dialog's own
   max-height ~80vh) rather than the compact 300px the dense table uses in the embedded
   list-page panel. Raise the cap here only, scoped to this wrapper div — the div carries
   the CSS-isolation scope attribute (MudBlazor component roots never do), so ::deep can
   reach the table container inside MyTasksDashboard. The extra .my-tasks-dense-table
   qualifier lifts specificity above MyTasksDashboard's own
   ".my-tasks-dense-table ::deep .mud-table-container" rule so this override wins. The calc leaves
   room for the dialog title, intro line and action buttons, so the table grows with its
   rows until the dialog fills the viewport, then scrolls within (sticky header intact). */
.TasksReminderBody[b-4annf8b4af]  .my-tasks-dense-table .mud-table-container {
    max-height: calc(80vh - 220px);
}
/* /Shared/Tasks/MyTasksDashboard.razor.rz.scp.css */
[b-2w8zt7qgdq] .mud-expansion-panel-content {
    padding: 0;
}

/* Dense mode: cap the table height (scroll past ~7 rows) but shrink to fit fewer rows.
   Selectors anchor on the plain div wrapper (which carries the isolation scope attribute)
   because MudBlazor component roots never receive it. */
.my-tasks-dense-table[b-2w8zt7qgdq]  .mud-table-container {
    max-height: 300px;
    overflow-y: auto;
}

.my-tasks-dense-table[b-2w8zt7qgdq]  .mud-table-cell {
    padding: 0 8px;
    line-height: 1.0;
}

/* Icon buttons and chips are the tallest elements in each row — shrink them to the
   icon/text size so the row collapses to roughly text height. */
.my-tasks-dense-table[b-2w8zt7qgdq]  .mud-icon-button {
    padding: 0;
}

.my-tasks-dense-table[b-2w8zt7qgdq]  .mud-chip {
    margin: 0;
    height: 18px;
    font-size: 0.68rem;
}

[b-2w8zt7qgdq] .actions-header .column-header {
    justify-content: center;
    text-align: center;
}

[b-2w8zt7qgdq] .ActionsHeader .column-header {
    justify-content: center;
    text-align: center;
}
/* /Shared/Tasks/MyTasksTile.razor.rz.scp.css */
[b-4s5gc1m0gx] .mud-table-cell {
    padding: 4px 8px;
}
/* /Shared/TextInputDialog.razor.rz.scp.css */
/* CSS Isolation */
