/* Partners 3.0 grid wrappers and DataTables presentation. */

.ss3-grid-shell {
    background: var(--ss3-color-surface);
    border: 1px solid var(--ss3-color-border);
    border-radius: var(--ss3-radius-lg);
    box-shadow: var(--ss3-shadow-sm);
    padding: var(--ss3-space-3);
    overflow: hidden;
}

.ss3-grid-shell + .ss3-grid-shell {
    margin-top: var(--ss3-space-3);
}

.ss3-grid-toolbar {
    justify-content: space-between;
    margin-bottom: var(--ss3-space-2);
}

.ss3-grid-mode-responsive {
    min-width: 0;
    overflow-x: visible;
}

.ss3-grid-mode-responsive table.dataTable,
.ss3-grid-shell table.dataTable {
    width: 100% !important;
}

/* Open-sided tables use one shared horizontal separator grammar. The default is
   white and unstriped; a supported striped modifier is opt-in. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable,
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > :is(thead, tbody, tfoot) {
    border-left: 0;
    border-right: 0;
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > :is(thead, tbody, tfoot) {
    background: var(--ss3-color-surface);
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > thead > tr > * {
    border-top: 0;
    border-bottom: 1px solid var(--ss3-color-border-strong);
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr > * {
    border-top: 0;
    border-bottom: 1px solid var(--ss3-color-divider-subtle);
}

/* Ordinary report resets must preserve vendor selection and nested SearchPanes.
   Pane row states have their own shared rules below. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable:not(.dtsp-searchPane table) > tbody > tr:not(.selected):not(.dtrg-group) > * {
    background-color: var(--ss3-color-surface);
    box-shadow: none !important;
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tfoot > tr > * {
    border-top: 1px solid var(--ss3-color-border-strong);
    border-bottom: 0;
}

.ss3-grid-mode-responsive table.dataTable thead th,
.ss3-grid-mode-responsive table.dataTable tbody td,
.ss3-grid-shell table.dataTable thead th,
.ss3-grid-shell table.dataTable tbody td {
    vertical-align: middle;
}

.ss3-grid-mode-responsive table.dataTable thead th,
.ss3-grid-mode-responsive table.dataTable tbody td,
.ss3-grid-shell table.dataTable thead th,
.ss3-grid-shell table.dataTable tbody td {
    padding-top: 0.45rem;
    padding-bottom: 0.45rem;
}

.ss3-grid-mode-responsive table.dataTable thead th,
.ss3-grid-shell table.dataTable thead th {
    font-size: var(--ss3-font-size-supporting);
    font-weight: var(--ss3-font-weight-strong);
    line-height: var(--ss3-line-height-tight);
}

.ss3-grid-mode-responsive table.dataTable tbody td,
.ss3-grid-shell table.dataTable tbody td {
    font-size: var(--ss3-font-size-body);
    font-weight: var(--ss3-font-weight-regular);
    line-height: var(--ss3-line-height-body);
}

/* Keep grid status pills on the cell text baseline. Only the color and inline
   padding belong to the pill; the cell owns the height. */
table.dataTable > tbody > tr:not(.child, .ss3-sliding-child) > :is(td, th) .ss3-status-pill:not([hidden]),
table.dataTable > tbody > tr.child .dtr-data .ss3-status-pill:not([hidden]) {
    display: inline;
    min-height: 0;
    padding: 0 var(--ss3-space-1);
    border: 0;
    font: inherit;
    vertical-align: baseline;
    -webkit-box-decoration-break: clone;
    box-decoration-break: clone;
}

.ss3-grid-mode-responsive .dt-container,
.ss3-grid-shell .dt-container {
    max-width: 100%;
    color: var(--ss3-color-text);
}

.ss3-grid-mode-responsive table.dataTable .button {
    margin: 0;
}

.ss3-grid-mode-spreadsheet {
    overflow-x: auto;
    max-width: 100%;
}

.ss3-row-actions {
    display: inline-flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: var(--ss3-space-1);
    white-space: nowrap;
}

.ss3-row-actions .button {
    margin: 0;
}

/* An opt-in identity column retains a useful reading width before native
   Responsive collapses secondary fields. Pair with the shared text wrapping
   utility when names or other record labels may contain long unbroken text. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > :is(thead, tbody, tfoot) > tr > .ss3-grid-identity-cell {
    min-width: 12rem;
}

/* A semantic action column owns right-edge alignment. Its row-action group fills
   the cell so the rightmost fixed icon canvas aligns with child-editor tools. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > :is(thead, tbody, tfoot) > tr > .ss3-grid-action-cell {
    padding-inline-end: 0;
    text-align: right;
}

/* The coordinator's single disclosure needs only its shared target width. */
.ss3-grid-mode-responsive table.dataTable .ss3-grid-controller-action-cell {
    width: var(--ss3-control-height);
    padding-inline: 0;
}

/* The row target occupies its cell's vertical space, not target + cell padding.
   Other cells retain normal text padding and may grow for multiline content. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr > .ss3-grid-action-cell {
    padding-block: 0;
    height: var(--ss3-control-height);
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr > .ss3-grid-action-cell > .ss3-row-actions {
    display: flex;
    width: 100%;
    justify-content: flex-end;
}

.ss3-grid-shell table.dataTable thead th:first-child,
.ss3-grid-shell table.dataTable tbody td:first-child,
.ss3-grid-mode-responsive table.dataTable thead th:first-child,
.ss3-grid-mode-responsive table.dataTable tbody td:first-child {
    text-align: left;
}

/* DataTables controls use one consistent label-and-control grammar. */
.ss3-grid-mode-responsive .dt-container .dt-layout-row,
.ss3-grid-shell .dt-container .dt-layout-row {
    margin: var(--ss3-space-2) 0;
}

