/*
VARS LOADED FROM SITE THEME BASED ON PHP SELECTION
*/

/* -------------------------------------------------------
   Overlay variable defaults — used by lightbox, dialogs,
   and any full-screen overlays. Themes may override these
   in their own :root blocks; if they don't, these apply.
------------------------------------------------------- */
:root {
    --overlay-bg:           rgba(18, 18, 22, 0.97);
    --overlay-bg-secondary: rgba(28, 28, 34, 0.98);
    --overlay-text:         rgba(230, 228, 222, 1);
    --overlay-text-muted:   rgba(170, 165, 155, 1);
    --overlay-border:       rgba(70, 68, 80, 1);
    --danger-color:         rgba(210, 55, 55, 1);
    --danger-color-hover:   rgba(235, 75, 75, 1);
    --warning-color:        rgba(200, 160, 40, 1);
    --surface-elevated-dark: rgba(32, 30, 40, 1);
    --pulse-glow:           rgba(72, 160, 148, 0.5);
    --social-glow:          rgba(72, 120, 200, 0.4);

    /* Surface / muted-text vars used by gallery-choice cards, FAQ tiles, support
       article cards, checkout summary dividers, and the dark-mode prepaid pill.
       These were previously undefined anywhere → they fell back to literal #fff /
       teal and leaked a WHITE card surface into dark themes. Aliased to each
       ACTIVE theme's own palette so they're contextual per theme (light theme →
       light surface, dark theme → dark surface) with zero per-theme edits. A theme
       or photographer may still override any of them in its own :root (which now
       loads AFTER this file — see header*.php). */
    --bg-secondary:                  var(--bg-light-secondary);
    --card-bg:                       var(--bg-light-secondary);
    --border-muted:                  var(--overlay-border);
    --font-muted:                    var(--font-light-color);
    --font-muted-color:              var(--font-light-color);
    --prepaid-green:                 var(--accent-green);
    --prepaid-background-dark-color: var(--bg-dark-secondary);
    --prepaid-font-dark-color:       var(--prepaid-font-color);
}

    html {
        touch-action: manipulation;
    }

/* General Styles */
    body {
        color: var(--font-color);
        background-color: var(--bg-color);
        font-family: 'Manrope', sans-serif !important;
        transition: all 0.3s ease;
    }
    

    /* The former .desaturated / .inverted / .color-shift accessibility filters
       were removed 2026-06-01. A `filter:` on <body> makes it the containing
       block for position:fixed descendants, which dropped the accessibility
       toolbar (and the other fixed bars) to the bottom of the document. The
       rebuilt widget uses filter-free effect classes (see "Accessibility
       Widget" below). */

    .thidden {
        display: none;
    }

    .txt-green {
        color: var(--font-green);
    }

    .txt-orange {
        color: var(--accent-light-orange) !important;
    }

    .txt-blue {
        color: var(--font-blue);
    }

    .txt-white {
        color: var(--font-white);
    }

    .txt-left {
        text-align: left;
    }

    .txt-center {
            text-align: center;
    }

    .txt-right {
        text-align: right;
    }
        
    /* Theme Styles */
    .mode-dark {
        background-color: var(--bg-dark-color);
        color: var(--font-dark-color);
    }

    .mode-light {
        background-color: var(--bg-light-color);
        color: var(--font-light-color);
    }

    /* Modern light / dark mode toggle — single sun/moon icon in a circle.
       Replaces the legacy Bootstrap form-switch. The #darkModeToggle checkbox
       contract is unchanged (theme.js drives :checked + the body .mode-* class),
       so the visible icon swaps purely off the checkbox :checked state. */
    .theme-switch {
        position: relative;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 40px;
        height: 40px;
        margin: 0;
        cursor: pointer;
        vertical-align: middle;
    }

    .theme-switch__input {
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
        border: 0;
        opacity: 0;
        cursor: pointer;
        z-index: 2;
    }

    .theme-switch__circle {
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        border-radius: 50%;
        background-color: var(--bg-light-secondary);
        border: 1px solid rgba(0, 0, 0, 0.12);
        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
        transition: background-color 0.25s ease, border-color 0.25s ease,
                    box-shadow 0.25s ease, transform 0.25s ease;
    }

    .theme-switch__icon {
        font-size: 1.05rem;
        line-height: 1;
        transition: transform 0.3s ease;
    }

    .theme-switch__sun {
        color: #f5a623;
    }

    .theme-switch__moon {
        color: #c9d4e3;
        display: none;
    }

    /* Dark mode = checkbox checked: show the moon, restyle the circle */
    .theme-switch__input:checked ~ .theme-switch__circle {
        background-color: rgba(255, 255, 255, 0.12);
        border-color: rgba(255, 255, 255, 0.28);
        box-shadow: 0 1px 4px rgba(0, 0, 0, 0.45);
    }

    .theme-switch__input:checked ~ .theme-switch__circle .theme-switch__sun {
        display: none;
    }

    .theme-switch__input:checked ~ .theme-switch__circle .theme-switch__moon {
        display: inline-flex;
    }

    /* Hover / focus affordances */
    .theme-switch:hover .theme-switch__circle {
        transform: scale(1.06);
    }

    .theme-switch:hover .theme-switch__icon {
        transform: rotate(-18deg);
    }

    .theme-switch__input:focus ~ .theme-switch__circle,
    .theme-switch__input:focus-visible ~ .theme-switch__circle {
        outline: 2px solid var(--accent-orange);
        outline-offset: 2px;
    }

    /* darkmodetogglepref = 0 (cascade): hide the top-nav light/dark switch.
       Set via the pt-hide-theme-toggle <body> class in the layout headers.
       Hide ONLY the switch control, NOT the .theme-toggle column — the column
       is a flex slot in a space-between navbar, so collapsing it shoves the
       centered logo to the edge. Keeping the empty slot preserves the layout.
       The sidebar "Display" Light/Dark row is suppressed in sidebar-settings.js. */
    body.pt-hide-theme-toggle .theme-toggle .theme-switch {
        display: none;
    }

    /* .disable-animations was replaced 2026-06-01 by body.a11y-reduce-motion
       (see "Accessibility Widget" below), which also honors the visitor's OS
       prefers-reduced-motion setting. */

    h1, h2, h3, h4, h5, h6 {
        color: var(--heading-color);
        font-family: 'Poppins', sans-serif !important;
    }

    .mode-light h1, .mode-light h2, .mode-light h3, .mode-light h4, .mode-light h5, .mode-light h6 {
        color: var(--heading-light-color);
        font-weight: 500;
    }

    .mode-dark h1, .mode-dark h2, .mode-dark h3, .mode-dark h4, .mode-dark h5, .mode-dark h6 {
        color: var(--heading-dark-color);
        font-weight: 500;
    }


    h1 {
        font-size: 24px !important;
        font-weight: 600;
    }

    h2 {
        font-size: 24px !important;
        font-weight: 400;
    }

    h3 {
        font-size: 22px !important;
        font-weight: 300;
    }

    h4 {
        font-size: 20px !important;
        font-weight: 300;
    }

    h5 {
        font-size: 16px !important;
        font-weight: 300;
    }

    h6 {
        font-size: 16px !important;
        font-weight: 100;
    }

    .fs-12 {
        font-size: 10px !important;
    }
        
    .fw-100{
        font-weight: 100 !important;
    }
    .fw-200{
        font-weight: 200 !important;
    }
    .fw-300{
        font-weight: 300 !important;
    }
    .fw-400{
        font-weight: 400 !important;
    }
    .fw-500{
        font-weight: 500 !important;
    }
    .fw-600{
        font-weight: 600 !important;
    }
    .fw-700{
        font-weight: 700 !important;
    }
    .fw-800{
        font-weight: 800 !important;
    }
        
    p {
      color: var(--font-color);
      font-size: 16px;
      transition: all 0.3 ease;
      font-family: 'Manrope', sans-serif !important;
    }

    .mode-dark p {
        color: var(--font-dark-color);
    }

    .mode-light p {
        color: var(--font-light-color);
    }
    
    .icon {
        color: var(--icon-color);
    }

    .mode-light .icon {
        color: var(--icon-light-color);
    }    

    .mode-dark .icon {
        color: var(--icon-dark-color);
    }

    .social {
        color: var(--icon-dark-color);
        text-shadow: 0px 0px 3px var(--social-glow);
        transition: all 0.3 ease;
    }

    .mode-light .social {
        color: var(--icon-dark-color);
        text-shadow: 0px 0px 5px var(--social-glow);
        transition: all 0.3 ease;
    }    

    .mode-dark .social {
        color: var(--icon-dark-color);
        text-shadow: 0px 0px 5px var(--social-glow);
        transition: all 0.3 ease;
    }

    .social:hover {
        color: var(--accent-orange);
        transition: all 0.3 ease;
    }

    .mode-light .social:hover {
        color: var(--accent-orange);
        transition: all 0.3 ease;
    }    

    .mode-dark .social:hover {
        color: var(--accent-orange);
        transition: all 0.3 ease;
    }
        
    /* Custom Container */
    .location-container {
        background-color: var(--bg-light-color);
        transition: background-color 0.3s ease, box-shadow 0.3s ease;
    }

    .mode-dark .location-container {
        background-color: var(--surface-elevated-dark);
    }

    /* Custom Card */
    .location-card {
        border: none;
        max-width: 655px;
        height: 456px;
        border-radius: 15px;
        margin: 24px auto;
        background-color: var(--bg-color);
        color: var(--font-color);
        transition: background-color 0.3s ease, box-shadow 0.3s ease;
    }

    .mode-light .location-card {
        background-color: var(--bg-color);
        color: var(--font-color);
    }
        
    .mode-dark .location-card {
        background-color: var(--bg-dark-color);
        color: var(--font-dark-color);
    }

    @media (max-width: 992px) {
        .location-card {
            height: 100%;
        }
    }

    .themeImage {
        max-height: 50px;
    }

    /* Buttons and Icons */
    .menu-button {
        font-size: 24px;
        cursor: pointer;
    }

    .menu-icon {
        margin-left: -2px;
        border-radius: 50%;
        width: 40px;
        height: 40px;
        font-size: 24px;
        color: var(--icon-color);
        background-color: var(--bg-color);
        display: flex;
        justify-content: center;
        align-items: center;
        border: none;
        cursor: pointer;
    }

    .light-mode .menu-icon {
        color: var(--icon-light-color);
    }

    .dark-mode .menu-icon {
        color: var(--icon-dark-color);
    }

    .shadow {
        box-shadow: 0px 0px 24px var(--soft-shadow);
    }

    /* =========================================================
       Accessibility Widget  (rebuilt 2026-06-01)
       Standards-aligned. The UI is built by accessibility.js;
       these styles cover the floating toggle, the panel, and
       the filter-free effect classes that act on <body>.
       NOTE: no rule here applies `filter:` to an ancestor of a
       fixed element — that is what dropped the toolbar to the
       bottom of the page in the previous version.
       ========================================================= */

    /* Screen-reader-only helper (BS5 dropped .sr-only) */
    .a11y-sr-only {
        position: absolute !important;
        width: 1px; height: 1px;
        padding: 0; margin: -1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
        white-space: nowrap;
        border: 0;
    }

    /* Floating toggle — always reachable, never shrunk or hidden on scroll */
    .accessibility-btn {
        position: fixed;
        left: 16px;
        bottom: 16px;
        width: 52px;
        height: 52px;
        padding: 0;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 28px;
        line-height: 1;
        color: #fff;
        background-color: var(--accessibility-blue, #0056b3);
        border: 2px solid #fff;
        border-radius: 50%;
        cursor: pointer;
        z-index: 3000;
        box-shadow: 0 2px 12px rgba(0, 0, 0, 0.35);
        transition: transform 0.2s ease, background-color 0.2s ease;
    }
    .accessibility-btn:hover { transform: scale(1.06); }
    .accessibility-btn:focus-visible {
        outline: 3px solid #ffbf47;
        outline-offset: 3px;
    }
    .accessibility-btn i { pointer-events: none; }

    /* Panel — floats just above the toggle so the button stays clickable */
    .accessibility-menu {
        position: fixed;
        left: 16px;
        bottom: 78px; /* 16 (button offset) + 52 (button) + 10 (gap) */
        width: min(340px, calc(100vw - 32px));
        max-height: min(80vh, 640px);
        overflow-y: auto;
        padding: 18px;
        background-color: var(--bg-color, #ffffff);
        color: var(--font-color, #1b1b1b);
        border: 3px solid var(--accessibility-blue, #0056b3);
        border-radius: 18px;
        box-shadow: 0 8px 40px rgba(0, 0, 0, 0.35);
        z-index: 3001;           /* above the toggle so controls are clickable */
        opacity: 0;
        visibility: hidden;
        transform: translateY(12px);
        transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
    }
    .accessibility-menu.active {
        opacity: 1;
        visibility: visible;
        transform: translateY(0);
    }
    /* dark / light variants (theme.js toggles these on the menu element) */
    .accessibility-menu.mode-dark {
        background-color: #14171f;
        color: #f4f4f5;
        border-color: #f4f4f5;
    }
    .accessibility-menu.mode-light {
        background-color: #ffffff;
        color: #1b1b1b;
        border-color: var(--accessibility-blue, #0056b3);
    }

    .a11y-head {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 8px;
        margin-bottom: 12px;
    }
    .a11y-title {
        margin: 0;
        font-size: 1.15rem;
        font-weight: 700;
        color: inherit !important;
    }
    .a11y-close {
        flex: 0 0 auto;
        width: 38px; height: 38px;
        display: flex; align-items: center; justify-content: center;
        font-size: 24px; line-height: 1;
        color: inherit;
        background: transparent;
        border: 2px solid transparent;
        border-radius: 50%;
        cursor: pointer;
    }
    .a11y-close:hover { background: rgba(127, 127, 127, 0.18); }
    .a11y-close:focus-visible { outline: 3px solid #ffbf47; outline-offset: 2px; }

    .a11y-section { margin-bottom: 14px; }
    .a11y-section-label {
        display: block;
        font-size: 0.78rem;
        font-weight: 700;
        text-transform: uppercase;
        letter-spacing: 0.04em;
        opacity: 0.75;
        margin-bottom: 6px;
    }
    .a11y-textsize {
        display: flex;
        align-items: center;
        gap: 10px;
    }
    .a11y-step {
        flex: 1 1 auto;
        min-height: 46px;
        font-size: 1.1rem;
        font-weight: 700;
        color: inherit;
        background: transparent;
        border: 2px solid currentColor;
        border-radius: 10px;
        cursor: pointer;
    }
    .a11y-step:hover { background: rgba(127, 127, 127, 0.15); }
    .a11y-step:focus-visible { outline: 3px solid #ffbf47; outline-offset: 2px; }
    .a11y-step:disabled { opacity: 0.4; cursor: not-allowed; }
    .a11y-textval {
        flex: 0 0 60px;
        text-align: center;
        font-weight: 700;
        font-variant-numeric: tabular-nums;
    }

    .a11y-list {
        list-style: none;
        margin: 0 0 14px;
        padding: 0;
        display: grid;
        gap: 8px;
    }
    .a11y-list li { margin: 0; }
    .a11y-item {
        display: flex;
        align-items: center;
        gap: 12px;
        width: 100%;
        min-height: 48px;
        padding: 8px 12px;
        text-align: left;
        font-size: 0.98rem;
        font-weight: 600;
        color: inherit;
        background: transparent;
        border: 2px solid currentColor;
        border-radius: 12px;
        cursor: pointer;
        transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
    }
    .a11y-item:hover { background: rgba(127, 127, 127, 0.15); }
    .a11y-item:focus-visible { outline: 3px solid #ffbf47; outline-offset: 2px; }
    .a11y-item-ico {
        flex: 0 0 24px;
        text-align: center;
        font-size: 1.1rem;
    }
    .a11y-item-txt { flex: 1 1 auto; }
    .a11y-item-state {
        flex: 0 0 auto;
        font-size: 0.78rem;
        font-weight: 700;
        opacity: 0.7;
    }
    /* State shown as text + shape + fill, never colour alone (WCAG 1.4.1) */
    .a11y-item-state::before { content: "Off"; }
    .a11y-item[aria-pressed="true"] {
        background-color: var(--accessibility-blue, #0056b3);
        border-color: var(--accessibility-blue, #0056b3);
        color: #fff;
    }
    .accessibility-menu.mode-dark .a11y-item[aria-pressed="true"] {
        background-color: #2f6df0;
        border-color: #2f6df0;
        color: #fff;
    }
    .a11y-item[aria-pressed="true"] .a11y-item-state { opacity: 1; }
    .a11y-item[aria-pressed="true"] .a11y-item-state::before { content: "On"; }

    .a11y-reset {
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 8px;
        width: 100%;
        min-height: 46px;
        font-weight: 700;
        color: #fff;
        background-color: var(--danger-color, #c0392b);
        border: 2px solid transparent;
        border-radius: 12px;
        cursor: pointer;
    }
    .a11y-reset:hover { background-color: var(--danger-color-hover, #d84333); }
    .a11y-reset:focus-visible { outline: 3px solid #ffbf47; outline-offset: 2px; }

    @media (max-width: 400px) {
        .accessibility-menu { left: 8px; bottom: 66px; width: calc(100vw - 16px); }
        .accessibility-btn { left: 10px; bottom: 10px; }
    }

    /* ---------------------------------------------------------
       Effect classes — added to <body> by accessibility.js.
       Filter-free by design.
       --------------------------------------------------------- */

    /* Readable font: legible family + spacing. Text elements only, so
       Font Awesome <i> glyphs keep their icon font. */
    body.a11y-readable,
    body.a11y-readable p,
    body.a11y-readable li,
    body.a11y-readable td,
    body.a11y-readable th,
    body.a11y-readable dt,
    body.a11y-readable dd,
    body.a11y-readable label,
    body.a11y-readable a,
    body.a11y-readable span:not(.a11y-item-state),
    body.a11y-readable button:not(.accessibility-btn),
    body.a11y-readable .btn,
    body.a11y-readable input,
    body.a11y-readable select,
    body.a11y-readable textarea,
    body.a11y-readable h1, body.a11y-readable h2, body.a11y-readable h3,
    body.a11y-readable h4, body.a11y-readable h5, body.a11y-readable h6 {
        font-family: Verdana, Tahoma, "Segoe UI", Arial, sans-serif !important;
    }
    body.a11y-readable {
        letter-spacing: 0.03em !important;
        word-spacing: 0.06em !important;
        line-height: 1.7 !important;
    }

    /* Highlight links: unmistakable independent of colour */
    body.a11y-highlight-links a {
        text-decoration: underline !important;
        text-underline-offset: 3px;
        text-decoration-thickness: 2px !important;
        background-color: #ffff00 !important;
        color: #000000 !important;
        outline: 1px solid #000000 !important;
    }
    body.a11y-highlight-links a * { color: #000000 !important; }

    /* Big cursor */
    body.a11y-big-cursor,
    body.a11y-big-cursor * {
        cursor: url("/assets/img/largeCursor.png") 0 0, auto !important;
    }

    /* Reduce motion: near-zero (not none) so transitionend/animationend
       handlers still fire and nothing hangs waiting on them. */
    body.a11y-reduce-motion *,
    body.a11y-reduce-motion *::before,
    body.a11y-reduce-motion *::after {
        animation-duration: 0.001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.001ms !important;
        scroll-behavior: auto !important;
    }

    /* Show labels: reveal an icon-only control's name as part of the button —
       the icon expands into a pill and the label slides out (animated).
       accessibility.js tags icon-only controls with .a11y-labelable +
       data-a11y-label; text buttons are never tagged (no duplicate label).
       :not(.d-none) so this never overrides Bootstrap's d-none (display:none
       !important) — cart.js toggles the add/added badges via that class, and
       without this guard the hidden "+" would reappear next to "Added". */
    body.a11y-show-labels .a11y-labelable:not(.d-none) {
        display: inline-flex !important;
        align-items: center;
        justify-content: center;
        width: auto !important;
        height: auto;
        padding-left: 12px !important;
        padding-right: 14px !important;
        border-radius: 999px !important;
    }
    body.a11y-show-labels .a11y-labelable::after {
        content: attr(data-a11y-label);
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        max-width: 160px;
        padding-left: 6px;
        font-size: 0.82em;
        font-weight: 600;
        line-height: 1.15;
        animation: a11yLabelReveal 0.35s ease both;
    }
    @keyframes a11yLabelReveal {
        from { max-width: 0; opacity: 0; }
        to   { max-width: 160px; opacity: 1; }
    }
    /* Bootstrap close button draws its × as a centered background-image (no
       child icon). Keep the × pinned left and let the label reveal beside it. */
    body.a11y-show-labels .btn-close.a11y-labelable {
        width: auto !important;
        background-position: left 0.6rem center;
        padding-left: 1.9rem !important;
        padding-right: 0.9rem !important;
        opacity: 1;
    }
    /* The gallery view-density switches (.btn-circle) read better as a tidy
       set of icon-over-label tiles than as cramped horizontal pills. */
    /* Block flow (not flex) so the icon(s) stay on one line and the label
       drops to its own line beneath them — i.e. a "br" after the icon. Block
       flow also keeps the 4-column button's two grip icons side by side.
       Fixed height = the whole group is equal height regardless of label wrap. */
    body.a11y-show-labels .btn-circle.a11y-labelable {
        display: inline-block !important;
        width: 96px !important;
        height: 86px !important;
        margin: 4px !important;
        padding: 10px 6px 8px !important;
        border-radius: 14px !important;
        text-align: center;
        vertical-align: top;
        overflow: hidden;
    }
    body.a11y-show-labels .btn-circle.a11y-labelable i {
        display: inline-block;
        font-size: 1.5rem;
        margin: 0;
    }
    body.a11y-show-labels .btn-circle.a11y-labelable::after {
        content: attr(data-a11y-label);
        display: block;          /* the line break after the icon */
        width: 100%;
        max-width: none;
        margin-top: 5px;
        padding-left: 0;
        white-space: normal;
        text-align: center;
        font-size: 0.66rem;
        font-weight: 600;
        line-height: 1.15;
        animation: a11yLabelFade 0.3s ease both;   /* fade in, not just appear */
    }
    @keyframes a11yLabelFade {
        from { opacity: 0; transform: translateY(-2px); }
        to   { opacity: 1; transform: translateY(0); }
    }
    /* The density tiles are much wider than the bare icons, so when labels are
       on we give that section more room (drop the empty spacer column and let
       #gallery-filters grow) so the set fits on one row instead of wrapping.
       md+ only — below md the controls already stack full-width. */
    @media (min-width: 768px) {
        body.a11y-show-labels #image-selection-filters > .col-md-4:first-child {
            display: none !important;
        }
        body.a11y-show-labels #gallery-filters {
            flex: 1 1 auto !important;
            width: auto !important;
            max-width: none !important;
        }
    }

    /* Gallery photo filter — single dropdown that replaced the three
       purchased / available / all icon buttons. */
    #purchased-filters { white-space: nowrap; }
    .gallery-filter-icon {
        margin-right: 6px;
        color: var(--icon-color);
        vertical-align: middle;
    }
    .gallery-filter-select {
        width: auto;
        display: inline-block;
        min-width: 150px;
        vertical-align: middle;
    }

    /* Magnifier (loupe) toggle — opt-in control at the top of the gallery.
       Defaults OFF; pill fills with the theme accent when On. */
    .loupe-toggle-btn {
        display: inline-flex;
        align-items: center;
        gap: 7px;
        padding: 6px 14px;
        border-radius: 20px;
        border: 1px solid var(--accent-orange);
        background: transparent;
        color: var(--accent-orange);
        font-family: "Manrope", sans-serif;
        font-size: 0.82rem;
        font-weight: 600;
        line-height: 1;
        cursor: pointer;
        transition: background-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
    }
    .loupe-toggle-btn:hover,
    .loupe-toggle-btn:focus-visible {
        background: color-mix(in srgb, var(--accent-orange) 12%, transparent);
        outline: none;
    }
    .loupe-toggle-btn.is-on {
        background: var(--accent-orange);
        color: var(--font-white);
        box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-orange) 28%, transparent);
    }
    .loupe-toggle-btn i { font-size: 0.9rem; }

    /* High contrast (best-effort, no filters): black surfaces, white text,
       yellow underlined links, outlined controls. */
    body.a11y-contrast { background-color: #000 !important; color: #fff !important; }
    body.a11y-contrast .mode-dark,
    body.a11y-contrast .mode-light { background-color: #000 !important; color: #fff !important; }
    body.a11y-contrast h1, body.a11y-contrast h2, body.a11y-contrast h3,
    body.a11y-contrast h4, body.a11y-contrast h5, body.a11y-contrast h6,
    body.a11y-contrast p, body.a11y-contrast li, body.a11y-contrast span,
    body.a11y-contrast label, body.a11y-contrast td, body.a11y-contrast th,
    body.a11y-contrast dt, body.a11y-contrast dd, body.a11y-contrast strong,
    body.a11y-contrast em, body.a11y-contrast small, body.a11y-contrast blockquote,
    body.a11y-contrast figcaption {
        color: #fff !important;
        background-color: transparent !important;
        background-image: none !important;
        text-shadow: none !important;
    }
    body.a11y-contrast a, body.a11y-contrast a * {
        color: #ffff00 !important;
        text-decoration: underline !important;
    }
    body.a11y-contrast .card,
    body.a11y-contrast .modal-content,
    body.a11y-contrast section,
    body.a11y-contrast header,
    body.a11y-contrast footer,
    body.a11y-contrast nav,
    body.a11y-contrast .navbar,
    body.a11y-contrast .location-container {
        background-color: #000 !important;
        background-image: none !important;
    }
    body.a11y-contrast .btn,
    body.a11y-contrast button:not(.accessibility-btn):not(.a11y-item):not(.a11y-step):not(.a11y-close):not(.a11y-reset),
    body.a11y-contrast input,
    body.a11y-contrast select,
    body.a11y-contrast textarea {
        background-color: #000 !important;
        color: #fff !important;
        border: 2px solid #fff !important;
    }
    /* Keep the widget itself usable while contrast is on */
    body.a11y-contrast .accessibility-menu {
        background-color: #000 !important;
        color: #fff !important;
        border-color: #fff !important;
    }
    body.a11y-contrast .a11y-item,
    body.a11y-contrast .a11y-step,
    body.a11y-contrast .a11y-close {
        color: #fff !important;
        border-color: #fff !important;
        background-color: #000 !important;
    }
    body.a11y-contrast .a11y-item[aria-pressed="true"] {
        background-color: #fff !important;
        color: #000 !important;
    }
        
        

    .sidebar{
        background-color: var(--bg-light-color);
    }

    .mode-dark .sidebar {
        background-color: var(--bg-dark-color);
    }

    /* SIDEBAR */
    a.sidebar-link  {
        text-decoration: none;
        cursor: pointer;
        color: var(--font-light-color);
        font-size: 32px;
        font-weight: 100;
        line-height: 48px;
        transition: all 0.3s ease-in-out;
    }

    .mode-dark a.sidebar-link  {
        color: var(--font-dark-color);
        transition: all 0.3s ease-in-out;
    }

    a.sidebar-link:hover  {
        color: var(--accent-orange);
    }

    .mode-dark a.sidebar-link:hover  {
        color: var(--accent-dark-orange);
    }

     a.sidebar-link-sm  {
        text-decoration: none;
        cursor: pointer;
        color: var(--bg-dark-secondary);
        font-size: 18px;
        font-weight: 600;
        line-height: 24px;
        transition: all 0.3s ease-in-out;
    }

    .mode-dark a.sidebar-link-sm  {
        color: var(--bg-light-secondary);
        transition: all 0.3s ease-in-out;
    }

    a.sidebar-link-sm:hover  {
        color: var(--accent-orange);
    }

    .mode-dark a.sidebar-link-sm:hover  {
        color: var(--accent-orange);
    }

    
    /* MINI CART */

    /* Backdrop overlay */
    .cart-backdrop {
        display: none;
        position: fixed;
        inset: 0;
        background: rgba(0, 0, 0, 0.42);
        backdrop-filter: blur(3px);
        -webkit-backdrop-filter: blur(3px);
        z-index: 4998;
        cursor: pointer;
    }
    .cart-backdrop.active {
        display: block;
    }

    /* Cart panel */
    .cart-menu {
        position: fixed;
        top: 0;
        right: 0;
        height: 100%;
        width: 400px;
        max-width: 92vw;
        background-color: var(--bg-color);
        border-radius: 20px 0 0 20px;
        z-index: 5000;
        display: flex;
        flex-direction: column;
        box-shadow: -8px 0 48px rgba(0, 0, 0, 0.22);
        transform: translateX(100%);
        transition: transform 0.32s ease;
        pointer-events: none;
        opacity: 0;
    }
    .cart-menu.active {
        transform: translateX(0);
        pointer-events: auto;
        opacity: 1;
    }
    .mode-dark .cart-menu {
        background-color: var(--bg-dark-secondary);
    }

    /* --- Cart Header --- */
    .cart-panel-header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 18px 20px 14px;
        border-bottom: 1px solid rgba(0, 0, 0, 0.08);
        flex-shrink: 0;
    }
    .mode-dark .cart-panel-header {
        border-bottom-color: rgba(255, 255, 255, 0.08);
    }
    .cart-panel-title {
        font-family: 'Poppins', sans-serif;
        font-size: 1rem;
        font-weight: 700;
        color: var(--heading-light-color);
        display: flex;
        align-items: center;
    }
    .cart-panel-title .fa-shopping-bag {
        color: var(--accent-orange);
    }
    .mode-dark .cart-panel-title {
        color: var(--heading-dark-color);
    }
    .cart-count-pill {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        min-width: 22px;
        height: 22px;
        border-radius: 11px;
        background: var(--accent-orange);
        color: #fff;
        font-size: 0.72rem;
        font-weight: 700;
        padding: 0 6px;
    }
    .cart-close-x {
        background: none;
        border: none;
        padding: 4px 8px;
        cursor: pointer;
        font-size: 1rem;
        color: var(--font-color);
        opacity: 0.45;
        line-height: 1;
        transition: opacity 0.15s;
    }
    .cart-close-x:hover {
        opacity: 0.85;
    }
    .mode-dark .cart-close-x {
        color: var(--font-dark-color);
    }

    /* --- Cart Body (scrollable) --- */
    .cart-panel-body {
        flex: 1;
        overflow-y: auto;
        padding: 16px 20px;
    }
    .cart-panel-body::-webkit-scrollbar {
        width: 4px;
    }
    .cart-panel-body::-webkit-scrollbar-track {
        background: transparent;
    }
    .cart-panel-body::-webkit-scrollbar-thumb {
        background: rgba(0, 0, 0, 0.15);
        border-radius: 2px;
    }
    .mode-dark .cart-panel-body::-webkit-scrollbar-thumb {
        background: rgba(255, 255, 255, 0.15);
    }

    /* Cart items container */
    #cart-items-container {
        padding-right: 2px;
    }

    /* Empty state */
    .cart-empty-icon img {
        max-width: 72px;
        opacity: 0.7;
    }

    /* Pricing hints table */
    .cart-price-hints {
        background: rgba(0, 0, 0, 0.03);
        border-radius: 10px;
        padding: 12px 14px;
    }
    .mode-dark .cart-price-hints {
        background: rgba(255, 255, 255, 0.05);
    }
    .cart-price-row {
        display: flex;
        justify-content: space-between;
        font-size: 0.84rem;
        padding: 5px 0;
        color: var(--font-color);
        opacity: 0.75;
    }
    .mode-dark .cart-price-row {
        color: var(--font-dark-color);
    }
    .cart-price-row:not(:last-child) {
        border-bottom: 1px solid rgba(0, 0, 0, 0.06);
    }
    .mode-dark .cart-price-row:not(:last-child) {
        border-bottom-color: rgba(255, 255, 255, 0.08);
    }

    /* Gallery promo card (empty state) */
    .cart-gallery-promo {
        border: 1px solid rgba(0, 0, 0, 0.1);
        border-radius: 14px;
        padding: 14px;
    }
    .mode-dark .cart-gallery-promo {
        border-color: rgba(255, 255, 255, 0.1);
    }
    .cart-gallery-promo-info {
        display: flex;
        align-items: flex-start;
        gap: 12px;
        position: relative;
    }
    .cart-gallery-promo-img img {
        max-width: 60px;
        max-height: 60px;
        width: auto;
        height: auto;
        object-fit: contain;
        border-radius: 8px;
    }
    .cart-gallery-promo-name {
        font-weight: 700;
        font-size: 0.9rem;
        color: var(--heading-light-color);
    }
    .mode-dark .cart-gallery-promo-name {
        color: var(--heading-dark-color);
    }
    .cart-gallery-promo-count {
        font-size: 0.78rem;
        opacity: 0.6;
        margin-top: 2px;
    }
    .cart-gallery-promo-price {
        font-size: 1.1rem;
        font-weight: 700;
        color: var(--accent-orange);
        font-family: 'Poppins', sans-serif;
        margin-top: 4px;
    }
    .cart-best-value-badge {
        position: absolute;
        top: 0;
        right: 0;
        background: var(--accent-orange);
        color: #fff;
        font-size: 0.65rem;
        font-weight: 700;
        padding: 2px 8px;
        border-radius: 20px;
        letter-spacing: 0.04em;
        text-transform: uppercase;
        white-space: nowrap;
    }

    /* Preview icon inside populated cart */
    .cart-preview-icon-wrap {
        position: relative;
        display: inline-block;
    }
    .cart-preview-icon {
        width: 90px;
        height: 90px;
        object-fit: contain;
    }
    .cart-preview-count {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        font-size: 1.8rem;
        font-weight: 700;
        color: #fff;
        text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
    }

    /* --- Cart Footer (sticky) --- */
    .cart-panel-footer {
        flex-shrink: 0;
        padding: 14px 20px 20px;
        border-top: 1px solid rgba(0, 0, 0, 0.08);
    }
    .mode-dark .cart-panel-footer {
        border-top-color: rgba(255, 255, 255, 0.08);
    }

    /* Prepaid notice */
    .cart-prepaid-notice {
        font-size: 0.78rem;
        color: var(--accent-orange);
        font-weight: 600;
        margin-bottom: 10px;
        padding: 8px 10px;
        background: color-mix(in srgb, var(--accent-orange) 7%, transparent);
        border-radius: 8px;
    }

    /* Subtotal row */
    .cart-subtotal-row {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 12px;
        padding-bottom: 12px;
        border-bottom: 1px solid rgba(0, 0, 0, 0.07);
    }
    .mode-dark .cart-subtotal-row {
        border-bottom-color: rgba(255, 255, 255, 0.07);
    }
    .cart-subtotal-lbl {
        font-size: 0.88rem;
        font-weight: 700;
        color: var(--heading-light-color);
    }
    .mode-dark .cart-subtotal-lbl {
        color: var(--heading-dark-color);
    }
    .cart-subtotal-amt {
        font-size: 1.35rem;
        font-weight: 700;
        color: var(--accent-orange);
        font-family: 'Poppins', sans-serif;
    }

    /* Checkout button */
    .cart-checkout-btn {
        border-radius: 12px;
        font-size: 0.9rem;
        font-weight: 700;
        padding: 12px;
    }

    /* Trust signals */
    .cart-trust-signals {
        display: flex;
        justify-content: center;
        gap: 16px;
        font-size: 0.68rem;
        color: var(--font-color);
        opacity: 0.4;
        margin-top: 10px;
    }
    .mode-dark .cart-trust-signals {
        color: var(--font-dark-color);
    }

    /* Remove all — subtle link */
    .cart-remove-all-btn {
        font-size: 0.75rem;
        color: var(--font-color);
        opacity: 0.45;
        text-decoration: none;
    }
    .cart-remove-all-btn:hover {
        opacity: 0.7;
        text-decoration: underline;
    }
    .mode-dark .cart-remove-all-btn {
        color: var(--font-dark-color);
    }

    /* Quantity +/- controls for physical products */
    .qty-controls {
        display: inline-flex;
        align-items: center;
        gap: 4px;
        margin-left: 8px;
        vertical-align: middle;
    }

    .qty-btn {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 24px;
        height: 24px;
        border-radius: 50%;
        border: 1px solid rgba(0, 0, 0, 0.2);
        background: rgba(0, 0, 0, 0.05);
        color: inherit;
        font-size: 14px;
        font-weight: 600;
        line-height: 1;
        cursor: pointer;
        transition: background 0.15s, border-color 0.15s;
        padding: 0;
    }

    .qty-btn:hover {
        background: rgba(0, 0, 0, 0.12);
        border-color: rgba(0, 0, 0, 0.35);
    }

    .mode-dark .qty-btn {
        border-color: rgba(255, 255, 255, 0.2);
        background: rgba(255, 255, 255, 0.08);
    }

    .mode-dark .qty-btn:hover {
        background: rgba(255, 255, 255, 0.18);
        border-color: rgba(255, 255, 255, 0.4);
    }

    .qty-display {
        min-width: 18px;
        text-align: center;
        font-size: 13px;
        font-weight: 600;
    }

    .collapsible {
        display: flex;
        align-items: center;
        gap: 8px;
        cursor: pointer;
        user-select: none;
    }

    .collapsible-label {
        flex: 1 1 auto;
    }

    .collapsible .total-sum {
        margin-left: auto;
        white-space: nowrap;
    }

    .collapsible-arrow {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 18px;
        color: var(--icon-color);
        transition: transform 0.2s ease;
    }

    .collapsible-arrow.expanded {
        transform: rotate(180deg);
    }

    /* Entire Gallery summary card */
    .entire-gallery-summary {
        margin-bottom: 8px;
    }

    .entire-gallery-card {
        border: 2px solid var(--prepaid-font-color);
        border-radius: 12px;
        background: var(--prepaid-background-color);
        color: var(--prepaid-font-color);
        padding: 16px;
    }

    .entire-gallery-card i {
        color: var(--prepaid-font-color);
        opacity: 0.85;
    }

    .entire-gallery-card h5 {
        margin: 4px 0;
        font-weight: 700;
        font-size: 1.1rem;
        color: var(--prepaid-font-color);
    }

    .entire-gallery-card p {
        font-size: 0.9rem;
        opacity: 0.9;
        color: var(--prepaid-font-color);
    }

    .entire-gallery-card .eg-price {
        font-size: 1.15rem;
        color: var(--prepaid-font-color);
    }

    .mode-dark .entire-gallery-card {
        border-color: var(--prepaid-font-color);
        background: var(--prepaid-background-color);
    }

    /* Hide individual items when in Entire Gallery mode */
    .cart-group.entire-gallery-mode .cart-item {
        display: none;
    }

    .cart-group.entire-gallery-mode .entire-gallery-summary {
        display: block;
    }

    /* Reset and Skip Link */
    .skip-link {
        position: absolute;
        color: var(--font-white);
        z-index: 1000;
    }

    .skip-link {
        top: -50px;
        left: 0;
        padding: 10px;
        text-decoration: none;
    }

    .skip-link:focus {
        top: 0;
    }

    .reset-btn {
        margin-top: 1rem;
        background-color: var(--danger-color);
        color: var(--font-white);
        width: 100%;
        text-align: center;
        padding: 0.5rem;
        cursor: pointer;
    }

    .reset-btn:hover {
        background-color: var(--danger-color-hover);
    }

    img {
        filter: brightness(100%);
        transition: all 0.3s ease;
    }

    .mode-dark img {
        filter: brightness(100%);
    }

    .bannerImage{
        max-width: 95vw;
        max-height: 150px;
        padding-top: 25px;
        padding-bottom: 25px;
    }

    .customImage{
        max-width: 95vw;
        max-height: 150px;
        padding-top: 25px;
        padding-bottom: 25px;
    }

    @keyframes heroFadeIn {
        from {
            opacity: 0;
            transform: scale(0.96);
        }
        to {
            opacity: 1;
            transform: scale(1);
        }
    }

    /* Photographer theme icon (gallery landing card) */
    .themeIcon {
        max-width: 140px;
        max-height: 90px;
        width: auto;
        height: auto;
        object-fit: contain;
    }

    .heroImage {
        max-width: 100%;
        max-height: 425px;
        border-radius: 9px;
        border: 10px solid var(--photo-border-color);
        transition: all 0.3s ease;
        /* No standalone opacity:0/.loaded fade — the whole location-card content
           fades in together via .loc-card-in (see the card-intro block at file end). */
    }

    .mode-dark .heroImage {
        border: 10px solid var(--photo-border-dark-color);
    }

    .circle {
        background-color: var(--heading-light-color);
        width: 50px;
        height: 50px;
        border-radius: 50%;
        display: flex;
        justify-content: center;
        align-items: center;
        animation: bounceAndPulse 1.5s infinite ease-in-out;
    }

    .fa-chevron-down {
        font-size: 20px;
        color: var(--font-white);
    }

    .mode-dark .circle {
        background-color: var(--heading-dark-color);
    }

    .mode-dark .fa-chevron-down {
        color: var(--heading-color);
    }

    @keyframes bounce {
        0% {
            transform: translateY(0);
        }
        100% {
            transform: translateY(10px);
        }
    }

    @keyframes bounceAndPulse {
        0%, 100% {
            transform: translateY(0) scale(1);
            box-shadow: 0px 15px 20px rgba(0, 0, 0, 0.5); 
        }
        50% {
            transform: translateY(10px) scale(1.1);
            box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.3); 
        }
    }

    @keyframes pulse {
        0% {
            transform: scale(1);
        }
        50% {
            transform: scale(1.1);
        }
        100% {
            transform: scale(1);
        }
    }

    .gallery-counts div {
        display: inline-block;
        min-width: 44%;
        padding: 5px;
        border-radius: 25px;
    }

    .gallery-counts {
        display: flex;
        justify-content: space-between;
    }

    .flex-column {
        flex-direction: column;
        align-items: center;
    }

    @media (max-width: 992px) {
        .gallery-counts div {
            display: block;
            margin-bottom: 10px;
        }
    }

    .prepaid {
        opacity: 0.6;
        background-color: var(--prepaid-background-color);
        border: 2px solid var(--prepaid-border-color);
        transition: all 0.3s ease;
    }

    .prepaid p {
        color: var(--prepaid-font-color);
        opacity: 1;
        font-weight: 500;
        transition: all 0.3s ease;
    }
        
    .prepaid i {
        color: var(--prepaid-icon-color);
        transition: all 0.3s ease;
    }

    .rounded {
        border-radius: 25px !important;
    }

    .border-none {
        border: 0px solid #fff !important;
    }

    .menu-cart {
        background-color: var(--cart-grey);
        border-radius: 25px;
        display: flex;
        align-items: baseline;
        padding: 0px 10px 0px 10px;
        justify-content: space-between;
        transition: all 0.3s ease;
    }


    .mode-dark .menu-cart {
        background-color: var(--cart-dark-grey);
    }

    /* The cart pill's contents (basket icon, count, the ad-hoc "Items"/"Photos"
       word, the amount) had NO colour of their own — they inherited whatever the
       surrounding nav happened to set. That is fine on the 15 themes whose
       --cart-grey is a light chip, and unreadable on the 8 that ship a dark one
       (navy, dark, space, slime, halloween, electric, futuristic, rest), where the
       label disappeared into the pill.

       Setting the colour once on .menu-cart means every child inherits it, and
       --cart-font-color / --cart-font-dark-color give the label a real hook: the
       dark-pill themes set it themselves, and any photographer can override it
       from the admin theme customizer (both names are allow-listed). Unset falls
       back to the theme's font colour, i.e. today's intent, just explicit. */
    .menu-cart {
        color: var(--cart-font-color, var(--font-color));
    }

    .mode-dark .menu-cart {
        color: var(--cart-font-dark-color, var(--font-dark-color));
    }

    /* Hooks for the label parts, so they can be styled independently of the pill. */
    .menu-cart .cart-count,
    .menu-cart .cart-word {
        font-weight: 600;
    }

    .circle-total {
        position: relative;
        left: -24px;
        top: -10px;
        height: 20px;
        width: 20px;
        border-radius: 50%;
        line-height: 20px;
        text-align: center;
        font-size: 10px;
        transform: scale(1);
    }

    .badge {
        height: 20px;
        width: 20px;
        line-height: 10px;
        font-size: 10px;
        text-align: center;
        transform: scale(1);
        transition: all 0.3s ease-in-out;
        z-index: 2;
    }

    .badge-sm {
        height: 18px;
        width: 18px;
        line-height: 18px;
        font-size: 8px;
        text-align: center;
        transform: scale(1);
        transition: all 0.3s ease-in-out;
        z-index: 2;
    }

    .badge-lg {
        height: 30px;
        width: 30px;
        line-height: 30px;
        font-size: 20px;
        text-align: center;
        transform: scale(1);
        transition: all 0.3s ease-in-out;
        z-index: 2;
    }

    .bdg-green {
        background-color: var(--prepaid-font-color);
        border-color: var(--prepaid-font-color);
        transition: all 0.3s ease-in-out;
    }
    
    .bdg-dark {
        background-color: var(--bg-dark-secondary);
        border-color: var(--bg-dark-secondary);
        box-shadow: 0 0 0 0 var(--bg-dark-secondary);
    }

    .bdg-orange {
        background-color: var(--accent-light-orange);
        border-color: var(--accent-light-orange);
        transition: all 0.3s ease-in-out;
    }

    .bdg-light-pulse {
        background-color: var(--bg-light-color);
        border-color: var(--bg-light-color);
        animation: pulse 2.3s infinite;
        transition: all 0.3s ease-in-out;
    }

    .bdg-light-pulse:nth-child(odd) {
      animation: pulse 2.3s infinite; 
    }

    .bdg-light-pulse:nth-child(even) {
      animation: pulse 1.6s infinite;
    }

    .bdg-light-pulse:nth-child(1) {
      animation: pulse 2.1s infinite; 
    }

    .bdg-light-pulse:nth-child(4) {
      animation: pulse 1.9s infinite; 
    }

    .bdg-light-pulse:nth-child(6) {
      animation: pulse 2.4s infinite; 
    }

    .bdg-green-pulse {
        background-color: var(--prepaid-font-color);
        border-color: var(--prepaid-font-color);
        box-shadow: 0 0 0 0 var(--prepaid-font-color);
        animation: pulseGreen 1.9s infinite;
        transition: all 0.3s ease-in-out;
    }
    
    .bdg-dark-pulse {
        background-color: var(--bg-dark-secondary);
        border-color: var(--bg-dark-secondary);
        box-shadow: 0 0 0 0 var(--bg-dark-secondary);
    }

    .bdg-orange-pulse {
        background-color: var(--accent-light-orange);
        border-color: var(--accent-light-orange);
        box-shadow: 0 0 0 0 var(--accent-light-orange);
        animation: pulseOrange 1.7s infinite;
        transition: all 0.3s ease-in-out;
    }

    .circle-green {
        color: var(--font-white);
        background-color: var(--accent-green);
        box-shadow: 0 0 0 0 var(--accent-green);
        animation: pulseGreen 1.9s infinite;
        transition: all 0.3s ease-in-out;
    }

    .circle-orange {
        color: var(--font-white);
        background-color: var(--accent-dark-orange);
        box-shadow: 0 0 0 0 var(--accent-dark-orange);
        animation: pulseOrange 1.7s infinite;
        transition: all 0.3s ease-in-out;
    }

    .mode-dark .circle-green {
        color: var(--font-white);
        background-color: var(--accent-dark-green);
        box-shadow: 0 0 0 0 var(--accent-dark-green);
        animation: pulseGreen 1.9s infinite;
    }

    .mode-dark .circle-orange {
        color: var(--font-white);
        background-color: var(--accent-dark-orange);
        box-shadow: 0 0 0 0 var(--accent-dark-orange);
        animation: pulseOrange 1.7s infinite;
    }

    .mode-dark .prepaid {
        opacity: 1;
    }

    .mode-dark .prepaid p {
        opacity: 1;
    }

    /* --- Pre-Paid entitlement summary pill + hover/tap breakdown (album_select hero) ---
       Collapses multiple entitlement types (General Use vs tag-restricted credits)
       into one pill; the popover clarifies what each credit can be used on.
       NOTE: the pill + popover are <div>s inside .gallery-counts, which has a generic
       `.gallery-counts div { display:inline-block; min-width:44%; padding:5px;
       border-radius:25px }` rule (specificity 0,1,1). Every pt-ent DIV selector is
       therefore scoped under .gallery-counts (0,2,0) and explicitly resets those four
       props, or the popover collapses to ~44% of the pill width and every word wraps. */
    .gallery-counts .pt-ent-pill {
        position: relative;
        display: inline-block;
        min-width: 0;
        padding: 0;
        border-radius: 0;
        z-index: 6;   /* sit above the bouncing scroll chevron on the landscape hero strip */
    }

    .pt-ent-trigger {
        display: inline-flex;
        align-items: center;
        background-color: var(--prepaid-background-color);
        border: 2px solid var(--prepaid-border-color);
        color: var(--prepaid-font-color);
        opacity: 0.6;
        padding: 0.35rem 0.8rem;
        border-radius: 0.6rem;
        font-weight: 500;
        line-height: 1;
        cursor: pointer;
        transition: opacity 0.2s ease;
    }
    .pt-ent-trigger .pt-ent-count { font-weight: 700; margin: 0 0.25rem; }
    .pt-ent-trigger .fa-star { color: var(--prepaid-icon-color); }
    .mode-dark .pt-ent-trigger { opacity: 1; }

    .pt-ent-pill:hover .pt-ent-trigger,
    .pt-ent-pill:focus-within .pt-ent-trigger,
    .pt-ent-pill.is-open .pt-ent-trigger { opacity: 1; }

    .pt-ent-caret { font-size: 0.7em; transition: transform 0.2s ease; }
    .pt-ent-pill:hover .pt-ent-caret,
    .pt-ent-pill:focus-within .pt-ent-caret,
    .pt-ent-pill.is-open .pt-ent-caret { transform: rotate(180deg); }

    /* Opens UPWARD: the pill sits near the card's bottom edge, so downward would be
       covered by the sticky gallery nav (.secondary-menu, z-index 1020). z-index is
       raised above that nav so the popover is never clipped. */
    .gallery-counts .pt-ent-pop {
        position: absolute;
        display: block;
        bottom: calc(100% + 12px);
        left: 50%;
        transform: translateX(-50%) translateY(6px);
        min-width: 300px;
        max-width: 360px;
        margin: 0;
        background: #fff;
        color: #333;
        border-radius: 16px;
        box-shadow: 0 16px 42px rgba(0, 0, 0, 0.24);
        padding: 18px 20px;
        z-index: 1080;
        opacity: 0;
        visibility: hidden;
        pointer-events: none;
        text-align: left;
        transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
    }
    .pt-ent-pill:hover .pt-ent-pop,
    .pt-ent-pill:focus-within .pt-ent-pop,
    .pt-ent-pill.is-open .pt-ent-pop {
        opacity: 1;
        visibility: visible;
        pointer-events: auto;
        transform: translateX(-50%) translateY(0);
    }
    /* arrow points DOWN toward the pill */
    .pt-ent-pop::before {
        content: '';
        position: absolute;
        top: 100%;
        left: 50%;
        transform: translateX(-50%);
        border: 7px solid transparent;
        border-top-color: #fff;
    }

    .gallery-counts .pt-ent-pop-head {
        display: block;
        min-width: 0;
        padding: 0;
        border-radius: 0;
        font-weight: 700;
        font-size: 0.82rem;
        text-transform: uppercase;
        letter-spacing: 0.6px;
        color: #6c757d;
        margin: 0 0 12px;
    }
    .gallery-counts .pt-ent-row {
        display: flex;
        align-items: center;
        gap: 14px;
        min-width: 0;
        padding: 10px 0;
        margin: 0;
        border-radius: 0;
    }
    .gallery-counts .pt-ent-row + .pt-ent-row { border-top: 1px solid #eee; }
    /* count block: star + number, sits to the LEFT; the "Pre-Paid …" label is to its right */
    .pt-ent-row-count {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-weight: 800;
        font-size: 1.35rem;
        line-height: 1;
        color: #2c2c2c;
        min-width: 2.4em;
    }
    .pt-ent-row-star { color: var(--accent-orange); font-size: 1rem; }
    .pt-ent-row-body { display: flex; flex-direction: column; line-height: 1.3; }
    .pt-ent-row-label { font-weight: 700; font-size: 1.02rem; }
    .pt-ent-row-scope { font-size: 0.85rem; color: #6c757d; margin-top: 1px; }

    /* Reduced-motion: no slide/rotate, snap the reveal. */
    @media (prefers-reduced-motion: reduce) {
        .pt-ent-pop { transition: none; }
        .pt-ent-caret { transition: none; }
    }

    .container-fluid {
        margin-left: 0;
        margin-right: 0;
        padding-left: 0;
        padding-right: 0;
    }

    .row {
        margin-left: 0;
        margin-right: 0;
        padding-left: 0;
        padding-right: 0;
    }

    .secondary-menu {
        background-color: var(--bg-color);
        color: var(--heading-color);
        transition: all 0.3s ease;
        /* One definition for the nav's lift, shared by the stuck state and the
           hover state below, so the two cannot drift apart. */
        --nav-lift-shadow: 0 8px 26px rgba(0, 0, 0, 0.18);
    }

    .secondary-menu.is-stuck-shadow {
        box-shadow: var(--nav-lift-shadow);
    }

    /* Hover lift — the bar reads as a distinct nav bar the moment it is pointed
       at, rather than only once it sticks. Opt-in per view via the modifier
       class (gallery/gallerydownloads today), so the album views keep exactly
       the behaviour they have. :focus-within earns keyboard users the same cue,
       who never generate a hover. */
    .secondary-menu.nav-hover-shadow:hover,
    .secondary-menu.nav-hover-shadow:focus-within {
        box-shadow: var(--nav-lift-shadow);
    }

    .mode-dark .secondary-menu {
    background-color: var(--bg-dark-color);
    color: var(--font-dark-color);
    /* A 0.18-alpha black shadow is invisible against a dark surface, which would
       make the lift a no-op in dark mode — the one place the bar most needs to
       separate from the page. */
    --nav-lift-shadow: 0 8px 26px rgba(0, 0, 0, 0.55);
    }

    .mode-dark .modal-content {
    background-color: var(--bg-dark-color);
    border: 3px solid var(--accent-orange);
    color: var(--font-dark-color);
    box-shadow: 0px 0px 44px var(--soft-shadow);
    }

    .mode-light .secondary-menu {
        background-color: var(--bg-light-color);
        color: var(--heading-color);
        transition: all 0.3s ease;
    }
    @keyframes pulse {
        0% {
            transform: scale(0.95);
            box-shadow: 0 0 0 0 var(--pulse-glow);
        }

        70% {
            transform: scale(1);
            box-shadow: 0 0 0 9px rgba(244, 244, 244, 0);
        }

        100% {
            transform: scale(0.95);
            box-shadow: 0 0 0 0 rgba(244, 244, 244, 0);
        }
    }

    @keyframes pulseOrange {
        0% {
            transform: scale(0.95);
            box-shadow: 0 0 0 0 var(--accent-dark-orange);
        }

        70% {
            transform: scale(1);
            box-shadow: 0 0 0 10px rgba(238, 81, 58, 0);
        }

        100% {
            transform: scale(0.95);
            box-shadow: 0 0 0 0 rgba(238, 81, 58, 0);
        }
    }

    @keyframes pulseGreen {
        0% {
            transform: scale(0.95);
            box-shadow: 0 0 0 0 var(--accent-dark-green);
        }

        70% {
            transform: scale(1);
            box-shadow: 0 0 0 10px rgba(44, 182, 167, 0);
        }

        100% {
            transform: scale(0.95);
            box-shadow: 0 0 0 0 rgba(44, 182, 167, 0);
        }
    } 

    @keyframes flashingAnimation {
        0% {
            opacity: 1;
        }
        100% {
            opacity: 0.5;
        }
    }

    .category-item {
        transition: all 0.3s ease;
    }

    .category-item .btn {
        border-color: var(--accent-orange);
        color: var(--accent-orange);
        transition: all 0.3s ease;
    }

    .category-item .btn:hover {
        background-color: var(--accent-orange);
        color: var(--font-dark-color);
    }

    .category-item.active .btn {
        background-color: var(--accent-orange);
        color: var(--font-dark-color);
        font-weight: 800;
    }

    .category-card h5{
        color: var(--heading-color);
        padding-top: 5px;
        cursor: pointer;
        transition: all 0.3s ease-in-out;
    }

    .category-card:hover h5{
        color: var(--accent-dark-orange);
        transition: all 0.3s ease-in-out;
    }

    .mode-dark .category-item.active h5 {
        color: var(--heading-dark-color);
    }

    .mode-dark .category-card:hover h5{
        color: var(--heading-dark-color);
        transition: all 0.3s ease-in-out;
    }
    
    .mode-dark .category-card h5{
        color: var(--accent-dark-orange);
        transition: all 0.3s ease-in-out;
    }

    #products {
        top: 62px;
        padding-top: 15px;
        transition: all 0.3s ease;
    }

    .mode-dark #products {
        transition: all 0.3s ease;
    }

    #products-container {
        height: 0px;
        opacity: 0;
        pointer-events: none;
        transition: all 0.5s ease;
    }

    #products-container.show {
        height: 100%;
        pointer-events: auto;
        opacity: 1;
    }

    #products-container .card {
        margin-top: 15px;
        border: 2px solid var(--bg-light-color);
        transition: all 0.3s ease-in-out;
    }

    .mode-dark #products-container .card {
        background-color: var(--cart-dark-grey);
    }

    #products-container .card:hover {
        border-color: var(--accent-orange);
        box-shadow: 0px 0px 22px var(--soft-shadow);
    }

    .mode-dark #products-container .card:hover {
        border-color: var(--accent-orange);
        box-shadow: 0px 0px 22px var(--soft-shadow);
    }

    #products-container .card.product.selected {
        transition: all 0.3s ease;
        border-color: var(--accent-orange);
        background-color: var(--bg-light-secondary);
        box-shadow: 0px 0px 11px var(--accent-orange), 0px 0px 44px var(--soft-shadow);
        transform: scale(1.01);
    }

    .mode-dark #products-container .card.product.selected {
        border-color: var(--accent-dark-orange);
        background-color: var(--bg-dark-secondary);
        box-shadow: 0px 0px 66px var(--soft-shadow);
        transform: scale(1.02);
    }

    .product-image {
        border-radius: 10px;
    }

    /* Linear product-stack rows (replaces the cramped multi-column grid). The
       stack is centered + width-capped so rows read as a list, not full-bleed. */
    #products-container .product-div {
        max-width: 540px;
        margin-left: auto;
        margin-right: auto;
    }
    #products-container .product-row-card .card-body { padding: 0.6rem 0.85rem; }
    #products-container .product-row-card .card-title { font-size: 1rem; }
    #products-container .product-row-card .pricing-hint { white-space: nowrap; font-weight: 600; }

    .product-img {
        width: 64px;
        height: 64px;
        max-width: 64px;
        max-height: 64px;
        object-fit: contain;
        flex-shrink: 0;
        transition: transform 0.3s ease;
    }

    .product-img:hover {
        transform: scale(1.1);
    }

    .spin-out {
        transform: rotate(360deg);
    }

    .gallery-item {
        position: relative;
    }

.overlay {
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: rgba(255, 255, 255, 0.75);
        justify-content: center;
        align-items: center;
        pointer-events: none;
        display: flex;
        z-index: 1;
        opacity: 0;
        visibility: hidden;
        transform: scale(0.95);
        transition: opacity 0.25s ease-in-out, transform 0.25s ease-in-out, visibility 0s linear 0.3s;
    }

    .overlay.active {
        opacity: 1;
        visibility: visible;
        transform: scale(1);
        transition: opacity 0.25s ease-in-out, transform 0.25s ease-in-out, visibility 0s linear;
    }

    .overlay-content {
        text-align: center;
        color: var(--font-white);
    }

    .prepaid-footer {
        position: fixed;
        bottom: -100%;
        left: 0px;
        background-color: var(--prepaid-background-color);
        color: var(--prepaid-font-color);
        border-radius: 25px 25px 0px 0px;
        padding: 10px;
        transition: all 0.3s ease;
    }

    .fixed-bottom {
        bottom: 0;
        left: 0;
    }

    /* Define the style for the underline */
.fancy-underline {
    position: relative;
    display: inline-block;
    text-decoration: none;
    color: inherit;
}

/* Create the pseudo-element for the underline */
.fancy-underline::after {
    content: '';
    position: absolute;
    left: 0;
    bottom: 0;
    width: 0%;
    height: 2px;
    background-color: var(--accent-orange); /* Change this to your preferred underline color */
    transition: width 0.3s ease;
}

/* Define the hover effect */
.fancy-underline:hover::after {
    width: 98%;
}

/* Optional: Adjustments for links */
.fancy-underline:hover {
    color: inherit;
}

/* Ken Burns Slideshow */
#carousel {
    width: 100%;
}

