/*
 * PayStream component layer.
 * Restyles Bootstrap / Blazorise / ABP primitives and the app's own layout classes
 * (app-*, ps-*) into one neutral, enterprise-grade system. Reads every value from
 * css/tokens.css. Loaded after the LeptonX theme bundles (see global.js).
 */

/* ===========================================================================
 * 1. Base typography
 * ======================================================================== */

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6,
.page-title {
    font-family: var(--ps-font-sans);
    font-weight: 600;
    color: var(--ps-ink);
    letter-spacing: -0.01em;
    line-height: 1.3;
}

h1, .h1 { font-size: var(--ps-font-size-h1); }
h2, .h2 { font-size: var(--ps-font-size-h2); }
h3, .h3 { font-size: var(--ps-font-size-h3); }
h4, .h4 { font-size: 0.9375rem; }
h5, .h5 { font-size: 0.9375rem; }
h6, .h6 { font-size: 0.875rem; }

p {
    margin-bottom: 0.75rem;
}

a {
    color: var(--ps-primary-strong);
    text-decoration: none;
    transition: color 0.15s ease;
}

a:hover {
    color: var(--ps-primary);
    text-decoration: underline;
}

small,
.small {
    font-size: var(--ps-font-size-sm);
}

.text-muted {
    color: var(--ps-muted) !important;
    opacity: 1;
}

.text-secondary {
    color: var(--ps-gray-600) !important;
}

strong,
b,
.fw-bold {
    font-weight: 600;
}

.fw-semibold {
    font-weight: 600;
}

code,
kbd,
pre {
    font-family: var(--ps-font-mono);
}

code {
    font-size: 0.8125rem;
    color: var(--ps-gray-700);
    background: var(--ps-gray-100);
    padding: 0.1rem 0.375rem;
    border-radius: var(--ps-radius-sm);
    word-break: break-all;
}

pre {
    font-size: 0.8125rem;
    background: var(--ps-gray-50);
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    padding: 0.875rem 1rem;
    color: var(--ps-ink-soft);
}

pre code {
    background: transparent;
    padding: 0;
    color: inherit;
}

hr {
    border-top: 1px solid var(--ps-border);
    opacity: 1;
    margin: 1.25rem 0;
}

.display-6,
.display-5 {
    font-weight: 600;
    letter-spacing: -0.02em;
    line-height: 1.15;
    color: var(--ps-ink);
    font-variant-numeric: tabular-nums;
}

.display-6 { font-size: 1.75rem; }
.display-5 { font-size: 2rem; }

::selection {
    background: var(--ps-primary-soft-2);
}

a:focus-visible,
button:focus-visible,
.btn:focus-visible,
.form-control:focus-visible,
.form-select:focus-visible,
.form-check-input:focus-visible,
[tabindex]:focus-visible {
    outline: none;
    box-shadow: var(--ps-focus-ring);
}

/* ===========================================================================
 * 2. Page layout
 * ======================================================================== */

.app-page,
.ps-page,
.ps-wa-page,
.ps-admin-page {
    display: flex;
    flex-direction: column;
    gap: var(--ps-space-5);
    color: var(--ps-ink);
    width: 100%;
    max-width: 1600px;
    margin: 0 auto;
}

.app-page-header,
.ps-hero {
    display: flex;
    flex-wrap: wrap;
    gap: var(--ps-space-4) var(--ps-space-6);
    align-items: flex-start;
    justify-content: space-between;
    padding: 0;
    background: transparent;
    border: 0;
    box-shadow: none;
    border-radius: 0;
}

.app-page-header__titles {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.app-page-header__actions {
    display: flex;
    gap: var(--ps-space-2);
    flex-wrap: wrap;
    align-items: center;
}

.app-title,
.ps-hero h1 {
    font-size: var(--ps-font-size-h1);
    font-weight: 600;
    letter-spacing: -0.015em;
    color: var(--ps-ink);
    margin: 0;
    line-height: 1.25;
}

.app-subtitle,
.ps-hero p {
    margin: 0;
    color: var(--ps-muted);
    font-size: var(--ps-font-size-body);
    max-width: 72ch;
}

.app-kicker,
.ps-kicker {
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: 0.6875rem;
    font-weight: 600;
    color: var(--ps-muted);
}

.ps-tenant-select {
    min-width: 240px;
}

.ps-card {
    border-radius: var(--ps-radius-lg);
    border: 1px solid var(--ps-border);
    box-shadow: var(--ps-shadow-xs);
}

/* ===========================================================================
 * 3. Cards
 * ======================================================================== */

.card,
.app-card {
    --bs-card-bg: var(--ps-surface);
    --bs-card-color: var(--ps-ink);
    --bs-card-border-width: 1px;
    --bs-card-border-color: var(--ps-border);
    --bs-card-border-radius: var(--ps-radius-lg);
    --bs-card-inner-border-radius: calc(var(--ps-radius-lg) - 1px);
    --bs-card-box-shadow: none;
    --bs-card-cap-bg: transparent;
    --bs-card-cap-padding-y: 0.875rem;
    --bs-card-cap-padding-x: 1.25rem;
    --bs-card-spacer-y: 1.25rem;
    --bs-card-spacer-x: 1.25rem;
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
    background: var(--ps-surface);
    color: var(--ps-ink) !important;
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    box-shadow: var(--ps-shadow-xs);
    transition: none;
    animation: none;
}

.card {
    margin-bottom: 1rem;
}

.card:last-child,
.card.h-100,
.app-card {
    margin-bottom: 0;
}

.card:hover,
.app-card:hover {
    box-shadow: var(--ps-shadow-xs);
    border-color: var(--ps-border);
}

.card.border-0 {
    border: 1px solid var(--ps-border) !important;
}

.card.shadow-sm,
.card.shadow {
    box-shadow: var(--ps-shadow-xs) !important;
}

.card-header,
.app-card-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--ps-space-4);
    padding: 0.875rem 1.25rem;
    background: transparent;
    border-bottom: 1px solid var(--ps-border);
    color: var(--ps-ink);
    font-weight: 600;
    font-size: 0.9375rem;
    border-top-left-radius: calc(var(--ps-radius-lg) - 1px);
    border-top-right-radius: calc(var(--ps-radius-lg) - 1px);
}

.card-header.d-flex,
.card-header.d-block {
    display: flex;
}

.card-header h1, .card-header h2, .card-header h3,
.card-header h4, .card-header h5, .card-header h6,
.card-header .card-title {
    font-size: 0.9375rem;
    font-weight: 600;
    margin: 0;
    color: var(--ps-ink);
}

.app-card-header--table {
    align-items: center;
}

.app-card-title,
.card-title {
    font-weight: 600;
    font-size: 0.9375rem;
    color: var(--ps-ink);
    margin-bottom: 0;
    line-height: 1.3;
}

.card-body .card-title {
    margin-bottom: 0.5rem;
}

.app-card-subtitle,
.card-subtitle {
    font-size: var(--ps-font-size-sm);
    color: var(--ps-muted);
    font-weight: 400;
    margin-top: 2px;
}

.app-card-actions {
    display: flex;
    gap: var(--ps-space-2);
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
}

.app-actions,
.app-toolbar {
    display: flex;
    gap: var(--ps-space-2);
    flex-wrap: wrap;
    align-items: center;
}

.card-body,
.app-card-body {
    padding: 1.25rem;
    color: var(--ps-ink);
}

.card-footer,
.app-card-footer {
    padding: 0.625rem 1.25rem;
    border-top: 1px solid var(--ps-border);
    background: var(--ps-gray-50);
    border-bottom-left-radius: calc(var(--ps-radius-lg) - 1px);
    border-bottom-right-radius: calc(var(--ps-radius-lg) - 1px);
}

/* Dense variant: used for filter bars and compact panels */
.app-card--dense .app-card-header {
    padding: 0.625rem 1.25rem;
    border-bottom: 1px solid var(--ps-border);
}

.app-card--dense .app-card-title {
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--ps-muted);
}

.app-card--dense .app-card-subtitle {
    display: none;
}

.app-card--dense .app-card-body {
    padding: 1rem 1.25rem;
}

/* Stat tiles */
.app-stat-grid {
    display: grid;
    gap: var(--ps-space-4);
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
}

.app-stat {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    padding: 1rem 1.25rem;
    background: var(--ps-surface);
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    box-shadow: var(--ps-shadow-xs);
    min-height: 104px;
}

.app-stat__top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--ps-space-3);
}

.app-stat__label {
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--ps-muted);
}

.app-stat__icon {
    width: 30px;
    height: 30px;
    border-radius: var(--ps-radius-md);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--ps-gray-100);
    color: var(--ps-gray-600);
    font-size: 0.875rem;
    flex: 0 0 auto;
}

.app-stat__value {
    font-size: 1.625rem;
    font-weight: 600;
    letter-spacing: -0.02em;
    color: var(--ps-ink);
    line-height: 1.2;
    font-variant-numeric: tabular-nums;
}