.ss3-grid-mode-responsive .dt-container .dt-layout-row:first-child,
.ss3-grid-shell .dt-container .dt-layout-row:first-child {
    align-items: end;
    gap: var(--ss3-space-3);
}

.ss3-grid-mode-responsive .dt-length,
.ss3-grid-mode-responsive .dt-search,
.ss3-grid-shell .dt-length,
.ss3-grid-shell .dt-search {
    display: flex;
    align-items: center;
    gap: var(--ss3-space-2);
    margin: 0;
}

.ss3-grid-mode-responsive .dt-length label,
.ss3-grid-mode-responsive .dt-search label,
.ss3-grid-shell .dt-length label,
.ss3-grid-shell .dt-search label {
    margin: 0;
    color: var(--ss3-color-text);
    font-size: var(--ss3-font-size-label);
    font-weight: var(--ss3-font-weight-strong);
    line-height: var(--ss3-line-height-tight);
    white-space: nowrap;
}

.ss3-grid-mode-responsive .dt-length select,
.ss3-grid-shell .dt-length select {
    width: auto;
    min-width: 4rem;
    margin: 0;
}

.ss3-grid-mode-responsive .dt-search input,
.ss3-grid-shell .dt-search input {
    width: min(22rem, 34vw);
    min-width: 12rem;
    margin: 0;
}

.ss3-grid-mode-responsive .dt-info,
.ss3-grid-mode-responsive .dt-paging,
.ss3-grid-shell .dt-info,
.ss3-grid-shell .dt-paging {
    font-size: var(--ss3-font-size-supporting);
    line-height: var(--ss3-line-height-body);
}

/* A one-page filtered result does not need pagination or a repeated info line. */
.ss3-grid-mode-responsive .dt-container.ss3-dt-one-page .dt-info,
.ss3-grid-mode-responsive .dt-container.ss3-dt-one-page .dt-paging,
.ss3-grid-shell .dt-container.ss3-dt-one-page .dt-info,
.ss3-grid-shell .dt-container.ss3-dt-one-page .dt-paging {
    display: none;
}

.ss3-grid-mode-responsive .dt-container.ss3-dt-one-page > .dt-layout-row:nth-last-child(1 of .dt-layout-row):not(.dt-layout-table),
.ss3-grid-shell .dt-container.ss3-dt-one-page > .dt-layout-row:nth-last-child(1 of .dt-layout-row):not(.dt-layout-table) {
    display: none;
    min-height: 0;
    margin-top: 0;
    margin-bottom: 0;
}

/* White, unstriped rows are the shared default. Alternating shading is an
   explicit display-only variant and requires both the modifier and declared use. */
:is(.ss3-grid-mode-responsive.ss3-grid-striped, .ss3-grid-shell.ss3-grid-striped)[data-grid-display-only="true"] table.dataTable:not(.dtsp-searchPane table) > tbody > tr:nth-child(even):not(.selected):not(.ss3-sliding-child):not(.child) > *,
:is(.ss3-grid-mode-responsive, .ss3-grid-shell)[data-grid-display-only="true"] table.dataTable.ss3-grid-striped:not(.dtsp-searchPane table) > tbody > tr:nth-child(even):not(.selected):not(.ss3-sliding-child):not(.child) > * {
    background-color: var(--ss3-color-grid-stripe);
}

/* A subtle ordinary-row hover is shared default behavior, independent of vendor
   hover/display classes. Child/Responsive detail rows and child editor contents
   retain their own surface and control states. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable:not(.dtsp-searchPane table) > tbody > tr:not(.selected):not(.ss3-sliding-child):not(.child):hover > * {
    background-color: var(--ss3-color-grid-hover);
    box-shadow: none !important;
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable.order-column:not(.dtsp-searchPane table) > tbody > tr:not(.selected) > :is(.sorting_1, .sorting_2, .sorting_3) {
    box-shadow: none !important;
}

@media screen and (max-width: 39.9375em) {
    .ss3-grid-shell {
        padding: var(--ss3-space-3);
    }

    .ss3-grid-mode-responsive .dt-container .dt-layout-row:first-child:not(.dt-layout-table),
    .ss3-grid-shell .dt-container .dt-layout-row:first-child:not(.dt-layout-table) {
        display: grid;
        grid-template-columns: auto minmax(0, 1fr);
        align-items: end;
        gap: var(--ss3-space-3);
    }

    .ss3-grid-mode-responsive .dt-container .dt-layout-row:first-child > .dt-layout-start,
    .ss3-grid-shell .dt-container .dt-layout-row:first-child > .dt-layout-start {
        order: 1;
        justify-self: start;
        min-width: 0;
    }

    .ss3-grid-mode-responsive .dt-container .dt-layout-row:first-child > .dt-layout-end,
    .ss3-grid-shell .dt-container .dt-layout-row:first-child > .dt-layout-end {
        order: 2;
        justify-self: stretch;
        min-width: 0;
    }

    .ss3-grid-mode-responsive .dt-length,
    .ss3-grid-mode-responsive .dt-search,
    .ss3-grid-shell .dt-length,
    .ss3-grid-shell .dt-search {
        display: grid;
        grid-template-columns: minmax(0, 1fr);
        align-items: end;
        gap: var(--ss3-space-1);
        text-align: left;
    }

    .ss3-grid-mode-responsive .dt-length label,
    .ss3-grid-mode-responsive .dt-search label,
    .ss3-grid-shell .dt-length label,
    .ss3-grid-shell .dt-search label {
        justify-self: start;
        text-align: left;
    }

    .ss3-grid-mode-responsive .dt-search input,
    .ss3-grid-shell .dt-search input {
        width: 100%;
        min-width: 0;
    }
}

/* A shared caption owns its content spacing. The vendor table-layout row must
   not add another margin to semantic headings or the following result group. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dt-layout-table:has(> .dt-layout-cell > table > caption.ss3-grid-caption) {
    margin-block: 0;
}

/* ServiceSoftware caption: collection actions, filters, one global Search, and an optional Create target. */
table.dataTable > caption.ss3-grid-caption {
    /* Controls wrap within the table; they must not impose its intrinsic width. */
    contain: inline-size;
    caption-side: top;
    padding: 0 0 var(--ss3-space-3);
    text-align: left;
    font-weight: normal;
    white-space: normal;
}