.kb-slideshow {
    position: relative;
    overflow: hidden;
    height: 72vh;
    border: 16px solid var(--photo-border-color);
    background-color: #111;
    border-radius: 20px;
    cursor: pointer;
}

.kb-slide {
    position: absolute;
    inset: 0;
    opacity: 0;
    transition: opacity 1.2s ease-in-out;
}

.kb-slide.kb-active {
    opacity: 1;
}

.kb-slide img {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 100%;
    height: 100%;
    object-fit: contain;
    transform: translate(-50%, -50%) scale(1.0);
}

/* Ken Burns animation variants — 4 directions, cycles per slide */
.kb-slide.kb-dir-1.kb-active img {
    animation: kbDir1 7s ease-in-out forwards;
}
.kb-slide.kb-dir-2.kb-active img {
    animation: kbDir2 7s ease-in-out forwards;
}
.kb-slide.kb-dir-3.kb-active img {
    animation: kbDir3 7s ease-in-out forwards;
}
.kb-slide.kb-dir-4.kb-active img {
    animation: kbDir4 7s ease-in-out forwards;
}

@keyframes kbDir1 {
    from { transform: translate(-50%, -50%) scale(1.10) translate(1.5%, 1%); }
    to   { transform: translate(-50%, -50%) scale(1.00) translate(0%,    0%); }
}
@keyframes kbDir2 {
    from { transform: translate(-50%, -50%) scale(1.00); }
    to   { transform: translate(-50%, -50%) scale(1.10); }
}
@keyframes kbDir3 {
    from { transform: translate(-50%, -50%) scale(1.10) translate(-1.5%, 1%); }
    to   { transform: translate(-50%, -50%) scale(1.00) translate(0%,     0%); }
}
@keyframes kbDir4 {
    from { transform: translate(-50%, -50%) scale(1.00) translate(1%, -1%); }
    to   { transform: translate(-50%, -50%) scale(1.10) translate(0%,  0%); }
}

/* Slide counter */
.kb-counter {
    position: absolute;
    bottom: 14px;
    right: 18px;
    color: rgba(255, 255, 255, 0.75);
    font-family: 'Poppins', sans-serif;
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-shadow: 0 1px 4px rgba(0,0,0,0.6);
    z-index: 10;
    pointer-events: none;
}

/* Prev / Next nav */
.kb-nav {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    z-index: 10;
    background: rgba(0, 0, 0, 0.28);
    border: none;
    color: rgba(255, 255, 255, 0.8);
    width: 44px;
    height: 72px;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    border-radius: 3px;
    transition: background 0.2s, color 0.2s;
    font-size: 1rem;
}
.kb-nav:hover {
    background: rgba(0, 0, 0, 0.55);
    color: #fff;
}
.kb-nav-prev { left: 0; border-radius: 0 3px 3px 0; }
.kb-nav-next { right: 0; border-radius: 3px 0 0 3px; }



#activeProduct .card {
    border: none;
    text-align: left !important;
    transition: transform 0.2s ease, box-shadow 0.2s ease;
}

#activeProduct .card:hover {
    transform: translateY(-4px);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
}

.mode-dark #activeProduct .card {
    border: none;
    background-color: var(--cart-dark-grey);
    color: var(--heading-dark-color);
}

.mode-dark #activeProduct .card:hover {
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
}

#activeProduct .card .btn {
    position: absolute;
    background-color: var(--accent-orange);
    border: 3px solid var(--bg-light-color);
    color: var(--font-dark-color);
    bottom: -20px;
    left: 25%;
    right: 25%;
    margin: 0 auto;
    transition: all 0.3 ease;
}

#activeProduct .card .btn:hover {
    background-color: var(--bg-light-color);
    border: 2px solid var(--accent-orange);
    color: var(--accent-orange);

}

.btn {
    border-radius: 20px;
    cursor: pointer;
    padding: 10px;
    font-weight: 800;
}

.btn-danger {
    cursor: pointer;
    background-color: var(--accent-orange);
    border-color: var(--accent-orange);
}

.btn-danger:hover {
    border-color: var(--accent-orange);
    color: var(--accent-orange);
    background-color: var(--bg-light-color);
}

.btn-outline-danger {
    cursor: pointer;
    background-color: var(--bg-light-color);
    border: 2px solid var(--accent-orange);
    color: var(--accent-orange);
}

.btn-outline-danger:hover {
    background-color: var(--accent-orange);
    border: 2px solid var(--bg-light-color);
    color: var(--bg-light-color);
}

.btn-outline-primary {
    background-color: var(--bg-light-color);
    border: 1px solid var(--heading-light-color);
    color: var(--heading-light-color);
    margin-bottom: 2px;
}

.btn-outline-primary:hover {
    background-color: var(--bg-light-color);
    border: 1px solid var(--accent-orange);
    color: var(--accent-orange);
}

.btn-square {
    width: 51px; 
    height: 52px;
    border-radius: 10px;
    transition: all 0.3 ease-in-out;
}

.btn-square.active {
    border: 2px solid var(--accent-orange);
    color: var(--accent-orange);
}

.donation-added {
    background-color: var(--accent-orange);
    color: var(--font-dark-color);
    border-radius: 10px;
}