.app-stat__hint {
    font-size: var(--ps-font-size-sm);
    color: var(--ps-muted);
}

.app-stat--positive .app-stat__value { color: var(--ps-success-text); }
.app-stat--negative .app-stat__value { color: var(--ps-danger-text); }
.app-stat--warning .app-stat__value { color: var(--ps-warning-text); }

/* Flush variant: body content (lists, tables) touches the card edges */
.app-card--flush .app-card-body {
    padding: 0;
}

/* Titled page sections (used to group stat grids) */
.app-section {
    display: flex;
    flex-direction: column;
    gap: 0.625rem;
}

.app-section__title {
    font-size: 0.9375rem;
    font-weight: 600;
    color: var(--ps-ink);
    margin: 0;
}

/* Row actions: at most two visible buttons, the rest in an ActionMenu */
.app-row-actions {
    display: inline-flex;
    align-items: center;
    justify-content: flex-end;
    gap: 4px;
    white-space: nowrap;
}

.app-action-menu {
    position: relative;
    display: inline-block;
}

.app-action-menu__toggle {
    width: 28px;
    padding: 0 !important;
}

.app-action-menu.is-open .app-action-menu__toggle {
    background: var(--ps-gray-100);
    border-color: var(--ps-gray-400);
    color: var(--ps-ink);
}

.app-action-menu__backdrop {
    position: fixed;
    inset: 0;
    z-index: 1029;
    background: transparent;
}

.app-action-menu__menu {
    position: absolute;
    top: calc(100% + 4px);
    right: 0;
    left: auto;
    z-index: 1030;
    min-width: 200px;
    text-align: left;
    white-space: nowrap;
}

.app-action-menu__menu .dropdown-item {
    width: 100%;
    border: 0;
    background: transparent;
    text-align: left;
    cursor: pointer;
}

.app-action-menu__menu .dropdown-item:disabled {
    color: var(--ps-gray-400);
    cursor: default;
    background: transparent;
}

.dropdown-item--danger {
    color: var(--ps-danger-text);
}

.dropdown-item--danger:hover:not(:disabled),
.dropdown-item--danger:focus:not(:disabled) {
    color: var(--ps-danger-text);
    background: var(--ps-danger-soft);
}

/* Let an open row menu escape the table's scroll clipping */
.table-responsive:has(.app-action-menu.is-open) {
    overflow: visible;
}

/* Clickable rows: the table shows the essentials, the row opens a DetailsModal */
.table tbody tr.app-row-clickable {
    cursor: pointer;
}

.table tbody tr.app-row-clickable:hover > * {
    --bs-table-accent-bg: var(--ps-gray-100);
}

.table tbody tr.app-row-clickable:focus-visible {
    outline: none;
}

.table tbody tr.app-row-clickable:focus-visible > * {
    --bs-table-accent-bg: var(--ps-primary-soft);
}

.table tbody tr.app-row-clickable.is-selected > * {
    --bs-table-accent-bg: var(--ps-primary-soft);
}

.app-cell-primary {
    font-weight: 500;
    color: var(--ps-ink);
}

.app-cell-sub {
    display: block;
    font-size: 0.75rem;
    line-height: 1.4;
    color: var(--ps-muted);
    margin-top: 1px;
}

