/**
 * Limitless Order Builder — Frontend styles (UI redesign rebuild)
 *
 * ARCHITECTURE
 * The file is organized as strictly-ordered "layers". Native @layer is NOT
 * used deliberately: unlayered author CSS (the Divi theme + WooCommerce)
 * would beat every @layer-scoped rule regardless of specificity, so the
 * layer system is emulated with file order instead. Within this file the
 * order below is the only cascade mechanism — never rely on appending
 * override passes.
 *
 * SPECIFICITY FLOOR: every selector anchors on #lgsb-uploader (the ID, not
 * the class). Divi + WooCommerce style product pages with deep class chains
 * (.woocommerce div.product p, form.cart select, …) that beat class-only
 * plugin selectors; the ID anchor outranks all of them without !important.
 * New rules MUST use the #lgsb-uploader prefix.
 *
 *   1. TOKENS        — every design token (single source of truth)
 *   2. BASE          — scoped resets + typography defaults
 *   3. COMPONENTS    — buttons, cards, pills, inputs, alerts, skeleton, modal
 *   4. LAYOUT        — builder grid, dropzones, panels, sidebar, pricing
 *   5. STATES        — visibility matrix, dirty/locked/dragover/active
 *   6. RESPONSIVE    — container queries + mobile bar + reduced motion
 *   7. THEME-COMBAT  — the ONLY place !important is permitted; each rule
 *                      names the Divi/WooCommerce behavior it defeats
 *   8. CART/ORDER    — classes rendered outside #lgsb-uploader
 *
 * JS ↔ CSS NAMING CONTRACT (do not rename without updating gang-sheet.js):
 *   Root state classes on #lgsb-uploader:
 *     lgsb-jobs-on  lgsb-ws-open  lgsb-has-files  lgsb-order-dirty  lgsb-locked
 *     lgsb-choosing (entry-state layout chooser; template-rendered, JS-removed)
 *   Behavioral classes JS selects/toggles:
 *     lgsb-file-row  lgsb-file-blocked  lgsb-qty-input  lgsb-qty-step
 *     lgsb-qty-control  lgsb-dim-input  lgsb-dim-w  lgsb-dim-h  lgsb-dim-step
 *     lgsb-dim-control  lgsb-lock-btn  lgsb-locked  lgsb-unlocked
 *     lgsb-remove-btn  lgsb-move  lgsb-move-select  lgsb-actions-cell
 *     lgsb-status-badge  lgsb-status-review  lgsb-dpi-pill  lgsb-dpi-quality
 *     lgsb-row-price  lgsb-job-card  lgsb-job-card-ungrouped  lgsb-job-name
 *     lgsb-job-drag  lgsb-job-settings-btn  lgsb-jobs-strip  lgsb-jobs-arrow
 *     lgsb-jobs-no-scroll  lgsb-jobs-head-text  lgsb-jobs-count  lgsb-jobs-seeall
 *     lgsb-jobs-add-btn  lgsb-strip-dragging
 *     lgsb-job-section  lgsb-job-ungrouped  lgsb-job-rows  lgsb-job-active
 *     lgsb-job-card-active  lgsb-job-dragging
 *     lgsb-jo-row  lgsb-jo-row-active  lgsb-jo-name  lgsb-jo-count  lgsb-jo-total
 *     lgsb-job-drop-before  lgsb-job-drop-after  lgsb-jc-*  lgsb-dragover
 *     lgsb-cart-pending  lgsb-add-to-cart-btn  lgsb-modal-*  lgsb-error-row
 *     lgsb-skel-card  lgsb-price-pending  lgsb-select-btn  lgsb-flash
 *     lgsb-name-wrap  lgsb-name-input  lgsb-name-state  lgsb-name-original
 *     lgsb-name-saving  lgsb-name-saved  lgsb-name-error
 *     lgsb-mode-chooser  lgsb-mode-option  lgsb-mode-pick
 *     lgsb-mode-quick-only  lgsb-mode-multi-only
 *     lgsb-designs-toolbar  lgsb-ws-header  lgsb-ws-actions
 *     lgsb-add-files-btn  lgsb-toolbar-bulk  (bulk bar host slots — the bar
 *     carries data-scope-group, resolved by bulkScopeRows())
 *   CSS custom properties written by injectCssVars() (admin settings):
 *     --lgsb-primary --lgsb-secondary --lgsb-card-bg --lgsb-light-bg
 *     --lgsb-divider --lgsb-muted --lgsb-btn-bg --lgsb-btn-text
 *     --lgsb-error --lgsb-success --lgsb-warning
 */

@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap');

/* =========================================================================
 * 1. TOKENS
 * Scoped to #lgsb-uploader (not :root) so nothing leaks into the theme.
 * Admin-overridable primitives keep their historical names — injectCssVars()
 * writes them as inline styles, which beat these stylesheet defaults.
 * ========================================================================= */
#lgsb-uploader {
    /* --- Admin-overridable primitives (names locked by JS contract) --- */
    --lgsb-primary:   #007D91;
    --lgsb-secondary: #000000;
    --lgsb-card-bg:   #ffffff;
    --lgsb-light-bg:  #F5F7F8;
    --lgsb-divider:   #E3E8EB;
    --lgsb-muted:     #6B7680;
    --lgsb-btn-bg:    #000000;
    --lgsb-btn-text:  #ffffff;
    --lgsb-error:     #B42318;
    --lgsb-success:   #007A41;
    --lgsb-warning:   #AD8629;

    /* --- Brand palette --- */
    --lgsb-teal:         var(--lgsb-primary);
    --lgsb-teal-soft:    #EBF6F8;
    --lgsb-teal-mid:     #8FC5CE; /* dividers on teal-soft surfaces (active job card) */
    --lgsb-teal-dark:    #055866;
    --lgsb-success-text: var(--lgsb-success);
    --lgsb-success-bg:   #D0EDDB;
    --lgsb-success-soft: #F0F7F3; /* clean status card background */
    --lgsb-success-border: #CBEDDC; /* clean status border + inner button */
    --lgsb-warning-text: var(--lgsb-warning);
    --lgsb-warning-bg:   #FFF4DA;
    --lgsb-warning-soft: #FDF8EC; /* job card "Needs Review" tint */
    --lgsb-error-text:   var(--lgsb-error);
    --lgsb-error-bg:     #FBEAE8;
    --lgsb-error-soft:   #FCF1F0; /* job card "Has Errors" tint */
    --lgsb-error-border: #EEB4AE;
    --lgsb-ink:          #111111;

    /* --- Neutrals --- */
    --lgsb-text:        #1F2933;
    --lgsb-text-muted:  var(--lgsb-muted);
    --lgsb-border:      var(--lgsb-divider);
    --lgsb-surface:     var(--lgsb-card-bg);
    --lgsb-surface-dim: var(--lgsb-light-bg);
    --lgsb-zone-bg:     #F2F2F2; /* grey backdrop behind the post-order zone */

    /* --- Typography --- */
    --lgsb-font-family: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --lgsb-font-display: 56px;
    --lgsb-font-title-1: 18px; /* section titles (v2.58.0: 20 → 18 per mockups) */
    --lgsb-font-title-2: 15px;
    --lgsb-font-title-3: 14px;
    --lgsb-font-body:    13px;
    --lgsb-font-body-sm: 12px;
    --lgsb-font-caption: 12px; /* helper/caption text — MUST equal body-sm so all subtext matches */
    --lgsb-font-label:   10px;
    --lgsb-font-stat:    23px;
    --lgsb-font-button:  13px;
    --lgsb-font-pill:    11px;
    --lgsb-font-summary-title: 26px; /* ORDER SUMMARY header — deliberately larger than title-1 */
    /* Weights reduced one step across the board (v2.19.3) to match the mocks —
       "bold" surfaces render at 600, "semibold" at 500. */
    --lgsb-weight-regular:  400;
    --lgsb-weight-medium:   500;
    --lgsb-weight-semibold: 500;
    --lgsb-weight-bold:     600;
    --lgsb-leading-tight: 1.2;
    --lgsb-leading-body:  1.5;
    --lgsb-tracking-label:  .06em;
    --lgsb-tracking-button: .06em;

    /* --- Spacing scale (values tuned in the design playground, v2.18.4 —
       intentionally non-linear: 6 is tighter than 5 per approved design) --- */
    --lgsb-space-1: 4px;
    --lgsb-space-2: 4px;
    --lgsb-space-3: 9px;
    --lgsb-space-4: 12px;
    --lgsb-space-5: 20px;
    --lgsb-space-6: 13px;
    --lgsb-space-7: 26px;
    --lgsb-space-8: 40px;
    --lgsb-card-padding: 20px; /* inner padding of sidebar/pricing cards */

    /* --- Radii / borders / shadows --- */
    --lgsb-radius-sm:     7px;   /* micro controls (pills' inner buttons, menu items) */
    --lgsb-radius-input:  8px;   /* inputs, selects, textareas */
    --lgsb-radius-button: 12px;  /* buttons (independent from inputs) */
    --lgsb-radius-nested: 12px;  /* cards inside panels (design/job/error/skeleton/status) */
    --lgsb-radius-card:   12px;  /* primary cards & sections */
    --lgsb-radius-pill:   999px;
    /* Semantic border widths — every component type carries an independent
       visual weight, centrally controlled here. Never share one width
       token across unrelated element types. */
    --lgsb-card-border-width:        3px;   /* primary cards & sections (summary, panels, pricing) */
    --lgsb-nested-card-border-width: 2px;   /* cards inside panels (design/job/error/skeleton cards) */
    --lgsb-divider-width:            2px;   /* rules and separators */
    --lgsb-input-border-width:       2px;   /* inputs, steppers, selects, textareas */
    --lgsb-button-border-width:      1.5px; /* outlined buttons + icon rings */
    --lgsb-dropzone-border-width:    2.5px; /* dashed upload zones */
    --lgsb-focus-ring-width:         3px;
    --lgsb-shadow-card:   0 3px 12px rgba(0, 0, 0, .06);
    --lgsb-shadow-nested: 0 1px 6px rgba(0, 0, 0, .05);
    --lgsb-shadow-raised: 0 4px 16px rgba(0, 0, 0, .10);
    --lgsb-shadow-menu:   0 6px 18px rgba(0, 0, 0, .14);
    --lgsb-shadow-modal:  0 12px 40px rgba(0, 0, 0, .28);

    /* --- Motion --- */
    --lgsb-dur-fast: 120ms;
    --lgsb-dur-base: 180ms;
    --lgsb-dur-slow: 280ms;
    --lgsb-ease:     cubic-bezier(.4, 0, .2, 1);
    --lgsb-ease-out: cubic-bezier(0, 0, .2, 1);
    --lgsb-ease-in:  cubic-bezier(.4, 0, 1, 1);

    /* --- Z-index --- */
    --lgsb-z-chip:       2;
    --lgsb-z-sticky:     5;
    --lgsb-z-menu:       10;
    --lgsb-z-mobile-bar: 100;
    --lgsb-z-modal:      99999; /* must clear Divi's fixed header */

    /* --- Sticky offset --- viewport-top inset for every sticky header in
       the builder (My Designs toolbar, jobs workspace header). 12px of
       breathing room by owner request (v2.109.1) — cards do scroll visibly
       through that gap above the stuck bar, an accepted trade-off.
       Overridden below for the fixed WP admin bar; bump it site-side if the
       theme ever ships a fixed header on the product page. */
    --lgsb-sticky-top: var(--lgsb-space-4);

    /* --- Focus ring --- */
    --lgsb-focus-ring:       0 0 0 var(--lgsb-focus-ring-width) rgba(0, 125, 145, .35);
    --lgsb-focus-ring-error: 0 0 0 var(--lgsb-focus-ring-width) rgba(180, 35, 24, .30);
}

/* Sticky offset vs the WordPress admin bar (viewport-fixed, so real media
   queries — not container queries). >782px: 32px fixed bar; 601–782px: 46px
   fixed bar; ≤600px: WP switches #wpadminbar to position:absolute (it
   scrolls away), so no inset is needed. */
body.admin-bar #lgsb-uploader {
    --lgsb-sticky-top: calc(var(--lgsb-space-4) + 32px);
}

@media screen and (max-width: 782px) {
    body.admin-bar #lgsb-uploader {
        --lgsb-sticky-top: calc(var(--lgsb-space-4) + 46px);
    }
}

@media screen and (max-width: 600px) {
    body.admin-bar #lgsb-uploader {
        --lgsb-sticky-top: var(--lgsb-space-4);
    }
}

/* CONTAINER-QUERY BREAKPOINTS (single declaration point — CQs cannot read
   custom properties). Desktop ≥ 1180px · Laptop 880–1179px · Tablet 640–879px
   · Mobile < 640px. Used in section 6. */

/* =========================================================================
 * 2. BASE
 * ========================================================================= */
#lgsb-uploader {
    box-sizing: border-box;
    color: var(--lgsb-text);
    container-type: inline-size;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body);
    line-height: var(--lgsb-leading-body);
    margin: 0 0 var(--lgsb-space-6);
    /* Containing block for root-mounted popovers (Job Settings) — their JS
       computes coordinates relative to this element. */
    position: relative;
    text-align: left;
}

#lgsb-uploader *,
#lgsb-uploader *::before,
#lgsb-uploader *::after {
    box-sizing: border-box;
}

#lgsb-uploader h2,
#lgsb-uploader h3,
#lgsb-uploader p,
#lgsb-uploader ul {
    margin: 0;
    padding: 0;
}

#lgsb-uploader ul {
    list-style: none;
}

#lgsb-uploader button {
    font-family: inherit;
}

/* Visible keyboard focus everywhere. Focus is instant (no transition). */
#lgsb-uploader :focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

#lgsb-uploader .screen-reader-text {
    clip: rect(1px, 1px, 1px, 1px);
    height: 1px;
    overflow: hidden;
    position: absolute;
    width: 1px;
}

/* Optional file-requirements banner (admin setting) */
#lgsb-uploader .lgsb-requirements-note {
    background: var(--lgsb-teal-soft);
    border-left: 3px solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-sm);
    font-size: var(--lgsb-font-body-sm);
    margin-bottom: var(--lgsb-space-4);
    padding: var(--lgsb-space-3) var(--lgsb-space-4);
}

/* =========================================================================
 * 3. COMPONENTS
 * ========================================================================= */

/* --- 3.1 Buttons ---------------------------------------------------------
   The primary recipe is modeled on the proven Select Files button (teal,
   radius 8, uppercase 700, inset-overlay hover). The Select Files element
   itself keeps its own armor in section 7. */
#lgsb-uploader .lgsb-btn,
#lgsb-uploader .lgsb-ws-update-btn,
#lgsb-uploader .lgsb-preview-layout-btn,
#lgsb-uploader .lgsb-update-summary-btn,
#lgsb-uploader .lgsb-modal-btn {
    align-items: center;
    border: none;
    border-radius: var(--lgsb-radius-button);
    cursor: pointer;
    display: inline-flex;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-button);
    font-weight: var(--lgsb-weight-bold);
    gap: var(--lgsb-space-2);
    justify-content: center;
    letter-spacing: var(--lgsb-tracking-button);
    line-height: var(--lgsb-leading-tight);
    padding: 11px 22px;
    text-transform: uppercase;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                box-shadow var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease),
                transform var(--lgsb-dur-fast) var(--lgsb-ease);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-btn:active,
#lgsb-uploader .lgsb-ws-update-btn:active,
#lgsb-uploader .lgsb-preview-layout-btn:active,
#lgsb-uploader .lgsb-update-summary-btn:active,
#lgsb-uploader .lgsb-modal-btn:active {
    transform: translateY(1px);
}

/* Primary — filled teal */
#lgsb-uploader .lgsb-btn--primary,
#lgsb-uploader .lgsb-update-summary-btn,
#lgsb-uploader .lgsb-modal-btn-primary {
    background: var(--lgsb-teal);
    color: #fff;
}

#lgsb-uploader .lgsb-btn--primary:hover,
#lgsb-uploader .lgsb-update-summary-btn:hover:not(:disabled),
#lgsb-uploader .lgsb-modal-btn-primary:hover {
    /* Inset-overlay hover (proven against Divi opacity/filter resets) */
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, .13);
}

/* Secondary — outlined teal */
#lgsb-uploader .lgsb-btn--secondary,
#lgsb-uploader .lgsb-modal-btn-secondary,
#lgsb-uploader .lgsb-ws-update-btn,
#lgsb-uploader .lgsb-preview-layout-btn {
    background: var(--lgsb-surface);
    box-shadow: inset 0 0 0 var(--lgsb-button-border-width) var(--lgsb-teal);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-btn--secondary:hover:not(:disabled),
#lgsb-uploader .lgsb-modal-btn-secondary:hover:not(:disabled),
#lgsb-uploader .lgsb-ws-update-btn:hover:not(:disabled),
#lgsb-uploader .lgsb-preview-layout-btn:hover:not(:disabled) {
    background: var(--lgsb-teal-soft);
    box-shadow: inset 0 0 0 var(--lgsb-button-border-width) var(--lgsb-teal);
}

/* Danger — errors / destructive confirms only */
#lgsb-uploader .lgsb-btn--danger,
#lgsb-uploader .lgsb-modal-btn-danger {
    background: var(--lgsb-error-text);
    color: #fff;
}

#lgsb-uploader .lgsb-btn--danger:hover,
#lgsb-uploader .lgsb-modal-btn-danger:hover {
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, .13);
}

/* Text/ghost — low-emphasis actions (modal cancel, error retry/dismiss) */
#lgsb-uploader .lgsb-modal-btn-text,
#lgsb-uploader .lgsb-btn-ghost {
    background: transparent;
    color: var(--lgsb-text-muted);
}

#lgsb-uploader .lgsb-modal-btn-text:hover,
#lgsb-uploader .lgsb-btn-ghost:hover {
    background: var(--lgsb-surface-dim);
    color: var(--lgsb-text);
}

/* Disabled — clearly distinguishable, no hover effect */
#lgsb-uploader .lgsb-btn:disabled,
#lgsb-uploader .lgsb-ws-update-btn:disabled,
#lgsb-uploader .lgsb-preview-layout-btn:disabled,
#lgsb-uploader .lgsb-modal-btn:disabled {
    background: #C3C9CD;
    box-shadow: none;
    color: #fff;
    cursor: not-allowed;
    transform: none;
}

/* --- 3.2 Card chrome (primary cards carry the heavy 3px border) --- */
#lgsb-uploader .lgsb-card,
#lgsb-uploader .lgsb-main-col {
    background: var(--lgsb-surface);
    border: var(--lgsb-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-card);
    box-shadow: var(--lgsb-shadow-card);
}

/* --- 3.3 Pills / badges (one recipe, semantic palettes) ---
   Job card status is NOT a pill anymore (v2.49.0) — it's small centered
   text styled in §4.8 with a soft tint on the whole card. */
#lgsb-uploader .lgsb-status-badge,
#lgsb-uploader .lgsb-dpi-pill,
#lgsb-uploader .lgsb-tier-badge {
    border-radius: var(--lgsb-radius-pill);
    display: inline-block;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .03em;
    line-height: var(--lgsb-leading-tight);
    padding: 4px 10px;
    text-transform: uppercase;
    transition: background var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease);
    white-space: nowrap;
}

/* Design-card status + DPI tags — rounded rectangles (not full pills) with
   sentence case per the mock; status carries a text-color-matched dot. */
#lgsb-uploader .lgsb-status-badge,
#lgsb-uploader .lgsb-dpi-pill {
    border-radius: var(--lgsb-radius-sm);
    font-size: 12px;
    letter-spacing: 0;
    padding: 5px 10px;
    text-transform: none;
}

#lgsb-uploader .lgsb-status-badge::before {
    background: currentColor;
    border-radius: 50%;
    content: '';
    display: inline-block;
    height: 7px;
    margin-right: 6px;
    vertical-align: 1px;
    width: 7px;
}

/* Success (Ready / OK DPI) */
#lgsb-uploader .lgsb-status-ready,
#lgsb-uploader .lgsb-dpi-ok {
    background: var(--lgsb-success-bg);
    color: var(--lgsb-success-text);
}

/* Good (DPI tier 2 — solid but below recommended; soft success palette) */
#lgsb-uploader .lgsb-dpi-good {
    background: var(--lgsb-success-soft);
    color: var(--lgsb-success-text);
}

/* Warning (Review / warn DPI) */
#lgsb-uploader .lgsb-status-review,
#lgsb-uploader .lgsb-dpi-warn {
    background: var(--lgsb-warning-bg);
    color: var(--lgsb-warning-text);
}

/* Error (Blocked / low DPI) */
#lgsb-uploader .lgsb-status-blocked,
#lgsb-uploader .lgsb-dpi-error {
    background: var(--lgsb-error-bg);
    color: var(--lgsb-error-text);
}

/* Neutral (unknown DPI) */
#lgsb-uploader .lgsb-dpi-unknown {
    background: var(--lgsb-surface-dim);
    color: var(--lgsb-text-muted);
}

/* Tier badge — teal pill (larger than standard pills, per the mock) */
#lgsb-uploader .lgsb-tier-badge {
    background: var(--lgsb-teal);
    color: #fff;
    font-size: 14px;
    font-weight: var(--lgsb-weight-bold);
    padding: 10px 26px;
}

/* Ink pills — free shipping + floating count chip */
#lgsb-uploader .lgsb-free-shipping,
#lgsb-uploader .lgsb-panel-chip {
    background: var(--lgsb-ink);
    border-radius: var(--lgsb-radius-pill);
    color: #fff;
    display: inline-block;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .04em;
    line-height: var(--lgsb-leading-tight);
    padding: 8px 16px;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-free-shipping {
    display: block;
    font-size: var(--lgsb-font-button);
    font-weight: var(--lgsb-weight-bold);
    padding: 10px 16px;
    text-align: center;
    text-transform: uppercase;
}

/* --- 3.4 Inputs / steppers --- */
#lgsb-uploader .lgsb-dim-input,
#lgsb-uploader .lgsb-contour-gap-input,
#lgsb-uploader .lgsb-qty-input {
    -moz-appearance: textfield;
    appearance: textfield;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text);
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    height: 32px;
    padding: 0 var(--lgsb-space-2);
    text-align: center;
    transition: border-color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 100%;
}

#lgsb-uploader .lgsb-dim-input::-webkit-outer-spin-button,
#lgsb-uploader .lgsb-dim-input::-webkit-inner-spin-button,
#lgsb-uploader .lgsb-contour-gap-input::-webkit-outer-spin-button,
#lgsb-uploader .lgsb-contour-gap-input::-webkit-inner-spin-button,
#lgsb-uploader .lgsb-qty-input::-webkit-outer-spin-button,
#lgsb-uploader .lgsb-qty-input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

#lgsb-uploader .lgsb-dim-input:focus,
#lgsb-uploader .lgsb-contour-gap-input:focus,
#lgsb-uploader .lgsb-qty-input:focus {
    border-color: var(--lgsb-teal);
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15);
    outline: none;
}

/* Copies stepper: − [value] + */
#lgsb-uploader .lgsb-qty-control {
    align-items: center;
    display: inline-flex;
    gap: var(--lgsb-space-1);
}

#lgsb-uploader .lgsb-qty-input {
    width: 52px;
}

#lgsb-uploader .lgsb-qty-step {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-teal);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    font-size: 15px;
    font-weight: var(--lgsb-weight-bold);
    height: 28px;
    justify-content: center;
    line-height: 1;
    padding: 0;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                border-color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 28px;
}

#lgsb-uploader .lgsb-qty-step:hover {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal);
}

/* Dimensions block: WIDTH / HEIGHT fields + aspect lock */
#lgsb-uploader .lgsb-dim-stack {
    align-items: flex-end;
    display: flex;
    flex-wrap: nowrap;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-dim-fields {
    display: flex;
    flex: 1 1 auto;
    gap: var(--lgsb-space-2);
    min-width: 0;
}

#lgsb-uploader .lgsb-dim-label {
    display: flex;
    flex: 1 1 0;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

#lgsb-uploader .lgsb-dim-name {
    color: var(--lgsb-ink);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-dim-control {
    display: flex;
    height: 32px;
    position: relative;
}

#lgsb-uploader .lgsb-dim-control .lgsb-dim-input {
    padding-right: 20px;
}

#lgsb-uploader .lgsb-dim-spin {
    display: flex;
    flex-direction: column;
    height: 100%;
    position: absolute;
    right: 3px;
    top: 0;
    width: 16px;
}

#lgsb-uploader .lgsb-dim-step {
    background: transparent;
    border: none;
    cursor: pointer;
    flex: 1 1 50%;
    padding: 0;
    position: relative;
}

#lgsb-uploader .lgsb-dim-step::before {
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
    content: '';
    left: 50%;
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
}

#lgsb-uploader .lgsb-dim-step[data-dir="up"]::before {
    border-bottom: 5px solid var(--lgsb-text-muted);
}

#lgsb-uploader .lgsb-dim-step[data-dir="down"]::before {
    border-top: 5px solid var(--lgsb-text-muted);
}

#lgsb-uploader .lgsb-dim-step:hover::before {
    border-bottom-color: var(--lgsb-teal);
    border-top-color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-dim-step[data-dir="up"]:hover::before {
    border-bottom-color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-dim-step[data-dir="down"]:hover::before {
    border-top-color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-lock-btn {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    height: 32px;
    justify-content: center;
    padding: 0;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 32px;
}

#lgsb-uploader .lgsb-lock-btn:hover {
    background: var(--lgsb-teal-soft);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-lock-btn.lgsb-locked {
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-lock-btn .lgsb-icon-unlocked { display: none; }
#lgsb-uploader .lgsb-lock-btn.lgsb-unlocked .lgsb-icon-unlocked { display: block; }
#lgsb-uploader .lgsb-lock-btn.lgsb-unlocked .lgsb-icon-locked { display: none; }

#lgsb-uploader .lgsb-aspect-label {
    color: var(--lgsb-ink);
    flex: 0 0 auto;
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-medium);
    line-height: 1.3;
    max-width: 46px;
    padding-bottom: 7px;
}

#lgsb-uploader .lgsb-dim-missing {
    color: var(--lgsb-text-muted);
}

/* Move-to select (grouping mode) */
#lgsb-uploader .lgsb-move {
    align-items: center;
    display: inline-flex;
    gap: var(--lgsb-space-1);
    min-width: 0;
}

#lgsb-uploader .lgsb-move-label {
    display: none; /* the select's first option communicates the action */
}

#lgsb-uploader .lgsb-move-select {
    appearance: none;
    -webkit-appearance: none;
    background: var(--lgsb-surface)
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B7680' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")
        no-repeat right 6px center / 12px;
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text);
    cursor: pointer;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-medium);
    height: 28px;
    max-width: 120px;
    overflow: hidden;
    padding: 0 22px 0 8px;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-move-select:disabled {
    cursor: not-allowed;
    opacity: .5;
}

/* Checkbox rows (group toggle, order options, artwork ack) */
#lgsb-uploader .lgsb-checkbox-label {
    align-items: flex-start;
    cursor: pointer;
    display: flex;
    gap: 10px;
}

#lgsb-uploader .lgsb-checkbox-label input[type="checkbox"] {
    accent-color: var(--lgsb-teal);
    flex: 0 0 auto;
    height: 17px;
    margin: 2px 0 0;
    width: 17px;
}

/* --- 3.5 Alerts (file warnings) --- */
#lgsb-uploader .lgsb-file-warnings {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-1);
}

/* Compact in-card alert per the mock: rounded tan box, icon left, bold ink
   title, small body — no left accent bar. */
#lgsb-uploader .lgsb-file-warnings li {
    align-items: center;
    border-radius: var(--lgsb-radius-sm);
    display: flex;
    font-size: 11px;
    gap: 8px;
    line-height: 1.45;
    padding: 8px 10px;
}

#lgsb-uploader .lgsb-warn-warning {
    background: var(--lgsb-warning-bg);
    color: var(--lgsb-ink);
}

#lgsb-uploader .lgsb-warn-error {
    background: var(--lgsb-error-bg);
    color: var(--lgsb-ink);
}

#lgsb-uploader .lgsb-warning-icon {
    color: var(--lgsb-warning-text);
    display: inline-flex;
    flex: 0 0 18px;
}

#lgsb-uploader .lgsb-warn-error .lgsb-warning-icon {
    color: var(--lgsb-error-text);
}

#lgsb-uploader .lgsb-warn-title {
    color: var(--lgsb-ink);
    display: block;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    margin-bottom: 2px;
}

/* "Got it" — link-styled dismiss button inside a notice chip. */
#lgsb-uploader .lgsb-warn-gotit {
    align-self: flex-start;
    background: none;
    border: none;
    color: var(--lgsb-warning-text);
    cursor: pointer;
    flex: 0 0 auto;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    margin-left: auto;
    padding: 0;
    text-decoration: underline;
    text-underline-offset: 2px;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-warn-gotit:hover {
    color: var(--lgsb-ink);
}

/* Dismissed notices collapse into the pill below; an all-collapsed list
   must vanish entirely (an empty flex box still occupies its gap). */
#lgsb-uploader .lgsb-file-warnings li.lgsb-warn-collapsed {
    display: none;
}

#lgsb-uploader .lgsb-file-warnings.lgsb-warnings-allhidden {
    display: none;
}

/* Compact amber pill standing in for dismissed notices — click re-opens. */
#lgsb-uploader .lgsb-warn-pill {
    align-items: center;
    align-self: flex-start;
    background: var(--lgsb-warning-bg);
    border: none;
    border-radius: 999px;
    color: var(--lgsb-ink);
    cursor: pointer;
    display: inline-flex;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    gap: 6px;
    padding: 4px 12px;
    width: fit-content;
}

#lgsb-uploader .lgsb-warn-pill .lgsb-warning-icon {
    flex-basis: 14px;
}

#lgsb-uploader .lgsb-warn-pill .lgsb-warn-triangle {
    height: 14px;
    width: 14px;
}

/* --- 3.6 Skeleton loading --- */
#lgsb-uploader .lgsb-skeleton {
    animation: lgsb-skel-pulse 1.6s var(--lgsb-ease) infinite;
    background: var(--lgsb-surface-dim);
    border-radius: var(--lgsb-radius-sm);
    display: block;
}

@keyframes lgsb-skel-pulse {
    0%, 100% { opacity: 1; }
    50%      { opacity: .45; }
}

#lgsb-uploader .lgsb-skel-card {
    background: var(--lgsb-surface);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-skel-title  { flex: 1 1 auto; min-width: 0; }
#lgsb-uploader .lgsb-skel-thumb  { flex: 0 0 56px; height: 56px; width: 56px; }
#lgsb-uploader .lgsb-skel-line   { height: 12px; width: 70%; }
#lgsb-uploader .lgsb-skel-line-sm{ height: 10px; margin-top: 6px; width: 40%; }
#lgsb-uploader .lgsb-skel-block  { height: 32px; width: 100%; }
#lgsb-uploader .lgsb-skel-block-sm { height: 24px; width: 60%; }

#lgsb-uploader .lgsb-skel-status {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .03em;
    text-transform: uppercase;
}

/* --- 3.6b Converting card (PDF/AI vector ingestion) ---
   Persistent variant of the skeleton card shown while the AWS worker
   converts a vector upload to PNG pages. Same shell as .lgsb-skel-card;
   the head swaps the thumb placeholder for a format badge + live status. */
#lgsb-uploader .lgsb-converting-card .lgsb-fc-head {
    align-items: center;
    display: flex;
    gap: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-converting-badge {
    align-items: center;
    background: var(--lgsb-surface-dim);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    display: flex;
    flex: 0 0 56px;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-bold);
    height: 56px;
    justify-content: center;
    letter-spacing: .05em;
    width: 56px;
}

#lgsb-uploader .lgsb-converting-name {
    color: var(--lgsb-text);
    display: block;
    font-weight: var(--lgsb-weight-semibold);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-converting-status {
    animation: lgsb-skel-pulse 1.6s var(--lgsb-ease) infinite;
    color: var(--lgsb-primary);
    display: block;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .03em;
    margin-top: 4px;
    text-transform: uppercase;
}

/* --- 3.6c Finished gang sheet (Custom Length Uploader merge, v2.87.0) ---
   Awaiting-choice card: parks a gang-sheet-width PDF/AI while the customer
   confirms intent in the modal. Shares the converting card's shell; the
   teal-soft tint + Review button signal "action needed", not "working". */
#lgsb-uploader .lgsb-gs-await-card {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal-mid);
}

#lgsb-uploader .lgsb-gs-await-card .lgsb-gs-await-status {
    animation: none; /* action needed — never the working pulse */
}

#lgsb-uploader .lgsb-gs-await-note {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-body);
    line-height: var(--lgsb-leading-body);
    margin: var(--lgsb-space-3) 0 0;
}