/* --- Cart Feedback Chip --- */
#cartChip {
    position: fixed;
    top: 115px; /* JS overrides this to secondary-menu bottom + 8px */
    right: 1rem;
    width: 300px;
    background: var(--overlay-bg);
    color: var(--overlay-text);
    border: 1px solid var(--overlay-border);
    border-radius: 12px;
    box-shadow: 0 6px 28px var(--soft-shadow);
    z-index: 6000;
    transform: translateX(calc(100% + 2rem));
    transition: transform 0.32s cubic-bezier(0.34, 1.4, 0.64, 1);
    pointer-events: none;
}
#cartChip.show {
    transform: translateX(0);
    pointer-events: auto;
}
.cart-chip-inner {
    display: flex;
    align-items: center;
    gap: 0.65rem;
    padding: 0.75rem 0.85rem;
}
.cart-chip-thumb {
    width: 52px;
    height: 52px;
    object-fit: cover;
    border-radius: 7px;
    flex-shrink: 0;
    background: var(--overlay-bg-secondary);
}
.cart-chip-body {
    flex: 1;
    min-width: 0;
}
.cart-chip-title {
    font-weight: 600;
    font-size: 0.82rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    color: var(--overlay-text);
}
.cart-chip-meta {
    display: flex;
    gap: 0.4rem;
    font-size: 0.75rem;
    color: var(--overlay-text-muted);
    margin-top: 0.1rem;
}
.cart-chip-price {
    color: var(--accent-orange);
    font-weight: 600;
}
.cart-chip-view {
    background: var(--accent-orange);
    color: var(--font-white);
    border: none;
    border-radius: 7px;
    width: 32px;
    height: 32px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    cursor: pointer;
    font-size: 0.85rem;
    transition: background 0.15s;
}
.cart-chip-view:hover {
    background: var(--accent-light-orange);
}
.cart-chip-close {
    background: none;
    border: none;
    color: var(--overlay-text-muted);
    cursor: pointer;
    flex-shrink: 0;
    font-size: 0.7rem;
    opacity: 0.55;
    line-height: 1;
    /* 44px touch target (small glyph, large hit area) so "dismiss" can't mis-tap "view cart" */
    min-width: 44px;
    min-height: 44px;
    padding: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}
.cart-chip-close:hover {
    opacity: 1;
}
.mode-dark #cartChip {
    background: var(--surface-elevated-dark);
    border-color: var(--overlay-border);
}

img.logo {
    height: 75px;
    max-width: 100%;
    transition: all 0.3s ease;
}

.live img.logo {
    max-height: 75px;
}

.secondary-menu img.logo {
    max-height: 75px;
}

.secondary-menu .live img.logo {
        max-height: 50px;   
    }

@media (max-width: 761px) {
    .secondary-menu img.logo {
        max-height: 50px;
    }
    
    .secondary-menu .live img.logo {
        max-height: 40px;   
    }
}

.secondary-menu img.logo {
    max-height: 50px;
}

/* --- Logo slides up off-screen / heading text fades in when scrolled past heading --- */
.nav-logo-area {
    position: relative;
    overflow: hidden;
}

.nav-logo-area img.logo {
    transition: transform 0.4s ease, opacity 0.3s ease;
}

.nav-heading-text {
    display: block;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    font-size: 14px;
    font-weight: 600;
    color: var(--heading-color);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 80%;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.35s ease;
}

/* Scrolled past heading: logo slides up and out, heading fades in */
.secondary-menu.past-heading .nav-logo-area img.logo {
    transform: translateY(-110%);
    opacity: 0;
    pointer-events: none;
}

.secondary-menu.past-heading .nav-heading-text {
    opacity: 1;
}

/* Image clicked: logo slides back down into view, heading fades out */
.secondary-menu.image-selected .nav-logo-area img.logo {
    transform: translateY(0);
    opacity: 1;
    pointer-events: auto;
}

.secondary-menu.image-selected .nav-heading-text {
    opacity: 0;
}

.mode-dark .nav-heading-text {
    color: var(--font-dark-color);
}

.donation-logo{
    max-height: 75px;
}

.donation-text{
    font-weight: 500;
    font-size: 14px;
    color: var(--heading-light-color);
}

.mode-dark .donation-text{
    color: var(--heading-dark-color);
}

.donation-link{
    font-weight: 100;
    font-size: 12px;
    text-decoration: none;
    color: var(--prepaid-font-color);
}

.footer-text {
    font-weight: 100;
    font-size: 12px;
}

.footer-text a {
    font-weight: 200;
    font-size: 12px;
    text-decoration: none;
    color: var(--accent-light-orange);
}

.footer-text a:hover {
    font-weight: 300;
    text-decoration: none;
    color: var(--accent-dark-orange);
}

/* Checkout footer — themed bar matching the gallery's #prepaid-footer curve.
   Static at the bottom of the page (not fixed). Breaks out of the
   container-fluid gutter so the curved bar spans edge to edge; the photographer
   background (.checkout-page-bg) now runs the full page behind it. Honors the
   photographer footer color overrides via the inline style, falling back to the
   same --prepaid-* theme vars the gallery bar uses. */
.checkout-footer-bar {
    /* No negative side margins: that full-bleed trick pulled the bar wider than the
       viewport and put a horizontal scrollbar across every checkout step. margin-top:auto
       pins the bar to the bottom of the flex-column page wrapper (.checkout-page-bg) so a
       short order no longer leaves a dead band of background beneath the footer. */
    margin: auto 0 0;
    background-color: var(--prepaid-background-color);
    color: var(--prepaid-font-color);
    border-radius: 25px 25px 0 0;
    box-shadow: 0 -4px 18px rgba(0, 0, 0, 0.12);
    padding: 4px 0 14px;
}

.checkout-footer-bar .footer-text {
    color: var(--prepaid-font-color);
}

.checkout-footer-bar .footer-text a {
    color: var(--prepaid-font-color);
    text-decoration: underline;
    text-underline-offset: 2px;
}

.checkout-footer-bar .footer-text a:hover {
    color: var(--prepaid-font-color);
    opacity: 0.8;
}

/* Photographer background covers the full viewport on the checkout page so it
   never falls back to the plain body color below the content/footer. Flex column so
   the footer bar's margin-top:auto can pin it to the bottom (no dead band below it). */
.checkout-page-bg {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
}

/* ---------------------------------------------------------------------------
   Login / entry footer + standalone Support link
   (layout/footer_login.php + login/login.php). Replaces the hardcoded white
   #eee bar and the raw blue-underlined links/btn-link with a themed, modern
   surface. Theme-variable driven; light + dark.
--------------------------------------------------------------------------- */
#footer.login-footer {
    background-color: var(--bg-light-secondary);
    color: var(--font-light-color);
    border-top: 1px solid rgba(0, 0, 0, 0.06);
    font-size: 12px;
    font-weight: 300;
}

.mode-dark #footer.login-footer {
    background-color: var(--bg-dark-secondary);
    color: var(--font-dark-color);
    border-top: 1px solid rgba(255, 255, 255, 0.08);
}

#footer.login-footer a {
    color: var(--accent-orange);
    text-decoration: none;
    font-weight: 500;
    transition: color 0.15s ease;
}

#footer.login-footer a:hover {
    color: var(--accent-dark-orange);
    text-decoration: underline;
}

#footer.login-footer .poweredby {
    margin-top: 0.25rem;
    opacity: 0.7;
}

#footer.login-footer .poweredby a {
    font-weight: 400;
}

/* Standalone "Contact Support" link below the entry card — a quiet glass pill
   that reads cleanly over the photo hero, not a blue underline. */
.login-support-link {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    background: rgba(255, 255, 255, 0.14);
    color: #fff;
    border: 1px solid rgba(255, 255, 255, 0.32);
    border-radius: 999px;
    padding: 7px 18px;
    font-size: 0.9rem;
    font-weight: 500;
    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
    -webkit-backdrop-filter: blur(4px);
    backdrop-filter: blur(4px);
    transition: background 0.15s ease, border-color 0.15s ease;
}

.login-support-link:hover,
.login-support-link:focus-visible {
    background: var(--accent-orange);
    border-color: var(--accent-orange);
    color: #fff;
    text-shadow: none;
    outline: none;
}