.app-cell-truncate,
.app-cell-primary.app-cell-truncate,
.app-cell-sub.app-cell-truncate {
    display: block;
    max-width: 260px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.app-cell-nowrap {
    white-space: nowrap;
}

.app-cell-num {
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* Details modal */
.app-details-modal:focus {
    outline: none;
    box-shadow: none;
}

.app-details-modal .modal-header {
    align-items: flex-start;
    gap: 1rem;
}

.app-details-modal__titles {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1 1 auto;
}

.app-details-modal__titles .modal-title {
    overflow-wrap: anywhere;
}

.app-details-modal__subtitle {
    font-size: var(--ps-font-size-sm);
    color: var(--ps-muted);
}

.app-details-modal__aside {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex: 0 0 auto;
    padding-top: 2px;
}

.app-details-modal .modal-body > .alert {
    margin-bottom: 1rem;
}

.app-details-modal .modal-body > .app-details + .app-form-grid,
.app-details-modal .modal-body > .app-details + .app-details {
    margin-top: 1.25rem;
}

.app-details-modal .table-responsive {
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    background: var(--ps-surface);
}

/* Details list (label over value) */
.app-details {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.875rem 1.5rem;
    margin: 0;
}

.app-details--one {
    grid-template-columns: 1fr;
}

.app-details--three {
    grid-template-columns: repeat(3, minmax(0, 1fr));
}

.app-details__item {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.app-details__item--full {
    grid-column: 1 / -1;
}

.app-details dt {
    font-size: 0.75rem;
    font-weight: 500;
    color: var(--ps-muted);
}

.app-details dd {
    margin: 0;
    font-size: var(--ps-font-size-body);
    color: var(--ps-ink);
    overflow-wrap: anywhere;
}

.app-details dd .badge {
    vertical-align: baseline;
}

.app-details dd code {
    font-size: 0.75rem;
}

.app-details__section {
    grid-column: 1 / -1;
    margin-top: 0.5rem;
    padding-bottom: 0.375rem;
    border-bottom: 1px solid var(--ps-border);
    font-size: 0.8125rem;
    font-weight: 600;
    color: var(--ps-ink);
}

.app-details__section:first-child {
    margin-top: 0;
}

.app-details__pre {
    margin: 0;
    padding: 0.625rem 0.75rem;
    background: var(--ps-gray-50);
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-md);
    font-size: 0.8125rem;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

@media (max-width: 575.98px) {
    .app-details,
    .app-details--three {
        grid-template-columns: 1fr;
    }
}

/* Blazorise DataGrid (ABP built-in pages): keep cells wrapping and menus visible */
.b-table.table {
    table-layout: auto;
}

.b-table.table tbody td {
    white-space: normal;
    overflow-wrap: anywhere;
}

.b-table .dropdown-menu {
    z-index: 1035;
}

.table-responsive:has(.dropdown-menu.show) {
    overflow: visible;
}

/* Key / value lists for detail views */
.app-kv {
    display: grid;
    grid-template-columns: minmax(120px, max-content) 1fr;
    gap: 0.5rem 1.5rem;
    margin: 0;
    font-size: var(--ps-font-size-body);
}

.app-kv dt {
    color: var(--ps-muted);
    font-weight: 500;
}

.app-kv dd {
    margin: 0;
    color: var(--ps-ink);
    word-break: break-word;
}

/* Quick links list */
.app-link-list {
    display: flex;
    flex-direction: column;
    margin: 0;
    padding: 0;
    list-style: none;
}

.app-link-list__item {
    display: flex;
    align-items: center;
    gap: var(--ps-space-3);
    width: 100%;
    padding: 0.75rem 1.25rem;
    border: 0;
    border-bottom: 1px solid var(--ps-border);
    background: transparent;
    color: var(--ps-ink);
    text-align: left;
    font: inherit;
    cursor: pointer;
    transition: background-color 0.15s ease;
}

.app-link-list__item:last-child {
    border-bottom: 0;
}

.app-link-list__item:hover:not(:disabled) {
    background: var(--ps-gray-50);
    text-decoration: none;
    color: var(--ps-ink);
}

.app-link-list__item:disabled {
    cursor: default;
    color: var(--ps-muted);
}

.app-link-list__icon {
    width: 32px;
    height: 32px;
    border-radius: var(--ps-radius-md);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--ps-primary-soft);
    color: var(--ps-primary-strong);
    flex: 0 0 auto;
}

.app-link-list__item:disabled .app-link-list__icon {
    background: var(--ps-gray-100);
    color: var(--ps-gray-400);
}

.app-link-list__body {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-width: 0;
    flex: 1 1 auto;
}

.app-link-list__title {
    font-weight: 500;
}

.app-link-list__hint {
    font-size: var(--ps-font-size-sm);
    color: var(--ps-muted);
}

.app-link-list__chevron {
    color: var(--ps-gray-400);
    font-size: 0.75rem;
}

/* ===========================================================================
 * 4. Tables
 * ======================================================================== */

.table-responsive {
    min-height: 0;
    margin-bottom: 0;
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    background: var(--ps-surface);
    box-shadow: none;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: thin;
    scrollbar-color: var(--ps-gray-300) transparent;
    animation: none;
}

.table-responsive::-webkit-scrollbar {
    height: 8px;
}

.table-responsive::-webkit-scrollbar-thumb {
    background: var(--ps-gray-300);
    border-radius: 999px;
}

.card .table-responsive,
.app-card .table-responsive,
.app-table-wrapper .table-responsive,
.modal .table-responsive,
.tab-content .table-responsive,
.dt-container .table-responsive,
[class*="__panel"] .table-responsive,
[class*="-panel"] .table-responsive,
[class*="__card"] .table-responsive,
[class*="__table-wrap"] .table-responsive,
[class*="__section"] .table-responsive {
    border: 0;
    border-radius: 0;
    background: transparent;
}

.app-table-wrapper {
    padding: 0;
}

.app-table-wrapper > .alert {
    margin: 1rem 1.25rem;
}

.app-table-wrapper > .app-empty {
    border: 0;
    border-radius: 0;
    background: transparent;
}

.table {
    --bs-table-bg: transparent;
    --bs-table-color: var(--ps-ink);
    --bs-table-border-color: var(--ps-border);
    --bs-table-accent-bg: transparent;
    --bs-table-striped-color: var(--ps-ink);
    --bs-table-striped-bg: transparent;
    --bs-table-active-color: var(--ps-ink);
    --bs-table-active-bg: var(--ps-gray-100);
    --bs-table-hover-color: var(--ps-ink);
    --bs-table-hover-bg: var(--ps-gray-50);
    width: 100%;
    margin-bottom: 0;
    color: var(--ps-ink);
    font-size: var(--ps-font-size-body);
    vertical-align: middle;
    border-color: var(--ps-border);
}

.table > :not(:first-child) {
    border-top: 0;
}

.table > :not(caption) > * > * {
    padding: 0.625rem 1rem;
    border-bottom: 1px solid var(--ps-border);
    vertical-align: middle;
    background-color: var(--bs-table-bg);
    box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);
}

.table > tbody > tr > * {
    height: var(--ps-size-table-row);
}

.table thead th {
    position: static;
    background: var(--ps-gray-50);
    color: var(--ps-gray-600);
    font-size: 0.75rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    white-space: nowrap;
    border-bottom: 1px solid var(--ps-border);
    padding-top: 0.625rem;
    padding-bottom: 0.625rem;
}

.card .table > :not(caption) > * > :first-child,
.app-card .table > :not(caption) > * > :first-child,
.app-table-wrapper .table > :not(caption) > * > :first-child {
    padding-left: 1.25rem;
}

.card .table > :not(caption) > * > :last-child,
.app-card .table > :not(caption) > * > :last-child,
.app-table-wrapper .table > :not(caption) > * > :last-child {
    padding-right: 1.25rem;
}

.card .table > tbody > tr:last-child > *,
.app-card .table > tbody > tr:last-child > *,
.app-table-wrapper .table > tbody > tr:last-child > * {
    border-bottom: 0;
}

.table tbody tr {
    transition: background-color 0.12s ease;
}

.table-striped > tbody > tr:nth-of-type(odd) > *,
.table-striped > tbody > tr:nth-of-type(odd) {
    --bs-table-accent-bg: transparent;
}

.table-hover > tbody > tr:hover > *,
.table-hover > tbody > tr:hover {
    --bs-table-accent-bg: var(--ps-gray-50);
    color: var(--ps-ink);
}

.table-sm > :not(caption) > * > * {
    padding: 0.45rem 0.75rem;
}

.table-sm > tbody > tr > * {
    height: 38px;
}

.table-bordered > :not(caption) > * {
    border-width: 1px 0;
}

.table-bordered > :not(caption) > * > * {
    border-width: 0 1px;
}

.table td,
.table th {
    color: inherit;
}

.table td .small,
.table td small,
.table td .text-muted {
    font-size: 0.75rem;
    line-height: 1.4;
}

.table td .fw-semibold,
.table td .fw-bold {
    color: var(--ps-ink);
}

.table code {
    font-size: 0.75rem;
    padding: 0.05rem 0.35rem;
    white-space: nowrap;
}

.table .badge {
    vertical-align: middle;
}

.table td.num,
.table th.num,
.table .text-end {
    font-variant-numeric: tabular-nums;
}

.table .form-check-input {
    margin: 0;
    vertical-align: middle;
}

.table .form-control,
.table .form-select {
    height: var(--ps-size-input-height-sm);
    min-height: var(--ps-size-input-height-sm);
    font-size: var(--ps-font-size-sm);
}

.app-col-actions {
    width: 1%;
    white-space: nowrap;
    text-align: right;
}

.app-row-clickable {
    cursor: pointer;
}

.app-truncate-260 {
    max-width: 260px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Row actions: compact ghost buttons instead of joined button groups */
.table .btn-sm,
.table .btn-group-sm > .btn,
.table .btn-group > .btn {
    height: 28px;
    padding: 0 0.5rem;
    font-size: 0.75rem;
    font-weight: 500;
}

.table .btn-group {
    display: inline-flex;
    gap: 4px;
    vertical-align: middle;
}

.table .btn-group > .btn {
    border-radius: var(--ps-radius-md) !important;
    margin-left: 0;
}

.table .btn-link {
    padding: 0 0.5rem;
    font-size: var(--ps-font-size-sm);
}

.table .btn-outline-secondary,
.table .btn-outline-primary,
.table .btn-outline-success,
.table .btn-outline-danger,
.table .btn-outline-warning,
.table .btn-outline-info,
.table .btn-outline-dark {
    background: var(--ps-surface);
}

.table td > .btn + .btn,
.table td > .btn + button,
.table td > button + .btn {
    margin-left: 4px;
}

.table td.text-center.text-muted,
.table td.text-center.py-4 {
    color: var(--ps-muted);
    font-size: var(--ps-font-size-sm);
    height: 88px;
}

.table-loading-overlay {
    position: absolute;
    inset: 0;
    background: rgba(255, 255, 255, 0.65);
    backdrop-filter: blur(1px);
    z-index: 2;
    border-radius: inherit;
}

.table-loading-overlay .spinner-border {
    width: 1.5rem;
    height: 1.5rem;
    border-width: 2px;
}

/* Blazorise DataGrid / ABP tables */
.b-table {
    border-radius: 0;
    background: transparent;
    box-shadow: none;
}

.b-table.table thead th,
.b-table.table thead td {
    padding: 0.625rem 1rem !important;
}

.b-table.table tbody th,
.b-table.table tbody td {
    padding: 0.625rem 1rem !important;
}

.b-table .btn,
.entry-row .btn,
.lpx-content-toolbar .btn {
    padding: 0 0.75rem !important;
    font-size: var(--ps-font-size-sm) !important;
    height: var(--ps-size-button-height-sm);
    margin-right: 0;
}

.entry-row .btn + .btn {
    margin-left: 0.5rem;
}

.datagrid-filter .form-control,
.datagrid-filter .form-select {
    height: var(--ps-size-input-height-sm);
    min-height: var(--ps-size-input-height-sm);
}

/* ===========================================================================
 * 5. Buttons
 * ======================================================================== */

.btn {
    --bs-btn-padding-x: 0.875rem;
    --bs-btn-padding-y: 0;
    --bs-btn-font-size: var(--ps-font-size-body);
    --bs-btn-font-weight: 500;
    --bs-btn-line-height: 1;
    --bs-btn-border-radius: var(--ps-radius-md);
    --bs-btn-box-shadow: none;
    --bs-btn-focus-box-shadow: var(--ps-focus-ring);
    --bs-btn-disabled-opacity: 0.55;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    height: var(--ps-size-button-height);
    padding: 0 0.875rem;
    font-size: var(--ps-font-size-body);
    font-weight: 500;
    line-height: 1;
    letter-spacing: 0;
    border-radius: var(--ps-radius-md);
    border-width: 1px;
    box-shadow: none;
    white-space: nowrap;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
}

.btn:hover {
    transform: none;
    box-shadow: none;
}

.btn:focus-visible {
    box-shadow: var(--ps-focus-ring);
}

.btn:disabled,
.btn.disabled {
    box-shadow: none;
    transform: none;
    opacity: 0.55;
    cursor: not-allowed;
}

.btn-sm,
.btn-group-sm > .btn {
    height: var(--ps-size-button-height-sm);
    padding: 0 0.625rem;
    font-size: var(--ps-font-size-sm);
    border-radius: var(--ps-radius-md);
}

.btn-lg,
.btn-group-lg > .btn {
    height: 42px;
    padding: 0 1.125rem;
    font-size: 0.9375rem;
    border-radius: var(--ps-radius-lg);
}

.btn.w-100,
.btn.h-100 {
    height: var(--ps-size-button-height);
}

.btn .spinner-border,
.btn .spinner-border-sm {
    width: 0.875rem;
    height: 0.875rem;
    border-width: 2px;
}

.btn i,
.btn .fas,
.btn .far,
.btn .fab {
    font-size: 0.8125em;
}

/* Solid variants */
.btn-primary {
    --bs-btn-color: #ffffff;
    --bs-btn-bg: var(--ps-primary);
    --bs-btn-border-color: var(--ps-primary);
    --bs-btn-hover-color: #ffffff;
    --bs-btn-hover-bg: var(--ps-primary-strong);
    --bs-btn-hover-border-color: var(--ps-primary-strong);
    --bs-btn-active-color: #ffffff;
    --bs-btn-active-bg: var(--ps-primary-strong);
    --bs-btn-active-border-color: var(--ps-primary-strong);
    --bs-btn-disabled-color: #ffffff;
    --bs-btn-disabled-bg: var(--ps-primary);
    --bs-btn-disabled-border-color: var(--ps-primary);
    color: #ffffff;
    background-color: var(--ps-primary);
    border-color: var(--ps-primary);
}

.btn-primary:hover,
.btn-primary:focus-visible {
    color: #ffffff;
    background-color: var(--ps-primary-strong);
    border-color: var(--ps-primary-strong);
}

.btn-primary:active,
.btn-primary.active,
.btn-check:checked + .btn-primary {
    color: #ffffff;
    background-color: var(--ps-primary-strong);
    border-color: var(--ps-primary-strong);
}

.btn-primary:disabled,
.btn-primary.disabled {
    color: #ffffff;
    background-color: var(--ps-primary);
    border-color: var(--ps-primary);
}

.btn-secondary {
    --bs-btn-color: #ffffff;
    --bs-btn-bg: var(--ps-gray-700);
    --bs-btn-border-color: var(--ps-gray-700);
    --bs-btn-hover-bg: var(--ps-gray-800);
    --bs-btn-hover-border-color: var(--ps-gray-800);
    --bs-btn-active-bg: var(--ps-gray-800);
    --bs-btn-active-border-color: var(--ps-gray-800);
    --bs-btn-disabled-bg: var(--ps-gray-700);
    --bs-btn-disabled-border-color: var(--ps-gray-700);
    color: #ffffff;
    background-color: var(--ps-gray-700);
    border-color: var(--ps-gray-700);
}

.btn-secondary:hover,
.btn-secondary:focus-visible,
.btn-secondary:active {
    color: #ffffff;
    background-color: var(--ps-gray-800);
    border-color: var(--ps-gray-800);
}

.btn-success {
    --bs-btn-color: #ffffff;
    --bs-btn-bg: var(--ps-success);
    --bs-btn-border-color: var(--ps-success);
    --bs-btn-hover-bg: #15803d;
    --bs-btn-hover-border-color: #15803d;
    --bs-btn-active-bg: #15803d;
    --bs-btn-active-border-color: #15803d;
    --bs-btn-disabled-bg: var(--ps-success);
    --bs-btn-disabled-border-color: var(--ps-success);
    color: #ffffff;
    background-color: var(--ps-success);
    border-color: var(--ps-success);
}

.btn-success:hover,
.btn-success:focus-visible,
.btn-success:active {
    color: #ffffff;
    background-color: #15803d;
    border-color: #15803d;
}

.btn-danger {
    --bs-btn-color: #ffffff;
    --bs-btn-bg: var(--ps-danger);
    --bs-btn-border-color: var(--ps-danger);
    --bs-btn-hover-bg: #b91c1c;
    --bs-btn-hover-border-color: #b91c1c;
    --bs-btn-active-bg: #b91c1c;
    --bs-btn-active-border-color: #b91c1c;
    --bs-btn-disabled-bg: var(--ps-danger);
    --bs-btn-disabled-border-color: var(--ps-danger);
    color: #ffffff;
    background-color: var(--ps-danger);
    border-color: var(--ps-danger);
}

.btn-danger:hover,
.btn-danger:focus-visible,
.btn-danger:active {
    color: #ffffff;
    background-color: #b91c1c;
    border-color: #b91c1c;
}

.btn-warning {
    --bs-btn-color: #ffffff;
    --bs-btn-bg: var(--ps-warning);
    --bs-btn-border-color: var(--ps-warning);
    --bs-btn-hover-bg: var(--ps-warning-strong);
    --bs-btn-hover-border-color: var(--ps-warning-strong);
    --bs-btn-active-bg: var(--ps-warning-strong);
    --bs-btn-active-border-color: var(--ps-warning-strong);
    color: #ffffff;
    background-color: var(--ps-warning);
    border-color: var(--ps-warning);
}

.btn-warning:hover,
.btn-warning:focus-visible,
.btn-warning:active {
    color: #ffffff;
    background-color: var(--ps-warning-strong);
    border-color: var(--ps-warning-strong);
}

.btn-info {
    --bs-btn-color: #ffffff;
    --bs-btn-bg: var(--ps-info);
    --bs-btn-border-color: var(--ps-info);
    --bs-btn-hover-bg: #0369a1;
    --bs-btn-hover-border-color: #0369a1;
    color: #ffffff;
    background-color: var(--ps-info);
    border-color: var(--ps-info);
}

.btn-info:hover,
.btn-info:focus-visible,
.btn-info:active {
    color: #ffffff;
    background-color: #0369a1;
    border-color: #0369a1;
}

.btn-dark {
    --bs-btn-color: #ffffff;
    --bs-btn-bg: var(--ps-gray-900);
    --bs-btn-border-color: var(--ps-gray-900);
    --bs-btn-hover-bg: var(--ps-gray-800);
    --bs-btn-hover-border-color: var(--ps-gray-800);
    color: #ffffff;
    background-color: var(--ps-gray-900);
    border-color: var(--ps-gray-900);
}

.btn-dark:hover,
.btn-dark:focus-visible,
.btn-dark:active {
    color: #ffffff;
    background-color: var(--ps-gray-800);
    border-color: var(--ps-gray-800);
}

.btn-light {
    --bs-btn-color: var(--ps-ink);
    --bs-btn-bg: var(--ps-gray-100);
    --bs-btn-border-color: var(--ps-gray-100);
    --bs-btn-hover-bg: var(--ps-gray-200);
    --bs-btn-hover-border-color: var(--ps-gray-200);
    color: var(--ps-ink);
    background-color: var(--ps-gray-100);
    border-color: var(--ps-gray-100);
}

.btn-light:hover,
.btn-light:focus-visible,
.btn-light:active {
    color: var(--ps-ink);
    background-color: var(--ps-gray-200);
    border-color: var(--ps-gray-200);
}

/* Outline variants: white surface, quiet border, tinted text */
.btn-outline-secondary,
.btn-outline-dark,
.btn-outline-light {
    --bs-btn-color: var(--ps-gray-700);
    --bs-btn-bg: var(--ps-surface);
    --bs-btn-border-color: var(--ps-gray-300);
    --bs-btn-hover-color: var(--ps-ink);
    --bs-btn-hover-bg: var(--ps-gray-50);
    --bs-btn-hover-border-color: var(--ps-gray-400);
    --bs-btn-active-color: var(--ps-ink);
    --bs-btn-active-bg: var(--ps-gray-100);
    --bs-btn-active-border-color: var(--ps-gray-400);
    --bs-btn-disabled-color: var(--ps-gray-700);
    --bs-btn-disabled-bg: var(--ps-surface);
    --bs-btn-disabled-border-color: var(--ps-gray-300);
    color: var(--ps-gray-700);
    background-color: var(--ps-surface);
    border-color: var(--ps-gray-300);
    box-shadow: var(--ps-shadow-xs);
}

.btn-outline-secondary:hover,
.btn-outline-secondary:focus-visible,
.btn-outline-dark:hover,
.btn-outline-dark:focus-visible,
.btn-outline-light:hover,
.btn-outline-light:focus-visible {
    color: var(--ps-ink);
    background-color: var(--ps-gray-50);
    border-color: var(--ps-gray-400);
}

.btn-outline-secondary:active,
.btn-outline-secondary.active,
.btn-check:checked + .btn-outline-secondary,
.btn-outline-dark:active,
.btn-outline-dark.active {
    color: var(--ps-ink);
    background-color: var(--ps-gray-100);
    border-color: var(--ps-gray-400);
}

.btn-outline-secondary:disabled,
.btn-outline-secondary.disabled,
.btn-outline-dark:disabled,
.btn-outline-dark.disabled {
    color: var(--ps-gray-700);
    background-color: var(--ps-surface);
    border-color: var(--ps-gray-300);
}

.btn-outline-primary {
    --bs-btn-color: var(--ps-primary-strong);
    --bs-btn-bg: var(--ps-surface);
    --bs-btn-border-color: color-mix(in srgb, var(--ps-primary) 40%, var(--ps-gray-300));
    --bs-btn-hover-color: var(--ps-primary-strong);
    --bs-btn-hover-bg: var(--ps-primary-soft);
    --bs-btn-hover-border-color: var(--ps-primary);
    --bs-btn-active-color: var(--ps-primary-strong);
    --bs-btn-active-bg: var(--ps-primary-soft-2);
    --bs-btn-active-border-color: var(--ps-primary);
    --bs-btn-disabled-color: var(--ps-primary-strong);
    --bs-btn-disabled-bg: var(--ps-surface);
    --bs-btn-disabled-border-color: color-mix(in srgb, var(--ps-primary) 40%, var(--ps-gray-300));
    color: var(--ps-primary-strong);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-primary) 40%, var(--ps-gray-300));
}