#lgsb-uploader .lgsb-gs-await-note.lgsb-gs-await-error {
    color: var(--lgsb-error-text);
}

#lgsb-uploader .lgsb-gs-await-actions {
    display: flex;
    justify-content: flex-end;
    margin-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-gs-review-btn {
    background: var(--lgsb-primary);
    border-color: var(--lgsb-primary);
    color: #fff;
}

#lgsb-uploader .lgsb-gs-review-btn:hover {
    background: var(--lgsb-teal-dark);
    border-color: var(--lgsb-teal-dark);
    color: #fff;
}

/* Passthrough design card: no raster preview exists — the thumb slot shows
   a teal document tile (icon + extension) instead, and the card is chipped
   "Finished gang sheet". Doubled class beats the base .lgsb-file-thumb
   checkerboard declared later in this file; not clickable (there is
   nothing bigger to show). */
#lgsb-uploader .lgsb-file-thumb.lgsb-file-thumb-vector {
    align-items: center;
    background: linear-gradient(160deg, var(--lgsb-teal-soft) 0%, #D5EBEF 100%);
    border-color: var(--lgsb-teal-mid);
    color: var(--lgsb-teal-dark);
    cursor: default;
    display: flex;
    flex-direction: column;
    gap: 4px;
    justify-content: center;
}

#lgsb-uploader .lgsb-file-thumb-vector svg {
    display: block;
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-thumb-ext {
    font-size: 10px;
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .08em;
    line-height: 1;
}

/* Meta row: the first block normally sizes to its content (flex: 0 0 auto,
   fine for a short DPI caption) — the Handling block must be allowed to
   shrink/wrap so it can never crush the Copies control beside it. */
#lgsb-uploader .lgsb-file-passthrough .lgsb-fc-meta .lgsb-fc-block:first-child {
    flex: 0 1 auto;
    min-width: 0;
}

#lgsb-uploader .lgsb-file-passthrough .lgsb-dpi-quality {
    text-align: left;
    white-space: normal;
}

#lgsb-uploader .lgsb-gs-badge {
    background: var(--lgsb-teal-soft);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-teal-dark);
    display: inline-block;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    line-height: var(--lgsb-leading-tight);
    margin-top: 4px;
    padding: 4px 8px;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-gs-pill {
    background: var(--lgsb-teal-soft);
    color: var(--lgsb-teal-dark);
}

/* Locked dimensions readout (replaces the W/H inputs — the size is the
   file's measured size and can never be edited). */
#lgsb-uploader .lgsb-gs-dims-locked {
    align-items: baseline;
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-gs-dims-value {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-gs-dims-note {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
}

/* Confirmation modal: filename line above the explanatory copy. */
#lgsb-uploader .lgsb-modal--gangsheet .lgsb-gs-modal-file {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
    font-weight: var(--lgsb-weight-bold);
    margin: 0 0 var(--lgsb-space-3);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* --- Pending direct-upload card (PNG measuring on the AWS worker) --- */
/* Qty/size stay locked until ready. A phase checklist replaces skeleton
   blocks so wait time reads as real work (upload → check → measure → prepare). */
#lgsb-uploader .lgsb-pending-thumb {
    background:
        conic-gradient(#eee 90deg, transparent 90deg 180deg, #eee 180deg 270deg, transparent 270deg)
        0 0 / 16px 16px,
        #fff;
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    flex: 0 0 56px;
    height: 56px;
    object-fit: contain;
    width: 56px;
}

#lgsb-uploader .lgsb-pending-check {
    display: flex;
    flex-direction: column;
    gap: 6px;
    list-style: none;
    margin: 0;
    padding: 0;
}

#lgsb-uploader .lgsb-pending-check-item {
    align-items: center;
    color: var(--lgsb-text-muted);
    display: flex;
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    gap: var(--lgsb-space-2);
    line-height: 1.3;
    min-width: 0;
}

#lgsb-uploader .lgsb-pending-check-item.is-done {
    color: var(--lgsb-teal-dark);
}

#lgsb-uploader .lgsb-pending-check-item.is-active {
    color: var(--lgsb-ink);
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-pending-check-mark {
    align-items: center;
    border: 1.5px solid var(--lgsb-border);
    border-radius: 50%;
    display: inline-flex;
    flex: 0 0 16px;
    height: 16px;
    justify-content: center;
    width: 16px;
}

#lgsb-uploader .lgsb-pending-check-item.is-done .lgsb-pending-check-mark {
    background: var(--lgsb-teal);
    border-color: var(--lgsb-teal);
    color: #fff;
}

#lgsb-uploader .lgsb-pending-check-item.is-done .lgsb-pending-check-mark svg {
    display: block;
    height: 10px;
    width: 10px;
}

#lgsb-uploader .lgsb-pending-check-item.is-active .lgsb-pending-check-mark {
    border-color: transparent;
}

#lgsb-uploader .lgsb-pending-check-spin {
    animation: lgsb-spin .8s linear infinite;
    border: 2px solid var(--lgsb-border);
    border-radius: 50%;
    border-top-color: var(--lgsb-teal);
    display: block;
    height: 14px;
    width: 14px;
}

#lgsb-uploader .lgsb-pending-check-label {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

@media (prefers-reduced-motion: reduce) {
    #lgsb-uploader .lgsb-pending-check-spin {
        animation: none;
        border-top-color: var(--lgsb-teal);
        opacity: .85;
    }
}

/* --- 3.7 Modal --- */
#lgsb-uploader .lgsb-modal-overlay {
    align-items: center;
    background: rgba(17, 17, 17, .55);
    display: flex;
    inset: 0;
    justify-content: center;
    opacity: 0;
    padding: var(--lgsb-space-5);
    position: fixed;
    transition: opacity var(--lgsb-dur-base) var(--lgsb-ease);
    z-index: var(--lgsb-z-modal);
}

#lgsb-uploader .lgsb-modal {
    background: var(--lgsb-surface);
    border-radius: var(--lgsb-radius-card);
    box-shadow: var(--lgsb-shadow-modal);
    max-width: 440px;
    padding: var(--lgsb-space-6);
    transform: translateY(8px) scale(.97);
    transition: transform var(--lgsb-dur-base) var(--lgsb-ease-out);
    width: 100%;
}

/* Confirm dialog opened ON TOP of another modal (e.g. Reset to Original
   inside the Edit modal). Sits one step above the modal layer and uses a
   LIGHTER scrim than a first-level modal — stacking two 55% scrims would
   black out the editor behind it, and the customer loses the context the
   question is about. (Unrelated to .lgsb-modal-actions--stacked, which is
   about button direction.) */
#lgsb-uploader .lgsb-modal-overlay--nested {
    background: rgba(17, 17, 17, .38);
    z-index: calc(var(--lgsb-z-modal) + 1);
}

/* Narrower than a content modal: a yes/no question reads better on short
   lines, and the tighter box signals "decision", not "workspace". */
#lgsb-uploader .lgsb-modal--confirm {
    max-width: 400px;
}

#lgsb-uploader .lgsb-modal-overlay.lgsb-modal-visible {
    opacity: 1;
}

/* Body scroll lock (v2.118.0): while ANY plugin modal is open, the page
   behind it must not scroll (wheel/touch at the modal edge was moving the
   Divi page underneath the editor). :has() needs no JS bookkeeping — the
   lock releases the instant .lgsb-modal-visible drops, even on the
   180 ms fade-out, and browsers without :has() simply keep old behavior.
   !important beats theme-level body overflow rules. */
body:has(#lgsb-uploader .lgsb-modal-overlay.lgsb-modal-visible) {
    overflow: hidden !important;
}

#lgsb-uploader .lgsb-modal-overlay.lgsb-modal-visible .lgsb-modal {
    transform: none;
}

#lgsb-uploader .lgsb-modal-title {
    font-size: 17px;
    font-weight: var(--lgsb-weight-bold);
    line-height: var(--lgsb-leading-tight);
    margin-bottom: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-modal-body {
    color: var(--lgsb-text);
    font-size: 13px;
}

#lgsb-uploader .lgsb-modal-body p + p,
#lgsb-uploader .lgsb-modal-body p + ul {
    margin-top: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-modal-list {
    list-style: disc;
    margin: var(--lgsb-space-2) 0 0;
    padding-left: 20px;
}

#lgsb-uploader .lgsb-modal-warning {
    color: var(--lgsb-error-text);
    font-weight: var(--lgsb-weight-semibold);
    margin-top: var(--lgsb-space-3);
}

/* Add-to-cart checkpoint (consolidated background confirmation) */
#lgsb-uploader .lgsb-cartack-list {
    list-style: disc;
    margin: var(--lgsb-space-2) 0 0;
    padding-left: 20px;
}

#lgsb-uploader .lgsb-cartack-list li + li {
    margin-top: var(--lgsb-space-1);
}

#lgsb-uploader .lgsb-cartack-acked {
    color: var(--lgsb-text-muted);
    font-size: 12px;
    margin-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-modal-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
    justify-content: flex-end;
    margin-top: var(--lgsb-space-5);
}

/* Global rule: buttons inside width-constrained containers (modals) must
   never overflow the card — they share the row, shrink, and wrap their
   label instead of clipping. */
#lgsb-uploader .lgsb-modal-actions .lgsb-modal-btn {
    flex: 1 1 auto;
    min-width: 0;
    white-space: normal;
}

#lgsb-uploader .lgsb-modal-actions--stacked {
    flex-direction: column;
    /* Target-job pickers can list 20+ jobs — scroll inside the dialog
       instead of growing past the viewport. */
    max-height: 40vh;
    overflow-y: auto;
}

#lgsb-uploader .lgsb-modal-actions--stacked .lgsb-modal-btn {
    flex: 0 0 auto;
    width: 100%;
}

/* Background Detected option cards: each choice is one full-width button
   holding a bold label plus a one-line "pick this when" description, so the
   customer can scan four outcomes instead of decoding bare button labels.
   Inherits the stacked container's 40vh scroll box, so four cards + warning
   copy still fit a small phone viewport. */
#lgsb-uploader .lgsb-ack-cards {
    /* .lgsb-modal-actions sets flex-wrap: wrap — in a column flex that wraps
       overflowing cards into a SECOND COLUMN instead of scrolling. Force the
       single column so the 40vh scroll box actually scrolls vertically. */
    flex-wrap: nowrap;
    /* .lgsb-modal-actions also sets justify-content: flex-end (right-aligns
       row buttons) — in the column axis that bottom-aligns the cards and
       clips the FIRST card's top out of the scroll box (unreachable
       overflow). Start-align so overflow falls at the scrollable bottom. */
    justify-content: flex-start;
}

#lgsb-uploader .lgsb-ack-card {
    align-items: flex-start;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 10px 14px;
    text-align: left;
}

#lgsb-uploader .lgsb-ack-card-label {
    font-weight: var(--lgsb-weight-bold);
}

/* Sentence-case helper line; the label above keeps the button treatment. */
#lgsb-uploader .lgsb-ack-card-desc {
    font-size: 12px;
    font-weight: var(--lgsb-weight-regular);
    letter-spacing: normal;
    line-height: var(--lgsb-leading-body);
    text-transform: none;
}

/* Description contrast per card tone: muted ink on outlined cards,
   translucent white on the filled primary/danger cards. */
#lgsb-uploader .lgsb-modal-btn-secondary .lgsb-ack-card-desc {
    color: var(--lgsb-text-muted);
}

#lgsb-uploader .lgsb-modal-btn-primary .lgsb-ack-card-desc,
#lgsb-uploader .lgsb-modal-btn-danger .lgsb-ack-card-desc {
    color: rgba(255, 255, 255, .85);
}

/* Tiebreaker shown only when BOTH fix-it tools are offered. */
#lgsb-uploader .lgsb-ack-tiebreak {
    color: var(--lgsb-text-muted);
    font-size: 12px;
    line-height: var(--lgsb-leading-body);
    margin-top: var(--lgsb-space-3);
}

/* Job Gap dialog — the number is entered here (never inline in the
   popover), alongside copy explaining what it applies to. */
#lgsb-uploader .lgsb-jobgap-field {
    align-items: center;
    display: flex;
    flex-direction: row;
    gap: var(--lgsb-space-2);
    margin-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-jobgap-field > span {
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-jobgap-input {
    -moz-appearance: textfield;
    appearance: textfield;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text);
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    height: 32px;
    padding: 0 var(--lgsb-space-2);
    text-align: center;
    width: 84px;
}

#lgsb-uploader .lgsb-jobgap-input:focus {
    border-color: var(--lgsb-teal);
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15);
    outline: none;
}

/* An entered override reads as "customized" (matches the design cards) */
#lgsb-uploader .lgsb-jobgap-input:not(:placeholder-shown) {
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-jobgap-hint {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
    margin-top: var(--lgsb-space-2);
}

/* --- 3.8 Layout preview modal ---
   A faithful miniature of the server's nesting plan. One sheet shows at a
   time inside a fixed viewport (no scrolling) — JS scales the sheet's px
   box to fit while keeping its true proportions; placements are
   percentage-positioned so they scale along for free. The checkerboard
   backdrop signals film transparency (the designs are transparent PNGs). */
#lgsb-uploader .lgsb-modal--preview {
    display: flex;
    flex-direction: column;
    max-height: 90vh;
    max-width: 760px;
}

#lgsb-uploader .lgsb-lp-intro {
    color: var(--lgsb-text-muted);
    font-size: 13px;
    margin-bottom: var(--lgsb-space-3);
}

/* Preview-modal variant of the "contour gap not applied" explainer. */
#lgsb-uploader .lgsb-lp-gap-note {
    background: var(--lgsb-warning-bg);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-warning-text);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    line-height: 1.45;
    margin-bottom: var(--lgsb-space-3);
    padding: var(--lgsb-space-2) var(--lgsb-space-3);
}

/* Toolbar row above the viewport: sheet label left, dark toggle right. */
#lgsb-uploader .lgsb-lp-toolbar {
    align-items: center;
    display: flex;
    gap: var(--lgsb-space-3);
    justify-content: space-between;
    margin-bottom: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-lp-sheet-label {
    color: var(--lgsb-ink);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .03em;
    margin-bottom: 0;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-lp-dark-toggle {
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-lp-dark-label {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-lp-viewport {
    align-items: center;
    background: var(--lgsb-surface-dim);
    border-radius: var(--lgsb-radius-sm);
    display: flex;
    height: min(58vh, 560px);
    justify-content: center;
    overflow: hidden;
    padding: var(--lgsb-space-2);
    transition: background var(--lgsb-dur-base) var(--lgsb-ease);
}

/* Dark mode — the film against black instead of the transparency
   checkerboard (white/light artwork is invisible on the checkerboard). */
#lgsb-uploader .lgsb-lp-viewport.lgsb-lp-dark {
    background: #1B1E20;
}

#lgsb-uploader .lgsb-lp-dark .lgsb-lp-sheet {
    background-color: #000;
    background-image: none;
    border-color: #3A3F43;
}

#lgsb-uploader .lgsb-lp-sheet {
    background-color: var(--lgsb-surface);
    background-image:
        linear-gradient(45deg, #E9EDEF 25%, transparent 25%, transparent 75%, #E9EDEF 75%),
        linear-gradient(45deg, #E9EDEF 25%, transparent 25%, transparent 75%, #E9EDEF 75%);
    background-position: 0 0, 8px 8px;
    background-size: 16px 16px;
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: 3px;
    /* content-box so the border lives OUTSIDE the sheet geometry — with the
       theme's global border-box the border would shrink the placement
       coordinate space unevenly per axis and skew every design. */
    box-sizing: content-box !important;
    display: none;
    flex: 0 0 auto;
    overflow: hidden;
    padding: 0;
    position: relative;
}

#lgsb-uploader .lgsb-lp-item {
    position: absolute;
}

/* Printed text bands — job-group labels + the "Sheet X of Y" header —
   drawn exactly where the worker prints them (bold, near-black, left
   aligned, vertically centred; see buildLabelComposite in the render
   worker). The px font size is set inline by JS from the plan's
   font_size_in × the sheet's px-per-inch scale; the em padding mirrors
   the worker's small left pad and scales along with the font. */
#lgsb-uploader .lgsb-lp-label {
    color: #111111;
    font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
    font-weight: 700;
    overflow: hidden;
    padding-left: .35em;
    position: absolute;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Dark background toggle: the real film prints dark text, but on the
   black preview backdrop it would vanish — invert for legibility only. */
#lgsb-uploader .lgsb-lp-dark .lgsb-lp-label {
    color: #E9EDEF;
}

/* Zoom & pan (same engine as the Thin Line viewer): wheel/pinch zoom and
   drag-to-pan are handled on the viewport itself — never scroll the page. */
#lgsb-uploader .lgsb-lp-viewport {
    cursor: grab;
    touch-action: none;
}

#lgsb-uploader .lgsb-lp-viewport.lgsb-lp-panning {
    cursor: grabbing;
}

/* Zoom toolbar between the viewport and the pager. */
#lgsb-uploader .lgsb-lp-zoom {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin: var(--lgsb-space-2) 0 0;
}

#lgsb-uploader .lgsb-lp-zoombtn {
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-ink);
    cursor: pointer;
    font-family: inherit;
    font-size: 13px;
    font-weight: var(--lgsb-weight-bold);
    line-height: 1;
    min-width: 30px;
    padding: 6px 9px;
}

#lgsb-uploader .lgsb-lp-zoombtn:hover {
    border-color: var(--lgsb-primary);
    color: var(--lgsb-primary);
}

#lgsb-uploader .lgsb-lp-zoomhint {
    color: var(--lgsb-text-muted);
    font-size: 11px;
    margin-left: auto;
}

/* Theme armor: Divi/Woo apply `img { max-width: 100% }` globally, which caps
   a rotated copy's oversized pre-rotation box at its container width and
   squishes the artwork. Preview images are exactly sized — never clamp them. */
#lgsb-uploader .lgsb-lp-item img {
    display: block;
    height: 100%;
    max-height: none !important;
    max-width: none !important;
    width: 100%;
}

/* Rotated copies (rotation is CLOCKWISE degrees — the shared convention
   with the PHP geometry and the sharp render pipeline).
   90°/270°: the artwork fills the placement's cross-axis box and is spun
   about its center (inline width/height carry the swap ratios).
   180°: same box, flipped upside down — no size swap.
   .lgsb-lp-img-rot is the legacy 90° class kept for cached JS. */
#lgsb-uploader .lgsb-lp-item img.lgsb-lp-img-rot,
#lgsb-uploader .lgsb-lp-item img.lgsb-lp-img-rot90 {
    left: 50%;
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%) rotate(90deg);
}

#lgsb-uploader .lgsb-lp-item img.lgsb-lp-img-rot180 {
    transform: rotate(180deg);
}

#lgsb-uploader .lgsb-lp-item img.lgsb-lp-img-rot270 {
    left: 50%;
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%) rotate(270deg);
}

/* Fallback when a design card has no thumbnail to reuse. */
#lgsb-uploader .lgsb-lp-item-empty {
    background: var(--lgsb-teal-soft);
    border: 1px solid var(--lgsb-teal);
    border-radius: 2px;
}

/* Sheet pager — one numbered button per sheet, active = filled teal. */
#lgsb-uploader .lgsb-lp-pager {
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
    justify-content: center;
    margin-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-lp-page-btn {
    background: var(--lgsb-surface);
    border: none;
    border-radius: var(--lgsb-radius-sm);
    box-shadow: inset 0 0 0 var(--lgsb-button-border-width) var(--lgsb-teal);
    color: var(--lgsb-teal);
    cursor: pointer;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-button);
    font-weight: var(--lgsb-weight-bold);
    height: 34px;
    line-height: 1;
    min-width: 34px;
    padding: 0 var(--lgsb-space-2);
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-lp-page-btn:hover:not(.lgsb-lp-page-active) {
    background: var(--lgsb-teal-soft);
}

#lgsb-uploader .lgsb-lp-page-btn.lgsb-lp-page-active {
    background: var(--lgsb-teal);
    box-shadow: none;
    color: #fff;
    cursor: default;
}

/* --- 3.9 Size presets + bulk actions (v2.28.0) ---------------------------
   Custom (non-native) checkboxes: Divi replaces native checkbox chrome, so
   the real input is visually hidden and .lgsb-check-box paints the state —
   theme-proof by construction, keyboard/focus handled via :focus-visible on
   the label's box. Teal = selection per the semantic palette (§6.4). */

/* Shared custom checkbox (design-card corner + toolbar Select All) */
#lgsb-uploader .lgsb-select-check {
    align-items: center;
    cursor: pointer;
    display: inline-flex;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-select-check .lgsb-select-input,
#lgsb-uploader .lgsb-select-check .lgsb-bulk-selectall-input {
    height: 1px;
    margin: 0;
    opacity: 0;
    position: absolute;
    width: 1px;
}

/* Teal border at rest (visible against card/thumb), solid teal fill on
   hover; the checked state below is unchanged. */
#lgsb-uploader .lgsb-check-box {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-sm);
    color: transparent;
    display: inline-flex;
    flex: 0 0 auto;
    height: 18px;
    justify-content: center;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                border-color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 18px;
}

#lgsb-uploader .lgsb-select-check:hover .lgsb-check-box {
    background: var(--lgsb-teal);
    border-color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-select-check input:checked + .lgsb-check-box {
    background: var(--lgsb-teal);
    border-color: var(--lgsb-teal);
    color: #fff;
}

#lgsb-uploader .lgsb-select-check input:focus-visible + .lgsb-check-box {
    box-shadow: var(--lgsb-focus-ring);
}

/* Select All half-state (some cards in the job selected) */
#lgsb-uploader .lgsb-select-check input:indeterminate + .lgsb-check-box {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal);
}

/* Design-card corner checkbox — absolutely positioned over the top-left so
   the prescribed .lgsb-fc-head three-column layout is untouched. */
#lgsb-uploader .lgsb-file-row {
    position: relative;
}

#lgsb-uploader .lgsb-file-row > .lgsb-select-check {
    left: 6px;
    position: absolute;
    top: 6px;
    z-index: 2;
}

/* Selected card — teal glow (focus-ring recipe) + soft tint. Warned/blocked
   border colors still win (state borders are set on the same property). */
#lgsb-uploader .lgsb-file-row.lgsb-card-selected {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal);
    box-shadow: var(--lgsb-focus-ring);
}

/* Per-card Preset button — labeled icon button on the "Dimensions (in)"
   header line (label left, button right), so the W/H input row keeps its
   full width. The head is also the quick-apply menu's anchor. */
#lgsb-uploader .lgsb-fc-dims-head {
    align-items: center;
    display: flex;
    justify-content: space-between;
    position: relative;
}

#lgsb-uploader .lgsb-preset-btn {
    align-items: center;
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    gap: 4px;
    height: 24px;
    justify-content: center;
    line-height: 1;
    padding: 0 8px;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                border-color var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-preset-btn svg {
    height: 13px;
    width: 13px;
}

#lgsb-uploader .lgsb-preset-btn:hover {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal);
}

/* Quick-apply dropdown anchored under the Dimensions header line. */
#lgsb-uploader .lgsb-preset-menu {
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    box-shadow: var(--lgsb-shadow-menu);
    max-height: 240px;
    min-width: 180px;
    overflow-y: auto;
    padding: var(--lgsb-space-1) 0;
    position: absolute;
    right: 0;
    top: calc(100% + 4px);
    z-index: 20;
}

#lgsb-uploader .lgsb-preset-menu-item {
    align-items: baseline;
    background: transparent;
    border: none;
    color: var(--lgsb-text);
    cursor: pointer;
    display: flex;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body-sm);
    gap: var(--lgsb-space-2);
    justify-content: space-between;
    padding: 7px var(--lgsb-space-4);
    text-align: left;
    width: 100%;
}

#lgsb-uploader .lgsb-preset-menu-item:hover,
#lgsb-uploader .lgsb-preset-menu-item:focus-visible {
    background: var(--lgsb-teal-soft);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-preset-menu-name {
    font-weight: var(--lgsb-weight-semibold);
    max-width: 150px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-preset-menu-size {
    color: var(--lgsb-text-muted);
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-preset-menu-sep {
    background: var(--lgsb-border);
    height: 1px;
    margin: var(--lgsb-space-1) 0;
}

#lgsb-uploader .lgsb-preset-menu-manage {
    color: var(--lgsb-teal);
    font-weight: var(--lgsb-weight-semibold);
}

/* Transient in-card max-size error (same muted brick recipe as warnings). */
#lgsb-uploader .lgsb-size-error {
    background: var(--lgsb-error-bg);
    border: 1px solid var(--lgsb-error-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-error-text);
    font-size: var(--lgsb-font-body-sm);
    line-height: 1.4;
    padding: var(--lgsb-space-2) var(--lgsb-space-3);
}

/* --- 3.9b Contour Nesting (experimental, v2.45.0) -------------------------
   Card control row: [custom checkbox] Allow Contour Nesting [info].
   Reuses the theme-proof .lgsb-select-check / .lgsb-check-box recipe; the
   control is ABSENT (not disabled) on ineligible cards, and hidden/shown
   live as resizes cross the dimension threshold. When checked, the label
   shifts to teal-dark + semibold (no extra badge row). */
#lgsb-uploader .lgsb-fc-contour {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-fc-contour[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-select-check .lgsb-contour-input {
    height: 1px;
    margin: 0;
    opacity: 0;
    position: absolute;
    width: 1px;
}

#lgsb-uploader .lgsb-contour-label {
    color: var(--lgsb-ink);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    line-height: 1.3;
    transition: color var(--lgsb-dur-fast) var(--lgsb-ease),
                font-weight var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-contour-input:checked ~ .lgsb-contour-label {
    color: var(--lgsb-teal-dark);
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-contour-busy {
    opacity: .55;
    pointer-events: none;
}

/* Info icon — bare teal icon button, matches the muted-utility recipe. */
#lgsb-uploader .lgsb-contour-info {
    align-items: center;
    background: none;
    border: 0;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    justify-content: center;
    line-height: 0;
    padding: 2px;
    transition: color var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-contour-info:hover {
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-contour-info:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

/* Contour gap row (v2.48.0) — full-width second line inside the contour
   control; only rendered/shown while the design's toggle is on. Blank input
   = inherit the design's normal gap (the placeholder mirrors it). */
#lgsb-uploader .lgsb-contour-gap {
    flex-basis: 100%;
}

#lgsb-uploader .lgsb-contour-gap[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-contour-gap-label {
    align-items: center;
    color: var(--lgsb-text-soft);
    display: flex;
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    gap: var(--lgsb-space-2);
    margin: 0;
}

#lgsb-uploader .lgsb-contour-gap-input {
    max-width: 90px;
    text-align: center;
}

/* Neutral in-card note for contour outcomes (teal info recipe, not error). */
#lgsb-uploader .lgsb-contour-note {
    background: var(--lgsb-teal-soft);
    border-left: 3px solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-body-sm);
    line-height: 1.4;
    padding: var(--lgsb-space-2) var(--lgsb-space-3);
}

/* Helper-dialog graphic: standard (stacked) vs contour (staggered). */
#lgsb-uploader .lgsb-contour-graphic {
    display: block;
    height: auto;
    margin: var(--lgsb-space-3) auto;
    max-width: 460px;
    width: 100%;
}

#lgsb-uploader .lgsb-cg-panel {
    fill: var(--lgsb-surface-alt, #F7F9FA);
    stroke: var(--lgsb-border);
}

#lgsb-uploader .lgsb-cg-title {
    fill: var(--lgsb-ink);
    font-family: var(--lgsb-font-family);
    font-size: 18px;
    font-weight: 700;
}

#lgsb-uploader .lgsb-cg-note {
    fill: var(--lgsb-teal-dark);
    font-family: var(--lgsb-font-family);
    font-size: 13px;
}

#lgsb-uploader .lgsb-cg-bounds {
    fill: none;
    stroke: var(--lgsb-text-muted);
    stroke-dasharray: 5 4;
    stroke-width: 1.5;
}

#lgsb-uploader .lgsb-cg-bounds-overlap {
    stroke: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-cg-circle {
    fill: var(--lgsb-teal-soft);
    stroke: var(--lgsb-teal);
    stroke-width: 2;
}

#lgsb-uploader .lgsb-contour-fineprint {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
}

/* --- Thin lines / small islands (underbase choke check) --- */

/* Quiet inline status while the worker measures a fresh upload. Deliberately
   NOT a warning chip — it must never amber the card. */
#lgsb-uploader .lgsb-thinline-checking {
    color: var(--lgsb-text-muted);
    font-size: 11px;
    margin: 2px 0 0;
}

/* Thin-line chip: compact stacked layout — head row (title + risk label),
   one summary sentence, then the action row. The generic warning-chip li
   centers its children; this one top-aligns so the icon sits by the title. */
#lgsb-uploader .lgsb-thinline-warn {
    align-items: flex-start;
}

#lgsb-uploader .lgsb-thinline-body {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
}

#lgsb-uploader .lgsb-thinline-head {
    align-items: baseline;
    column-gap: 8px;
    display: flex;
    flex-wrap: wrap;
}

#lgsb-uploader .lgsb-thinline-head .lgsb-warn-title {
    margin-bottom: 0;
}

/* Concise risk label beside the title ("Minor risk" / "Moderate risk" /
   "High risk"). No green tier — a clean design has no chip at all. */
#lgsb-uploader .lgsb-warn-severity {
    color: var(--lgsb-warning-text);
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-thinline-actions {
    align-items: stretch;
    display: flex;
    gap: 6px;
    margin-top: 2px;
}

/* "View affected areas" — a clear outlined action, not a text link. Teal =
   action per the semantic palette; nearly full-width within the chip. */
#lgsb-uploader .lgsb-thinline-view {
    align-items: center;
    background: var(--lgsb-surface, #fff);
    border: var(--lgsb-button-border-width) solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-teal);
    cursor: pointer;
    display: inline-flex;
    flex: 1 1 auto;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    gap: 6px;
    justify-content: center;
    line-height: 1;
    padding: 7px 10px;
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-thinline-view:hover {
    background: var(--lgsb-teal-soft);
}

#lgsb-uploader .lgsb-thinline-view svg {
    flex: 0 0 auto;
}

/* Up-chevron — collapses the chip back into the compact notices pill. */
#lgsb-uploader .lgsb-warn-collapse {
    align-items: center;
    background: none;
    border: var(--lgsb-button-border-width) solid transparent;
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-warning-text);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    justify-content: center;
    padding: 7px;
    transition: color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-warn-collapse:hover {
    color: var(--lgsb-ink);
}

/* Overlay viewer: artwork over the transparency checkerboard by default
   (black prints would vanish on a black stage), with a Dark background
   toggle matching the Layout Preview for white/light artwork. The mask is
   recolored client-side (editable) and can punch out for print preview. */
#lgsb-uploader .lgsb-modal--thinline {
    max-height: 90vh;
    max-width: 720px;
    overflow: auto;
}

/* Toolbar above the stage: Highlight | Print preview + optional mask color
   on the left; Dark background switch on the right. */
#lgsb-uploader .lgsb-thinline-toolbar {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2) var(--lgsb-space-3);
    justify-content: flex-start;
    margin: var(--lgsb-space-3) 0 0;
}

#lgsb-uploader .lgsb-thinline-toolbar .lgsb-lp-dark-toggle {
    margin-left: auto;
}

/* Same segmented recipe as .lgsb-semitrans-compare (Highlight / Print preview). */
#lgsb-uploader .lgsb-thinline-mode {
    background: var(--lgsb-bg-soft, #F2F4F5);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    display: inline-flex;
    gap: 2px;
    padding: 2px;
}

#lgsb-uploader .lgsb-thinline-mode-btn {
    background: none;
    border: 0;
    border-radius: calc(var(--lgsb-radius-input) - 2px);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    line-height: 1;
    padding: 6px 12px;
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-thinline-mode-btn.is-active {
    background: var(--lgsb-surface);
    box-shadow: var(--lgsb-shadow-card, 0 1px 2px rgba(0, 0, 0, .12));
    color: var(--lgsb-ink);
}

#lgsb-uploader .lgsb-thinline-colorwrap {
    align-items: center;
    display: inline-flex;
    flex-wrap: wrap;
    gap: 6px 8px;
}

/* display:inline-flex above beats the UA's [hidden] rule — restate it. */
#lgsb-uploader .lgsb-thinline-colorwrap[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-thinline-colorlabel {
    color: var(--lgsb-text-muted);
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .02em;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-thinline-presets {
    display: inline-flex;
    gap: 4px;
}

#lgsb-uploader .lgsb-thinline-preset {
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06);
    cursor: pointer;
    flex: 0 0 18px;
    height: 18px;
    padding: 0;
    width: 18px;
}