.ss3-grid-caption [hidden] {
    display: none !important;
}

.ss3-grid-caption-controls {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    column-gap: var(--ss3-space-3);
    row-gap: var(--ss3-space-3);
}

.ss3-grid-caption-actions {
    display: flex;
    flex: 1 1 0;
    flex-wrap: wrap;
    align-items: center;
    column-gap: var(--ss3-space-4);
    row-gap: var(--ss3-space-3);
    min-width: 0;
    max-width: 100%;
}

.ss3-grid-caption-command-group {
    display: inline-flex;
    flex-wrap: wrap;
    max-inline-size: 100%;
    align-items: center;
    column-gap: var(--ss3-space-3);
    row-gap: var(--ss3-space-3);
    min-width: 0;
    white-space: nowrap;
}

.ss3-grid-caption-filter-group {
    display: inline-flex;
    flex: 0 1 max-content;
    flex-wrap: wrap;
    align-items: center;
    inline-size: max-content;
    max-inline-size: 100%;
    column-gap: var(--ss3-space-2);
    row-gap: var(--ss3-space-3);
    min-width: 0;
}

.ss3-grid-caption-command-group:not(:has(> .ss3-grid-caption-action:not([hidden]))),
.ss3-grid-caption-filter-group:not(:has(> .ss3-grid-caption-filter:not([hidden]))) {
    display: none;
}

.ss3-grid-caption .ss3-grid-caption-action[data-label="true"] {
    padding-block: 0;
    padding-inline-end: 0;
    border: 0;
}

.ss3-grid-caption-command-group > .ss3-grid-caption-action[data-label="true"]:nth-child(1 of :not([hidden])) {
    padding-inline-start: 0;
}

/* Geometry comes from ss3-icon-action: 24px glyph in a 40px target.
   Keep the first glyph at the content edge; measure gaps between whole targets. */
.ss3-grid-caption-command-group > .ss3-grid-caption-action:not([data-label="true"]):nth-child(1 of :not([hidden])) {
    margin-inline-start: calc((1.5rem - var(--ss3-control-height)) / 2);
}

.ss3-grid-caption-filter {
    display: inline-flex;
    align-items: center;
    min-width: min(11rem, 100%);
    margin: 0;
}

.ss3-grid-caption-filter select {
    width: auto;
    min-width: 11rem;
    margin: 0;
}

/* A visible filter caption belongs to its control. Separate labelled units
   from adjacent filters with the shared column gap; keep label/control close. */
.ss3-grid-caption-filter-group:has(> .ss3-grid-caption-filter[data-label="true"]) {
    column-gap: var(--ss3-gap-column);
}

.ss3-grid-caption-filter[data-label="true"] {
    gap: var(--ss3-gap-label);
}

.ss3-grid-caption-filter :is(input, select) {
    margin-bottom: 0;
}

/* Compact numeric filters compose with selects without shrinking a whole group
   beside commands into two misaligned rows. This is a shared caption variant. */
.ss3-grid-caption-filter-group:has(> .ss3-grid-caption-filter[data-control="number"]) {
    flex-basis: 18.5rem;
    inline-size: 18.5rem;
    min-inline-size: min(18.5rem, 100%);
}

.ss3-grid-caption-filter-group:has(> .ss3-grid-caption-filter[data-control="number"]) > .ss3-grid-caption-filter:not([data-control="number"]) {
    flex: 1 1 0;
    min-width: 0;
    width: auto;
}

.ss3-grid-caption-filter-group:has(> .ss3-grid-caption-filter[data-control="number"]) select {
    width: 100%;
    min-width: 0;
}

.ss3-grid-caption-filter-group > .ss3-grid-caption-filter[data-control="number"] {
    flex: 0 0 auto;
    width: auto;
    min-width: 0;
    white-space: nowrap;
}

.ss3-grid-caption-filter[data-control="number"] input[type="number"] {
    width: 4rem;
    min-width: 0;
    height: var(--ss3-control-height);
    margin: 0;
}

.ss3-grid-caption-search {
    flex: 0 1 20rem;
    min-width: 0;
    margin: 0 0 0 auto;
}

.ss3-grid-caption-search input {
    width: 100%;
    min-width: 0;
    margin: 0;
}

.ss3-grid-caption-target {
    width: 100%;
    min-width: 0;
    margin-top: var(--ss3-space-3);
}

.ss3-grid-caption [data-grid-action][aria-disabled="true"] {
    opacity: 0.25;
    cursor: not-allowed;
}

/* A supported shared caption retains actions when its business collection is empty.
   Ordinary tables keep their native emptyTable message. A no-match result still
   renders the ordinary table context; the table layout row is never a footer. */
/* An empty collection has no table body following its caption. Its peer section
   owns the next boundary gap; retain no caption-to-body allowance. */
table.dataTable.ss3-dt-empty-collection > caption.ss3-grid-caption {
    padding-bottom: 0;
}

table.dataTable.ss3-dt-empty-collection > thead,
table.dataTable.ss3-dt-empty-collection > tbody {
    display: none;
}