.btn-outline-primary:hover,
.btn-outline-primary:focus-visible {
    color: var(--ps-primary-strong);
    background-color: var(--ps-primary-soft);
    border-color: var(--ps-primary);
}

.btn-outline-primary:active,
.btn-outline-primary.active,
.btn-check:checked + .btn-outline-primary {
    color: var(--ps-primary-strong);
    background-color: var(--ps-primary-soft-2);
    border-color: var(--ps-primary);
}

.btn-outline-primary:disabled,
.btn-outline-primary.disabled {
    color: var(--ps-primary-strong);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-primary) 40%, var(--ps-gray-300));
}

.btn-outline-success {
    --bs-btn-color: var(--ps-success-text);
    --bs-btn-bg: var(--ps-surface);
    --bs-btn-border-color: color-mix(in srgb, var(--ps-success) 40%, var(--ps-gray-300));
    --bs-btn-hover-color: var(--ps-success-text);
    --bs-btn-hover-bg: var(--ps-success-soft);
    --bs-btn-hover-border-color: var(--ps-success);
    --bs-btn-active-color: var(--ps-success-text);
    --bs-btn-active-bg: var(--ps-success-soft);
    --bs-btn-active-border-color: var(--ps-success);
    --bs-btn-disabled-color: var(--ps-success-text);
    --bs-btn-disabled-bg: var(--ps-surface);
    --bs-btn-disabled-border-color: color-mix(in srgb, var(--ps-success) 40%, var(--ps-gray-300));
    color: var(--ps-success-text);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-success) 40%, var(--ps-gray-300));
}