#lgsb-uploader .lgsb-thinline-preset.is-active {
    border-color: var(--lgsb-ink);
    box-shadow: 0 0 0 2px var(--lgsb-surface), 0 0 0 3px var(--lgsb-ink);
}

#lgsb-uploader .lgsb-thinline-color {
    background: transparent;
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    cursor: pointer;
    height: 28px;
    padding: 2px;
    width: 36px;
}

#lgsb-uploader .lgsb-thinline-stage {
    align-items: center;
    /* Same checkerboard recipe as the Layout Preview sheet. */
    background-color: var(--lgsb-surface);
    background-image:
        linear-gradient(45deg, #E9EDEF 25%, transparent 25%, transparent 75%, #E9EDEF 75%),
        linear-gradient(45deg, #E9EDEF 25%, transparent 25%, transparent 75%, #E9EDEF 75%);
    background-position: 0 0, 8px 8px;
    background-size: 16px 16px;
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    display: flex;
    justify-content: center;
    margin: var(--lgsb-space-2) 0 var(--lgsb-space-3);
    min-height: 180px;
    padding: var(--lgsb-space-3);
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-thinline-stage.lgsb-thinline-dark {
    background-color: #000;
    background-image: none;
    border-color: #3A3F43;
}

/* Thumbnail enlarge modal — reuses .lgsb-modal--thinline + stage/toggle. */
#lgsb-uploader .lgsb-modal--thumbpreview .lgsb-thumbpreview-meta {
    color: var(--lgsb-text-muted);
    font-size: 13px;
    margin: 0;
}

#lgsb-uploader .lgsb-modal--thumbpreview .lgsb-thinline-toolbar {
    /* When dimensions are omitted the toolbar is the first body child. */
    margin-top: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-thinline-canvas {
    cursor: grab;
    display: block;
    max-width: 100%;
    /* Pinch/drag are handled on the canvas itself — never scroll the page. */
    touch-action: none;
}

#lgsb-uploader .lgsb-thinline-canvas.lgsb-thinline-panning {
    cursor: grabbing;
}

/* Zoom toolbar between the stage and the legend. */
#lgsb-uploader .lgsb-thinline-zoom {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin: 0 0 var(--lgsb-space-2);
}

/* display:flex above beats the UA's [hidden] rule — restate it (every
   modal renders the bar hidden until its stage image loads). */
#lgsb-uploader .lgsb-thinline-zoom[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-thinline-zoombtn {
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-ink);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    line-height: 1;
    min-width: 30px;
    padding: 6px 9px;
}

#lgsb-uploader .lgsb-thinline-zoombtn:hover {
    border-color: var(--lgsb-primary);
    color: var(--lgsb-primary);
}

/* Before/after compare toggle (edit modal): filled while comparing. */
#lgsb-uploader .lgsb-edit-cmp-btn.is-active {
    background: var(--lgsb-primary);
    border-color: var(--lgsb-primary);
    color: #fff;
}

#lgsb-uploader .lgsb-edit-cmp-btn.is-active:hover {
    color: #fff;
}

/* Hand/pan toggle (v2.118.0): filled while pan overrides the tools. The
   SVG hand sits on the same baseline as the text buttons around it. */
#lgsb-uploader .lgsb-edit-pan-btn svg {
    display: block;
}

#lgsb-uploader .lgsb-edit-pan-btn.is-active {
    background: var(--lgsb-primary);
    border-color: var(--lgsb-primary);
    color: #fff;
}

#lgsb-uploader .lgsb-edit-pan-btn.is-active:hover {
    color: #fff;
}

/* While pan mode is on, the stage always reads as grabbable — beats the
   pickmode/brushmode cursors (those classes are dropped in JS anyway). */
#lgsb-uploader .lgsb-edit-stage.lgsb-edit-panmode .lgsb-thinline-canvas {
    cursor: grab;
}

#lgsb-uploader .lgsb-thinline-zoomhint {
    color: var(--lgsb-text-muted);
    font-size: 11px;
    margin-left: auto;
}

#lgsb-uploader .lgsb-thinline-loading {
    color: var(--lgsb-ink);
    font-size: 13px;
    opacity: .75;
}

#lgsb-uploader .lgsb-thinline-dark .lgsb-thinline-loading {
    color: #fff;
}

/* --- Fix Thin Lines dialog (v2.127.0) --------------------------------- */

/* "Fix it for me" — the chip's primary action: filled teal, sits ahead of
   the outlined "View affected areas" (same geometry so the pair reads as
   one control group). */
#lgsb-uploader .lgsb-thinline-fix {
    align-items: center;
    background: var(--lgsb-teal);
    border: var(--lgsb-button-border-width) solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-input);
    color: #fff;
    cursor: pointer;
    display: inline-flex;
    flex: 1 1 auto;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    gap: 6px;
    justify-content: center;
    line-height: 1;
    padding: 7px 10px;
    transition: filter var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-thinline-fix:hover {
    filter: brightness(1.08);
}

#lgsb-uploader .lgsb-thinline-fix svg {
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-thinfix-intro,
#lgsb-uploader .lgsb-thinfix-sizenote {
    color: var(--lgsb-ink);
    font-size: 13px;
    line-height: 1.5;
    margin: 0 0 var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-thinfix-sizenote {
    color: var(--lgsb-text-muted);
}

/* Print-size row: label + two aspect-linked inch inputs. */
#lgsb-uploader .lgsb-thinfix-sizes {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
    margin: var(--lgsb-space-3) 0 var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-thinfix-sizelabel {
    font-size: 13px;
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-thinfix-sizes input[type="number"] {
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-ink);
    font-family: inherit;
    font-size: 14px;
    padding: 7px 8px;
    text-align: center;
    width: 84px;
}

#lgsb-uploader .lgsb-thinfix-sizes input[type="number"]:focus {
    border-color: var(--lgsb-primary);
    outline: none;
}

#lgsb-uploader .lgsb-thinfix-x,
#lgsb-uploader .lgsb-thinfix-unit {
    color: var(--lgsb-text-muted);
    font-size: 13px;
}

/* Live verdict at the typed size — ok / warn / bad recolor via data-level. */
#lgsb-uploader .lgsb-thinfix-risk {
    border-radius: var(--lgsb-radius-sm);
    font-size: 12.5px;
    line-height: 1.5;
    margin: 0;
    padding: 8px 10px;
}

#lgsb-uploader .lgsb-thinfix-risk[data-level="ok"] {
    background: var(--lgsb-success-bg, #e8f5ee);
    color: var(--lgsb-success-text, #1e7a46);
}

#lgsb-uploader .lgsb-thinfix-risk[data-level="warn"] {
    background: var(--lgsb-warning-bg, #fdf3e4);
    color: var(--lgsb-warning-text, #8a5a19);
}

#lgsb-uploader .lgsb-thinfix-risk[data-level="bad"] {
    background: var(--lgsb-error-bg);
    color: var(--lgsb-error-text);
}

/* Working state: centered spinner + copy while the worker repairs. */
#lgsb-uploader .lgsb-thinfix-working {
    align-items: center;
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    padding: var(--lgsb-space-5) 0;
    text-align: center;
}

#lgsb-uploader .lgsb-thinfix-working-title {
    font-size: 14px;
    font-weight: var(--lgsb-weight-bold);
    margin: 0;
}

#lgsb-uploader .lgsb-thinfix-working-note {
    color: var(--lgsb-text-muted);
    font-size: 12.5px;
    margin: 0;
}

/* Compare stage caption: the size the fix is valid for. */
#lgsb-uploader .lgsb-thinfix-sizecap {
    color: var(--lgsb-text-muted);
    font-size: 12px;
    line-height: 1.5;
    margin: 0;
}

#lgsb-uploader .lgsb-thinline-legend {
    align-items: center;
    display: flex;
    font-size: 12px;
    gap: 8px;
    margin: 0 0 var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-thinline-swatch {
    background: rgba(230, 57, 70, .69);
    border-radius: 3px;
    display: inline-block;
    flex: 0 0 14px;
    height: 14px;
    width: 14px;
}

/* Print-preview legend: hollow checkerboard chip (areas removed = transparent). */
#lgsb-uploader .lgsb-thinline-swatch--preview {
    background-color: var(--lgsb-surface);
    background-image:
        linear-gradient(45deg, #E9EDEF 25%, transparent 25%, transparent 75%, #E9EDEF 75%),
        linear-gradient(45deg, #E9EDEF 25%, transparent 25%, transparent 75%, #E9EDEF 75%);
    background-position: 0 0, 3px 3px;
    background-size: 6px 6px;
    border: 1px solid var(--lgsb-border);
    box-sizing: border-box;
}

/* Detailed explanation inside the viewer ("Why this matters" / "What you
   can do") — this copy lives ONLY here, never in the design-card chip. */
#lgsb-uploader .lgsb-thinline-details {
    border-top: 1px solid var(--lgsb-border);
    margin-top: var(--lgsb-space-2);
    padding-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-thinline-details-title {
    color: var(--lgsb-ink);
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    margin: 0 0 4px;
}

#lgsb-uploader .lgsb-thinline-details p {
    color: var(--lgsb-text);
    font-size: 12px;
    line-height: 1.5;
    margin: 0 0 var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-thinline-details-list {
    color: var(--lgsb-text);
    font-size: 12px;
    line-height: 1.6;
    list-style: disc;
    margin: 0;
    padding-left: 18px;
}

/* ---------------------------------------------------------------------
   Semi-transparency review dialog + halftone pipeline
   Reuses the thin-line viewer recipe (stage, dark toggle, zoom, canvas) so
   the two checks read as one tool; only the semitrans-specific chrome is
   defined here. */

/* "Review transparency" chip action — same outlined-teal recipe as the
   thin-line "View affected areas" button (kept as its own class so the two
   click handlers can't cross-fire). */
#lgsb-uploader .lgsb-semitrans-review {
    align-items: center;
    background: var(--lgsb-surface, #fff);
    border: var(--lgsb-button-border-width) solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-teal);
    cursor: pointer;
    display: inline-flex;
    flex: 1 1 auto;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    gap: 6px;
    justify-content: center;
    line-height: 1;
    padding: 7px 10px;
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-semitrans-review:hover {
    background: var(--lgsb-teal-soft);
}

#lgsb-uploader .lgsb-semitrans-review svg {
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-semitrans-chip-actions {
    display: flex;
    margin-top: 6px;
}

/* A READY halftone fully retires the warning chip — the design is fixed, so
   no amber border, no Review badge, no notices pill. The li stays in the DOM
   (hidden) so Undo or a failed regeneration can re-arm it. */
#lgsb-uploader .lgsb-file-warnings li.lgsb-warn-resolved {
    display: none;
}

/* Compact "Halftoned" tag above the card footer — quiet success chrome in
   minimal space; click re-opens the review dialog (compare / undo). */
#lgsb-uploader .lgsb-ht-donetag {
    align-items: center;
    align-self: flex-start;
    background: var(--lgsb-success-bg);
    border: none;
    border-radius: var(--lgsb-radius-pill);
    color: var(--lgsb-success-text);
    cursor: pointer;
    display: inline-flex;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    gap: 5px;
    line-height: 1;
    padding: 4px 12px;
    width: fit-content;
}

#lgsb-uploader .lgsb-ht-donetag svg {
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-ht-donetag:hover span {
    text-decoration: underline;
    text-underline-offset: 2px;
}

/* =========================================================================
   Design Tools (v3.0) — per-card Edit button + edit modal (Color Overlay).
   ========================================================================= */

/* Design Tools button in the card header: the open space in .lgsb-fc-title
   under the status badge, right of the thumbnail. Deliberately heavier than
   the old "Edit" chip (v2.107.0) so the editing suite reads as a real
   feature, while the filled-teal ordering actions stay primary. */
#lgsb-uploader .lgsb-edit-btn {
    align-items: center;
    /* Sized by its content and parked at the column's left, like the card's
       other actions. The 10px reserve is the guarantee it never reaches the
       trash button, which is absolutely positioned at the column's right. */
    align-self: flex-start;
    background: var(--lgsb-teal-soft);
    border: 1px solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-teal-dark);
    cursor: pointer;
    display: inline-flex;
    font-family: var(--lgsb-font-family);
    font-size: 10px;
    font-weight: var(--lgsb-weight-bold);
    gap: 6px;
    justify-content: center;
    letter-spacing: .03em;
    line-height: 1;
    margin-top: 5px;
    max-width: calc(100% - 10px);
    padding: 7px 11px;
    text-transform: uppercase;
    transition: box-shadow var(--lgsb-dur-fast) var(--lgsb-ease);
    white-space: nowrap;
}

/* The icon and label are one unit: the negative end margin cancels the gap
   uppercase tracking leaves after the final letter, and the ellipsis keeps
   the label inside the button on the grid's narrowest cards, where it can
   out-measure the column. */
#lgsb-uploader .lgsb-edit-btn span {
    margin-right: -.03em;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Inset-overlay hover (proven against Divi opacity/filter resets). */
#lgsb-uploader .lgsb-edit-btn:hover {
    box-shadow: inset 0 0 0 999px rgba(6, 124, 145, .08);
}

#lgsb-uploader .lgsb-edit-btn svg {
    flex: 0 0 auto;
}

/* "Edited" tag above the card footer — same recipe as .lgsb-ht-donetag. */
#lgsb-uploader .lgsb-edit-donetag {
    align-items: center;
    align-self: flex-start;
    background: var(--lgsb-success-bg);
    border: none;
    border-radius: var(--lgsb-radius-pill);
    color: var(--lgsb-success-text);
    cursor: pointer;
    display: inline-flex;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    gap: 5px;
    line-height: 1;
    padding: 4px 12px;
    width: fit-content;
}

#lgsb-uploader .lgsb-edit-donetag svg {
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-edit-donetag:hover span {
    text-decoration: underline;
    text-underline-offset: 2px;
}

/* --- Edit modal ---------------------------------------------------------- */

/* Tool bar (v2.107.0) — an icon-over-label toolbar pinned under the modal
   header, evenly divided on desktop and horizontally scrollable when the
   builder column is narrow. The active tool is marked by the teal underline
   alone; a filled tab would compete with the artwork below it. */
#lgsb-uploader .lgsb-edit-tabs {
    background: var(--lgsb-bg-soft, #F2F4F5);
    border-bottom: 1px solid var(--lgsb-border);
    display: flex;
    flex: 0 0 auto;
    gap: 0;
    overflow-x: auto;
    padding: 0 var(--lgsb-space-3);
    scrollbar-width: none;
}

#lgsb-uploader .lgsb-edit-tabs::-webkit-scrollbar {
    display: none;
}

#lgsb-uploader .lgsb-edit-tab {
    align-items: center;
    background: none;
    border: 0;
    border-bottom: 2px solid transparent;
    border-radius: 0;
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: flex;
    flex: 1 1 0;
    flex-direction: column;
    font-family: inherit;
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    gap: 6px;
    line-height: 1.15;
    min-width: 76px;
    padding: 10px 6px 8px;
    text-align: center;
    transition: color var(--lgsb-dur-base) var(--lgsb-ease),
                border-color var(--lgsb-dur-base) var(--lgsb-ease);
    /* "Replace Colors" wraps to two lines instead of being clipped. */
    white-space: normal;
}

/* Fixed height so tabs whose label wraps to two lines keep their glyphs on
   the same baseline as the rest of the bar. */
#lgsb-uploader .lgsb-edit-tab-ico {
    align-items: center;
    display: flex;
    flex: 0 0 auto;
    height: 20px;
    justify-content: center;
}

#lgsb-uploader .lgsb-edit-tab:hover:not(.is-active) {
    color: var(--lgsb-ink);
}

#lgsb-uploader .lgsb-edit-tab.is-active {
    border-bottom-color: var(--lgsb-teal);
    color: var(--lgsb-teal-dark);
}

/* Keep the focus ring readable against the toolbar's flush edges. */
#lgsb-uploader .lgsb-edit-tab:focus-visible {
    border-radius: var(--lgsb-radius-sm);
}

/* Each tool's control panel stacks its rows like .lgsb-edit-controls. */
#lgsb-uploader .lgsb-edit-panel {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

#lgsb-uploader .lgsb-edit-panel[hidden] {
    display: none;
}

/* Remove-color eyedropper mode: the stage bitmap is the picker. */
#lgsb-uploader .lgsb-edit-stage.lgsb-edit-pickmode .lgsb-thinline-canvas {
    cursor: crosshair;
}

/* Crop tab: drags manipulate the crop rect, not the pan. */
#lgsb-uploader .lgsb-edit-stage.lgsb-edit-cropmode .lgsb-thinline-canvas {
    cursor: crosshair;
}

/* The busy overlay is absolutely positioned inside the stage. */
#lgsb-uploader .lgsb-modal--edit .lgsb-thinline-stage {
    /* The overlay controls below replaced the rows above/under the stage,
       so the old gap toward the (removed) zoom row is reclaimed too. */
    margin-bottom: 0;
    position: relative;
}

/* v2.115.1 — stage overlay controls: the dark-background moon (same recipe
   as the card-thumb toggle) and the zoom pill float OVER the artwork
   instead of consuming layout rows; the reclaimed height goes to tall
   designs. Corners are chosen to stay clear of centered artwork: moon
   top-right, zoom bottom-left. */
#lgsb-uploader .lgsb-edit-dark-btn {
    align-items: center;
    background: rgba(0, 0, 0, .50);
    border: 0;
    border-radius: var(--lgsb-radius-sm);
    color: #fff;
    cursor: pointer;
    display: flex;
    height: 28px;
    justify-content: center;
    padding: 0;
    position: absolute;
    right: 8px;
    top: 8px;
    width: 28px;
    z-index: 2;
}

#lgsb-uploader .lgsb-edit-dark-btn svg {
    height: 14px;
    width: 14px;
}

#lgsb-uploader .lgsb-edit-dark-btn:hover {
    background: rgba(0, 0, 0, .68);
}

#lgsb-uploader .lgsb-edit-dark-btn.is-active {
    background: rgba(255, 255, 255, .30);
    color: #000;
}

#lgsb-uploader .lgsb-edit-dark-btn.is-active:hover {
    background: rgba(255, 255, 255, .45);
}

/* The pill keeps its light surface in dark mode too — contrast against a
   black stage is the point. */
#lgsb-uploader .lgsb-modal--edit .lgsb-edit-zoom {
    background: rgba(255, 255, 255, .92);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    bottom: 8px;
    box-shadow: 0 2px 8px rgba(17, 17, 17, .12);
    flex-wrap: nowrap;
    left: 8px;
    margin: 0;
    padding: 4px;
    position: absolute;
    z-index: 2;
}

#lgsb-uploader .lgsb-edit-controls {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: var(--lgsb-space-3);
}

/* Checkbox row (Remove Color's "Clean edges" defringe toggle). */
#lgsb-uploader .lgsb-edit-checkrow {
    align-items: center;
    color: var(--lgsb-ink);
    cursor: pointer;
    display: flex;
    font-size: var(--lgsb-font-body-sm);
    gap: 8px;
}

#lgsb-uploader .lgsb-edit-checkrow input {
    accent-color: var(--lgsb-teal);
    cursor: pointer;
    flex: 0 0 auto;
    height: 16px;
    margin: 0;
    width: 16px;
}

#lgsb-uploader .lgsb-edit-swatches {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

#lgsb-uploader .lgsb-edit-swatch {
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06);
    cursor: pointer;
    height: 28px;
    padding: 0;
    transition: transform var(--lgsb-dur-fast) var(--lgsb-ease),
                box-shadow var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 28px;
}

#lgsb-uploader .lgsb-edit-swatch:hover {
    transform: scale(1.12);
}

#lgsb-uploader .lgsb-edit-swatch.is-active {
    box-shadow: 0 0 0 2px var(--lgsb-surface), 0 0 0 4px var(--lgsb-teal);
}

/* Custom color: native picker styled as one more swatch + label. */
#lgsb-uploader .lgsb-edit-custom {
    align-items: center;
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    font-size: 11px;
    font-weight: var(--lgsb-weight-semibold);
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-color-input {
    background: none;
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    cursor: pointer;
    height: 28px;
    padding: 2px;
    width: 28px;
}

/* Shaded / Solid segmented toggle — same recipe as .lgsb-semitrans-compare. */
#lgsb-uploader .lgsb-edit-mode {
    align-self: flex-start;
    background: var(--lgsb-bg-soft, #F2F4F5);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    display: inline-flex;
    gap: 2px;
    padding: 2px;
}

#lgsb-uploader .lgsb-edit-mode-btn {
    background: none;
    border: 0;
    border-radius: calc(var(--lgsb-radius-input) - 2px);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    line-height: 1;
    padding: 6px 12px;
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-edit-mode-btn.is-active {
    background: var(--lgsb-surface);
    box-shadow: var(--lgsb-shadow-card, 0 1px 2px rgba(0, 0, 0, .12));
    color: var(--lgsb-ink);
}

#lgsb-uploader .lgsb-edit-modehint {
    color: var(--lgsb-text-muted);
    font-size: 12px;
    margin: 0;
}

/* Undo / Reset live on one row inside the stacked actions column. */
#lgsb-uploader .lgsb-edit-history {
    display: flex;
    gap: 8px;
}

#lgsb-uploader .lgsb-edit-history .lgsb-modal-btn {
    flex: 1 1 0;
}

#lgsb-uploader .lgsb-edit-note-error {
    color: var(--lgsb-error-text);
}

/* --- Replace Colors (palette remap) --- */

#lgsb-uploader .lgsb-edit-palette {
    display: flex;
    flex-wrap: wrap;
    gap: 8px 14px;
}

#lgsb-uploader .lgsb-edit-palrow {
    align-items: center;
    cursor: pointer;
    display: inline-flex;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-palfrom {
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06);
    display: inline-block;
    height: 26px;
    width: 26px;
}

#lgsb-uploader .lgsb-edit-palarrow {
    color: var(--lgsb-text-muted);
    font-size: 13px;
}

#lgsb-uploader .lgsb-edit-palto {
    background: none;
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    cursor: pointer;
    height: 30px;
    padding: 2px;
    width: 30px;
}

/* --- Remove Color --- */

/* (Legacy Remove Color chip row — unused since v2.116.0; kept one release
   for cached JS that may still render it.) */
#lgsb-uploader .lgsb-edit-rc-picked {
    align-items: center;
    display: flex;
    gap: 8px;
}

/* Checkerboard placeholder until a color is picked. */
#lgsb-uploader .lgsb-edit-rc-chip {
    background-image: linear-gradient(45deg, #d8dcdf 25%, transparent 25%, transparent 75%, #d8dcdf 75%),
                      linear-gradient(45deg, #d8dcdf 25%, transparent 25%, transparent 75%, #d8dcdf 75%);
    background-position: 0 0, 5px 5px;
    background-size: 10px 10px;
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    flex: 0 0 auto;
    height: 26px;
    width: 26px;
}

#lgsb-uploader .lgsb-edit-rc-chip.is-set {
    background-image: none;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .08);
}

#lgsb-uploader .lgsb-edit-rc-label {
    color: var(--lgsb-text-muted);
    font-size: 12px;
}

/* --- Shared slider rows (tolerance, softness, intensity, feature size) --- */

#lgsb-uploader .lgsb-edit-sliderrow {
    align-items: center;
    display: flex;
    gap: 10px;
}

#lgsb-uploader .lgsb-edit-sliderrow > span:first-child {
    color: var(--lgsb-text-muted);
    flex: 0 0 92px;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-edit-sliderrow input[type="range"] {
    accent-color: var(--lgsb-teal);
    flex: 1 1 auto;
    margin: 0;
    min-width: 0;
}

#lgsb-uploader .lgsb-edit-sliderval {
    color: var(--lgsb-ink);
    flex: 0 0 34px;
    font-size: 12px;
    font-variant-numeric: tabular-nums;
    font-weight: var(--lgsb-weight-bold);
    text-align: right;
}

/* --- Distress --- */

#lgsb-uploader .lgsb-edit-textures {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-texture-btn {
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-pill);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    line-height: 1;
    padding: 7px 12px;
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease),
                border-color var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-edit-texture-btn.is-active {
    background: var(--lgsb-teal-tint, #E7F3F4);
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
}

#lgsb-uploader .lgsb-edit-ds-reroll {
    align-self: flex-start;
    background: none;
    border: 1px dashed var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    padding: 6px 12px;
}

#lgsb-uploader .lgsb-edit-ds-reroll:hover {
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
}

/* --- Transform (v2.129.0): Crop / Rotate & Flip / Erase sub-modes --- */

#lgsb-uploader .lgsb-edit-crop-readout {
    color: var(--lgsb-ink);
    font-size: 13px;
    font-variant-numeric: tabular-nums;
    font-weight: var(--lgsb-weight-semibold);
    margin: 0;
}

/* Sub-mode row containers stack like the panel itself; the explicit
   [hidden] override is needed because display:flex beats the UA rule. */
#lgsb-uploader .lgsb-edit-xf-croprows,
#lgsb-uploader .lgsb-edit-xf-rotaterows,
#lgsb-uploader .lgsb-edit-xf-eraserows {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

#lgsb-uploader .lgsb-edit-xf-croprows[hidden],
#lgsb-uploader .lgsb-edit-xf-rotaterows[hidden],
#lgsb-uploader .lgsb-edit-xf-eraserows[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-edit-xf-rotgrid {
    display: grid;
    gap: 8px;
    grid-template-columns: repeat(2, minmax(0, 1fr));
}

#lgsb-uploader .lgsb-edit-xfrot {
    align-items: center;
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-ink);
    cursor: pointer;
    display: inline-flex;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    gap: 8px;
    justify-content: flex-start;
    line-height: 1;
    min-width: 0;
    padding: 8px 10px;
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease),
                border-color var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-edit-xfrot svg {
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-edit-xfrot span {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-edit-xfrot:hover {
    background: var(--lgsb-teal-tint, #E7F3F4);
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
}

#lgsb-uploader .lgsb-edit-xf-rotreadout {
    color: var(--lgsb-ink);
    font-size: 13px;
    font-variant-numeric: tabular-nums;
    font-weight: var(--lgsb-weight-semibold);
    margin: 0;
}

#lgsb-uploader .lgsb-edit-xf-rotreset,
#lgsb-uploader .lgsb-edit-xf-eraseundo,
#lgsb-uploader .lgsb-edit-xf-eraseclear {
    align-self: flex-start;
    background: none;
    border: 1px dashed var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    padding: 6px 12px;
}

#lgsb-uploader .lgsb-edit-xf-rotreset:hover,
#lgsb-uploader .lgsb-edit-xf-eraseundo:hover:not(:disabled),
#lgsb-uploader .lgsb-edit-xf-eraseclear:hover:not(:disabled) {
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
}

#lgsb-uploader .lgsb-edit-xf-eraseundo:disabled,
#lgsb-uploader .lgsb-edit-xf-eraseclear:disabled {
    cursor: default;
    opacity: .45;
}

#lgsb-uploader .lgsb-edit-xf-erasebtns {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

/* --- Adjust --- */

#lgsb-uploader .lgsb-edit-adj-reset {
    align-self: flex-start;
    background: none;
    border: 1px dashed var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    padding: 6px 12px;
}

#lgsb-uploader .lgsb-edit-adj-reset:hover {
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
}

/* --- Remove Background (working-mask session, v2.116.0) --- */

#lgsb-uploader .lgsb-edit-bg-auto {
    width: 100%;
}

/* Status line under the Auto button: pending / ready / warning / error. */
#lgsb-uploader .lgsb-edit-bg-status {
    border-radius: var(--lgsb-radius-sm);
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    margin: 0;
    padding: 8px 10px;
    background: var(--lgsb-bg-soft, #F2F4F5);
    color: var(--lgsb-ink);
}

#lgsb-uploader .lgsb-edit-bg-status.is-pending {
    background: var(--lgsb-bg-soft, #F2F4F5);
    color: var(--lgsb-text-muted);
}

#lgsb-uploader .lgsb-edit-bg-status.is-warn {
    background: #FFF6E5;
    color: #8A5A00;
}

#lgsb-uploader .lgsb-edit-bg-status.is-error {
    background: #FDECEA;
    color: var(--lgsb-error-text, #C62828);
}

/* Inspection row: Result/Original/Removed pills + backdrop swatches. */
#lgsb-uploader .lgsb-edit-bg-viewrow {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    justify-content: space-between;
}

#lgsb-uploader .lgsb-edit-bg-backdrops {
    display: flex;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-bgdrop {
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    cursor: pointer;
    height: 22px;
    padding: 0;
    width: 22px;
}

#lgsb-uploader .lgsb-edit-bgdrop.is-active {
    box-shadow: 0 0 0 2px var(--lgsb-surface), 0 0 0 4px var(--lgsb-teal);
}

#lgsb-uploader .lgsb-edit-bgdrop-sw-checker {
    background-color: #fff;
    background-image:
        linear-gradient(45deg, #D9DEE1 25%, transparent 25%, transparent 75%, #D9DEE1 75%),
        linear-gradient(45deg, #D9DEE1 25%, transparent 25%, transparent 75%, #D9DEE1 75%);
    background-position: 0 0, 5px 5px;
    background-size: 10px 10px;
}

#lgsb-uploader .lgsb-edit-bgdrop-sw-white { background: #fff; }
#lgsb-uploader .lgsb-edit-bgdrop-sw-black { background: #000; }
#lgsb-uploader .lgsb-edit-bgdrop-sw-gray  { background: #808080; }

/* Stage backdrops (bg tab only). Placed after the checkerboard/dark rules
   so they win the same-specificity fight. */
#lgsb-uploader .lgsb-edit-stage.lgsb-edit-bgdrop-white {
    background-color: #fff;
    background-image: none;
}

#lgsb-uploader .lgsb-edit-stage.lgsb-edit-bgdrop-black {
    background-color: #000;
    background-image: none;
}

#lgsb-uploader .lgsb-edit-stage.lgsb-edit-bgdrop-gray {
    background-color: #808080;
    background-image: none;
}

/* Protect paints with a canvas-drawn brush ring — hide the OS cursor. */
#lgsb-uploader .lgsb-edit-stage.lgsb-edit-brushmode .lgsb-thinline-canvas {
    cursor: none;
}

/* Section label between the AI button and the fix-up tools. */
#lgsb-uploader .lgsb-edit-bg-subhead {
    border-top: 1px solid var(--lgsb-border);
    color: var(--lgsb-text-muted);
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .06em;
    margin: 4px 0 0;
    padding-top: 12px;
    text-transform: uppercase;
}

/* Sub-rows of the active fix-up mode stack like the panel itself.
   (v2.118.0: -colorrows replaced -rules — Pick Color is a first-class
   fix-up mode now, not a "More removal options" resident.) */
#lgsb-uploader .lgsb-edit-bg-removerows,
#lgsb-uploader .lgsb-edit-bg-protectrows,
#lgsb-uploader .lgsb-edit-bg-colorrows,
#lgsb-uploader .lgsb-edit-bg-rulecontrols {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

#lgsb-uploader .lgsb-edit-bg-removerows[hidden],
#lgsb-uploader .lgsb-edit-bg-protectrows[hidden],
#lgsb-uploader .lgsb-edit-bg-colorrows[hidden],
#lgsb-uploader .lgsb-edit-bg-rulecontrols[hidden],
#lgsb-uploader .lgsb-edit-bg-startover[hidden] {
    display: none;
}

/* "More options" — Clean Edges lives behind it. */
#lgsb-uploader .lgsb-edit-bg-more {
    border-top: 1px solid var(--lgsb-border);
    padding-top: 10px;
}

#lgsb-uploader .lgsb-edit-bg-more > summary {
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    text-transform: uppercase;
    user-select: none;
}

#lgsb-uploader .lgsb-edit-bg-more[open] > summary {
    color: var(--lgsb-ink);
    margin-bottom: 10px;
}

#lgsb-uploader .lgsb-edit-bg-more .lgsb-edit-checkrow {
    margin-top: 10px;
}

/* --- Knockout Color (v2.121.0) --- */

/* Picked-color chip + the "click to pick" hint on one row. */
#lgsb-uploader .lgsb-edit-ko-pickrow {
    align-items: center;
    display: flex;
    gap: 8px;
    min-height: 28px;
}

#lgsb-uploader .lgsb-edit-ko-chip {
    align-items: center;
    background: var(--lgsb-bg-soft, #F2F4F5);
    border: 1px solid var(--lgsb-border);
    border-radius: 999px;
    display: inline-flex;
    gap: 6px;
    padding: 3px 10px 3px 4px;
}

/* inline-flex above beats the UA's [hidden]{display:none} — restore it so
   koReset() can hide the chip after a discard. */
#lgsb-uploader .lgsb-edit-ko-chip[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-edit-ko-chip-sw {
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06);
    display: inline-block;
    height: 20px;
    width: 20px;
}