.dt-container.ss3-dt-empty-collection > .dt-layout-row:last-child:not(.dt-layout-table) {
    display: none;
}

@media screen and (max-width: 39.9375em) {
    .ss3-grid-caption-actions {
        flex: 1 1 100%;
        width: 100%;
    }

    .ss3-grid-caption-filter-group {
        flex: 1 1 12rem;
        inline-size: auto;
    }

    .ss3-grid-caption-search {
        flex-basis: 100%;
        margin-left: 0;
    }

    .ss3-grid-caption-filter {
        flex: 1 1 12rem;
        width: 100%;
    }

    .ss3-grid-caption-filter select {
        width: 100%;
        min-width: 0;
    }
}

/* Compact DataTables Create and child-editor headers use the section composition,
   with the caption at the start and simple icon tools at the end. */
.ss3-grid-caption [data-grid-editor] > header,
.ss3-sliding-child-target [data-grid-editor] > header {
    flex-wrap: nowrap;
    justify-content: space-between;
    align-items: center;
}

.ss3-grid-caption [data-grid-editor] > header > :is(h2, h3),
.ss3-sliding-child-target [data-grid-editor] > header > :is(h2, h3) {
    flex: 1 1 auto;
    min-width: 0;
}


.ss3-grid-caption :is(.ss3-section, .ss3-card)[data-grid-editor] > header > .ss3-action-bar,
.ss3-sliding-child-target :is(.ss3-section, .ss3-card)[data-grid-editor] > header > .ss3-action-bar {
    justify-content: flex-end;
    align-items: center;
    flex-wrap: nowrap;
    flex-shrink: 0;
    min-height: 1.5rem;
    margin-inline-start: auto;
    margin-inline-end: 0;
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) [data-sliding-child-toggle] > i {
    font-size: 1.5rem;
}

/* Structural styling for the reusable sliding target. Normal rows retain their
   shared horizontal separators. An expanded parent transfers its ending separator
   to the attached child so one logical record has exactly one ending boundary. */