.btn-outline-success:hover,
.btn-outline-success:focus-visible,
.btn-outline-success:active {
    color: var(--ps-success-text);
    background-color: var(--ps-success-soft);
    border-color: var(--ps-success);
}

.btn-outline-success:disabled,
.btn-outline-success.disabled {
    color: var(--ps-success-text);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-success) 40%, var(--ps-gray-300));
}

.btn-outline-danger {
    --bs-btn-color: var(--ps-danger-text);
    --bs-btn-bg: var(--ps-surface);
    --bs-btn-border-color: color-mix(in srgb, var(--ps-danger) 40%, var(--ps-gray-300));
    --bs-btn-hover-color: var(--ps-danger-text);
    --bs-btn-hover-bg: var(--ps-danger-soft);
    --bs-btn-hover-border-color: var(--ps-danger);
    --bs-btn-active-color: var(--ps-danger-text);
    --bs-btn-active-bg: var(--ps-danger-soft);
    --bs-btn-active-border-color: var(--ps-danger);
    --bs-btn-disabled-color: var(--ps-danger-text);
    --bs-btn-disabled-bg: var(--ps-surface);
    --bs-btn-disabled-border-color: color-mix(in srgb, var(--ps-danger) 40%, var(--ps-gray-300));
    color: var(--ps-danger-text);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-danger) 40%, var(--ps-gray-300));
}

.btn-outline-danger:hover,
.btn-outline-danger:focus-visible,
.btn-outline-danger:active {
    color: var(--ps-danger-text);
    background-color: var(--ps-danger-soft);
    border-color: var(--ps-danger);
}

.btn-outline-danger:disabled,
.btn-outline-danger.disabled {
    color: var(--ps-danger-text);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-danger) 40%, var(--ps-gray-300));
}

.btn-outline-warning {
    --bs-btn-color: var(--ps-warning-text);
    --bs-btn-bg: var(--ps-surface);
    --bs-btn-border-color: color-mix(in srgb, var(--ps-warning) 45%, var(--ps-gray-300));
    --bs-btn-hover-color: var(--ps-warning-text);
    --bs-btn-hover-bg: var(--ps-warning-soft);
    --bs-btn-hover-border-color: var(--ps-warning);
    --bs-btn-active-color: var(--ps-warning-text);
    --bs-btn-active-bg: var(--ps-warning-soft);
    --bs-btn-active-border-color: var(--ps-warning);
    --bs-btn-disabled-color: var(--ps-warning-text);
    --bs-btn-disabled-bg: var(--ps-surface);
    --bs-btn-disabled-border-color: color-mix(in srgb, var(--ps-warning) 45%, var(--ps-gray-300));
    color: var(--ps-warning-text);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-warning) 45%, var(--ps-gray-300));
}

.btn-outline-warning:hover,
.btn-outline-warning:focus-visible,
.btn-outline-warning:active {
    color: var(--ps-warning-text);
    background-color: var(--ps-warning-soft);
    border-color: var(--ps-warning);
}

.btn-outline-info {
    --bs-btn-color: var(--ps-info-text);
    --bs-btn-bg: var(--ps-surface);
    --bs-btn-border-color: color-mix(in srgb, var(--ps-info) 40%, var(--ps-gray-300));
    --bs-btn-hover-color: var(--ps-info-text);
    --bs-btn-hover-bg: var(--ps-info-soft);
    --bs-btn-hover-border-color: var(--ps-info);
    --bs-btn-active-color: var(--ps-info-text);
    --bs-btn-active-bg: var(--ps-info-soft);
    --bs-btn-active-border-color: var(--ps-info);
    color: var(--ps-info-text);
    background-color: var(--ps-surface);
    border-color: color-mix(in srgb, var(--ps-info) 40%, var(--ps-gray-300));
}

.btn-outline-info:hover,
.btn-outline-info:focus-visible,
.btn-outline-info:active {
    color: var(--ps-info-text);
    background-color: var(--ps-info-soft);
    border-color: var(--ps-info);
}

.btn-link {
    --bs-btn-color: var(--ps-primary-strong);
    --bs-btn-hover-color: var(--ps-primary);
    color: var(--ps-primary-strong);
    font-weight: 500;
    text-decoration: none;
    padding: 0 0.5rem;
    border-color: transparent;
    background: transparent;
}

.btn-link:hover,
.btn-link:focus-visible {
    color: var(--ps-primary-strong);
    background: var(--ps-primary-soft);
    text-decoration: none;
}

.btn-close {
    width: 0.75rem;
    height: 0.75rem;
    opacity: 0.5;
    box-shadow: none;
}

.btn-close:hover {
    opacity: 0.9;
}

.btn-close:focus {
    box-shadow: var(--ps-focus-ring);
}

.btn-group > .btn:not(:first-child) {
    margin-left: -1px;
}

/* ===========================================================================
 * 6. Forms
 * ======================================================================== */

.form-label,
label.form-label {
    display: inline-block;
    font-size: var(--ps-font-size-sm);
    font-weight: 500;
    color: var(--ps-gray-700);
    margin-bottom: 0.3rem;
}

.form-text {
    font-size: 0.75rem;
    color: var(--ps-muted);
}

.form-control,
.form-select,
textarea,
.form-control-plaintext {
    font-family: var(--ps-font-sans);
    font-size: var(--ps-font-size-body);
    font-weight: 400;
    line-height: 1.4;
    color: var(--ps-ink);
}