#lgsb-uploader .lgsb-edit-ko-chip-hex {
    color: var(--lgsb-ink);
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-edit-ko-pickhint {
    color: var(--lgsb-text-muted);
    font-size: 12px;
}

/* Pre-apply "Preview halftone dots" (v2.126.0) — same full-width treatment
   as the Remove Background Auto button. */
#lgsb-uploader .lgsb-edit-ko-prevdots {
    width: 100%;
}

/* Shirt-color preview swatches (stage backdrop fill — UI only). */
#lgsb-uploader .lgsb-edit-ko-droprow {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

#lgsb-uploader .lgsb-edit-ko-droplabel {
    color: var(--lgsb-text-muted);
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-edit-ko-drops {
    align-items: center;
    display: inline-flex;
    flex-wrap: wrap;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-ko-drop {
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06);
    cursor: pointer;
    height: 22px;
    padding: 0;
    width: 22px;
}

#lgsb-uploader .lgsb-edit-ko-drop.is-active {
    box-shadow: 0 0 0 2px var(--lgsb-surface), 0 0 0 4px var(--lgsb-teal);
}

/* Transparent backdrop swatch: a tiny checkerboard chip. */
#lgsb-uploader .lgsb-edit-ko-drop--trans {
    background: repeating-conic-gradient(#cdd3da 0% 25%, #ffffff 0% 50%);
    background-size: 10px 10px;
}

/* "Knocked-out color" swatch: mirrors the eyedropped pick (inline style
   set by syncKoUi); disabled/hollow until a color has been picked. */
#lgsb-uploader .lgsb-edit-ko-drop--picked:disabled {
    background:
        linear-gradient(to top right,
            transparent calc(50% - 1px), var(--lgsb-border) calc(50% - 1px),
            var(--lgsb-border) calc(50% + 1px), transparent calc(50% + 1px));
    cursor: not-allowed;
    opacity: .5;
}

#lgsb-uploader .lgsb-edit-ko-dropcustom {
    cursor: pointer;
    display: inline-flex;
}

#lgsb-uploader .lgsb-edit-ko-dropinput {
    background: none;
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    cursor: pointer;
    height: 22px;
    padding: 2px;
    width: 22px;
}

#lgsb-uploader .lgsb-edit-ko-scope {
    margin-top: 10px;
}

#lgsb-uploader .lgsb-edit-ko-more .lgsb-edit-modehint {
    margin-top: 8px;
}

/* Chained-halftone preview state (v2.125.0): the dots draw THROUGH the
   stage canvas (same zoom/pan pipeline as every tool preview), so the
   zoom bar stays live and the customer can inspect the dots up close.
   Clicking the canvas returns to the editable knockout result. */
#lgsb-uploader .lgsb-edit-stage.lgsb-edit-ko-htpreview .lgsb-thinline-canvas {
    cursor: pointer;
}

/* Disclaimer pill — sits ABOVE the floating zoom bar (v2.126.0: the bar
   gained Before/After and was covering the pill at bottom: 8px). Solid
   surface so it reads on both the checkerboard and the dark backdrop. */
#lgsb-uploader .lgsb-edit-ko-htnote {
    background: rgba(255, 255, 255, .88);
    border-radius: var(--lgsb-radius-sm);
    bottom: 48px;
    box-shadow: 0 1px 4px rgba(0, 0, 0, .12);
    color: var(--lgsb-ink);
    font-size: 11px;
    left: 50%;
    line-height: 1.35;
    margin: 0;
    max-width: calc(100% - 24px);
    padding: 4px 12px;
    pointer-events: none;
    position: absolute;
    text-align: center;
    transform: translateX(-50%);
    z-index: 1;
}

#lgsb-uploader .lgsb-edit-bg-rulechips {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-bg-rulechips:empty {
    display: none;
}

#lgsb-uploader .lgsb-edit-bg-rulepick {
    align-items: center;
    background: none;
    border: 0;
    color: inherit;
    cursor: pointer;
    display: inline-flex;
    font: inherit;
    gap: 6px;
    padding: 0;
}

#lgsb-uploader .lgsb-edit-bg-rulechip.is-selected {
    border-color: var(--lgsb-teal);
    box-shadow: 0 0 0 1px var(--lgsb-teal) inset;
}

#lgsb-uploader .lgsb-edit-bg-startover {
    align-self: flex-start;
    background: none;
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    padding: 6px 12px;
}

#lgsb-uploader .lgsb-edit-bg-startover:hover {
    border-color: var(--lgsb-error-text, #C62828);
    color: var(--lgsb-error-text, #C62828);
}

/* Fix-up undo row (v2.117.0: per-correction chips retired — plain Undo).
   .lgsb-edit-bg-chip / -chipdot / -chipx remain in use by the COLOR RULE
   chips under "More removal options". */
#lgsb-uploader .lgsb-edit-bg-stepsrow {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-bg-chip {
    align-items: center;
    background: var(--lgsb-bg-soft, #F2F4F5);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-pill);
    color: var(--lgsb-ink);
    display: inline-flex;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    gap: 6px;
    line-height: 1;
    padding: 5px 6px 5px 10px;
}

#lgsb-uploader .lgsb-edit-bg-chipdot {
    border: 1px solid rgba(0, 0, 0, .12);
    border-radius: 50%;
    flex: 0 0 auto;
    height: 12px;
    width: 12px;
}

#lgsb-uploader .lgsb-edit-bg-chipx {
    background: none;
    border: 0;
    border-radius: 50%;
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-size: 13px;
    line-height: 1;
    padding: 2px 4px;
}

#lgsb-uploader .lgsb-edit-bg-chipx:hover {
    color: var(--lgsb-error-text, #C62828);
}

#lgsb-uploader .lgsb-edit-bg-undolast {
    background: none;
    border: 1px dashed var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    padding: 6px 12px;
}

#lgsb-uploader .lgsb-edit-bg-undolast:hover:not(:disabled) {
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
}

/* v2.118.0: the Undo button is always in the layout — disabled (not
   hidden) when there's nothing to undo, so it never pops into existence. */
#lgsb-uploader .lgsb-edit-bg-undolast:disabled {
    cursor: default;
    opacity: .5;
}

/* --- Upscale --- */

#lgsb-uploader .lgsb-edit-upscale-info {
    color: var(--lgsb-ink);
    font-size: 13px;
    font-weight: var(--lgsb-weight-semibold);
    margin: 0;
}

/* COMPLETE badge (v2.119.0): loud, green, impossible to miss — it exists
   so customers stop re-clicking Upscale after the pass already landed. */
#lgsb-uploader .lgsb-edit-upscale-done {
    background: var(--lgsb-success-bg);
    border: 1px solid var(--lgsb-success-border);
    border-radius: var(--lgsb-radius-pill, 999px);
    color: var(--lgsb-success-text);
    display: inline-block;
    font-size: 13px;
    font-weight: var(--lgsb-weight-bold, 700);
    margin: 0 0 8px;
    padding: 6px 14px;
}

#lgsb-uploader .lgsb-edit-upscale-done[hidden] {
    display: none;
}

/* --- Edit modal chrome: red X close, backdrop-close disabled --- */

/* Three-part shell (v2.107.0): the header and tool bar are pinned, ONLY the
   body scrolls, and the action footer (Apply / Undo / Reset / Done) is always
   on screen. Overrides .lgsb-modal--thinline's whole-dialog `overflow: auto`,
   which used to push Done below the fold on tall artwork. */
#lgsb-uploader .lgsb-modal--edit {
    display: flex;
    flex-direction: column;
    /* v2.115.1: 90vh → 94vh — every reclaimed pixel goes to the stage. */
    max-height: 94vh;
    /* v2.114.0: a real editing workspace, not a dialog — fill wide screens
       (the stage canvas sizes itself from this) while 95vw keeps a gutter
       on smaller ones. */
    max-width: min(1200px, 95vw);
    overflow: hidden;
    padding: 0;
    position: relative;
}

#lgsb-uploader .lgsb-edit-head {
    border-bottom: 1px solid var(--lgsb-border);
    flex: 0 0 auto;
    padding: var(--lgsb-space-4) var(--lgsb-space-6);
}

#lgsb-uploader .lgsb-edit-head .lgsb-modal-title {
    margin-bottom: 0;
    padding-right: 32px;
}

#lgsb-uploader .lgsb-modal--edit .lgsb-modal-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 0 var(--lgsb-space-6) var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-modal--edit .lgsb-modal-actions {
    background: var(--lgsb-surface);
    border-top: 1px solid var(--lgsb-border);
    flex: 0 0 auto;
    margin-top: 0;
    /* Beats .lgsb-modal-actions--stacked's job-picker scroll box. */
    max-height: none;
    overflow: visible;
    padding: var(--lgsb-space-4) var(--lgsb-space-6);
}

/* v2.114.1 — two-column editor workspace on wide containers: stage on the
   left, tool controls in an always-visible right rail. The body stops
   scrolling (the canvas owns the wheel for zoom, so a scrolling body hid
   the tools with no obvious way to reach them); the rail scrolls itself
   when a panel is tall. The modal takes a DEFINITE height so the stage
   column has a stable box for loadStageImage() to measure. Below the
   breakpoint the columns stack and the body scrolls as before, with the
   stage capped short enough (~42vh) that the tools peek above the fold. */
@container (min-width: 940px) {
    #lgsb-uploader .lgsb-modal--edit {
        height: 94vh;
    }

    /* v2.115.1 — the footer collapses from three stacked rows to ONE:
       Undo/Reset compact on the left, Done + the primary Apply on the
       right. Same-specificity overrides of the --stacked rules win by
       source order. Below the breakpoint the stacked column stays (four
       buttons don't share a narrow row). */
    #lgsb-uploader .lgsb-modal--edit .lgsb-edit-actions {
        align-items: center;
        flex-direction: row;
        flex-wrap: nowrap;
    }

    #lgsb-uploader .lgsb-modal--edit .lgsb-edit-actions .lgsb-modal-btn {
        flex: 0 1 auto;
        width: auto;
    }

    #lgsb-uploader .lgsb-modal--edit .lgsb-edit-history {
        margin-right: auto;
        order: 1;
    }

    #lgsb-uploader .lgsb-modal--edit .lgsb-edit-close {
        order: 2;
    }

    #lgsb-uploader .lgsb-modal--edit .lgsb-edit-apply {
        min-width: 220px;
        order: 3;
    }

    #lgsb-uploader .lgsb-modal--edit .lgsb-modal-body {
        display: flex;
        gap: var(--lgsb-space-5);
        overflow-y: hidden;
        padding-top: var(--lgsb-space-4);
    }

    #lgsb-uploader .lgsb-edit-main {
        display: flex;
        flex: 1 1 auto;
        flex-direction: column;
        min-height: 0;
        min-width: 0;
    }

    #lgsb-uploader .lgsb-edit-main .lgsb-edit-stage {
        flex: 1 1 auto;
        min-height: 0;
    }

    #lgsb-uploader .lgsb-edit-side {
        display: flex;
        flex: 0 0 320px;
        flex-direction: column;
        gap: 10px;
        min-height: 0;
        overflow-y: auto;
    }

    #lgsb-uploader .lgsb-edit-side .lgsb-edit-controls {
        margin-top: 0;
    }
}

#lgsb-uploader .lgsb-edit-x {
    background: none;
    border: 0;
    color: var(--lgsb-error-text, #C62828);
    cursor: pointer;
    font-size: 26px;
    line-height: 1;
    padding: 4px 8px;
    position: absolute;
    right: 10px;
    top: 8px;
    transition: transform var(--lgsb-dur-base) var(--lgsb-ease);
    z-index: 2;
}

#lgsb-uploader .lgsb-edit-x:hover {
    transform: scale(1.15);
}

/* --- Custom color hex field (tint) --- */

#lgsb-uploader .lgsb-edit-hex-input {
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-ink);
    font-family: inherit;
    font-size: 12px;
    font-variant-numeric: tabular-nums;
    font-weight: var(--lgsb-weight-semibold);
    padding: 6px 8px;
    text-transform: lowercase;
    width: 84px;
}

#lgsb-uploader .lgsb-edit-hex-input:focus {
    border-color: var(--lgsb-teal);
    outline: none;
}

/* --- Edit stage zoom/pan --- */

/* Pan hint; the earlier .lgsb-edit-pickmode crosshair rule outranks this
   in eyedropper mode (higher specificity). */
#lgsb-uploader .lgsb-edit-stage .lgsb-thinline-canvas {
    cursor: grab;
    touch-action: none;
}

/* --- Saved distress patterns --- */

#lgsb-uploader .lgsb-edit-ds-favrow {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-ds-save {
    background: none;
    border: 1px dashed var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    padding: 6px 12px;
}

#lgsb-uploader .lgsb-edit-ds-save:hover:not(:disabled) {
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
}

#lgsb-uploader .lgsb-edit-ds-save:disabled {
    border-style: solid;
    color: var(--lgsb-teal-ink, var(--lgsb-teal));
    cursor: default;
}

#lgsb-uploader .lgsb-edit-ds-presets {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

#lgsb-uploader .lgsb-edit-ds-preset {
    align-items: stretch;
    display: inline-flex;
}

#lgsb-uploader .lgsb-edit-ds-preset-apply {
    background: var(--lgsb-bg-soft, #F2F4F5);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-pill) 0 0 var(--lgsb-radius-pill);
    border-right: 0;
    color: var(--lgsb-ink);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-semibold);
    line-height: 1;
    padding: 7px 10px;
}

#lgsb-uploader .lgsb-edit-ds-preset-apply:hover {
    background: var(--lgsb-teal-tint, #E7F3F4);
    border-color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-edit-ds-preset-del {
    background: var(--lgsb-bg-soft, #F2F4F5);
    border: 1px solid var(--lgsb-border);
    border-radius: 0 var(--lgsb-radius-pill) var(--lgsb-radius-pill) 0;
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-size: 13px;
    line-height: 1;
    padding: 0 8px;
}

#lgsb-uploader .lgsb-edit-ds-preset-del:hover {
    color: var(--lgsb-error-text, #C62828);
}

/* Queue position line for bulk drops ("Design 1 of 3 with transparency"). */
#lgsb-uploader .lgsb-semitrans-queuepos {
    color: var(--lgsb-text-muted);
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    margin: 0 0 var(--lgsb-space-2);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-semitrans-name {
    margin: 0 0 2px;
}

#lgsb-uploader .lgsb-semitrans-msg {
    color: var(--lgsb-text);
    font-size: 13px;
    line-height: 1.5;
    margin: 0;
}

/* Original / Halftoned segmented compare control (applied state only). */
#lgsb-uploader .lgsb-semitrans-compare {
    background: var(--lgsb-bg-soft, #F2F4F5);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    display: inline-flex;
    gap: 2px;
    margin-right: auto;
    padding: 2px;
}

#lgsb-uploader .lgsb-semitrans-compare-btn {
    background: none;
    border: 0;
    border-radius: calc(var(--lgsb-radius-input) - 2px);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    line-height: 1;
    padding: 6px 12px;
    transition: background-color var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-semitrans-compare-btn.is-active {
    background: var(--lgsb-surface);
    box-shadow: var(--lgsb-shadow-card, 0 1px 2px rgba(0, 0, 0, .12));
    color: var(--lgsb-ink);
}

/* display:inline-flex above beats the UA's [hidden] rule — restate it, or
   the compare toggle leaks into the review/working/failed states. */
#lgsb-uploader .lgsb-semitrans-compare[hidden] {
    display: none;
}

/* Busy overlay inside the stage while a halftone generates. */
#lgsb-uploader .lgsb-modal--semitrans .lgsb-thinline-stage {
    position: relative;
}

#lgsb-uploader .lgsb-semitrans-busy {
    align-items: center;
    background: rgba(255, 255, 255, .82);
    border-radius: var(--lgsb-radius-sm);
    display: flex;
    flex-direction: column;
    gap: 10px;
    inset: 0;
    justify-content: center;
    position: absolute;
    z-index: 2;
}

#lgsb-uploader .lgsb-semitrans-busy[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-semitrans-busy-text {
    color: var(--lgsb-ink);
    font-size: 13px;
    font-weight: var(--lgsb-weight-bold);
}

/* Failure / status note inside the dialog. */
#lgsb-uploader .lgsb-semitrans-note {
    background: var(--lgsb-warning-bg, #FBF3E9);
    border: 1px solid var(--lgsb-warning-text);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-warning-text);
    font-size: 12px;
    line-height: 1.5;
    margin: 0 0 var(--lgsb-space-2);
    padding: 8px 10px;
}

#lgsb-uploader .lgsb-semitrans-note[hidden] {
    display: none;
}

/* "Apply to remaining N designs" checkbox above the actions. */
#lgsb-uploader .lgsb-semitrans-applyall {
    align-items: flex-start;
    color: var(--lgsb-text);
    cursor: pointer;
    display: flex;
    font-size: 12px;
    gap: 8px;
    line-height: 1.4;
    margin: 0 0 var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-semitrans-applyall[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-semitrans-applyall input {
    flex: 0 0 auto;
    margin-top: 1px;
}

/* Small "Recommended" tag inside the primary action. */
#lgsb-uploader .lgsb-semitrans-rec {
    background: rgba(255, 255, 255, .22);
    border-radius: 999px;
    font-size: 10px;
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    margin-left: 8px;
    padding: 2px 8px;
    text-transform: uppercase;
    vertical-align: 1px;
}

/* Shared spinner ring (thumb overlay, busy overlay, status line). */
#lgsb-uploader .lgsb-ht-spin-ring {
    animation: lgsb-spin .8s linear infinite;
    border: 3px solid var(--lgsb-border);
    border-radius: 50%;
    border-top-color: var(--lgsb-teal);
    display: inline-block;
    flex: 0 0 auto;
    height: 22px;
    width: 22px;
}

/* Thumb overlay while a halftone (re)generates — the card stays usable. */
#lgsb-uploader .lgsb-ht-spin {
    align-items: center;
    background: rgba(255, 255, 255, .66);
    border-radius: var(--lgsb-radius-sm);
    display: flex;
    inset: 0;
    justify-content: center;
    position: absolute;
    z-index: 2;
}

/* Persistent builder-level status line — a background regeneration must
   never be missable (the thumb spinner alone is easy to overlook). */
#lgsb-uploader .lgsb-ht-statusline {
    align-items: center;
    background: var(--lgsb-teal-soft, #E7F4F4);
    border: 1px solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-ink);
    display: flex;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    gap: 10px;
    margin-top: var(--lgsb-space-2);
    padding: 8px 12px;
}

#lgsb-uploader .lgsb-ht-statusline .lgsb-ht-spin-ring {
    height: 16px;
    width: 16px;
}

/* Layout preview: contour-nested copies may legitimately overlap at the
   bounding-box level — the dashed teal outline says "intentional". */
#lgsb-uploader .lgsb-lp-item-contour {
    outline: 1px dashed var(--lgsb-teal);
    outline-offset: -1px;
}

/* Preset Manager dialog internals */
#lgsb-uploader .lgsb-preset-subtitle {
    color: var(--lgsb-text-muted);
    font-size: 13px;
    margin-bottom: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-preset-list {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    margin-bottom: var(--lgsb-space-3);
    max-height: 240px;
    overflow-y: auto;
}

#lgsb-uploader .lgsb-preset-empty {
    color: var(--lgsb-text-muted);
    font-size: 13px;
    padding: var(--lgsb-space-2) 0;
}

#lgsb-uploader .lgsb-preset-item {
    align-items: stretch;
    display: flex;
    gap: var(--lgsb-space-1);
}

/* Drag-to-reorder: grip handle arms the drag; a teal edge line marks where
   the preset will land. */
#lgsb-uploader .lgsb-preset-drag {
    align-items: center;
    color: var(--lgsb-text-muted);
    cursor: grab;
    display: inline-flex;
    flex: 0 0 auto;
    justify-content: center;
    width: 18px;
}

#lgsb-uploader .lgsb-preset-drag:active {
    cursor: grabbing;
}

#lgsb-uploader .lgsb-preset-item.lgsb-preset-dragging {
    opacity: .45;
}

#lgsb-uploader .lgsb-preset-item.lgsb-preset-drop-before {
    box-shadow: 0 -2px 0 0 var(--lgsb-teal);
}

#lgsb-uploader .lgsb-preset-item.lgsb-preset-drop-after {
    box-shadow: 0 2px 0 0 var(--lgsb-teal);
}

#lgsb-uploader .lgsb-preset-pick {
    align-items: baseline;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text);
    cursor: pointer;
    display: flex;
    flex: 1 1 auto;
    font-family: var(--lgsb-font-family);
    font-size: 13px;
    gap: var(--lgsb-space-2);
    justify-content: space-between;
    min-width: 0;
    padding: 8px var(--lgsb-space-3);
    text-align: left;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                border-color var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-preset-pick:hover {
    border-color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-preset-item-selected .lgsb-preset-pick {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-preset-pick-name {
    font-weight: var(--lgsb-weight-semibold);
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-preset-pick-size {
    color: var(--lgsb-text-muted);
    flex: 0 0 auto;
    font-size: var(--lgsb-font-body-sm);
}

#lgsb-uploader .lgsb-preset-edit-btn,
#lgsb-uploader .lgsb-preset-del-btn {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    justify-content: center;
    padding: 0;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 32px;
}

#lgsb-uploader .lgsb-preset-edit-btn:hover {
    background: var(--lgsb-teal-soft);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-preset-del-btn:hover {
    background: var(--lgsb-error-bg);
    color: var(--lgsb-error-text);
}

#lgsb-uploader .lgsb-preset-new-btn {
    background: transparent;
    border: none;
    color: var(--lgsb-teal);
    cursor: pointer;
    font-family: var(--lgsb-font-family);
    font-size: 13px;
    font-weight: var(--lgsb-weight-semibold);
    padding: var(--lgsb-space-1) 0;
    text-align: left;
}

#lgsb-uploader .lgsb-preset-new-btn:hover {
    text-decoration: underline;
}

#lgsb-uploader .lgsb-preset-form {
    background: var(--lgsb-surface-dim);
    border-radius: var(--lgsb-radius-input);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    margin-top: var(--lgsb-space-2);
    padding: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-preset-form[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-preset-field {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

#lgsb-uploader .lgsb-preset-field > span {
    color: var(--lgsb-ink);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-preset-form-row {
    display: flex;
    gap: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-preset-form-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
    justify-content: flex-end;
}

#lgsb-uploader .lgsb-preset-form-actions .lgsb-modal-btn {
    flex: 0 1 auto;
    min-width: 0;
    white-space: normal;
}

#lgsb-uploader .lgsb-preset-modal-msg {
    background: var(--lgsb-error-bg);
    border: 1px solid var(--lgsb-error-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-error-text);
    font-size: var(--lgsb-font-body-sm);
    margin-top: var(--lgsb-space-3);
    padding: var(--lgsb-space-2) var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-preset-modal-msg[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-preset-guest-note {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
    margin-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-preset-guest-note a {
    color: var(--lgsb-teal);
    font-weight: var(--lgsb-weight-semibold);
}

/* Bulk change-quantity / move-to-job dialog fields */
#lgsb-uploader .lgsb-bulk-qty-field {
    margin-top: var(--lgsb-space-3);
    max-width: 140px;
}

#lgsb-uploader .lgsb-bulk-move-field {
    margin-top: var(--lgsb-space-3);
    max-width: 240px;
}

/* Bulk Actions toolbar — compact bar at the top of each job's rows (or the
   flat list). In the flat grid it must span all columns. */
#lgsb-uploader .lgsb-bulk-bar {
    align-items: center;
    background: var(--lgsb-light-bg);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-3);
    grid-column: 1 / -1;
    margin-bottom: var(--lgsb-space-3);
    padding: var(--lgsb-space-2) var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-bulk-selectall-label {
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-bulk-count {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
}

#lgsb-uploader .lgsb-bulk-controls {
    align-items: center;
    display: inline-flex;
    gap: var(--lgsb-space-2);
    margin-left: auto;
}

#lgsb-uploader .lgsb-bulk-msg {
    color: var(--lgsb-text-muted);
    display: none;
    flex: 1 1 100%;
    font-size: var(--lgsb-font-body-sm);
}

#lgsb-uploader .lgsb-bulk-msg.lgsb-bulk-msg-visible {
    display: block;
}

/* =========================================================================
 * 4. LAYOUT
 * ========================================================================= */

/* --- 4.1 Builder grid (single definition; two-column at ≥880cqw in §6) --- */
#lgsb-uploader .lgsb-builder-grid {
    align-items: start;
    display: grid;
    gap: var(--lgsb-space-5);
    grid-template-columns: 1fr;
}

#lgsb-uploader .lgsb-main-col {
    min-width: 0;
    padding: var(--lgsb-space-6);
}

#lgsb-uploader .lgsb-summary-col {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-4);
    min-width: 0;
    position: static;
}

/* --- 4.2 Section heading --- */
#lgsb-uploader .lgsb-upload-heading {
    margin-bottom: var(--lgsb-space-4);
}

/* ONE recipe for every section title (Layout / Global / Manage Jobs /
   Upload): teal, uppercase, title-1, with an optional leading 20px icon. */
#lgsb-uploader .lgsb-section-title {
    align-items: center;
    color: var(--lgsb-teal);
    display: flex;
    font-size: var(--lgsb-font-title-1);
    font-weight: var(--lgsb-weight-bold);
    gap: 8px;
    letter-spacing: .04em;
    line-height: var(--lgsb-leading-tight);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-title-icon {
    align-items: center;
    color: var(--lgsb-teal);
    display: inline-flex;
    flex: none;
}

#lgsb-uploader .lgsb-upload-heading p {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    margin-top: var(--lgsb-space-1);
}

/* --- 4.3 Dropzones --- */
#lgsb-uploader .lgsb-dropzone,
#lgsb-uploader .lgsb-add-design-btn {
    background: var(--lgsb-surface);
    border: var(--lgsb-dropzone-border-width) dashed var(--lgsb-teal);
    border-radius: var(--lgsb-radius-card);
    cursor: pointer;
    padding: var(--lgsb-space-6);
    text-align: center;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease);
}

/* Hero upload row: dropzone + vault zone side by side, equal heights.
   Flex (not grid) so a missing vault zone (logged out / integration off)
   gracefully leaves the dropzone full-width. */
#lgsb-uploader .lgsb-upload-zones {
    align-items: stretch;
    display: flex;
    gap: var(--lgsb-space-4);
    margin-bottom: var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-upload-zones > * {
    flex: 1 1 0;
    min-width: 0;
}

#lgsb-uploader .lgsb-dropzone {
    display: flex;         /* stretch .lgsb-dropzone-full to full height */
    flex-direction: column;
    justify-content: center;
}

#lgsb-uploader .lgsb-dropzone-full,
#lgsb-uploader .lgsb-add-design-btn {
    align-items: center;
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    justify-content: center; /* stays centered when the vault column is taller */
}

/* Official Limitless upload icon (2.75.6): a filled single-path brand glyph
   with its own circle ring baked into the artwork, so the old CSS-drawn
   circle wrap (.lgsb-upload-icon-wrap) is retired. Sized inline to match
   the vault icon (40px in the upload/vault columns, 36px in chooser cards
   via .lgsb-mode-drop-icon). */
#lgsb-uploader .lgsb-upload-icon {
    /* !important: theme text-color rules otherwise win and paint the glyph
       near-black (icon uses fill/stroke: currentColor). */
    color: var(--lgsb-teal) !important;
    fill: currentColor !important;
    stroke: currentColor !important;
    display: inline-block;
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-dropzone-label,
#lgsb-uploader .lgsb-add-label {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-dropzone-or,
#lgsb-uploader .lgsb-add-or {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-pill);
    text-transform: lowercase;
}

#lgsb-uploader .lgsb-dropzone-meta,
#lgsb-uploader .lgsb-add-meta {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-pill);
    margin-top: 2px;
}

/* .lgsb-add-btn-inner mimics the Select Files button inside the jobs-mode
   dropzone (a <button> can't nest a <label>). Armor lives in section 7. */
#lgsb-uploader .lgsb-add-btn-inner {
    border-radius: var(--lgsb-radius-input);
    display: inline-block;
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .07em;
    min-width: 154px;
    padding: 11px 26px;
    text-transform: uppercase;
    transition: box-shadow var(--lgsb-dur-base) var(--lgsb-ease);
    white-space: nowrap;
}

/* (The flat-mode compact "Add another design" pill was retired in 2.75.4 —
   Quick Order now shares the Multi-Job workspace dropzone via
   .lgsb-active-actions so the upload field is identical in both layouts.) */

/* --- 4.4 Upload progress --- */
#lgsb-uploader .lgsb-upload-progress {
    margin-bottom: var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-progress-bar {
    background: var(--lgsb-surface-dim);
    border-radius: var(--lgsb-radius-pill);
    height: 8px;
    overflow: hidden;
}

#lgsb-uploader .lgsb-progress-fill {
    background: var(--lgsb-teal);
    border-radius: var(--lgsb-radius-pill);
    height: 100%;
    transition: width var(--lgsb-dur-base) var(--lgsb-ease);
    width: 0;
}

#lgsb-uploader .lgsb-progress-label {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
    margin-top: var(--lgsb-space-1);
}

/* --- 4.5 Layout selector (Choose Your Order Layout) ---
   Zone heading + two persistent radio cards (Quick / Multi-Job). Selection
   visuals derive purely from the .lgsb-jobs-on root class; the hidden
   #lgsb-jobs-toggle checkbox stays the single JS mode state. */
#lgsb-uploader .lgsb-layout-select {
    margin-bottom: var(--lgsb-space-5);
}

#lgsb-uploader .lgsb-zone-title {
    display: block;
    margin-bottom: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-mode-select {
    display: grid;
    gap: var(--lgsb-space-3);
    grid-template-columns: repeat(2, minmax(0, 1fr));
}

#lgsb-uploader .lgsb-mode-pick {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    box-shadow: var(--lgsb-shadow-nested);
    cursor: pointer;
    display: flex;
    font-family: var(--lgsb-font-family);
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-space-3) var(--lgsb-space-4);
    text-align: left;
    transition: border-color var(--lgsb-dur-base) var(--lgsb-ease),
                box-shadow var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-mode-pick:hover {
    box-shadow: var(--lgsb-shadow-raised);
}

#lgsb-uploader .lgsb-mode-pick:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

/* Selected card: teal border (the .lgsb-jobs-on root class is the state) */
#lgsb-uploader:not(.lgsb-jobs-on) .lgsb-mode-pick[data-mode='quick'],
#lgsb-uploader.lgsb-jobs-on .lgsb-mode-pick[data-mode='multi'] {
    border-color: var(--lgsb-teal);
}

/* Radio circle — ink ring, teal dot when selected */
#lgsb-uploader .lgsb-mode-pick-radio {
    border: 2px solid var(--lgsb-ink);
    border-radius: 50%;
    display: inline-block;
    flex: 0 0 18px;
    height: 18px;
    position: relative;
    width: 18px;
}

#lgsb-uploader:not(.lgsb-jobs-on) .lgsb-mode-pick[data-mode='quick'] .lgsb-mode-pick-radio::after,
#lgsb-uploader.lgsb-jobs-on .lgsb-mode-pick[data-mode='multi'] .lgsb-mode-pick-radio::after {
    background: var(--lgsb-teal);
    border-radius: 50%;
    content: '';
    inset: 2px;
    position: absolute;
}

/* Icon tile — muted at rest, teal-soft on the selected card */
#lgsb-uploader .lgsb-mode-pick-icon {
    align-items: center;
    background: var(--lgsb-surface-dim);
    border-radius: 50%;
    color: var(--lgsb-ink);
    display: inline-flex;
    flex: 0 0 44px;
    height: 44px;
    justify-content: center;
    transition: background var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease);
    width: 44px;
}

#lgsb-uploader:not(.lgsb-jobs-on) .lgsb-mode-pick[data-mode='quick'] .lgsb-mode-pick-icon,
#lgsb-uploader.lgsb-jobs-on .lgsb-mode-pick[data-mode='multi'] .lgsb-mode-pick-icon {
    background: var(--lgsb-teal-soft);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-mode-pick-body {
    flex: 1 1 auto;
    min-width: 0;
}

#lgsb-uploader .lgsb-mode-pick-title {
    align-items: center;
    color: var(--lgsb-ink);
    display: flex;
    flex-wrap: wrap;
    font-size: var(--lgsb-font-title-3);
    font-weight: var(--lgsb-weight-bold);
    gap: var(--lgsb-space-2);
    letter-spacing: .03em;
    line-height: var(--lgsb-leading-tight);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-mode-pick-desc {
    color: var(--lgsb-text-muted);
    display: block;
    font-size: var(--lgsb-font-body-sm);
    line-height: 1.45;
    margin-top: 3px;
}

/* Toggle switch — the real #lgsb-jobs-toggle checkbox lives inside (hidden
   but focusable), so the JS change/prop('checked') contract is untouched. */