/* Cart item row — flex layout */
.cart-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 0;
    position: relative;
}
.cart-item:not(:last-child)::after {
    content: '';
    position: absolute;
    bottom: 0;
    left: 10%;
    width: 80%;
    height: 1px;
    background: var(--overlay-border);
    opacity: 0.5;
}
.cart-thumb-wrap {
    position: relative;
    flex-shrink: 0;
    width: 48px;
    height: 48px;
}
.cart-thumb-wrap:hover .cart-thumb-zoom {
    opacity: 1;
}
.cart-thumb-zoom {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.45);
    border: none;
    border-radius: 4px;
    color: #fff;
    font-size: 0.7rem;
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    transition: opacity 0.15s ease;
    cursor: pointer;
}
.cart-item-thumb {
    width: 48px;
    height: 48px;
    object-fit: cover;
    border-radius: 4px;
    display: block;
    background: var(--bg-dark-secondary, #eee);
}
.cart-item-details {
    flex: 1;
    min-width: 0;
}
.cart-item-name {
    font-size: 0.82rem;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    margin-bottom: 2px;
}
.cart-item-meta {
    font-size: 0.78rem;
    color: var(--font-muted-color, #888);
    display: flex;
    align-items: center;
    flex-wrap: wrap;
}
.cart-item-qty-label {
    display: inline-flex;
    align-items: center;
}
.remove-from-cart {
    flex-shrink: 0;
    background: none;
    border: none;
    color: var(--font-muted-color, #aaa);
    font-size: 0.7rem;
    padding: 4px 6px;
    cursor: pointer;
    border-radius: 4px;
    line-height: 1;
    transition: color 0.15s ease, background 0.15s ease;
}
.remove-from-cart:hover {
    color: var(--danger-color, #dc3545);
    background: rgba(220, 53, 69, 0.1);
}

/* Cart image lightbox — z-index must exceed cart panel (5000) */
#cartImageLightbox {
    z-index: 6000;
}
.cart-lightbox-modal .modal-content {
    border: 1px solid var(--overlay-border);
    box-shadow: 0 18px 55px rgba(0, 0, 0, 0.55);
    border-radius: 10px;
}
.cart-lightbox-modal .modal-header {
    border-bottom: 1px solid var(--overlay-border);
}
.mode-light .cart-lightbox-modal .modal-content {
    background: var(--bg-color);
    color: var(--font-color);
}
.mode-light .cart-lightbox-modal .modal-header {
    background: var(--bg-color);
}
.mode-dark .cart-lightbox-modal .modal-content {
    background: var(--bg-dark-color);
    color: var(--font-dark-color);
}
.mode-dark .cart-lightbox-modal .modal-header {
    background: var(--bg-dark-color);
}
.mode-dark .cart-lightbox-modal .btn-close {
    filter: invert(1) grayscale(1) brightness(200%);
}
.cart-lightbox-img {
    display: block;
    max-width: 100%;
    max-height: 75vh;
    margin: 0 auto;
    border-radius: 6px;
    object-fit: contain;
}

.checkout-label {
    font-size: 14px;
    font-weight: light;
    color: var(--heading-color);
    font-family: 'Poppins', sans-serif !important;
}


/* STYLE FOR SHOPPING CART */
.callout {
    border-left: 4px solid var(--prepaid-border-color);
    background-color: var(--prepaid-background-color);
    color: var(--prepaid-border-color);
    border-bottom-right-radius: 5px;
    border-top-right-radius: 5px;
}

.callout .checkout-label {
    color: var(--prepaid-border-color);
}

.callout i {
    color: var(--prepaid-border-color);
}

/* Album Select: nudge + campaign modal */
/* Entire-gallery kill-switch: when album_select stamps body.pt-no-egallery
   (single-image/few-photo configurator mode OR no digital bundle), hide every
   "Buy/Add Entire Gallery" button + the "get them all" nudge & deal-hint,
   regardless of which JS path renders them (CSS applies whenever created). */
body.pt-no-egallery #galleryNudge,
body.pt-no-egallery #galleryDealHint,
body.pt-no-egallery .digital-gallery,
body.pt-no-egallery .digital-gallery-checkout,
body.pt-no-egallery #select-all-soon,
body.pt-no-egallery .cart-gallery-promo,
body.pt-no-egallery .pt-egallery {
    display: none !important;
}

.gallery-nudge-widget {
    position: fixed;
    top: 50%;
    left: 0;
    transform: translate(-100%, -50%);
    background: var(--prepaid-background-color);
    color: var(--prepaid-font-color);
    border-radius: 0 12px 12px 0;
    padding: 16px;
    box-shadow: 2px 0 8px var(--shadow-color);
    z-index: 9999;
    max-width: 260px;
    transition: transform 0.5s ease-out;
    opacity: 0.95;
    border-left: 4px solid var(--accent-orange);
}

#nudgeText {
    font-weight: 900;
}

.gallery-nudge-widget.visible {
    transform: translate(0, -50%);
}

/* Album UX V2: lightbox */

.zoom-image-btn {
    position: absolute;
    top: 8px;
    right: 8px;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    border: 0;
    background: rgba(0, 0, 0, 0.62);
    color: var(--font-white);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    z-index: 5;
}

.zoom-image-btn:hover {
    background: rgba(0, 0, 0, 0.8);
}

.album-lightbox-modal .modal-content {
    background: var(--overlay-bg);
    color: var(--overlay-text);
    border: 1px solid var(--overlay-border);
    box-shadow: 0 18px 55px rgba(0, 0, 0, 0.55);
    border-radius: 0;
    min-height: 100vh;
}

.album-lightbox-modal .modal-header {
    background: var(--overlay-bg-secondary);
    border-bottom: 1px solid var(--accent-dark-orange) !important;
}

.album-lightbox-modal .modal-body {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    min-height: calc(100vh - 72px);
}

.mode-dark .album-lightbox-modal .btn-close {
    filter: invert(1) grayscale(1) brightness(200%);
}

.album-lightbox-esc-hint {
    font-size: 0.85rem;
    color: var(--overlay-text-muted);
}

.album-lightbox-esc-hint kbd {
    background: var(--overlay-border);
    color: var(--overlay-text);
    border: 1px solid var(--overlay-border);
    box-shadow: none;
}

.album-lightbox-stage {
    position: relative;
    width: 100%;
    min-height: calc(100vh - 210px);
    display: flex;
    align-items: center;
    justify-content: center;
}

.album-lightbox-img {
    max-width: 100%;
    max-height: 72vh;
    border-radius: 8px;
}

.album-lightbox-nav {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 42px;
    height: 42px;
    border-radius: 50%;
    border: 1px solid var(--overlay-border);
    background: var(--overlay-bg);
    color: var(--overlay-text);
}

.album-lightbox-prev {
    left: 10px;
}

.album-lightbox-next {
    right: 10px;
}

.album-lightbox-meta {
    font-size: 0.86rem;
    opacity: 0.8;
}

/* ===== Choose-gallery (multi-location disambiguation) ===== */
.choose-gallery-title {
    font-family: "Poppins", sans-serif;
    font-weight: 800;
    color: var(--heading-color, #06054f);
    font-size: 1.9rem;
    margin-bottom: 6px;
}
.choose-gallery-sub {
    font-family: "Manrope", sans-serif;
    color: var(--font-color, #333);
    max-width: 560px;
    margin: 0 auto;
    opacity: 0.9;
}
.gallery-choice-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 18px;
}
.gallery-choice-card {
    display: flex;
    flex-direction: column;
    background: var(--bg-secondary, #fff);
    border: 1px solid var(--overlay-border, rgba(0, 0, 0, 0.12));
    border-radius: 14px;
    overflow: hidden;
    text-decoration: none;
    color: inherit;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);
    transition: transform 0.12s ease, box-shadow 0.12s ease;
}
.gallery-choice-card:hover,
.gallery-choice-card:focus {
    transform: translateY(-3px);
    box-shadow: 0 12px 30px rgba(0, 0, 0, 0.16);
    outline: 2px solid var(--accent-orange, #ee513a);
    outline-offset: 2px;
}
.gallery-choice-thumb-wrap {
    width: 100%;
    aspect-ratio: 4 / 3;
    background: #11131a;
    overflow: hidden;
}
.gallery-choice-thumb {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.gallery-choice-body { padding: 14px 16px; }
.gallery-choice-name {
    font-family: "Poppins", sans-serif;
    font-weight: 700;
    color: var(--heading-color, #06054f);
    margin-bottom: 6px;
}
.gallery-choice-meta {
    font-size: 0.85rem;
    color: var(--font-color, #555);
    opacity: 0.85;
}
.gallery-choice-cta {
    display: inline-block;
    margin-top: 10px;
    font-weight: 700;
    color: var(--accent-orange, #ee513a);
}
.mode-dark .gallery-choice-card {
    background: var(--bg-dark-secondary, #1a1d26);
    border-color: var(--overlay-border, rgba(255, 255, 255, 0.14));
}
.mode-dark .choose-gallery-title,
.mode-dark .gallery-choice-name { color: var(--heading-dark-color, #eef0f5); }
.mode-dark .choose-gallery-sub,
.mode-dark .gallery-choice-meta { color: var(--font-dark-color, #c8ccd6); }

/* ===== Album lightbox loupe — clean-detail window over a watermarked base ===== */
.album-loupe {
    position: absolute;
    top: 0;
    left: 0;
    width: 220px;
    height: 220px;
    border-radius: 50%;
    pointer-events: none;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.12s ease;
    z-index: 5;
    background-repeat: no-repeat;
    background-color: #000;
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.9),
                0 0 0 7px var(--accent-light-orange, rgba(238, 81, 58, 0.35)),
                0 14px 34px rgba(0, 0, 0, 0.55),
                inset 0 0 30px rgba(0, 0, 0, 0.25);
    will-change: transform, background-position;   /* moved via transform (composited) — no per-frame layout */
}
.album-loupe.is-active {
    opacity: 1;
    visibility: visible;
}
.album-loupe-hint {
    font-size: 0.86rem;
    opacity: 0.8;
    display: inline-flex;
    align-items: center;
    gap: 6px;
}
.album-lightbox-img.loupe-enabled {
    cursor: pointer;   /* click adds to cart — signal "click", not "inspect" */
}

.emoji-big {
    font-size: 2.25rem;
    line-height: 1;
    display: inline-block;
    margin-bottom: 4px;
}

.close-nudge {
    position: absolute;
    top: 6px;
    right: 10px;
    background: transparent;
    border: none;
    font-size: 1.5rem;
    line-height: 1;
    color: var(--cart-dark-grey);
    cursor: pointer;
}

.close-nudge:hover {
    color: var(--font-color);
}

.prepaid-slideout {
    position: fixed;
    right: -315px;
    bottom: 120px;
    background: var(--prepaid-background-color);
    color: var(--prepaid-font-color);
    padding: 15px 25px;
    border-radius: 12px 0 0 12px;
    box-shadow: 0 3px 10px var(--shadow-color);
    font-size: 14px;
    font-weight: 500;
    transition: right 0.5s ease;
    z-index: 1050;
    border-left: 10px solid var(--accent-orange);
}

.prepaid-slideout.show {
    right: 0;
}

/* -------------------------------------------------------
   Entire-gallery proximity hint (inside mini-cart footer)
   ------------------------------------------------------- */

/* Shown once the remaining gap drops below half the gallery price */
.gallery-deal-hint {
    background: var(--prepaid-background-color);
    color: var(--prepaid-font-color);
    border-radius: 8px;
    padding: 10px 12px 8px;
    margin-bottom: 10px;
    text-align: center;
}
.gallery-deal-hint-text {
    font-size: 0.85rem;
    margin: 0 0 8px;
}

.animates-modal {
    background: var(--accent-orange);
    border-radius: 20px;
    border: none !important;
    padding: 0;
}

.animates-modal .modal-header,
.animates-modal .modal-footer {
    border: none !important;
}

.animates-title {
    font-weight: 900;
    font-size: 42px;
    margin-top: 15px;
    margin-bottom: 10px;
    color: var(--font-color);
    text-transform: uppercase;
}

.animates-subtitle {
    font-weight: 700;
    font-size: 22px;
    color: var(--heading-color);
    margin-bottom: 10px;
}

.animates-text {
    font-size: 17px;
    font-weight: 500;
    color: var(--font-color);
    line-height: 1.45;
    padding: 0 15px;
}

.animates-primary-btn {
    border: 4px solid var(--accent-orange);
    background: var(--bg-dark-color);
    color: var(--font-dark-color);
    font-size: 18px;
    padding: 12px 0;
    border-radius: 40px;
    font-weight: 700;
    transition: all 0.3s ease-in-out;
}

.animates-primary-btn:hover {
    border: 4px solid var(--bg-dark-color);
    background: var(--accent-orange);
    color: var(--font-color);
    font-size: 18px;
    padding: 12px 0;
    border-radius: 40px;
    font-weight: 700;
}

.animates-skip-btn {
    background: var(--accent-orange);
    color: var(--font-color);
    font-size: 14px;
    font-weight: 700;
    border-radius: 30px;
    padding: 8px 20px;
}

.animates-footer {
    border: none;
    background: transparent;
    display: flex;
    justify-content: center;
    padding-bottom: 20px;
}

/* ============================================================
   Model Release Modal — generic admin-designed modal
   Colors injected as CSS custom properties on the modal element
   from admin DB values (--mr-bg, --mr-text, --mr-accent, etc.)
   ============================================================ */
.mr-modal .mr-modal-dialog {
    max-width: var(--mr-width, 480px);
}
.mr-modal .mr-modal-content {
    background: var(--mr-bg, #ffffff);
    color: var(--mr-text, #333333);
    border-radius: var(--mr-radius, 12px);
    border: none;
    overflow: hidden;
    font-family: var(--mr-font, Poppins, system-ui, sans-serif);
}
.mr-hero {
    width: 100%;
    max-height: 200px;
    overflow: hidden;
}
.mr-hero-img {
    width: 100%;
    height: 200px;
    object-fit: cover;
    display: block;
}
.mr-modal-body {
    padding: 24px;
}
.mr-logo-wrap {
    text-align: center;
    margin-bottom: 12px;
}
.mr-logo {
    max-width: 120px;
    max-height: 60px;
    object-fit: contain;
}
.mr-headline {
    font-size: 1.5rem;
    font-weight: 800;
    color: var(--mr-text, #333333);
    margin-bottom: 6px;
    text-align: center;
}
.mr-subheadline {
    font-size: 1rem;
    font-weight: 600;
    color: var(--mr-text, #333333);
    opacity: 0.85;
    text-align: center;
    margin-bottom: 12px;
}
.mr-body-text {
    font-size: 0.9rem;
    line-height: 1.5;
    margin-bottom: 14px;
}
.mr-legal-scroll {
    max-height: 140px;
    overflow-y: auto;
    border: 1px solid rgba(0,0,0,0.12);
    border-radius: 6px;
    padding: 10px 12px;
    margin-bottom: 14px;
    font-size: 0.8rem;
    line-height: 1.45;
    background: rgba(0,0,0,0.02);
}
.mr-legal-text {
    color: var(--mr-text, #333333);
    opacity: 0.8;
}
.mr-form .mr-field-label {
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--mr-text, #333333);
    margin-bottom: 2px;
}
.mr-form .mr-field-input {
    border-color: rgba(0,0,0,0.15);
    font-size: 0.88rem;
}
.mr-form .mr-field-input:focus {
    border-color: var(--mr-accent, #e8513a);
    box-shadow: 0 0 0 2px rgba(232,81,58,0.15);
}
.mr-req {
    color: var(--mr-accent, #e8513a);
    font-weight: 700;
}
.mr-consent-check {
    font-size: 0.85rem;
}
.mr-consent-label {
    color: var(--mr-text, #333333);
}
.mr-cta-btn {
    background: var(--mr-btn-bg, var(--mr-accent, #e8513a));
    color: var(--mr-btn-text, #ffffff);
    border: none;
    font-weight: 700;
    font-size: 1rem;
    padding: 12px;
    border-radius: calc(var(--mr-radius, 12px) / 2);
    transition: opacity 0.2s ease;
}
.mr-cta-btn:hover {
    opacity: 0.9;
    color: var(--mr-btn-text, #ffffff);
}
.mr-cta-btn:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}
.mr-skip-btn {
    background: transparent;
    color: var(--mr-text, #333333);
    opacity: 0.5;
    font-size: 0.85rem;
    font-weight: 500;
    border: none;
    transition: opacity 0.2s ease;
}
.mr-skip-btn:hover {
    opacity: 0.8;
    color: var(--mr-text, #333333);
}

/* Dark mode */
.mode-dark .mr-modal .mr-modal-content {
    box-shadow: 0 4px 24px rgba(0,0,0,0.5);
}
.mode-dark .mr-legal-scroll {
    border-color: rgba(255,255,255,0.12);
    background: rgba(255,255,255,0.04);
}
.mode-dark .mr-form .mr-field-input {
    background: rgba(255,255,255,0.06);
    border-color: rgba(255,255,255,0.15);
    color: var(--mr-text, #eeeeee);
}
.mode-dark .mr-form .mr-field-input:focus {
    border-color: var(--mr-accent, #e8513a);
    box-shadow: 0 0 0 2px rgba(232,81,58,0.25);
}

/* ============================================================
   Styles consolidated from inline <style> blocks in views
   ============================================================ */

/* --- login/termsofuse.php --- */
.bodytext {
    color: var(--font-color);
}

/* --- layout/footer_login.php: Scene to Believe SVG hover --- */
.stb-svg {
    transition: 0.3s ease-in-out;
    transform: scale(1.0);
}

.stb-svg:hover {
    transform: scale(1.1);
}

/* --- checkout/paymentconfirm_view.php: order confirmation items --- */
.confirmedItem {
    color: var(--font-color);
    margin-top: 20px;
    padding-bottom: 10px;
    border-bottom: 1px dotted var(--social-glow);
    transition: all 0.3s ease-in-out;
}

.confirmedItem img {
    transition: all 0.3s ease-in-out;
}

.confirmedItem:hover img {
    transform: scale(1.02);
}

.confirmedItem .label {
    color: var(--social-glow);
    font-weight: 800;
}

/* --- layout/header.php + main/index.php: best-value product banner --- */
.best-value-banner {
    position: absolute;
    top: -35px;
    left: 30%;
    width: 99%;
    height: 30px;
    background-color: var(--accent-orange);
    overflow: hidden;
    text-align: center;
    color: var(--font-white);
    transform: rotate(45deg);
    transform-origin: left bottom;
    z-index: 1;
    box-shadow: 0px 0px 5px var(--social-glow);
    line-height: 30px;
    font-weight: bold;
    /* Safe fallback size; the @container rules below shrink it to fit narrow
       cards so "SPECIAL!" never clips against the container's overflow:hidden. */
    font-size: 0.78rem;
    letter-spacing: 0.2px;
    white-space: nowrap;
}

.best-value-banner:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 50%;
    height: 100%;
    background-color: inherit;
    transform-origin: bottom left;
    transform: skewY(-45deg);
    box-shadow: 0px 0px 5px var(--shadow-color);
}

.best-value-banner:after {
    content: '';
    position: absolute;
    top: 0;
    left: -80%;
    width: 60%;
    height: 100%;
    background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.28) 50%, transparent 100%);
    animation: shimmerSweep 3.5s ease-in-out infinite;
    pointer-events: none;
}

@keyframes shimmerSweep {
    0%, 45% { left: -80%; }
    100%    { left: 160%; }
}

.gallery-icon {
    position: absolute;
    max-width: 100%;
    max-height: 60%;
    width: auto;
    height: auto;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.best-value-container {
    position: relative;
    overflow: hidden;
    /* Establish a container context so the ribbon label can scale to the card's
       own width (viewport media queries don't work here — the narrowest card is
       the desktop col-lg-3, while mobile col-9 is wider). */
    container-type: inline-size;
}

/* Shrink "SPECIAL!" as the card narrows so it always fits inside the ribbon.
   Browsers without @container support keep the 0.78rem fallback above. */
@container (max-width: 150px) {
    .best-value-banner { font-size: 0.68rem; letter-spacing: 0; }
}
@container (max-width: 120px) {
    .best-value-banner { font-size: 0.58rem; letter-spacing: -0.2px; }
}
@container (max-width: 95px) {
    .best-value-banner { font-size: 0.5rem; }
}

/* --- registration/entry_view.php: country phone flag --- */
.phone-flag {
    display: inline-block;
    width: 24px;
    height: 16px;
    background-size: cover;
    background-position: center center;
    border-radius: 2px;
    margin-right: 4px;
}

.flag-default { background-color: var(--cart-grey); }
.flag-us { background-image: url('/assets/img/flags/us.png'); }
.flag-ca { background-image: url('/assets/img/flags/ca.png'); }
.flag-uk { background-image: url('/assets/img/flags/uk.png'); }
.flag-au { background-image: url('/assets/img/flags/au.png'); }
.flag-nz { background-image: url('/assets/img/flags/nz.png'); }
.flag-jp { background-image: url('/assets/img/flags/jp.png'); }

/* layout/navbar.php */
.navbar-fixed {
    top: 0px;
    z-index: 98;
    position: fixed;
    width: 100%;
    transition: all 1s ease-in-out;
}

/* login/vieworder.php */
/* ---------- Order page polish (Bootstrap-friendly) ---------- */

.order-wrap { padding-top: 1.5rem; padding-bottom: 2rem; }

.order-card {
    border: 1px solid rgba(0,0,0,.075);
    border-radius: 1rem;
    overflow: hidden;
    background: #fff;
    box-shadow: 0 .5rem 1.25rem rgba(0,0,0,.06);
}

.order-card-header {
    background: linear-gradient(180deg, rgba(13,110,253,.10), rgba(13,110,253,.02));
    border-bottom: 1px solid rgba(0,0,0,.06);
    padding: 1.25rem 1.25rem;
}

.order-title { margin: 0; font-weight: 700; letter-spacing: .2px; }

.order-subtitle {
    margin-top: .25rem;
    color: rgba(0,0,0,.60);
    font-size: .95rem;
}

.order-summary { padding: 1rem 1.25rem; }

.order-summary-grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: .75rem;
}

@media (max-width: 992px) { .order-summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 576px) { .order-summary-grid { grid-template-columns: 1fr; } }

.order-summary-box {
    background: #fff;
    border: 1px solid rgba(0,0,0,.06);
    border-radius: .75rem;
    padding: .85rem .9rem;
    min-height: 90px;
}

.order-summary-label {
    color: rgba(0,0,0,.55);
    font-size: .85rem;
    margin-bottom: .25rem;
}

.order-summary-value {
    font-weight: 600;
    color: rgba(0,0,0,.85);
    line-height: 1.25rem;
    word-break: break-word;
}

.order-table-wrap { padding: 0 1.25rem 1.25rem; }

.order-table { margin: 0; }

.order-table thead th {
    font-size: .85rem;
    letter-spacing: .3px;
    text-transform: uppercase;
    color: rgba(0,0,0,.55);
    border-top: 0;
}

.order-item-row td { vertical-align: top; }

/* Don't force square crop */
.order-thumb {
    width: 100px;
    height: auto;
    max-height: 120px;
    object-fit: contain;
    border-radius: .75rem;
    border: 1px solid rgba(0,0,0,.08);
    background: #fff;
    display: block;
}

.order-bundle-badge {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    padding: .25rem .55rem;
    border-radius: 999px;
    background: rgba(13,110,253,.10);
    color: rgba(13,110,253,.95);
    font-weight: 600;
    font-size: .8rem;
    margin-bottom: .35rem;
}

.order-product-name { font-weight: 700; color: rgba(0,0,0,.85); }

.order-qty { color: rgba(0,0,0,.65); font-size: .95rem; }

.order-label { color: rgba(0,0,0,.55); font-size: .85rem; }

.order-meta { font-size: .9rem; color: rgba(0,0,0,.75); }

.order-status-main { font-weight: 700; color: rgba(0,0,0,.80); }

.order-status-sub { margin-top: .15rem; font-size: .9rem; color: rgba(0,0,0,.60); }

.order-price { font-weight: 800; }

.order-time { color: rgba(0,0,0,.60); font-size: .9rem; }

.order-empty {
    padding: 2rem;
    border: 1px dashed rgba(0,0,0,.25);
    border-radius: 1rem;
    color: rgba(0,0,0,.65);
    background: rgba(0,0,0,.02);
}

.order-pending { display: flex; align-items: flex-start; gap: .5rem; }

/* Loader that renders consistently */
.order-loader {
    width: 14px;
    height: 14px;
    border: 2px solid rgba(13,110,253,.25);
    border-top-color: rgba(13,110,253,.95);
    border-radius: 50%;
    animation: orderspin .7s linear infinite;
    flex: 0 0 auto;
    margin-top: .2rem;
}

@keyframes orderspin { to { transform: rotate(360deg); } }

/* Column widths (no inline styles) */
.order-col-item { width: 100px; }
.order-col-price { width: 140px; }
.order-col-status { width: 220px; }
.order-col-updated { width: 170px; }

/* =========================================================
   Photographer Upsell Modal
   ========================================================= */

.photographer-upsell-modal {
    border-radius: 20px;
    overflow: hidden;
}

.photographer-upsell-body {
    padding: 2rem 1.75rem 1.25rem;
}

.photographer-upsell-subtitle {
    font-weight: 600;
    font-size: 1.2rem;
    margin-top: 0.75rem;
}

.photographer-upsell-text {
    font-size: 1rem;
    margin-top: 1rem;
}

.photographer-upsell-primary-btn {
    font-weight: 700;
    border-radius: 999px;
    padding: 0.8rem;
    border: none;
}

.photographer-upsell-footer {
    border-top: none;
    justify-content: center;
    padding-bottom: 1.5rem;
}

/* Kringle theme */
.photographer-upsell-modal.theme-kringles {
    background: #fff7d9;
    border: 3px solid #c72c2c;
}

.photographer-upsell-modal.theme-kringles .photographer-upsell-subtitle {
    color: #4a2b00;
}

.photographer-upsell-modal.theme-kringles .photographer-upsell-text {
    color: #3a2300;
}

.photographer-upsell-modal.theme-kringles .photographer-upsell-primary-btn {
    background: #c72c2c;
    color: #fff;
}

.photographer-upsell-modal.theme-kringles .photographer-upsell-primary-btn:hover {
    background: #e23b3b;
}

.photographer-upsell-modal.theme-kringles .photographer-upsell-skip-btn {
    background: transparent;
    color: #4a2b00;
    border: none;
    font-weight: 600;
}

/* Ashley theme */
.photographer-upsell-modal.theme-ashley {
    background: #f9f4ec;
    border: 3px solid #6b4b2a;
}

.photographer-upsell-modal.theme-ashley .photographer-upsell-subtitle {
    color: #4a3320;
}

.photographer-upsell-modal.theme-ashley .photographer-upsell-text {
    color: #5a4636;
}

.photographer-upsell-modal.theme-ashley .photographer-upsell-primary-btn {
    background: #6b4b2a;
    color: #fff;
}

.photographer-upsell-modal.theme-ashley .photographer-upsell-primary-btn:hover {
    background: #866040;
}

/* =========================================================
   Gallery filter bar — layout toggle buttons (#8)
   ========================================================= */

.btn-circle {
    width: 36px;
    height: 36px;
    padding: 0;
    border-radius: 50%;
    border: 2px solid var(--accent-orange);
    color: var(--accent-orange);
    background-color: transparent;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}

.btn-circle:hover {
    background-color: var(--accent-orange);
    color: var(--font-white);
}

/* Active = the CURRENT view density. Distinct from hover: filled + scaled up +
   a glow ring + lifted above its neighbors, so the selected one clearly reads
   as selected even while you hover the others. */
.btn-circle.active {
    background-color: var(--accent-orange);
    color: var(--font-white);
    border-color: var(--accent-orange);
    transform: scale(1.22);
    box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent-orange) 32%, transparent), 0 6px 16px color-mix(in srgb, var(--accent-orange) 40%, transparent);
    position: relative;
    z-index: 1;
}

.btn-circle:hover .icon,
.btn-circle.active .icon {
    color: var(--font-white);
}

.mode-dark .btn-circle {
    border-color: var(--accent-dark-orange);
    color: var(--accent-dark-orange);
}

.mode-dark .btn-circle:hover,
.mode-dark .btn-circle.active {
    background-color: var(--accent-dark-orange);
    color: var(--font-white);
    border-color: var(--accent-dark-orange);
}

.mode-dark .btn-circle.active {
    transform: scale(1.22);
    box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent-orange) 38%, transparent), 0 6px 16px rgba(0, 0, 0, 0.55);
    position: relative;
    z-index: 1;
}

.mode-dark .btn-circle:hover .icon,
.mode-dark .btn-circle.active .icon {
    color: var(--font-white);
}

/* =========================================================
   End gallery filter bar
   ========================================================= */

/* =========================================================
   Order downloads page — bg slow drift + text shadow
   ========================================================= */

@keyframes bgSlowDrift {
    0%   { background-position: center 35%; }
    50%  { background-position: center 65%; }
    100% { background-position: center 35%; }
}

.order-dl-bg {
    background-attachment: scroll !important;
    background-position: center center !important;
    animation: bgSlowDrift 30s ease-in-out infinite;
}

/* =========================================================
   End order downloads page
   ========================================================= */

.photographer-upsell-modal.theme-ashley .photographer-upsell-skip-btn {
    background: transparent;
    color: #4a3320;
    border: none;
    font-weight: 600;
}

/* =====================================================
   Checkout — polished card + summary design system
   Adapted from cheddar.findyourpictures.com patterns
   ===================================================== */

/* Section card — no hard border, soft radius + shadow */
.co-card {
    border: none !important;
    border-radius: 15px !important;
    background-color: var(--bg-color);
    box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08) !important;
    padding: 28px !important;
    margin-bottom: 20px;
}
.mode-dark .co-card {
    background-color: var(--bg-dark-color);
    box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3) !important;
}

/* Back button + heading row wrapper */
.co-step-heading-row {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 4px;
}
.co-step-heading-row .co-step-heading {
    margin-bottom: 0;
    flex: 1;
}
.co-back-btn {
    background: none;
    border: none;
    padding: 2px 6px;
    font-size: 0.8rem;
    color: var(--font-muted-color, #888);
    cursor: pointer;
    white-space: nowrap;
    flex-shrink: 0;
}
.co-back-btn:hover { color: var(--accent-orange); }
.mode-dark .co-back-btn { color: var(--font-dark-color); }
.mode-dark .co-back-btn:hover { color: var(--accent-light-orange); }

/* Section heading + subtext */
.co-step-heading {
    font-family: 'Poppins', sans-serif;
    font-size: 1rem;
    font-weight: 600;
    color: var(--heading-color);
    margin-bottom: 4px;
    display: flex;
    align-items: center;
    gap: 6px;
}
.mode-dark .co-step-heading { color: var(--heading-dark-color); }

/* Numbered step badge inside co-step-heading */
.co-step-num {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: var(--accent-orange);
    color: #fff;
    font-size: 0.72rem;
    font-weight: 800;
    font-family: 'Poppins', sans-serif;
    flex-shrink: 0;
    line-height: 1;
}
.mode-dark .co-step-num { background: var(--accent-dark-orange); }

.co-step-subtext {
    font-size: 0.78rem;
    color: var(--font-color);
    opacity: 0.45;
    margin-bottom: 20px;
}

/* ── PNP "Special Limited-Time Offer" step ──────────────────────────────────
   A festive, attention-drawing variant of a checkout step card. Uses the same
   theme tokens as .co-card so it reads correctly in light and dark themes and
   under the accessibility filters. Structure is Bootstrap's card; only color,
   accent, and spacing are added here. */
.co-offer-card {
    position: relative;
    overflow: hidden;
    border-top: 4px solid var(--accent-orange) !important;
}
.co-offer-body {
    text-align: center;
    padding-top: 6px;
}
.co-offer-logo {
    display: block;
    height: 42px;
    width: auto;
    max-width: 70%;
    margin: 0 auto 14px;
    object-fit: contain;
}
.co-offer-badge {
    display: inline-flex;
    align-items: center;
    font-family: 'Poppins', sans-serif;
    font-size: 0.68rem;
    font-weight: 800;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #fff;
    background: var(--accent-orange);
    border-radius: 999px;
    padding: 5px 12px;
    margin-bottom: 10px;
}
.mode-dark .co-offer-badge { background: var(--accent-dark-orange); }
.co-offer-icon {
    font-size: 2.4rem;
    color: var(--accent-orange);
    margin-bottom: 12px;
    display: flex;
    justify-content: center;
    gap: 10px;
}
.mode-dark .co-offer-icon { color: var(--accent-light-orange); }
/* Hero: image beside the description on md+, stacked (image on top) on mobile. */
.co-offer-hero {
    margin-bottom: 14px;
}
.co-offer-hero-media { text-align: center; }
.co-offer-image {
    display: block;
    width: 100%;
    max-width: 240px;   /* keeps it sane when stacked on a phone */
    height: auto;
    border-radius: 12px;
    margin: 0 auto;
}
.co-offer-hero-text .co-offer-blurb { max-width: none; margin-bottom: 0; }
@media (min-width: 768px) {
    .co-offer-image { max-width: 100%; }       /* fill the col-4 on desktop */
    .co-offer-hero-text { text-align: left; }
    .co-offer-hero-text .co-offer-blurb { margin-left: 0; margin-right: 0; }
}
.co-offer-headline {
    font-family: 'Poppins', sans-serif;
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--heading-color);
    margin-bottom: 8px;
}
.mode-dark .co-offer-headline { color: var(--heading-dark-color); }
.co-offer-blurb {
    font-size: 0.92rem;
    color: var(--font-color);
    max-width: 34rem;
    margin: 0 auto 12px;
    line-height: 1.5;
}
/* Lavender highlight pill (à la PNP "Includes 5 credits …"). Translucent so it
   reads over the card in both light and dark themes. */
.co-offer-highlight {
    display: inline-block;
    background: rgba(140, 100, 200, 0.14);
    color: var(--font-color);
    border-radius: 999px;
    padding: 9px 18px;
    font-size: 0.9rem;
    font-weight: 600;
    line-height: 1.35;
    max-width: 92%;
    margin: 0 auto 12px;
}
.co-offer-highlight .fa-star { color: #8c64c8; }
.mode-dark .co-offer-highlight { background: rgba(165, 135, 215, 0.22); }

.co-offer-price {
    margin-bottom: 18px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2px;
}
.co-offer-price-amount {
    font-family: 'Poppins', sans-serif;
    font-size: 1.75rem;
    font-weight: 800;
    color: var(--accent-orange);
    line-height: 1;
}
.mode-dark .co-offer-price-amount { color: var(--accent-light-orange); }
.co-offer-price-note {
    font-size: 0.74rem;
    color: var(--font-color);
    opacity: 0.6;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}
/* Price row: original "was" price struck through, beside the price charged. */
.co-offer-price-row {
    display: flex;
    align-items: baseline;
    justify-content: center;
    gap: 10px;
}
.co-offer-compare {
    font-family: 'Poppins', sans-serif;
    font-size: 1.1rem;
    font-weight: 600;
    color: inherit;   /* inherit the theme font colour so it shows in dark mode */
    opacity: 0.55;
    text-decoration: line-through;
    line-height: 1;
}

/* Decision row: the member-code unlock panel (left) beside the buy box
   (right), stacked on mobile. Text COLOURS INHERIT the active theme's font
   colour (var(--font-dark-color)/var(--font-light-color), set on .mode-dark /
   .mode-light) so every label stays legible in both themes; accents use the
   orange pair, and each surface gets an explicit dark background — the shared
   --card-bg / --font-muted-color tokens are light-only and vanish in dark. */
.co-offer-decide { margin-top: 4px; margin-bottom: 0; }

.co-offer-member {
    height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 4px;
    text-align: center;
    padding: 18px 16px;
    border-radius: 12px;
    background: rgba(0, 0, 0, 0.03);
    border: 1px solid rgba(0, 0, 0, 0.10);
}
.mode-dark .co-offer-member {
    background: rgba(255, 255, 255, 0.05);
    border-color: rgba(255, 255, 255, 0.14);
}
.co-offer-member-q    { font-weight: 700; font-size: 0.98rem; color: inherit; }
.co-offer-member-help { font-size: 0.84rem; color: inherit; opacity: 0.72; }
.co-offer-member-btn {
    margin-top: 8px;
    background: transparent;
    color: var(--accent-orange);
    border: 1px solid var(--accent-orange);
    border-radius: 999px;
    padding: 7px 16px;
    font-size: 0.88rem;
    font-weight: 700;
    cursor: pointer;
}
.co-offer-member-btn:hover { background: var(--accent-orange); color: #fff; }
.mode-dark .co-offer-member-btn { color: var(--accent-light-orange); border-color: var(--accent-light-orange); }
.mode-dark .co-offer-member-btn:hover { background: var(--accent-light-orange); color: var(--bg-dark-color); }

/* Buy box: struck compare price, price, and the Add button. */
.co-offer-buy {
    height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 12px;
}
.co-offer-buy .co-offer-price { margin-bottom: 0; }
.co-offer-buy .co-offer-add-btn { min-width: 240px; }

/* Skip: quiet full-width link under the decision row. */
.co-offer-skip-row { text-align: center; margin-top: 18px; }

/* Redemption-code modal. Light surface by default; explicit dark overrides
   below — the modal content and input must NOT ride --card-bg / --input-bg,
   which are light-only aliases and would paint a white box in dark mode. Inner
   text inherits so it follows the modal's own colour in either theme. */
.co-code-modal {
    background: #fff;
    color: var(--font-light-color);
    border: 1px solid rgba(0, 0, 0, 0.12);
    border-radius: 14px;
}
.co-code-modal .modal-title { color: inherit; font-weight: 700; }
.co-code-help {
    font-size: 0.9rem;
    color: inherit;
    opacity: 0.82;
    margin-bottom: 14px;
}
.co-code-label {
    font-size: 0.82rem;
    font-weight: 600;
    color: inherit;
    margin-bottom: 4px;
}
.co-code-input {
    background: #fff;
    color: var(--font-light-color);
    border: 1px solid rgba(0, 0, 0, 0.2);
}
.co-code-input:focus {
    border-color: var(--accent-orange);
    box-shadow: 0 0 0 0.2rem rgba(232, 122, 46, 0.25);
}
.co-code-error {
    background: rgba(200, 40, 40, 0.1);
    color: var(--font-red, #c62828);
    border: 1px solid rgba(200, 40, 40, 0.3);
    border-radius: 8px;
    padding: 8px 12px;
    font-size: 0.85rem;
    font-weight: 600;
    margin-bottom: 12px;
}
/* Dark mode: dark modal + dark input, both legible. */
.mode-dark .co-code-modal {
    background: var(--bg-dark-color);
    color: var(--font-dark-color);
    border-color: rgba(255, 255, 255, 0.14);
}
.mode-dark .co-code-input {
    background: rgba(255, 255, 255, 0.06);
    color: var(--font-dark-color);
    border-color: rgba(255, 255, 255, 0.22);
}
.mode-dark .co-code-input::placeholder { color: rgba(255, 255, 255, 0.45); }
.mode-dark .co-code-error { color: #ff8a80; }
/* Bootstrap's close "X" is a dark SVG — invert it so it shows on the dark modal. */
.mode-dark .co-code-modal .btn-close { filter: invert(1) grayscale(100%) brightness(200%); }
.co-offer-actions {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
}
.co-offer-actions .btn-lg { min-width: 260px; }
.co-offer-skip-btn {
    color: inherit;      /* --font-muted-color is light-only; inherit stays visible in dark */
    opacity: 0.6;
    text-decoration: underline;
    font-size: 0.85rem;
}
.co-offer-skip-btn:hover { color: var(--accent-orange); opacity: 1; }
.mode-dark .co-offer-skip-btn:hover { color: var(--accent-light-orange); }
.co-offer-added-msg {
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--font-green);
    margin-bottom: 14px;
}

/* Muted ALL-CAPS section label (e.g. "ITEMS") */
.co-section-label {
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--font-color);
    opacity: 0.38;
    margin-bottom: 10px;
}

/* Summary line: label left, amount right */
.co-summary-line {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 6px;
}
.co-summary-line .lbl {
    font-size: 0.83rem;
    color: var(--font-color);
    flex: 1;
    line-height: 1.4;
}
.co-summary-line .lbl.muted { opacity: 0.55; }
.co-summary-line .lbl small  { font-size: 0.72rem; opacity: 0.6; }
.co-summary-line .amt {
    font-size: 0.83rem;
    font-weight: 600;
    color: var(--font-color);
    white-space: nowrap;
    padding-left: 12px;
}
.co-summary-line.discount .lbl,
.co-summary-line.discount .amt { color: var(--accent-orange); }

/* Total row */
.co-summary-line.co-total .lbl {
    font-size: 0.95rem;
    font-weight: 700;
    color: var(--heading-color);
}
.co-summary-line.co-total .amt {
    font-size: 1.3rem;
    font-weight: 800;
    color: var(--accent-orange);
    font-family: 'Poppins', sans-serif;
}
.mode-dark .co-summary-line .lbl { color: var(--font-dark-color); }
.mode-dark .co-summary-line .amt { color: var(--font-dark-color); }
.mode-dark .co-summary-line.co-total .lbl { color: var(--heading-dark-color); }

/* Centered narrow divider */
.co-divider {
    border: none;
    border-top: 1.5px solid var(--border-muted);
    margin: 14px auto;
    width: 55%;
}
.mode-dark .co-divider { border-color: rgba(255, 255, 255, 0.1); }

/* Security badges (very muted, below the total) */
.co-security {
    border-top: 1px solid var(--border-muted);
    padding-top: 12px;
    margin-top: 16px;
    display: flex;
    gap: 16px;
    justify-content: center;
    font-size: 0.7rem;
    color: var(--font-color);
    opacity: 0.35;
    flex-wrap: wrap;
}

/* ─── Donation card (checkout step 2) ────────────────────────────── */
.don-img {
    width: 80px;
    height: 80px;
    object-fit: contain;
}

.don-btns-row {
    display: flex;
    gap: 8px;
    margin-bottom: 8px;
}

.don-btn {
    flex: 1;
    padding: 10px 6px;
    font-weight: 700;
    font-size: 0.88rem;
    border: 2px solid var(--accent-orange);
    color: var(--accent-orange);
    background: transparent;
    border-radius: 50px;
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
    line-height: 1;
}
.don-btn:hover,
.don-btn.don-btn-selected {
    background: var(--accent-orange);
    color: #fff;
}

.don-btn-roundup {
    display: block;
    width: 100%;
    padding: 10px 16px;
    font-weight: 700;
    font-size: 0.85rem;
    border: 2px solid var(--prepaid-font-color);
    color: var(--prepaid-font-color);
    background: transparent;
    border-radius: 50px;
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
    text-align: center;
}
.don-btn-roundup:hover,
.don-btn-roundup.don-btn-selected {
    background: var(--prepaid-font-color);
    color: #fff;
}

.don-thankyou {
    background: var(--prepaid-background-color);
    color: var(--prepaid-font-color);
    border-radius: 10px;
    padding: 12px 16px;
    text-align: center;
    font-weight: 600;
    font-size: 0.9rem;
    margin-top: 12px;
}

.don-skip {
    display: block;
    text-align: center;
    font-size: 0.78rem;
    color: var(--font-color);
    opacity: 0.45;
    background: none;
    border: none;
    cursor: pointer;
    margin-top: 14px;
    padding: 0;
    width: 100%;
    transition: opacity 0.15s;
}
.don-skip:hover { opacity: 0.75; }

/* dark mode */
.mode-dark .don-thankyou {
    background: var(--prepaid-background-dark-color, rgba(44,182,167,0.15));
    color: var(--prepaid-font-dark-color, var(--prepaid-font-color));
}

/* Prepaid explanation modal — star + number badge */
.contains-prepaid-feedback {
    display: flex;
    justify-content: center;
    align-items: center;
    position: relative;
}
.contains-prepaid-star {
    color: var(--accent-orange);
}
.contains-prepaid-total {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    color: rgba(255, 255, 255, 0.95);
    font-size: 0.9rem;
    font-weight: 800;
    line-height: 1;
    pointer-events: none;
}

/* ===========================================================================
   Phase 2 — Customer-service FAQ layouts + visual support articles
   =========================================================================== */

/* --- FAQ category grid (visual tiles) --- */
.faq-cat-tiles { width: 100%; }
.faq-cat-tile {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 18px 12px;
    border: 1px solid var(--overlay-border, rgba(0,0,0,0.12));
    border-radius: 14px;
    background: var(--card-bg, #fff);
    color: var(--font-color, #222);
    text-align: center;
    position: relative;
    transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.faq-cat-tile:hover,
.faq-cat-tile.active {
    transform: translateY(-2px);
    border-color: var(--accent-orange);
    box-shadow: 0 8px 20px rgba(0,0,0,0.12);
}
.faq-cat-visual {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 64px;
    height: 64px;
    border-radius: 50%;
    background: var(--accent-light-orange, rgba(238,81,58,0.12));
    overflow: hidden;
}
.faq-cat-visual img { width: 100%; height: 100%; object-fit: cover; }
.faq-cat-visual i { font-size: 1.6rem; color: var(--accent-orange); }
.faq-cat-name { font-weight: 700; font-size: 1rem; }
.faq-cat-count {
    position: absolute;
    top: 8px;
    right: 10px;
    font-size: 0.75rem;
    font-weight: 700;
    color: var(--font-muted, #888);
}
.faq-cat-panel-title,
.faq-group-title { font-weight: 800; margin: 0 0 12px; }

/* --- Searchable FAQ filter --- */
.faq-searchable .form-control { max-width: 480px; }

/* --- Visual support article cards (support landing) --- */
.support-articles-title { font-weight: 800; margin-bottom: 16px; }
.support-article-card {
    display: flex;
    flex-direction: column;
    height: 100%;
    border: 1px solid var(--overlay-border, rgba(0,0,0,0.12));
    border-radius: 14px;
    overflow: hidden;
    background: var(--card-bg, #fff);
    color: var(--font-color, #222);
    text-decoration: none;
    transition: transform .15s ease, box-shadow .15s ease;
}
.support-article-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 20px rgba(0,0,0,0.12);
}
.support-article-thumb {
    display: block;
    width: 100%;
    height: 150px;
    background-size: cover;
    background-position: center;
}
.support-article-body { display: block; padding: 14px 16px; }
.support-article-cat {
    display: inline-block;
    font-size: 0.72rem;
    font-weight: 800;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--accent-orange);
    margin-bottom: 4px;
}
.support-article-card-title { display: block; font-weight: 800; font-size: 1.05rem; margin-bottom: 6px; }
.support-article-excerpt { display: block; color: var(--font-muted, #777); font-size: 0.92rem; margin-bottom: 8px; }
.support-article-readmore { display: inline-block; font-weight: 700; color: var(--accent-orange); }

/* --- Article detail page --- */
.support-article-page .card-body { padding: 28px; }
.support-article-back { display: inline-block; margin-bottom: 14px; font-weight: 700; text-decoration: none; color: var(--accent-orange); }
.support-article-hero { width: 100%; max-height: 360px; object-fit: cover; border-radius: 12px; margin-bottom: 16px; }
.support-article-h1 { font-weight: 800; margin-bottom: 16px; }
.support-article-content { font-size: 1.02rem; line-height: 1.7; }
.support-article-content img { max-width: 100%; height: auto; border-radius: 8px; }
.support-article-content h2 { font-size: 1.4rem; font-weight: 800; margin-top: 1.4em; }
.support-article-content h3 { font-size: 1.18rem; font-weight: 700; margin-top: 1.2em; }
.support-article-related { list-style: none; padding-left: 0; }
.support-article-related li { margin-bottom: 6px; }

/* ===========================================================================
   Phase 4 — Print/green-screen customizer (Konva editor)
   =========================================================================== */
.print-editor-stage {
    width: 100%;
    background: #2a2a2a repeating-conic-gradient(#3a3a3a 0% 25%, #2f2f2f 0% 50%) 50% / 24px 24px;
    border: 1px solid var(--overlay-border, rgba(0,0,0,0.2));
    border-radius: 10px;
    overflow: hidden;
    touch-action: none; /* let Konva handle drag/pinch */
}
.print-editor-controls h6 { margin-bottom: 8px; }
#bg-choices .bg-choice {
    width: 56px; height: 56px;
    padding: 0;
    border: 2px solid var(--overlay-border, rgba(0,0,0,0.2));
    border-radius: 8px;
    overflow: hidden;
    background: #fff;
    cursor: pointer;
}
#bg-choices .bg-choice img { width: 100%; height: 100%; object-fit: cover; display: block; }
#bg-choices .bg-choice.selected { border-color: var(--accent-orange); box-shadow: 0 0 0 2px var(--accent-light-orange, rgba(238,81,58,0.3)); }

/* ===== ProofGuard — capture-friction for unpurchased proofs ===== */
/* iOS long-press "Save Image" sheet — suppressed on unpurchased proofs only. */
.pg-callout-off .gallery-item[data-status="not-purchased"] .product-image {
    -webkit-touch-callout: none;
    -webkit-user-drag: none;
    user-select: none;
}

/* Blur the unpurchased proofs while a capture signal is active. */
body.pg-active .gallery-item[data-status="not-purchased"] .product-image {
    filter: blur(22px) saturate(0.6);
    transition: filter 0.08s linear;
}

/* Full-page shield. Light mode = whitish scrim; dark mode = blackish scrim. */
#pg-shield {
    position: fixed;
    inset: 0;
    z-index: 20000;
    display: flex;
    justify-content: center;
    align-items: center;
    text-align: center;
    padding: 24px;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity 0.12s linear, visibility 0s linear 0.12s;
    /* light mode default */
    background-color: rgba(248, 249, 250, 0.94);
    color: #1d2330;
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
}
body.pg-active #pg-shield {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transition: opacity 0.12s linear;
}
.pg-shield-inner { max-width: 420px; }
.pg-shield-icon { font-size: 2.4rem; margin-bottom: 12px; color: var(--accent-orange, #ee513a); }
.pg-shield-title {
    font-family: "Poppins", sans-serif;
    font-weight: 800;
    font-size: 1.6rem;
    letter-spacing: -0.01em;
    margin-bottom: 8px;
}
.pg-shield-sub {
    font-family: "Manrope", sans-serif;
    font-size: 1rem;
    line-height: 1.5;
    opacity: 0.85;
}

/* Dark mode: blackish scrim, light text. */
.mode-dark #pg-shield {
    background-color: rgba(10, 12, 18, 0.94);
    color: #eef0f5;
}

/* ===== In-cart "Adjust" affordance (editor-eligible items only) ===== */
.cart-item-adjust {
    margin-top: 6px;
    padding: 2px 8px;
    font-size: 0.78rem;
    font-weight: 600;
    border: 1px solid var(--accent-orange, #ee513a);
    border-radius: 14px;
    background: transparent;
    color: var(--accent-orange, #ee513a);
    cursor: pointer;
    transition: background-color 0.12s ease, color 0.12s ease;
}
.cart-item-adjust:hover,
.cart-item-adjust:focus {
    background: var(--accent-orange, #ee513a);
    color: #fff;
}

/* ===== Checkout line-item preview thumbnail + re-adjust link ===== */
.co-item-lbl { display: flex; align-items: center; gap: 10px; }
.co-item-thumb { width: 44px; height: 44px; object-fit: cover; border-radius: 6px; flex: 0 0 auto; }
.co-item-text { display: inline-block; }
.co-item-qty { margin-left: 6px; padding: 1px 7px; border-radius: 999px; font-size: 0.78rem; font-weight: 700; background: color-mix(in srgb, var(--accent-orange) 16%, transparent); color: var(--accent-orange, #ee513a); white-space: nowrap; }
.co-item-adjust { margin-left: 8px; font-size: 0.8rem; font-weight: 600; color: var(--accent-orange, #ee513a); text-decoration: none; }
.co-item-adjust:hover, .co-item-adjust:focus { text-decoration: underline; }

/* ===== Checkout fulfillment chip ("how you'll get this") =====
   Rendered by co_fulfillment_badge(). The icon is decorative — the mode is
   always carried by the text beside it, never by color or icon alone (§18e). */
.co-fulfill {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    margin-left: 8px;
    padding: 1px 9px;
    border-radius: 999px;
    font-size: 0.76rem;
    font-weight: 600;
    line-height: 1.6;
    white-space: nowrap;
    background: color-mix(in srgb, currentColor 10%, transparent);
    border: 1px solid color-mix(in srgb, currentColor 22%, transparent);
}
.co-fulfill i { font-size: 0.72rem; }
.co-fulfill-digital { color: var(--accent-dark-green, #2e7d5b); }
.co-fulfill-pickup  { color: var(--accent-green, #4caf50); }
.co-fulfill-ship    { color: var(--accent-orange, #ee513a); }

.co-fulfill-switch { padding-right: 4px; }
.co-fulfill-select {
    border: 0;
    background: transparent;
    color: inherit;
    font: inherit;
    font-weight: 600;
    padding: 0 2px;
    cursor: pointer;
    max-width: 14rem;
}
.co-fulfill-select:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 2px;
    border-radius: 4px;
}
.co-fulfill-select:disabled { opacity: 0.6; cursor: progress; }

.co-fulfill-status {
    margin: 0 0 8px;
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--font-color);
}
.co-fulfill-status:empty { display: none; }

/* Mixed-cart notice on the contact step. */
.co-fulfill-notice {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    margin-bottom: 16px;
    padding: 10px 14px;
    border-radius: 8px;
    font-size: 0.88rem;
    line-height: 1.45;
    color: var(--font-color);
    background: color-mix(in srgb, var(--accent-orange) 10%, transparent);
    border: 1px solid color-mix(in srgb, var(--accent-orange) 30%, transparent);
}
.co-fulfill-notice i { margin-top: 3px; color: var(--accent-orange, #ee513a); }
.mode-dark .co-fulfill-notice,
.mode-dark .co-fulfill-status { color: var(--font-dark-color); }

/* ===== Checkout inline field validation messages =====
   Replaces the old /assets/img/error.png|ok.png status images with clean,
   themed inline text + a Font Awesome icon. */
.formmessage { display: block; margin-top: 4px; font-size: 0.82rem; line-height: 1.3; color: #d6432f; font-weight: 600; }
.mode-dark .formmessage { color: #ff7a66; }
.formmessage:empty { display: none; margin: 0; }
.co-msg-icon { margin-right: 4px; color: #d6432f; }
.mode-dark .co-msg-icon { color: #ff7a66; }
.co-msg-icon-ok { margin-right: 4px; color: var(--prepaid-green, #2cb6a7); }

/* ===== Gallery GRID hover loupe (dwell-gated; lens follows cursor) ===== */
.gallery-loupe-lens {
    position: absolute;
    top: 0; left: 0;
    width: 200px; height: 200px;   /* keep in sync with LENS_DIAM in gallery-loupe.js */
    border-radius: 50%;
    overflow: hidden;              /* clip the inner <img> to the circle */
    pointer-events: none;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.1s ease;
    z-index: 9000;
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.9),
                0 0 0 6px var(--accent-light-orange, rgba(238, 81, 58, 0.35)),
                0 12px 30px rgba(0, 0, 0, 0.5);
    will-change: transform;        /* moved via transform → GPU layer, no per-frame repaint */
}
.gallery-loupe-lens.show { opacity: 1; visibility: visible; }
.gallery-loupe-img {
    position: absolute;
    top: 0; left: 0;
    max-width: none;               /* allow scaling beyond the lens box */
    pointer-events: none;
    user-select: none;
    -webkit-user-drag: none;
    will-change: transform;
}
.gallery-loupe-clean {             /* clean layer fades in over the watermarked base */
    opacity: 0;
    transition: opacity 0.15s ease;
}
.gallery-loupe-hint {
    position: absolute;
    top: 0; left: 0;
    z-index: 9001;
    pointer-events: none;
    background: rgba(17, 19, 26, 0.92);
    color: #fff;
    font-family: "Manrope", sans-serif;
    font-size: 0.72rem;
    font-weight: 600;
    padding: 3px 9px;
    border-radius: 14px;
    white-space: nowrap;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.12s ease;
}
.gallery-loupe-hint.show { opacity: 1; visibility: visible; }
.gallery-loupe-hint i { margin-right: 4px; }

/* Phase 4a-2: product variation (size/material) selector in the product panel. */
.variant-select { max-width: 260px; }

/* Phase 5: multi-photo card builder. */
.card-builder-stage { width: 100%; background:
    repeating-conic-gradient(#f4f6f8 0% 25%, #ffffff 0% 50%) 50% / 22px 22px;
    border: 1px solid var(--photo-border-color, #ddd); border-radius: 8px; min-height: 240px; }
.card-builder-thumbs { display: grid; grid-template-columns: repeat(auto-fill, minmax(64px, 1fr));
    gap: 6px; max-height: 340px; overflow-y: auto; padding: 4px; }
.card-thumb { padding: 0; border: 2px solid transparent; border-radius: 6px; background: none; cursor: pointer; line-height: 0; }
.card-thumb img { width: 100%; height: 64px; object-fit: cover; border-radius: 4px; }
.card-thumb.selected { border-color: var(--accent-orange); }
.card-thumb:focus-visible { outline: 2px solid var(--accent-orange); outline-offset: 2px; }

/* ===== Sidebar "Display" settings cluster (theme + show labels) ===== */
/* Plain usability framing (no "Accessibility" header) so older / less tech-comfy
   visitors find these. Injected by sidebar-settings.js into the offcanvas body. */
/* Flex-column the offcanvas body ONLY when the cluster is injected (JS adds
   .sb-has-display) so other pages' sidebars keep their normal flow. The body
   already flex-grows to full height, so margin-top:auto floats the cluster to
   the bottom of the viewport. */
.offcanvas-body.sb-has-display { display: flex; flex-direction: column; }
.sidebar-display-settings {
    margin-top: auto;          /* float to the bottom of the viewport — no hr */
    padding: 8px 0 4px;
    max-width: 260px;
    opacity: 0.6;              /* muted — a quiet footer setting, not a CTA */
    transition: opacity 0.15s ease;
}
.sidebar-display-settings:hover,
.sidebar-display-settings:focus-within { opacity: 1; }   /* clarify on intent */
.sidebar-display-title {
    font-family: "Poppins", sans-serif;
    font-size: 0.58rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    opacity: 0.7;
    margin-bottom: 5px;
}
.sidebar-display-settings .sidebar-display-row { margin-bottom: 3px; min-height: auto; }
.sidebar-display-settings .form-check-label { font-size: 0.78rem; cursor: pointer; }
.sidebar-display-settings .form-check-input { cursor: pointer; transform: scale(0.85); transform-origin: left center; }
.sidebar-display-settings .form-check-input:checked { background-color: var(--accent-orange, #ee513a); border-color: var(--accent-orange, #ee513a); }
/* Theme-aware text — mirror .sidebar-link so it's readable in light AND dark. */
.sidebar-display-title,
.sidebar-display-settings .form-check-label { color: var(--font-light-color); }
.mode-dark .sidebar-display-title,
.mode-dark .sidebar-display-settings .form-check-label { color: var(--font-dark-color); }

/* =====================================================================
   Desktop (lg+) products companion rail  (#productsRail / products-sidebar.js)
   PROTOTYPE — a DEDICATED new rail (NOT the hamburger #sidebar). Top = the
   "entire gallery" feature ({image}/name/(All) + optional label) like the
   active-product card, in linear form. Below = a true accordion of REAL
   product categories only (digital is conditional, excluded); each opens to
   LINEAR product rows ({thumb} name · desc-muted · price). It builds its own
   markup from product data — it does NOT relocate the page's nodes.
   The rail is aligned to the top (beside the secondary nav) and pushes ONLY
   #main (where the secondary nav + gallery live) — never the hero above it.
   Reveal + push share --rail-p (0..1), NO transition, so they move as one
   continuous motion with scroll. md and below never see it.
   ===================================================================== */
.products-rail { display: none; }

@media (min-width: 992px) {

    body.pt-rail-active .products-rail {
        display: block;
        position: fixed;
        left: 0;
        top: 0;
        width: 320px;
        max-width: 320px;
        height: 100vh;
        height: 100dvh;
        transform: translateX(calc((var(--rail-p, 0) - 1) * 320px));
        opacity: var(--rail-p, 0);
        background: var(--bg-light-secondary, #f1f3f5);
        box-shadow: 2px 0 18px rgba(0, 0, 0, 0.06);
        overflow-y: auto;
        z-index: 1030;
        pointer-events: var(--rail-pe, none);
    }
    body.pt-rail-active.mode-dark .products-rail {
        background: var(--bg-dark-secondary, #20232a);
        box-shadow: 2px 0 18px rgba(0, 0, 0, 0.40);
    }
    /* Top padding clears the sticky secondary nav so the rail content starts
       in line with the gallery, not under the nav. --rail-top = nav height. */
    /* No nav-height offset: the secondary nav is pushed RIGHT (it lives in #main),
       so nothing sits above the rail's left column to clear. Start content near top. */
    .products-rail-body { padding: 0.9rem 0.7rem 2rem; }

    /* Active-product card framed as a subtle outlined "card" with a Material-style
       notched label on the top-left edge. Border + label use the theme FONT color. */
    .rail-top {
        position: relative;
        margin-top: 0.6rem;
        padding: 0.95rem 0.6rem 0.7rem;
        border: 1px solid color-mix(in srgb, var(--font-light-color) 22%, transparent);
        border-radius: 0.65rem;
    }
    .mode-dark .rail-top { border-color: color-mix(in srgb, var(--font-dark-color) 22%, transparent); }
    .rail-top::before {
        content: "ACTIVE NOW \00B7 SELECT YOUR IMAGES";
        position: absolute;
        top: 0;
        left: 12px;
        transform: translateY(-50%);
        padding: 0 6px;
        background: var(--bg-light-secondary, #f1f3f5);
        color: var(--font-light-color);
        font-size: 0.6rem;
        font-weight: 700;
        letter-spacing: 0.06em;
        white-space: nowrap;
    }
    .mode-dark .rail-top::before { background: var(--bg-dark-secondary, #20232a); color: var(--font-dark-color); }

    /* (Body product-card visibility moved OUT of this 992 block: the cards are now
       hidden on XL only and SHOWN-but-stacked on lg — see the xl/lg media queries
       appended at the end of the file.) */

    /* Push ONLY #main (it contains the secondary nav + gallery); the hero
       (.location-container) above it is left alone. Scrubbed, NO transition. */
    body.pt-rail-active #main { margin-left: calc(var(--rail-p, 0) * 320px); }
    /* Bottom frame stays FULL WIDTH always and sits ON TOP of the rail
       (the rail slides in underneath it — never offset/shrunk). */
    body.pt-rail-active #prepaid-footer { z-index: 1040; }

    /* Gallery nudge is consolidated INTO the rail's Entire Gallery card on lg —
       hide the floating widget so they don't both fight the same corner. */
    body.pt-rail-active #galleryNudge { display: none !important; }

    /* The SECONDARY-nav hamburger opens the #sidebar from the LEFT (same side as
       the rail) and would slide over it — hide ONLY that one while the rail is
       active. The location-background (top nav) hamburger stays, so the #sidebar
       menu is still reachable at the top of the page. */
    body.pt-rail-active #secondary-menu .menu-button { display: none !important; }

    /* The accessibility button is scrubbed to the bottom-RIGHT by products-sidebar.js
       (out of the rail's way); open its menu on the right to match. */
    body.pt-rail-active .accessibility-menu { left: auto; right: 16px; }

    /* Bottom bar STAYS — but its product buttons/grid no longer live there on lg. */
    body.pt-rail-active #prepaid-footer #products { display: none !important; }

    /* ---- TOP: entire-gallery feature (active-product "vibe", linear) ---- */
    .rail-feature {
        display: block;
        width: 100%;
        text-align: center;
        background: transparent;
        border: 0;
        border-radius: 0.7rem;
        padding: 0.5rem 0.7rem 0.7rem;
        cursor: pointer;
        color: inherit;
        position: relative;
    }
    .rail-feature:hover { background: color-mix(in srgb, var(--accent-orange) 5%, transparent); }
    .rail-feature-img { width: 96px; height: 96px; object-fit: contain; margin: 0 auto 0.4rem; display: block; }
    .rail-feature-name { font-weight: 700; font-size: 1rem; line-height: 1.2; }
    .rail-feature-price { font-size: 0.85rem; opacity: 0.85; margin-top: 0.1rem; }
    .rail-feature-label {
        display: inline-block;
        margin-bottom: 0.4rem;
        padding: 0.12rem 0.55rem;
        font-size: 0.68rem;
        font-weight: 800;
        letter-spacing: 0.04em;
        text-transform: uppercase;
        color: #fff;
        background: var(--accent-orange, #ee513a);
        border-radius: 1rem;
    }
    .rail-feature-all {
        margin-top: 0.5rem;
        display: inline-block;
        font-size: 0.8rem;
        font-weight: 700;
        color: var(--accent-orange, #ee513a);
        background: transparent;
        border: 0;
        cursor: pointer;
        text-decoration: underline;
    }
    /* digital state: strike + sale price, Add to Cart button */
    .rail-feature-prices { margin-top: 0.15rem; }
    .rail-feature-nudge {
        margin: 0.3rem 0 0.1rem;
        font-size: 0.92rem;
        font-weight: 700;
        line-height: 1.25;
        color: var(--accent-orange, #ee513a);
    }
    .rail-feat-orig { text-decoration: line-through; opacity: 0.6; font-size: 0.85rem; margin-right: 0.4rem; }
    .rail-feat-sale { font-weight: 800; font-size: 1.05rem; color: var(--accent-orange, #ee513a); }
    .rail-feat-cart {
        margin-top: 0.6rem;
        display: inline-block;
        width: 100%;
        padding: 0.45rem 0.7rem;
        font-size: 0.85rem;
        font-weight: 700;
        color: #fff;
        background: var(--accent-orange, #ee513a);
        border: 0;
        border-radius: 0.5rem;
        cursor: pointer;
    }
    .rail-feat-cart:hover { filter: brightness(0.94); }

    /* "Additionals" / "Want 1 of each?" line under the top card */
    .rail-extra {
        display: flex;
        align-items: center;
        gap: 0.6rem;
        margin-top: 0.8rem;
        padding-top: 0.7rem;
        border-top: 1px solid var(--overlay-border, rgba(0, 0, 0, 0.12));
    }
    .rail-extra-main { flex-grow: 1; min-width: 0; text-align: left; }
    .rail-extra-name { font-size: 0.85rem; font-weight: 600; }
    .rail-extra-desc { font-size: 0.72rem; opacity: 0.65; }
    .rail-extra-price { font-size: 0.9rem; font-weight: 700; white-space: nowrap; }
    .rail-addall { margin-top: 0.55rem; }

    /* product state: icon, price (first/additional aware), name, desc, hint */
    .rail-topprod { text-align: center; }
    .rail-topprod-img { width: 84px; height: 84px; object-fit: contain; margin: 0 auto 0.45rem; display: block; }
    .rail-topprod-price { margin-bottom: 0.1rem; }
    .rail-topprod-amt { font-size: 1.05rem; font-weight: 800; color: var(--accent-orange, #ee513a); }
    .rail-topprod-qual { font-size: 0.72rem; opacity: 0.7; }
    .rail-topprod-name { font-weight: 700; font-size: 0.95rem; line-height: 1.2; }
    .rail-topprod-desc { font-size: 0.76rem; opacity: 0.65; line-height: 1.25; margin-top: 0.15rem; }
    .rail-topprod-hint { font-size: 0.76rem; opacity: 0.8; margin-top: 0.4rem; font-style: italic; }

    .rail-divider {
        height: 1px;
        background: var(--overlay-border, rgba(0, 0, 0, 0.12));
        margin: 0.9rem 0.15rem;
    }

    /* Reduce-motion: skip the scrubbed slide — snap the rail in when the nav
       locks (pt-rail-locked), and snap the page push at the same moment. No
       movement tied to scroll. */
    body.a11y-reduce-motion.pt-rail-active .products-rail {
        transition: none !important;
        transform: translateX(-100%);
        opacity: 0;
    }
    body.a11y-reduce-motion.pt-rail-active.pt-rail-locked .products-rail {
        transform: none;
        opacity: 1;
        pointer-events: auto;
    }
    body.a11y-reduce-motion.pt-rail-active #main { margin-left: 0; }
    body.a11y-reduce-motion.pt-rail-active.pt-rail-locked #main { margin-left: 320px; }

    /* ---- single-open category accordion (real categories only) ---- */
    .rail-accordion { display: flex; flex-direction: column; gap: 0.4rem; }
    .rail-cat-btn {
        width: 100%;
        display: flex;
        align-items: center;
        justify-content: space-between;
        background: transparent;
        /* secondary/accent border (theme-aware) — NOT the dark --overlay-border
           (rgba(70,68,80,1)), which read as black and clashed on themed accounts. */
        border: 1px solid var(--accent-orange, #ee513a);
        border-radius: 0.55rem;
        padding: 0.6rem 0.75rem;
        font-weight: 600;
        text-align: left;
        cursor: pointer;
        color: var(--font-light-color);
    }
    .mode-dark .rail-cat-btn { color: var(--font-dark-color); }
    /* ACTIVE category = the group your current pick lives in. Same visual
       language as the gallery's active view button: FILLED accent + glow ring.
       Exactly one is active at a time. */
    .rail-cat.rail-cat-active > .rail-cat-btn {
        background: var(--accent-orange, #ee513a);
        border-color: var(--accent-orange, #ee513a);
        color: #fff;
        font-weight: 800;
        box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-orange) 25%, transparent), 0 4px 14px color-mix(in srgb, var(--accent-orange) 35%, transparent);
    }
    .rail-cat.rail-cat-active > .rail-cat-btn .rail-cat-chev { opacity: 1; }
    /* OPEN-for-browsing but NOT the active selection = light tint + accent border;
       clearly secondary to the filled active one. */
    .rail-cat.rail-cat-open:not(.rail-cat-active) > .rail-cat-btn {
        background: color-mix(in srgb, var(--accent-orange) 8%, transparent);
        border-color: var(--accent-orange, #ee513a);
        font-weight: 700;
    }
    /* digital is a flat button — no collapse, no chevron */
    .rail-cat-flat .rail-cat-panel { display: none !important; }
    .rail-cat-chev { transition: transform 0.2s ease; opacity: 0.55; margin-left: 0.5rem; }
    .rail-cat.rail-cat-open .rail-cat-chev { transform: rotate(90deg); }
    .rail-cat-panel { display: none; padding: 0.3rem 0.1rem 0.2rem; }
    .rail-cat.rail-cat-open .rail-cat-panel { display: block; }

    /* ---- LINEAR product rows inside an open category ---- */
    .rail-prod {
        display: flex;
        align-items: center;
        gap: 0.6rem;
        width: 100%;
        padding: 0.5rem 0.35rem;
        border: 0;
        border-bottom: 1px solid var(--overlay-border, rgba(0, 0, 0, 0.10));
        background: transparent;
        cursor: pointer;
        color: inherit;
        text-align: left;
    }
    .rail-prod:last-child { border-bottom: 0; }
    .rail-prod:hover { background: color-mix(in srgb, var(--accent-orange) 6%, transparent); }
    /* SELECTED product row = strong tint + accent left bar + bold accent name,
       clearly past the faint hover tint. */
    .rail-prod.rail-prod-selected {
        background: color-mix(in srgb, var(--accent-orange) 13%, transparent);
        box-shadow: inset 4px 0 0 var(--accent-orange, #ee513a);
    }
    .rail-prod.rail-prod-selected .rail-prod-name { color: var(--accent-orange, #ee513a); font-weight: 800; }
    .rail-prod-img {
        width: 46px; height: 46px;
        object-fit: contain;
        flex-shrink: 0;
        border-radius: 0.35rem;
        background: rgba(0, 0, 0, 0.04);
    }
    .rail-prod-main { flex-grow: 1; min-width: 0; }
    .rail-prod-name { font-size: 0.85rem; font-weight: 600; line-height: 1.15; }
    .rail-prod-desc {
        font-size: 0.72rem;
        opacity: 0.65;
        line-height: 1.15;
        margin-top: 0.1rem;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }
    .rail-prod-price { font-size: 0.85rem; font-weight: 700; white-space: nowrap; flex-shrink: 0; }
}


/* ============================================================
   GLASSMORPHISM PREVIEW LAYER  (opt-in, gated on body.pt-glass)
   ------------------------------------------------------------
   A restrained frosted-glass treatment on the floating surfaces
   where it reads best (sticky nav, mini-cart, sidebar, product
   cards, dialog modals). INERT by default — nothing gives a real
   visitor the `pt-glass` class. Turn it on per-browser with
   ?glass=1 (off with ?glass=0) via glass-preview.js.

   - Theme-aware: the --glass-* vars flip for .mode-dark.
   - Self-disables under high-contrast a11y mode (:not(.a11y-contrast))
     and the OS "reduce transparency" setting.
   - Degrades to the existing solid surfaces where backdrop-filter
     is unsupported (the @supports guard).

   To remove entirely: delete this block, the glass-preview.js
   <script> include in album_select.php, and the file itself.
   ============================================================ */

body.pt-glass {
    /* Glass = TRANSPARENCY of the active theme's OWN surface + blur. It must not
       impose a color — the old code painted a near-solid WHITE panel, which wrecked
       dark-brand themes (e.g. theme-rest / Benihana) in light mode. color-mix takes
       the theme's surface var and just adds transparency, so a dark theme frosts
       dark, a light theme frosts light — the tint always comes from the theme, never
       from glass. The rgba line is a fallback FIRST for browsers without color-mix.
       Tune the % to taste: LOWER = glassier/more see-through, higher = more solid.
       `-strong` (cart / modals / dialogs) stays more opaque for text legibility. */
    --glass-bg: rgba(255, 255, 255, 0.66);
    --glass-bg: color-mix(in srgb, var(--bg-light-secondary) 66%, transparent);
    --glass-bg-strong: rgba(255, 255, 255, 0.84);
    --glass-bg-strong: color-mix(in srgb, var(--bg-light-secondary) 84%, transparent);
    --glass-border: rgba(255, 255, 255, 0.5);
    --glass-border: color-mix(in srgb, var(--font-color) 20%, transparent);
    --glass-blur: 18px;
    --glass-shadow: 0 8px 32px rgba(31, 38, 60, 0.12);
}
body.pt-glass.mode-dark {
    --glass-bg: rgba(26, 28, 36, 0.62);
    --glass-bg: color-mix(in srgb, var(--bg-dark-secondary) 66%, transparent);
    --glass-bg-strong: rgba(26, 28, 36, 0.84);
    --glass-bg-strong: color-mix(in srgb, var(--bg-dark-secondary) 84%, transparent);
    --glass-border: rgba(255, 255, 255, 0.14);
    --glass-border: color-mix(in srgb, var(--font-dark-color) 16%, transparent);
    --glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.45);
}

/* Honor the OS "reduce transparency" preference — collapse to solid. */
@media (prefers-reduced-transparency: reduce) {
    body.pt-glass {
        --glass-bg: var(--bg-light-color);
        --glass-bg-strong: var(--bg-light-color);
        --glass-border: rgba(0, 0, 0, 0.08);
    }
    body.pt-glass.mode-dark {
        --glass-bg: var(--bg-dark-secondary);
        --glass-bg-strong: var(--bg-dark-secondary);
        --glass-border: rgba(255, 255, 255, 0.10);
    }
}

@supports ((backdrop-filter: blur(8px)) or (-webkit-backdrop-filter: blur(8px))) {

    /* Sticky gallery nav — the signature glass surface */
    body.pt-glass:not(.a11y-contrast) .secondary-menu {
        background-color: var(--glass-bg);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        border-bottom: 1px solid var(--glass-border);
    }

    /* Mini-cart slide-in panel (needs strong legibility for prices).
       Text-heavy panels below opt out under the `pt-glass-subtle` level. */
    body.pt-glass:not(.pt-glass-subtle):not(.a11y-contrast) .cart-menu {
        background-color: var(--glass-bg-strong);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        border-left: 1px solid var(--glass-border);
    }

    /* Hamburger / offcanvas sidebar */
    body.pt-glass:not(.pt-glass-subtle):not(.a11y-contrast) .offcanvas {
        background-color: var(--glass-bg-strong);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        border-right: 1px solid var(--glass-border);
    }

    /* Product cards — lighter touch */
    body.pt-glass:not(.a11y-contrast) #products-container .card,
    body.pt-glass:not(.a11y-contrast) #activeProduct .card {
        background-color: var(--glass-bg);
        -webkit-backdrop-filter: blur(10px) saturate(1.3);
        backdrop-filter: blur(10px) saturate(1.3);
        border: 1px solid var(--glass-border);
        box-shadow: var(--glass-shadow);
    }

    /* Gallery-landing hero card (frosted over the photographer background).
       Text-heavy, so it stays solid under the `pt-glass-subtle` level. */
    body.pt-glass:not(.pt-glass-subtle):not(.a11y-contrast) .location-card {
        background-color: var(--glass-bg-strong);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        backdrop-filter: blur(var(--glass-blur)) saturate(1.4);
        border: 1px solid var(--glass-border);
        box-shadow: var(--glass-shadow);
    }

    /* Checkout section cards (only shows if glass is also mounted on checkout) */
    body.pt-glass:not(.pt-glass-subtle):not(.a11y-contrast) .co-card {
        background-color: var(--glass-bg-strong);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.3);
        backdrop-filter: blur(var(--glass-blur)) saturate(1.3);
        /* base .co-card sets `border: none !important`, so !important is required here */
        border: 1px solid var(--glass-border) !important;
    }

    /* App dialog modals (prepaid / feedback / model release, etc.) */
    body.pt-glass:not(.pt-glass-subtle):not(.a11y-contrast) .modal-content {
        background-color: var(--glass-bg-strong);
        -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.3);
        backdrop-filter: blur(var(--glass-blur)) saturate(1.3);
        border: 1px solid var(--glass-border);
    }

    /* …but the image lightboxes stay exactly as they are — never glass over a
       photo. These restore rules follow the modal rule so equal/greater
       specificity wins them back to their current opaque backgrounds. */
    body.pt-glass .album-lightbox-modal .modal-content {
        background: var(--overlay-bg);
        -webkit-backdrop-filter: none;
        backdrop-filter: none;
    }
    body.pt-glass.mode-light .cart-lightbox-modal .modal-content {
        background: var(--bg-color);
        -webkit-backdrop-filter: none;
        backdrop-filter: none;
    }
    body.pt-glass.mode-dark .cart-lightbox-modal .modal-content {
        background: var(--bg-dark-color);
        -webkit-backdrop-filter: none;
        backdrop-filter: none;
    }
}

/* =====================================================================
   Body product cards (#container-products) are ALWAYS shown (digital → Entire
   Gallery cards; product → that product's card). On lg the rail narrows the
   content area, so the col-lg-3 cards + the rotated SPECIAL! ribbon would clip
   — widen them to ~col-lg-5 so they don't. (No hiding: removing them from flow
   shifted the gallery, which we didn't want.)
   ===================================================================== */
@media (min-width: 992px) and (max-width: 1199px) {
    body.pt-rail-active #container-products { max-width: 100%; }
    body.pt-rail-active #activeProduct > [class*="col-"] {
        flex: 0 0 auto;
        width: 41.6667%;                 /* ≈ col-lg-5 */
        max-width: 41.6667%;
        margin-left: 0 !important;       /* drop the offset-1 */
    }
    body.pt-rail-active #container-products,
    body.pt-rail-active #activeProduct,
    body.pt-rail-active .best-value-container { overflow: visible; }
}

/* =====================================================================
   While the #sidebar hamburger offcanvas is open, the floating accessibility
   button is covered by the panel — hide it; the "Accessibility" link in the
   Display cluster is the way in instead.
   ===================================================================== */
body.pt-sidebar-open #accessibilityBtn { display: none !important; }

/* "Accessibility" link in the Display cluster — styled like the cluster labels
   (theme-aware), accent on hover/focus. Closes the offcanvas + opens the panel. */
.sidebar-a11y-row { margin-top: 6px; }
.sidebar-a11y-link {
    display: inline-flex;
    align-items: center;
    background: none;
    border: 0;
    padding: 4px 0;
    font-size: 0.78rem;
    cursor: pointer;
    color: var(--font-light-color);
    text-decoration: none;
}
.mode-dark .sidebar-a11y-link { color: var(--font-dark-color); }
.sidebar-a11y-link:hover,
.sidebar-a11y-link:focus-visible { color: var(--accent-orange); text-decoration: underline; }

/* ---------------------------------------------------------------------------
   Accessibility: honor the OS "reduce motion" setting at the CSS layer.
   The a11y widget has a JS reduce-motion toggle, but pulsing badges + the Ken
   Burns slideshow run before JS can intervene; this is the paint-time safety
   net for visitors who set prefers-reduced-motion. !important is required to
   override the per-element animation durations defined throughout this file.
   --------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: 0.001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.001ms !important;
        scroll-behavior: auto !important;
    }
}

/* ---------------------------------------------------------------------------
   Product preview "try-on" (product-preview.js): selecting a product reshapes +
   recolors the gallery tiles to match it, and rewrites the "Select Your Pictures"
   heading to "Click on your pictures to Add to Cart" + the product name.
   --------------------------------------------------------------------------- */

/* (A) Crop: reshape the tile wrapper to the product's print aspect; image covers it.
   display:block !important is required to beat Bootstrap's .d-inline-block on the
   wrapper (which is `display:inline-block !important`). */
.gallery-item .pt-gridfit-frame {
    display: block !important;
    /* Constrain the reshaped crop to the tile's ORIGINAL height (--pt-tile-h, set by
       product-preview.js) so a portrait product aspect doesn't grow the tile to full size;
       width is derived from height + aspect, and the box centers in the column. */
    height: var(--pt-tile-h, auto);
    width: auto;
    max-width: 100%;
    margin-left: auto;
    margin-right: auto;
    aspect-ratio: var(--pt-tile-a, auto);
    overflow: hidden;
    border-radius: 8px;
}
.gallery-item .pt-gridfit-frame .product-image {
    /* absolute so the photo does NOT force the frame height — the frame's height
       comes purely from aspect-ratio; the wrapper is already .position-relative. */
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* (C) Color-effect filters (sepia / black-and-white / old-time).
   Defined once as vars so they apply IDENTICALLY to gallery tiles, cart thumbnails
   (.pt-fx-* on any element), and the loupes (via a <body> class). Tune here only. */
:root {
    --pt-fx-sepia: sepia(1) grayscale(0.3) brightness(0.92) contrast(1.03);   /* brown & white: full sepia for a rich brown, a touch of grayscale pulls the color back (not washed out like 0.75), brightness/contrast deepen it */
    --pt-fx-bw: sepia(0) grayscale(1);                        /* black & white */
    --pt-fx-oldtime: sepia(0.55) grayscale(0.25);             /* old-time color */
}
.gallery-item .product-image,
.cart-item-thumb,
.cart-chip-thumb {
    transition: filter 0.25s ease, box-shadow 0.25s ease;
}
.pt-fx-sepia   { filter: var(--pt-fx-sepia); }
.pt-fx-bw      { filter: var(--pt-fx-bw); }
.pt-fx-oldtime { filter: var(--pt-fx-oldtime); }

/* Loupes follow the gallery's active effect (body class set by product-preview.js).
   Target the image layer (grid loupe) / the lens (lightbox) so the ring stays clean-ish. */
body.pt-gallery-fx-sepia .gallery-loupe-img,
body.pt-gallery-fx-sepia .album-loupe   { filter: var(--pt-fx-sepia); }
body.pt-gallery-fx-bw .gallery-loupe-img,
body.pt-gallery-fx-bw .album-loupe      { filter: var(--pt-fx-bw); }
body.pt-gallery-fx-oldtime .gallery-loupe-img,
body.pt-gallery-fx-oldtime .album-loupe { filter: var(--pt-fx-oldtime); }

/* (B) Heading: "Click on your pictures to Add to Cart" + product name */
.pt-preview-heading .pt-preview-cta {
    font-size: 1.5rem;
    font-weight: 700;
    line-height: 1.2;
}
.pt-preview-heading .pt-preview-prod {
    font-size: 1.1rem;
    font-weight: 800;
    color: var(--accent-orange);
    margin-top: 2px;
}
/* Top nav bar heading: muted label + strong product name */
.nav-heading-label {
    display: inline-block;
    font-size: 0.72em;
    font-weight: 500;
    opacity: 0.6;
    line-height: 1;
}
.nav-heading-prod {
    font-weight: 800;
}

/* ---------------------------------------------------------------------------
   Single-image product configurator (single-image-configurator.js): when a
   gallery has ONE photo + real products, the lone-photo gallery is replaced by a
   product picker — the photo previewed in each product (8x10 / 5x7 / mug ...),
   each capped at 320px tall, with a per-product "Add to Cart". Reuses the global
   .pt-fx-* color filters; the --pt-tile-a frame var is set per-card by the JS.
   --------------------------------------------------------------------------- */
.sic-heading-wrap { margin: 0 auto; }
.sic-heading {
    font-weight: 800;
    color: var(--heading-light-color);
}
.mode-dark .sic-heading { color: var(--heading-dark-color); }
.sic-sub {
    color: var(--font-light-color);
    opacity: 0.75;
    margin-top: 4px;
}
.mode-dark .sic-sub { color: var(--font-dark-color); }

.sic-card {
    display: flex;
    flex-direction: column;
    height: 100%;
    background: var(--bg-light-secondary);
    border: 1px solid var(--overlay-border);
    border-radius: 14px;
    overflow: hidden;
    /* Inset the preview on top + sides (the body adds the matching bottom gap), so
       the graphic is framed evenly inside the card. */
    padding: 16px 16px 0;
    transition: box-shadow 0.2s ease, transform 0.2s ease;
}
.mode-dark .sic-card { background: var(--bg-dark-secondary); }
.sic-card:hover {
    box-shadow: 0 10px 26px rgba(0, 0, 0, 0.16);
    transform: translateY(-3px);
}

/* Equal-height preview stage: a fixed-height box that the frame is centered inside,
   so every card's product area is the same height (names/prices/buttons line up)
   even though the products differ in shape. The frame keeps its true aspect and is
   scaled to FIT (contain) within the stage — products don't have to match size,
   just share the row. */
.sic-stage {
    --sic-stage-h: 240px;
    height: var(--sic-stage-h);
    display: flex;
    align-items: center;
    justify-content: center;
}
@media (max-width: 575.98px) {
    .sic-stage { --sic-stage-h: 200px; }
}
/* width = min(column width, stage-height * aspect) so the aspect-derived height is
   always <= the stage height AND never overflows the column. object-fit:cover shows
   the real print crop. */
.sic-frame {
    position: relative;
    width: min(100%, calc(var(--sic-stage-h, 240px) * var(--pt-tile-a, 1)));
    aspect-ratio: var(--pt-tile-a, 1);
    overflow: hidden;
    border-radius: 8px;
    background: var(--bg-dark-color);   /* neutral letterbox behind a crop (photo covers it) */
}
.sic-frame .sic-photo {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: filter 0.25s ease;
}

/* Real mockup (mug / frame / ornament / canvas): product image (background) ->
   photo composited into the print-area box -> foreground overlay. Same z-order as
   the Konva editor / Scenerenderer. The box is positioned in % of the frame by the
   JS (from the template's normalized photo box). */
.sic-frame.sic-mockup { background: transparent; }
.sic-mockup-bg,
.sic-mockup-fg {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    /* fill (not cover): the frame IS the template canvas aspect and the photo box
       is positioned in canvas %, so the product image must fill that exact box for
       the box to land on the print area — cover would crop it and drift the box. */
    object-fit: fill;
    pointer-events: none;
}
.sic-mockup-bg { z-index: 1; }
.sic-mockup-fg { z-index: 3; }
.sic-mockup-slot {
    position: absolute;     /* left/top/width/height set inline (per-product box) */
    overflow: hidden;
    z-index: 2;
}

.sic-body {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 4px;
    /* No side padding — the card supplies the side inset so text + graphic align. */
    padding: 14px 0 16px;
    flex: 1 1 auto;
}
.sic-name {
    font-weight: 700;
    color: var(--font-light-color);
}
.mode-dark .sic-name { color: var(--font-dark-color); }
/* Muted product description under the name, clamped to 2 lines. */
.sic-desc {
    font-size: 0.82rem;
    line-height: 1.3;
    color: var(--font-light-color);
    opacity: 0.65;
    margin-bottom: 2px;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.mode-dark .sic-desc { color: var(--font-dark-color); }
.sic-price {
    font-weight: 800;
    color: var(--accent-orange);
    margin-bottom: 8px;
}

/* name/desc/price group (grid: centered column; list: left-aligned, flex-grows). */
.sic-info {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
}

/* Action area pinned to the card bottom (Add button OR the qty stepper). */
.sic-action {
    width: 100%;
    margin-top: auto;
}

/* ---- Grid / List view toggle (right-aligned above the grid) ---- */
.sic-gridtools {
    display: flex;
    justify-content: flex-end;
    margin-bottom: 10px;
}
.sic-viewtoggle {
    display: inline-flex;
    border: 1px solid var(--overlay-border);
    border-radius: 999px;
    overflow: hidden;
}
.sic-viewbtn {
    width: 44px;
    height: 36px;
    border: 0;
    background: transparent;
    color: var(--font-light-color);
    font-size: 1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background 0.15s ease, color 0.15s ease;
}
.mode-dark .sic-viewbtn { color: var(--font-dark-color); }
.sic-viewbtn:hover,
.sic-viewbtn:focus-visible { color: var(--accent-orange); }
.sic-viewbtn:focus-visible { outline: 3px solid var(--accent-light-orange); outline-offset: 2px; }
.sic-viewbtn.active {
    background: var(--accent-orange);
    color: var(--font-white);
}

/* Visual balance: the centered grid gets a little top air, the left-aligned list
   gets bottom air, so neither reads "top heavy". */
.sic-grid:not(.sic-list) { padding-top: 6px; }
.sic-grid.sic-list { padding-bottom: 6px; }

/* ---- LIST view: one product per row — [thumbnail | name/desc/price | Add] ---- */
.sic-list .sic-card {
    flex-direction: row;
    align-items: center;
    text-align: left;
    gap: 16px;
    max-width: 760px;
    margin: 0 auto;
    padding: 12px 16px;
    height: auto;
}
.sic-list .sic-stage {
    --sic-stage-h: 96px;
    flex: 0 0 auto;
    width: 110px;
    margin: 0;
}
.sic-list .sic-body {
    flex: 1 1 auto;
    flex-direction: row;
    align-items: center;
    text-align: left;
    gap: 16px;
    padding: 0;
    width: auto;
}
.sic-list .sic-info {
    flex: 1 1 auto;
    align-items: flex-start;
    text-align: left;
}
.sic-list .sic-price { margin-bottom: 0; }
.sic-list .sic-action {
    flex: 0 0 auto;
    width: auto;
    min-width: 190px;
    margin-top: 0;
}
@media (max-width: 575.98px) {
    /* On a phone the action drops under the info (room is tight). */
    .sic-list .sic-body { flex-direction: column; align-items: stretch; gap: 8px; }
    .sic-list .sic-action { min-width: 0; width: 100%; }
}

/* Quantity shown ABOVE the always-present Add to Cart button (once in cart):
   a small "In cart" caption over a [-] N [+] stepper. Clear for all ages. */
.sic-qtyrow {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    margin-bottom: 12px;
}
.sic-qtycap {
    font-size: 0.72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--font-light-color);
    opacity: 0.65;
}
.mode-dark .sic-qtycap { color: var(--font-dark-color); }

/* In-cart quantity stepper: [-] qty [+] */
.sic-stepper {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 16px;
}
.sic-step {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 2px solid var(--accent-orange);
    background: transparent;
    color: var(--accent-orange);
    font-size: 1.25rem;
    font-weight: 700;
    line-height: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background 0.15s ease, color 0.15s ease;
}
.sic-step:hover,
.sic-step:focus-visible {
    background: var(--accent-orange);
    color: var(--font-white);
}
.sic-step:focus-visible { outline: 3px solid var(--accent-light-orange); outline-offset: 2px; }
.sic-qty {
    min-width: 2ch;
    text-align: center;
    font-weight: 800;
    font-size: 1.15rem;
    color: var(--font-light-color);
}
.mode-dark .sic-qty { color: var(--font-dark-color); }

.sic-add {
    width: 100%;
    font-weight: 700;
    color: var(--accent-orange);
    background: transparent;
    border: 2px solid var(--accent-orange);
    border-radius: 999px;
    padding: 9px 14px;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.sic-add:hover,
.sic-add:focus-visible {
    color: var(--font-white);
    background: var(--accent-orange);
    border-color: var(--accent-orange);
}
.sic-add:focus-visible { outline: 3px solid var(--accent-light-orange); outline-offset: 2px; }

/* Select-list products (e.g. Size): the label + size dropdown are grouped in
   .sic-optwrap ABOVE the Add to Cart button. Quantities live in the cart (each
   size is its own line); the muted "In cart" line just confirms what's added. */
.sic-optwrap {
    width: 100%;
    margin-bottom: 12px;
}
.sic-optlabel {
    display: block;
    font-size: 0.82rem;
    font-weight: 600;
    margin-bottom: 4px;
    color: var(--font-light-color);
    text-align: left;
}
.mode-dark .sic-optlabel { color: var(--font-dark-color); }
.sic-optsel {
    width: 100%;
}
/* Read-only "In cart: Small (x1), Medium (x2)" feedback — shown ABOVE the Add
   button (no quantity control on the card; sizes are managed in the cart). */
.sic-incart {
    margin-bottom: 10px;
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--accent-orange);
    text-align: center;
}

/* Category filter bar (pill chips). Tangible-category chips filter the grid; the
   "Digital Downloads" chip shifts to the normal digital screen. */
.sic-filterbar {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 8px;
    margin: 0 auto 20px;
}
.sic-chip {
    border: 1px solid var(--overlay-border);
    background: transparent;
    color: var(--font-light-color);
    border-radius: 999px;
    padding: 7px 18px;
    font-weight: 600;
    line-height: 1.2;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.mode-dark .sic-chip { color: var(--font-dark-color); }
.sic-chip:hover,
.sic-chip:focus-visible {
    border-color: var(--accent-orange);
    color: var(--accent-orange);
}
.sic-chip:focus-visible { outline: 3px solid var(--accent-light-orange); outline-offset: 2px; }
.sic-chip.active {
    background: var(--accent-orange);
    border-color: var(--accent-orange);
    color: var(--font-white);
}
.sic-chip.active:hover,
.sic-chip.active:focus-visible { color: var(--font-white); }

/* Thumbnail strip (2–3 photo configurator): pick which photo to personalize.
   Horizontal, centered, scrollable if it ever overflows. Works desktop + mobile. */
.sic-thumbs {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    gap: 12px;
    margin: 0 auto 20px;
    padding: 2px;
    overflow-x: auto;
}
.sic-thumb {
    position: relative;
    flex: 0 0 auto;
    width: 84px;
    height: 84px;
    padding: 0;
    border: 2px solid var(--overlay-border);
    border-radius: 12px;
    background: var(--bg-light-secondary);
    overflow: hidden;
    cursor: pointer;
    transition: border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}
.mode-dark .sic-thumb { background: var(--bg-dark-secondary); }
.sic-thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.sic-thumb:hover,
.sic-thumb:focus-visible { border-color: var(--accent-orange); }
.sic-thumb:focus-visible { outline: 3px solid var(--accent-light-orange); outline-offset: 2px; }
.sic-thumb.active {
    border-color: var(--accent-orange);
    box-shadow: 0 0 0 3px var(--accent-light-orange);
    transform: translateY(-2px);
}
@media (max-width: 576px) {
    .sic-thumb { width: 68px; height: 68px; }
}

/* Magnifier on a thumb — enlarge the photo full-ish screen without selecting.
   Small corner badge; always visible on touch, fades in on hover on desktop. */
.sic-thumb-zoom {
    position: absolute;
    top: 4px;
    right: 4px;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.72rem;
    color: var(--font-white);
    background: rgba(0, 0, 0, 0.55);
    cursor: zoom-in;
    opacity: 0.85;
    transition: opacity 0.15s ease, background 0.15s ease;
}
.sic-thumb-zoom:hover,
.sic-thumb-zoom:focus-visible { opacity: 1; background: var(--accent-orange); outline: none; }
@media (hover: hover) and (pointer: fine) {
    .sic-thumb-zoom { opacity: 0; }
    .sic-thumb:hover .sic-thumb-zoom,
    .sic-thumb-zoom:focus-visible { opacity: 1; }
}
/* lazy-load sentinel — invisible, just a scroll target */
.sic-thumbs-more { flex: 0 0 1px; width: 1px; height: 1px; }

/* ---- Photo-first layout (print-only): desktop left rail / mobile swipe strip ----
   #single-config.pt-photofirst holds [ .sic-thumbs | .sic-main ]. */
.pt-photofirst .sic-main { min-width: 0; }
@media (min-width: 992px) {
    #single-config.pt-photofirst { display: flex; align-items: flex-start; gap: 20px; }
    #single-config.pt-photofirst .sic-thumbs {
        flex: 0 0 132px;
        width: 132px;
        flex-wrap: nowrap;
        flex-direction: column;
        justify-content: flex-start;
        margin: 0;
        max-height: 78vh;
        overflow-y: auto;
        overflow-x: hidden;
        position: sticky;
        top: 88px;
    }
    #single-config.pt-photofirst .sic-thumb { width: 112px; height: 112px; }
    #single-config.pt-photofirst .sic-main { flex: 1 1 auto; }
}
@media (max-width: 991.98px) {
    /* Mobile/tablet: a single-row horizontal swipe strip across the top. */
    #single-config.pt-photofirst .sic-thumbs {
        flex-wrap: nowrap;
        justify-content: flex-start;
        scroll-snap-type: x proximity;
        -webkit-overflow-scrolling: touch;
        padding-bottom: 6px;
    }
    #single-config.pt-photofirst .sic-thumb { scroll-snap-align: center; }
}

/* ---- Enlarge ("magnifier") overlay ---- */
body.sic-lb-open { overflow: hidden; }
.sic-lightbox {
    position: fixed;
    inset: 0;
    z-index: 1085;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(0, 0, 0, 0.9);
    padding: 24px;
}
.sic-lightbox[hidden] { display: none; }
.sic-lb-img {
    max-width: 94vw;
    max-height: 88vh;
    object-fit: contain;
    border-radius: 6px;
    box-shadow: 0 8px 40px rgba(0, 0, 0, 0.6);
}
.sic-lb-close {
    position: absolute;
    top: 16px;
    right: 20px;
    width: 44px;
    height: 44px;
    border: 0;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    font-size: 1.6rem;
    line-height: 1;
    cursor: pointer;
}
.sic-lb-close:hover,
.sic-lb-close:focus-visible { background: rgba(255, 255, 255, 0.25); }
.sic-lb-nav {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 48px;
    height: 48px;
    border: 0;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.12);
    color: #fff;
    font-size: 2rem;
    line-height: 1;
    cursor: pointer;
}
.sic-lb-nav:hover,
.sic-lb-nav:focus-visible { background: rgba(255, 255, 255, 0.25); }
.sic-lb-prev { left: 16px; }
.sic-lb-next { right: 16px; }
.sic-lb-pos {
    position: absolute;
    bottom: 18px;
    left: 50%;
    transform: translateX(-50%);
    color: rgba(255, 255, 255, 0.85);
    font-size: 0.85rem;
    font-weight: 600;
}
@media (max-width: 576px) {
    .sic-lb-nav { width: 40px; height: 40px; font-size: 1.6rem; }
}

/* ============================================================================
   MOBILE PRODUCT SHEET (mobile-product-sheet.js) — native bottom sheet that
   replaces the footer hamburger + inline products menu on < lg viewports.
   Everything here is mobile-only by construction: the JS injects these nodes
   and adds body.pt-msheet-on ONLY below 992px, so the desktop rail / desktop
   layout is untouched. Theme-aware (light default, .mode-dark override).
   ========================================================================== */

/* Hide the legacy hamburger + inline products menu while the sheet is active. */
body.pt-msheet-on #productsButton,
body.pt-msheet-on #products { display: none !important; }

/* The slim trigger already names the active product, so the category status line
   below it is a redundant repeat — hide it on mobile. #selectedProductDigital is
   left visible on purpose: on digital it carries the prepaid / "individual" cost. */
body.pt-msheet-on #selectedProductCategory { display: none; }

/* Lock background scroll while the sheet is open. */
body.mps-open { overflow: hidden; }

/* ---- slim trigger bar (lives at the top of #prepaid-footer) ---- */
.mps-trigger {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    width: 100%;
    margin: 0 0 0.45rem 0;
    padding: 0.5rem 0.7rem;
    min-height: 52px;
    border: 1px solid color-mix(in srgb, var(--accent-orange) 45%, transparent);
    border-radius: 0.7rem;
    background: var(--bg-light-secondary);
    color: var(--font-light-color);
    text-align: left;
    cursor: pointer;
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.mps-trigger:hover,
.mps-trigger:focus-visible {
    border-color: var(--accent-orange);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-orange) 18%, transparent);
    outline: none;
}
.mps-trigger-left { display: flex; align-items: center; gap: 0.6rem; flex-grow: 1; min-width: 0; }
.mps-trigger-thumb {
    width: 38px; height: 38px; flex-shrink: 0;
    object-fit: contain; border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.05);
}
.mps-trigger-info { display: flex; flex-direction: column; min-width: 0; line-height: 1.15; }
.mps-trigger-name { font-weight: 700; font-size: 0.92rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mps-trigger-price { font-size: 0.74rem; opacity: 0.75; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mps-trigger-change {
    display: inline-flex; align-items: center; gap: 0.3rem; flex-shrink: 0;
    padding: 0.3rem 0.65rem;
    border-radius: 999px;
    background: var(--accent-orange);
    color: var(--font-white);
    font-weight: 700; font-size: 0.78rem;
}
.mps-trigger-chev { font-size: 0.7rem; }

/* ---- scrim ---- */
.mps-scrim {
    position: fixed; inset: 0;
    z-index: 1090;
    background: rgba(0, 0, 0, 0.5);
    -webkit-backdrop-filter: blur(2px);
    backdrop-filter: blur(2px);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s ease;
}
.mps-scrim.mps-show { opacity: 1; pointer-events: auto; }

/* ---- sheet panel ---- */
.mps-sheet {
    position: fixed; left: 0; right: 0; bottom: 0;
    z-index: 1091;
    display: flex; flex-direction: column;
    max-height: 82vh;
    background: var(--bg-light-color);
    color: var(--font-light-color);
    border-top-left-radius: 1.1rem;
    border-top-right-radius: 1.1rem;
    box-shadow: 0 -10px 40px rgba(0, 0, 0, 0.28);
    transform: translateY(100%);
    transition: transform 0.34s cubic-bezier(0.32, 0.72, 0, 1);
    will-change: transform;
}
.mps-sheet.mps-show { transform: translateY(0); }
.mps-sheet.mps-dragging { transition: none; }
.mps-sheet.mps-no-anim,
.mps-scrim.mps-no-anim { transition: none !important; }

.mps-handle-wrap { display: flex; justify-content: center; padding: 0.6rem 0 0.2rem; cursor: grab; touch-action: none; }
.mps-handle { width: 42px; height: 5px; border-radius: 999px; background: color-mix(in srgb, var(--font-light-color) 28%, transparent); }

.mps-head { display: flex; align-items: center; justify-content: space-between; padding: 0.2rem 1rem 0.6rem; }
.mps-title { margin: 0; font-family: 'Poppins', sans-serif; font-weight: 800; font-size: 1.15rem; }
.mps-close {
    width: 40px; height: 40px; flex-shrink: 0;
    display: inline-flex; align-items: center; justify-content: center;
    border: 0; border-radius: 50%;
    background: var(--bg-light-secondary);
    color: var(--font-light-color);
    font-size: 1rem; cursor: pointer;
}
.mps-close:hover, .mps-close:focus-visible { color: var(--accent-orange); outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-orange) 22%, transparent); }

.mps-body { overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 0 0.85rem calc(1rem + env(safe-area-inset-bottom, 0px)); }

/* ---- entire-gallery best-value row ---- */
.mps-eg {
    position: relative;
    display: flex; align-items: center; gap: 0.7rem;
    width: 100%;
    margin: 0.2rem 0 0.6rem;
    padding: 0.7rem 0.75rem;
    border: 1.5px solid color-mix(in srgb, var(--accent-orange) 50%, transparent);
    border-radius: 0.8rem;
    background: color-mix(in srgb, var(--accent-orange) 7%, transparent);
    color: inherit; text-align: left; cursor: pointer;
}
.mps-eg.mps-eg-active { border-color: var(--accent-orange); box-shadow: inset 4px 0 0 var(--accent-orange); }
.mps-eg-thumb { width: 50px; height: 50px; flex-shrink: 0; object-fit: contain; border-radius: 0.4rem; background: rgba(0, 0, 0, 0.05); }
.mps-eg-info { flex-grow: 1; min-width: 0; }
.mps-eg-name { font-weight: 800; font-size: 1rem; line-height: 1.15; }
.mps-eg-desc { font-size: 0.76rem; opacity: 0.7; }
.mps-eg-price { font-weight: 800; font-size: 1rem; color: var(--accent-orange); flex-shrink: 0; }
.mps-eg-badge {
    position: absolute; top: -9px; left: 12px;
    padding: 0.12rem 0.5rem; border-radius: 999px;
    background: var(--accent-orange); color: var(--font-white);
    font-size: 0.64rem; font-weight: 800; letter-spacing: 0.02em; text-transform: uppercase;
}

/* ---- category sections + product rows ---- */
.mps-section { margin-bottom: 0.5rem; }
.mps-section-head {
    font-family: 'Poppins', sans-serif; font-weight: 700; font-size: 0.7rem;
    letter-spacing: 0.06em; text-transform: uppercase;
    opacity: 0.6; padding: 0.55rem 0.35rem 0.3rem;
}
.mps-prod {
    border-bottom: 1px solid var(--overlay-border, rgba(0, 0, 0, 0.10));
    border-radius: 0.5rem;
}
.mps-prod:last-child { border-bottom: 0; }
.mps-prod.mps-prod-active { background: color-mix(in srgb, var(--accent-orange) 12%, transparent); box-shadow: inset 4px 0 0 var(--accent-orange); }
.mps-prod-head {
    display: flex; align-items: center; gap: 0.7rem;
    width: 100%; min-height: 56px;
    padding: 0.55rem 0.45rem;
    border: 0; background: transparent; color: inherit; text-align: left; cursor: pointer;
}
.mps-prod-head:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent-orange); border-radius: 0.5rem; }
.mps-prod-img { width: 50px; height: 50px; flex-shrink: 0; object-fit: contain; border-radius: 0.4rem; background: rgba(0, 0, 0, 0.04); }
.mps-prod-main { flex-grow: 1; min-width: 0; }
.mps-prod-namerow { display: flex; align-items: center; gap: 0.35rem; flex-wrap: wrap; }
.mps-prod-name { font-size: 0.92rem; font-weight: 700; line-height: 1.15; }
.mps-prod.mps-prod-active .mps-prod-name { color: var(--accent-orange); }
.mps-prod-fx, .mps-prod-opts {
    font-size: 0.62rem; font-weight: 700; letter-spacing: 0.02em;
    padding: 0.06rem 0.4rem; border-radius: 999px;
    background: color-mix(in srgb, var(--accent-orange) 16%, transparent);
    color: var(--accent-orange);
}
.mps-prod-opts { background: color-mix(in srgb, var(--font-light-color) 12%, transparent); color: inherit; opacity: 0.75; }
.mps-prod-desc { font-size: 0.74rem; opacity: 0.65; line-height: 1.2; margin-top: 0.12rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mps-prod-price { font-weight: 800; font-size: 0.92rem; flex-shrink: 0; color: var(--accent-orange); }

/* variant expander */
.mps-prod-expand { max-height: 0; overflow: hidden; transition: max-height 0.28s ease; }
.mps-prod.mps-prod-open .mps-prod-expand { max-height: 280px; }
.mps-var { padding: 0.2rem 0.55rem 0.85rem; }
.mps-var-title { font-size: 0.74rem; font-weight: 700; opacity: 0.7; margin-bottom: 0.4rem; }
.mps-var-chips { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-bottom: 0.7rem; }
.mps-chip {
    padding: 0.4rem 0.75rem; min-height: 40px;
    border: 1.5px solid color-mix(in srgb, var(--accent-orange) 45%, transparent);
    border-radius: 999px;
    background: transparent; color: inherit;
    font-size: 0.8rem; font-weight: 600; cursor: pointer;
}
.mps-chip:hover, .mps-chip:focus-visible { border-color: var(--accent-orange); outline: none; }
.mps-chip.mps-chip-on { background: var(--accent-orange); color: var(--font-white); border-color: var(--accent-orange); }
.mps-use {
    width: 100%; min-height: 46px;
    border: 0; border-radius: 0.6rem;
    background: var(--accent-orange); color: var(--font-white);
    font-weight: 800; font-size: 0.95rem; cursor: pointer;
}
.mps-use:hover, .mps-use:focus-visible { background: var(--accent-dark-orange, var(--accent-orange)); outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-orange) 22%, transparent); }

/* ---- dark mode ---- */
.mode-dark .mps-trigger { background: var(--bg-dark-secondary); color: var(--font-dark-color); }
.mode-dark .mps-sheet { background: var(--bg-dark-color); color: var(--font-dark-color); }
.mode-dark .mps-close { background: var(--bg-dark-secondary); color: var(--font-dark-color); }
.mode-dark .mps-handle { background: color-mix(in srgb, var(--font-dark-color) 30%, transparent); }
.mode-dark .mps-prod-img,
.mode-dark .mps-eg-thumb,
.mode-dark .mps-trigger-thumb { background: rgba(255, 255, 255, 0.06); }
.mode-dark .mps-prod-opts { background: color-mix(in srgb, var(--font-dark-color) 14%, transparent); }


/* ============================================================================
   BACKGROUND VIDEO (entry/login hero) — a muted, looping <video> behind the hero
   with the background IMAGE as the poster/fallback, calmed by an overlay scrim.
   Small screens + reduce-motion fall back to the poster (video hidden) for
   data/battery + vestibular safety. media-src CSP already allows the photo CDN.
   ========================================================================== */
.location-container.has-bg-video { position: relative; overflow: hidden; }
.bg-video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: 0;
    pointer-events: none;
    border: 0;
}
.bg-video-overlay {
    position: absolute;
    inset: 0;
    z-index: 1;
    background: #000;
    pointer-events: none;
}
/* Lift the hero content above the video + overlay (toggle keeps its own z-index). */
.location-container.has-bg-video > *:not(.bg-video):not(.bg-video-overlay):not(.bg-video-toggle) {
    position: relative;
    z-index: 2;
}
.bg-video-toggle {
    position: absolute;
    left: 16px;
    bottom: 16px;
    z-index: 3;
    width: 40px;
    height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 0;
    border-radius: 50%;
    background: rgba(0, 0, 0, 0.5);
    color: #fff;
    cursor: pointer;
}
.bg-video-toggle:hover,
.bg-video-toggle:focus-visible {
    background: rgba(0, 0, 0, 0.72);
    outline: none;
}
/* Safeguards — show the static poster (no video) on small screens (data/battery)
   and for reduced-motion users (OS setting + the in-app a11y toggle). */
@media (max-width: 767.98px) {
    .bg-video,
    .bg-video-overlay,
    .bg-video-toggle { display: none; }
}
@media (prefers-reduced-motion: reduce) {
    .bg-video,
    .bg-video-overlay,
    .bg-video-toggle { display: none; }
}
body.a11y-reduce-motion .bg-video,
body.a11y-reduce-motion .bg-video-overlay,
body.a11y-reduce-motion .bg-video-toggle { display: none; }

/* ============================================================================
   STOREFRONT LANDING BLOCKS (Landingrenderer) — structured, block-based custom
   landing rendered on the entry page when an account has a saved landingconfig.
   Dormant until the admin page-designer saves one; the default entry page is the
   fallback. Theme-variable driven (light + .mode-dark). See LANDING-CONTRACT.md.
   ========================================================================== */
.ptl-landing { width: 100%; padding: 2rem 1rem 3rem; }
.ptl-block { width: 100%; margin: 0 auto 1.25rem; }
.ptl-block:last-child { margin-bottom: 0; }
.ptl-align-left   { text-align: left; }
.ptl-align-center { text-align: center; }
.ptl-align-right  { text-align: right; }

/* hero_search — the real photo-code search */
.ptl-hero { max-width: 680px; margin: 0 auto; }
.ptl-hero-title {
    font-family: 'Poppins', sans-serif; font-weight: 800;
    font-size: clamp(2rem, 5vw, 3.25rem); line-height: 1.05;
    color: var(--font-light-color); margin-bottom: 0.5rem;
}
.ptl-hero-subtitle { font-size: 1.1rem; opacity: 0.85; color: var(--font-light-color); margin-bottom: 1.25rem; }
.ptl-hero-form { text-align: left; }
.mode-dark .ptl-hero-title, .mode-dark .ptl-hero-subtitle { color: var(--font-dark-color); }

/* text */
.ptl-text-heading {
    font-family: 'Poppins', sans-serif; font-weight: 700;
    font-size: clamp(1.4rem, 3vw, 2rem); color: var(--font-light-color); margin-bottom: 0.6rem;
}
.ptl-text-body { font-size: 1.05rem; line-height: 1.55; color: var(--font-light-color); }
.mode-dark .ptl-text-heading, .mode-dark .ptl-text-body { color: var(--font-dark-color); }

/* html (sanitized) / image / video / button / spacer */
.ptl-html { color: var(--font-light-color); }
.mode-dark .ptl-html { color: var(--font-dark-color); }
.ptl-image-img { max-width: 100%; height: auto; border-radius: 0.6rem; }
.ptl-video-el { max-width: 100%; height: auto; border-radius: 0.6rem; }
.ptl-button { margin: 0.25rem; }
.ptl-spacer { width: 100%; }

/* Landing v2 — themed sections (each holds the blocks above) + new block types */
.ptl-section { width: 100%; padding: 2.5rem 1rem; }
.ptl-section:first-child { padding-top: 1.5rem; }
.ptl-inner { width: 100%; }
.ptl-landing > .ptl-section > .ptl-inner > .ptl-block:last-child { margin-bottom: 0; }
.ptl-divider { border: 0; border-top: 1px solid var(--border, rgba(0,0,0,0.12)); width: 100%; margin: 0.5rem auto; opacity: 0.6; }
.ptl-columns { display: flex; flex-wrap: wrap; gap: 1.5rem; }
.ptl-columns > .ptl-col { flex: 1 1 0; min-width: 220px; }
.ptl-social-row { display: flex; flex-wrap: wrap; gap: 0.6rem; justify-content: inherit; }
.ptl-social { display: inline-flex; align-items: center; gap: 0.35rem; text-decoration: none; padding: 0.35rem 0.7rem; border: 1px solid var(--border, rgba(0,0,0,0.12)); border-radius: 999px; }
.ptl-social:hover { border-color: var(--accent-orange, #e67e22); }
@media (max-width: 600px) { .ptl-columns { gap: 1rem; } .ptl-columns > .ptl-col { flex-basis: 100%; } .ptl-section { padding: 1.75rem 0.75rem; } }

/* footer block — image + optional caption, authored as ONE block.

   Rendered on the GALLERY pages, not the entry page: layout/footer.php renders a
   footerconfig document inside <footer id="storefront-footer">. render() still
   wraps its output in .ptl-landing, so the section/block rules above apply
   unchanged; only the outer <footer> needs its own spacing. */
.ptl-storefront-footer { width: 100%; margin-bottom: 4.5rem; }  /* clear of the fixed bottom bar */
.ptl-footer-img { max-width: 100%; height: auto; }
.ptl-footer-link { display: inline-block; }
.ptl-footer-text { font-size: 0.95rem; line-height: 1.5; color: var(--font-light-color); margin-top: 0.6rem; }
.mode-dark .ptl-footer-text { color: var(--font-dark-color); }

/* ---------------------------------------------------------------------------
   Download in Alternate Frames (download-photo.js) — bottom-of-page section:
   download the photo clean, or composited into a branded frame (client-side).
   Theme-variable driven; light + dark.
   --------------------------------------------------------------------------- */
/* The whole section is a FULL-WIDTH secondary-light band (no .container — the mount is
   a top-level sibling of <main>/<footer>, so it spans edge to edge). Gated on
   :not(:empty) so the empty mount doesn't show a bare band before the JS fills it.
   The inner .dlp-card (max-width + margin auto) keeps the content centered. */
#download-photo-section:not(:empty) {
    background: var(--bg-light-secondary);
    padding: 40px 16px;
    margin-bottom: 4.5rem;   /* keep it clear of the fixed footer */
}
.mode-dark #download-photo-section:not(:empty) { background: var(--bg-dark-secondary); }
.dlp-card {
    max-width: 760px;
    margin: 0 auto;
    text-align: center;
    background: transparent;
    border: none;
    padding: 0;
}
.mode-dark .dlp-card { background: var(--bg-dark-secondary); }
.dlp-title {
    font-weight: 800;
    color: var(--heading-light-color);
    margin-bottom: 4px;
}
.mode-dark .dlp-title { color: var(--heading-dark-color); }
.dlp-sub {
    color: var(--font-light-color);
    opacity: 0.75;
    margin-bottom: 18px;
}
.mode-dark .dlp-sub { color: var(--font-dark-color); }
.dlp-btns {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 12px;
}
.dlp-btn {
    display: inline-block;
    font-weight: 700;
    border-radius: 999px;
    padding: 11px 22px;
    border: 2px solid var(--accent-orange);
    text-decoration: none;
    cursor: pointer;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.dlp-btn:focus-visible { outline: 3px solid var(--accent-light-orange); outline-offset: 2px; }
.dlp-btn[disabled] { opacity: 0.6; cursor: default; }
/* Original = outline; framed = filled (the primary call-to-action). */
.dlp-btn-original {
    color: var(--accent-orange);
    background: transparent;
}
.dlp-btn-original:hover,
.dlp-btn-original:focus-visible {
    color: var(--font-white);
    background: var(--accent-orange);
}
.dlp-btn-framed {
    color: var(--font-white);
    background: var(--accent-orange);
}
.dlp-btn-framed:hover:not([disabled]),
.dlp-btn-framed:focus-visible {
    background: var(--accent-dark-orange);
    border-color: var(--accent-dark-orange);
}
.dlp-err {
    color: var(--danger-color);
    font-size: 0.9rem;
    margin-top: 12px;
    min-height: 1.2em;
}
/* Preview tiles: original + each frame, photo composited in at preview scale. */
.dlp-grid {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 22px;
    margin-top: 6px;
}
.dlp-tile {
    /* width follows the preview image so every tile is the SAME HEIGHT, natural width */
    max-width: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    /* hover lift, like the product cards — slight overshoot easing = a little bounce */
    transition: transform 0.22s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.dlp-tile:hover { transform: translateY(-6px); }
.dlp-tile:hover .dlp-preview { box-shadow: 0 12px 28px rgba(0, 0, 0, 0.16); }
.mode-dark .dlp-tile:hover .dlp-preview { box-shadow: 0 12px 28px rgba(0, 0, 0, 0.42); }
.dlp-preview {
    height: var(--dlp-h, 220px);   /* fixed height → all previews line up */
    min-width: 120px;
    background: var(--bg-light-color);
    border-radius: 10px;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 12px;
    transition: box-shadow 0.22s ease;
}
@media (max-width: 575.98px) { .dlp-preview { --dlp-h: 190px; } }
.mode-dark .dlp-preview { background: var(--bg-dark-color); }
.dlp-preview-img,
.dlp-preview-canvas {
    height: 100%;          /* fill the fixed height; width follows the aspect */
    width: auto;
    max-width: 420px;
    display: block;
    object-fit: contain;
}
.dlp-preview-loading {
    color: var(--font-light-color);
    opacity: 0.6;
    font-size: 0.85rem;
}
.mode-dark .dlp-preview-loading { color: var(--font-dark-color); }
.dlp-preview-failed { display: none; }
/* Frame preview = CSS-layered <img>s (same technique as the product mockups):
   photo positioned in the window box, frame overlay filling the canvas on top. */
.dlp-fp {
    position: relative;
    height: 100%;           /* fill the fixed stage height; aspect set inline per frame */
    width: auto;
    max-width: 420px;
    aspect-ratio: 3 / 2;    /* fallback; JS sets the real frame aspect inline */
}
.dlp-fp-slot {
    position: absolute;   /* left/top/width/height set inline (the frame's photo box) */
    overflow: hidden;
    z-index: 1;
}
.dlp-fp-photo {
    width: 100%;
    height: 100%;
    object-fit: cover;    /* the real print crop */
    display: block;
}
.dlp-fp-overlay {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: fill;     /* the overlay IS the canvas aspect, so fill (not cover) */
    z-index: 2;
    pointer-events: none;
}
.dlp-label {
    font-weight: 700;
    color: var(--heading-light-color);
    margin-bottom: 10px;
    font-size: 0.95rem;
}
.mode-dark .dlp-label { color: var(--heading-dark-color); }
.dlp-tile .dlp-btn {
    width: 100%;
    padding: 9px 16px;
}
/* mobile delivery (Web Share / press-&-hold): on-tap compose skeleton + long-press save */
.dlp-btn-busy { pointer-events: none; opacity: 0.75; }
/* skeleton while composing/fetching on tap (mobile) — subtle pulse on the preview */
.dlp-busy .dlp-preview { animation: dlpPulse 1.1s ease-in-out infinite; }
@keyframes dlpPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } }
/* mobile long-press fallback: the composed image + a hint to press & hold to save */
.dlp-preview-saveable { box-shadow: 0 0 0 2px var(--accent-orange) inset; }
.dlp-savehint {
    margin-top: 4px;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--accent-orange);
}

/* =========================================================================
   Entry Gate — "require contact info before browsing" (interstitial + modal)
   Theme-variable driven; light + dark; no inline styles. See ENTRY-GATE-CONTRACT.md
   ========================================================================= */
.eg-card {
    border: none;
    border-radius: 16px;
    background: var(--bg-light-secondary);
    color: var(--font-light-color);
}
.mode-dark .eg-card {
    background: var(--bg-dark-secondary);
    color: var(--font-dark-color);
}
.eg-card-modal .modal-body {
    padding: 1.75rem 1.5rem;
}
.eg-header {
    text-align: center;
    margin-bottom: 1.25rem;
}
.eg-title {
    font-family: 'Poppins', system-ui, sans-serif;
    font-weight: 800;
    font-size: 1.55rem;
    color: var(--heading-light-color);
    margin-bottom: 0.35rem;
}
.mode-dark .eg-title {
    color: var(--font-dark-color);
}
.eg-intro {
    color: var(--font-light-color);
    opacity: 0.85;
    margin-bottom: 0;
}
.mode-dark .eg-intro {
    color: var(--font-dark-color);
}
.eg-progress {
    text-align: center;
    font-size: 0.85rem;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    opacity: 0.7;
    margin-bottom: 1rem;
}
.eg-steps .eg-step[hidden] {
    display: none;
}
.eg-step-title {
    font-family: 'Poppins', system-ui, sans-serif;
    font-weight: 700;
    font-size: 1.15rem;
    color: var(--heading-light-color);
    margin-bottom: 0.25rem;
}
.mode-dark .eg-step-title {
    color: var(--font-dark-color);
}
.eg-step-subtitle {
    font-size: 0.92rem;
    opacity: 0.8;
    margin-bottom: 1rem;
}
.eg-field {
    margin-bottom: 1rem;
}
.eg-label {
    display: block;
    font-weight: 600;
    font-size: 0.92rem;
    margin-bottom: 0.35rem;
    color: var(--font-light-color);
}
.mode-dark .eg-label {
    color: var(--font-dark-color);
}
.eg-req {
    color: var(--accent-orange);
    font-weight: 700;
}
.eg-input {
    display: block;
    width: 100%;
    padding: 0.6rem 0.75rem;
    font: inherit;
    color: var(--font-light-color);
    background: #ffffff;
    border: 1px solid rgba(0, 0, 0, 0.18);
    border-radius: 10px;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.eg-textarea {
    min-height: 84px;
    resize: vertical;
}
.eg-input:focus,
.eg-input:focus-visible {
    outline: none;
    border-color: var(--accent-orange);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-orange) 25%, transparent);
}
.mode-dark .eg-input {
    color: var(--font-dark-color);
    background: rgba(255, 255, 255, 0.06);
    border-color: rgba(255, 255, 255, 0.2);
}
.eg-input.eg-invalid {
    border-color: var(--danger-color);
}
.eg-field-check {
    margin-bottom: 0.85rem;
}
.eg-check {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    cursor: pointer;
    margin-bottom: 0;
}
.eg-check-input {
    margin-top: 0.2rem;
    width: 1.1rem;
    height: 1.1rem;
    flex-shrink: 0;
    accent-color: var(--accent-orange);
}
.eg-check-label {
    font-size: 0.92rem;
    color: var(--font-light-color);
}
.mode-dark .eg-check-label {
    color: var(--font-dark-color);
}
.eg-error {
    color: var(--danger-color);
    font-size: 0.85rem;
    margin-top: 0.3rem;
    min-height: 1em;
}
.eg-form-error {
    text-align: center;
    font-weight: 600;
    margin-top: 0.5rem;
}
.eg-actions {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: 0.75rem;
    margin-top: 1.5rem;
}
.eg-btn {
    font-family: 'Poppins', system-ui, sans-serif;
    font-weight: 700;
    padding: 0.6rem 1.4rem;
    border-radius: 999px;
    border: 2px solid transparent;
    cursor: pointer;
    transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease;
}
.eg-btn-next,
.eg-btn-submit {
    background: var(--accent-orange);
    color: var(--font-white, #ffffff);
}
.eg-btn-next:hover,
.eg-btn-submit:hover,
.eg-btn-next:focus-visible,
.eg-btn-submit:focus-visible {
    background: var(--accent-dark-orange);
}
.eg-btn-next[disabled],
.eg-btn-submit[disabled] {
    opacity: 0.6;
    cursor: default;
}
.eg-btn-back {
    margin-right: auto;
    background: transparent;
    border-color: rgba(0, 0, 0, 0.2);
    color: var(--font-light-color);
}
.eg-btn-back:hover,
.eg-btn-back:focus-visible {
    border-color: var(--accent-orange);
    color: var(--accent-orange);
}
.mode-dark .eg-btn-back {
    color: var(--font-dark-color);
    border-color: rgba(255, 255, 255, 0.25);
}
.eg-modal-dialog {
    max-width: 560px;
}
.eg-modal-close {
    position: absolute;
    top: 0.85rem;
    right: 0.85rem;
    z-index: 2;
}
@media (prefers-reduced-motion: reduce) {
    .eg-btn,
    .eg-input {
        transition: none;
    }
}

/* ===== Engagement Flows popup (.ef-*) — mirrors the entry-gate modal styling ===== */
.ef-modal .modal-dialog { max-width: 480px; }
.ef-content {
    border: none;
    border-radius: 16px;
    background: var(--bg-light-secondary);
    color: var(--font-light-color);
}
.mode-dark .ef-content {
    background: var(--bg-dark-secondary);
    color: var(--font-dark-color);
}
.ef-body {
    padding: 1.75rem 1.5rem;
    position: relative;
}
.ef-close {
    position: absolute;
    top: 0.85rem;
    right: 0.85rem;
    z-index: 2;
}
.ef-steps .ef-step[hidden] { display: none; }
.ef-heading {
    font-family: 'Poppins', system-ui, sans-serif;
    font-weight: 800;
    font-size: 1.5rem;
    color: var(--heading-light-color);
    margin-bottom: 0.5rem;
}
.mode-dark .ef-heading { color: var(--font-dark-color); }
.ef-text {
    color: var(--font-light-color);
    opacity: 0.9;
    margin-bottom: 0.5rem;
}
.mode-dark .ef-text { color: var(--font-dark-color); }
.ef-media { margin-bottom: 1rem; }
.ef-img { max-height: 240px; border-radius: 12px; }
.ef-actions { margin-top: 1rem; }
.ef-cta,
.ef-submit {
    background: var(--accent-orange);
    border-color: var(--accent-orange);
}
.ef-cta:hover,
.ef-submit:hover {
    background: var(--accent-dark-orange, var(--accent-orange));
    border-color: var(--accent-dark-orange, var(--accent-orange));
    filter: brightness(0.96);
}
.ef-form { text-align: left; }
.ef-form-error {
    color: var(--danger-color);
    font-size: 0.9rem;
    margin: 0.5rem 0;
    min-height: 1.1em;
}
.ef-stars {
    display: flex;
    justify-content: center;
    gap: 0.35rem;
    margin: 0.75rem 0;
}
.ef-star {
    background: none;
    border: none;
    font-size: 2.1rem;
    line-height: 1;
    cursor: pointer;
    color: rgba(0, 0, 0, 0.18);
    transition: color 0.12s ease, transform 0.12s ease;
    padding: 0 0.1rem;
}
.mode-dark .ef-star { color: rgba(255, 255, 255, 0.22); }
.ef-star:hover,
.ef-star:focus-visible {
    color: var(--accent-orange);
    outline: none;
    transform: scale(1.12);
}
.ef-stars:hover .ef-star { color: var(--accent-orange); }
.ef-stars .ef-star:hover ~ .ef-star { color: rgba(0, 0, 0, 0.18); }
.mode-dark .ef-stars .ef-star:hover ~ .ef-star { color: rgba(255, 255, 255, 0.22); }
.ef-fb-thanks-text {
    font-weight: 600;
    color: var(--heading-light-color);
    margin: 0.5rem 0;
}
.mode-dark .ef-fb-thanks-text { color: var(--font-dark-color); }
.ef-fb-review { margin-top: 0.5rem; }
.ef-fb-review-prompt {
    color: var(--font-light-color);
    opacity: 0.9;
    margin-bottom: 0.5rem;
}
.mode-dark .ef-fb-review-prompt { color: var(--font-dark-color); }

/* ============================================================================
   Gallery-level "Share this gallery" row (album_select, below the location-card)
   Icon buttons reuse the existing .social color/glow; this adds the row layout,
   the circular touch targets, the custom-icon img sizing, and the copy toast.
   Theme-variable driven; light + dark. The a11y "Show labels" pill rules
   (body.a11y-show-labels .a11y-labelable) override these when active.
   ============================================================================ */
.gallery-share-row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.35rem 0.5rem;
}
.gallery-share-label {
    font-family: 'Poppins', sans-serif;
    font-weight: 600;
    font-size: 0.95rem;
    color: var(--font-light-color);
    margin-right: 0.35rem;
}
.mode-dark .gallery-share-label {
    color: var(--font-dark-color);
}
.gallery-share-btns {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
}
.gallery-share-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    padding: 0;
    border: 1px solid transparent;
    border-radius: 50%;
    background-color: transparent;
    text-decoration: none;
    cursor: pointer;
    transition: background-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}
.gallery-share-btn:hover,
.gallery-share-btn:focus-visible {
    background-color: var(--accent-orange);
    transform: translateY(-2px);
    box-shadow: 0 4px 12px color-mix(in srgb, var(--accent-orange) 35%, transparent);
}
/* On hover the circle fills with the accent — flip the icon to white so it reads */
.gallery-share-btn:hover .social,
.gallery-share-btn:focus-visible .social {
    color: var(--font-white);
}
.gallery-share-btn:focus-visible {
    outline: 2px solid var(--accent-orange);
    outline-offset: 2px;
}
.gallery-share-btn .social {
    font-size: 1.15rem;
    line-height: 1;
}
.gallery-share-btn img {
    width: 24px;
    height: 24px;
    object-fit: contain;
}

/* "Link copied!" confirmation toast (copy-link + Instagram instructions) */
.share-copy-toast {
    position: fixed;
    left: 50%;
    bottom: 24px;
    transform: translateX(-50%) translateY(20px);
    background-color: var(--accent-green);
    color: var(--font-white);
    font-family: 'Manrope', sans-serif;
    font-weight: 600;
    font-size: 0.9rem;
    padding: 0.6rem 1.1rem;
    border-radius: 999px;
    box-shadow: 0 6px 22px rgba(0, 0, 0, 0.18);
    opacity: 0;
    pointer-events: none;
    z-index: 1080;
    transition: opacity 0.2s ease, transform 0.2s ease;
}
.share-copy-toast.show {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}
/* ===================================================================
   Friendly notice page (views/shared/notice.php)
   Themed business-state messages (registration closed, gallery/event
   not found, access code disabled/expired) rendered instead of the bare
   CodeIgniter error page. Theme-variable driven; light + .mode-dark.
   =================================================================== */
.pt-notice-wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 40px 16px;
}
.pt-notice-shell {
    width: 100%;
    max-width: 560px;
    margin: 0 auto;
}
.pt-notice-card {
    background: var(--bg-light-secondary);
    color: var(--font-light-color);
    border-radius: 18px;
    padding: 44px 34px;
    text-align: center;
    box-shadow: 0 18px 50px rgba(0, 0, 0, 0.18);
}
.mode-dark .pt-notice-card {
    background: var(--bg-dark-secondary);
    color: var(--font-dark-color);
}
.pt-notice-logo {
    max-width: 180px;
    max-height: 90px;
    object-fit: contain;
    margin-bottom: 20px;
}
.pt-notice-icon {
    font-size: 2.7rem;
    line-height: 1;
    margin-bottom: 16px;
    color: var(--accent-orange);
}
.pt-notice-title {
    font-family: 'Poppins', sans-serif;
    font-weight: 800;
    font-size: 1.6rem;
    margin-bottom: 12px;
    color: inherit;
}
.pt-notice-body {
    font-size: 1.02rem;
    line-height: 1.55;
    color: inherit;
    opacity: 0.88;
    margin-bottom: 28px;
    white-space: normal;
}
.pt-notice-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    justify-content: center;
}
.pt-notice-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 11px 24px;
    border-radius: 999px;
    font-weight: 700;
    text-decoration: none;
    transition: transform 0.15s ease, box-shadow 0.15s ease,
                background-color 0.15s ease, color 0.15s ease;
}
.pt-notice-btn--primary {
    background: var(--accent-orange);
    color: var(--font-white, #fff);
    border: 2px solid var(--accent-orange);
}
.pt-notice-btn--primary:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);
    color: var(--font-white, #fff);
}
.pt-notice-btn--ghost {
    background: transparent;
    color: var(--accent-orange);
    border: 2px solid var(--accent-orange);
}
.pt-notice-btn--ghost:hover {
    background: var(--accent-orange);
    color: var(--font-white, #fff);
    transform: translateY(-2px);
}
@media (prefers-reduced-motion: reduce) {
    .pt-notice-btn:hover { transform: none; }
}

/* =========================================================================
   PHOTO REPORT (Stage 4b) — "report a problem" select flow + review strip.
   Self-contained .ptr-* namespace (album_select loads style.css, not
   page-support.css). Theme-variable driven; light + .mode-dark.
   ========================================================================= */

/* Trigger — a small, low-weight control in the bottom #prepaid-footer bar.
   Mobile: a centered, low-weight flag + text link. Desktop (≥768px): collapses
   to just the flag tucked on the right; the text rolls open on hover/focus. */
.ptr-footer-link {
    display: inline-flex;
    align-items: center;
    background: transparent;
    border: 0;
    color: var(--prepaid-font-color, #555);
    opacity: .72;
    padding: 4px 8px 2px;
    margin-top: 2px;
    font-size: .78rem;
    line-height: 1.2;
    text-decoration: none;
    transition: opacity .15s, text-decoration-color .15s;
}
.ptr-footer-link:hover,
.ptr-footer-link:focus-visible {
    opacity: 1;
    text-decoration: underline;
    color: var(--prepaid-font-color, #555);
}
.ptr-footer-link i { font-size: .72rem; }
.ptr-flag-text { margin-left: 4px; }

/* Desktop: hide the text behind the flag, reveal it on hover/focus. */
@media (min-width: 768px) {
    .ptr-footer-link {
        opacity: .5;
        padding: 5px 7px;
        border-radius: 14px;
    }
    .ptr-footer-link:hover,
    .ptr-footer-link:focus-visible {
        opacity: 1;
        text-decoration: none;
        background: color-mix(in srgb, var(--prepaid-font-color, #555) 12%, transparent);
    }
    .ptr-footer-link i { font-size: .8rem; }
    .ptr-flag-text {
        display: inline-block;
        max-width: 0;
        margin-left: 0;
        overflow: hidden;
        white-space: nowrap;
        opacity: 0;
        transition: max-width .35s ease, opacity .25s ease, margin-left .35s ease;
    }
    .ptr-footer-link:hover .ptr-flag-text,
    .ptr-footer-link:focus-visible .ptr-flag-text {
        max-width: 260px;
        margin-left: 5px;
        opacity: 1;
    }
}

/* Float the trigger just ABOVE the #prepaid-footer bar. Absolute against the
   fixed footer (bottom:100% = the footer's top edge), so it's lifted out of the
   bar's flow — it adds no height to the bar and isn't visually "part of" it, but
   still rides with the bar as it slides. The full-width strip is click-through
   (pointer-events:none) except the flag itself, so it never blocks the gallery. */
#prepaid-footer .ptr-report-float {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 100%;
    margin: 0 0 6px;        /* small gap above the bar; neutralizes .row negative margins */
    padding: 0 14px;
    pointer-events: none;
    z-index: 1;
}
#prepaid-footer .ptr-report-float .ptr-footer-link {
    pointer-events: auto;
    opacity: 1;
    background: rgba(255, 255, 255, .92);
    border-radius: 16px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, .18);
    color: #555;
}
#prepaid-footer .ptr-report-float .ptr-footer-link i { color: var(--accent-orange, #e8590c); }

/* Modal photo picker — universal selection UI (works on every gallery layout) */
.ptr-pick { margin-bottom: 16px; }
.ptr-pick-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(72px, 1fr));
    gap: 8px;
    max-height: 40vh;
    overflow-y: auto;
    padding: 6px;
    border: 1px solid var(--overlay-border, rgba(0,0,0,.12));
    border-radius: 10px;
}
.mode-dark .ptr-pick-grid { border-color: rgba(255,255,255,.14); }
.ptr-pick-tile {
    position: relative;
    padding: 0; border: 0; background: none;
    border-radius: 8px; overflow: hidden;
    aspect-ratio: 1 / 1;
    cursor: pointer;
}
.ptr-pick-tile img { width: 100%; height: 100%; object-fit: cover; display: block; transition: opacity .12s ease; }
.ptr-pick-tile.is-selected { outline: 3px solid var(--accent-orange); outline-offset: -3px; }
.ptr-pick-tile.is-selected img { opacity: .55; }
.ptr-pick-check {
    position: absolute; top: 4px; right: 4px;
    width: 22px; height: 22px; line-height: 22px; text-align: center;
    border-radius: 50%;
    background: var(--accent-orange); color: var(--font-white, #fff);
    font-weight: 800; font-size: .8rem;
    opacity: 0; transform: scale(.6); transition: opacity .12s ease, transform .12s ease;
}
.ptr-pick-tile.is-selected .ptr-pick-check { opacity: 1; transform: scale(1); }
.ptr-pick-count { margin: 8px 0 0; font-size: .85rem; color: var(--font-light-color, #777); }
.mode-dark .ptr-pick-count { color: var(--font-dark-color, #bbb); }

/* Buttons */
.ptr-btn {
    border: 1px solid var(--accent-orange);
    border-radius: 999px;
    padding: 9px 20px;
    font-weight: 600;
    background: transparent;
    color: var(--accent-orange);
    transition: background .15s, color .15s, opacity .15s;
}
.ptr-btn--primary { background: var(--accent-orange); color: var(--font-white, #fff); }
.ptr-btn--primary:hover { background: var(--accent-dark-orange, var(--accent-orange)); }
.ptr-btn--ghost { border-color: var(--overlay-border, rgba(0,0,0,.2)); color: var(--font-light-color, #555); }
.mode-dark .ptr-btn--ghost { color: var(--font-dark-color, #ddd); border-color: rgba(255,255,255,.25); }
.ptr-btn--sm { padding: 6px 16px; font-size: .88rem; }
.ptr-btn:disabled { opacity: .5; cursor: not-allowed; }

/* Reason modal */
.ptr-modal { border-radius: 16px; }
.ptr-label { display: block; font-size: .8rem; text-transform: uppercase; letter-spacing: .04em; color: var(--font-light-color, #777); font-weight: 700; margin-bottom: 8px; }
.mode-dark .ptr-label { color: var(--font-dark-color, #bbb); }
.ptr-reasons { border: 0; padding: 0; margin: 0 0 8px; }
.ptr-reason { display: flex; align-items: flex-start; gap: 10px; padding: 12px; border: 1px solid var(--overlay-border, rgba(0,0,0,.12)); border-radius: 12px; margin-bottom: 8px; cursor: pointer; }
.ptr-reason input { margin-top: 4px; }
.ptr-reason strong { display: block; }
.ptr-reason small { display: block; color: var(--font-light-color, #777); }
.mode-dark .ptr-reason { border-color: rgba(255,255,255,.14); }
.mode-dark .ptr-reason small { color: var(--font-dark-color, #aaa); }
.ptr-subs { margin: 4px 0 14px; }
.ptr-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.ptr-chip { border: 1px solid var(--overlay-border, rgba(0,0,0,.2)); background: transparent; color: var(--font-light-color, #555); border-radius: 999px; padding: 6px 14px; font-size: .85rem; transition: background .12s, color .12s; }
.ptr-chip.is-active { background: var(--accent-orange); border-color: var(--accent-orange); color: var(--font-white, #fff); }
.mode-dark .ptr-chip { color: var(--font-dark-color, #ddd); border-color: rgba(255,255,255,.25); }
.ptr-field { margin-top: 14px; }
.ptr-field label { display: block; font-weight: 600; margin-bottom: 5px; }
.ptr-error { margin-top: 12px; color: var(--danger-color, #c0392b); font-weight: 600; }
.ptr-done-icon { font-size: 3rem; color: var(--accent-green, #2cb6a7); margin-bottom: 8px; }

/* Review strip — "submitted for review" */
.ptr-review-head { font-size: 1.2rem; font-weight: 700; color: var(--heading-color, inherit); }
.ptr-review-sub { font-size: .92rem; max-width: 560px; margin: 4px auto 18px; }
.ptr-review-grid { max-width: 1000px; margin: 0 auto; }
.ptr-review-tile { position: relative; border-radius: 10px; overflow: hidden; }
.ptr-review-tile img { width: 100%; filter: grayscale(.4) opacity(.7); display: block; }
.ptr-review-badge { position: absolute; left: 6px; bottom: 6px; background: rgba(0,0,0,.7); color: #fff; font-size: .72rem; padding: 3px 8px; border-radius: 6px; }

@media (prefers-reduced-motion: reduce) {
    .ptr-footer-link, .ptr-flag-text, .ptr-btn, .ptr-chip, .ptr-pick-tile img, .ptr-pick-check { transition: none; }
}

/* Square digital wallets (Apple Pay / Google Pay) on checkout.
   Google Pay's attach() renders its own official button; Apple Pay needs the
   native button appearance (renders only in Safari with Apple Pay available). */
.sq-apple-pay {
    -webkit-appearance: -apple-pay-button;
    -apple-pay-button-type: plain;
    -apple-pay-button-style: black;
    height: 44px;
    width: 100%;
    cursor: pointer;
    border-radius: 6px;
}
.sq-wallet-divider { text-align: center; }

.gallery-share-row.gs-armed {
    opacity: 0;
    transform: scale(0.82);
}
.gallery-share-row.gs-armed .gallery-share-btn { opacity: 0; }
/* The scrim/label pill grows in... */
.gallery-share-row.gs-run {
    animation: gsRowGrow 0.55s cubic-bezier(0.34, 1.56, 0.64, 1) backwards;
}
@keyframes gsRowGrow {
    0%   { opacity: 0; transform: scale(0.55); }
    60%  { opacity: 1; }
    100% { opacity: 1; transform: scale(1); }
}
/* ...and the icons roll out within it, slightly behind the pill. */
.gallery-share-row.gs-run .gallery-share-btn {
    animation: gsRollIn 0.62s cubic-bezier(0.34, 1.56, 0.64, 1) backwards;
}
@keyframes gsRollIn {
    0%   { opacity: 0; transform: translateX(-28px) rotate(-220deg) scale(0.4); background-color: var(--accent-orange); }
    55%  { opacity: 1; transform: translateX(0) rotate(0deg) scale(1.12);       background-color: var(--accent-orange); }
    78%  { transform: scale(1);                                                 background-color: var(--accent-orange); }
    100% { opacity: 1; transform: none;                                         background-color: transparent; }
}
@media (prefers-reduced-motion: reduce) {
    .gallery-share-row.gs-armed,
    .gallery-share-row.gs-run { opacity: 1; transform: none; animation: none; }
    .gallery-share-row.gs-armed .gallery-share-btn,
    .gallery-share-row.gs-run .gallery-share-btn { opacity: 1; animation: none; }
}

/* "Link copied!" confirmation toast (copy-link + Instagram instructions) */
.share-copy-toast {
    position: fixed;
    left: 50%;
    bottom: 24px;
    transform: translateX(-50%) translateY(20px);
    background-color: var(--accent-green);
    color: var(--font-white);
    font-family: 'Manrope', sans-serif;
    font-weight: 600;
    font-size: 0.9rem;
    padding: 0.6rem 1.1rem;
    border-radius: 999px;
    box-shadow: 0 6px 22px rgba(0, 0, 0, 0.18);
    opacity: 0;
    pointer-events: none;
    z-index: 1080;
    transition: opacity 0.2s ease, transform 0.2s ease;
}
.share-copy-toast.show {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}

/* ============================================================================
   Landscape-hero location card — when the hero is WIDE, stack it full-width on
   top with a compact info strip below ([big theme icon] | Title / date·photos +
   prepaid/downloads pill). Detected server-side (.hero-landscape on
   .location-card). Portrait/square + mobile keep the side-by-side layout — the
   .loc-textwrap / .loc-meta wrappers are neutral there (they just reproduce the
   existing centered column). The landscape overrides use !important only where
   needed to beat Bootstrap's utility !important (.flex-column / .w-100 / margins).
   ============================================================================ */
.loc-hero-col { height: 425px; }            /* was an inline style; moved here so landscape can relax it */
.loc-textwrap { width: 100%; display: flex; flex-direction: column; align-items: center; }
.loc-meta     { display: flex; flex-direction: column; align-items: center; }

@media (min-width: 768px) {
    /* The card height is FIXED (456px ≥993px) and the hero size is the photographer's
       spec — so we DON'T grow the card; we shrink the hero a little and pack the info
       strip tight so the icon + title + date·photos + ents pill all fit beneath it.
       The stack is top-packed so it stays clear of the chevron pinned at the bottom border. */
    .location-card.hero-landscape .card-body { display: flex; flex-direction: column; justify-content: flex-start; padding: 1.5rem 1rem 1.5rem; }
    .location-card.hero-landscape .card-body > .row { width: 100%; align-items: center; row-gap: 1.5rem; }   /* breathing room hero -> title */
    .location-card.hero-landscape .loc-hero-col,
    .location-card.hero-landscape .loc-info-col { flex: 0 0 100%; max-width: 100%; width: 100%; }
    .location-card.hero-landscape .loc-hero-col { height: auto; padding-bottom: 0; }
    .location-card.hero-landscape .heroImage    { max-height: 255px; }   /* tunable — smaller hero = more room for the strip + pill */
    /* info column becomes a compact horizontal strip: [icon] [title / date·photos·pill] */
    .location-card.hero-landscape .loc-info-col {
        flex-direction: row !important;
        flex-wrap: wrap;
        align-items: center !important;
        justify-content: center !important;
        text-align: left;
        gap: 0.25rem 1rem;
    }
    .location-card.hero-landscape .loc-icon-wrap { margin: 0 !important; flex: 0 0 auto; }
    .location-card.hero-landscape #themeIcon     { max-height: 60px; max-width: 88px; }
    .location-card.hero-landscape .loc-textwrap  { width: auto; align-items: flex-start; flex: 0 1 auto; gap: 0; }   /* date hugs the title */
    .location-card.hero-landscape .loc-textwrap > div { margin: 0 !important; }   /* kill the title wrapper's mt-4/mb-2 (the big gap) + meta margins */
    .location-card.hero-landscape .loc-textwrap h1 { margin: 0 !important; font-size: 1.55rem; line-height: 1.15; }
    /* date · photos · ents pill, all inline + compact */
    .location-card.hero-landscape .loc-meta { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 0.25rem 0.5rem; }
    .location-card.hero-landscape .loc-meta > div { margin: 0 !important; }
    .location-card.hero-landscape .loc-meta .gallery-counts { width: auto !important; display: flex; flex-wrap: nowrap; align-items: center; gap: 0.25rem 0.5rem; }
    /* Compact the chips: the generic `.gallery-counts div { min-width:44% }` forces each
       item to ~half width, which shoved the pill onto its own line. Reset it so
       "4 Photos" + the pill sit inline in the horizontal strip. */
    .location-card.hero-landscape .loc-meta .gallery-counts > div { margin: 0 !important; min-width: 0 !important; }
    .location-card.hero-landscape .loc-meta .gallery-counts br { display: none; }
    .location-card.hero-landscape .loc-meta .gallery-counts p { font-size: 0.9rem; }
    .location-card.hero-landscape .loc-meta .prepaid { font-size: 0.82rem; padding: 0.1rem 0.5rem; }
    .location-card.hero-landscape .loc-meta .prepaid p { font-size: 0.82rem; }
    .location-card.hero-landscape .loc-date { font-size: 0.9rem; }
    .location-card.hero-landscape .loc-date::after { content: '\00b7'; margin-left: 0.5rem; opacity: 0.5; }
    /* scroll chevron pulled out of the strip flow + pinned bottom-center. It's positioned
       against the Bootstrap .col (loc-info-col, which is position:relative) — i.e. just
       below the info strip, not the full card — and the bounce animation dips it +10px at
       its 50% peak, so it needs a deep negative bottom to sit on the card's bottom border.
       Centered via margin-left (not transform) so the bounce's transform is untouched.
       Tunable: bottom (deeper = lower on/over the border). */
    .location-card.hero-landscape #scrollButton { position: absolute; left: 50%; margin-left: -25px; bottom: -50px; }
}

/* lg+ : the fixed-height (456px) card has the room, so give the landscape hero +50px. */
@media (min-width: 992px) {
    .location-card.hero-landscape .heroImage { max-height: 305px; }
}

/* Mobile: keep the existing stacked layout, just tighten the big vertical gaps. */
@media (max-width: 767.98px) {
    .loc-icon-wrap { margin-bottom: 0.75rem !important; }
    .loc-textwrap h1 { margin-top: 0.5rem !important; }
    .loc-textwrap .gallery-counts { margin-bottom: 0.5rem !important; }
    /* the title already carries a bottom margin — kill the date's doubled top gap, and
       drop the trailing <br> dead space below the counts so the stacked rhythm is tight. */
    .loc-textwrap .loc-date { margin-top: 0.25rem !important; }
    .location-card:not(.hero-landscape) .gallery-counts br { display: none; }
    /* a WIDE hero in the tall 425px hero column leaves big dead space on mobile — let the
       column shrink to the image + cap it, so a LANDSCAPE card is compact (portrait keeps 425). */
    .location-card.hero-landscape .loc-hero-col { height: auto; }
    .location-card.hero-landscape .heroImage    { max-height: 240px; }
}

/* ============================================================================
   Location-card intro — the whole card content starts faded out (social-share's
   sibling pattern; armed by album_select JS as .loc-card-armed) and fades in
   once the hero image has loaded, as a gentle staggered rise (hero, then info).
   One client-side reveal — no per-element or modal gating. Orientation
   (.hero-landscape) is also set client-side from the loaded image. Reduced motion
   shows it instantly (backstop below); a JS hard-fallback never leaves it hidden.
   ============================================================================ */
.location-card.loc-card-armed .loc-hero-col,
.location-card.loc-card-armed .loc-info-col { opacity: 0; }
.location-card.loc-card-in .loc-hero-col { animation: locCardIn 0.6s cubic-bezier(0.22, 1, 0.36, 1) both; }
.location-card.loc-card-in .loc-info-col { animation: locCardIn 0.6s cubic-bezier(0.22, 1, 0.36, 1) 0.12s both; }
@keyframes locCardIn {
    0%   { opacity: 0; transform: translateY(16px) scale(0.98); }
    100% { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
    .location-card.loc-card-armed .loc-hero-col,
    .location-card.loc-card-armed .loc-info-col,
    .location-card.loc-card-in .loc-hero-col,
    .location-card.loc-card-in .loc-info-col { opacity: 1; animation: none; }
}

/* Claim & donate cards (full-entitlement claim verify gate + optional donation) */
.pt-claim-card {
    max-width: 560px;
}

/* ---------------------------------------------------------------------------
   CLAIM GATE modal (#ptClaimModal) — the hard, non-dismissible gate shown when
   entitlements cover the ENTIRE gallery. Deliberately large/loud: it is the only
   thing on screen until the customer claims. Theme-variable driven (light + dark).
   --------------------------------------------------------------------------- */
.pt-claim-modal .modal-content {
    border: none;
    border-radius: 20px;
    padding: 8px;
    background-color: var(--bg-light-secondary);
    color: var(--font-light-color);
    box-shadow: 0 18px 60px rgba(0, 0, 0, 0.35);
}

.mode-dark .pt-claim-modal .modal-content {
    background-color: var(--bg-dark-secondary);
    color: var(--font-dark-color);
}

.pt-claim-modal .modal-body {
    padding: 32px 28px 28px;
}

/* The logo is a block on its OWN line — an inline-block <img> would let the gift
   icon flow up beside it. Icon then sits centred on the next line. */
.pt-claim-modal .pt-claim-logo {
    display: block;
    max-width: 220px;
    max-height: 90px;
    margin-left: auto;
    margin-right: auto;
    object-fit: contain;
}

.pt-claim-modal .pt-claim-icon {
    margin-bottom: 12px;
}

.pt-claim-modal .pt-claim-title {
    font-family: 'Poppins', sans-serif;
    font-weight: 800;
    font-size: 2rem;
    line-height: 1.15;
    color: var(--heading-light-color);
    margin-bottom: 10px;
}

.mode-dark .pt-claim-modal .pt-claim-title {
    color: var(--heading-dark-color);
}

.pt-claim-modal .pt-claim-sub {
    font-size: 1.1rem;
    max-width: 520px;
    margin: 0 auto;
}

.pt-claim-modal .pt-claim-fields .form-label {
    font-weight: 600;
    font-size: 0.9rem;
    margin-bottom: 4px;
}

.pt-claim-modal .pt-claim-note {
    font-size: 0.85rem;
    opacity: 0.75;
    margin-bottom: 0;
}

/* Full-screen on phones/tablets: the gate should feel unavoidable, not a card. */
@media (max-width: 767.98px) {
    .pt-claim-modal .modal-content {
        border-radius: 0;
        justify-content: center;
    }

    .pt-claim-modal .pt-claim-title {
        font-size: 1.6rem;
    }
}

/* ---------------------------------------------------------------------------
   GALLERY SURFACE (#main) — restores the solid theme surface behind the
   sticky nav / products / gallery grid.

   History: until 2026-07-21 the <body> carried NO style attribute, so the page
   sat on the theme's flat colour and only the hero wrapper (.location-container)
   painted the photographer's backgroundcdn. Commit dd0810e ("Gallery: actually
   render the configured background image") emitted backgroundImage/Color/Style
   inline onto <body> so a configured background would actually show — correct for
   the hero, but it also painted the image behind #main, so the grid lost its
   solid panel and the photos ended up sitting directly on the pattern.

   #main starts AFTER the "ENDS BACKGROUND IMAGE" wrapper, so giving it the theme
   surface restores the original look (grid matches .location-card) while the
   hero + page edges keep the configured background image. Same vars as
   .location-card so the two can never drift apart.
   --------------------------------------------------------------------------- */
/* The surface spans the WHOLE column below the hero: #main (sticky nav, products,
   gallery grid) AND the footer block that follows it (donation card, footer text,
   footer actions). Before 2026-07-21 the body itself was this colour, so the two
   read as one continuous panel; painting only #main left the donation/footer area
   sitting on the raw background image with a hard edge under the last row.

   --pt-surface-bg / --pt-surface-bg-dark are photographer-overridable through the
   existing custom-theme-vars admin control (ThemeResolver::$allowedCustomThemeVars),
   so the hex can be set per cascade level with no migration. Unset = follow the
   theme surface, i.e. the same colour as .location-card.

   The final literal is a last-resort fallback for an UNDEFINED var only — a
   photographer who deliberately sets a transparent colour still wins. */
#main,
#main + footer.footer {
    background-color: var(--pt-surface-bg, var(--bg-color, var(--bg-light-color, #faf9f6)));
}

.mode-dark #main,
.mode-dark #main + footer.footer {
    background-color: var(--pt-surface-bg-dark, var(--bg-dark-color, #2a2a2a));
}

/* Contain child margins at BOTH sides of the #main/footer junction, or they
   collapse out and leave an unpainted stripe that the last row of images appears
   to hang over: #main's last grid carries mb-5, and the footer's inner
   .container-fluid carries mt-4 (which escapes <footer>, so painting the footer
   alone did not close the gap). flow-root contains both with zero layout shift —
   the spacing is unchanged, it is simply inside the painted box now. Unlike
   overflow it does not create a scroll container, so the sticky secondary nav
   inside #main keeps working.

   The small padding-bottom is belt-and-braces for the last row itself: it keeps
   the tiles clear of the panel edge even if a tile overflows its grid slightly. */
#main,
#main + footer.footer {
    display: flow-root;
}

#main {
    /* Breathing room under the last row of photos so the grid never runs up
       against the footer block, and the fixed products/offer bar has somewhere
       to sit without crowding the final row. */
    padding-bottom: 3rem;
}

/* Clear the fixed bottom bar (#prepaid-footer) so the last footer control isn't
   sitting underneath it. */
#main + footer.footer {
    padding-bottom: 4.5rem;
}

/* ---------------------------------------------------------------------------
   GALLERY TILE LIFT — a soft shadow so each photo reads as a separate print
   sitting ON the panel, rather than a flat patch of it. Deliberately NOT
   Bootstrap's .shadow-sm: that is a fixed rgba black, which is invisible on a
   dark theme and ignores the photographer's palette. --shadow-color is defined
   by every theme and is photographer-overridable; color-mix softens it to a
   believable depth (the raw var is 0.3-0.6 alpha, far too heavy at rest).

   No hover transform on purpose: gallery-loupe.js measures tile rects on hover,
   so moving the tile would misalign the magnifier.
   --------------------------------------------------------------------------- */
.gallery-item .product-image {
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
    box-shadow: 0 2px 6px color-mix(in srgb, var(--shadow-color) 28%, transparent);
}

.gallery-item .product-image:hover {
    box-shadow: 0 6px 16px rgba(0, 0, 0, 0.18);
    box-shadow: 0 6px 16px color-mix(in srgb, var(--shadow-color) 42%, transparent);
}

/* Shadows read weaker against a dark surface — give them a little more presence. */
.mode-dark .gallery-item .product-image {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
    box-shadow: 0 2px 8px color-mix(in srgb, var(--shadow-color) 55%, transparent);
}

.mode-dark .gallery-item .product-image:hover {
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.6);
    box-shadow: 0 6px 18px color-mix(in srgb, var(--shadow-color) 70%, transparent);
}

/* ---------------------------------------------------------------------------
   MASONRY GALLERY — gallery/gallerydownloads only.

   Opt-in via data-masonry="1" on the container (see gallery.js). Every other
   gallery on the site keeps its Bootstrap .row grid.

   The container is a grid of very short rows; each tile spans however many of
   them its photo needs, so columns pack independently instead of every tile in
   a row being stretched to the tallest. gallery.js computes the span.

   row-gap is deliberately 0: a tile spanning N rows would otherwise swallow
   N-1 gaps. The vertical spacing is carried inside the span instead, which is
   why align-items is start — the tile keeps its natural height and the spare
   rows below it become the gutter.
   --------------------------------------------------------------------------- */
.gallery-masonry {
    --pt-masonry-cols: 3;
    --pt-masonry-row: 8px;      /* span unit — smaller is more precise, more spans */

    display: grid;
    grid-template-columns: repeat(var(--pt-masonry-cols), minmax(0, 1fr));
    grid-auto-rows: var(--pt-masonry-row);
    column-gap: 1.5rem;
    row-gap: 0;
    align-items: start;
}

/* Every direct child, not just .gallery-item — owned-tiles.js moves purchased
   photos into this same grid wrapped in <a class="lightbox-link">, so the grid
   item is sometimes the anchor rather than the tile. */
.gallery-masonry > * {
    /* Seeded before the photo loads, corrected from the real height after.
       The fallback covers the frame between append and the first measure. */
    grid-row-end: span var(--pt-tile-span, 40);
    min-width: 0;               /* let a wide photo shrink to its column */
}

/* The tile wrapper is .d-inline-block; in a grid cell that leaves a small
   photo sitting left of centre. .text-center on the tile handles the rest. */
.gallery-masonry .gallery-item > .position-relative {
    max-width: 100%;
}

/* Tighter gutter where the columns are already narrow. */
@media (max-width: 767.98px) {
    .gallery-masonry {
        column-gap: 0.75rem;
    }
}

/* Someone who has asked for less motion should not get tiles sliding as spans
   are corrected mid-scroll. */
@media (prefers-reduced-motion: reduce) {
    .gallery-masonry > * {
        transition: none;
    }
}

/* ---------------------------------------------------------------------------
   OWNED-PHOTO ("Your Photos") AFFORDANCES — theme accent driven.
   Replaces Bootstrap's hardcoded .text-success / .btn-success greens, which
   ignored the photographer's theme entirely. --accent-green is defined by every
   theme file (and is photographer-overridable), so these follow the brand.
   --------------------------------------------------------------------------- */
.pt-owned-icon {
    color: var(--accent-green, var(--accent-orange));
}

.pt-btn-owned {
    background-color: var(--accent-green, var(--accent-orange));
    border: 1px solid var(--accent-green, var(--accent-orange));
    color: var(--font-white, #fff);
}

.pt-btn-owned:hover,
.pt-btn-owned:focus {
    background-color: var(--accent-dark-green, var(--accent-dark-orange));
    border-color: var(--accent-dark-green, var(--accent-dark-orange));
    color: var(--font-white, #fff);
}

.pt-btn-owned:focus-visible {
    outline: 3px solid var(--accent-light-green, var(--accent-light-orange));
    outline-offset: 2px;
}
/* Video rows carry a still poster like photos; layer the real player over it
   only when previewing so grids remain fast and visually stable. */
.gallery-item[data-media-type="video"] .position-relative { overflow: hidden; }
.pt-video-preview {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: 0;
    z-index: 2;
    background: #000;
    transition: opacity .18s ease;
}
.gallery-item.pt-video-playing .pt-video-preview { opacity: 1; }
.pt-video-play {
    position: absolute;
    inset: 50% auto auto 50%;
    transform: translate(-50%, -50%);
    width: 3.25rem;
    height: 3.25rem;
    border: 0;
    border-radius: 50%;
    color: #fff;
    background: rgba(0, 0, 0, .68);
    z-index: 4;
    box-shadow: 0 4px 18px rgba(0, 0, 0, .3);
}
.gallery-item.pt-video-playing .pt-video-play { opacity: .25; }
.gallery-item[data-media-type="video"] .add-item,
.gallery-item[data-media-type="video"] .added-item,
.gallery-item[data-media-type="video"] .badge-sm { z-index: 5; }
.pt-video-play:focus-visible { outline: 3px solid #fff; outline-offset: 3px; }
@media (hover: hover) and (pointer: fine) {
    .gallery-item[data-media-type="video"]:hover .pt-video-preview { opacity: 1; }
    .gallery-item[data-media-type="video"]:hover .pt-video-play { opacity: 0; pointer-events: none; }
}
@media (prefers-reduced-motion: reduce) {
    .pt-video-preview { transition: none; }
}

/* =========================================================================
   Branding-icon fallbacks — accounts with no bespoke artwork
   -------------------------------------------------------------------------
   The four per-photographer branding icons (page logo, location "theme" icon,
   entire-gallery icon, gallery-preview plate) used to resolve to
   /assets/img/{photographer}/*.png whether or not that file existed, so every
   account onboarded without an asset directory served broken images.

   They now resolve to '' (see pt_photographer_icon) and each render site
   substitutes a Font Awesome mark via pt_icon_html()/pt_preview_box_html(), or
   the JS equivalent in display-products.js / products-sidebar.js /
   mobile-product-sheet.js. The glyph carries the SAME class the image did, so
   the rules below only have to restore size and centering inside a box the
   existing layout already defines.

   Colors derive from the active theme's accent (all 14 themes define
   --accent-orange / --accent-light-orange), so these adapt rather than
   imposing a palette.
   ========================================================================= */

:root {
    /* Accent plate + a genuinely deeper ring for it. --accent-dark-* is the same
       hue at 0.7 alpha — lighter over the page, not richer — so the border is
       mixed toward black instead. Browsers without color-mix keep the flat
       fallback declared immediately above each use. */
    --pt-accent-plate: var(--accent-light-orange);
    --pt-accent-plate-border: var(--accent-orange);
    --pt-accent-plate-border: color-mix(in srgb, var(--accent-orange) 65%, #000);
}

.pt-icon-fallback {
    display: inline-block;
    line-height: 1;
    color: var(--accent-orange);
    font-size: 2.75rem;
    vertical-align: middle;
}

/* Logo slots (nav, checkout, modals). A logo is chrome, not content — keep it
   modest so a camera never competes with the photos. */
.pt-logo.pt-icon-fallback { font-size: 2.4rem; }

/* Purpose-made logos are square-ish; the account banner now stands in when there
   is no logo, and a banner is a wide letterbox. Clamp both so neither can blow
   out the narrow slots this class appears in. */
img.pt-logo {
    max-width: 100%;
    max-height: 96px;
    width: auto;
    height: auto;
    object-fit: contain;
}

/* Location card + cart empty state. The image box was 140x90. */
.themeIcon.pt-icon-fallback { font-size: 3.75rem; }

/* Entire-gallery mark. Sized per slot: the "best value" card gives it a large
   panel, the cart promo row a 60px thumb. */
.galleryIcon.pt-icon-fallback { font-size: 2.4rem; }
.best-value-container .galleryIcon.pt-icon-fallback,
.best-value-container .gallery-icon.pt-icon-fallback { font-size: 3rem; }
.cart-gallery-promo-img .galleryIcon.pt-icon-fallback { font-size: 2rem; }

/* Desktop product rail (96px slot) and the mobile sheet's thumbs, which carry a
   tinted rounded box on the class itself — center the glyph inside it. */
.rail-feature-img.pt-icon-fallback {
    font-size: 3.4rem;
    display: flex;
    align-items: center;
    justify-content: center;
}
.mps-trigger-thumb.pt-icon-fallback,
.mps-eg-thumb.pt-icon-fallback {
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.mps-trigger-thumb.pt-icon-fallback { font-size: 1.25rem; }
.mps-eg-thumb.pt-icon-fallback { font-size: 1.6rem; }

/* -------------------------------------------------------------------------
   Gallery-preview plate
   The one mark with no natural glyph: it is the backdrop the cart count sits
   on, not a picture. A square accent plate with a deeper ring reads as a
   deliberate design element where a missing image read as a bug.
   ------------------------------------------------------------------------- */
.pt-preview-box {
    display: block;
    aspect-ratio: 1 / 1;
    border-radius: 14px;
    background-color: var(--accent-light-orange);
    background-color: var(--pt-accent-plate);
    border: 4px solid var(--accent-orange);
    border-color: var(--pt-accent-plate-border);
    background-clip: padding-box;
}

/* Inside the populated-cart wrap the sibling .cart-preview-icon rule already
   fixes a 90x90 box; aspect-ratio would fight it, so let the box win. */
.cart-preview-icon.pt-preview-box { aspect-ratio: auto; }

/* =========================================================================
   LEGACY DIGITAL-DOWNLOAD PRODUCTS
   Older accounts sell plain "Digital Download" items — a flat price, no
   <pricelist>/<prepaid> XML, and no product artwork or <background>. They now
   render as ordinary products (see StorefrontComposer::isLegacyDigitalGroup),
   which leaves two gaps to fill: the empty product-image slot, and saying what
   a gallery photo becomes when one is selected.
   ========================================================================= */

/* (1) Product-image slot. Reuses the Phase 1 .pt-icon-fallback glyph, centred
   in whichever slot the <img> it replaced would have filled. */
.product-img.pt-icon-fallback,
.rail-prod-img.pt-icon-fallback,
.rail-topprod-img.pt-icon-fallback,
.mps-prod-img.pt-icon-fallback {
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.product-img.pt-icon-fallback { width: 64px; height: 64px; font-size: 2rem; }
.rail-prod-img.pt-icon-fallback { width: 46px; height: 46px; font-size: 1.4rem; }
.rail-topprod-img.pt-icon-fallback { width: 84px; height: 84px; margin: 0 auto 0.45rem; display: flex; font-size: 2.6rem; }
.mps-prod-img.pt-icon-fallback { width: 50px; height: 50px; font-size: 1.5rem; }

/* (2) Gallery-tile caption. There is no <background> in the product XML to
   align a mockup against, so the tile keeps the plain med-res photo and this
   says what buying it delivers. Sits bottom-left — the top-left corner is the
   photo number and the bottom-right is the add/remove control. Pointer-events
   off so it never intercepts the tile click. */
.pt-tile-label {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    max-width: calc(100% - 4rem);
    padding: 0.16rem 0.5rem;
    border-radius: 999px;
    background: rgba(0, 0, 0, 0.62);
    color: #fff;
    font-size: 0.68rem;
    font-weight: 700;
    line-height: 1.3;
    letter-spacing: 0.01em;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    pointer-events: none;
}
.pt-tile-label .fa-download { font-size: 0.72em; }

@media (max-width: 575.98px) {
    .pt-tile-label { font-size: 0.6rem; padding: 0.12rem 0.42rem; }
}

/* =========================================================================
   iOS save help — the floating "i" button and its hint bubble.

   Markup: application/views/shared/ios_save_help.php
   Behaviour: /assets/js/ios-save-help.js (reveals the wrapper only on iOS)

   iOS refuses to let a web page write into the Camera Roll, so a customer on
   an iPhone taps Download and appears to get nothing. The button has to stay
   findable while they scroll a long gallery, which is why it is fixed rather
   than sitting in the page flow.
   ========================================================================= */
.pt-ios-help-wrap {
    position: fixed;
    top: 0;
    right: 0;
    margin: 0.75rem;
    /* Above the sticky header and the cart drawer, below a modal backdrop so
       the help cannot cover its own dialog. */
    z-index: 1045;
}

.pt-ios-help-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 3.25rem;
    height: 3.25rem;
    padding: 0;
    border: 2px solid var(--font-white, #fff);
    border-radius: 50%;
    color: var(--font-white, #fff);
    background: var(--accent-orange, #ee513a);
    box-shadow: 0 4px 18px var(--shadow-color, rgba(0, 0, 0, .3));
    animation: pt-ios-help-wiggle 2.6s ease-in-out infinite;
}

.pt-ios-help-btn:hover,
.pt-ios-help-btn:focus {
    background: var(--accent-dark-orange, var(--accent-orange, #ee513a));
    color: var(--font-white, #fff);
}

.pt-ios-help-btn:focus-visible {
    outline: 3px solid var(--accessibility-blue, #0b5fff);
    outline-offset: 3px;
}

/* Read once already — present, but no longer competing with the photos. */
.pt-ios-help-btn-quiet {
    animation: none;
    opacity: 0.75;
}

.pt-ios-help-hint {
    position: absolute;
    top: 100%;
    right: 0;
    margin-top: 0.4rem;
    padding: 0.3rem 0.6rem;
    border-radius: 0.5rem;
    font-size: 0.75rem;
    white-space: nowrap;
    color: var(--font-white, #fff);
    background: var(--bg-dark-color, #222);
    box-shadow: 0 2px 10px var(--shadow-color, rgba(0, 0, 0, .3));
    pointer-events: none;
    animation: pt-ios-help-hint-fade 6s ease forwards;
}

@keyframes pt-ios-help-wiggle {
      0%, 82%, 100% { transform: rotate(0deg); }
    86%             { transform: rotate(-11deg); }
    90%             { transform: rotate(11deg); }
    94%             { transform: rotate(-7deg); }
}

@keyframes pt-ios-help-hint-fade {
      0% { opacity: 0; transform: translateY(-4px); }
     12% { opacity: 1; transform: translateY(0); }
     80% { opacity: 1; }
    100% { opacity: 0; }
}

/* The wiggle is decoration; the button reads the same without it. The hint
   still needs to appear and leave, so it holds and then fades with no travel. */
body.a11y-reduce-motion .pt-ios-help-btn { animation: none; }
body.a11y-reduce-motion .pt-ios-help-hint { animation: pt-ios-help-hint-hold 6s linear forwards; }

@media (prefers-reduced-motion: reduce) {
    .pt-ios-help-btn { animation: none; }
    .pt-ios-help-hint { animation: pt-ios-help-hint-hold 6s linear forwards; }
}

@keyframes pt-ios-help-hint-hold {
      0% { opacity: 1; }
     92% { opacity: 1; }
    100% { opacity: 0; }
}

.pt-ios-help-header {
    color: var(--font-white, #fff);
    background: var(--accent-orange, #ee513a);
}

.pt-ios-help-header .btn-close {
    filter: invert(1) grayscale(100%) brightness(200%);
}

/* =========================================================================
   Location card hidden (locationcardpref = 0) — the name and date render as
   plain text over the photographer's banner instead of inside the hero card.
   Sits on whatever artwork the banner uses, so it carries its own contrast
   rather than inheriting the page's body colour.
   ========================================================================= */
.loc-plain-header .loc-plain-title {
    color: var(--font-white, #fff);
    font-size: clamp(1.25rem, 7vw, 2.75rem);
    text-shadow: 0 0 20px rgba(0, 0, 0, 0.8);
}

.loc-plain-header .loc-date {
    color: var(--font-light-color, #f5f5f5);
    text-shadow: 0 0 12px rgba(0, 0, 0, 0.75);
}

/* High-contrast mode drops the glow for a solid plate behind the text. */
body.a11y-contrast .loc-plain-header {
    padding: 0.75rem 1rem;
    border-radius: 0.5rem;
    background: rgba(0, 0, 0, 0.72);
}

body.a11y-contrast .loc-plain-header .loc-plain-title,
body.a11y-contrast .loc-plain-header .loc-date {
    text-shadow: none;
}

/* =========================================================================
   GALLERY FAVOURITES — the customer heart on a tile          (2026-08-19)
   -------------------------------------------------------------------------
   Rendered by application/views/shared/gallery_fav_button.php and by
   PTGalleryFav.button() in content/assets/js/gallery-favorites.js — one
   control, two producers, so this block styles both.

   Sits bottom-LEFT, opposite the add-to-cart / download badge at bottom-END.
   The two must never share a corner: on the narrowest tile they would overlap
   and the heart would swallow taps meant for the cart.

   ⚠ THE STATE IS SHAPE, NOT COLOUR — a hollow heart (far fa-heart) becomes a
     solid one (fas fa-heart) when favourited, and the tint is only a second
     signal on top of that. WCAG 1.4.1: a customer who cannot distinguish the
     accent from white still sees which of their photos are marked.

   Colour: --accent-orange is the storefront's existing "you picked this"
   accent (the select badge already uses it) and every one of the 23 themes
   defines it, so a forest gallery gets its brown and a monochrome gallery its
   grey without a per-theme override here.

   The dark scrim behind the glyph is deliberately NOT tokenised. This control
   floats over an arbitrary customer photograph, not over a theme surface — the
   same fixed canvas the sibling .pt-video-play plate already assumes — and a
   themed background would be illegible over half the photos in a gallery.
   ------------------------------------------------------------------------- */
.gallery-fav {
    position: absolute;
    bottom: 0;
    left: 0;
    margin: 0 0 0.5rem 0.5rem;
    width: 2.1rem;
    height: 2.1rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 0;
    border-radius: 50%;
    color: var(--font-white);
    background: rgba(0, 0, 0, 0.55);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.28);
    /* Above the tile image and its video preview, below nothing else — the
       cart badges already claim z-index 5 on video tiles. */
    z-index: 5;
    cursor: pointer;
    transition: transform .14s ease, background-color .14s ease, color .14s ease;
}

.gallery-fav:hover {
    background: rgba(0, 0, 0, 0.72);
    transform: scale(1.08);
}

.gallery-fav.is-favorited {
    color: var(--accent-orange);
}

/* Keyboard focus must be visible over a photo of any brightness, so the ring
   is drawn in the platform's accessibility blue with a white outer edge rather
   than relying on the accent. */
.gallery-fav:focus-visible {
    outline: 3px solid var(--accessibility-blue);
    outline-offset: 2px;
    box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.9);
}

.gallery-fav i {
    font-size: 0.95rem;
    line-height: 1;
    pointer-events: none; /* clicks land on the button, never the glyph */
}

/* A tile is a link on three of the four states; the heart is the one thing
   inside it that must not inherit the link's pointer semantics visually. */
.gallery-item a .gallery-fav,
a .gallery-item .gallery-fav {
    text-decoration: none;
}

@media (prefers-reduced-motion: reduce) {
    .gallery-fav { transition: none; }
    .gallery-fav:hover { transform: none; }
}

/* High-contrast mode: solid plate, no translucency. */
body.a11y-contrast .gallery-fav {
    background: #000;
    border: 2px solid var(--font-white);
}


/* ============================================================================
   PREVIEW WALK — staff / partner "walk the storefront" chrome
   ============================================================================
   Rendered by views/shared/preview_walk_banner.php, included from the three
   storefront footers so it reaches every step of a walk.

   ⚠⚠ THIS SECTION HARDCODES ITS COLOURS ON PURPOSE — it is the one deliberately
      fixed canvas in this stylesheet, and the reason is the whole point of the
      feature. A preview walk renders the partner's DRAFT artwork: their draft
      theme colours, their draft banner images, and their draft custom CSS,
      injected verbatim into <style id="pt-custom-css">. Theming this bar with
      var(--bg-secondary) / var(--font-color) would mean that the worse a draft
      theme is, the harder the banner is to read — and the state where a partner
      most needs to find "Exit preview" is precisely the state where their draft
      has made the page unreadable. So the bar looks the same no matter what the
      draft does to the rest of the page. Do not "tokenise" this section.

   ⚠ The !important declarations exist for the same reason: partner custom CSS
     is arbitrary author CSS on the same page and can match .pw-banner or any
     ancestor selector. Only the properties that would hide or mislocate the bar
     are protected — not its typography.
   ========================================================================== */

.pw-banner {
    position: fixed !important;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2147483000; /* above the chat widget and any draft's own overlays */
    display: block !important;
    visibility: visible !important;
    opacity: 1 !important;
    background: #ffb020;
    color: #1a1200;
    border-top: 3px solid #1a1200;
    box-shadow: 0 -6px 24px rgba(0, 0, 0, 0.35);
    font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
    font-size: 0.9rem;
    line-height: 1.4;
}

/* The notice-only state, shown for one request after a walk ends or a token is
   refused. Slate rather than amber, because it is a receipt, not a live mode. */
.pw-banner.pw-banner-ended {
    background: #1f2937;
    color: #f3f4f6;
    border-top-color: #f3f4f6;
}

.pw-banner-inner {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0.6rem 1rem;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 0.9rem;
}

.pw-banner-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    flex: 0 0 auto;
    padding: 0.15rem 0.6rem;
    border-radius: 999px;
    background: #1a1200;
    color: #ffb020;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-size: 0.74rem;
    white-space: nowrap;
}

.pw-banner-text {
    flex: 1 1 18rem;
    min-width: 0;
}

.pw-banner-meta {
    flex: 0 0 auto;
    font-size: 0.8rem;
    opacity: 0.85;
    white-space: nowrap;
}

.pw-banner-notice {
    flex: 1 1 100%;
    display: flex;
    align-items: flex-start;
    gap: 0.45rem;
    padding-top: 0.35rem;
    border-top: 1px solid rgba(26, 18, 0, 0.25);
    font-weight: 600;
}

.pw-banner-ended .pw-banner-notice {
    border-top: 0;
    padding-top: 0;
}

.pw-banner-exit {
    flex: 0 0 auto;
    display: inline-block;
    padding: 0.35rem 0.9rem;
    border-radius: 6px;
    background: #1a1200;
    color: #ffffff !important;
    font-weight: 700;
    text-decoration: none !important;
}

.pw-banner-exit:hover,
.pw-banner-exit:focus {
    background: #000000;
    color: #ffffff !important;
    text-decoration: underline !important;
}

/* Focus ring on the light bar, not the app's usual blue-on-dark — it has to be
   visible against #ffb020, which the accessibility blue is not. */
.pw-banner-exit:focus-visible {
    outline: 3px solid #1a1200;
    outline-offset: 3px;
}

/* ⚠ The bar is fixed, so without this it sits on top of whatever the page ends
     with — on checkout, that is the pay button. Applied to a body class the
     partial's own markup cannot set, so it is keyed off :has() with a fallback
     for browsers without it (the padding is additive and harmless when the bar
     is absent, but only paid on a page that actually has one). */
body:has(.pw-banner) {
    padding-bottom: 5.5rem;
}

@media (max-width: 575.98px) {
    .pw-banner-inner {
        padding: 0.5rem 0.75rem;
        gap: 0.35rem 0.6rem;
    }

    /* On a phone the label and expiry are the first things to go — the mode
       badge, the "not charged" sentence and the way out all stay. */
    .pw-banner-meta {
        display: none;
    }

    body:has(.pw-banner) {
        padding-bottom: 7.5rem;
    }
}

/* High-contrast mode: drop the amber entirely for a solid black plate. */
body.a11y-contrast .pw-banner,
body.a11y-contrast .pw-banner.pw-banner-ended {
    background: #000000;
    color: #ffffff;
    border-top: 3px solid #ffffff;
}

body.a11y-contrast .pw-banner-badge {
    background: #ffffff;
    color: #000000;
}

body.a11y-contrast .pw-banner-exit {
    background: #ffffff;
    color: #000000 !important;
    border: 2px solid #ffffff;
}

body.a11y-contrast .pw-banner-exit:focus-visible {
    outline: 3px solid #ffffff;
    outline-offset: 3px;
}

@media print {
    .pw-banner { display: none !important; }
    body:has(.pw-banner) { padding-bottom: 0; }
}


/* ============================================================================
   MEMORY SUBSCRIPTIONS — "keep your gallery online" on the gallery itself
   ============================================================================
   Rendered by views/main/_memory_offer.php, included from the gallery views and
   driven by content/assets/js/memory-subscription.js.

   ⚠ TOKENISED, unlike the .memory-manage-* / .memory-plan half of this feature,
     which lives in page-account.css. The split is not stylistic: this panel sits
     on the STOREFRONT'S OWN themed canvas, so it must follow whichever theme the
     photographer runs; those sit inside template_login on Bootstrap's white
     card, where a theme token would paint near-white text onto white. Adding a
     rule to the wrong one of the two files is invisible in whichever theme you
     happen to test in.

   ⚠ The panel is a SELLING surface that appears the month a gallery is about to
     come down. It is deliberately calm — a warm border and one accent button,
     not a red countdown. The customer is being told their photos are about to
     disappear; the page should not also shout.
   ========================================================================== */

.memory-offer {
    max-width: 46rem;
    margin: 1.5rem auto 2rem;
    padding: 1.4rem 1.5rem;
    border: 1px solid var(--accent-orange, #e0761b);
    border-radius: 14px;
    background: var(--card-bg, rgba(0, 0, 0, 0.03));
    color: var(--font-color);
}

/* The already-subscribed reassurance panel. Same shell, calmer edge — it is a
   receipt, not an offer. */
.memory-offer-held {
    border-color: var(--border-muted);
}

.memory-offer-eyebrow {
    display: flex;
    align-items: center;
    gap: .45rem;
    margin: 0 0 .5rem;
    font-size: .78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .05em;
    color: var(--font-muted);
}

.memory-offer-dot {
    width: .55rem;
    height: .55rem;
    border-radius: 50%;
    background: var(--accent-green, #2e9e5b);
    flex: 0 0 auto;
}

/* ⚠ SHAPE AND TEXT CARRY THE STATE, NOT COLOUR ALONE (§18a / G10). The dot is
     decorative and aria-hidden; the words beside it ("Coming down March 4",
     "Protected") are what actually says which state this is. */
.memory-offer-dot-warn {
    background: var(--accent-orange, #e0761b);
}

.memory-offer-title {
    margin: 0 0 .6rem;
    font-size: 1.45rem;
    font-weight: 800;
    line-height: 1.2;
}

.memory-offer-lede {
    margin: 0 0 1rem;
    color: var(--font-muted);
}

.memory-offer-facts {
    list-style: none;
    margin: 0 0 1.25rem;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: .4rem 1.5rem;
    font-size: .925rem;
}

.memory-offer-facts li::before {
    content: "";
    display: inline-block;
    width: .3rem;
    height: .3rem;
    margin-right: .5rem;
    vertical-align: .18em;
    border-radius: 50%;
    background: var(--font-muted);
}

.memory-offer-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .6rem 1rem;
    margin: 0;
}

.memory-offer-cta {
    background: var(--accent-orange, #e0761b);
    border: 1px solid var(--accent-orange, #e0761b);
    border-radius: 999px;
    padding: .55rem 1.5rem;
    font-weight: 700;
    color: #fff;
}

.memory-offer-cta:hover,
.memory-offer-cta:focus {
    background: var(--accent-dark-orange, #b85c11);
    border-color: var(--accent-dark-orange, #b85c11);
    color: #fff;
}

.memory-offer-cta:disabled {
    opacity: .6;
    cursor: progress;
}

.memory-offer-secondary {
    background: transparent;
    border: 0;
    padding: .55rem 0;
    font-weight: 600;
    color: var(--font-muted);
    text-decoration: underline;
}

.memory-offer-cta:focus-visible,
.memory-offer-secondary:focus-visible {
    outline: 2px solid var(--accent-orange, #e0761b);
    outline-offset: 3px;
}

.memory-offer-testmode {
    margin: .85rem 0 0;
    font-size: .8rem;
    font-weight: 600;
    color: var(--warning-color);
}

.memory-offer-note {
    margin: .5rem 0 0;
    font-size: .875rem;
    color: var(--font-muted);
}

/* --- The checkout form ------------------------------------------------- */

.memory-offer-form {
    margin-top: 1.4rem;
    padding-top: 1.25rem;
    border-top: 1px solid var(--border-muted);
}

.memory-offer-formtitle {
    margin: 0 0 .35rem;
    font-size: 1.1rem;
    font-weight: 700;
}

/* Focus is moved here when the form opens, so the ring has to be visible even
   though a heading is not normally focusable. */
.memory-offer-formtitle:focus-visible {
    outline: 2px solid var(--accent-orange, #e0761b);
    outline-offset: 4px;
    border-radius: 4px;
}

.memory-offer-formlede {
    margin: 0 0 1.1rem;
    font-size: .925rem;
    color: var(--font-muted);
}

.memory-offer-field {
    margin-bottom: .9rem;
}

.memory-offer-field label {
    display: block;
    margin-bottom: .25rem;
    font-size: .85rem;
    font-weight: 600;
}

.memory-offer-field input {
    width: 100%;
    max-width: 24rem;
    padding: .5rem .7rem;
    border: 1px solid var(--border-muted);
    border-radius: 8px;
    background: var(--bg-secondary);
    color: var(--font-color);
}

.memory-offer-field input:read-only {
    opacity: .7;
    cursor: default;
}

.memory-offer-field input:focus-visible {
    outline: 2px solid var(--accent-orange, #e0761b);
    outline-offset: 1px;
}

.memory-offer-help {
    display: block;
    margin-top: .25rem;
    font-size: .8rem;
    color: var(--font-muted);
}

/* Stripe's Payment Element renders in a cross-origin iframe and cannot inherit
   any of this — its own palette is handed to it in JS from these same custom
   properties. All this reserves is the space. */
.memory-offer-payment {
    margin: 1.1rem 0;
    min-height: 1px;
}

/* --- The live region --------------------------------------------------- */

.memory-offer-status {
    margin: .9rem 0 0;
    font-size: .925rem;
    min-height: 1.4em; /* holds its line so the panel does not jump on the first message */
}

.memory-offer-status-error { color: var(--danger-color); font-weight: 600; }
.memory-offer-status-ok    { color: var(--accent-green, #2e9e5b); font-weight: 600; }
.memory-offer-status-busy  { color: var(--font-muted); }

@media (max-width: 575.98px) {
    .memory-offer {
        margin: 1rem .5rem 1.5rem;
        padding: 1.1rem 1rem;
    }

    .memory-offer-title {
        font-size: 1.25rem;
    }

    .memory-offer-actions {
        flex-direction: column;
        align-items: stretch;
    }

    .memory-offer-cta {
        width: 100%;
    }
}

/* High-contrast mode: drop the tinted surface, keep the structure. */
body.a11y-contrast .memory-offer {
    background: #000;
    color: #fff;
    border: 2px solid #fff;
}

body.a11y-contrast .memory-offer-eyebrow,
body.a11y-contrast .memory-offer-lede,
body.a11y-contrast .memory-offer-formlede,
body.a11y-contrast .memory-offer-help,
body.a11y-contrast .memory-offer-note,
body.a11y-contrast .memory-offer-status-busy {
    color: #fff;
}

body.a11y-contrast .memory-offer-cta {
    background: #fff;
    border-color: #fff;
    color: #000;
}

body.a11y-contrast .memory-offer-secondary {
    color: #fff;
}

body.a11y-contrast .memory-offer-field input {
    background: #000;
    color: #fff;
    border-color: #fff;
}

@media print {
    .memory-offer { display: none !important; }
}