.form-control,
.form-select {
    height: var(--ps-size-input-height);
    min-height: var(--ps-size-input-height);
    padding: 0 0.75rem;
    background-color: var(--ps-surface);
    border: 1px solid var(--ps-gray-300);
    border-radius: var(--ps-radius-md);
    box-shadow: none;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.form-control::placeholder {
    color: var(--ps-gray-400);
    opacity: 1;
}

.form-control:hover:not(:disabled):not([readonly]):not(:focus),
.form-select:hover:not(:disabled):not(:focus) {
    border-color: var(--ps-gray-400);
}

.form-control:focus,
.form-select:focus,
textarea:focus {
    color: var(--ps-ink);
    background-color: var(--ps-surface);
    border-color: var(--ps-primary);
    box-shadow: var(--ps-focus-ring);
    outline: 0;
}

.form-control:disabled,
.form-control[readonly],
.form-select:disabled {
    background-color: var(--ps-gray-50);
    color: var(--ps-gray-600);
    border-color: var(--ps-gray-200);
    opacity: 1;
}

.form-control[readonly]:not(:disabled) {
    color: var(--ps-ink);
}

textarea.form-control {
    height: auto;
    min-height: 96px;
    padding: 0.5rem 0.75rem;
    line-height: 1.5;
}

div.form-control {
    display: flex;
    align-items: center;
}

.form-control-sm,
.form-select-sm {
    height: var(--ps-size-input-height-sm);
    min-height: var(--ps-size-input-height-sm);
    padding: 0 0.625rem;
    font-size: var(--ps-font-size-sm);
    border-radius: var(--ps-radius-md);
}

.form-control-lg,
.form-select-lg {
    height: 42px;
    min-height: 42px;
    font-size: 0.9375rem;
}

.form-select {
    padding-right: 2.25rem;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%2364748b' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.75' d='m3.5 6 4.5 4.5L12.5 6'/%3e%3c/svg%3e");
    background-repeat: no-repeat;
    background-position: right 0.75rem center;
    background-size: 14px 14px;
}

.form-select-sm {
    padding-right: 2rem;
    background-position: right 0.5rem center;
}

.form-select[multiple],
.form-select[size]:not([size="1"]) {
    height: auto;
    padding: 0.375rem 0.5rem;
    background-image: none;
}

.form-control[type="file"] {
    padding: 0;
    line-height: calc(var(--ps-size-input-height) - 2px);
}

.form-control[type="file"]::file-selector-button {
    height: calc(var(--ps-size-input-height) - 2px);
    padding: 0 0.875rem;
    margin-right: 0.75rem;
    border: 0;
    border-right: 1px solid var(--ps-gray-300);
    background: var(--ps-gray-50);
    color: var(--ps-gray-700);
    font-weight: 500;
}

input[type="date"].form-control,
input[type="datetime-local"].form-control,
input[type="time"].form-control,
input[type="month"].form-control {
    padding-right: 0.5rem;
}

.input-group {
    align-items: stretch;
}

.input-group-text {
    height: var(--ps-size-input-height);
    padding: 0 0.75rem !important;
    font-size: var(--ps-font-size-body);
    font-weight: 400;
    color: var(--ps-gray-600);
    background-color: var(--ps-gray-50);
    border: 1px solid var(--ps-gray-300);
    border-radius: var(--ps-radius-md);
}

.input-group-sm > .input-group-text {
    height: var(--ps-size-input-height-sm);
    font-size: var(--ps-font-size-sm);
}

.input-group > .btn {
    height: var(--ps-size-input-height);
}

.form-check {
    min-height: 1.25rem;
    padding-left: 1.5rem;
    margin-bottom: 0.25rem;
}

.form-check-input {
    width: 1rem;
    height: 1rem;
    margin-top: 0.2rem;
    margin-left: -1.5rem;
    background-color: var(--ps-surface);
    border: 1px solid var(--ps-gray-400) !important;
    border-radius: var(--ps-radius-sm);
    box-shadow: none;
    transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}

.form-check-input[type="radio"] {
    border-radius: 50%;
}

.form-check-input:focus {
    border-color: var(--ps-primary) !important;
    box-shadow: var(--ps-focus-ring);
}

.form-check-input:checked {
    background-color: var(--ps-primary);
    border-color: var(--ps-primary) !important;
}

.form-check-input:disabled {
    opacity: 0.5;
}

.form-check-label {
    font-size: var(--ps-font-size-body);
    color: var(--ps-ink);
}

.form-switch {
    padding-left: 2.75rem;
}

.form-switch .form-check-input {
    width: 2.25rem;
    height: 1.25rem;
    margin-top: 0.1rem;
    margin-left: -2.75rem;
    border-radius: 999px;
    background-color: var(--ps-gray-300);
    border-color: var(--ps-gray-300) !important;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e");
}

.form-switch .form-check-input:checked {
    background-color: var(--ps-primary);
    border-color: var(--ps-primary) !important;
}

.form-range::-webkit-slider-thumb {
    background: var(--ps-primary);
}

.form-range::-moz-range-thumb {
    background: var(--ps-primary);
}

.form-control.is-invalid,
.form-select.is-invalid,
.was-validated .form-control:invalid,
.was-validated .form-select:invalid,
.form-control.invalid,
.form-select.invalid {
    border-color: var(--ps-danger);
    background-image: none;
    padding-right: 0.75rem;
}

.form-control.is-invalid:focus,
.form-select.is-invalid:focus,
.form-control.invalid:focus {
    box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.18);
}

.form-control.is-valid,
.form-select.is-valid,
.form-control.valid,
.form-select.valid {
    border-color: var(--ps-gray-300);
    background-image: none;
    padding-right: 0.75rem;
}

.invalid-feedback,
.validation-message {
    display: block;
    font-size: 0.75rem;
    color: var(--ps-danger-text);
    margin-top: 0.3rem;
}

.validation-errors {
    padding-left: 1rem;
    margin: 0.5rem 0;
    font-size: var(--ps-font-size-sm);
    color: var(--ps-danger-text);
}

.app-form-grid {
    display: grid;
    gap: 0.875rem 1rem;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    align-items: end;
}

.app-form-grid > .d-flex.align-items-end {
    gap: 0.5rem;
}

@media (max-width: 767.98px) {
    .app-form-grid {
        grid-template-columns: 1fr;
    }
}

.app-form-actions {
    display: flex;
    justify-content: flex-end;
    gap: var(--ps-space-2);
    margin-top: var(--ps-space-4);
    flex-wrap: wrap;
}

.app-file-row {
    display: flex;
    align-items: center;
    gap: var(--ps-space-3);
    flex-wrap: wrap;
}

.app-file-input {
    flex: 1;
    min-width: 220px;
    height: var(--ps-size-input-height);
    padding: 0;
    line-height: calc(var(--ps-size-input-height) - 2px);
    border-radius: var(--ps-radius-md);
    border: 1px solid var(--ps-gray-300);
    background: var(--ps-surface);
    color: var(--ps-ink-soft);
    font-size: var(--ps-font-size-body);
}

.app-file-input::file-selector-button {
    height: calc(var(--ps-size-input-height) - 2px);
    border: 0;
    border-right: 1px solid var(--ps-gray-300);
    border-radius: 0;
    background: var(--ps-gray-50);
    color: var(--ps-gray-700);
    padding: 0 0.875rem;
    margin-right: 0.75rem;
    font-weight: 500;
    cursor: pointer;
}

.app-file-input::file-selector-button:hover {
    background: var(--ps-gray-100);
}

/* ===========================================================================
 * 7. Badges and status pills
 * ======================================================================== */

.badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.2rem 0.55rem;
    font-size: 0.75rem;
    font-weight: 500;
    line-height: 1.25;
    letter-spacing: 0;
    text-transform: none;
    border-radius: 999px;
    border: 1px solid transparent;
    white-space: nowrap;
    vertical-align: middle;
}

.badge-dot::before {
    content: "";
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: currentColor;
    opacity: 0.8;
}

.badge.bg-success,
.badge.text-bg-success {
    background-color: var(--ps-success-soft) !important;
    color: var(--ps-success-text) !important;
}

.badge.bg-danger,
.badge.text-bg-danger {
    background-color: var(--ps-danger-soft) !important;
    color: var(--ps-danger-text) !important;
}

.badge.bg-warning,
.badge.text-bg-warning {
    background-color: var(--ps-warning-soft) !important;
    color: var(--ps-warning-text) !important;
}

.badge.bg-info,
.badge.text-bg-info {
    background-color: var(--ps-info-soft) !important;
    color: var(--ps-info-text) !important;
}

.badge.bg-primary,
.badge.text-bg-primary {
    background-color: var(--ps-primary-soft) !important;
    color: var(--ps-primary-strong) !important;
}

.badge.bg-secondary,
.badge.text-bg-secondary,
.badge.bg-light,
.badge.text-bg-light {
    background-color: var(--ps-gray-100) !important;
    color: var(--ps-gray-700) !important;
    border-color: var(--ps-gray-200);
}

.badge.bg-dark,
.badge.text-bg-dark {
    background-color: var(--ps-gray-800) !important;
    color: #ffffff !important;
}

.badge.text-dark,
.badge.text-white,
.badge.text-light {
    color: inherit !important;
}

.badge.bg-warning.text-dark {
    color: var(--ps-warning-text) !important;
}

.badge.bg-light.text-dark,
.badge.bg-secondary.text-dark {
    color: var(--ps-gray-700) !important;
}

.badge.bg-primary-subtle { background-color: var(--ps-primary-soft) !important; color: var(--ps-primary-strong); }
.badge.bg-secondary-subtle { background-color: var(--ps-gray-100) !important; color: var(--ps-gray-700); border-color: var(--ps-gray-200); }
.badge.bg-success-subtle { background-color: var(--ps-success-soft) !important; color: var(--ps-success-text); }
.badge.bg-warning-subtle { background-color: var(--ps-warning-soft) !important; color: var(--ps-warning-text); }
.badge.bg-danger-subtle { background-color: var(--ps-danger-soft) !important; color: var(--ps-danger-text); }
.badge.bg-info-subtle { background-color: var(--ps-info-soft) !important; color: var(--ps-info-text); }

.bg-primary-subtle { background-color: var(--ps-primary-soft) !important; }
.bg-secondary-subtle { background-color: var(--ps-gray-100) !important; }
.bg-success-subtle { background-color: var(--ps-success-soft) !important; }
.bg-warning-subtle { background-color: var(--ps-warning-soft) !important; }
.bg-danger-subtle { background-color: var(--ps-danger-soft) !important; }
.bg-info-subtle { background-color: var(--ps-info-soft) !important; }