#lgsb-uploader .lgsb-switch {
    align-items: center;
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 auto;
    position: relative;
}

#lgsb-uploader .lgsb-switch input {
    cursor: pointer;
    height: 100%;
    left: 0;
    margin: 0;
    opacity: 0;
    position: absolute;
    top: 0;
    width: 100%;
}

#lgsb-uploader .lgsb-switch-track {
    background: #C6CED4;
    border-radius: var(--lgsb-radius-pill);
    display: block;
    height: 26px;
    position: relative;
    transition: background var(--lgsb-dur-base) var(--lgsb-ease);
    width: 48px;
}

#lgsb-uploader .lgsb-switch-knob {
    background: #fff;
    border-radius: 50%;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
    display: block;
    height: 20px;
    left: 3px;
    position: absolute;
    top: 3px;
    transition: transform var(--lgsb-dur-base) var(--lgsb-ease);
    width: 20px;
}

#lgsb-uploader .lgsb-switch input:checked + .lgsb-switch-track {
    background: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-switch input:checked + .lgsb-switch-track .lgsb-switch-knob {
    transform: translateX(22px);
}

#lgsb-uploader .lgsb-switch input:focus-visible + .lgsb-switch-track {
    box-shadow: var(--lgsb-focus-ring);
}

/* --- 4.5b Order-layout chooser (entry state) ---
   Two side-by-side dropzone cards (Quick Order / Multi-Job Order) shown only
   while #lgsb-uploader carries .lgsb-choosing (visibility lives in §5).
   Clicking or dropping into a card picks that layout for the session. */
#lgsb-uploader .lgsb-mode-chooser {
    display: none; /* shown via state matrix in §5 */
    gap: var(--lgsb-space-4);
    grid-template-columns: repeat(2, minmax(0, 1fr));
    margin-bottom: var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-mode-option {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-dropzone-border-width) dashed var(--lgsb-teal);
    border-radius: var(--lgsb-radius-card);
    cursor: pointer;
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-space-6) var(--lgsb-space-4);
    text-align: center;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                box-shadow var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-mode-option:hover,
#lgsb-uploader .lgsb-mode-option.lgsb-dragover {
    background: var(--lgsb-teal-soft);
}

#lgsb-uploader .lgsb-mode-option:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

#lgsb-uploader .lgsb-mode-title {
    color: var(--lgsb-ink);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-mode-icon {
    align-items: center;
    background: var(--lgsb-teal);
    border-radius: 50%;
    color: #fff;
    display: inline-flex;
    height: 56px;
    justify-content: center;
    width: 56px;
}

#lgsb-uploader .lgsb-mode-desc {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-body-sm);
    max-width: 320px;
}

#lgsb-uploader .lgsb-mode-drop {
    align-items: center;
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    margin-top: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-mode-drop-icon {
    height: 36px;
    width: 36px;
}

#lgsb-uploader .lgsb-mode-drop-label {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
}

/* --- 4.5c Layout selector details ---
   The raw mode switch stays in the DOM (hidden) as the JS state contract;
   the radio cards are the customer-facing control. The CURRENT LAYOUT pill
   renders only on the selected card via the lgsb-mode-*-only spans. */
#lgsb-uploader .lgsb-layout-select .lgsb-group-toggle-label {
    display: none;
}

#lgsb-uploader .lgsb-mode-badge {
    background: var(--lgsb-teal);
    border-radius: var(--lgsb-radius-pill);
    color: #fff;
    display: inline-block;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .04em;
    padding: 2px 10px;
    text-transform: uppercase;
    vertical-align: middle;
}

/* --- 4.6 Designs panel (flat) / active workspace (jobs) --- */
#lgsb-uploader .lgsb-designs-panel {
    position: relative;
}

#lgsb-uploader .lgsb-designs-title {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .03em;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-jobs-head {
    align-items: center;
    gap: var(--lgsb-space-3);
    justify-content: space-between;
    margin-bottom: var(--lgsb-space-3);
}

/* MANAGE JOBS (N) + "See All" — the whole title area is a collapse control:
   clicking it (or See All) closes the active job and shows every job card
   in a wrapping grid (see §5 state matrix + bindEvents in gang-sheet.js). */
#lgsb-uploader .lgsb-jobs-head-text {
    align-items: baseline;
    cursor: pointer;
    display: flex;
    gap: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-jobs-head-text:focus-visible {
    border-radius: var(--lgsb-radius-sm);
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

#lgsb-uploader .lgsb-jobs-seeall {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-jobs-head-text:hover .lgsb-jobs-seeall {
    color: var(--lgsb-teal);
    text-decoration: underline;
}

/* Persistent "+ New Job" in the header — the dashed tile scrolls out of
   view in a long strip, so the header keeps an always-visible entry point.
   margin-left:auto groups it with Start Over on the right. */
#lgsb-uploader .lgsb-jobs-add-btn {
    flex: none;
    margin-left: auto;
    padding: 8px 14px;
    text-transform: uppercase;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-jobs-add-btn:disabled {
    cursor: not-allowed;
    opacity: .5;
}

/* Flat-mode header row: My Designs title + count (Start Over moved into the
   sticky toolbar below in v2.108.0). Hidden as a whole in jobs mode. */
#lgsb-uploader .lgsb-designs-head {
    align-items: center;
    display: flex;
    gap: var(--lgsb-space-3);
    justify-content: space-between;
}

#lgsb-uploader.lgsb-jobs-on .lgsb-designs-head {
    display: none;
}

/* --- Sticky My Designs toolbar (flat mode) ---
   First child of .lgsb-files-section: Select Files | Design Vault | hosted
   Bulk Actions bar | Start Over. position:sticky (NEVER fixed — the
   uploader's container-type re-anchors fixed elements) bounded by the
   section, so it releases at the end of the card grid and can't follow the
   customer into the pricing section. Negative margins bleed it over the
   section's padding so cards can't peek past its edges while stuck. */
#lgsb-uploader .lgsb-designs-toolbar {
    align-items: center;
    background: var(--lgsb-surface);
    border-bottom: var(--lgsb-divider-width) solid var(--lgsb-border);
    border-radius: calc(var(--lgsb-radius-card) - var(--lgsb-card-border-width))
                   calc(var(--lgsb-radius-card) - var(--lgsb-card-border-width)) 0 0;
    box-shadow: var(--lgsb-shadow-nested);
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2) var(--lgsb-space-3);
    margin: calc(-1 * var(--lgsb-space-4)) calc(-1 * var(--lgsb-space-4)) var(--lgsb-space-3);
    padding: var(--lgsb-space-3) var(--lgsb-space-4);
    position: sticky;
    top: var(--lgsb-sticky-top);
    z-index: var(--lgsb-z-sticky);
}

/* Start Over rides the right edge, visually separated from the add/manage
   controls. */
#lgsb-uploader .lgsb-designs-toolbar .lgsb-start-over-btn {
    margin-left: auto;
}

/* Header buttons run slightly tighter than the 11px/22px base recipe so the
   bar stays a single row wherever possible. */
#lgsb-uploader .lgsb-designs-toolbar .lgsb-btn,
#lgsb-uploader .lgsb-ws-actions .lgsb-btn {
    padding: 9px 16px;
}

/* Bulk-bar host slot (shared by both sticky headers): the reconciler in
   gang-sheet.js moves the ONE .lgsb-bulk-bar element in here, and it sheds
   its standalone card chrome to read as inline toolbar controls. */
#lgsb-uploader .lgsb-toolbar-bulk {
    display: contents;
}

#lgsb-uploader .lgsb-toolbar-bulk .lgsb-bulk-bar {
    background: transparent;
    border: 0;
    flex: 1 1 auto;
    margin: 0;
    min-width: 0;
    padding: 0;
}

/* Start Over — quiet outlined button that only turns destructive-red on
   hover (a solid danger button would shout from every header). Hidden until
   designs exist, and never shown while editing a cart order. */
#lgsb-uploader .lgsb-start-over-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-start-over-btn {
    align-items: center;
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-button);
    box-shadow: inset 0 0 0 1px var(--lgsb-divider);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    flex: none;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-bold);
    gap: 6px;
    letter-spacing: .04em;
    line-height: 1;
    padding: 8px 13px;
    text-transform: uppercase;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                box-shadow var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
    white-space: nowrap;
}

/* Visibility lives OUTSIDE the armor block — the tripled-ID selector would
   out-specify the .lgsb-has-files reveal below. */
#lgsb-uploader .lgsb-start-over-btn {
    display: none;
}

#lgsb-uploader.lgsb-has-files .lgsb-start-over-btn {
    display: inline-flex;
}

#lgsb-uploader.lgsb-editing .lgsb-start-over-btn {
    display: none !important;
}

#lgsb-uploader .lgsb-start-over-btn:hover,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-start-over-btn:hover {
    background: var(--lgsb-error-soft);
    box-shadow: inset 0 0 0 1px var(--lgsb-error-text);
    color: var(--lgsb-error-text);
}

/* Welcome-back restore notice — informational teal bar above the builder. */
#lgsb-uploader .lgsb-restore-notice {
    align-items: center;
    background: var(--lgsb-teal-soft);
    border: 1px solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-card);
    color: var(--lgsb-text);
    display: flex;
    font-size: var(--lgsb-font-body);
    gap: var(--lgsb-space-3);
    line-height: var(--lgsb-leading-normal);
    margin-bottom: var(--lgsb-space-4);
    padding: var(--lgsb-space-3) var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-restore-notice-icon {
    color: var(--lgsb-teal);
    display: inline-flex;
    flex: none;
}

#lgsb-uploader .lgsb-restore-notice-text {
    flex: 1;
}

#lgsb-uploader .lgsb-restore-notice-close,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-restore-notice-close {
    background: transparent;
    border: none;
    box-shadow: none;
    color: var(--lgsb-text-muted);
    cursor: pointer;
    flex: none;
    font-size: 20px;
    line-height: 1;
    padding: 2px 6px;
}

#lgsb-uploader .lgsb-restore-notice-close:hover {
    color: var(--lgsb-text);
}

/* Edit-in-cart banner — pinned above the builder while re-editing an order
   already in the cart. */
#lgsb-uploader .lgsb-edit-banner {
    align-items: center;
    background: var(--lgsb-teal-soft);
    border: 1px solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-card);
    color: var(--lgsb-text);
    display: flex;
    flex-wrap: wrap;
    font-size: var(--lgsb-font-body);
    gap: var(--lgsb-space-3);
    line-height: var(--lgsb-leading-normal);
    margin-bottom: var(--lgsb-space-4);
    padding: var(--lgsb-space-3) var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-edit-banner-icon {
    color: var(--lgsb-teal);
    display: inline-flex;
    flex: none;
}

#lgsb-uploader .lgsb-edit-banner-text {
    flex: 1;
    min-width: 220px;
}

#lgsb-uploader .lgsb-edit-banner-cancel,
#lgsb-uploader a.lgsb-edit-banner-cancel,
#lgsb-uploader .lgsb-edit-banner a.lgsb-edit-banner-cancel {
    color: var(--lgsb-teal);
    font-weight: var(--lgsb-weight-bold);
    text-decoration: underline;
    white-space: nowrap;
}

/* The shared file container. Flat mode: teal-outlined soft panel.
   Jobs mode: same chrome acts as the active workspace (white interior
   under the teal job bar, per the v2.58.0 mockups). */
#lgsb-uploader .lgsb-files-section {
    background: var(--lgsb-surface);
    border: var(--lgsb-card-border-width) solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-card);
    margin-top: var(--lgsb-space-3);
    padding: var(--lgsb-space-4);
    position: relative;
    z-index: 1; /* paints over the ACTIVE JOB tab behind it (4.9) */
}

/* Flat mode (grouping off): light grey panel; the teal fill is reserved for
   the active-job workspace. */
#lgsb-uploader:not(.lgsb-jobs-on) .lgsb-files-section {
    background: var(--lgsb-surface-dim);
}

/* Design card grid — 4 per row when space allows, reflowing to 3/2/1 when it
   doesn't (v2.74.1). Cards have a real min-content width (steppers, dimension
   inputs, warning banners), so forcing 4 columns on narrow screens made
   contents spill out of the card borders. The minmax() below caps the layout
   at 4 columns (each track is at least a quarter of the row) while auto-fill
   drops columns whenever a track would fall below the floor.
   Floor: 225px on the storefront (v2.113.1 — the owner's original 4-per-row
   look at typical theme content widths; safe again now that the extra-wide
   "DPI unknown" pill no longer exists thanks to the assumed-300 fallback),
   260px inside wp-admin (Personal Generator — the admin sidebar compresses
   the container, and v2.110.0 runtime measurement showed the worst-case meta
   row — wide status pill (flex: 0 0 auto, can't shrink) + the Copies stepper
   (− 52px input +) — needs ~250px of card; at 225px the stepper spilled past
   the card border and "Design Tools" ellipsized. Fewer, wider columns beat
   clipping in that compressed context). */
#lgsb-uploader .lgsb-files-list,
#lgsb-uploader .lgsb-job-rows {
    display: grid;
    gap: var(--lgsb-space-3);
    grid-template-columns: repeat(
        auto-fill,
        minmax(max(225px, calc((100% - 3 * var(--lgsb-space-3)) / 4)), 1fr)
    );
}

body.wp-admin #lgsb-uploader .lgsb-files-list,
body.wp-admin #lgsb-uploader .lgsb-job-rows {
    grid-template-columns: repeat(
        auto-fill,
        minmax(max(260px, calc((100% - 3 * var(--lgsb-space-3)) / 4)), 1fr)
    );
}

/* Job sections are invisible wrappers around their rows grid. */
#lgsb-uploader .lgsb-job-section {
    display: block;
    grid-column: 1 / -1;
}

/* Empty active job prompt (jobs mode) */
#lgsb-uploader.lgsb-jobs-on .lgsb-job-section.lgsb-job-active .lgsb-job-rows:empty {
    display: block;
}

#lgsb-uploader.lgsb-jobs-on .lgsb-job-section.lgsb-job-active .lgsb-job-rows:empty::before {
    color: var(--lgsb-text-muted);
    content: 'No designs in this job yet — drag files here or use Select Files above.';
    display: block;
    font-size: var(--lgsb-font-body-sm);
    padding: var(--lgsb-space-6);
    text-align: center;
}

/* Count summary tab — emerges from BEHIND the card's bottom-right corner:
   square top edge (continuous with the card), rounded bottom corners, flush
   to the card's right edge, hanging fully below it. */
#lgsb-uploader .lgsb-panel-chip {
    border-radius: 0 0 var(--lgsb-radius-nested) var(--lgsb-radius-nested);
    bottom: 0;
    font-size: 13px;
    margin: 0;
    padding: 10px 20px;
    position: absolute;
    /* absolute positioning resolves against the padding box — pull right by
       the border width so the tab is flush with the card's OUTER edge */
    right: calc(-1 * var(--lgsb-card-border-width));
    transform: translateY(100%);
    z-index: 0; /* below the card's stacking level, above the page */
}

/* --- 4.7 Design card ---
   Border is brand teal by default; a warned card's border matches the warning
   icon color, a blocked card's matches the error icon color (mock rule). */
#lgsb-uploader .lgsb-file-row {
    animation: lgsb-card-in var(--lgsb-dur-base) var(--lgsb-ease-out);
    background: var(--lgsb-surface);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-nested);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    min-width: 0;
    padding: var(--lgsb-space-3);
    transition: box-shadow var(--lgsb-dur-base) var(--lgsb-ease),
                opacity var(--lgsb-dur-fast) var(--lgsb-ease);
}

@keyframes lgsb-card-in {
    from { opacity: 0; transform: translateY(4px); }
    to   { opacity: 1; transform: none; }
}

#lgsb-uploader .lgsb-file-row:hover {
    box-shadow: var(--lgsb-shadow-raised);
}

#lgsb-uploader .lgsb-file-row.lgsb-file-warned {
    border-color: var(--lgsb-warning-text);
}

#lgsb-uploader .lgsb-file-row.lgsb-file-blocked {
    background: var(--lgsb-error-bg);
    border-color: var(--lgsb-error-text);
}

#lgsb-uploader .lgsb-fc-head {
    display: flex;
    gap: 10px;
    /* Anchor for the absolutely-positioned trash button (v2.43.5). */
    position: relative;
}

/* Checkerboard behind transparent PNG thumbnails */
#lgsb-uploader .lgsb-thumb-wrap {
    flex: 0 0 84px;
    height: 84px;
    position: relative;
    width: 84px;
}

#lgsb-uploader .lgsb-file-thumb {
    background-color: #fff;
    background-image:
        linear-gradient(45deg, #E6E9EB 25%, transparent 25%, transparent 75%, #E6E9EB 75%),
        linear-gradient(45deg, #E6E9EB 25%, transparent 25%, transparent 75%, #E6E9EB 75%);
    background-position: 0 0, 6px 6px;
    background-size: 12px 12px;
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    height: 84px;
    object-fit: contain;
    width: 84px;
}

/* Clickable thumb → larger preview modal (empty placeholder stays inert). */
#lgsb-uploader .lgsb-file-thumb:not(.lgsb-file-thumb-empty) {
    cursor: pointer;
}

#lgsb-uploader .lgsb-file-thumb:not(.lgsb-file-thumb-empty):focus-visible {
    outline: 2px solid var(--lgsb-teal);
    outline-offset: 2px;
}

/* Black background override — reveals white-ink artwork */
#lgsb-uploader .lgsb-file-thumb.lgsb-thumb-dark {
    background-color: #000;
    background-image: none;
}

/* Dark-mode toggle button — appears on hover (always visible when active) */
#lgsb-uploader .lgsb-thumb-dark-btn {
    align-items: center;
    background: rgba(0, 0, 0, 0.50);
    border: none;
    border-radius: 3px;
    bottom: 4px;
    color: #fff;
    cursor: pointer;
    display: flex;
    height: 20px;
    justify-content: center;
    opacity: 0;
    padding: 0;
    position: absolute;
    right: 4px;
    transition: opacity var(--lgsb-dur-fast, 0.12s), background var(--lgsb-dur-fast, 0.12s);
    width: 20px;
}

#lgsb-uploader .lgsb-thumb-wrap:hover .lgsb-thumb-dark-btn,
#lgsb-uploader .lgsb-thumb-dark-btn.lgsb-thumb-dark-active {
    opacity: 1;
}

#lgsb-uploader .lgsb-thumb-dark-btn.lgsb-thumb-dark-active {
    background: rgba(255, 255, 255, 0.30);
    color: #000;
}

#lgsb-uploader .lgsb-fc-title {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

/* File-name row — its own full-width line under the thumbnail (v2.97.1);
   pulled slightly closer to the head than the card's column gap. */
#lgsb-uploader .lgsb-fc-name {
    display: flex;
    flex-direction: column;
    gap: 3px;
    margin-top: calc(-1 * var(--lgsb-space-2));
    min-width: 0;
}

/* Design name — inline-editable, OS-style (click to rename; Enter/blur
   save, Esc restores). Reads as plain text until hovered/focused. */
#lgsb-uploader .lgsb-name-wrap {
    align-items: center;
    display: flex;
    gap: 4px;
    min-width: 0;
    /* Cancel the input's own padding so the resting label stays optically
       aligned with the card edge like the old static filename. */
    margin-left: -4px;
}

#lgsb-uploader .lgsb-row-name {
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text);
    cursor: text;
    flex: 1 1 auto;
    font-family: var(--lgsb-font-family);
    font-size: 13px;
    font-weight: var(--lgsb-weight-semibold);
    line-height: var(--lgsb-leading-tight);
    min-width: 0;
    overflow: hidden;
    padding: 2px 4px;
    text-overflow: ellipsis;
    width: 100%;
}

#lgsb-uploader .lgsb-row-name:hover,
#lgsb-uploader .lgsb-row-name:focus {
    background: var(--lgsb-surface);
    box-shadow: inset 0 0 0 1px var(--lgsb-border);
    outline: none;
}

#lgsb-uploader .lgsb-row-name:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
}

/* Pencil affordance + save-state indicator. Resting: hidden; hover reveals
   the pencil; saving/saved/error states take over the same slot. */
#lgsb-uploader .lgsb-name-state {
    align-items: center;
    color: var(--lgsb-text-muted);
    display: inline-flex;
    flex: 0 0 auto;
    height: 14px;
    justify-content: center;
    opacity: 0;
    transition: opacity var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 14px;
}

#lgsb-uploader .lgsb-name-wrap:hover .lgsb-name-state {
    opacity: .55;
}

#lgsb-uploader .lgsb-name-saving .lgsb-name-state,
#lgsb-uploader .lgsb-name-saved .lgsb-name-state,
#lgsb-uploader .lgsb-name-error .lgsb-name-state {
    opacity: 1;
}

#lgsb-uploader .lgsb-name-saving .lgsb-name-state svg,
#lgsb-uploader .lgsb-name-saved .lgsb-name-state svg,
#lgsb-uploader .lgsb-name-error .lgsb-name-state svg {
    display: none;
}

#lgsb-uploader .lgsb-name-saving .lgsb-name-state::after {
    animation: lgsb-spin .6s linear infinite;
    border: 2px solid var(--lgsb-border);
    border-radius: 50%;
    border-top-color: var(--lgsb-primary);
    content: "";
    height: 9px;
    width: 9px;
}

#lgsb-uploader .lgsb-name-saved .lgsb-name-state {
    color: var(--lgsb-success);
}

#lgsb-uploader .lgsb-name-saved .lgsb-name-state::after {
    content: "\2713";
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-name-error .lgsb-name-state {
    color: var(--lgsb-error-text);
}

#lgsb-uploader .lgsb-name-error .lgsb-name-state::after {
    content: "!";
    font-size: 11px;
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-name-error .lgsb-row-name {
    box-shadow: inset 0 0 0 1px var(--lgsb-error);
}

/* Original filename — subdued secondary line, shown only when a custom
   display name exists so production can always identify the source file. */
#lgsb-uploader .lgsb-name-original {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-pill);
    margin: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* The trash button is parked at the header's right edge on the second line
   (v2.43.5) — keep the secondary text lines from sliding under it.
   (v2.97.1: the name lines moved below the head, so only file-meta needs
   the clearance now.) */
#lgsb-uploader .lgsb-fc-title .lgsb-file-meta {
    padding-right: 32px;
}

#lgsb-uploader .lgsb-file-meta {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-pill);
}

#lgsb-uploader .lgsb-fc-title .lgsb-status-badge {
    align-self: flex-start;
    margin-top: 2px;
}

/* Out of the header flex row (v2.43.5) so the editable name field spans the
   full card width; parked at the right edge on the second line instead. */
#lgsb-uploader .lgsb-remove-btn {
    align-items: center;
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    height: 28px;
    justify-content: center;
    padding: 0;
    position: absolute;
    right: 0;
    top: 28px;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 28px;
}

#lgsb-uploader .lgsb-remove-btn:hover {
    background: var(--lgsb-error-bg);
    color: var(--lgsb-error-text);
}

/* DPI + Copies row — thin rule above, thin vertical rule between the two
   blocks (mock). Card dividers are deliberately 1px (thinner than the global
   divider token). */
#lgsb-uploader .lgsb-fc-meta {
    border-top: 1px solid var(--lgsb-border);
    display: flex;
    gap: var(--lgsb-space-3);
    justify-content: space-between;
    padding-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-fc-block {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

/* First block (DPI) shrinks to the width of its pill so the EXCELLENT
   caption centers under it; the Copies block takes the remaining width. */
#lgsb-uploader .lgsb-fc-meta .lgsb-fc-block:first-child {
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-fc-block + .lgsb-fc-block {
    border-left: 1px solid var(--lgsb-border);
    flex: 1 1 auto;
    padding-left: var(--lgsb-space-3);
}

/* Card section labels — ink, sentence case as written in the markup */
#lgsb-uploader .lgsb-fc-label {
    color: var(--lgsb-ink);
    font-size: 12px;
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-dpi-pill {
    align-self: flex-start;
}

#lgsb-uploader .lgsb-dpi-quality {
    color: var(--lgsb-ink);
    font-size: 9px;
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    text-align: center; /* centers under the DPI tag (block shrinks to tag width) */
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-fc-dims {
    border-top: 1px solid var(--lgsb-border);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    padding-top: var(--lgsb-space-3);
}

/* Card footer: Move-to (jobs) + price. Keeps the .lgsb-actions-cell class —
   JS prepends the move select into it when grouping turns on. */
#lgsb-uploader .lgsb-fc-foot {
    align-items: center;
    border-top: 1px solid var(--lgsb-border);
    display: flex;
    gap: 10px;
    justify-content: flex-end;
    margin-top: auto;
    padding-top: var(--lgsb-space-3);
}

/* The move control gets a fixed 120px basis and may shrink (its select
   ellipsizes via width:100%); the price never shrinks and is pushed hard
   right — prevents the select from overflowing into "PRICE" on narrow cards. */
#lgsb-uploader .lgsb-fc-foot .lgsb-move {
    flex: 0 1 120px;
    min-width: 0;
}

#lgsb-uploader .lgsb-fc-foot .lgsb-fc-price {
    flex: 0 0 auto;
    margin-left: auto;
}

#lgsb-uploader .lgsb-fc-price {
    align-items: baseline;
    display: inline-flex;
    gap: var(--lgsb-space-2);
}

/* Duplicate — subtle outlined action, centered at the card's bottom edge.
   Clones the design server-side (copies reset to 1). */
/* Bottom button row on each design card — Visualize + Duplicate. */
#lgsb-uploader .lgsb-fc-btnrow {
    align-items: center;
    align-self: center;
    display: flex;
    gap: 8px;
    justify-content: center;
}

#lgsb-uploader .lgsb-visualize-btn {
    align-items: center;
    background: transparent;
    border: 1px solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-teal-dark);
    cursor: pointer;
    display: inline-flex;
    font-family: var(--lgsb-font-family);
    font-size: 10px;
    font-weight: var(--lgsb-weight-semibold);
    gap: 5px;
    letter-spacing: .06em;
    line-height: 1;
    padding: 6px 14px;
    text-transform: uppercase;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-visualize-btn:hover {
    background: var(--lgsb-teal-soft);
}

#lgsb-uploader .lgsb-duplicate-btn {
    align-self: center;
    background: transparent;
    border: 1px solid var(--lgsb-ink);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-ink);
    cursor: pointer;
    font-family: var(--lgsb-font-family);
    font-size: 10px;
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .06em;
    line-height: 1;
    padding: 6px 16px;
    text-transform: uppercase;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-duplicate-btn:hover {
    background: var(--lgsb-surface-dim);
}

#lgsb-uploader .lgsb-fc-price-label {
    color: var(--lgsb-ink);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-row-price {
    color: var(--lgsb-ink);
    font-size: 18px;
    font-weight: 700; /* deliberately heavier than the bold token, per mock */
    transition: opacity var(--lgsb-dur-base) var(--lgsb-ease);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-row-price.lgsb-price-pending {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    text-transform: uppercase;
}

/* Upload-error card (failed upload; carries Retry/Dismiss) */
#lgsb-uploader .lgsb-error-row {
    background: var(--lgsb-error-bg);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-error-border);
    border-radius: var(--lgsb-radius-nested);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    grid-column: 1 / -1;
    padding: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-error-filename {
    font-size: var(--lgsb-font-title-3);
    font-weight: var(--lgsb-weight-semibold);
    overflow-wrap: anywhere;
}

#lgsb-uploader .lgsb-error-msg {
    color: var(--lgsb-error-text);
    font-size: var(--lgsb-font-body-sm);
    margin-top: 2px;
}

#lgsb-uploader .lgsb-error-actions {
    display: flex;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-error-actions .lgsb-btn-ghost {
    border: var(--lgsb-button-border-width) solid var(--lgsb-error-border);
    border-radius: var(--lgsb-radius-sm);
    cursor: pointer;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    padding: 6px 14px;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-error-retry {
    color: var(--lgsb-error-text);
}

/* --- 4.8 Job cards (flat redesign, v2.58.0) ---
   Flat rounded-rectangle cards in one horizontally-scrolling strip with
   left/right arrow buttons. Card = header row (drag grip + inline-rename
   name), 3-stat row (DESIGNS / TOTAL / SETTINGS gear) with vertical
   dividers, footer (centered status PILL + trash). No card-wide status
   tints — the pill alone carries the status color. Inactive cards are
   white; the ACTIVE card is teal-soft with a teal-dark border and teal-mid
   dividers — its stats stay visible. While the workspace is collapsed
   ("See All" / Manage Jobs title click) the strip wraps into a multi-row
   grid instead and the arrows hide (§5 state matrix). */
#lgsb-uploader .lgsb-jobs-strip {
    align-items: stretch;
    display: none; /* state matrix */
    gap: var(--lgsb-space-2);
    margin-bottom: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-jobs-arrow {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-button-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    flex: 0 0 26px;
    justify-content: center;
    padding: 0;
    transition: border-color var(--lgsb-dur-fast) var(--lgsb-ease),
                color var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-jobs-arrow:hover:not(:disabled) {
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-jobs-arrow:disabled {
    cursor: default;
    opacity: .35;
}

#lgsb-uploader .lgsb-jobs-arrow:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

/* JS adds this class whenever every card already fits the strip */
#lgsb-uploader .lgsb-jobs-strip.lgsb-jobs-no-scroll .lgsb-jobs-arrow {
    display: none;
}

/* Single row, fixed-size cards, no wrapping — the arrows scroll it. The
   native scrollbar hides (the arrows are the affordance) but the strip
   still scrolls by trackpad/touch. */
#lgsb-uploader .lgsb-job-cards {
    display: flex;
    flex: 1;
    gap: var(--lgsb-space-3);
    min-width: 0;
    overflow-x: auto;
    scroll-behavior: smooth;
    scrollbar-width: none;
}

#lgsb-uploader .lgsb-job-cards::-webkit-scrollbar {
    display: none;
}

/* Pointer drag-to-scroll (bindEvents): smooth-behavior would fight the
   pointer, and a drag must not select card text */
#lgsb-uploader .lgsb-job-cards.lgsb-strip-dragging {
    cursor: grabbing;
    scroll-behavior: auto;
    user-select: none;
}

#lgsb-uploader .lgsb-strip-dragging .lgsb-job-card {
    cursor: grabbing;
}

#lgsb-uploader .lgsb-job-card {
    background: var(--lgsb-surface);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    box-shadow: var(--lgsb-shadow-nested);
    cursor: pointer;
    display: flex;
    flex: 0 0 205px;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    padding: var(--lgsb-space-3);
    position: relative;
    transition: border-color var(--lgsb-dur-base) var(--lgsb-ease),
                box-shadow var(--lgsb-dur-base) var(--lgsb-ease),
                background var(--lgsb-dur-base) var(--lgsb-ease);
    width: 205px;
}

#lgsb-uploader .lgsb-job-card:hover {
    border-color: #C7D6D9;
    box-shadow: var(--lgsb-shadow-raised);
}

/* Active job — light teal card, dark teal border, teal-mid dividers.
   Stats stay visible (the closed-folder treatment is retired). The border
   steps up to the primary card weight (3px) plus a soft teal glow so the
   active card reads at a glance (theme-combat-style literal: the shadow
   tokens are neutral black, this glow is deliberately brand-tinted). */
#lgsb-uploader .lgsb-job-card-active,
#lgsb-uploader .lgsb-job-card-active:hover {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal-dark);
    border-width: var(--lgsb-card-border-width);
    box-shadow: 0 2px 10px rgba(0, 125, 145, .28);
}

/* Card header row — drag grip + inline-rename name */
#lgsb-uploader .lgsb-job-card-head {
    align-items: center;
    display: flex;
    gap: 4px;
}

#lgsb-uploader .lgsb-job-drag {
    align-items: center;
    color: var(--lgsb-text-muted);
    cursor: grab;
    display: inline-flex;
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-job-name {
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text);
    cursor: text;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    min-width: 0;
    padding: 2px 4px;
    width: 100%;
}

#lgsb-uploader .lgsb-job-name:hover:not(:disabled),
#lgsb-uploader .lgsb-job-name:focus {
    background: var(--lgsb-surface);
    box-shadow: inset 0 0 0 1px var(--lgsb-border);
    outline: none;
}

#lgsb-uploader .lgsb-job-name:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
}

#lgsb-uploader .lgsb-job-card-stats {
    display: grid;
    gap: var(--lgsb-space-2) 0; /* dividers carry the column rhythm */
    grid-template-columns: repeat(3, 1fr);
}

#lgsb-uploader .lgsb-jc-stat {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-width: 0;
    padding: 0 4px; /* keep labels clear of the divider lines */
    text-align: center;
}

#lgsb-uploader .lgsb-jc-stat + .lgsb-jc-stat {
    border-left: var(--lgsb-divider-width) solid var(--lgsb-border);
}