[data-sliding-child-icon-show][hidden],
[data-sliding-child-icon-hide][hidden],
.ss3-sliding-child-icon[hidden],
.ss3-sliding-child-target .ss3-sliding-child-collapse[hidden] {
    display: none !important;
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr:is(.ss3-sliding-child-parent, .dtr-expanded) > * {
    border-bottom: 0;
    box-shadow: none;
}

/* Paint the parent rail inside its existing cell so collapsed table borders do
   not offset it from the child rail or alter column widths. The leading-column
   marker follows visibility; generated table-row content is not used. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr.ss3-sliding-child-parent > .ss3-grid-leading-column {
    background-image: linear-gradient(var(--ss3-color-structure), var(--ss3-color-structure));
    background-size: 3px 100%;
    background-repeat: no-repeat;
    background-position: left top;
}
/* A dedicated first-column Responsive control is physically before the leading
   business field; in that layout it owns the rail instead. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable.dtr-column.collapsed > tbody > tr.ss3-sliding-child-parent:has(> .dtr-control:first-child) > .ss3-grid-leading-column {
    background-image: none;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable.dtr-column.collapsed > tbody > tr.ss3-sliding-child-parent > .dtr-control:first-child {
    background-image: linear-gradient(var(--ss3-color-structure), var(--ss3-color-structure));
    background-size: 3px 100%;
    background-repeat: no-repeat;
    background-position: left top;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell):dir(rtl) table.dataTable > tbody > tr.ss3-sliding-child-parent > :is(.ss3-grid-leading-column, .dtr-control:first-child) {
    background-position: right top;
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr.ss3-sliding-child > td.ss3-sliding-child {
    padding: 0 !important;
    border: 0;
    background: var(--ss3-color-surface);
    box-shadow: none !important;
    white-space: normal;
}

/* DataTables Responsive disclosure is a separate interaction but uses the same
   one-boundary-per-record rule. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr.child > td {
    border-top: 0;
    border-bottom: 1px solid var(--ss3-color-divider-subtle);
    background: var(--ss3-color-surface);
}

/* Separate the complete expanded record from a following parent while retaining
   one child-owned separator. This more-specific rule follows the structural reset. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr.ss3-sliding-child:has(+ tr) > td.ss3-sliding-child {
    padding-bottom: var(--ss3-space-2) !important;
}

/* Child editors use the available row width without widening the parent table. */
.ss3-sliding-child-target > :is(.ss3-section, .ss3-card)[data-layout="section"] {
    contain: inline-size;
}

.ss3-sliding-child-target {
    display: none;
    width: 100%;
    min-width: 0;
    margin: 0;
    padding: var(--ss3-space-2) 0 var(--ss3-space-4);
    padding-inline-start: 6px;
    border-top: 0;
    border-inline-start: 3px solid var(--ss3-color-structure);
    border-bottom: 2px solid var(--ss3-color-structure);
    background: var(--ss3-color-surface);
}

.ss3-sliding-child-target.ss3-sliding-child-parent-hidden {
    border-top: 1px solid var(--ss3-color-divider-subtle);
}

/* Separate business objects inside the same record without giving each one an
   outer record boundary. Keep the right edge aligned with parent-row actions. */
.ss3-sliding-child-target > [data-grid-component-group] + [data-grid-component-group],
.ss3-sliding-child-target [data-grid-component-group] > [data-grid-editor] + [data-grid-editor] {
    margin-block-start: var(--ss3-space-6);
}

/* Draft state supplements the existing disclosure control without changing business
   data or row geometry. */
[data-sliding-child-toggle],
[data-sliding-child-collapse] {
    position: relative;
}

.ss3-grid-dirty-marker {
    position: absolute;
    top: 0.125rem;
    right: 0.125rem;
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 50%;
    background: var(--ss3-color-warning-fill);
    box-shadow: 0 0 0 1px var(--ss3-color-warning-contrast),
                0 0 0 2px var(--ss3-color-surface);
    pointer-events: none;
}

.ss3-grid-dirty-marker[hidden] {
    display: none;
}

/* A pending write blocks table operations that would tear down or replace the
   owning record while leaving independent child editors usable. */
[data-grid-write-pending="true"] .ss3-grid-caption-controls,
[data-grid-write-pending="true"] .dt-paging,
[data-grid-write-pending="true"] table.dataTable > thead {
    pointer-events: none;
}

[data-grid-write-pending="true"] .ss3-grid-caption-controls,
[data-grid-write-pending="true"] .dt-paging,
[data-grid-write-pending="true"] table.dataTable > thead {
    opacity: 0.65;
}

/* Font Awesome hidden-column controls remain distinct from sliding-child double chevrons. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable:is(.dtr-inline.collapsed, .dtr-column) > tbody > tr > :is(td, th).dtr-control::before {
    content: "\f150";
    font-family: var(--ss3-font-awesome);
    font-style: normal;
    font-weight: 400;
    font-size: 1rem;
    line-height: 1;
    display: inline-block;
    width: 1em;
    height: 1em;
    border: 0;
    border-radius: 0;
    background: none;
    box-shadow: none;
    box-sizing: content-box;
    text-align: center;
    text-indent: 0;
    vertical-align: middle;
    color: var(--ss3-color-action);
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable:is(.dtr-inline.collapsed, .dtr-column) > tbody > tr.dtr-expanded > :is(td, th).dtr-control::before {
    content: "\f151";
}


/* Brief acknowledgement of an item added to a collection; lifetime is consumer-owned. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) tr[data-ss3-row-added="true"] > td {
    background-color: var(--ss3-color-action-soft);
}

/* Keep a business date together while ordinary identity/context text can wrap. */
.ss3-date-value {
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}


/* Native SearchPanes row states also cover direct DataTables integrations which
   do not receive the adapter's ss3-search-panes class. Selection, pointer hover
   and keyboard focus are independent, with no geometry changes between states. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane {
    --ss3-pane-selected-bg: #D9EEE8;
    --ss3-pane-selected-hover-bg: #C7E5DD;
    --ss3-pane-selected-marker: #075C58;
    --ss3-pane-selected-text: #0F172A;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr > * {
    color: var(--ss3-color-text);
    background-color: var(--ss3-color-surface);
    box-shadow: none !important;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr:hover > * {
    background-color: color-mix(in srgb, var(--ss3-color-text) 5%, var(--ss3-color-surface));
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr.selected > * {
    color: var(--ss3-pane-selected-text);
    background-color: var(--ss3-pane-selected-bg);
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr.selected:hover > * {
    background-color: var(--ss3-pane-selected-hover-bg);
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr .dtsp-name {
    color: var(--ss3-color-text) !important;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr .dtsp-pill {
    /* Counts are supporting text, not badges; keep every row state transparent. */
    background: transparent !important;
    border: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
    min-width: 0 !important;
    color: var(--ss3-color-text-muted) !important;
    font-size: 0.9rem;
    font-variant-numeric: tabular-nums;
    text-align: right !important;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr.selected :is(.dtsp-name, .dtsp-pill) {
    color: var(--ss3-pane-selected-text) !important;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr.selected > :first-child {
    /* An inset painted rail never changes column widths or the label position. */
    box-shadow: inset 3px 0 0 var(--ss3-pane-selected-marker) !important;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr.selected > :first-child:dir(rtl) {
    box-shadow: inset -3px 0 0 var(--ss3-pane-selected-marker) !important;
}
/* Keep label, count and selection mark in stable columns for every option.
   The trailing mark owns a reserved slot, even while it is not selected.
   Outrank the vendor's four-class flex/start rule so centering actually applies. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane .dt-scroll-body table.dataTable .dtsp-nameCont {
    display: grid;
    grid-template-columns: minmax(0, 1fr) max-content 1rem;
    align-items: center;
    column-gap: 0.5rem;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane .dtsp-nameCont > .dtsp-name {
    grid-column: 1;
    min-width: 0;
    width: auto !important;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane .dtsp-nameCont > .dtsp-pill {
    grid-column: 2;
    width: auto !important;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane .dtsp-nameCont::after {
    content: "\f00c";
    grid-column: 3;
    font-family: var(--ss3-font-awesome);
    font-weight: 900;
    font-size: 0.75rem;
    line-height: 1;
    width: 1rem;
    text-align: center;
    color: var(--ss3-pane-selected-marker);
    visibility: hidden;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane tr.selected .dtsp-nameCont::after {
    visibility: visible;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr:focus {
    /* Paint one deliberate blue ring on the cell, not a second browser row ring. */
    outline: none;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr:focus-visible > *,
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dtsp-searchPane table.dataTable > tbody > tr > :is(.focus, :focus-visible) {
    outline: 2px solid var(--ss3-color-action);
    outline-offset: -2px;
}

/* SearchPanes composition only.30-components owns the adopted action targets and
   glyphs;40-forms owns fields. Vendor filtering, scrolling and collapse stay native. */
.ss3-search-panes.dtsp-panesContainer {
    --ss3-grid-pane-header-bg: var(--ss3-theme-form-action-bar);
    --ss3-grid-pane-header-text: var(--ss3-theme-form-action-bar-text);
    padding: 0 0 var(--ss3-gap-group);
    margin-block: 0;
    text-align: left;
}
/* End the complete filter surface before the collection caption.
   The divider belongs to this surface, so hiding panes removes it and its space. */
.ss3-search-panes.dtsp-panesContainer::after {
    content: "";
    display: block;
    border-bottom: 1px solid var(--ss3-color-divider-subtle);
    margin-block-start: var(--ss3-space-6);
}
/* Keep the containing layout row's margin stable while its child animates or is
   hidden. A visibility-dependent margin produced an 8px reversal at each end. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dt-container .dt-layout-row:has(> .dt-layout-cell > :is(.ss3-search-panes, .ss3-grid-controller-panes)) {
    margin-block-end: 0;
}
.ss3-search-panes .dtsp-titleRow {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--ss3-space-3);
}
.ss3-search-panes.dtsp-panesContainer .dtsp-title {
    float: none;
    padding: 0;
    margin-inline-end: auto;
    color: var(--ss3-color-text);
    font-size: var(--ss3-font-size-label);
    font-weight: var(--ss3-font-weight-strong);
}
.ss3-search-panes.dtsp-panesContainer button.ss3-icon-action {
    float: none;
    opacity: 1;
    transform: none;
    vertical-align: middle;
}
.ss3-search-panes.dtsp-panesContainer button.ss3-icon-action:disabled {
    opacity: 0.55;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPanes {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
    width: 100%;
    gap: var(--ss3-gap-column);
    justify-content: flex-start;
    margin-block-start: var(--ss3-space-3);
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPanes .dtsp-searchPane {
    margin-block-start: 0 !important;
    flex: 1 1 18rem;
    min-width: 0 !important;
    max-width: 100% !important;
    width: auto !important;
}
.ss3-search-panes .dtsp-topRow.dtsp-subRowsContainer {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;
    gap: var(--ss3-space-1);
    padding: 0;
    margin-block-end: var(--ss3-space-1);
}
.ss3-search-panes .dtsp-topRow :is(.dtsp-subRow1, .dtsp-subRow2) {
    width: auto;
    flex: 1 1 0;
    min-width: 0;
    margin: 0;
}
.ss3-search-panes .dtsp-topRow .dtsp-subRow2 { flex: 0 0 auto; margin-inline-start: auto; }
.ss3-search-panes .dtsp-topRow .dtsp-searchCont {
    display: flex;
    align-items: center;
    gap: var(--ss3-space-2);
}
.ss3-search-panes .dtsp-topRow .dtsp-searchCont input.dtsp-search {
    flex: 1 1 0;
    width: 100%;
    min-width: 0;
    margin: 0;
}
.ss3-search-panes .dtsp-topRow .dtsp-buttonGroup {
    display: flex;
    justify-content: flex-end;
    gap: var(--ss3-space-1);
    margin: 0;
}
.ss3-search-panes .dtsp-topRow.dtsp-bordered {
    border-color: var(--ss3-color-divider-subtle);
}
@media screen and (max-width: 39.9375em) {
    .ss3-search-panes .dtsp-titleRow .dtsp-title { flex-basis: 100%; }
    .ss3-search-panes.dtsp-panesContainer .dtsp-searchPanes .dtsp-searchPane { flex-basis: auto; width: 100% !important; }
    .ss3-search-panes.dtsp-panesContainer .dtsp-searchPanes { flex-wrap: nowrap; }
}

/* The rich-filter surface spans the full DataTables layout row on phone. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dt-layout-row > .dt-layout-cell:has(> .ss3-search-panes) {
    grid-column: 1 / -1;
    min-width: 0;
}
.ss3-search-panes .dtsp-topRow .dtsp-subRow1 button.dtsp-searchIcon {
    position: static;
    flex: 0 0 auto;
}

/* The first visible business column defaults to left alignment for every type.
   Shared grid initialization maintains the marker across native visibility changes. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > :is(thead, tbody, tfoot) > tr > .ss3-grid-leading-column {
    text-align: left;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > :is(thead, tfoot) > tr > .ss3-grid-leading-column > :is(.dt-column-header, .dt-column-footer) {
    flex-direction: row;
}

/* Controller composition adds no nested card treatment or horizontal padding.
   Sections, forms and icon actions retain their existing shared owners. */
.ss3-grid-controller-panel,
.ss3-grid-controller-panes,
.ss3-grid-controller-summary,
.ss3-grid-controller-status,
.ss3-grid-controller-chooser {
    min-width: 0;
    max-width: 100%;
    color: var(--ss3-color-text);
}

.ss3-grid-controller-panel,
.ss3-grid-controller-panes,
.ss3-grid-controller-chooser {
    margin-block: var(--ss3-space-2);
}

.ss3-grid-controller-panes {
    display: block;
    width: 100%;
    margin-block-end: 0;
}

:is(.ss3-grid-mode-responsive, .ss3-grid-shell) .dt-container .dt-layout-cell > .ss3-grid-controller-panes {
    margin-block-end: 0 !important;
}

.ss3-grid-controller-panes > .dtsp-panesContainer {
    flex: 1 1 100%;
    min-width: 0;
    margin-block: 0;
}

.ss3-grid-controller-summary,
.ss3-grid-controller-status {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--ss3-space-2);
    margin-block: var(--ss3-space-2);
    overflow-wrap: anywhere;
    font-size: var(--ss3-font-size-supporting);
    line-height: var(--ss3-line-height-body);
}

.ss3-grid-controller-summary > p,
.ss3-grid-controller-status > p {
    margin: 0;
}

.ss3-grid-controller-chooser {
    overflow-x: auto;
    overscroll-behavior-inline: contain;
}

.ss3-grid-controller-editor-header,
.ss3-grid-caption [data-grid-editor] > header.ss3-grid-controller-editor-header,
.ss3-sliding-child-target [data-grid-editor] > header.ss3-grid-controller-editor-header {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    column-gap: var(--ss3-space-2);
    row-gap: var(--ss3-space-2);
    min-width: 0;
}

.ss3-grid-controller-editor-title {
    flex: 1 1 12rem;
    min-width: 0;
    margin: 0;
    overflow-wrap: anywhere;
}

.ss3-grid-controller-editor-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: var(--ss3-space-1);
    min-width: 0;
    margin-inline-start: auto;
}

.ss3-grid-caption :is(.ss3-section, .ss3-card)[data-grid-editor] > header.ss3-grid-controller-editor-header > .ss3-grid-controller-editor-actions,
.ss3-sliding-child-target :is(.ss3-section, .ss3-card)[data-grid-editor] > header.ss3-grid-controller-editor-header > .ss3-grid-controller-editor-actions {
    flex-wrap: wrap;
}

.ss3-grid-controller-summary:empty,
.ss3-grid-controller-status:empty,
.ss3-grid-controller-panel[hidden],
.ss3-grid-controller-panes[hidden],
.ss3-grid-controller-summary[hidden],
.ss3-grid-controller-status[hidden],
.ss3-grid-controller-chooser[hidden] {
    display: none !important;
}


/* Controller utilities use the shared action and section geometry. */
.dt-layout-row > .dt-layout-cell:has(> .ss3-grid-controller-panes) {
    width: 100%; grid-column: 1 / -1; min-width: 0;
}
.ss3-grid-controller-panes > .dtsp-panesContainer { width: 100%; }
.ss3-grid-controller-chooser {
    margin-block: var(--ss3-gap-group);
    border: 0;
    border-bottom: 1px solid var(--ss3-color-structure);
    padding-block: 0;
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header {
    display: flex;
    align-items: center;
    min-height: calc(var(--ss3-control-height) + var(--ss3-space-2));
    justify-content: space-between;
    gap: var(--ss3-space-2);
    margin: 0;
    padding: var(--ss3-space-1) var(--ss3-space-2);
    background: var(--ss3-theme-form-action-bar);
    color: var(--ss3-theme-form-action-bar-text);
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header > h3 {
    margin: 0;
    color: inherit;
    flex: 1 1 auto;
    font-size: 1rem;
    font-weight: var(--ss3-font-weight-strong);
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header > .ss3-action-bar {
    flex: 0 0 auto;
    flex-wrap: nowrap;
    margin: 0;
    padding: 0;
    gap: var(--ss3-space-2);
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header > .ss3-action-bar > .ss3-icon-action {
    color: var(--ss3-theme-form-action-bar-text);
    background: transparent;
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header > .ss3-action-bar > .ss3-icon-action::before {
    background: transparent;
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header > .ss3-action-bar > .ss3-icon-action:focus:not(:hover)::before {
    background: transparent;
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header > .ss3-action-bar > .ss3-icon-action:hover:not(:disabled)::before {
    background: color-mix(in srgb, var(--ss3-theme-form-action-bar-text) 16%, transparent);
}
.ss3-grid-caption .ss3-grid-controller-chooser > header.ss3-section-header > .ss3-action-bar > .ss3-icon-action:focus-visible::before {
    outline: 2px solid var(--ss3-theme-form-action-bar-text);
    outline-offset: -2px;
}
.ss3-grid-controller-choice-table { width: 100%; border-collapse: collapse; margin: 0; }
.ss3-grid-caption .ss3-grid-controller-choice-table,
.ss3-grid-caption .ss3-grid-controller-choice-table > :is(thead,tbody) {
    border: 0;
}
.ss3-grid-controller-choice-table :is(th,td) {
    padding: var(--ss3-space-2);
    text-align: center;
    border-bottom: 1px solid var(--ss3-color-divider-subtle);
}
.ss3-grid-controller-choice-table :is(th,td):first-child {
    text-align: left;
    padding-inline-start: var(--ss3-space-2);
    font-weight: normal;
}
.ss3-grid-controller-choice-table thead th { font-weight: var(--ss3-font-weight-strong); }
.ss3-grid-controller-choice-table > :is(thead,tbody) > tr:nth-child(n),
.ss3-grid-controller-choice-table > thead > tr > th { background: var(--ss3-color-surface); }
.ss3-grid-controller-choice-table > tbody > tr:last-child > * { border-bottom: 0; }
.ss3-grid-caption .ss3-grid-controller-choice-table > thead > tr > th { text-align: center; }
.ss3-grid-caption .ss3-grid-controller-choice-table > :is(thead,tbody) > tr > :first-child {
    text-align: left;
    padding-inline-start: var(--ss3-space-2);
}
.ss3-grid-caption .ss3-grid-controller-choice-table input[type="checkbox"] { margin: 0; vertical-align: middle; }

/* Native pane search uses the column name as its placeholder; no alternate label or reveal state. */
.ss3-search-panes .dtsp-topRow.dtsp-bordered .dtsp-buttonGroup > :not(.dtsp-collapseButton),
.ss3-search-panes .dtsp-topRow.dtsp-bordered .dtsp-searchButtonCont { display: none; }
/* A compact navy header joins the pane name and disclosure in both states.
   Its theme companion color is distinct from the white option/table surfaces. */
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dtsp-topRow {
    border: 0 !important;
    border-radius: 0;
    padding: var(--ss3-space-1) var(--ss3-space-2);
    background: var(--ss3-grid-pane-header-bg);
    color: var(--ss3-grid-pane-header-text);
    margin-block-end: 0;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dt-container {
    border-top: 0 !important;
    border-bottom: 0 !important;
    border-radius: 0;
}
/* Pane results have one column. Let it follow the container immediately rather
   than retaining DataTables' previous pixel width until its resize callback. */
.ss3-search-panes .dt-scroll-body table.dataTable > colgroup > col {
    width: auto !important;
}
/* Each option owns its bottom rule, including the final option. Equal geometry lets
   native Scroller measure its virtual height without a trailing spacer strip. */
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dt-scroll-body table.dataTable,
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dt-scroll-body tbody {
    border-block: 0;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dt-scroll-body tbody > tr > td {
    line-height: 1.5rem;
    border-bottom: 1px solid var(--ss3-color-divider-subtle);
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane button.dtsp-collapseButton { transform: none !important; }

/* Compact pane utilities are distinct from the collection toolbar. */
.ss3-search-panes.dtsp-panesContainer .dtsp-topRow button.ss3-icon-action {
    width: 1.5rem; height: 1.5rem; min-width: 1.5rem; min-height: 1.5rem;
    padding: 0; margin: 0; border: 0; gap: 0;
    color: var(--ss3-grid-pane-header-text);
    background: transparent;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-topRow button.ss3-icon-action:hover:not(:disabled) {
    color: var(--ss3-grid-pane-header-text);
    background: color-mix(in srgb, var(--ss3-grid-pane-header-text) 16%, transparent);
}
.ss3-search-panes.dtsp-panesContainer .dtsp-topRow button.ss3-icon-action:focus-visible {
    outline: 2px solid var(--ss3-grid-pane-header-text);
    outline-offset: 1px;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-topRow button.ss3-icon-action > i {
    font-size: 0.875rem; width: 0.875rem; height: 0.875rem; line-height: 1;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dtsp-topRow input.dtsp-search {
    display: block; height: 1.75rem !important; min-height: 1.75rem !important;
    border: 0 !important; border-radius: 0; background: transparent !important; box-shadow: none !important;
    padding: 0 0.25rem; margin: 0; font-size: 0.875rem !important; color: var(--ss3-grid-pane-header-text) !important;
    /* Match the option's 1px frame + 10px cell inset: header 8px + input 3px.
       Override the inherited form-field inset without moving the option text. */
    padding-inline-start: 3px !important;
    caret-color: var(--ss3-grid-pane-header-text);
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dtsp-topRow input.dtsp-search::placeholder {
    color: var(--ss3-grid-pane-header-text); opacity: 1;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dtsp-topRow input.dtsp-search:focus {
    background: #FFFFFF !important;
    color: #0F172A !important;
    caret-color: #0F172A;
    outline: 2px solid var(--ss3-color-action); outline-offset: -2px;
}
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dtsp-topRow input.dtsp-search:focus::placeholder {
    color: #475569;
}

/* Native collapsed-header hover must retain navy contrast; vendor gray hover
   was overriding the ordinary header background while leaving white text. */
.ss3-search-panes.dtsp-panesContainer .dtsp-searchPane .dtsp-topRow:hover {
    background: color-mix(in srgb, var(--ss3-grid-pane-header-bg) 86%, var(--ss3-grid-pane-header-text)) !important;
    color: var(--ss3-grid-pane-header-text);
}

/* The expanded parent paints the rail inside the cell. Include its width
   before the compact padding shared with the child. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable > tbody > tr.ss3-sliding-child-parent > .ss3-grid-leading-column,
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable.dtr-inline.collapsed > tbody > tr.ss3-sliding-child-parent > .ss3-grid-leading-column.dtr-control {
    padding-inline-start: calc(3px + 6px);
}

/* Keep the inline Responsive control available without preceding the name.
   Its cell remains the disclosure target. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) table.dataTable.dtr-inline.collapsed > tbody > tr.ss3-sliding-child-parent > .ss3-grid-leading-column.dtr-control::before {
    float: inline-end;
    margin-inline: var(--ss3-space-2) 0;
    line-height: inherit;
    height: auto;
}

/* Native checkbox geometry comes from40-forms. Table cells center its22px box
   without a40px form-label wrapper or an inline baseline that enlarges the row. */
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) :is(table.dataTable, .ss3-grid-controller-choice-table) > :is(thead, tbody, tfoot) > tr > :is(th, td):has(> input[type="checkbox"]:only-child) {
    vertical-align: middle;
    padding-block: 0;
}
:is(.ss3-grid-mode-responsive, .ss3-grid-shell) :is(table.dataTable, .ss3-grid-controller-choice-table) > :is(thead, tbody, tfoot) > tr > :is(th, td) > input[type="checkbox"]:only-child {
    display: grid;
    margin: 0 auto;
}

/* Refresh and Download share a fixed progress glyph slot so spinner swaps
   do not move commands or adjacent controls. */
.ss3-grid-caption :is(.ss3-grid-download-icon, .ss3-grid-refresh-icon) {
    display: inline-block;
    inline-size: 1em;
    block-size: 1em;
    line-height: 1;
    text-align: center;
    flex: 0 0 1em;
}
.ss3-grid-caption :is(.ss3-grid-command-message, .ss3-grid-download-limit) {
    width: 100%;
    grid-column: 1 / -1;
}
.ss3-grid-caption .ss3-grid-download-limit {
    margin-block: var(--ss3-space-2);
}

/* Active grid command progress stays green at full contrast while disabled
   to reject repeat clicks. Other disabled commands stay muted. */
.ss3-grid-caption .ss3-icon-action:is([data-grid-action^="download-"], [data-grid-action="refresh"])[aria-busy="true"] {
    opacity: 1;
}
.ss3-grid-caption [aria-busy="true"] > :is(.ss3-grid-download-icon, .ss3-grid-refresh-icon) {
    color: var(--ss3-color-success);
}