.text-primary-emphasis { color: var(--ps-primary-strong) !important; }
.text-secondary-emphasis { color: var(--ps-gray-700) !important; }
.text-success-emphasis { color: var(--ps-success-text) !important; }
.text-warning-emphasis { color: var(--ps-warning-text) !important; }
.text-danger-emphasis { color: var(--ps-danger-text) !important; }
.text-info-emphasis { color: var(--ps-info-text) !important; }

.text-primary { color: var(--ps-primary-strong) !important; }
.text-success { color: var(--ps-success-text) !important; }
.text-danger { color: var(--ps-danger-text) !important; }
.text-warning { color: var(--ps-warning-text) !important; }
.text-info { color: var(--ps-info-text) !important; }

/* ===========================================================================
 * 8. Alerts
 * ======================================================================== */

.alert {
    padding: 0.75rem 1rem;
    border-radius: var(--ps-radius-lg);
    border: 1px solid transparent;
    box-shadow: none;
    font-size: var(--ps-font-size-body);
    animation: none;
    margin-bottom: 0;
}

.alert + .alert,
.alert + .card,
.card + .alert {
    margin-top: 0.75rem;
}

.alert .alert-heading {
    font-size: 0.9375rem;
    font-weight: 600;
    margin-bottom: 0.25rem;
}

.alert-primary {
    background: var(--ps-primary-soft);
    border-color: var(--ps-primary-soft-2);
    color: var(--ps-primary-strong);
}

.alert-info {
    background: var(--ps-info-soft);
    border-color: #bae6fd;
    color: var(--ps-info-text);
}

.alert-success {
    background: var(--ps-success-soft);
    border-color: #bbf7d0;
    color: var(--ps-success-text);
}

.alert-warning {
    background: var(--ps-warning-soft);
    border-color: #fde68a;
    color: var(--ps-warning-text);
}

.alert-danger {
    background: var(--ps-danger-soft);
    border-color: #fecaca;
    color: var(--ps-danger-text);
}

.alert-secondary,
.alert-light {
    background: var(--ps-gray-50);
    border-color: var(--ps-border);
    color: var(--ps-gray-700);
}

.alert-dark {
    background: var(--ps-gray-800);
    border-color: var(--ps-gray-800);
    color: #ffffff;
}

.alert a {
    color: inherit;
    font-weight: 600;
    text-decoration: underline;
}

/* ===========================================================================
 * 9. Modals and dialogs
 * ======================================================================== */

.modal {
    --bs-modal-bg: var(--ps-surface);
    --bs-modal-color: var(--ps-ink);
    --bs-modal-border-color: var(--ps-border);
    --bs-modal-border-radius: 10px;
    --bs-modal-box-shadow: var(--ps-shadow-lg);
    --bs-modal-header-border-color: var(--ps-border);
    --bs-modal-footer-border-color: var(--ps-border);
}

.modal-backdrop,
.app-modal-backdrop {
    background: rgba(15, 23, 42, 0.45);
}

.modal.app-modal-backdrop {
    backdrop-filter: blur(1px);
}

.modal-content,
.modal-content.app-dialog {
    background: var(--ps-surface);
    color: var(--ps-ink);
    border-radius: 10px;
    border: 1px solid var(--ps-border);
    box-shadow: var(--ps-shadow-lg);
}

@media (min-width: 576px) {
    .modal-dialog:not(.modal-sm):not(.modal-lg):not(.modal-xl):not(.modal-fullscreen) {
        max-width: 560px;
    }
}

.modal-header {
    padding: 1rem 1.25rem;
    border-bottom: 1px solid var(--ps-border);
    align-items: center;
}

.modal-title {
    font-size: 1rem;
    font-weight: 600;
    color: var(--ps-ink);
    line-height: 1.3;
}

.modal-body {
    padding: 1.25rem;
}

.modal-body .mb-3:last-child {
    margin-bottom: 0 !important;
}

.modal-footer {
    padding: 0.75rem 1.25rem;
    border-top: 1px solid var(--ps-border);
    background: var(--ps-gray-50);
    gap: 0.5rem;
    border-bottom-left-radius: 9px;
    border-bottom-right-radius: 9px;
}

.modal-footer > * {
    margin: 0;
}

/* ABP confirmation dialog */
.confirmation .confirmation-dialog {
    border-radius: 10px;
    border: 1px solid var(--ps-border);
    box-shadow: var(--ps-shadow-lg);
    font-family: var(--ps-font-sans);
}

.confirmation .confirmation-dialog .content .title {
    color: var(--ps-ink);
    font-weight: 600;
}

.confirmation .confirmation-dialog .content .message {
    color: var(--ps-ink-soft);
}

.confirmation .confirmation-dialog .footer .confirmation-button {
    background-color: var(--ps-primary);
    border-radius: var(--ps-radius-md);
    font-weight: 500;
}

.confirmation .confirmation-dialog .footer .confirmation-button:hover,
.confirmation .confirmation-dialog .footer .confirmation-button:focus {
    background-color: var(--ps-primary-strong);
}

/* ===========================================================================
 * 10. Tabs, pills, navs
 * ======================================================================== */

.nav-tabs {
    --bs-nav-tabs-border-width: 1px;
    --bs-nav-tabs-border-color: var(--ps-border);
    --bs-nav-tabs-link-active-color: var(--ps-primary-strong);
    --bs-nav-tabs-link-active-bg: transparent;
    --bs-nav-tabs-link-active-border-color: transparent;
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    background: transparent;
    box-shadow: none;
    padding: 0 !important;
    border-radius: 0;
    border-bottom: 1px solid var(--ps-border);
    margin-bottom: 1rem !important;
}

.nav-tabs .nav-item {
    margin-bottom: -1px;
}

.nav-tabs .nav-link {
    border: 0;
    border-bottom: 2px solid transparent;
    border-radius: 0;
    background: transparent;
    color: var(--ps-gray-600);
    font-weight: 500;
    font-size: var(--ps-font-size-body);
    padding: 0.625rem 0.875rem;
    margin-bottom: -1px;
    transition: color 0.15s ease, border-color 0.15s ease;
}

.nav-tabs .nav-link:hover,
.nav-tabs .nav-link:focus {
    color: var(--ps-ink);
    border-color: transparent;
    border-bottom-color: var(--ps-gray-300);
    isolation: auto;
}

.nav-tabs .nav-link.active,
.nav-tabs .nav-item.show .nav-link {
    color: var(--ps-primary-strong);
    background: transparent;
    border-color: transparent;
    border-bottom-color: var(--ps-primary);
}

.nav-tabs .nav-link.disabled {
    color: var(--ps-gray-400);
}

.tab-content {
    background: var(--ps-surface);
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    box-shadow: none;
    padding: 1.25rem;
}

.card .tab-content,
.modal-body .tab-content,
.app-card .tab-content {
    background: transparent;
    border: 0;
    padding: 0;
    box-shadow: none;
}

.nav-pills .nav-link {
    border-radius: var(--ps-radius-md);
    color: var(--ps-gray-600);
    font-weight: 500;
    padding: 0.45rem 0.875rem;
}

.nav-pills .nav-link:hover {
    background: var(--ps-gray-100);
    color: var(--ps-ink);
}

.nav-pills .nav-link.active,
.nav-pills .show > .nav-link {
    background: var(--ps-primary-soft);
    color: var(--ps-primary-strong);
}

/* ===========================================================================
 * 11. Pagination, dropdowns, list groups
 * ======================================================================== */

.pagination {
    --bs-pagination-padding-x: 0.5rem;
    --bs-pagination-padding-y: 0;
    --bs-pagination-font-size: var(--ps-font-size-sm);
    --bs-pagination-color: var(--ps-gray-600);
    --bs-pagination-bg: transparent;
    --bs-pagination-border-width: 1px;
    --bs-pagination-border-color: transparent;
    --bs-pagination-border-radius: var(--ps-radius-md);
    --bs-pagination-hover-color: var(--ps-ink);
    --bs-pagination-hover-bg: var(--ps-gray-100);
    --bs-pagination-hover-border-color: transparent;
    --bs-pagination-focus-color: var(--ps-ink);
    --bs-pagination-focus-bg: var(--ps-gray-100);
    --bs-pagination-focus-box-shadow: var(--ps-focus-ring);
    --bs-pagination-active-color: var(--ps-ink);
    --bs-pagination-active-bg: var(--ps-surface);
    --bs-pagination-active-border-color: var(--ps-border-strong);
    --bs-pagination-disabled-color: var(--ps-gray-400);
    --bs-pagination-disabled-bg: transparent;
    --bs-pagination-disabled-border-color: transparent;
    display: flex;
    gap: 2px;
    margin: 0;
}