/* Active card dividers — teal-mid: between the border teal and the
   teal-soft fill, per mockup. */
#lgsb-uploader .lgsb-job-card-active .lgsb-jc-stat + .lgsb-jc-stat {
    border-left-color: var(--lgsb-teal-mid);
}

#lgsb-uploader .lgsb-jc-num {
    font-size: var(--lgsb-font-title-3);
    font-weight: var(--lgsb-weight-bold);
    transition: opacity var(--lgsb-dur-base) var(--lgsb-ease);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-jc-lbl {
    color: var(--lgsb-text); /* card text is ink, not muted (user call) */
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    text-transform: uppercase;
}

/* Card footer — centered status pill; quiet trash pinned to the right */
#lgsb-uploader .lgsb-job-card-foot {
    align-items: center;
    display: flex;
    justify-content: center;
    margin-top: auto;
    min-height: 26px;
    position: relative;
}

#lgsb-uploader .lgsb-job-card-foot .lgsb-job-delete {
    position: absolute;
    right: 0;
}

/* Job status — small colored PILL; the only status color on the card
   (folder redesign: no card-wide background tints). */
#lgsb-uploader .lgsb-job-status {
    align-items: center;
    border-radius: var(--lgsb-radius-pill);
    display: inline-flex;
    font-size: 11px;
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .02em;
    line-height: 1;
    padding: 5px 10px;
}

#lgsb-uploader .lgsb-job-status.lgsb-jc-ready      { background: var(--lgsb-success-soft); color: var(--lgsb-success-text); }
#lgsb-uploader .lgsb-job-status.lgsb-jc-review,
#lgsb-uploader .lgsb-job-status.lgsb-jc-processing { background: var(--lgsb-warning-soft); color: var(--lgsb-warning-text); }
#lgsb-uploader .lgsb-job-status.lgsb-jc-error      { background: var(--lgsb-error-soft); color: var(--lgsb-error-text); }
#lgsb-uploader .lgsb-job-status.lgsb-jc-empty      { background: var(--lgsb-surface-dim); color: var(--lgsb-text-muted); }

/* Trash — quiet icon button; red hover states the destructive intent */
#lgsb-uploader .lgsb-job-delete {
    align-items: center;
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    height: 26px;
    justify-content: center;
    padding: 0;
    width: 26px;
}

#lgsb-uploader .lgsb-job-delete:hover {
    background: var(--lgsb-error-bg);
    color: var(--lgsb-error-text);
}

#lgsb-uploader .lgsb-job-delete:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

/* Gear — Job Settings popover trigger, third stat column */
#lgsb-uploader .lgsb-jc-settings-stat {
    align-items: center;
    justify-content: center;
}

#lgsb-uploader .lgsb-job-settings-btn {
    align-items: center;
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text); /* ink like the rest of the card (user call) */
    cursor: pointer;
    display: inline-flex;
    height: 28px;
    justify-content: center;
    padding: 0;
    width: 28px;
}

#lgsb-uploader .lgsb-job-settings-btn:hover {
    background: var(--lgsb-surface);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-job-settings-btn:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

/* Job Settings popover — compact dialog anchored to the gear. It lives on
   the #lgsb-uploader root (NOT inside the card): the card strip is an
   overflow-x scroller, which also clips vertically — a card-anchored pop
   would fall inside the scroll box and force scrolling to read it. JS sets
   top/left inline from the gear's rect (the uploader's container-type makes
   it the containing block). */
#lgsb-uploader .lgsb-job-settings-pop {
    background: var(--lgsb-surface);
    border: var(--lgsb-divider-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    box-shadow: var(--lgsb-shadow-raised);
    cursor: default;
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    padding: var(--lgsb-space-3);
    position: absolute;
    width: 250px;
    z-index: var(--lgsb-z-menu);
}

#lgsb-uploader .lgsb-jsp-title {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    margin: 0;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-jsp-field {
    display: flex;
    flex-direction: column;
    gap: 3px;
}

#lgsb-uploader .lgsb-jsp-contour-field {
    align-items: flex-start;
    display: flex;
    flex-direction: row;
    gap: var(--lgsb-space-1);
}

#lgsb-uploader .lgsb-jsp-check {
    align-items: flex-start;
    cursor: pointer;
    display: flex;
    flex: 1;
    font-size: var(--lgsb-font-caption);
    gap: 6px;
    line-height: 1.35;
}

#lgsb-uploader .lgsb-jsp-check input[type="checkbox"] {
    accent-color: var(--lgsb-primary);
    flex: 0 0 auto;
    margin-top: 1px;
}

#lgsb-uploader .lgsb-jsp-sep {
    border-top: var(--lgsb-divider-width) solid var(--lgsb-border);
    margin: 2px 0;
}

#lgsb-uploader .lgsb-jsp-action {
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text);
    cursor: pointer;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body-sm);
    padding: 7px 8px;
    text-align: left;
}

#lgsb-uploader .lgsb-jsp-action:hover:not(:disabled) {
    background: var(--lgsb-surface-dim);
}

#lgsb-uploader .lgsb-jsp-action:disabled {
    color: var(--lgsb-text-muted);
    cursor: not-allowed;
    opacity: .55;
}

#lgsb-uploader .lgsb-jsp-delete {
    color: var(--lgsb-error-text);
}

#lgsb-uploader .lgsb-jsp-delete:hover:not(:disabled) {
    background: var(--lgsb-error-bg);
}

/* Dashed "+" new-job tile — same footprint as the cards */
#lgsb-uploader .lgsb-job-add-tile {
    align-items: center;
    background: transparent;
    border: 2px dashed var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: flex;
    flex: 0 0 205px;
    flex-direction: column;
    font-family: var(--lgsb-font-family);
    gap: var(--lgsb-space-1);
    justify-content: center;
    min-height: 108px;
    padding: var(--lgsb-space-3);
    width: 205px;
    transition: border-color var(--lgsb-dur-base) var(--lgsb-ease),
                color var(--lgsb-dur-base) var(--lgsb-ease),
                background var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-job-add-tile:hover:not(:disabled),
#lgsb-uploader .lgsb-job-add-tile:focus-visible {
    background: var(--lgsb-teal-soft);
    border-color: var(--lgsb-teal);
    color: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-job-add-tile:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

#lgsb-uploader .lgsb-job-add-plus {
    font-size: 26px;
    font-weight: var(--lgsb-weight-bold);
    line-height: 1;
}

#lgsb-uploader .lgsb-job-add-text {
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    text-align: center;
}

#lgsb-uploader .lgsb-job-add-tile:disabled,
#lgsb-uploader .lgsb-job-add-tile.lgsb-job-add-disabled {
    cursor: not-allowed;
    opacity: .6;
}

/* Transient notice under the card grid (combine failures, busy warnings) */
#lgsb-uploader .lgsb-jobs-notice {
    color: var(--lgsb-error-text);
    font-size: var(--lgsb-font-body-sm);
    margin: calc(-1 * var(--lgsb-space-2)) 0 var(--lgsb-space-3);
}

/* Drag-reorder feedback (instant, no transition) */
#lgsb-uploader .lgsb-job-card.lgsb-job-dragging {
    opacity: .5;
}

#lgsb-uploader .lgsb-job-card.lgsb-job-drop-before {
    box-shadow: -3px 0 0 0 var(--lgsb-teal);
}

#lgsb-uploader .lgsb-job-card.lgsb-job-drop-after {
    box-shadow: 3px 0 0 0 var(--lgsb-teal);
}

/* --- 4.9 Active job bar (v2.58.0) ---
   ONE full-width teal bar across the top of the workspace: the job name
   (editable in place — left, larger and more prominent than anything else
   in the bar) + right-aligned job controls (Cutting Gap · Contour Nesting ·
   Merge Job · trash) separated by thin divider lines. The bar's bottom
   16px slide under the workspace card (negative margin) and the card
   paints on top (section has z-index 1, bar z-index 0), so the card keeps
   ALL of its rounded corners. */
/* --- Sticky workspace header (jobs mode) ---
   Wraps the teal active-job tab AND the actions row below it so they stick
   TOGETHER while scrolling the active job's cards — the customer always
   sees which job they're editing. Sticky (never fixed — container-type)
   bounded by .lgsb-designs-panel, so it releases before the pricing
   section. Must paint ABOVE .lgsb-files-section (z-index 1), which is why
   the old tab-tucks-behind-the-section join moved inside this wrapper: the
   actions row now covers the teal bar's 16px tuck strip instead. */
#lgsb-uploader .lgsb-ws-header {
    box-shadow: var(--lgsb-shadow-nested);
    display: none; /* state matrix */
    margin-top: var(--lgsb-space-3);
    position: sticky;
    top: var(--lgsb-sticky-top);
    z-index: var(--lgsb-z-sticky);
}

#lgsb-uploader .lgsb-active-job-tab {
    display: none; /* state matrix */
    position: relative;
    z-index: 0;
}

/* Workspace actions row: Select Files | Design Vault | hosted Bulk Actions
   bar. Overlaps the teal bar by the 16px its bottom padding reserves for
   the tuck (26px pad − 10px visual), taking over the join the files
   section used to provide, and leans on the section's own top border as
   the divider to the cards below. */
#lgsb-uploader .lgsb-ws-actions {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-card-border-width) solid var(--lgsb-teal);
    border-bottom: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2) var(--lgsb-space-3);
    margin-top: -16px;
    padding: var(--lgsb-space-3) var(--lgsb-space-4);
    position: relative;
    z-index: 1;
}

#lgsb-uploader .lgsb-ws-bar {
    align-items: center;
    background: var(--lgsb-teal);
    border-radius: var(--lgsb-radius-card) var(--lgsb-radius-card) 0 0;
    color: #fff;
    display: flex;
    flex: 1;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2) var(--lgsb-space-4);
    padding: 10px 18px 26px;
}

/* Job name — click to rename in place; the pencil is the affordance */
#lgsb-uploader .lgsb-ws-name-wrap {
    align-items: center;
    display: inline-flex;
    gap: 4px;
    max-width: 100%;
    min-width: 0;
}

#lgsb-uploader .lgsb-ws-name {
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: #fff;
    cursor: text;
    font-family: var(--lgsb-font-family);
    font-size: 16px;
    font-weight: var(--lgsb-weight-bold);
    min-width: 0;
    padding: 2px 6px;
    width: 200px;
}

/* Where supported, the input hugs its own text so the pencil sits right
   after the name (200px fixed width is the fallback). */
@supports (field-sizing: content) {
    #lgsb-uploader .lgsb-ws-name {
        field-sizing: content;
        max-width: 340px;
        min-width: 70px;
        width: auto;
    }
}

#lgsb-uploader .lgsb-ws-name::placeholder {
    color: rgba(255, 255, 255, .8);
}

#lgsb-uploader .lgsb-ws-name:hover:not(:disabled),
#lgsb-uploader .lgsb-ws-name:focus {
    background: rgba(255, 255, 255, .12);
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .5);
    outline: none;
}

/* Pencil — clicking it focuses the name input (see bindEvents) */
#lgsb-uploader .lgsb-ws-name-edit {
    align-items: center;
    background: transparent;
    border: none;
    color: rgba(255, 255, 255, .8);
    cursor: pointer;
    display: inline-flex;
    flex: none;
    padding: 2px;
}

#lgsb-uploader .lgsb-ws-name-edit:hover {
    color: #fff;
}

#lgsb-uploader .lgsb-ws-name-edit:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

/* Right-aligned job controls (job gap, contour choice + job contour gap,
   Merge Job, delete). Mirrors the Job Settings popover state. */
#lgsb-uploader .lgsb-ws-tools {
    align-items: center;
    display: inline-flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2) var(--lgsb-space-3);
    margin-left: auto;
}

/* Thin divider lines between the bar's control groups */
#lgsb-uploader .lgsb-ws-sep {
    background: rgba(255, 255, 255, .35);
    display: inline-block;
    height: 22px;
    width: 1px;
}

#lgsb-uploader .lgsb-ws-icon {
    align-items: center;
    color: rgba(255, 255, 255, .9);
    display: inline-flex;
    flex: 0 0 auto;
}

#lgsb-uploader .lgsb-ws-unit {
    color: rgba(255, 255, 255, .85);
    font-size: var(--lgsb-font-caption);
}

/* Job contour gap disclosure — shown only while the job's contour is ON */
#lgsb-uploader .lgsb-ws-cgap-wrap {
    align-items: center;
    display: inline-flex;
    gap: 4px;
}

#lgsb-uploader .lgsb-ws-cgap-wrap[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-ws-tool {
    align-items: center;
    cursor: pointer;
    display: inline-flex;
    gap: 6px;
}

#lgsb-uploader .lgsb-ws-tool-label {
    color: #fff;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    text-transform: uppercase;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-ws-gap {
    -moz-appearance: textfield;
    appearance: textfield;
    background: rgba(255, 255, 255, .92);
    border: none;
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-caption);
    font-weight: var(--lgsb-weight-semibold);
    height: 26px;
    padding: 0 4px;
    text-align: center;
    width: 58px;
}

#lgsb-uploader .lgsb-ws-gap:focus {
    background: #fff;
    outline: 2px solid rgba(255, 255, 255, .6);
}

#lgsb-uploader .lgsb-ws-contour {
    accent-color: #fff;
}

#lgsb-uploader .lgsb-ws-contour-info {
    color: #fff;
}

/* The bar's switch sits on teal — a checked teal track would vanish, so it
   deepens to teal-dark with a faint white outline. */
#lgsb-uploader .lgsb-ws-contour-switch .lgsb-switch-track {
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .45);
}

#lgsb-uploader .lgsb-ws-contour-switch input:checked + .lgsb-switch-track {
    background: var(--lgsb-teal-dark);
}

#lgsb-uploader .lgsb-ws-combine {
    background: rgba(255, 255, 255, .14);
    border: 1px solid rgba(255, 255, 255, .55);
    border-radius: var(--lgsb-radius-sm);
    color: #fff;
    cursor: pointer;
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    padding: 6px 12px;
    text-transform: uppercase;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-ws-combine:hover:not(:disabled) {
    background: rgba(255, 255, 255, .25);
}

#lgsb-uploader .lgsb-ws-combine:disabled {
    cursor: not-allowed;
    opacity: .55;
}

/* Workspace trash — icon-only sibling of Merge Job; red hover states the
   destructive intent even on teal */
#lgsb-uploader .lgsb-ws-delete {
    align-items: center;
    background: rgba(255, 255, 255, .14);
    border: 1px solid rgba(255, 255, 255, .55);
    border-radius: var(--lgsb-radius-sm);
    color: #fff;
    cursor: pointer;
    display: inline-flex;
    height: 28px;
    justify-content: center;
    padding: 0;
    width: 30px;
}

#lgsb-uploader .lgsb-ws-delete:hover:not(:disabled) {
    background: var(--lgsb-error-text);
    border-color: var(--lgsb-error-text);
}

/* Workspace card sits ON TOP of the tab (see 4.9) — full radius kept. */
#lgsb-uploader.lgsb-jobs-on.lgsb-ws-open .lgsb-files-section {
    margin-top: 0;
}

/* Workspace footer (both order layouts): full-width Update Order Summary
   on top, then the upload dropzone and vault zone side by side. */
#lgsb-uploader .lgsb-active-actions {
    display: none; /* state matrix */
    flex-direction: column;
    gap: var(--lgsb-space-4);
    margin-top: var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-actions-zones {
    align-items: stretch;
    display: flex;
    gap: var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-actions-zones > * {
    flex: 1 1 0;
    min-width: 0;
}

#lgsb-uploader .lgsb-ws-update-btn {
    min-height: 56px;
    width: 100%;
}

/* Workspace update button mirrors the sidebar status card's palette:
   teal fill while the summary needs updating, soft success green once it
   is current (matching .lgsb-order-status--clean's confirmation button).
   Extra class/:not() specificity beats the shared secondary + disabled
   button rules in §3.1. */
#lgsb-uploader.lgsb-order-dirty .lgsb-ws-update-btn:not(:disabled) {
    background: var(--lgsb-teal);
    box-shadow: none;
    color: #fff;
}

#lgsb-uploader.lgsb-order-dirty .lgsb-ws-update-btn:hover:not(:disabled) {
    background: var(--lgsb-teal);
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, .13);
}

#lgsb-uploader:not(.lgsb-order-dirty) .lgsb-ws-update-btn:disabled {
    background: var(--lgsb-success-border);
    box-shadow: none;
    color: var(--lgsb-success-text);
    cursor: default;
}

/* --- 4.10 Order Summary sidebar --- */
#lgsb-uploader .lgsb-summary-card {
    overflow: hidden;
}

#lgsb-uploader .lgsb-summary-header {
    background: var(--lgsb-teal);
    padding: 36px var(--lgsb-space-5); /* tall teal band per mock (off-scale on purpose) */
    text-align: center;
}

/* Deliberately NOT title-1: the Order Summary header is the largest title on
   the page (own token) with a lighter weight, per the mock. */
#lgsb-uploader .lgsb-summary-header h2 {
    color: #fff;
    font-size: var(--lgsb-font-summary-title);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .05em;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-summary-body {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-4);
    padding: var(--lgsb-card-padding);
}

#lgsb-uploader .lgsb-summary-stats {
    display: grid;
    gap: var(--lgsb-space-4);
    grid-template-columns: 1fr 1fr;
}

#lgsb-uploader .lgsb-summary-stats > div + div {
    border-left: var(--lgsb-divider-width) solid var(--lgsb-border);
    padding-left: var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-stat-label {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-stat-value,
#lgsb-uploader .lgsb-rate-value {
    font-size: var(--lgsb-font-stat);
    font-weight: var(--lgsb-weight-bold);
    line-height: var(--lgsb-leading-tight);
    margin-top: 2px;
    transition: opacity var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-stat-divider {
    background: var(--lgsb-border);
    height: var(--lgsb-divider-width);
}

#lgsb-uploader .lgsb-summary-rate {
    align-items: center;
    display: flex;
    gap: var(--lgsb-space-3);
    justify-content: space-between;
}

/* "TOTAL" label — black and ~50% larger than standard stat labels */
#lgsb-uploader .lgsb-total-block .lgsb-stat-label {
    color: var(--lgsb-ink);
    font-size: 15px;
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-stat-total {
    color: var(--lgsb-teal);
    font-size: var(--lgsb-font-display);
}

#lgsb-uploader .lgsb-stat-total.lgsb-flash {
    animation: lgsb-total-flash 250ms var(--lgsb-ease-out);
    transform-origin: left center;
}

@keyframes lgsb-total-flash {
    0%   { opacity: .4; transform: scale(1); }
    50%  { opacity: 1;  transform: scale(1.03); }
    100% { transform: scale(1); }
}

/* Order status card — Dirty / Updating / Clean */
#lgsb-uploader .lgsb-order-status {
    border-radius: var(--lgsb-radius-nested);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-space-4);
    transition: background var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-order-status--dirty,
#lgsb-uploader .lgsb-order-status--updating {
    background: var(--lgsb-warning-bg);
}

#lgsb-uploader .lgsb-order-status--clean {
    background: var(--lgsb-success-soft);
    border: 1px solid var(--lgsb-success-border);
}

#lgsb-uploader .lgsb-order-status-row {
    align-items: flex-start;
    display: flex;
    gap: 10px;
}

#lgsb-uploader .lgsb-order-status-icon {
    display: inline-flex;
    flex: 0 0 20px;
    height: 20px;
    margin-top: 1px;
    width: 20px;
}

#lgsb-uploader .lgsb-order-status-icon svg {
    height: 20px;
    width: 20px;
}

#lgsb-uploader .lgsb-order-status--dirty .lgsb-order-status-icon,
#lgsb-uploader .lgsb-order-status--updating .lgsb-order-status-icon {
    color: var(--lgsb-warning-text);
}

#lgsb-uploader .lgsb-order-status--clean .lgsb-order-status-icon {
    color: var(--lgsb-success-text);
}

#lgsb-uploader .lgsb-order-status-icon-clean { display: none; }
#lgsb-uploader .lgsb-order-status--clean .lgsb-order-status-icon-clean { display: block; }
#lgsb-uploader .lgsb-order-status--clean .lgsb-order-status-icon-dirty { display: none; }

#lgsb-uploader .lgsb-order-status-title {
    font-size: 13px;
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-order-status--dirty .lgsb-order-status-title,
#lgsb-uploader .lgsb-order-status--updating .lgsb-order-status-title {
    color: var(--lgsb-warning-text);
}

#lgsb-uploader .lgsb-order-status--clean .lgsb-order-status-title {
    color: var(--lgsb-ink);
}

#lgsb-uploader .lgsb-order-status-desc {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-body-sm);
    margin-top: 2px;
}

#lgsb-uploader .lgsb-update-summary-btn {
    position: relative;
    width: 100%;
}

/* Clean state renders the button as a success confirmation */
#lgsb-uploader .lgsb-order-status--clean .lgsb-update-summary-btn:disabled {
    background: var(--lgsb-success-border);
    color: var(--lgsb-success-text);
}

#lgsb-uploader .lgsb-update-btn-spinner {
    animation: lgsb-spin .7s linear infinite;
    border: 2px solid rgba(255, 255, 255, .35);
    border-radius: 50%;
    border-top-color: #fff;
    display: none;
    height: 14px;
    width: 14px;
}

@keyframes lgsb-spin {
    to { transform: rotate(360deg); }
}

#lgsb-uploader .lgsb-order-status--updating .lgsb-update-btn-spinner { display: inline-block; }
#lgsb-uploader .lgsb-order-status--updating .lgsb-update-btn-icon    { display: none; }

#lgsb-uploader .lgsb-update-btn-icon {
    display: none;
    height: 14px;
    width: 14px;
}

#lgsb-uploader .lgsb-order-status--clean .lgsb-update-btn-icon { display: inline-flex; }

#lgsb-uploader .lgsb-update-btn-icon svg {
    height: 14px;
    width: 14px;
}

/* While updating, keep the primary look (gray disabled would read as broken) */
#lgsb-uploader .lgsb-order-status--updating .lgsb-update-summary-btn:disabled {
    background: var(--lgsb-teal);
    color: #fff;
    cursor: progress;
}

#lgsb-uploader .lgsb-minimum-notice {
    background: var(--lgsb-teal-soft);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-teal);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    padding: var(--lgsb-space-2) var(--lgsb-space-3);
    text-align: center;
}

/* "Contour gap not applied" explainer — warning tone (informational, not an
   error: the order is still valid, the layout just reverted to standard). */
#lgsb-uploader .lgsb-contour-gap-notice {
    background: var(--lgsb-warning-bg);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-warning-text);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    line-height: 1.45;
    padding: var(--lgsb-space-2) var(--lgsb-space-3);
    text-align: center;
}

#lgsb-uploader .lgsb-preview-layout-btn {
    width: 100%;
}

#lgsb-uploader .lgsb-preview-layout-btn svg {
    flex: 0 0 auto;
}

/* Quick Estimate promo card — centered promo composition: teal icon tile,
   title, short pitch, and a real primary-button CTA (was a bare text link).
   Same markup in the bottom pricing row and the sidebar fallback. */
#lgsb-uploader .lgsb-quick-estimate {
    align-items: center;
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    justify-content: center;
    padding: var(--lgsb-space-3) 0;
    text-align: center;
}

#lgsb-uploader .lgsb-quick-head {
    align-items: center;
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-quick-icon {
    align-items: center;
    background: var(--lgsb-teal);
    border-radius: var(--lgsb-radius-input);
    color: #fff;
    display: inline-flex;
    height: 44px;
    justify-content: center;
    width: 44px;
}

#lgsb-uploader .lgsb-quick-title {
    color: var(--lgsb-ink);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .03em;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-quick-estimate p:not(.lgsb-quick-title) {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
    /* 340px: fits the longer v2.20.11 explainer copy in 4–5 centered lines */
    max-width: 340px;
}

/* CTA — filled primary button (anchor styled to the button recipe) */
#lgsb-uploader .lgsb-quick-estimate a {
    align-items: center;
    background: var(--lgsb-teal);
    border-radius: var(--lgsb-radius-button);
    color: #fff;
    display: inline-flex;
    font-size: var(--lgsb-font-button);
    font-weight: var(--lgsb-weight-bold);
    gap: var(--lgsb-space-2);
    letter-spacing: var(--lgsb-tracking-button);
    line-height: var(--lgsb-leading-tight);
    margin-top: var(--lgsb-space-2);
    padding: 11px 22px;
    text-decoration: none;
    text-transform: uppercase;
    transition: box-shadow var(--lgsb-dur-fast) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-quick-estimate a:hover {
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, .13);
    color: #fff;
}

/* Order options + confirmation cards */
#lgsb-uploader .lgsb-sidebar-card {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-card-padding);
}

#lgsb-uploader .lgsb-options-card h3 {
    color: var(--lgsb-teal);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    text-transform: uppercase;
}

/* Global Order Options — zone heading + one card with a cell per option
   (icon · label · control, helper text beneath) and a right-hand actions
   cell (Apply to Order / Save as Default). v2.54.0 redesign of the v2.49.0
   slim settings row. */
#lgsb-uploader .lgsb-global-options {
    margin-bottom: var(--lgsb-space-5);
}

#lgsb-uploader .lgsb-go-bar {
    align-items: stretch;
    background: var(--lgsb-surface);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    box-shadow: var(--lgsb-shadow-nested);
    display: flex;
    flex-wrap: wrap;
    padding: var(--lgsb-space-2) 0;
}

#lgsb-uploader .lgsb-go-cell {
    display: flex;
    flex: 1 1 260px;
    flex-direction: column;
    gap: var(--lgsb-space-1);
    justify-content: flex-start;
    min-width: 0;
    padding: var(--lgsb-space-1) var(--lgsb-space-4);
}

/* Vertical rules between cells (become horizontal when the bar wraps —
   handled in the small-container block in §6) */
#lgsb-uploader .lgsb-go-cell + .lgsb-go-cell {
    border-left: var(--lgsb-divider-width) solid var(--lgsb-border);
}

#lgsb-uploader .lgsb-go-main {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
    min-height: 34px;
}

#lgsb-uploader .lgsb-go-icon {
    align-items: center;
    color: var(--lgsb-ink);
    display: inline-flex;
    flex: 0 0 auto;
    justify-content: center;
}

#lgsb-uploader .lgsb-go-label {
    color: var(--lgsb-ink);
    cursor: pointer;
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    text-transform: uppercase;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-go-unit {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
}

/* Contour controls: the gap disclosure + toggle live in ONE right-aligned
   unit so the gap input always sits immediately LEFT of the toggle — never
   on its own row. The contour row itself never wraps: the label shrinks
   (ellipsis) before anything drops to a second line. */
#lgsb-uploader .lgsb-go-contour .lgsb-go-main {
    flex-wrap: nowrap;
}

#lgsb-uploader .lgsb-go-contour .lgsb-go-label {
    flex: 0 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

#lgsb-uploader .lgsb-go-contour-ctl {
    align-items: center;
    display: inline-flex;
    flex: 0 0 auto;
    gap: var(--lgsb-space-2);
    margin-left: auto;
}

/* Contour-gap disclosure — shown (JS) only while the global toggle is ON */
#lgsb-uploader .lgsb-go-contour-gap {
    align-items: center;
    display: inline-flex;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-go-contour-gap[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-go-cgap-label {
    color: var(--lgsb-text);
    cursor: pointer;
    font-size: var(--lgsb-font-caption);
    font-weight: var(--lgsb-weight-semibold);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-go-help {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
    line-height: 1.45;
}

/* Actions cell — stacked equal-width buttons + a transient status note */
#lgsb-uploader .lgsb-go-actions {
    flex: 0 1 200px;
    gap: var(--lgsb-space-2);
    justify-content: center;
}

#lgsb-uploader .lgsb-go-btn {
    padding: 8px 14px;
    text-transform: uppercase;
    white-space: nowrap;
    width: 100%;
}

#lgsb-uploader .lgsb-go-note {
    color: var(--lgsb-teal);
    font-size: var(--lgsb-font-caption);
    font-weight: var(--lgsb-weight-semibold);
    min-height: 1em;
    text-align: center;
}

/* Same recipe as the design-card inputs (.lgsb-dim-input / .lgsb-qty-input)
   — rule: every number input in the builder shares one look. */
#lgsb-uploader .lgsb-gap-input {
    -moz-appearance: textfield;
    appearance: textfield;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text);
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    height: 32px;
    padding: 0 var(--lgsb-space-2);
    text-align: center;
    transition: border-color var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 56px;
}

#lgsb-uploader .lgsb-gap-input:focus {
    border-color: var(--lgsb-teal);
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15);
    outline: none;
}

#lgsb-uploader .lgsb-gap-input::-webkit-outer-spin-button,
#lgsb-uploader .lgsb-gap-input::-webkit-inner-spin-button,
#lgsb-uploader .lgsb-ws-gap::-webkit-outer-spin-button,
#lgsb-uploader .lgsb-ws-gap::-webkit-inner-spin-button,
#lgsb-uploader .lgsb-jobgap-input::-webkit-outer-spin-button,
#lgsb-uploader .lgsb-jobgap-input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

/* Job Overview — sidebar navigator (visible only in jobs mode; see §5).
   Deliberately quieter than the main job cards: it's a jump list, not a
   second management surface. Rows share one 3-column grid with the header
   so the columns always align. */
#lgsb-uploader .lgsb-job-overview-card h3 {
    color: var(--lgsb-teal);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .04em;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-jo-head,
#lgsb-uploader .lgsb-jo-row {
    align-items: center;
    display: grid;
    gap: var(--lgsb-space-3);
    /* Fixed columns kept narrow and pulled in from the right edge (via the
       shared padding below) so the scrollbar never crowds the Total value. */
    grid-template-columns: minmax(0, 1fr) 58px 74px;
    padding-left: 10px;
    padding-right: 16px;
}

/* Sticky first child of the scroller — sharing the scroller's width means
   its columns always line up with the rows, scrollbar or not. */
#lgsb-uploader .lgsb-jo-head {
    background: var(--lgsb-surface);
    border-bottom: var(--lgsb-divider-width) solid var(--lgsb-border);
    padding-bottom: 6px;
    position: sticky;
    top: 0;
    z-index: 1;
}

#lgsb-uploader .lgsb-jo-head span {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    line-height: 14px;
    text-transform: uppercase;
}

/* Designs + Total values centered under their column titles */
#lgsb-uploader .lgsb-jo-head span:nth-child(2),
#lgsb-uploader .lgsb-jo-head span:nth-child(3),
#lgsb-uploader .lgsb-jo-row .lgsb-jo-count,
#lgsb-uploader .lgsb-jo-row .lgsb-jo-total {
    text-align: center;
}

/* Header (22px: 14 line + 6 pad + 2 border) + 5 rows (30px: 18 line + 12 pad)
   visible before scrolling; the list scrolls instead of growing the sticky
   sidebar. scrollbar-gutter keeps column positions identical whether or not
   the scrollbar is present. */
#lgsb-uploader .lgsb-jo-list {
    display: flex;
    flex-direction: column;
    max-height: 172px;
    overflow-y: auto;
    position: relative;
    scrollbar-gutter: stable;
}

#lgsb-uploader .lgsb-jo-row {
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text);
    cursor: pointer;
    flex: 0 0 auto;
    font-family: var(--lgsb-font-family);
    line-height: 18px;
    padding-bottom: 6px;
    padding-top: 6px;
    text-align: left;
    transition: background var(--lgsb-dur-fast) var(--lgsb-ease);
    width: 100%;
}

/* Alternating stripes, matching the Pricing Tiers card. The header is the
   list's first child, so even children are rows 1, 3, 5… (gray first). */
#lgsb-uploader .lgsb-jo-row:nth-child(even) {
    background: var(--lgsb-surface-dim);
}

#lgsb-uploader .lgsb-jo-row:hover {
    background: var(--lgsb-teal-soft);
}

#lgsb-uploader .lgsb-jo-row:focus-visible {
    box-shadow: var(--lgsb-focus-ring);
    outline: none;
}

/* Active job — solid brand teal, all text white (Pricing Tiers recipe) */
#lgsb-uploader .lgsb-jo-row.lgsb-jo-row-active,
#lgsb-uploader .lgsb-jo-row.lgsb-jo-row-active:hover {
    background: var(--lgsb-teal);
}

#lgsb-uploader .lgsb-jo-row.lgsb-jo-row-active .lgsb-jo-name,
#lgsb-uploader .lgsb-jo-row.lgsb-jo-row-active .lgsb-jo-count,
#lgsb-uploader .lgsb-jo-row.lgsb-jo-row-active .lgsb-jo-total {
    color: #fff;
}