.page-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 30px;
    height: 30px;
    padding: 0 0.5rem;
    font-size: var(--ps-font-size-sm);
    font-weight: 500;
    color: var(--ps-gray-600);
    background: transparent;
    border: 1px solid transparent;
    border-radius: var(--ps-radius-md) !important;
    box-shadow: none;
    transition: background-color 0.15s ease, color 0.15s ease;
}

.page-link:hover {
    color: var(--ps-ink);
    background: var(--ps-gray-100);
    border-color: transparent;
}

.page-link:focus {
    box-shadow: var(--ps-focus-ring);
}

.page-item.active .page-link {
    color: var(--ps-ink);
    background: var(--ps-surface);
    border-color: var(--ps-border-strong);
    font-weight: 600;
    box-shadow: var(--ps-shadow-xs);
}

.page-item.disabled .page-link {
    color: var(--ps-gray-400);
    background: transparent;
    border-color: transparent;
}

.page-item:not(:first-child) .page-link {
    margin-left: 0;
}

.dropdown-menu {
    --bs-dropdown-bg: var(--ps-surface);
    --bs-dropdown-color: var(--ps-ink);
    --bs-dropdown-border-color: var(--ps-border);
    --bs-dropdown-border-radius: var(--ps-radius-lg);
    --bs-dropdown-link-color: var(--ps-ink);
    --bs-dropdown-link-hover-color: var(--ps-ink);
    --bs-dropdown-link-hover-bg: var(--ps-gray-100);
    --bs-dropdown-link-active-color: var(--ps-primary-strong);
    --bs-dropdown-link-active-bg: var(--ps-primary-soft);
    --bs-dropdown-header-color: var(--ps-muted);
    --bs-dropdown-divider-bg: var(--ps-border);
    background: var(--ps-surface);
    color: var(--ps-ink);
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    box-shadow: var(--ps-shadow-md);
    padding: 4px;
    font-size: var(--ps-font-size-body);
    min-width: 11rem;
}

.dropdown-item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.45rem 0.625rem;
    border-radius: var(--ps-radius-md);
    color: var(--ps-ink);
    font-size: var(--ps-font-size-body);
    font-weight: 400;
}

.dropdown-item:hover,
.dropdown-item:focus {
    background: var(--ps-gray-100);
    color: var(--ps-ink);
}

.dropdown-item.active,
.dropdown-item:active {
    background: var(--ps-primary-soft);
    color: var(--ps-primary-strong);
}

.dropdown-item-text {
    padding: 0.45rem 0.625rem;
    color: var(--ps-ink);
}

.dropdown-header {
    padding: 0.5rem 0.625rem 0.25rem;
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--ps-muted);
}

.dropdown-divider {
    margin: 4px 0;
    border-top: 1px solid var(--ps-border);
    opacity: 1;
}

.list-group {
    --bs-list-group-bg: var(--ps-surface);
    --bs-list-group-color: var(--ps-ink);
    --bs-list-group-border-color: var(--ps-border);
    --bs-list-group-border-radius: var(--ps-radius-lg);
    --bs-list-group-item-padding-x: 1rem;
    --bs-list-group-item-padding-y: 0.625rem;
    --bs-list-group-action-hover-bg: var(--ps-gray-50);
    --bs-list-group-active-bg: var(--ps-primary-soft);
    --bs-list-group-active-color: var(--ps-primary-strong);
    --bs-list-group-active-border-color: var(--ps-border);
    border-radius: var(--ps-radius-lg);
}

.list-group-item {
    padding: 0.625rem 1rem;
    color: var(--ps-ink);
    background: var(--ps-surface);
    border-color: var(--ps-border);
    font-size: var(--ps-font-size-body);
}

.list-group-item-action:hover,
.list-group-item-action:focus {
    background: var(--ps-gray-50);
    color: var(--ps-ink);
}

.list-group-item.active {
    background: var(--ps-primary-soft);
    color: var(--ps-primary-strong);
    border-color: var(--ps-border);
}

.accordion {
    --bs-accordion-bg: var(--ps-surface);
    --bs-accordion-color: var(--ps-ink);
    --bs-accordion-border-color: var(--ps-border);
    --bs-accordion-border-radius: var(--ps-radius-lg);
    --bs-accordion-btn-color: var(--ps-ink);
    --bs-accordion-btn-bg: var(--ps-surface);
    --bs-accordion-active-color: var(--ps-primary-strong);
    --bs-accordion-active-bg: var(--ps-primary-soft);
    --bs-accordion-btn-focus-box-shadow: var(--ps-focus-ring);
}

.accordion-button {
    font-weight: 500;
    font-size: var(--ps-font-size-body);
    padding: 0.875rem 1.25rem;
}

.progress {
    height: 8px;
    border-radius: 999px;
    background: var(--ps-gray-100);
    box-shadow: none;
}

.progress-bar {
    background-color: var(--ps-primary);
}

.tooltip .tooltip-inner {
    background: var(--ps-gray-900);
    border-radius: var(--ps-radius-md);
    font-size: 0.75rem;
    padding: 0.35rem 0.6rem;
}

.popover {
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    box-shadow: var(--ps-shadow-md);
    font-family: var(--ps-font-sans);
    font-size: var(--ps-font-size-sm);
}

.toast {
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    box-shadow: var(--ps-shadow-md);
    background: var(--ps-surface);
    font-size: var(--ps-font-size-body);
}

.spinner-border {
    border-width: 2px;
}

.spinner-border.text-primary {
    color: var(--ps-primary) !important;
}

.breadcrumb {
    font-size: var(--ps-font-size-sm);
    margin-bottom: 0.75rem;
}

.breadcrumb-item + .breadcrumb-item::before {
    color: var(--ps-gray-400);
}

.breadcrumb-item.active {
    color: var(--ps-ink);
}

/* ===========================================================================
 * 12. Empty states, loading, misc
 * ======================================================================== */

.app-empty {
    border: 1px dashed var(--ps-gray-300);
    border-radius: var(--ps-radius-lg);
    padding: 2.5rem 1.5rem;
    text-align: center;
    background: var(--ps-gray-50);
    color: var(--ps-muted);
}

.app-empty__title {
    margin: 0 0 0.25rem;
    color: var(--ps-ink);
    font-weight: 600;
    font-size: 0.9375rem;
}

.app-empty__message {
    margin: 0 auto;
    color: var(--ps-muted);
    font-size: var(--ps-font-size-body);
    max-width: 48ch;
}

.app-empty__actions {
    margin-top: var(--ps-space-4);
    display: flex;
    justify-content: center;
    gap: var(--ps-space-2);
    flex-wrap: wrap;
}

.app-empty__icon {
    width: 40px;
    height: 40px;
    border-radius: var(--ps-radius-lg);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin: 0 auto var(--ps-space-3);
    background: var(--ps-gray-100);
    color: var(--ps-gray-500);
    font-size: 1rem;
}

.app-skeleton {
    display: grid;
    gap: 0.625rem;
    padding: 0.25rem 0;
}

.app-skeleton__line {
    height: 10px;
    border-radius: 999px;
    background: linear-gradient(90deg, var(--ps-gray-100), var(--ps-gray-200), var(--ps-gray-100));
    background-size: 200% 100%;
    animation: app-skeleton 1.4s ease-in-out infinite;
}

@keyframes app-skeleton {
    0% { background-position: 0% 50%; }
    100% { background-position: 200% 50%; }
}

.app-code {
    font-family: var(--ps-font-mono);
    font-size: 0.8125rem;
    font-weight: 500;
    background: var(--ps-gray-100);
    padding: 0.1rem 0.4rem;
    border-radius: var(--ps-radius-sm);
    color: var(--ps-gray-700);
    display: inline-block;
}

/* ABP built-in page headers (Users, Roles, Tenants, Settings) */
.content-header-title,
.entry-row .content-header-title {
    font-size: var(--ps-font-size-h1) !important;
    font-weight: 600;
    color: var(--ps-ink);
    letter-spacing: -0.015em;
    margin: 0.25rem 0 1rem;
}

.entry-row {
    align-items: center;
    margin-bottom: 0.5rem;
}

.dt-container {
    background: var(--ps-surface);
    border: 1px solid var(--ps-border);
    border-radius: var(--ps-radius-lg);
    box-shadow: none;
    padding: 1.25rem;
}

.abp-block-area {
    background: var(--ps-surface);
}

/* Motion: keep it minimal and respect user preference */
@media (prefers-reduced-motion: reduce) {
    * {
        animation-duration: 0.001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.001ms !important;
    }
}

@media print {
    .lpx-sidebar-container,
    .lpx-topbar-container,
    .lpx-mobile-navbar-container,
    .ps-app-version {
        display: none !important;
    }

    .lpx-content-container {
        margin-left: 0 !important;
    }

    .card,
    .app-card,
    .table-responsive {
        border-color: var(--ps-gray-300);
        box-shadow: none;
    }
}