#lgsb-uploader .lgsb-jo-name {
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-jo-count,
#lgsb-uploader .lgsb-jo-total {
    font-size: var(--lgsb-font-body-sm);
    transition: opacity var(--lgsb-dur-base) var(--lgsb-ease);
    white-space: nowrap;
}

#lgsb-uploader .lgsb-jo-total {
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-jo-empty {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
}

#lgsb-uploader .lgsb-order-option {
    display: flex;
    flex-direction: column;
}

#lgsb-uploader #lgsb-order-notes {
    display: none;
}

#lgsb-uploader #lgsb-order-notes.lgsb-notes-visible {
    display: block;
}

#lgsb-uploader .lgsb-confirm-card .lgsb-ack-text a {
    color: inherit;
    text-decoration: underline;
}

#lgsb-uploader .lgsb-sidebar-submit {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-cart-helper {
    color: var(--lgsb-warning-text);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    text-align: center;
}

/* --- 4.11 Bottom pricing section: Tiers | Quick Estimate | Notes ---
   Grey backdrop zone: the page shifts from white to grey once the customer
   is past the ordering portion. */
#lgsb-uploader .lgsb-pricing-section {
    background: var(--lgsb-zone-bg);
    border-radius: var(--lgsb-radius-card);
    margin-top: var(--lgsb-space-6);
    padding: var(--lgsb-space-5);
}

#lgsb-uploader .lgsb-pricing-grid {
    display: grid;
    gap: var(--lgsb-space-4);
    grid-template-columns: 1fr;
}

#lgsb-uploader .lgsb-pricing-grid .lgsb-card {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-card-padding);
}

#lgsb-uploader .lgsb-card-title {
    color: var(--lgsb-teal);
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .03em;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-tiers-table {
    width: 100%;
}

#lgsb-uploader .lgsb-tiers-table tr {
    align-items: center;
    border-radius: var(--lgsb-radius-sm);
    display: flex;
    font-size: var(--lgsb-font-body-sm);
    justify-content: space-between;
    padding: 8px 10px;
    transition: background var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-tiers-table tr:nth-child(odd) {
    background: var(--lgsb-surface-dim);
}

/* Active tier — solid brand teal, all text white (tds stay transparent via
   the combat reset, so the row background shows through) */
#lgsb-uploader .lgsb-tiers-table tr.lgsb-tier-active {
    background: var(--lgsb-teal);
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-tiers-table tr.lgsb-tier-active td,
#lgsb-uploader .lgsb-tiers-table tr.lgsb-tier-active td * {
    color: #fff;
}

#lgsb-uploader .lgsb-tier-price {
    font-weight: var(--lgsb-weight-bold);
    white-space: nowrap;
}

/* --- Price unit display (sq-in vs linear-in rates) ---
   Every rate is rendered twice (.lgsb-rate-sqin / .lgsb-rate-linear); the
   lgsb-unit-* class on #lgsb-uploader picks which variant shows. The sq-in
   figure is display-only — the order is always billed at the linear rate. */
#lgsb-uploader.lgsb-unit-sqin .lgsb-rate-linear,
#lgsb-uploader.lgsb-unit-linear .lgsb-rate-sqin {
    display: none;
}

/* SQ IN / LINEAR IN customer toggle — rendered only in "both" mode */
#lgsb-uploader .lgsb-tiers-card .lgsb-card-header {
    align-items: center;
    display: flex;
    gap: var(--lgsb-space-2);
    justify-content: space-between;
}

#lgsb-uploader .lgsb-unit-toggle {
    background: var(--lgsb-surface-dim);
    border-radius: var(--lgsb-radius-sm);
    display: inline-flex;
    gap: 2px;
    padding: 2px;
}

#lgsb-uploader .lgsb-unit-btn {
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: .03em;
    line-height: 1;
    padding: 6px 10px;
    transition: background var(--lgsb-dur-base) var(--lgsb-ease), color var(--lgsb-dur-base) var(--lgsb-ease);
}

#lgsb-uploader .lgsb-unit-btn.is-active {
    background: var(--lgsb-teal);
    color: #fff;
}

#lgsb-uploader .lgsb-important-notes {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-important-notes li {
    font-size: var(--lgsb-font-body-sm);
    padding-left: var(--lgsb-space-4);
    position: relative;
}

#lgsb-uploader .lgsb-important-notes li::before {
    color: var(--lgsb-teal);
    content: '•';
    left: 2px;
    position: absolute;
}

/* --- 4.12 Mobile sticky summary bar ---
   position: sticky (not fixed): the uploader's container-type creates layout
   containment, which would re-anchor a fixed element to the uploader box. */
#lgsb-uploader .lgsb-mobile-bar {
    align-items: center;
    background: var(--lgsb-ink);
    border: none;
    border-radius: var(--lgsb-radius-pill);
    bottom: 12px;
    box-shadow: var(--lgsb-shadow-menu);
    color: #fff;
    cursor: pointer;
    display: none; /* enabled only on small viewports in §6 */
    font-family: var(--lgsb-font-family);
    gap: var(--lgsb-space-3);
    justify-content: space-between;
    margin-top: var(--lgsb-space-4);
    padding: 10px 18px;
    position: sticky;
    width: 100%;
    z-index: var(--lgsb-z-mobile-bar);
}

#lgsb-uploader .lgsb-mobile-bar-label {
    color: rgba(255, 255, 255, .7);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-semibold);
    letter-spacing: var(--lgsb-tracking-label);
    margin-right: var(--lgsb-space-2);
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-mobile-bar-total {
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-mobile-bar-status {
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-mobile-bar.lgsb-mobile-bar--dirty .lgsb-mobile-bar-status {
    color: #FFD979;
}

/* =========================================================================
 * 4.NN NAMES & NUMBERS — roster card + editor modal + price compare
 * ========================================================================= */

/* --- Roster design card: one card per roster in the designs grid -------- */
#lgsb-uploader .lgsb-roster-card {
    background: var(--lgsb-surface);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-teal);
    border-radius: var(--lgsb-radius-nested);
    box-shadow: var(--lgsb-shadow-nested);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-roster-head {
    align-items: flex-start;
    display: flex;
    gap: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-roster-jersey {
    align-items: center;
    background: var(--lgsb-teal-soft);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-teal-dark);
    display: flex;
    flex: 0 0 56px;
    flex-direction: column;
    height: 56px;
    justify-content: center;
    width: 56px;
}

#lgsb-uploader .lgsb-roster-jersey-num {
    font-size: 10px;
    font-weight: var(--lgsb-weight-bold);
    line-height: 1;
    margin-top: -6px;
}

/* Owner-supplied Name & Number jersey icon (marketing-assets/icons). */
#lgsb-uploader .lgsb-roster-jersey-img {
    display: block;
    height: 40px;
    width: auto;
}

#lgsb-uploader .lgsb-roster-title {
    flex: 1 1 auto;
    min-width: 0;
}

#lgsb-uploader .lgsb-roster-name {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-title-3);
    font-weight: var(--lgsb-weight-semibold);
    line-height: var(--lgsb-leading-tight);
    margin: 0 0 4px;
    overflow-wrap: anywhere;
}

#lgsb-uploader .lgsb-roster-badge {
    background: var(--lgsb-teal-soft);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-teal-dark);
    display: inline-block;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-semibold);
    line-height: var(--lgsb-leading-tight);
    padding: 4px 8px;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-roster-stats {
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2) var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-roster-stat {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
}

#lgsb-uploader .lgsb-roster-stat strong {
    color: var(--lgsb-text);
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-roster-meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-roster-chip {
    align-items: center;
    background: var(--lgsb-surface-dim);
    border-radius: var(--lgsb-radius-pill);
    color: var(--lgsb-text);
    display: inline-flex;
    font-size: var(--lgsb-font-pill);
    font-weight: var(--lgsb-weight-medium);
    gap: 6px;
    line-height: var(--lgsb-leading-tight);
    padding: 4px 10px;
}

#lgsb-uploader .lgsb-roster-swatch {
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    display: inline-block;
    height: 12px;
    width: 12px;
}

#lgsb-uploader .lgsb-roster-foot {
    align-items: baseline;
    border-top: var(--lgsb-divider-width) solid var(--lgsb-border);
    display: flex;
    justify-content: space-between;
    padding-top: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-roster-inches {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
}

#lgsb-uploader .lgsb-roster-price {
    color: var(--lgsb-text);
    font-size: var(--lgsb-font-title-3);
    font-weight: var(--lgsb-weight-bold);
}

#lgsb-uploader .lgsb-roster-price.lgsb-price-pending {
    color: var(--lgsb-text-muted);
    font-weight: var(--lgsb-weight-medium);
}

#lgsb-uploader .lgsb-roster-actions {
    display: flex;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-roster-actions .lgsb-btn {
    flex: 1 1 0;
    padding: 8px 10px;
}

/* --- Editor modal -------------------------------------------------------- */
#lgsb-uploader .lgsb-modal--roster {
    display: flex;
    flex-direction: column;
    max-height: 92vh;
    max-width: min(980px, 95vw);
    overflow-y: auto;
}

#lgsb-uploader .lgsb-roster-modal-intro {
    color: var(--lgsb-text-muted);
    font-size: 13px;
    margin-bottom: var(--lgsb-space-4);
}

#lgsb-uploader .lgsb-roster-modal-grid {
    display: grid;
    gap: var(--lgsb-space-5);
    grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
}

@container (max-width: 760px) {
    #lgsb-uploader .lgsb-roster-modal-grid {
        grid-template-columns: 1fr;
    }
}

#lgsb-uploader .lgsb-roster-col {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    min-width: 0;
}

#lgsb-uploader .lgsb-roster-field {
    color: var(--lgsb-text);
    display: flex;
    flex-direction: column;
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    gap: 4px;
}

#lgsb-uploader .lgsb-roster-field-name {
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
}

#lgsb-uploader .lgsb-modal--roster input[type="text"],
#lgsb-uploader .lgsb-modal--roster input[type="number"],
#lgsb-uploader .lgsb-modal--roster select {
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text);
    font-family: var(--lgsb-font-family);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-medium);
    height: 36px;
    padding: 0 var(--lgsb-space-3);
    width: 100%;
}

#lgsb-uploader .lgsb-modal--roster input:focus,
#lgsb-uploader .lgsb-modal--roster select:focus {
    border-color: var(--lgsb-teal);
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15);
    outline: none;
}

/* Entry grid: #, name, number, qty, remove */
#lgsb-uploader .lgsb-roster-grid-head,
#lgsb-uploader .lgsb-roster-row {
    align-items: center;
    display: grid;
    gap: var(--lgsb-space-2);
    grid-template-columns: 24px minmax(0, 1fr) 84px 60px 28px;
}

#lgsb-uploader .lgsb-roster-grid-head {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-label);
    font-weight: var(--lgsb-weight-bold);
    letter-spacing: .05em;
    padding: 0 2px;
    text-transform: uppercase;
}

#lgsb-uploader .lgsb-roster-grid {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    max-height: 380px;
    overflow-y: auto;
    padding: 2px;
}

#lgsb-uploader .lgsb-rg-col-num {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
    text-align: center;
}

#lgsb-uploader .lgsb-rg-remove {
    align-items: center;
    background: transparent;
    border: none;
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-text-muted);
    cursor: pointer;
    display: inline-flex;
    font-size: 16px;
    height: 28px;
    justify-content: center;
    line-height: 1;
    padding: 0;
    width: 28px;
}

#lgsb-uploader .lgsb-rg-remove:hover {
    background: var(--lgsb-error-bg, #FBEAE8);
    color: var(--lgsb-error);
}

#lgsb-uploader .lgsb-roster-grid-foot {
    align-items: center;
    display: flex;
    gap: var(--lgsb-space-3);
    justify-content: space-between;
}

#lgsb-uploader .lgsb-roster-count {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-body-sm);
    margin-left: auto;
}

/* Spreadsheet import mapping panel */
#lgsb-uploader .lgsb-roster-import-map {
    background: var(--lgsb-surface-dim);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
    padding: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-roster-import-map[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-roster-map-title {
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-bold);
    margin: 0;
}

#lgsb-uploader .lgsb-roster-map-preview {
    border-collapse: collapse;
    font-size: var(--lgsb-font-caption);
    width: 100%;
}

#lgsb-uploader .lgsb-roster-map-preview td {
    border: 1px solid var(--lgsb-border);
    max-width: 90px;
    overflow: hidden;
    padding: 3px 6px;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-roster-map-check {
    align-items: center;
    display: flex;
    font-size: var(--lgsb-font-body-sm);
    gap: 6px;
}

#lgsb-uploader .lgsb-roster-map-fields {
    display: grid;
    gap: var(--lgsb-space-2);
    grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
}

#lgsb-uploader .lgsb-roster-map-actions {
    display: flex;
    gap: var(--lgsb-space-2);
    justify-content: flex-end;
}

/* Style column */
#lgsb-uploader .lgsb-roster-color-wrap {
    align-items: center;
    display: flex;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-modal--roster .lgsb-roster-color {
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    cursor: pointer;
    flex: 0 0 44px;
    height: 36px;
    padding: 2px;
    width: 44px;
}

#lgsb-uploader .lgsb-modal--roster .lgsb-roster-hex {
    flex: 0 0 96px;
    text-transform: uppercase;
    width: 96px;
}

#lgsb-uploader .lgsb-roster-sizes {
    display: grid;
    gap: var(--lgsb-space-2);
    grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
}

#lgsb-uploader .lgsb-roster-switch {
    align-items: center;
    cursor: pointer;
    display: flex;
    font-size: var(--lgsb-font-body-sm);
    gap: var(--lgsb-space-2);
}

/* --- Logo lock-up (Phase 3) ---------------------------------------------- */
#lgsb-uploader .lgsb-roster-lockup {
    border-top: 1px solid var(--lgsb-border);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    padding-top: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-roster-lockup-switch {
    align-items: center;
}

#lgsb-uploader .lgsb-roster-lockup-icon {
    align-items: center;
    background: var(--lgsb-teal-soft);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-teal-dark);
    display: inline-flex;
    flex: none;
    height: 32px;
    justify-content: center;
    width: 32px;
}

#lgsb-uploader .lgsb-roster-lockup-panel {
    background: var(--lgsb-bg-subtle, #F7F8FA);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
    padding: 10px 12px;
}

/* [hidden] armor: these panels toggle via the hidden attribute, but their
   own display:flex/grid rules outrank the UA's [hidden]{display:none} —
   same pattern as .lgsb-roster-import-map[hidden] above. */
#lgsb-uploader .lgsb-roster-lockup-panel[hidden],
#lgsb-uploader .lgsb-roster-stroke-panel[hidden],
#lgsb-uploader .lgsb-roster-compare-wrap[hidden],
#lgsb-uploader .lgsb-roster-font-menu[hidden] {
    display: none;
}

#lgsb-uploader .lgsb-roster-lockup-note {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
    margin: 0;
}

/* The preview is the star of the show: it leads the style column and stays
   pinned while the column scrolls (sticky within the modal's scrollport). */
#lgsb-uploader .lgsb-roster-preview-wrap {
    background: var(--lgsb-surface);
    box-shadow: 0 8px 10px -8px rgba(15, 23, 32, .22);
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding-bottom: var(--lgsb-space-2);
    position: sticky;
    top: 0;
    z-index: 5;
}

#lgsb-uploader .lgsb-roster-preview {
    background:
        repeating-conic-gradient(#EDEFF1 0% 25%, #fff 0% 50%) 0 0 / 16px 16px;
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    height: 160px;
    width: 100%;
}

/* Preview backdrop picker: checker (transparent), light, dark, custom.
   Display aid only — the chosen color is painted INTO the canvas by the
   engine (opts.bg), never saved with the roster. */
#lgsb-uploader .lgsb-roster-preview-head {
    align-items: center;
    display: flex;
    justify-content: space-between;
}

#lgsb-uploader .lgsb-roster-previewbg {
    align-items: center;
    display: inline-flex;
    gap: 6px;
}

#lgsb-uploader .lgsb-roster-bg-swatch {
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    cursor: pointer;
    flex: none;
    height: 20px;
    padding: 0;
    width: 20px;
}

#lgsb-uploader .lgsb-roster-bg-checker {
    background: repeating-conic-gradient(#DDE2E7 0% 25%, #fff 0% 50%) 0 0 / 10px 10px;
}

#lgsb-uploader .lgsb-roster-bg-white {
    background: #fff;
}

#lgsb-uploader .lgsb-roster-bg-dark {
    background: #1F2933;
}

#lgsb-uploader .lgsb-modal--roster .lgsb-roster-bg-custom {
    background: transparent;
    border: 1px solid var(--lgsb-border);
    border-radius: 50%;
    cursor: pointer;
    flex: none;
    height: 22px;
    padding: 1px;
    width: 22px;
}

#lgsb-uploader .lgsb-roster-bg-custom::-webkit-color-swatch-wrapper {
    padding: 0;
}

#lgsb-uploader .lgsb-roster-bg-custom::-webkit-color-swatch {
    border: none;
    border-radius: 50%;
}

#lgsb-uploader .lgsb-roster-bg-custom::-moz-color-swatch {
    border: none;
    border-radius: 50%;
}

#lgsb-uploader .lgsb-roster-bg-swatch.is-active,
#lgsb-uploader .lgsb-modal--roster .lgsb-roster-bg-custom.is-active {
    box-shadow: 0 0 0 2px var(--lgsb-surface), 0 0 0 4px var(--lgsb-teal);
}

/* --- Font picker (custom listbox with real font previews) ---------------- */
#lgsb-uploader .lgsb-roster-fontpick {
    position: relative;
}

#lgsb-uploader .lgsb-roster-font-btn {
    align-items: center;
    background: var(--lgsb-surface);
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    color: var(--lgsb-text);
    cursor: pointer;
    display: flex;
    gap: var(--lgsb-space-2);
    height: 44px;
    padding: 0 var(--lgsb-space-3);
    width: 100%;
}

#lgsb-uploader .lgsb-roster-font-btn:focus-visible {
    border-color: var(--lgsb-teal);
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15);
    outline: none;
}

#lgsb-uploader .lgsb-rfp-sample {
    font-size: 20px;
    line-height: 1.1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-rfp-name {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
    font-weight: var(--lgsb-weight-medium);
}

#lgsb-uploader .lgsb-roster-font-btn .lgsb-rfp-name {
    margin-left: auto;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#lgsb-uploader .lgsb-rfp-caret {
    color: var(--lgsb-text-muted);
    flex: none;
}

#lgsb-uploader .lgsb-roster-font-menu {
    background: var(--lgsb-surface);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    box-shadow: 0 12px 32px rgba(15, 23, 32, .18);
    left: 0;
    max-height: 280px;
    overflow-y: auto;
    position: absolute;
    right: 0;
    top: calc(100% + 4px);
    z-index: 30;
}

#lgsb-uploader .lgsb-rfp-item {
    align-items: flex-start;
    background: none;
    border: 0;
    border-bottom: 1px solid var(--lgsb-border);
    cursor: pointer;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 8px 12px;
    text-align: left;
    width: 100%;
}

#lgsb-uploader .lgsb-rfp-item:last-child {
    border-bottom: 0;
}

#lgsb-uploader .lgsb-rfp-item:hover,
#lgsb-uploader .lgsb-rfp-item:focus-visible {
    background: var(--lgsb-teal-soft);
    outline: none;
}

#lgsb-uploader .lgsb-rfp-item[aria-selected="true"] {
    background: var(--lgsb-teal-soft);
    box-shadow: inset 3px 0 0 var(--lgsb-teal);
}

#lgsb-uploader .lgsb-rfp-item .lgsb-rfp-sample {
    color: var(--lgsb-text);
    font-size: 22px;
}

/* --- Arch slider + outline stroke ---------------------------------------- */
/* Fully self-owned range styling: themes (Divi) reset input appearance,
   which blanks the NATIVE track and leaves an invisible slider with a
   floating thumb. Own both track and thumb so no reset can hide them. */
#lgsb-uploader .lgsb-modal--roster input[type="range"].lgsb-roster-arch {
    -webkit-appearance: none;
    appearance: none;
    background: transparent;
    border: none;
    box-shadow: none;
    cursor: pointer;
    height: 28px;
    margin: 0;
    padding: 0;
    width: 100%;
}

#lgsb-uploader .lgsb-modal--roster input[type="range"].lgsb-roster-arch:focus {
    border: none;
    box-shadow: none;
    outline: none;
}

#lgsb-uploader .lgsb-roster-arch::-webkit-slider-runnable-track {
    background: var(--lgsb-border);
    border-radius: 999px;
    height: 6px;
}

#lgsb-uploader .lgsb-roster-arch::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    background: var(--lgsb-teal);
    border: 2px solid var(--lgsb-surface);
    border-radius: 50%;
    box-shadow: 0 1px 3px rgba(15, 23, 32, .3);
    height: 18px;
    margin-top: -6px; /* (track 6px - thumb 18px) / 2 */
    width: 18px;
}

#lgsb-uploader .lgsb-roster-arch::-moz-range-track {
    background: var(--lgsb-border);
    border: none;
    border-radius: 999px;
    height: 6px;
}

#lgsb-uploader .lgsb-roster-arch::-moz-range-progress {
    background: var(--lgsb-teal);
    border-radius: 999px;
    height: 6px;
}

#lgsb-uploader .lgsb-roster-arch::-moz-range-thumb {
    background: var(--lgsb-teal);
    border: 2px solid var(--lgsb-surface);
    border-radius: 50%;
    box-shadow: 0 1px 3px rgba(15, 23, 32, .3);
    height: 18px;
    width: 18px;
}

#lgsb-uploader .lgsb-roster-arch:focus-visible::-webkit-slider-thumb {
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .25);
}

#lgsb-uploader .lgsb-roster-arch:focus-visible::-moz-range-thumb {
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .25);
}

#lgsb-uploader .lgsb-roster-arch-val {
    color: var(--lgsb-text-muted);
    font-weight: var(--lgsb-weight-medium);
    text-transform: lowercase;
}

#lgsb-uploader .lgsb-roster-stroke {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-roster-stroke-panel {
    align-items: end;
    background: var(--lgsb-bg-subtle, #F7F8FA);
    border: 1px solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-sm);
    display: grid;
    gap: var(--lgsb-space-2);
    grid-template-columns: auto minmax(110px, 1fr);
    padding: 10px 12px;
}

#lgsb-uploader .lgsb-modal--roster .lgsb-roster-stroke-hex {
    flex: 0 0 96px;
    text-transform: uppercase;
    width: 96px;
}

#lgsb-uploader .lgsb-modal--roster .lgsb-roster-stroke-color {
    border: var(--lgsb-input-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-input);
    cursor: pointer;
    flex: 0 0 44px;
    height: 36px;
    padding: 2px;
    width: 44px;
}

#lgsb-uploader .lgsb-roster-preview-note {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
    margin: 0;
    min-height: 1.4em;
}

#lgsb-uploader .lgsb-roster-error {
    background: var(--lgsb-error-bg, #FBEAE8);
    border-radius: var(--lgsb-radius-sm);
    color: var(--lgsb-error);
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-semibold);
    margin: var(--lgsb-space-3) 0 0;
    padding: 10px 12px;
}

/* --- Grouped vs separate compare ---------------------------------------- */
#lgsb-uploader .lgsb-roster-compare-wrap {
    display: flex;
    flex-direction: column;
    gap: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-roster-compare {
    display: grid;
    gap: var(--lgsb-space-3);
    grid-template-columns: 1fr 1fr;
}

#lgsb-uploader .lgsb-rc-panel {
    background: var(--lgsb-surface-dim);
    border: var(--lgsb-nested-card-border-width) solid var(--lgsb-border);
    border-radius: var(--lgsb-radius-nested);
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: var(--lgsb-space-3);
}

#lgsb-uploader .lgsb-rc-panel.lgsb-rc-cheaper {
    border-color: var(--lgsb-success);
}

#lgsb-uploader .lgsb-rc-panel.lgsb-rc-selected {
    border-color: var(--lgsb-teal);
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15);
}

#lgsb-uploader .lgsb-rc-title {
    font-size: var(--lgsb-font-body-sm);
    font-weight: var(--lgsb-weight-bold);
    margin: 0;
}

#lgsb-uploader .lgsb-rc-price {
    font-size: var(--lgsb-font-title-2);
    font-weight: var(--lgsb-weight-bold);
    margin: 0;
}

#lgsb-uploader .lgsb-rc-detail,
#lgsb-uploader .lgsb-rc-blurb {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
    line-height: 1.45;
    margin: 0;
}

#lgsb-uploader .lgsb-rc-sheets {
    align-items: flex-start;
    display: flex;
    flex-wrap: wrap;
    gap: var(--lgsb-space-2);
}

#lgsb-uploader .lgsb-rc-sheet {
    background: #fff;
    border: 1px solid var(--lgsb-border);
    border-radius: 3px;
    display: block;
    position: relative;
    width: 64px;
}

#lgsb-uploader .lgsb-rc-item {
    background: rgba(0, 125, 145, .45);
    border-radius: 1px;
    display: block;
    position: absolute;
}

#lgsb-uploader .lgsb-rc-more {
    color: var(--lgsb-text-muted);
    font-size: var(--lgsb-font-caption);
}

#lgsb-uploader .lgsb-rc-use {
    margin-top: auto;
    padding: 7px 10px;
}

@container (max-width: 560px) {
    #lgsb-uploader .lgsb-roster-compare {
        grid-template-columns: 1fr;
    }
}

/* =========================================================================
 * 5. STATES — visibility matrix + interaction states
 *
 * Root classes (set by JS): lgsb-has-files, lgsb-jobs-on, lgsb-ws-open,
 * lgsb-order-dirty, lgsb-locked. #lgsb-files-section keeps its JS inline
 * display toggle; everything else is CSS-driven from the root classes.
 * ========================================================================= */

/* Designs panel hidden until content exists */
#lgsb-uploader .lgsb-designs-panel {
    display: none;
}

#lgsb-uploader.lgsb-has-files .lgsb-designs-panel,
#lgsb-uploader.lgsb-jobs-on .lgsb-designs-panel,
#lgsb-uploader.lgsb-batching .lgsb-designs-panel {
    display: block;
}

/* Jobs-mode upload heading: while grouping is ON the "Upload Your Designs"
   heading moves under My Jobs (uploads happen in the active job workspace),
   so the in-panel copy shows and the main column's copy hides. */
#lgsb-uploader .lgsb-jobs-upload-heading {
    display: none;
}

#lgsb-uploader.lgsb-jobs-on .lgsb-jobs-upload-heading {
    display: block;
    margin-top: var(--lgsb-space-4);
}

#lgsb-uploader.lgsb-jobs-on .lgsb-main-col > .lgsb-upload-heading:not(.lgsb-mode-choose-heading) {
    display: none;
}

/* Hero upload row (dropzone + vault zone): shown on first visit; collapses
   once files exist in flat mode and whenever the jobs workspace is open —
   in both cases .lgsb-active-actions (with its own dropzone + vault zone)
   takes over. Gate the WRAPPER so both zones vanish together. */
#lgsb-uploader.lgsb-has-files:not(.lgsb-jobs-on) .lgsb-upload-zones,
#lgsb-uploader.lgsb-jobs-on.lgsb-ws-open .lgsb-upload-zones {
    display: none;
}

/* Vault zones (Design Vault bridge): each zone sits INSIDE its upload row
   (hero wrapper, actions row, or a chooser card), so the row's own state
   rules govern visibility — no per-context show/hide needed. Base paint
   styles live in §7 (Divi armor); display is set ONLY here — §7 must never
   set it or these rules lose (armor loads later). */
#lgsb-uploader .lgsb-vault-bar { display: flex; }

/* Entry-state layout chooser: while .lgsb-choosing the main column shows
   ONLY the chooser (with its own heading); everything else waits until the
   customer picks Quick Order or Multi-Job Order. Placed after the panel
   visibility rules above so choosing always wins at equal specificity. */
#lgsb-uploader .lgsb-mode-choose-heading { display: none; }

#lgsb-uploader.lgsb-choosing .lgsb-mode-chooser { display: grid; }
#lgsb-uploader.lgsb-choosing .lgsb-mode-choose-heading { display: block; }

#lgsb-uploader.lgsb-choosing .lgsb-upload-heading:not(.lgsb-mode-choose-heading),
#lgsb-uploader.lgsb-choosing .lgsb-upload-zones,
#lgsb-uploader.lgsb-choosing .lgsb-layout-select,
#lgsb-uploader.lgsb-choosing .lgsb-global-options,
#lgsb-uploader.lgsb-choosing .lgsb-designs-panel {
    display: none;
}

/* Compact mode card: quick-mode content by default, multi-job content while
   grouping is on — the same root class that tints the card teal. */
#lgsb-uploader.lgsb-jobs-on .lgsb-mode-quick-only,
#lgsb-uploader:not(.lgsb-jobs-on) .lgsb-mode-multi-only {
    display: none;
}

/* Flat vs jobs headings */
#lgsb-uploader .lgsb-jobs-head {
    display: none;
}

#lgsb-uploader.lgsb-jobs-on .lgsb-jobs-head { display: flex; }
#lgsb-uploader.lgsb-jobs-on .lgsb-jobs-strip { display: flex; }
#lgsb-uploader.lgsb-jobs-on .lgsb-designs-title { display: none; }

/* "See All" (workspace collapsed): every job card shows in a wrapping
   multi-row grid — same fixed card size — and the scroll arrows hide. */
#lgsb-uploader.lgsb-jobs-on:not(.lgsb-ws-open) .lgsb-job-cards {
    flex-wrap: wrap;
    overflow-x: visible;
}

#lgsb-uploader.lgsb-jobs-on:not(.lgsb-ws-open) .lgsb-jobs-arrow {
    display: none;
}

/* Job Overview sidebar card exists only while Group Designs is on */
#lgsb-uploader .lgsb-job-overview-card { display: none; }
#lgsb-uploader.lgsb-jobs-on .lgsb-job-overview-card { display: flex; }

/* Active job tab only when the workspace is open */
#lgsb-uploader.lgsb-jobs-on.lgsb-ws-open .lgsb-active-job-tab { display: flex; }

/* Sticky workspace header: the WRAPPER carries the gate (its actions row
   must never leak into flat mode); the tab keeps its own rule above. */
#lgsb-uploader.lgsb-jobs-on.lgsb-ws-open .lgsb-ws-header { display: block; }

/* Sticky My Designs toolbar is flat-mode only — the workspace header is
   its jobs-mode counterpart. */
#lgsb-uploader.lgsb-jobs-on .lgsb-designs-toolbar { display: none; }

/* Jobs mode: the workspace header and grid read as ONE card — square the
   section's top corners so no seam shows under the actions row. */
#lgsb-uploader.lgsb-jobs-on.lgsb-ws-open .lgsb-files-section {
    border-top-left-radius: 0;
    border-top-right-radius: 0;
}

/* Populated state: the sticky headers are the primary way to add designs,
   so the big bottom dropzone + vault pair retires. ONLY the zones row —
   the Update Order Summary button above it stays. Panel-wide drag & drop
   ($designsCard dragover/drop) is unaffected. */
#lgsb-uploader.lgsb-has-files .lgsb-actions-zones { display: none; }

/* ...and the "Add Your Designs" headings that labeled the retired upload
   surfaces go with them (flat: the main-column heading above the collapsed
   hero row; jobs: the in-panel heading above the workspace). */
#lgsb-uploader.lgsb-has-files:not(.lgsb-jobs-on) .lgsb-main-col > .lgsb-upload-heading:not(.lgsb-mode-choose-heading),
#lgsb-uploader.lgsb-has-files.lgsb-jobs-on.lgsb-ws-open .lgsb-jobs-upload-heading {
    display: none;
}

/* Workspace footer: jobs mode with the workspace open, AND flat mode once
   files exist (2.75.4 — Quick Order shares the same upload field + vault
   zone + update button instead of the old compact add pill). */
#lgsb-uploader.lgsb-jobs-on.lgsb-ws-open .lgsb-active-actions,
#lgsb-uploader.lgsb-has-files:not(.lgsb-jobs-on) .lgsb-active-actions {
    display: flex;
}

/* Jobs mode: only the active section's rows are visible. Switching jobs
   plays a short rise-in so the content change registers (the animation only
   runs when lgsb-job-active is newly applied — reduced-motion gated in §6). */
#lgsb-uploader.lgsb-jobs-on .lgsb-job-section { display: none; }
#lgsb-uploader.lgsb-jobs-on .lgsb-job-section.lgsb-job-active {
    animation: lgsb-ws-switch 240ms var(--lgsb-ease-out);
    display: block;
}

@keyframes lgsb-ws-switch {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: none; }
}

/* Chips: flat chip in flat mode only (the workspace bar carries the job
   summary in jobs mode) */
#lgsb-uploader.lgsb-jobs-on .lgsb-panel-chip { display: none; }

/* Reserve room below the card for the hanging summary tab */
#lgsb-uploader.lgsb-has-files:not(.lgsb-jobs-on) .lgsb-files-section,
#lgsb-uploader.lgsb-jobs-on.lgsb-ws-open .lgsb-files-section {
    margin-bottom: 46px;
}

/* Dragover highlight (instant) */
#lgsb-uploader .lgsb-dropzone.lgsb-dragover,
#lgsb-uploader .lgsb-add-design-btn.lgsb-dragover,
#lgsb-uploader .lgsb-designs-panel.lgsb-dragover .lgsb-files-section {
    background: var(--lgsb-teal-soft);
}

#lgsb-uploader .lgsb-designs-panel.lgsb-dragover .lgsb-files-section {
    box-shadow: inset 0 0 0 1px var(--lgsb-teal);
}

/* Dirty order: stale values dim until the next authoritative update.
   Per-design card prices are deliberately EXEMPT (v2.20.2) — at 45% opacity
   black read as grey and the user wants card prices always readable; the
   stale-state signal remains via the dimmed sidebar stats, the "Needs
   update" chip, the warning status card, and the gated Add to Cart. */
#lgsb-uploader.lgsb-order-dirty .lgsb-stat-value,
#lgsb-uploader.lgsb-order-dirty .lgsb-rate-value,
#lgsb-uploader.lgsb-order-dirty .lgsb-jc-num,
#lgsb-uploader.lgsb-order-dirty .lgsb-jo-count,
#lgsb-uploader.lgsb-order-dirty .lgsb-jo-total {
    opacity: .45;
}

/* Processing lock: freeze job-context controls while uploads/saves fly */
#lgsb-uploader.lgsb-locked .lgsb-job-cards,
#lgsb-uploader.lgsb-locked .lgsb-jo-list {
    opacity: .6;
    pointer-events: none;
}

#lgsb-uploader.lgsb-locked .lgsb-add-design-btn {
    cursor: progress;
    opacity: .6;
}

/* =========================================================================
 * 6. RESPONSIVE
 * Container queries on #lgsb-uploader (Divi columns change available width
 * independent of the viewport). Mobile-first: base = single column.
 * ========================================================================= */

/* Laptop/Desktop: two columns + sticky sidebar */
@container (min-width: 880px) {
    #lgsb-uploader .lgsb-builder-grid {
        grid-template-columns: minmax(0, 1fr) minmax(300px, 340px);
    }

    #lgsb-uploader .lgsb-summary-col {
        position: sticky;
        top: var(--lgsb-space-5);
        z-index: var(--lgsb-z-sticky);
    }

    #lgsb-uploader .lgsb-pricing-grid {
        grid-template-columns: repeat(3, 1fr);
    }
}

/* Desktop: a little more air */
@container (min-width: 1180px) {
    #lgsb-uploader .lgsb-builder-grid {
        gap: var(--lgsb-space-6);
        grid-template-columns: minmax(0, 1fr) minmax(320px, 360px);
    }

    #lgsb-uploader .lgsb-main-col {
        padding: var(--lgsb-space-7);
    }
}

/* Tablet: pricing cards 2-up */
@container (min-width: 640px) and (max-width: 879px) {
    #lgsb-uploader .lgsb-pricing-grid {
        grid-template-columns: 1fr 1fr;
    }
}

/* Small container: stack the upload/vault columns */
@container (max-width: 639px) {
    #lgsb-uploader .lgsb-actions-zones,
    #lgsb-uploader .lgsb-upload-zones {
        flex-direction: column;
    }

    /* The jobs workspace header (teal bar + actions row) can wrap several
       lines tall on phones — pinning it would eat too much viewport, so it
       goes static here. The single-row flat toolbar stays sticky. */
    #lgsb-uploader .lgsb-ws-header {
        position: static;
    }

    /* Layout chooser cards stack on small screens */
    #lgsb-uploader.lgsb-choosing .lgsb-mode-chooser {
        grid-template-columns: 1fr;
    }

    /* Layout selector radio cards stack too */
    #lgsb-uploader .lgsb-mode-select {
        grid-template-columns: 1fr;
    }

    /* Global Order Options cells stack; dividers rotate to horizontal */
    #lgsb-uploader .lgsb-go-cell {
        flex-basis: 100%;
    }

    #lgsb-uploader .lgsb-go-cell + .lgsb-go-cell {
        border-left: 0;
        border-top: var(--lgsb-divider-width) solid var(--lgsb-border);
        margin-top: var(--lgsb-space-2);
        padding-top: var(--lgsb-space-3);
    }

    #lgsb-uploader .lgsb-main-col {
        padding: var(--lgsb-space-4);
    }

    #lgsb-uploader .lgsb-summary-body {
        padding: var(--lgsb-space-4);
    }

    /* Design Tools bar: stop dividing the width evenly — each tool keeps its
       natural size and the bar scrolls sideways instead of crushing labels. */
    #lgsb-uploader .lgsb-edit-tab {
        flex: 0 0 auto;
        min-width: 68px;
    }

    /* Larger touch targets */
    #lgsb-uploader .lgsb-qty-step,
    #lgsb-uploader .lgsb-remove-btn,
    #lgsb-uploader .lgsb-lock-btn,
    #lgsb-uploader .lgsb-job-settings-btn {
        height: 40px;
        width: 40px;
    }

    /* Wider absolute trash button needs more clearance (see v2.43.5 rule) */
    #lgsb-uploader .lgsb-fc-title .lgsb-file-meta {
        padding-right: 44px;
    }

    #lgsb-uploader .lgsb-dim-control,
    #lgsb-uploader .lgsb-dim-input,
    #lgsb-uploader .lgsb-qty-input {
        height: 40px;
    }
}

/* Mobile sticky bar is viewport-fixed, so it keys off the viewport */
@media (max-width: 640px) {
    #lgsb-uploader.lgsb-has-files .lgsb-mobile-bar {
        display: flex;
    }
}

/* Reduced motion: kill every transition/animation */
@media (prefers-reduced-motion: reduce) {
    #lgsb-uploader *,
    #lgsb-uploader *::before,
    #lgsb-uploader *::after {
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .01ms !important;
    }
}

/* =========================================================================
 * 7. THEME-COMBAT — Divi / WooCommerce overrides. The ONLY section where
 * !important is permitted. Every rule documents its enemy.
 * ========================================================================= */

/* ── Select Files button ── DO NOT MODIFY — Divi armor, preserved verbatim.
   - --lgsb-btn-bg is overridden by JS inline style (admin default is black),
     so the teal is hardcoded.
   - `* { color }` catches Divi rules targeting descendants of the label
     (Divi styles nested spans inside labels/buttons directly).
   - Hover uses an inset overlay because Divi resets opacity/filter. */
#lgsb-uploader .lgsb-select-btn {
    border-radius: 8px;
    cursor: pointer;
    display: inline-block;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .07em;
    text-transform: uppercase;
    transition: box-shadow .18s;
    white-space: nowrap;
}

/* Visually hidden (not display:none) so the file input stays keyboard-
   focusable; the ring renders on the label via :has(). */
#lgsb-uploader .lgsb-select-btn input[type=file] {
    clip: rect(1px, 1px, 1px, 1px);
    height: 1px;
    overflow: hidden;
    position: absolute;
    width: 1px;
}

#lgsb-uploader .lgsb-select-btn:has(input:focus-visible) {
    box-shadow: var(--lgsb-focus-ring);
}

#lgsb-uploader .lgsb-select-btn {
    background: #007D91 !important;
    border-radius: 8px !important;
    color: #fff !important;
    min-width: 154px !important;
    padding: 11px 26px !important;
}

#lgsb-uploader .lgsb-select-btn,
#lgsb-uploader .lgsb-select-btn * {
    color: #fff !important;
}

#lgsb-uploader .lgsb-select-btn:hover {
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, .13) !important;
    opacity: 1 !important;
}

/* ── "Choose from my Design Vault" zone (Design Vault bridge) ── a
   standalone card rendered BESIDE each upload target as its own column,
   mirroring the upload dropzone's anatomy (icon / bold ink label / teal
   pill button / muted meta) because both cards do the same job — add
   designs to the order — just different ways. Border: 2px solid teal, the
   SAME weight as the selected Multi-Job layout card
   (--lgsb-nested-card-border-width); solid on purpose — dashed means
   "droppable". Paint properties carry !important armor (it's a <button>,
   so Divi's button skins apply); display stays plain so the state matrix
   in §5 owns it. */
#lgsb-uploader .lgsb-vault-bar {
    align-items: center !important;
    background: #fff !important;
    border: var(--lgsb-nested-card-border-width, 2px) solid #007D91 !important;
    border-radius: var(--lgsb-radius-card, 10px) !important;
    color: #007D91 !important;
    cursor: pointer !important;
    /* display lives in the §5 state matrix — do not set it here. */
    flex-direction: column !important;
    gap: var(--lgsb-space-2, 8px) !important;
    justify-content: center !important;
    padding: var(--lgsb-space-6, 24px) !important;
    text-align: center !important;
    transition: box-shadow .18s, background .18s !important;
    width: 100% !important;
}

#lgsb-uploader .lgsb-vault-bar:hover {
    background: #EBF6F8 !important;
    opacity: 1 !important;
}

#lgsb-uploader .lgsb-vault-bar:focus-visible {
    box-shadow: var(--lgsb-focus-ring) !important;
    outline: none !important;
}

#lgsb-uploader .lgsb-vault-bar-icon {
    color: #007D91 !important;
    display: inline-flex;
    flex: 0 0 auto;
}

/* Label mirrors .lgsb-dropzone-label ("Drag & drop your files here"). */
#lgsb-uploader .lgsb-vault-bar-title {
    color: var(--lgsb-text, #1F2933) !important;
    font-size: var(--lgsb-font-title-2, 15px) !important;
    font-weight: var(--lgsb-weight-semibold, 500) !important;
    letter-spacing: 0 !important;
    line-height: 1.4 !important;
    text-transform: none !important;
}

/* Inner "Open Vault" pill mirrors the Select Files button exactly. */
#lgsb-uploader .lgsb-vault-bar-btn {
    background: #007D91 !important;
    border-radius: 8px !important;
    color: #fff !important;
    display: inline-block !important;
    font-size: 12px !important;
    font-weight: 700 !important;
    letter-spacing: .07em !important;
    line-height: 1.5 !important;
    margin-top: var(--lgsb-space-1, 4px) !important;
    min-width: 154px !important;
    padding: 11px 26px !important;
    text-transform: uppercase !important;
    transition: box-shadow .18s !important;
    white-space: nowrap !important;
}

#lgsb-uploader .lgsb-vault-bar:hover .lgsb-vault-bar-btn {
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, .13) !important;
}

/* Meta mirrors .lgsb-dropzone-meta. */
#lgsb-uploader .lgsb-vault-bar-sub {
    color: var(--lgsb-text-muted) !important;
    font-size: var(--lgsb-font-pill, 11px) !important;
    font-weight: 400 !important;
    line-height: 1.4 !important;
    text-transform: none !important;
}

/* Compact variant inside the entry-state layout chooser cards: icon +
   short teal label only (the pill + meta hide — the whole card IS the
   button there). Teal-soft prefill so it stands out from the white card;
   full teal with white contents on hover. margin-top:auto pins it to the
   card bottom so both cards' vault options sit at the same height even
   though Quick Order's description is shorter. */
#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar {
    background: var(--lgsb-teal-soft, #EBF6F8) !important;
    gap: var(--lgsb-space-1, 4px) !important;
    margin-top: auto !important;
    padding: var(--lgsb-space-3, 12px) !important;
}

#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar-icon svg {
    height: 24px;
    width: 24px;
}

#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar-title {
    color: #007D91 !important;
    font-size: 12px !important;
    font-weight: 700 !important;
    letter-spacing: .07em !important;
    text-transform: uppercase !important;
}

#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar-btn,
#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar-sub {
    display: none !important;
}

#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar:hover {
    background: #007D91 !important;
}

#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar:hover .lgsb-vault-bar-icon,
#lgsb-uploader .lgsb-mode-option .lgsb-vault-bar:hover .lgsb-vault-bar-title {
    color: #fff !important;
}

/* Compact variants inside the sticky headers (flat toolbar + jobs
   workspace actions row): the vault zone reads as a secondary OUTLINED
   BUTTON — icon + the existing "Open Vault" pill text as a plain teal
   label; the long title and meta hide. Same element, same delegated click
   handler, same state gating — presentation only. Placed after the armor
   block above so equal-specificity !important declarations win. */
#lgsb-uploader .lgsb-vault-bar--toolbar,
#lgsb-uploader .lgsb-vault-bar--ws {
    border-radius: var(--lgsb-radius-button, 8px) !important;
    border-width: var(--lgsb-button-border-width, 1.5px) !important;
    flex-direction: row !important;
    padding: 8px 16px !important;
    width: auto !important;
}

#lgsb-uploader .lgsb-vault-bar--toolbar .lgsb-vault-bar-icon svg,
#lgsb-uploader .lgsb-vault-bar--ws .lgsb-vault-bar-icon svg {
    height: 18px;
    width: 18px;
}

/* The pill sheds its chrome and becomes the button's text label. */
#lgsb-uploader .lgsb-vault-bar--toolbar .lgsb-vault-bar-btn,
#lgsb-uploader .lgsb-vault-bar--ws .lgsb-vault-bar-btn {
    background: transparent !important;
    border-radius: 0 !important;
    color: #007D91 !important;
    margin-top: 0 !important;
    min-width: 0 !important;
    padding: 0 !important;
    transition: none !important;
}

#lgsb-uploader .lgsb-vault-bar--toolbar:hover .lgsb-vault-bar-btn,
#lgsb-uploader .lgsb-vault-bar--ws:hover .lgsb-vault-bar-btn {
    box-shadow: none !important;
}

#lgsb-uploader .lgsb-vault-bar--toolbar .lgsb-vault-bar-title,
#lgsb-uploader .lgsb-vault-bar--ws .lgsb-vault-bar-title,
#lgsb-uploader .lgsb-vault-bar--toolbar .lgsb-vault-bar-sub,
#lgsb-uploader .lgsb-vault-bar--ws .lgsb-vault-bar-sub {
    display: none !important;
}

#lgsb-uploader.lgsb-locked .lgsb-vault-bar {
    cursor: progress !important;
    opacity: .6;
}

/* ── Jobs-mode "Select Files" twin (.lgsb-add-btn-inner) ── same armor;
   it is a span inside a <button>, so Divi's button-descendant rules apply. */
#lgsb-uploader .lgsb-add-btn-inner {
    background: #007D91 !important;
    border-radius: 8px !important;
    color: #fff !important;
}

#lgsb-uploader .lgsb-add-design-btn:hover .lgsb-add-btn-inner {
    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, .13) !important;
}

/* ── Quick Estimate CTA ── the promo card's button is an <a>, so Divi's
   Theme Builder anchor skins (`.et-db #et-boc .et-l a` and the module's
   link-color design setting — one ID + classes, loaded after this file)
   repaint the label dark teal on the teal fill. Tripled ID + descendant
   catch-all (the arrow SVG uses currentColor) forces it white. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-quick-estimate a,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-quick-estimate a * {
    color: #fff !important;
    text-decoration: none !important;
}

/* ── Native WooCommerce quantity field ── the builder manages quantity via
   its own per-file steppers. Sits outside #lgsb-uploader in the form DOM. */
form.cart div.quantity {
    display: none !important;
}

/* ── Add to Cart ── defeats `.woocommerce form.cart .single_add_to_cart_button`
   theme skins AND the Theme Builder module's `.button` skin
   (`body.et-db #page-container … .button { padding:1.75% 8% !important }`,
   specificity (2,5,1)) — hence the tripled uploader ID. Pill per mockups. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-add-to-cart-btn,
#lgsb-uploader .lgsb-add-to-cart-btn,
form.cart .lgsb-add-to-cart-btn {
    background: var(--lgsb-primary, #007D91) !important;
    border: none !important;
    border-radius: 999px !important;
    color: #fff !important;
    cursor: pointer !important;
    display: block !important;
    font-family: 'Poppins', -apple-system, sans-serif !important;
    font-size: 14px !important;
    font-weight: 700 !important;
    letter-spacing: .05em !important;
    min-height: 52px !important;
    padding: 15px 20px !important;
    text-align: center !important;
    text-transform: uppercase !important;
    transition: background .15s !important;
    width: 100% !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-add-to-cart-btn:hover,
#lgsb-uploader .lgsb-add-to-cart-btn:hover,
form.cart .lgsb-add-to-cart-btn:hover {
    background: #055866 !important;
    filter: none !important;
}

/* Neutralize Divi's ::before/::after icon injections on module buttons */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-add-to-cart-btn::before,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-add-to-cart-btn::after {
    content: none !important;
    display: none !important;
}

/* Disabled / needs-update state — neutral gray (a teal button that does
   nothing erodes trust in the primary color; helper text explains why). */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-add-to-cart-btn:disabled,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-add-to-cart-btn.lgsb-cart-pending,
#lgsb-uploader .lgsb-add-to-cart-btn:disabled,
#lgsb-uploader .lgsb-add-to-cart-btn.lgsb-cart-pending,
form.cart .lgsb-add-to-cart-btn:disabled,
form.cart .lgsb-add-to-cart-btn.lgsb-cart-pending,
.lgsb-add-to-cart-btn.lgsb-cart-pending,
.single_add_to_cart_button.lgsb-cart-pending {
    background: #C3C9CD !important;
    color: #fff !important;
    cursor: not-allowed !important;
    opacity: 1 !important;
    pointer-events: none !important;
}

/* ── Checkbox labels ── Divi/WooCommerce style `label span` directly with
   the theme accent color at specificity that beats class-only selectors.
   (The Group Designs control is now a toggle switch with no visible label
   text — its old uppercase armor was removed with it, v2.20.3.) */
#lgsb-uploader .lgsb-sidebar-card .lgsb-checkbox-label,
#lgsb-uploader .lgsb-sidebar-card .lgsb-checkbox-label > span {
    color: #111 !important;
    font-family: 'Poppins', -apple-system, sans-serif !important;
    font-size: 13px !important;
    font-weight: 500 !important;
    letter-spacing: normal !important;
    line-height: 1.45 !important;
    text-transform: none !important;
}

/* Artwork confirmation — small uppercase legal text per the mockups */
#lgsb-uploader .lgsb-confirm-card .lgsb-checkbox-label,
#lgsb-uploader .lgsb-confirm-card .lgsb-checkbox-label > span,
#lgsb-uploader .lgsb-confirm-card .lgsb-ack-text,
#lgsb-uploader .lgsb-confirm-card .lgsb-ack-text a {
    color: #111 !important;
    font-family: 'Poppins', -apple-system, sans-serif !important;
    font-size: 11px !important;
    font-weight: 600 !important;
    letter-spacing: .02em !important;
    line-height: 1.6 !important;
    text-transform: uppercase !important;
}

/* Expert review fee — success green (cost add-on cue) */
#lgsb-uploader .lgsb-checkbox-label .lgsb-review-fee {
    color: var(--lgsb-success, #007A41) !important;
    font-size: 12px !important;
    font-weight: 700 !important;
    text-transform: none !important;
}

/* Expert review description — hidden until its checkbox is checked (:has()
   keeps this JS-free) */
#lgsb-uploader .lgsb-option-description {
    color: var(--lgsb-muted, #6B7680) !important;
    display: none !important;
    font-size: 12px !important;
    line-height: 1.5 !important;
    margin: 8px 0 0 27px !important;
}

#lgsb-uploader .lgsb-order-option:has(#lgsb-expert-review:checked) .lgsb-option-description {
    display: block !important;
}

/* ── Textareas ── Divi form-field skin + the Theme Builder module's
   input/textarea rules (gray bg, 16px, black placeholder — all !important
   at (1,3,1)); tripled ID outranks them. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader textarea {
    background: var(--lgsb-light-bg, #F5F7F8) !important;
    border: var(--lgsb-input-border-width, 1px) solid var(--lgsb-divider, #E3E8EB) !important;
    border-radius: 8px !important;
    color: var(--lgsb-text, #1F2933) !important;
    font-family: 'Poppins', -apple-system, sans-serif !important;
    font-size: 13px !important;
    margin-top: 8px !important;
    padding: 10px 12px !important;
    resize: vertical !important;
    width: 100% !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader textarea:focus {
    background: #fff !important;
    border-color: var(--lgsb-primary, #007D91) !important;
    box-shadow: none !important;
    outline: none !important;
}

/* Placeholders — themes force placeholder colors */
#lgsb-uploader#lgsb-uploader#lgsb-uploader textarea::placeholder,
#lgsb-uploader#lgsb-uploader#lgsb-uploader input::placeholder {
    color: var(--lgsb-muted, #6B7680) !important;
    opacity: 1 !important;
}

/* ── Pricing tiers table ── WooCommerce applies borders/padding to every td
   inside .woocommerce. */
#lgsb-uploader .lgsb-tiers-table {
    border-collapse: separate !important;
    border-spacing: 0 !important;
    margin: 0 !important;
}

#lgsb-uploader .lgsb-tiers-table td {
    background: transparent !important;
    border: none !important;
    padding: 0 !important;
}

/* ── Form-control armor ── Divi + WooCommerce skin input/select/label inside
   div.product with their own backgrounds, heights, padding, and fonts (some
   !important). These lock the design-system recipes for the controls the
   theme is known to hit. Heights are intentionally NOT !important so the
   small-container touch-target rules (§6) still apply.

   TRIPLED ID: the live site renders the uploader inside a Divi Theme Builder
   "Woo Add To Cart" module whose design settings generate rules like
   `.et-db #et-boc .et-l .et_pb_wc_add_to_cart_0_tb_body input { … !important }`
   — one ID + several classes, WITH !important. When both sides use
   !important the higher specificity wins, so these selectors repeat the
   uploader ID three times: (3,x,0) outranks anything the builder can emit,
   with zero dependence on Divi's DOM structure. */
/* Theme Builder label skin (18px cyan uppercase) — restore inheritance.
   .lgsb-select-btn is excluded everywhere: its armor below must keep full
   control of that label. Our other label !important rules (group toggle,
   checkbox labels) still win on !important vs these plain declarations. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader label:not(.lgsb-select-btn) {
    color: inherit !important;
    font-size: inherit;
    letter-spacing: inherit;
    line-height: inherit;
    text-transform: none;
}

/* Select Files label — re-pin typography above the Theme Builder label skin
   (same values as the base armor, tripled specificity). */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-select-btn {
    font-size: 12px !important;
    letter-spacing: .07em !important;
    line-height: 1.5 !important;
    text-transform: uppercase !important;
}
#lgsb-uploader#lgsb-uploader#lgsb-uploader input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader select,
#lgsb-uploader#lgsb-uploader#lgsb-uploader button,
#lgsb-uploader#lgsb-uploader#lgsb-uploader textarea,
#lgsb-uploader#lgsb-uploader#lgsb-uploader label {
    font-family: var(--lgsb-font-family) !important;
    text-shadow: none !important;
}

#lgsb-uploader label {
    margin: 0;
}

/* Dimension + copies + contour-gap inputs */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-dim-input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-contour-gap-input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-gap-input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-jobgap-input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-qty-input {
    background: var(--lgsb-surface, #fff) !important;
    border: var(--lgsb-input-border-width, 2px) solid var(--lgsb-border, #E3E8EB) !important;
    border-radius: var(--lgsb-radius-input, 8px) !important;
    box-shadow: none !important;
    color: var(--lgsb-text, #1F2933) !important;
    font-size: var(--lgsb-font-body-sm, 12px) !important;
    font-weight: var(--lgsb-weight-semibold, 600) !important;
    line-height: 1.2 !important;
    margin: 0 !important;
    min-height: 0 !important;
    padding: 0 var(--lgsb-space-2, 8px) !important;
    text-align: center !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-dim-input:focus,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-contour-gap-input:focus,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-gap-input:focus,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-jobgap-input:focus,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-qty-input:focus {
    background: var(--lgsb-surface, #fff) !important;
    border-color: var(--lgsb-primary, #007D91) !important;
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15) !important;
    outline: none !important;
}

/* Move-to select — themes replace select chrome entirely */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-move-select {
    appearance: none !important;
    -webkit-appearance: none !important;
    background: var(--lgsb-surface, #fff)
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B7680' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")
        no-repeat right 6px center / 12px !important;
    border: var(--lgsb-input-border-width, 2px) solid var(--lgsb-border, #E3E8EB) !important;
    border-radius: var(--lgsb-radius-sm, 7px) !important;
    box-shadow: none !important;
    color: var(--lgsb-text, #1F2933) !important;
    font-size: var(--lgsb-font-pill, 11px) !important;
    font-weight: var(--lgsb-weight-medium, 500) !important;
    height: 28px !important;
    line-height: 1.2 !important;
    margin: 0 !important;
    max-width: 120px !important;
    min-height: 0 !important;
    padding: 0 22px 0 8px !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
    /* 100% of the (shrinkable) .lgsb-move wrapper — an intrinsic `auto`
       width let long job names overflow into the price on narrow cards. */
    width: 100% !important;
}

/* Job name inline-rename field — themes give text inputs a filled box */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-job-name {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    color: var(--lgsb-text, #1F2933) !important;
    font-size: var(--lgsb-font-title-3, 14px) !important;
    font-weight: var(--lgsb-weight-semibold, 600) !important;
    height: auto !important;
    line-height: 1.3 !important;
    margin: 0 !important;
    min-height: 0 !important;
    padding: 2px 6px !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-job-name:hover:not(:disabled),
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-job-name:focus {
    background: var(--lgsb-surface, #fff) !important;
    box-shadow: inset 0 0 0 1px var(--lgsb-border, #E3E8EB) !important;
    outline: none !important;
}

/* Job-bar name (workspace) — same armor, white on the teal bar. Width is
   deliberately NOT pinned so the field-sizing rule in §4.9 still applies. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-ws-name {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    color: #fff !important;
    font-size: 16px !important;
    font-weight: var(--lgsb-weight-bold, 600) !important;
    height: auto !important;
    line-height: 1.3 !important;
    margin: 0 !important;
    min-height: 0 !important;
    padding: 2px 6px !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-ws-name:hover:not(:disabled),
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-ws-name:focus {
    background: rgba(255, 255, 255, .12) !important;
    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .5) !important;
    outline: none !important;
}

/* The generic placeholder armor above forces muted gray — the bar name's
   "Job N" placeholder must stay white on the teal bar, and the job card
   name's "Job N" placeholder must be ink like a real name (user call:
   everything on the cards is black, placeholders included). */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-ws-name::placeholder {
    color: rgba(255, 255, 255, .8) !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-job-name::placeholder {
    color: var(--lgsb-text, #1F2933) !important;
}

/* Design-card name field — same armor as .lgsb-job-name (Divi input skins
   add backgrounds, borders, heights, and padding to text inputs). */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-name-input {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    color: var(--lgsb-text, #1F2933) !important;
    font-size: 13px !important;
    font-weight: var(--lgsb-weight-semibold, 600) !important;
    height: auto !important;
    line-height: var(--lgsb-leading-tight, 1.2) !important;
    margin: 0 !important;
    min-height: 0 !important;
    padding: 2px 4px !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-name-input:hover:not(:disabled),
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-name-input:focus {
    background: var(--lgsb-surface, #fff) !important;
    box-shadow: inset 0 0 0 1px var(--lgsb-border, #E3E8EB) !important;
    outline: none !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-name-error .lgsb-name-input {
    box-shadow: inset 0 0 0 1px var(--lgsb-error, #B42318) !important;
}

/* Checkboxes — restore native rendering at the design-system size (Divi
   custom-checkbox skins hide/restyle them) */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-checkbox-label input[type="checkbox"] {
    -webkit-appearance: checkbox !important;
    appearance: checkbox !important;
    accent-color: var(--lgsb-primary, #007D91) !important;
    background: transparent !important;
    height: 17px !important;
    margin: 2px 0 0 !important;
    opacity: 1 !important;
    position: static !important;
    width: 17px !important;
}

/* Steppers / icon buttons — Woo button skins add bg/borders/min-widths */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-qty-step,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-dim-step,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-lock-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-remove-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-job-settings-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-jobs-arrow,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-ws-name-edit {
    letter-spacing: 0 !important;
    min-height: 0 !important;
    min-width: 0 !important;
    text-transform: none !important;
}

/* Stepper buttons — the module's `input` skin doesn't hit buttons, but its
   font-size/color cascade does; pin the visible glyph size. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-qty-step {
    background: var(--lgsb-surface, #fff) !important;
    color: var(--lgsb-primary, #007D91) !important;
    font-size: 15px !important;
}

/* Preset/bulk icon + inline buttons (v2.28.0) — Woo/Divi button skins add
   bg/borders/min-widths/uppercase; pin the same properties as the other
   icon buttons above. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-edit-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-del-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-new-btn,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-menu-item,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-pick {
    letter-spacing: 0 !important;
    min-height: 0 !important;
    min-width: 0 !important;
    text-transform: none !important;
}

/* Bulk Actions dropdown + preset dimension / bulk move selects — themes
   replace select chrome entirely; same recipe as .lgsb-move-select. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-bulk-action,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-dim-select,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-bulk-move-select {
    appearance: none !important;
    -webkit-appearance: none !important;
    background: var(--lgsb-surface, #fff)
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B7680' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")
        no-repeat right 6px center / 12px !important;
    border: var(--lgsb-input-border-width, 2px) solid var(--lgsb-border, #E3E8EB) !important;
    border-radius: var(--lgsb-radius-sm, 7px) !important;
    box-shadow: none !important;
    color: var(--lgsb-text, #1F2933) !important;
    font-size: var(--lgsb-font-pill, 11px) !important;
    font-weight: var(--lgsb-weight-medium, 500) !important;
    height: 28px !important;
    line-height: 1.2 !important;
    margin: 0 !important;
    max-width: 160px !important;
    min-height: 0 !important;
    padding: 0 22px 0 8px !important;
    text-overflow: ellipsis !important;
    white-space: nowrap !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-dim-select,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-bulk-move-select {
    height: 32px !important;
    max-width: none !important;
    width: 100% !important;
}

/* Preset form + bulk quantity inputs — same filled-box reset as the
   dimension/copies inputs, but left-aligned (they hold names, not numbers
   centered in a stepper shell). */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-name-input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-size-input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-bulk-qty-input {
    background: var(--lgsb-surface, #fff) !important;
    border: var(--lgsb-input-border-width, 2px) solid var(--lgsb-border, #E3E8EB) !important;
    border-radius: var(--lgsb-radius-input, 8px) !important;
    box-shadow: none !important;
    color: var(--lgsb-text, #1F2933) !important;
    font-size: var(--lgsb-font-body-sm, 12px) !important;
    font-weight: var(--lgsb-weight-medium, 500) !important;
    height: 32px !important;
    line-height: 1.2 !important;
    margin: 0 !important;
    min-height: 0 !important;
    padding: 0 var(--lgsb-space-3, 9px) !important;
    text-align: left !important;
    width: 100% !important;
}

#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-name-input:focus,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-preset-size-input:focus,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-bulk-qty-input:focus {
    background: var(--lgsb-surface, #fff) !important;
    border-color: var(--lgsb-primary, #007D91) !important;
    box-shadow: 0 0 0 3px rgba(0, 125, 145, .15) !important;
    outline: none !important;
}

/* Selection checkboxes are custom-drawn (.lgsb-check-box paints the state);
   the real input must STAY visually hidden even if a theme "restores"
   native checkbox rendering with its own !important rules. */
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-select-check .lgsb-select-input,
#lgsb-uploader#lgsb-uploader#lgsb-uploader .lgsb-select-check .lgsb-bulk-selectall-input {
    height: 1px !important;
    opacity: 0 !important;
    position: absolute !important;
    width: 1px !important;
}

/* Baseline text guard — Divi's div.product typography rules (font-size,
   line-height on p/li/h*) lose to the ID anchor, but a few themes add
   !important; pin only the properties our own class rules don't re-set. */
#lgsb-uploader p,
#lgsb-uploader li,
#lgsb-uploader h2,
#lgsb-uploader h3 {
    font-family: var(--lgsb-font-family) !important;
    text-transform: none;
}

/* =========================================================================
 * 8. CART / ORDER DISPLAY — rendered outside #lgsb-uploader
 * (cart-upload-summary.php on cart/checkout line items)
 * ========================================================================= */
.lgsb-cart-summary {
    font-size: 13px;
    margin-top: 6px;
}

.lgsb-cart-files {
    margin: 4px 0;
    padding-left: 16px;
}

.lgsb-cart-job-header {
    list-style: none;
    margin: 6px 0 2px -16px;
}

.lgsb-cart-total-inches {
    color: #666;
    margin: 4px 0 0;
}
