/*
=== SPELLING: AMERICAN ENGLISH ONLY ===
(1) Do not write British spellings in this file.
(2) If this file already holds any, in prose or in a comment: change them to the American
    form outright. Do not comment one out, and do not leave a note saying one was changed -
    delete any such note you find.
(3) Before working from any code, .txt or .md file that does NOT carry this block: run a
    spelling check over it, fix what it finds, then copy this block to its top.
(4) When creating any code, .txt or .md file: put this block at its top.

THE LIMITS, each one learned by breaking something:
- Identifiers are not prose. Never change an id, key, class, filename, or a value that comes
  from another system. "burnt-orange" is a stored palette id AND the correct American name
  for that color - it is not a misspelling.
- check-docs.py holds the word list the check searches for. Those spellings stay.
- _archive is history and a restore point. Leave it.
- The six HANDS-OFF files are Damon's. Leave them.
- Three words are NOT British and must never be "corrected": burnt, spelt, dialogue.
=== END SPELLING ===

THE PHONE SHOP - DESIGN YOUR OWN TAB (Step 10, amendment A123, Sep 26, 2026).

★★ THE SOURCE IS design bible\mockups\mobile-DYO-mockup.pdf. Damon: "the mobile
mockup is the layout bible for mobile, and it is because it was designed to maximize
screen real estate." Slide numbers below are the mockup's; the two "PAGE 7" slides
are 7a and 7b. Every decision is recorded in A123.

★ EVERYTHING HERE IS INSIDE max-width: 1023.98px - the same breakpoint as
css/mobile.css. At desktop width this file changes nothing. The few desktop
defaults the phone pieces need (keep the arrows, dots, toggle and Size dropdown off)
live in style.css and design-tool.css, next to the rules they sit beside.

★ LOADED ONLY ON THE SHOP PAGE, after design-tool.css and css/mobile.css, so equal
specificity wins by order. Most selectors carry an id anyway, because design-tool.css
re-declares the same selectors many times over.

⚠⚠ rules.md #104, AGAIN: EVERY display VALUE BELOW BEATS THE USER-AGENT [hidden]
RULE. The blanket guards at the END of this file are what keep hidden things hidden.
Do not delete them, and keep them last.

⚠ THE PINNED STACK (slide 10a): the site header (sticky, top 0 on phones), then the
collapsed product row, then the editor's left column - CHANGE TEMPLATE and the
Current line, the navy side panel with CLEAR, the preview, the color/size band and the
status bar (QA 75-78). The controls scroll underneath. Two
heights feed the offsets, measured by js/shop.js syncPinnedOffsets():
--fdnc-header-h and --fdnc-row-h. Damon parked the space concern (~560px pinned on a
~660-750px visible iPhone screen) deliberately: build it as mocked, test on the phone.

★★ A145 (Oct 7, 2026, Damon) - IN AN EDITOR THE PRODUCT ROW IS OUT OF THAT STACK.
He marked a red line on a phone screenshot, just under the product row: "Can the
scroll lock line on mobile editor be where the red line is", and "editor should
open at the red line". So while an editor is on screen the stack is the site
header and then the editor's left column; the product row is an ordinary row above
it that scrolls away under the header, and the fields get its ~72px. CHANGE is one
short scroll up. Outside an editor (the tee's template chooser) the row still pins.
--fdnc-row-h is gone: nothing pins under the row any more.

★★ A151 (Oct 10, 2026, Damon's phone mockup - "shirt editor new back workflow",
slides 10 and 11 - and two sketches the same day) - THE EDITOR'S LEFT COLUMN IS
RE-LAID, ON EVERY PRODUCT. Top row: CHANGE TEMPLATE (or "Customize your ..."),
CLEAR, help. Mugs only: an "Edit side:" line. Then a navy "tap preview to zoom"
strip over a slate panel holding Size and the product color, with the preview
beside both; then the status bar. The side panel's old contents - the side
choice and CLEAR - and the color/size band under the preview are gone, so the
pinned block is about 55px shorter (about 15px on mugs). The preview box
(slide 11) is in the ADD / PREVIEW LIGHTBOX section further down.
*/

@media (max-width: 1023.98px) {

    /* ── Step 1: the category radios - two left-aligned columns (slides 1-4) ──
       Tees/Hoodies | Caps/Hats on the first row, Mugs under Tees/Hoodies. A
       future Towels option lands under Caps/Hats by itself (Damon). */
    /* A131 (Sep 30, 2026): Ready-Made's step 1 is the same (mobile-RMC-mockup
       slide 1), with Towels landing under Caps/Hats. */
    #fdnc-step1,
    #fdnc-rmc-step1 {
        display: block;
        padding: 16px 16px 18px;
    }
    #fdnc-step1 > .fdnc-step-label,
    #fdnc-step2 > .fdnc-step-label,
    #fdnc-rmc-step1 > .fdnc-step-label,
    #fdnc-rmc-step2 > .fdnc-step-label,
    #fdnc-step3 .fdnc-step3-header .fdnc-step-label {
        display: block;
        font-size: 22px;
        line-height: 1.25;
    }
    #fdnc-step1-radios,
    #fdnc-rmc-step1-radios {
        display: grid;
        grid-template-columns: repeat(2, max-content);
        justify-content: start;
        column-gap: 30px;
        row-gap: 14px;
        margin: 14px 0 0 20px;
    }
    #fdnc-step1-radios .fdnc-category-option,
    #fdnc-rmc-step1-radios .fdnc-category-option {
        font-size: 19px;
        font-weight: 400;
    }

    /* ── Step 2: one product at a time (slides 1-5) ─────────────────────────── */
    #fdnc-step2.fdnc-step-visible {
        display: block;
        padding: 16px 16px 18px;
    }
    /* The italic "select a product to continue" is not on the mockup - the
       carousel says it. "Loading..." and an error are plain text and still show. */
    #fdnc-step2-status > em {
        display: none;
    }
    #fdnc-product-carousel,
    #fdnc-rmc-product-carousel {
        position: relative;
    }
    /* A131: Ready-Made's carousel is the same card at the same size (Damon:
       "DYO's size"), so these rules name both grids. */
    #fdnc-product-grid.fdnc-carousel-on,
    #fdnc-rmc-product-grid.fdnc-carousel-on {
        display: block;
        /* Sep 30, 2026 (Damon): 30% smaller - was 272px. */
        width: 190px;
        max-width: calc(100% - 80px);
        margin: 14px auto 0;
        /* vertical scrolling stays the browser's; horizontal swipes are ours.
           A131 QA 7: pinch-zoom stays the browser's too - with pan-y alone a page
           that came back zoomed in could not be pinched out over the carousel. */
        touch-action: pan-y pinch-zoom;
    }
    #fdnc-product-grid.fdnc-carousel-on > .fdnc-product-card,
    #fdnc-rmc-product-grid.fdnc-carousel-on > .fdnc-product-card {
        display: none;
    }
    #fdnc-product-grid.fdnc-carousel-on > .fdnc-product-card.is-current,
    #fdnc-rmc-product-grid.fdnc-carousel-on > .fdnc-product-card.is-current {
        display: block;
        width: 100%;
    }
    /* ★ ONLY THE PICTURE SELECTS (slide 5, revised by Damon). The JS ignores a
       tap anywhere else on the card; this makes the text look like text. */
    #fdnc-product-grid.fdnc-carousel-on button.fdnc-product-card-select {
        cursor: default;
    }
    #fdnc-product-grid.fdnc-carousel-on .fdnc-product-card img,
    #fdnc-product-grid.fdnc-carousel-on .fdnc-product-no-image,
    #fdnc-rmc-product-grid.fdnc-carousel-on .fdnc-product-card img,
    #fdnc-rmc-product-grid.fdnc-carousel-on .fdnc-product-no-image,
    #fdnc-rmc-listview-list .fdnc-product-card img,
    #fdnc-rmc-listview-list .fdnc-product-no-image {
        width: 100%;
        height: auto;
        aspect-ratio: 1 / 1;
        object-fit: contain;
        background: #ffffff;
        cursor: pointer;
        -webkit-user-select: none;
        user-select: none;
    }
    #fdnc-product-grid.fdnc-carousel-on .fdnc-product-name,
    #fdnc-rmc-product-grid.fdnc-carousel-on .fdnc-product-name,
    #fdnc-rmc-listview-list .fdnc-product-name {
        font-size: 16px;
        margin: 12px 0 2px;
    }
    #fdnc-product-grid.fdnc-carousel-on .fdnc-product-price,
    #fdnc-rmc-product-grid.fdnc-carousel-on .fdnc-product-price,
    #fdnc-rmc-listview-list .fdnc-product-price {
        font-size: 15px;
    }

    /* The arrows sit either side of the picture, centered on it: the grid starts
       14px down and the picture is square at the grid's width. */
    #fdnc-product-carousel > .fdnc-carousel-arrow,
    #fdnc-rmc-product-carousel > .fdnc-carousel-arrow {
        top: calc(14px + 190px / 2);
    }

    /* ── The shared carousel controls (both carousels) ─────────────────────
       Shown on phones. How they LOOK moved to css/design-tool.css on Sep 30,
       2026, when the template chooser's became desktop controls too. */
    .fdnc-carousel-arrow {
        display: flex;
    }
    .fdnc-carousel-dots {
        display: flex;
    }

    /* ── After a product is picked: steps 1 and 2 become one row ────────────────
       "▶ Unisex Cotton Tee 2   CHANGE" (slides 6a, 7a), expanding to show the
       thumbnail and price (6a2). The row PINS under the site header. */
    #fdnc-content-dyo.fdnc-has-product #fdnc-step1,
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2 > .fdnc-step-label {
        display: none;
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2.fdnc-step-visible {
        position: -webkit-sticky;
        position: sticky;
        top: var(--fdnc-header-h, 0px);
        z-index: 30;
        display: grid;
        grid-template-columns: auto minmax(0, 1fr) auto;
        /* ★ QA 62 (Sep 27, 2026): TWO ROWS, AND THE FIRST ONE NEVER MOVES.
           Row 1 is the header line - arrow, name, CHANGE - centered on each
           other. Row 2 is the drawer (thumbnail + price), empty and zero-high
           when the row is collapsed. Before this, the name sat centered in the
           whole block, so opening the drawer pushed it up while the arrow stayed
           put. The status span is a SUBGRID of these rows, which is how its name
           can sit in row 1 while its thumbnail sits in row 2. */
        grid-template-rows: auto auto;
        column-gap: 10px;
        row-gap: 0;
        align-items: center;
        padding: 12px 16px;
        background-color: #CCCCFF;
    }
    /* ★★ A145 (Oct 7, 2026): NOT PINNED WHILE AN EDITOR IS OPEN - see the note at
       the top of this file. relative, not static, so the row keeps its place in
       the stacking order and stays the box its own parts are placed against. */
    html.fdnc-dyo-in-editor #fdnc-content-dyo.fdnc-has-product #fdnc-step2.fdnc-step-visible {
        position: relative;
        top: auto;
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2-toggle {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        grid-column: 1;
        grid-row: 1;
        align-self: center;
        width: 22px;
        height: 34px;
        padding: 0;
        margin: 0;
        border: 0;
        background: none;
        box-shadow: none;
        text-shadow: none;
        color: #1a1a1a;
        font-size: 16px;
        line-height: 1;
        cursor: pointer;
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2-toggle:hover,
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2-toggle:focus,
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2-toggle:active {
        background: none;
        color: #1a1a1a;
        box-shadow: none;
    }
    #fdnc-step2-toggle:focus:not(:focus-visible) {
        outline: none;
    }
    /* ★ QA 60 (Sep 27, 2026): THE TRIANGLE IS DRAWN, NOT TYPED. The ▶ character
       came out as the iPhone's blue emoji button even with the text-style marker
       (QA 30), so the character is hidden and a plain triangle is drawn from
       borders. It still turns to point down when the row is expanded. */
    #fdnc-step2-toggle .fdnc-step2-toggle-glyph {
        display: inline-block;
        width: 0;
        height: 0;
        border-top: 7px solid transparent;
        border-bottom: 7px solid transparent;
        border-left: 11px solid #1a1a1a;
        font-size: 0;
        line-height: 0;
        color: transparent;
        overflow: hidden;
        transition: transform 0.15s ease;
    }
    #fdnc-step2.fdnc-row-expanded #fdnc-step2-toggle .fdnc-step2-toggle-glyph {
        transform: rotate(90deg);   /* ▶ becomes ▼ */
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2-status.fdnc-step2-selected {
        grid-column: 2;
        grid-row: 1 / span 2;
        align-self: stretch;
        display: grid;
        grid-template-rows: subgrid;          /* QA 62 - shares the row's two rows */
        grid-template-columns: auto minmax(0, 1fr);
        column-gap: 18px;
        row-gap: 0;
        align-items: center;
        justify-items: start;
        text-align: left;
        font-size: 19px;
        line-height: 1.25;
    }
    #fdnc-step2-status .fdnc-step2-name {
        grid-column: 1 / -1;
        grid-row: 1;
        cursor: pointer;
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2 .fdnc-step2-thumb,
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2 .fdnc-step2-price {
        display: none;
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2.fdnc-row-expanded .fdnc-step2-thumb {
        display: block;
        grid-column: 1;
        grid-row: 2;
        margin-top: 10px;
        width: 96px;
        height: 96px;
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2.fdnc-row-expanded .fdnc-step2-price {
        display: block;
        grid-column: 2;
        grid-row: 2;
        margin-top: 10px;
        font-size: 17px;
        font-weight: 400;
        font-style: italic;
    }
    #fdnc-content-dyo.fdnc-has-product #fdnc-step2-change {
        grid-column: 3;
        grid-row: 1;
        align-self: center;
        text-transform: uppercase;
        font-size: 16px;
        padding: 5px 12px;
        margin: 0;
    }

    /* ── Step 3: the header row (slides 6a, 6b) ─────────────────────────────── */
    #fdnc-step3.fdnc-step-visible {
        padding: 16px 12px 20px;
    }
    html.fdnc-dyo-in-editor #fdnc-step3.fdnc-step-visible {
        padding-top: 0;   /* QA 53 - the editor's pinned block carries the space */
    }
    #fdnc-step3 .fdnc-step3-header {
        display: flex;
        flex-direction: column;
        align-items: stretch;
        gap: 12px;
        max-width: none;
        margin: 0 4px 12px;
    }
    /* "3. Design Your <product>:" goes once an editor is open (Damon: to save
       real estate). Nothing else lives in the header row then, so the row goes. */
    html.fdnc-dyo-in-editor #fdnc-step3 .fdnc-step3-header {
        display: none;
    }
    /* The editor head holds only "Design: <name>" on phones - the status bar has
       been moved under the preview (js/shop.js placeStatusBar). */
    #fdnc-step3 .fdnc-dyo-editor-head {
        display: none;
    }
    #fdnc-step3-header-slot > * {
        margin: 0;
        transform: none !important;   /* desktop's measured centering (alignChooserExtras) */
    }
    /* Single-sided / Double-sided, centered, no legend (slide 6a). The legend
       stays for screen readers. */
    #fdnc-step3 .fdnc-dyo-sides-mode {
        flex-direction: row;
        flex-wrap: wrap;
        justify-content: center;
        align-items: center;
        gap: 20px;
        margin: 0;
        font-weight: 700;
    }
    #fdnc-step3 .fdnc-dyo-sides-mode > .fdnc-dyo-field-legend {
        position: absolute;
        width: 1px;
        height: 1px;
        margin: -1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
        clip-path: inset(50%);
        white-space: nowrap;
    }

    /* ── Step 3: the template chooser (slides 6a, 6b) ───────────────────────── */
    #fdnc-step3 #fdnc-design-tool-shell {
        max-width: none;
    }
    #fdnc-step3 .fdnc-dyo-chooser-body {
        display: block;
        width: auto;
        max-width: none;
        margin: 0;
    }
    /* ★ QA 63 (Sep 27, 2026): "Choose a template to continue." SITS ABOVE THE
       CAROUSEL on phones, in both modes. The footer that holds it is dissolved
       (display: contents) so its two children - the instruction and the $5.95
       note - line up in this column with the cards, and `order` puts the
       instruction first. Nothing moves in the markup; desktop is untouched. */
    #fdnc-step3 .fdnc-dyo-chooser-main {
        display: flex;
        flex-direction: column;
    }
    #fdnc-step3 .fdnc-dyo-chooser-main > .fdnc-dyo-chooser-panes {
        order: 2;
    }
    #fdnc-step3 .fdnc-dyo-chooser-main > .fdnc-dyo-chooser-footer {
        display: contents;
    }
    #fdnc-step3 .fdnc-dyo-chooser-footer > .fdnc-dyo-chooser-copy {
        order: 1;
    }
    #fdnc-step3 .fdnc-dyo-chooser-footer > .fdnc-dyo-price-note {
        order: 3;
    }
    /* "▶ Customize the FRONT" / "Customize the BACK", stacked and centered.
       QA 13: desktop sizes this block to its content and nudges it 15px left,
       which is what pulled both lines off center. */
    #fdnc-step3 .fdnc-dyo-steps {
        align-items: center;
        align-self: stretch;
        width: auto;
        left: 0;
        gap: 10px;
        margin: 0 0 14px;
        transform: none !important;
    }
    /* The marker hangs to the LEFT of its label, outside the button's box, so
       both labels center on the same line whichever step carries it. */
    #fdnc-step3 .fdnc-dyo-step {
        position: relative;
    }
    #fdnc-step3 .fdnc-dyo-step {
        font-size: 19px;
    }
    #fdnc-step3 .fdnc-dyo-step[data-state="locked"] {
        color: #9a9a9a;
    }
    /* ★ THE "YOU ARE HERE" MARKER IS THE DYO TAB'S ARROW ON PHONES (Damon,
       Sep 26, 2026), not ▶ - the product row above uses ▶/▼ to mean expand, and
       one glyph meaning two things a few lines apart was confusing. The ▶ text
       stays in the markup (aria-hidden) and is simply not drawn. */
    #fdnc-step3 .fdnc-dyo-step-marker {
        position: absolute;
        right: 100%;
        top: 50%;
        margin-right: 8px;
        width: 22px;
        height: 22px;
        font-size: 0;
        color: transparent;
        background: url('../images/home/arrow-right.svg') no-repeat center / contain;
        /* QA 13: the drawing points down-right; the DYO tab turns it level with
           the same rotation (style.css .fdnc-tab-arrow). */
        transform: translateY(-50%) rotate(-45deg);
    }
    #fdnc-step3 .fdnc-dyo-chooser-panes {
        display: block;
        margin: 0;
    }
    #fdnc-step3 .fdnc-dyo-chooser-pane {
        /* BLOCK (QA 2, Sep 26, 2026): as a flex row the dots sat BESIDE the
           cards. Desktop is a block now too (Sep 30, 2026).
           Hidden panes stay hidden - see the #104 guards at the end. */
        display: block;
        position: relative;
        width: 100%;
        background: none;
        border: 0;
        border-radius: 0;
        padding: 0;
        box-sizing: border-box;
    }
    /* The carousel window: the center card and a peek of each neighbor. The
       layout itself is in css/design-tool.css (every width since Sep 30, 2026);
       phones set only the three sizes. --fdnc-tpl-card is the card,
       --fdnc-tpl-gap the space between cards, --fdnc-tpl-peek how much of a
       neighbor shows.
       ★ 170px, NOT THE 180px THIS SAID BEFORE: design-tool.css caps every card
       at 170px, so the phone card was already rendering at 170 while the
       window was built for 180 - the right peek showed 48px and the left 38px.
       170 is the size it always drew; now both peeks match.
       ★★ Oct 8, 2026 (Damon): ONE CARD, 50% LARGER, NO PEEKS - the same as desktop
       (css/design-tool.css, where the arrows that hug the card live too). 255px
       plus the arrows is about 350px, inside a 393px phone. */
    #fdnc-step3 .fdnc-dyo-chooser-pane {
        --fdnc-tpl-card: 255px;
        --fdnc-tpl-gap: 10px;
        --fdnc-tpl-peek: 0px;
        padding: 0;
    }
    #fdnc-step3 .fdnc-dyo-chooser-grid.fdnc-carousel-on .fdnc-dyo-card-label {
        font-size: 19.2px;   /* Oct 2, 2026 (Damon): 20% up from 16px; bold and upright come from design-tool.css */
    }
    #fdnc-step3 .fdnc-dyo-chooser-footer {
        padding-left: 0 !important;    /* desktop's measured card-row insets */
        padding-right: 0 !important;
        text-align: center;
        /* QA 49 + QA 54 (Sep 27, 2026): desktop gives the footer 26px on top.
           QA 49's -15px REPLACED that 26px rather than subtracting from it - a
           41px move, which is why the text ran into the dots. Now zero, with the
           copy's own margin below setting a 10px gap to the letters. */
        margin-top: 0;
        padding-top: 0 !important;
    }
    #fdnc-step3 .fdnc-dyo-chooser-copy {
        /* QA 63: now ABOVE the cards - 10px of margin under it, plus the
           line's own leading and the carousel's 4px padding.
           (Was QA 54's 6px on top, when it sat under the dots.) */
        margin: 0 0 10px;
        line-height: 1.4;
        font-size: 18px;
        font-weight: 700;
        font-style: italic;
        text-align: center;
    }
    /* "NOTE: printing on both sides will add $5.95 at checkout." - boxed, slide 6b. */
    #fdnc-step3 .fdnc-dyo-chooser-footer .fdnc-dyo-price-note {
        display: block;
        width: fit-content;
        max-width: 290px;
        margin: 16px auto 0;
        padding: 6px 16px;
        background: #ffffff;
        border: 1px solid #1a1a1a;
        border-radius: 8px;
        text-align: center;
        font-size: 16px;
        line-height: 1.35;
        transform: none !important;
    }

    /* ── Step 3: the editor (slides 7a-11) ─────────────────────────────────────── */
    #fdnc-step3 .fdnc-dyo-editor-body {
        display: block;
    }
    /* ★★ THE PINNED BLOCK: CHANGE TEMPLATE / CLEAR, the side row, the preview and
       the status bar stay put while the controls scroll underneath (slide 10a).
       It lets go at the end of the editor (10b), because sticky is bounded by
       .fdnc-dyo-editor-body.
       ★★ A145 (Oct 7, 2026): IT PINS RIGHT UNDER THE SITE HEADER. It used to pin
       under the product row - top was the header's height plus the row's - and
       the row no longer stays (Damon's red line; the note at the top of this
       file). js/shop.js scrollPhoneHome() opens the editor at this same line. */
    #fdnc-step3 .fdnc-dyo-editor-left {
        position: -webkit-sticky;
        position: sticky;
        top: var(--fdnc-header-h, 0px);
        z-index: 20;
        /* ★ QA 27 (Damon's sketch, Sep 26, 2026): A GRID. Row 1 is CHANGE
           TEMPLATE (or the mug's logo note) and CLEAR; row 2 is the side choice
           on the left and the preview pushed to the RIGHT at 60% (QA 22's size);
           row 3 is the full-width status bar. Every child is placed by name
           below, so nothing here depends on markup order. */
        display: grid;
        /* ★ QA 76 (Sep 27, 2026, Damon's editor mockup): the preview is HALF the
           width now (was QA 22's 60%) and the navy panel takes the other half.
           The preview is a fixed square (schema §1.5), so it gets shorter too:
           about 197px on a 393px iPhone 16, against 236px before. */
        grid-template-columns: minmax(0, 1fr) 50%;
        /* ★★ QA 65-67 (Damon's editor mockup, Sep 27, 2026): THE PINNED BLOCK
           READS AS ITS OWN SECTION. Below the CHANGE TEMPLATE / CLEAR row, the
           side panel is navy with white text and runs edge to edge with the
           preview beside it; the status bar under them is full width. The
           controls scrolling away underneath no longer vanish into a block of
           the same lavender. Rows: 1 CHANGE TEMPLATE / CLEAR; 2 side choice;
           3 "Design: <name>" (QA 66); 4 status bar. The preview spans rows 2-3,
           and the navy is this block's ::before, laid into column 1 of those
           same rows - so it is always exactly the preview's height.
           ★ QA 70: "Design: <name>" MOVED TO ROW 2, the top of the panel, next
           to CHANGE TEMPLATE, which it belongs with; the side choice is row 3.
           Row 3 is 1fr so it takes whatever height the preview leaves over,
           which keeps the Design line and the side choice snug at the top. */
        /* ★★ QA 75-78 (Sep 27, 2026, Damon's editor mockup): THE ROWS NOW ARE
           1 CHANGE TEMPLATE and "Current: <name>" (the name left the panel, QA 75);
           2 the side choice; 3 CLEAR, under it (QA 77) - 1fr, so the preview's
           spare height lands below CLEAR; 4 the color/size band (QA 78); 5 the
           status bar. The preview and the navy still span rows 2-3. */
        /* ★★ A151 (Oct 10, 2026 - Damon's phone mockup, "shirt editor new back
           workflow" slide 10, and his mug sketch the same day): THE ROWS NOW ARE
           1 CHANGE TEMPLATE (or "Customize your ..."), CLEAR and help;
           2 the mug's "Edit side:" line - no other product has one, and an
           auto row with nothing in it is 0 tall;
           3 the navy "tap preview to zoom" strip;
           4 the slate panel holding Size and the product color - 1fr, so the
           panel is whatever the preview leaves under the strip;
           5 the status bar.
           Column 1 holds the strip and the panel; the preview is column 2 across
           rows 3-4. The band that sat under the preview (QA 78) is gone - its
           two rows are the panel now. Every product. */
        grid-template-rows: auto auto auto 1fr auto;
        column-gap: 0;
        row-gap: 0;
        align-items: center;
        margin: 0 -12px;
        /* QA 44 (Sep 27, 2026): the CHANGE TEMPLATE / CLEAR row sits centered -
           16px above it, 16px below (row 1's 8px margin + the 8px row gap).
           ★ QA 53: THE 16px ABOVE IS THIS BLOCK'S OWN PADDING, not step 3's. As
           step 3's padding it scrolled away while this block stayed pinned, and
           CLEAR ended up against the white line; inside the block it is pinned
           too. Step 3's top padding is zeroed while an editor is open (below). */
        /* ★ QA 81 (Sep 27, 2026): 25% LESS SPACE ABOVE THE CHANGE TEMPLATE ROW'S
           TEXT - about 27px down to 20px, so the padding goes 16 -> 9. */
        padding: 9px 0 10px;   /* QA 65: no side padding - rows 2-5 run edge to edge */
        background-color: #CCCCFF;
    }
    /* A151: the navy that ran down column 1 as this block's ::before is gone.
       The strip (#fdnc-dps-tap-hint) and the panel (.fdnc-dyo-phone-variants)
       paint themselves. (Was QA 65: #3A5786 across rows 2-3.) */
    #fdnc-step3 .fdnc-dyo-editor-left::before {
        content: none;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-back-to-chooser,
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-tagline-disclosure {
        grid-column: 1;
        grid-row: 1;
        justify-self: start;
        /* QA 81: 25% less space below the row's text too - about 26px down to
           20px, so 16 -> 10 (was QA 44's 16px below). */
        margin: 0 12px 10px;   /* QA 65: the side inset now lives here */
    }
    /* QA 28 (Sep 26, 2026): "< CHANGE TEMPLATE" stays on one line. It spans the
       whole row, so the narrow side-choice column no longer squeezes it; CLEAR
       still sits at the right end of the same row. */
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-back-to-chooser {
        /* QA 75: column 1 only - "Current: <name>" takes column 2 of this row.
           It still fits on one line: about 171px against a 180px column on a
           360px phone. */
        grid-column: 1;
        white-space: nowrap;
    }
    /* One template = no chooser (Oct 2, 2026): the unused "< CHANGE TEMPLATE" is
       removed on phones; the TEMPLATE word just below takes its spot. */
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-back-to-chooser.fdnc-sole-template {
        display: none;
    }
    /* ★ QA 87 (Sep 27, 2026): MUGS SHOW "TEMPLATE" WHERE THE OTHERS SHOW
       "< CHANGE TEMPLATE" - plain text, since a mug's template cannot change.
       Every number is CHANGE TEMPLATE's own (css/design-tool.css): 1.2em,
       bold, #3d4f66, 0.03em tracking, the word itself at .fdnc-btn-caps'
       0.85em; the same 12px inset and 10px under the row. No "<", no
       underline.
       ★ QA 88: CENTERED over the navy panel, the way "Current:" is centered
       over the preview (was left-aligned, 12px in, like CHANGE TEMPLATE). */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-template-word {
        display: block;
        grid-column: 1;
        grid-row: 1;
        justify-self: center;
        align-self: center;
        margin: 0 0 10px;
        color: #3d4f66;
        font-size: 1.2em;
        font-weight: 700;
        letter-spacing: 0.03em;
        white-space: nowrap;
    }
    /* ★★ "Customize your cap." / "Customize your mug." TAKE THE WORD TEMPLATE'S
       SPOT (Oct 2, 2026, A134 - Damon confirmed the spot; the cap's line is the
       mockup's, the mug's was added "for consistency"). The same grid cell,
       centered over the navy panel the same way. It is a sentence, not a
       control's label, so it is italic at normal weight and size, as on the
       mockup - not TEMPLATE's bold tracked capitals.
       The cap's line is its own element (.fdnc-dyo-customize, which desktop
       shows too); the mug's reuses the word's element with a second class. */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-customize,
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-template-word.fdnc-dyo-customize-word {
        display: block;
        grid-column: 1;
        grid-row: 1;
        justify-self: center;
        align-self: center;
        margin: 0 0 10px;
        color: #1a1a1a;
        font-size: 1em;
        font-style: italic;
        font-weight: 400;
        letter-spacing: 0;
        white-space: nowrap;
    }
    /* ★★ A151 (Oct 10, 2026, slide 10 note 2): CLEAR SITS BETWEEN CHANGE TEMPLATE
       AND help - "Move CLEAR between Change Template and Help. Also narrow the
       width of CLEAR to help it fit better." Row 1, at the left of column 2;
       help is at that column's right. Measured on the slide at 393px: 75 x 30px,
       starting 10px into the column, 13px lettering, centered on the row's
       line. The left margin is a share of the column (5%), so it closes up on a
       narrower phone before CLEAR can reach help.
       js/shop.js leaves CLEAR at its desktop place in the markup - right after
       CHANGE TEMPLATE - which is its place in the tab order here too.
       PREVIOUS (QA 77 / 80 / 84, Sep 27): in the navy panel under the side
       choice, 106 x 32px with 16px lettering, on the panel's bottom edge. */
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-clear-design {
        grid-column: 2;
        grid-row: 1;
        justify-self: start;
        align-self: center;
        box-sizing: border-box;
        width: 75px;
        margin: 0 0 10px 5%;
        padding: 5px 0;
        font-size: 13px;
        line-height: 16px;   /* + 10px padding + the button's 2px edges = 30px */
        text-align: center;
    }
    /* WITH NOTHING TO CLEAR, CLEAR IS THE SLIDE'S FLAT BLUE-GRAY BUTTON WITH WHITE
       LETTERING (#ADB9CA, sampled). It is still natively disabled - only the
       paint differs - and with something to clear it is the usual red button.
       ⚠ opacity NEEDS !important: Storefront forces button:disabled to 50%
       with !important (rules.md #203), which would wash the slide's color out.
       PREVIOUS (QA 77): a steel-blue gradient with pale yellow lettering, made
       for the navy panel it sat on. */
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-clear-design:disabled,
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-clear-design:disabled:hover {
        opacity: 1 !important;
        filter: none;
        background: #ADB9CA;
        color: #ffffff;
        border-color: #ADB9CA;
        box-shadow: none;
        text-shadow: none;
    }
    /* ★ QA 59 (Sep 27, 2026): the mug's logo note shares CLEAR's row across the
       whole width up to CLEAR - not squeezed into the side-choice column - so it
       falls on its two authored lines: "Our For Dog & Country logo is" /
       "included opposite the handle." */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-tagline-disclosure {
        grid-column: 1 / -1;
        max-width: calc(100% - 96px);
        font-size: 15px;
        text-align: center;
    }
    /* ★★ A151 (Oct 10, 2026): THE SIDE CHOICE LEFT THE PANEL.
       - MUGS: one line across the block, under the top row and above the strip,
         as Damon sketched it - "Edit side:  (o) Left  ( ) Right", dark text on
         the lavender. Row 2, both columns, centered.
       - TEES AND CAPS: the one-word line ("SHIRT FRONT", "Edit hat side: FRONT")
         is not shown on phones - slide 10 note 1, "Remove SHIRT FRONT", and
         Damon the same day: "[product] FRONT : yes, comes off on all products".
         ⚠ IT IS HIDDEN FROM THE EYE, NOT FROM THE PAGE: its .fdnc-dyo-side-a11y
         span is the only "this side is complete" a screen reader gets (the
         shell's note beside the tee's line), so it is clipped to 1px, not
         display: none.
       PREVIOUS (QA 27 / 65 / 77, Sep 26-27): the top of the navy panel on every
       product - the label over stacked options, white text. */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-side-toggle {
        grid-column: 1 / -1;
        grid-row: 2;
        display: flex;
        flex-direction: row;
        flex-wrap: wrap;
        align-items: center;
        justify-content: center;
        gap: 4px 18px;
        justify-self: stretch;
        align-self: center;
        box-sizing: border-box;
        max-width: 100%;
        margin: 0;
        padding: 0 12px 10px;
        border: 0;
        color: #1a1a1a;
        font-weight: 400;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-side-toggle.fdnc-dyo-side-static {
        position: absolute;
        width: 1px;
        height: 1px;
        margin: -1px;
        padding: 0;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        clip-path: inset(50%);
        white-space: nowrap;
    }
    #fdnc-step3 .fdnc-dyo-side-toggle .fdnc-dyo-side-toggle-legend {
        font-weight: 700;
        text-align: center;
        white-space: nowrap;
    }
    #fdnc-step3 .fdnc-dyo-side-toggle label,
    #fdnc-step3 .fdnc-dyo-side-toggle .fdnc-dyo-side-word,
    #fdnc-step3 .fdnc-dyo-side-toggle .fdnc-dyo-side-saved {
        color: #1a1a1a;
    }
    /* "Left" / "Right" as the sketch writes them. Desktop and the preview box
       keep the capitals (css/design-tool.css uppercases .fdnc-dyo-side-word). */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-side-toggle:not(.fdnc-dyo-side-static) .fdnc-dyo-side-word {
        text-transform: none;
    }
    /* QA 66: "Design: Classic" - regular weight, centered at the foot of the
       navy panel (mockup). Moved here from the hidden head row by js/shop.js.
       ★ QA 75 (Sep 27, 2026, Damon's editor mockup): ON PHONES IT READS
       "Current: Classic" (the word is swapped in the markup - .fdnc-word-phone)
       AND SITS IN ROW 1, centered over the preview where CLEAR used to be, in
       dark text on the lavender. The name is italic, with one extra space
       before it. (Was QA 70: the top of the navy panel, white, left-aligned.)
       ★★ A143 (Oct 5, 2026): THIS SLOT HOLDS THE "? help" BUTTON NOW, and after
       his phone pass Damon moved and sized it: "increase button and font size
       15%" and "align it right, but keep about 10px padding on the right". So
       justify-self is end (it was center, over the preview) with 10px of right
       margin, and the button's text is 1.15em of this rule's 17.5px.
       ⚠ THE BOTTOM MARGIN IS 8px, NOT 10px, ON PURPOSE. The larger button is
       32.5px tall; with 10px under it this row would be 1.5px taller than
       CHANGE TEMPLATE makes it (41px) and everything pinned below would move.
       ⚠ The button's own -8px side margin (css/design-tool.css) is its tap
       padding, so the 10px is measured to the end of the word "help". */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-editor-design .fdnc-dyo-help-btn {
        font-size: 1.15em;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-editor-design {
        grid-column: 2;
        grid-row: 1;
        justify-self: end;
        align-self: center;
        display: block;
        margin: 0 10px 8px 0;
        /* QA 81: 2px lower. Measured on Damon's screenshot, its capitals sat
           about 2px above CHANGE TEMPLATE's; top moves the text without
           changing the row's height. */
        position: relative;
        top: 2px;
        padding: 0;
        color: #404040;       /* sampled from the mockup */
        font-size: 17.5px;
        font-weight: 400;
        text-align: center;
        white-space: nowrap;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-editor-design #fdnc-editor-design-name {
        font-style: italic;   /* QA 75 */
        margin-left: 0.3em;   /* QA 75: one extra space after "Current:" */
    }
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-editor-design .fdnc-dyo-side-toggle-legend {
        font-weight: 400;
    }
    #fdnc-step3 .fdnc-dyo-side-toggle .fdnc-dyo-placeon {
        display: flex;
        flex-direction: column;
        align-items: center;   /* QA 77 */
        gap: 5px;   /* QA 80: 5px tighter between the options (was 10px) */
    }
    /* A151: sized from Damon's mug sketch at 393px - the label 18px bold ("Edit
       side:" is 73px wide there), the options 17.5px (QA 41's size, kept), 18px
       between the label and the first option and between the two options (the
       row's gap, above).
       (Was QA 41 / 69 / 80: a 19.5px label with 10px under it; QA 77: each
       option at least 4.6em wide, so the stacked radios lined up.) */
    #fdnc-step3 .fdnc-dyo-side-toggle .fdnc-dyo-side-toggle-legend {
        font-size: 18px;
        line-height: 1.3;
        margin-bottom: 0;
    }
    #fdnc-step3 .fdnc-dyo-side-toggle label,
    #fdnc-step3 .fdnc-dyo-side-toggle .fdnc-dyo-side-name {
        display: inline-flex;
        align-items: center;
        justify-content: flex-start;
        gap: 8px;
        margin: 0;
        font-size: 17.5px;
        min-width: 0;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-dps {
        grid-column: 2;
        grid-row: 3 / span 2;   /* A151: beside the strip and the panel (was 2 / span 2, QA 65) */
        width: 100%;
        max-width: none;
        margin: 0;
    }
    /* The canvas: a long press must neither select nor open the image menu -
       it is the zoom gesture. */
    #fdnc-step3 #fdnc-dps-canvas {
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        user-select: none;
    }
    /* ★ QA 25 (Sep 26, 2026): ON THE iPHONE A LONG PRESS PICKED UP A LAYER - the
       flag, say - and dragged it, because each layer is a picture and the phone
       lets you drag pictures. The layers take no touches at all now, so the
       press always lands on the preview itself, which is where the zoom listens. */
    #fdnc-step3 #fdnc-dps-canvas * {
        pointer-events: none;
        -webkit-user-drag: none;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        user-select: none;
    }
    /* Desktop's "Hover to zoom." line under the preview is not shown on phones. */
    #fdnc-step3 #fdnc-dps-zoom-hint {
        display: none;
    }
    /* ★★ A151 (Oct 10, 2026, slide 10 note 4): "tap preview to zoom" IS A STRIP OF
       ITS OWN at the top of the left column - "Change tap to zoom to 'tap
       preview to zoom' and move it to the top of the formerly blue box, which
       is now a smaller box just for this line of text. Also, change the text
       to yellow." Navy #3A5786 (the old panel's color; the slide samples
       #3D5884), yellow italic. It stays up for good (Damon: "tap preview is
       now permanent").
       Measured on the slide at 393px: the strip is 41px tall and the words are
       162px wide - 19.5px italic in Source Sans Pro.
       js/design-tool.js (syncDpsTapHint) makes the element - a child of this
       block now, no longer of the preview. ⚠ NO TOUCHES, as before.
       PREVIOUS (Oct 4): "Tap to zoom" in black on a pale plate at the bottom of
       the preview itself, cleared by the first design choice. */
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-dps {
        position: relative;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-dps-tap-hint:not([hidden]) {
        grid-column: 1;
        grid-row: 3;
        align-self: stretch;
        display: flex;
        align-items: center;
        justify-content: center;
        box-sizing: border-box;
        min-height: 41px;
        margin: 0;
        padding: 0 4px;
        background-color: #3A5786;
        color: #FFFF00;
        font-size: 19.5px;
        font-style: italic;
        font-weight: 400;
        line-height: 1.2;
        white-space: nowrap;
        pointer-events: none;
        -webkit-user-select: none;
        user-select: none;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-status {
        grid-column: 1 / -1;
        grid-row: 5;   /* A151: directly under the panel and the preview (was under QA 78's band) */
        box-sizing: border-box;
        /* QA 67: full width, edge to edge, square corners. QA 72 (Sep 27,
           2026): 8px of lavender above it - the same as the white line under
           the product row (style.css, step 2's 8px bottom border).
           ★ QA 78: NO GAP NOW - it sits directly under the color/size band, as
           the mockup has it. */
        margin: 0;
        border-radius: 0;
        padding: 5px 10px;
        /* ★ QA 2 (Damon, Oct 4, 2026): "on mobile, make the status bar text
           larger" - 16px to 18px, now that the bar gives the step-by-step
           instructions. The padding is in px, so it did not grow with it. The
           size prompt and the action inside the bar are sized in em and follow.
           ⚠ The mug's "Left side complete. Tap to DESIGN THE RIGHT SIDE" is the
           longest line the bar holds; flex-wrap below is what lets it take a
           second line if it needs one. */
        font-size: 18px;
        text-align: center;
        flex-wrap: wrap;
    }
    /* (QA 23's red italic "Tap to zoom." rule stood here. The words moved onto the
       preview on Oct 4, 2026 - see #fdnc-dps-tap-hint above.) */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-status #fdnc-status-action {
        margin-bottom: 0;
    }
    /* ★★ A151 (Oct 10, 2026, slide 10 note 3): SIZE AND THE PRODUCT COLOR ARE THE
       LEFT PANEL - "Move shirt color and size into the formerly dark blue box,
       which now assumes the slate blue color of the box that used to be below
       preview". Column 1, row 4, filling it: Size on top, the color row under
       it, and the color's link centered under that row, reading "tap to
       select". js/shop.js still moves the rows into .fdnc-dyo-phone-variants on
       phones and back on desktop; it puts that box before the preview now.
       #ADBCCF is QA 78's slate (the slide samples #AEBCCE).
       MEASURED ON THE SLIDE AT 393px (the panel is 196.5 x 155): text starts
       17px in and the controls end 17.5px from the right edge; the Size row is
       centered 30px down, the color row 93px down, the link 129px down. Labels
       are 19.5px bold ("Size:" is 41px wide there, "Shirt Color:" 99px); the
       lit label's orange box is 30px tall and reaches 9px left of the words;
       the color box is 36 x 29px; the Size dropdown 100 x 28px.
       HOW IT HOLDS THOSE: a column, the two rows pushed apart (space-between)
       inside 15px of padding top and bottom. The color row keeps 31px under
       itself for the link, which is positioned there. The link's wrapper
       (.fdnc-dyo-swmore) is still what the color grid opens from, so the grid
       still opens above the link (QA-N), centered on it and slid back onto the
       screen by js/shop.js - over the Size row and part of the preview (Damon:
       "we can leave the panel where it is for now").
       PREVIOUS (QA 78, Sep 27): a band under the preview, both rows on one
       centered line, the color first. */
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-phone-variants {
        grid-column: 1;
        grid-row: 4;
        align-self: stretch;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        align-items: stretch;
        box-sizing: border-box;
        min-width: 0;
        /* ★ A151 QA 1 (Damon, Oct 10, 2026, from his phone): "let's bump the Size
           block down 3px and the Shirt Color block up 3 px". The two rows are
           pushed to the ends of this box, so 3px more padding at each end is
           exactly that - 18px, where the slide measured 15px. Every product. */
        padding: 18px 17px;
        background-color: #ADBCCF;
        color: #000000;
        font-size: 16px;
    }
    #fdnc-step3 .fdnc-dyo-phone-variants > .fdnc-dyo-field {
        flex: 0 0 auto;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: space-between;
        align-items: center;
        gap: 8px;
        box-sizing: border-box;
        min-width: 0;
        min-height: 30px;
        margin: 0;
    }
    #fdnc-step3 .fdnc-dyo-phone-variants > .fdnc-dyo-field > .fdnc-dyo-field-legend {
        font-size: 19.5px;
        font-weight: 700;
        line-height: 24px;
        white-space: nowrap;
    }
    /* The lit label ("answer this next") pads itself by 0.5em a side; pulling it
       left by the same keeps its words on the 17px line, lit or not. */
    #fdnc-step3 .fdnc-dyo-phone-variants > .fdnc-dyo-field.is-required-now > .fdnc-dyo-field-legend {
        align-self: center;
        margin-left: -0.5em;
    }
    /* "15 oz" / "One size fits all": words, not a control - at the labels' size,
       right after the label (the mug sketch: 14px after "Size:"). */
    #fdnc-step3 .fdnc-dyo-phone-variants > .fdnc-dyo-field:has(> .fdnc-dyo-size-single) {
        justify-content: flex-start;
        gap: 14px;
    }
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-size-single {
        font-size: 19.5px;
        line-height: 24px;
        white-space: nowrap;
    }
    /* CAPS: NO "Size:" LABEL - Damon, Oct 10, 2026: "what if we just remove the
       'Size:' label and have it just say 'one size fits all' (that should fit)".
       "One size fits all" is 121px in a 162px row. Phones only, and only the
       one-surface shell (.fdnc-product-single); a mug's "Size: 15 oz" keeps its
       label, as his mug sketch has it. */
    #fdnc-step3 .fdnc-product-single .fdnc-dyo-phone-variants > .fdnc-dyo-field:has(> .fdnc-dyo-size-single) > .fdnc-dyo-field-legend {
        display: none;
    }
    /* The color row: label at the left, the color box at the right, the link
       under both. */
    #fdnc-step3 .fdnc-dyo-phone-variants > .fdnc-dyo-field:has(> .fdnc-dyo-swatch-group) {
        position: relative;
        padding-bottom: 31px;
    }
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-swatch-group {
        gap: 0;
        justify-content: flex-end;   /* the box ends on the row's right edge, under the Size dropdown's */
    }
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-swcurrent .fdnc-dyo-swatch-color {
        box-sizing: border-box;
        width: 36px;
        height: 29px;
    }
    /* left: -9px - the lit label reaches 9px left of the row, and the slide
       centers the link under the label and the box together. */
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-swmore,
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-swmore-phone-only {
        position: absolute;
        left: -9px;
        right: 0;
        bottom: 0;
        display: block;
        margin: 0;
        line-height: 24px;
        text-align: center;
        /* ONE LINE, ALWAYS - there are 31px under the row, room for one.
           (A151 QA 2, Oct 10, 2026, made the link "tap to select a color", which
           measured 156px in a 171px space and fit; QA 4 the same evening put
           "tap to select" back - 98px.) */
        white-space: nowrap;
    }
    /* A narrower phone: the preview is half the screen, so the panel is 139px
       tall and 180px wide at 360px. The rows keep their sizes; the padding
       gives way so "Size:" and its dropdown still share a line. */
    @media (max-width: 389px) {
        #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-phone-variants {
            padding: 13px 11px;   /* QA 1: 3px more at each end here too (was 10px) */
        }
        #fdnc-step3 .fdnc-dyo-phone-variants > .fdnc-dyo-field {
            gap: 6px;
        }
    }
    /* The smallest phones (320px - an iPhone SE of 2016): the column is 160px,
       where the 19.5px labels and the 75px CLEAR no longer fit. Measured there:
       CHANGE TEMPLATE ends at 174px and help starts at 236px, so CLEAR gets the
       62px between them; the lit "Shirt Color:" and the color box need 17px
       lettering to share a line; the strip's words need 18px. */
    @media (max-width: 349px) {
        #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-clear-design {
            width: 56px;
            margin-left: 16px;
            font-size: 12px;
            letter-spacing: 0;
        }
        #fdnc-step3 .fdnc-dyo-editor-left > #fdnc-dps-tap-hint:not([hidden]) {
            font-size: 18px;
        }
        #fdnc-step3 .fdnc-dyo-phone-variants > .fdnc-dyo-field > .fdnc-dyo-field-legend,
        #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-size-single {
            font-size: 17px;
        }
        #fdnc-step3 .fdnc-dyo-size-select {
            width: 88px;
        }
        /* QA 1 at this width: the panel is 119px tall, so the ends get 11px. */
        #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-phone-variants {
            padding: 11px 11px;
        }
    }

    /* ★ QA 89 (Sep 27, 2026): "PREVIEW AND ADD TO CART ❯" ON ONE LINE. It needs
       about 277px; the band's desktop 40px side padding (style.css) plus the
       button's own 0.8em a side left about 237px on a 393px iPhone, so it
       wrapped after "TO". With both trimmed there is about 310px even on a
       360px phone, at the same font size. */
    #fdnc-cta-band {
        padding-left: 0;
        padding-right: 0;
    }
    #fdnc-add-to-cart {
        padding-left: 0.3em;
        padding-right: 0.3em;
        white-space: nowrap;
    }
    #fdnc-step3 .fdnc-dyo-editor-left > .fdnc-dyo-editor-instruction {
        grid-column: 1 / -1;
        margin: 0;
        padding: 0 12px;   /* QA 65: the block itself has no side padding now */
        text-align: center;
        font-size: 15px;
    }
    /* QA 75 (Sep 27, 2026): "Current" in place of "Design" on phones. (This
       class carried QA 27's " your" in "Place your / design on:" until QA 77
       put that label back on one line.) */
    .fdnc-word-phone {
        display: inline;
    }
    .fdnc-word-desktop {
        display: none;
    }

    /* The controls, stacked under the pinned block (slides 9a-10a). */
    #fdnc-step3 .fdnc-dyo-editor-right {
        display: flex;
        flex-direction: row;
        flex-wrap: wrap;
        align-items: center;
        column-gap: 18px;
        margin-top: 16px;
        font-size: 16px;
    }
    #fdnc-step3 .fdnc-dyo-editor-right > * {
        flex: 0 0 100%;
        max-width: 100%;
        transform: none !important;   /* desktop's measured alignments */
    }
    /* ★ SHIRT COLOR AND SIZE SHARE ONE LINE (slides 9a/9b):
       "Shirt Color: □ select    Size: [select ▼]".
       ⚠ QA 78: on phones these rows now live in the pinned band
       (.fdnc-dyo-phone-variants, above); these selectors only match for the
       moment before js/shop.js moves them. */
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-field:has(> .fdnc-dyo-swatch-group),
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-field:has(> .fdnc-dyo-size-group),
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-field:has(> .fdnc-dyo-size-single) {
        flex: 0 0 auto;
        flex-direction: row;
        align-items: center;
        gap: 8px;
        margin-bottom: 18px;
    }
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-field > .fdnc-dyo-field-legend {
        font-weight: 700;
        white-space: nowrap;
    }
    /* Color: the current-color box and a "select" link that opens the full grid.
       The quick swatches and their divider are desktop's. */
    #fdnc-step3 .fdnc-dyo-swatch-group .fdnc-dyo-swslot,
    #fdnc-step3 .fdnc-dyo-swatch-group .fdnc-dyo-swdivider {
        display: none;
    }
    #fdnc-step3 .fdnc-dyo-swatch-group {
        display: inline-flex;
        align-items: center;
        gap: 8px;
        flex-wrap: nowrap;
    }
    #fdnc-step3 .fdnc-dyo-swmore,
    #fdnc-step3 .fdnc-dyo-swmore-phone-only {
        display: inline-block;
        position: relative;
    }
    #fdnc-step3 .fdnc-dyo-cp-open .fdnc-cp-open-desktop {
        display: none;
    }
    /* ★ Oct 29, 2026 (Damon): the design color rows say "tap to select" on phones. */
    #fdnc-step3 .fdnc-dyo-cp-label .fdnc-cp-lbl-desktop {
        display: none;
    }
    #fdnc-step3 .fdnc-dyo-cp-label .fdnc-cp-lbl-phone {
        display: inline;
    }
    /* ...on one line, and with "skip" beside it the row tightens a little so the three fit a
       360px phone's cap row (its label column is the widest, 8.5em - see the note below). */
    #fdnc-step3 .fdnc-dyo-cp-label {
        white-space: nowrap;
    }
    #fdnc-step3 .fdnc-dyo-colorpick:has(.fdnc-dyo-cp-skip:not([hidden])) {
        gap: 8px;
    }
    #fdnc-step3 .fdnc-dyo-colorpick:has(.fdnc-dyo-cp-skip:not([hidden])) .fdnc-dyo-cp-open {
        gap: 8px;
    }
    #fdnc-step3 .fdnc-dyo-colorpick .fdnc-dyo-cp-skip {
        margin-left: 0;
        padding: .3em .75em;
    }
    /* The narrowest phones (under 375px - a 360px Android): measured, the cap's row ran 12px
       past its box at the sizes above, so the gaps and the button's sides shrink once more. */
    @media (max-width: 374px) {
        #fdnc-step3 .fdnc-dyo-colorpick:has(.fdnc-dyo-cp-skip:not([hidden])),
        #fdnc-step3 .fdnc-dyo-colorpick:has(.fdnc-dyo-cp-skip:not([hidden])) .fdnc-dyo-cp-open {
            gap: 5px;
        }
        #fdnc-step3 .fdnc-dyo-colorpick .fdnc-dyo-cp-skip {
            padding: .3em .5em;
        }
    }
    #fdnc-step3 .fdnc-dyo-cp-open .fdnc-cp-open-phone {
        display: inline;
    }
    /* ★ Oct 22, 2026 (Damon): once a color is picked, its NAME takes the place of "tap to
       select" (js/design-tool.js initSwatchRows()). A name too long for the row shows as
       much as fits and ends in "..." - so the word is a block of its own, with its own
       underline (a parent's underline does not reach into an inline-block). */
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-swmore {
        min-width: 0;
        max-width: 100%;
    }
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-cp-open {
        max-width: 100%;
    }
    /* ★ Oct 22, 2026 (Damon, from his iPhone): the orange "!" beside Slogan Color "is tiny"
       on phones - 20% bigger here; desktop unchanged. The disc and the mark are sized in
       em, so one font-size grows both together. */
    #fdnc-step3 .fdnc-dyo-text-notice {
        font-size: 1.2em;
    }
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-cp-open .fdnc-cp-open-phone {
        display: inline-block;
        max-width: 100%;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        vertical-align: bottom;
        text-decoration: underline;
    }
    /* QA 9 (Sep 26, 2026): color popovers stay on screen. Never wider than the
       screen; js/shop.js slides one sideways if it would run off an edge; and it
       draws above the pinned block and the product row. */
    #fdnc-step3 .fdnc-dyo-cp-pop {
        max-width: calc(100vw - 16px);
        box-sizing: border-box;
        z-index: 40;
    }
    /* Size: a dropdown that mirrors the radios (js/shop.js buildSizeSelects). */
    #fdnc-step3 .fdnc-dyo-size-group {
        display: none;
    }
    #fdnc-step3 .fdnc-dyo-size-select-wrap {
        display: inline-block;
    }
    /* QA 4 (Sep 26, 2026): narrow enough that Size stays on Shirt Color's line
       (slides 9a/9b); the longest option is "select". */
    /* ★ 15% NARROWER (Damon, Oct 5, 2026: "we can shrink the width of the Size
       dropdown by a 15% I think. This will make it less crowded in that row when
       we increase Product Color's 'select' button"). 94px was QA 78's box from
       the mockup; QA 4's was 6.4em, about 102px. "select" is 39px wide and has
       49px between the left padding and the arrow's 22px. */
    /* ★ A151 (Oct 10, 2026): 100 x 28px, measured on slide 10 - it has the
       panel's row to itself now. (Was 80px wide and about 32px tall.) */
    #fdnc-step3 .fdnc-dyo-size-select {
        width: 100px;
        padding: 3px 24px 3px 0.5em;   /* room on the right for QA 29's arrow */
        background-position: right 8px center;
        font-size: 16px;
    }
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-field:has(> .fdnc-dyo-size-group) {
        flex: 0 1 auto;
        min-width: 0;
    }
    /* QA 7 (Sep 26, 2026): the size prompt reddens the dropdown too - outline
       and text - the way desktop reddens the size boxes. */
    #fdnc-step3 .fdnc-dyo-field.is-size-prompt .fdnc-dyo-size-select {
        border: 3px solid #d81616;
        color: #d81616;
        font-weight: 700;
    }

    /* The label / dropdown rows: label column, then the control takes the rest.
       Desktop's fixed 270px control does not fit beside a label at 390px. */
    #fdnc-step3 .fdnc-dyo-field:has(> select) > select {
        flex: 1 1 auto;
        width: auto;
        min-width: 0;
        max-width: none;
    }
    #fdnc-step3 .fdnc-dyo-field:has(> select) > label,
    #fdnc-step3 .fdnc-dyo-field:has(> .fdnc-dyo-colorpick) > .fdnc-dyo-field-legend,
    #fdnc-step3 .fdnc-dyo-field:has(> .fdnc-dyo-colorpick) > label {
        min-width: 8em;
    }
    /* ★ QA 6 (Sep 26, 2026): "Background:" ON ITS OWN LINE, with the Backdrop
       and Location rows indented UNDER it (slide 10a), so each control gets the
       row's width instead of what is left beside the label. The legend spans the
       first row; desktop's column assignments (radio col 2, control col 3) then
       drop both rows beneath it with no further placement. */
    #fdnc-step3 .fdnc-dyo-field.fdnc-dyo-bgfield {
        width: 100%;
        grid-template-columns: 14px max-content minmax(0, 1fr);
        column-gap: 10px;
        row-gap: 10px;
    }
    #fdnc-step3 .fdnc-dyo-bgfield > .fdnc-dyo-field-legend {
        grid-column: 1 / -1;
        /* QA 11: the label hugs its word, so the orange highlight does too. */
        justify-self: start;
    }
    /* ★ QA 46 (Sep 27, 2026): A BACKDROP-ONLY FIELD ("Backdrop:", no second
       option - B1 on tees today) keeps its swatch on the label's line, lined up
       with "Bark" Color above it (same 8em label, same 15px gap). Keyed on the
       field having no second option, not on a product list. */
    #fdnc-step3 .fdnc-dyo-field.fdnc-dyo-bgfield--single {
        grid-template-columns: 8em minmax(0, 1fr);
        column-gap: 15px;
    }
    #fdnc-step3 .fdnc-dyo-bgfield--single > .fdnc-dyo-field-legend {
        grid-column: 1;
    }
    #fdnc-step3 .fdnc-dyo-bgfield--single .fdnc-dyo-bg-pane {
        grid-column: 2;
    }
    /* ★ Oct 2, 2026 (A134): the cap's label column is 8.5em here, for the same
       reason desktop's is wider - "Decoration Color:" does not fit in 8em and
       pushed its own swatch out of line. Caps only (.fdnc-product-single), in
       the same two places: the label's min-width and the Backdrop field's
       column.
       ⚠ 8.5em, NOT DESKTOP'S 8.75em, AND IT IS MEASURED: the label is 135.8px
       wide at this size, 8.5em is 136px, and on a 360px phone the row has
       336px - 136 + 15 + the 182px "click/tap to select" control leaves 3px.
       At 8.75em the control wrapped onto two lines there. */
    #fdnc-step3 .fdnc-product-single .fdnc-dyo-field:has(> select) > label,
    #fdnc-step3 .fdnc-product-single .fdnc-dyo-field:has(> .fdnc-dyo-colorpick) > .fdnc-dyo-field-legend,
    #fdnc-step3 .fdnc-product-single .fdnc-dyo-field:has(> .fdnc-dyo-colorpick) > label {
        min-width: 8.5em;
    }
    #fdnc-step3 .fdnc-product-single .fdnc-dyo-field.fdnc-dyo-bgfield--single {
        grid-template-columns: 8.5em minmax(0, 1fr);
    }
    #fdnc-step3 .fdnc-dyo-editor-right .fdnc-dyo-price-note,
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-chooser-note,
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-tagline-disclosure {
        width: 100% !important;
        margin: 10px 0 0;
        /* QA 20: desktop pads this by measured field insets; centered, no pads. */
        padding-left: 0 !important;
        padding-right: 0 !important;
        text-align: center !important;
    }
    /* ★ QA 79 (Sep 27, 2026): THE MUG'S LOGO NOTE SITS BELOW BACKGROUND on
       phones - the last thing in the field column - with its authored line
       break, 15% larger (15px -> 17.25px). js/shop.js moves it there from
       CLEAR's old row, and back on desktop. */
    #fdnc-step3 .fdnc-dyo-editor-right > .fdnc-dyo-tagline-disclosure {
        max-width: none;
        margin: 4px 0 0;
        font-size: 17.25px;
        line-height: 1.35;
    }
    /* QA 20: "NOTE: Printing on both sides / will add $5.95 at checkout." */
    .fdnc-br-phone {
        display: inline;
    }

    /* ── QA 8 (Sep 26, 2026): EDGE TO EDGE ─────────────────────────────────────
       The tabs and the lavender steps run to the screen's edges - no white margin
       either side - so the design area gets the width. Same full-bleed idea as
       the banner above them: pull the box out by the gap between its column and
       the viewport on each side. */
    #fdnc-shop-tabs,
    #fdnc-shop-content {
        margin-left: calc(50% - 50vw);
        margin-right: calc(50% - 50vw);
    }

    /* ── THE ADD / PREVIEW LIGHTBOX (slides 12a, 12b) ───────────────────────────
       Full screen, dark, scrolling if it has to. The panels STACK: the first
       side's label and "edit design" above its preview, SWAP between the two,
       and the second side's label and link BELOW its preview (12b). Tees show
       both sides even when single-sided, as desktop does (Damon, Sep 26); caps
       show one panel, labeled MAIN; mugs stack LEFT over RIGHT with no swap.
       ★ #fdnc-review-panels IS DISSOLVED (display: contents) so the two panels
       and the separate swap row can be ordered as siblings - the swap row lives
       outside the panels in the markup and has to land between them. */
    #fdnc-lightbox.fdnc-lightbox-mode-review {
        padding: 0;
        align-items: stretch;
        background: #595959;
    }
    #fdnc-lightbox.fdnc-lightbox-mode-review .fdnc-lightbox-box {
        max-width: none;
        width: 100%;
        max-height: 100%;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        padding: 56px 16px 18px;
        border-radius: 0;
        box-sizing: border-box;
    }
    #fdnc-lightbox-review {
        display: flex;
        flex-direction: column;
        align-items: center;
    }
    #fdnc-review-panels {
        display: contents;
    }
    /* ★ A151 (Oct 10, 2026, slide 11): two more things take a place in this
       order - the yellow "tap previews to zoom" line, in the swap row's slot
       between the pictures (under the one picture on caps), and the tee's
       $5.95 note, after the second picture's block and before the prompt
       ("just pushed down", Damon). Without a place the note sat at the very
       top of the box, which is where a phone showed it after the desktop build. */
    #fdnc-review-panels > .fdnc-review-panel:nth-child(1) { order: 1; }
    #fdnc-review-swap-row                                  { order: 2; }
    #fdnc-review-zoom-hint                                 { order: 2; }
    #fdnc-review-panels > .fdnc-review-panel:nth-child(2) { order: 3; }
    #fdnc-review-back-note                                 { order: 4; }
    #fdnc-review-prompt                                    { order: 5; }
    #fdnc-review-actions                                   { order: 6; }
    #fdnc-review-status                                    { order: 7; }
    .fdnc-review-panel {
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
        align-items: baseline;
        column-gap: 28px;
        width: 100%;
    }
    .fdnc-review-panel > .fdnc-review-heading {
        margin: 0 0 8px;
        font-size: 20px;
    }
    .fdnc-review-panel > .fdnc-review-edit {
        margin: 0 0 8px;
        padding: 0;
        font-size: 17px;
        /* QA 12: one fixed underline gap, so "add design" and "edit design" match. */
        text-decoration-line: underline;
        text-underline-offset: 3px;
        text-decoration-thickness: 1px;
    }
    /* The markup order is heading, preview, link, warning; the label and the
       link share one line ABOVE the preview, so the preview is moved after them. */
    /* ★ QA 19: SIZED FROM THE SCREEN'S HEIGHT so ADD TO CART is on screen
       without scrolling. Two stacked previews share what is left after roughly
       340px of labels, swap, prompt, button and padding; one preview (caps) gets
       it alone. dvh follows Safari's toolbars; vh is the fallback. */
    #fdnc-lightbox-review {
        /* QA 52 (Sep 27, 2026): the budget now includes the "Adding to cart..."
           line under ADD TO CART (+36px) - it was landing below the screen on a
           double-sided tee, where two previews use the space. */
        --fdnc-rv-two: min(290px, calc((100vh - 376px) / 2));
        --fdnc-rv-one: min(290px, calc(100vh - 286px));
    }
    @supports (height: 100dvh) {
        #fdnc-lightbox-review {
            --fdnc-rv-two: min(290px, calc((100dvh - 376px) / 2));
            --fdnc-rv-one: min(290px, calc(100dvh - 286px));
        }
    }
    /* ★ QA 33 (Sep 26, 2026): THE PREVIEW ALWAYS TAKES A WHOLE LINE. Once QA 19
       made it narrower than the panel, the second side's "BACK  edit design"
       slid up beside it. Its side margins now fill the rest of the line, so
       nothing can share it - the label lands underneath, as on slide 12b. */
    .fdnc-review-panel {
        --fdnc-rv: var(--fdnc-rv-two);
    }
    .fdnc-review-panel:only-child {
        --fdnc-rv: var(--fdnc-rv-one);
    }
    .fdnc-review-panel > .fdnc-review-canvas {
        order: 1;
        flex: 0 0 var(--fdnc-rv);
        width: var(--fdnc-rv);
        max-width: none;
        margin-left: calc((100% - var(--fdnc-rv)) / 2);
        margin-right: calc((100% - var(--fdnc-rv)) / 2);
    }
    /* QA 32: "INTENTIONALLY BLANK" fits inside the shirt at phone size. */
    .fdnc-review-panel .fdnc-review-nodesign {
        max-width: 72%;
        padding: 0.25em 0.55em;
        font-size: 12px;
        letter-spacing: 0.04em;
        line-height: 1.3;
    }
    /* QA 18: with no SWAP between them (mugs), the two previews get the gap the
       swap row would have made.
       ★ A151 (Oct 10, 2026): THE YELLOW LINE MAKES THAT GAP NOW, on tees and
       mugs alike (neither has a swap any more), so this is 0 - it was 40px. */
    #fdnc-lightbox-review:has(#fdnc-review-swap-row[hidden]) #fdnc-review-panels > .fdnc-review-panel:nth-child(2) {
        margin-top: 0;
    }
    /* ★★ A151 (Oct 10, 2026, slide 11; Damon's mug sketch; caps by his word):
       "tap previews to zoom" - yellow italic, between the two pictures. Measured
       on the slide at 393px: the words are 202px wide, which is 23px italic in
       Source Sans Pro, centered in a 56px gap between the pictures.
       Caps have one picture: the line (singular there - the shell words it)
       goes under it, above "How does everything look?". */
    #fdnc-review-zoom-hint {
        display: block;
        margin: 15px 0 14px;
        color: #FFFF00;
        font-size: 23px;
        font-style: italic;
        font-weight: 400;
        line-height: 1.2;
        text-align: center;
    }
    #fdnc-lightbox-review:has(.fdnc-review-panel:only-child) #fdnc-review-zoom-hint {
        margin: 14px 0 0;
    }
    .fdnc-review-panel > .fdnc-review-warning {
        order: 2;
        flex: 0 0 100%;
        text-align: center;
    }
    /* The second side's label and link go UNDER its preview (12b). */
    #fdnc-review-panels > .fdnc-review-panel:nth-child(2) > .fdnc-review-canvas {
        order: -1;
        margin-bottom: 14px;   /* A151: the label's capitals sit 20px under the picture on slide 11 (was 8px) */
    }

    /* ── A151 (Oct 10, 2026): THE TEE'S BACK, ON A PHONE (slide 11) ─────────────
       The desktop build (A148) left these as desktop draws them, which on a
       phone put "remove" off the picture's corner and the note at the top.
       As drawn: BACK under its picture with "remove" beside it, the way FRONT
       has "edit design"; the dropdown; "Motto Color:" with its box and "pick a
       color"; the note in a pale box, two lines; then the prompt and ADD TO
       CART, pushed down by whatever is showing.
       Measured on the slide at 393px: the dropdown and the rows under it are
       322px wide; "Motto Color:" and "pick a color" are 21px (114px and 101px
       wide there), the color box 54 x 34px; the note's two lines are 23px
       italic in a 319px box. */
    .fdnc-review-panel--back > .fdnc-review-remove {
        position: static;
        margin: 0 0 8px;
        font-size: 17px;
        text-decoration-line: underline;
        text-underline-offset: 3px;
        text-decoration-thickness: 1px;
    }
    /* The block takes a whole line of the panel, whatever the screen's width;
       its rows are what is 322px wide, centered. */
    #fdnc-review-back {
        flex: 0 0 100%;
        width: 100%;
        max-width: none;
        margin: 12px 0 0;
    }
    /* The dropdown keeps the phone's own look for a dropdown - the plain box and
       small arrow of QA 29, which reaches it because the preview box lives
       inside #fdnc-step3 - with its words centered, as slide 11 draws
       "no back design". */
    #fdnc-back-design {
        max-width: 322px;
        margin: 0 auto;
    }
    /* ★ A151 QA 5 (Damon, Oct 10, 2026, from his phone): "the back-design
       dropdown font is too small ... Increase it 15%? Or 20%?" - "20%". 16px
       becomes 19.2px, close to "Motto Color:" and "pick a color" under it
       (21px). "FD&C Motto - FOREVER" is 182px at that size, in 288px of room.
       THE BOX STAYS 34px TALL - the padding is trimmed to make up for the
       taller line (25px + 2 x 3.5px + the 1px edges) - because with no back
       design ADD TO CART sits 6px off the bottom of an 852px screen, and a
       taller box would push it under.
       ⚠ TWO IDS ON PURPOSE: the size and padding this replaces come from
       `#fdnc-step3 select` (QA 29), which a bare #fdnc-back-design does not
       out-rank. */
    #fdnc-step3 #fdnc-back-design {
        padding-top: 3.5px;
        padding-bottom: 3.5px;
        font-size: 19.2px;
        line-height: 1.3;
    }
    #fdnc-back-color-row {
        box-sizing: border-box;
        max-width: 322px;
        margin: 19px auto 0;
        padding: 0 0 0 10px;
        align-items: center;
        font-size: 21px;
    }
    /* ⚠ #fdnc-step3 IN THESE SELECTORS IS LOAD-BEARING. The editor's phone rules
       give every color row's label a min-width of 8em (#fdnc-step3 ... :has(>
       .fdnc-dyo-colorpick) > .fdnc-dyo-field-legend, further up) and the preview
       box is inside #fdnc-step3, so that rule reaches this label and out-ranks
       the desktop file's `min-width: 0` for it. At 21px, 8em is 168px, which
       pushed "pick a color" onto two lines. */
    #fdnc-step3 #fdnc-back-color-row > .fdnc-dyo-field-legend {
        min-width: 0;
        white-space: nowrap;
    }
    #fdnc-step3 #fdnc-back-color-row .fdnc-dyo-cp-open {
        gap: 22px;
    }
    #fdnc-step3 #fdnc-back-color-row .fdnc-dyo-cp-view {
        width: 54px;
        height: 34px;
    }
    #fdnc-step3 #fdnc-back-color-row .fdnc-dyo-cp-label {
        white-space: nowrap;
    }
    /* Oct 30, 2026: the two-sided note beside the open list (css/design-tool.css) - the size
       and shape the phone's on-page note had, black with white words. */
    .fdnc-back-fee-note.is-phone {
        width: max-content;
        min-width: min(319px, calc(100vw - 16px));   /* never narrower than the on-page note was */
        padding: 8px 12px;
        font-size: 23px;
        line-height: 1.17;
    }
    #fdnc-review-back-note {
        box-sizing: border-box;
        width: 319px;
        max-width: 100%;
        margin: 26px auto 0;
        padding: 8px 12px;
        background: #F2F2F2;   /* sampled from the slide; desktop's strip is white */
        font-size: 23px;
        line-height: 1.17;
    }
    #fdnc-review-swap-row {
        margin: 12px 0;
    }
    #fdnc-review-swap-row .fdnc-swap-h {
        display: none;
    }
    #fdnc-review-swap-row .fdnc-swap-v {
        display: inline;
        /* QA 51: heavier arrows. The glyph has no bold cut in this font, so
           the stroke does the thickening. */
        font-weight: 900;
        -webkit-text-stroke: 0.7px currentColor;
    }
    /* "How does everything look?" only (12a/12b; Damon, Sep 26). */
    #fdnc-review-prompt .fdnc-review-prompt-more {
        display: none;
    }
    #fdnc-review-prompt {
        margin: 18px 0 12px;
        font-size: 20px;
    }
    /* close: a white chip, top right (12a/12b). desktop measures and shifts it
       (alignReviewClose); on phones it simply sits in the corner. */
    #fdnc-lightbox.fdnc-lightbox-mode-review #fdnc-review-close {
        position: absolute;
        top: 14px;
        right: 14px;
        transform: none !important;
        padding: 4px 12px;
        background: #ffffff;
        color: #333333;
        border: 1px solid #333333;
        border-radius: 2px;
        font-size: 17px;
        z-index: 2;
    }
    #fdnc-lightbox.fdnc-lightbox-mode-review #fdnc-review-close:hover,
    #fdnc-lightbox.fdnc-lightbox-mode-review #fdnc-review-close:focus {
        background: #ffffff;
        color: #333333;
    }
    #fdnc-lightbox.fdnc-lightbox-mode-review .fdnc-review-close-x {
        font-size: 1.3em;
    }
    /* ── QA 34 (Sep 26, 2026): THE "ADDED TO CART" CHOICES STACK ─────────────
       CONTINUE SHOPPING over GO TO CART, one line each, both the same width -
       the width of the longer label (a one-column grid sized to its widest
       item, and each button stretched to fill it). */
    #fdnc-lightbox-success .fdnc-lightbox-actions {
        display: grid;
        grid-template-columns: max-content;
        justify-content: center;
        gap: 14px;
    }
    #fdnc-lightbox-success .fdnc-lightbox-actions > button {
        width: 100%;
        margin: 0;
        white-space: nowrap;
    }

    /* ── QA 29 (Sep 26, 2026): RECTANGULAR DROPDOWNS ───────────────────────────
       The iPhone draws selects as rounded pills; these are forced to a plain box
       with a small ▼, which the page draws itself. The list that opens is still
       the phone's own picker. */
    #fdnc-step3 select {
        -webkit-appearance: none;
        appearance: none;
        border: 1px solid #767676;
        border-radius: 3px;
        background-color: #ffffff;
        /* ★ A151 QA 6 (Damon, Oct 10, 2026, from his phone): "make the little
           triangle in the dropdown larger", then "bump the triangle size up in all
           dropdowns?" - 16 x 10px, where QA 29's was 10 x 6. Every dropdown inside
           step 3: Size, the design rows, and the tee's back-design dropdown in the
           preview box. Slide 10 draws Size's triangle about this big.
           ⚠ THE RIGHT PADDING IS NOT WIDENED, BY HIS CHOICE ("i think we could
           skip it for now"). The triangle now ends 24px from the box's right edge
           and the words stop at 26px (24px in the Size dropdown), so an option
           long enough to fill its box would come within 2px of it. None does
           today; "select a shirt color first" on a 360px phone is the closest.
           If one ever touches, the fix is padding-right here, a few pixels. */
        background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='10' viewBox='0 0 16 10'%3E%3Cpath d='M0 0h16L8 10z' fill='%231a1a1a'/%3E%3C/svg%3E");
        background-repeat: no-repeat;
        background-position: right 8px center;
        background-size: 16px 10px;
        padding: 0.35em 26px 0.35em 0.5em;
        color: #1a1a1a;
        font-size: 16px;
        line-height: 1.3;
        box-shadow: none;
    }
    #fdnc-step3 select:disabled {
        background-color: #eeeeee;
        color: #8a8a8a;
        border-color: #b5b5b5;
    }

    /* ── QA 57 (Sep 27, 2026): ALERTS READ LARGER ON PHONES ─────────────────
       The message +10% (1.05em -> 1.155em) and "(click/tap anywhere to close)"
       +15% (0.8em -> 0.92em). Info and confirm alerts only - the preview and the
       added-to-cart screen size their own text. */
    #fdnc-lightbox:not(.fdnc-lightbox-mode-review):not(.fdnc-lightbox-mode-success) #fdnc-lightbox-message {
        font-size: 1.155em;
    }
    #fdnc-lightbox .fdnc-lightbox-hint {
        font-size: 0.92em;
    }

    /* ── QA 56 (Sep 27, 2026): TAP TO ZOOM ─────────────────────────────────────
       A tap on the preview opens this: the design at the full screen width, with
       the product outline and color, on the same dark ground as the add/preview
       screen, and the same white "close" chip top right. */
    #fdnc-zoom-view {
        position: fixed;
        inset: 0;
        z-index: 100001;
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 0 8px;
        background: rgba(20, 20, 20, 0.92);
        box-sizing: border-box;
        overflow: hidden;     /* QA 64 - a zoomed picture is clipped at the screen edge */
        touch-action: none;   /* QA 64 - our pinch, not the browser's page zoom */
    }
    #fdnc-zoom-view[hidden] {
        display: none;
    }
    #fdnc-zoom-view .fdnc-zoom-view-canvas {
        position: relative;
        width: 100%;
        max-width: 100vh;
        aspect-ratio: 1 / 1;
        overflow: hidden;
        background: #ffffff;
        transform-origin: 50% 50%;
    }
    /* QA 64: THE CLOSE BUTTON AND THE HINT SIT ABOVE THE PICTURE, in the fixed
       view, so a zoomed or dragged picture can never cover or move them. */
    #fdnc-zoom-view .fdnc-zoom-view-close,
    #fdnc-zoom-view .fdnc-zoom-view-hint {
        z-index: 2;
    }
    #fdnc-zoom-view .fdnc-zoom-view-hint {
        position: absolute;
        left: 0;
        right: 0;
        bottom: max(24px, env(safe-area-inset-bottom));
        margin: 0;
        text-align: center;
        color: #ffffff;
        font-size: 17px;
        font-style: italic;
        pointer-events: none;
        text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
    }
    #fdnc-zoom-view .fdnc-zoom-view-close {
        position: absolute;
        top: 14px;
        right: 14px;
        display: flex;
        align-items: center;
        gap: 0.5em;
        padding: 4px 12px;
        background: #ffffff;
        color: #333333;
        border: 1px solid #333333;
        border-radius: 2px;
        font-size: 17px;
        cursor: pointer;
    }
    #fdnc-zoom-view .fdnc-zoom-view-close:hover,
    #fdnc-zoom-view .fdnc-zoom-view-close:focus {
        background: #ffffff;
        color: #333333;
    }
    #fdnc-zoom-view .fdnc-review-close-x {
        font-size: 1.3em;
        line-height: 1;
    }

    /* The review is a separate top layer; keep its own hidden things hidden. */
    #fdnc-lightbox [hidden] {
        display: none !important;
    }

    /* ══ A131 (Sep 30, 2026): READY-MADE STEP 2 ON PHONES ══════════════════════
       Source: design bible\mockups\mobile-RMC-mockup.pdf, walked with Damon.
       Slides 1-2: the heading with "open list view" at its right (the slide's
       "expand to column", renamed); a navy band (#4B678F, sampled) holding "view
       all", Our Faves and Best-Sellers; a steel band (#ADBCCF, the same steel as
       the DYO editor's band) holding the design radios; then one product at a
       time at DYO's size, with a "3 of 24" count where dots would be. The filter
       BEHAVES exactly as on desktop (4h, R1-R4) - only its layout changes here.
       Slide 3: the list view, a dark layer (#3B3838, sampled) over everything. */
    #fdnc-rmc-step2.fdnc-step-visible {
        display: flex;
        flex-wrap: wrap;
        align-items: baseline;
        padding: 16px 0 18px;   /* no side padding: the bands run edge to edge */
    }
    /* Desktop's centering spacers (style.css) have no job here. */
    #fdnc-rmc-step2::before,
    #fdnc-rmc-step2::after {
        display: none;
    }
    #fdnc-rmc-step2 > .fdnc-step-label {
        order: 1;
        flex: 0 0 auto;
        margin-left: 16px;
    }
    /* "open list view": a plain underlined link look (rules.md #105: every
       state, or Storefront paints it as a button). */
    #fdnc-rmc-step2 > #fdnc-rmc-listview-open,
    #fdnc-rmc-step2 > #fdnc-rmc-listview-open:hover,
    #fdnc-rmc-step2 > #fdnc-rmc-listview-open:focus,
    #fdnc-rmc-step2 > #fdnc-rmc-listview-open:active {
        order: 2;
        display: inline;
        /* A131 QA 5: 2px up, level with the heading's text (Damon). */
        position: relative;
        top: -2px;
        margin: 0 16px 0 auto;
        padding: 0;
        border: 0;
        border-radius: 0;
        background: none;
        box-shadow: none;
        text-shadow: none;
        color: #1a1a1a;
        font: inherit;
        font-size: 18px;   /* A131 QA 1: was 16px */
        font-weight: 400;
        text-decoration: underline;
        text-underline-offset: 3px;
        cursor: pointer;
    }
    #fdnc-rmc-step2 > #fdnc-rmc-listview-open:focus:not(:focus-visible) {
        outline: none;
    }

    /* The filter: two full-width bands. A grid so "view all" and the pool boxes
       share the first band, centered, and the design radios fill the second; the
       first band's navy is the row's own ::before laid across it. */
    #fdnc-rmc-step2 > .fdnc-rmc-filter {
        order: 3;
        flex: 0 0 100%;
        display: grid;
        grid-template-columns: 1fr auto auto 1fr;
        gap: 0;
        margin: 12px 0 0;
        /* A131 QA 1: was 15px. 17px is the most that keeps all five design
           radios on one line on a 375px phone (measured: 354px of 359). */
        font-size: 17px;
    }
    #fdnc-rmc-step2 > .fdnc-rmc-filter::before {
        content: "";
        grid-column: 1 / -1;
        grid-row: 1;
        /* ⚠ The row keeps desktop's align-items:center, which would shrink an
           empty band to 0px tall - it must stretch to the row's height. */
        align-self: stretch;
        background: #4B678F;
    }
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset,
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset:hover,
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset:focus,
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset:active {
        grid-column: 2;
        grid-row: 1;
        align-self: center;
        margin: 0 24px 0 0;
        /* 16px, not the band's 9px: the button's box is trimmed down to its
           letters (the centering rule below), which took about 16px off its
           height. This gives back the area a thumb can hit - 43px or so,
           just inside the 45.5px band, so the band's height is unchanged. */
        padding: 16px 0;
        color: #ffffff;
        font-weight: 400;
    }
    /* ★ "VIEW ALL" WITH NOTHING TO DO (Damon, Oct 2, 2026, phone QA: "make
       'view all' even darker when inactive").
       ⚠ WHY IT WAS NEVER AS FADED AS style.css ASKED: style.css faded a
       disabled "view all" to 0.225, but Storefront's own stylesheet says
       "button:disabled { opacity: .5 !important }", and !important wins. So the
       button showed at HALF strength at every width - on this navy band, white
       lettering at half strength, which reads as nearly active.
       ⚠ THAT IS WHY THIS RULE CARRIES !important - the only way past the
       parent theme's. With opacity out of the way the color is stated
       outright: #8195B1 is white at 30% over the band's #4B678F (it was
       showing as #A5B3C7). Desktop got the same finding fixed the same day,
       its own way - style.css's fade now carries !important too, and this
       rule, which names the step's id, still wins over it on phones. */
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset:disabled,
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset:disabled:hover {
        opacity: 1 !important;
        color: #8195B1;
    }
    #fdnc-rmc-step2 .fdnc-rmc-filter-group[data-fdnc-group="pool"] {
        grid-column: 3;
        grid-row: 1;
        padding: 9px 0;
        gap: 20px;
        color: #ffffff;
    }
    #fdnc-rmc-step2 .fdnc-rmc-filter-divider {
        display: none;
    }
    #fdnc-rmc-step2 .fdnc-rmc-filter-group[data-fdnc-group="designs"] {
        grid-column: 1 / -1;
        grid-row: 2;
        justify-content: center;
        padding: 9px 8px;
        gap: 6px 10px;
        background: #ADBCCF;
        color: #1a1a1a;
    }
    #fdnc-rmc-step2 .fdnc-rmc-filter-option {
        gap: 6px;
        font-weight: 400;
        /* The height one line of this lettering took before the centering
           rule below: 17px lettering at Storefront's 1.618 line height, 27.5px.
           That rule trims each label's box down to its letters; without this
           both bands would come out about 8px shorter. */
        min-height: 1.618em;
    }
    /* ★★ EVERY LABEL CENTERED ON ITS BOX OR RING - ONE RULE (Damon, Oct 2,
       2026, phone QA: "align the text to the horizontal center of the
       checkboxes (text is a couple of pixels too high now?)", "similarly,
       align the text to the horizontal center of the radio buttons", and then:
       "do the same with 'other' and make it a style rule so that any new
       categories will align correctly").
       WHY THE TEXT SAT HIGH: a line of text is a box with empty room above
       and below the letters, and how that room is split belongs to the FONT.
       The row centered that box, not the letters in it. The site asks for
       Carlito or Calibri here; a phone has neither and uses its own
       sans-serif, whose letters sit high in their box - so the row that was
       right on a Windows desktop was a couple of pixels high on an iPhone.
       THE FIX: "text-box: trim-both cap alphabetic" cuts the label's box down
       to the letters themselves - top of the capitals to the line they stand
       on - so centering the box IS centering the letters, in any font.
       ★ IT IS ON .fdnc-rmc-filter-text, the span inc/rmc-filter.php prints
       around EVERY option's label. A new category or design gets it with no
       css change. "view all" takes the same trim, so it stays level with the
       labels beside it.
       Phones only: desktop was signed off as it is. */
    #fdnc-rmc-step2 .fdnc-rmc-filter-text,
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset {
        text-box: trim-both cap alphabetic;
    }
    /* A browser too old for the trim (iPhones before iOS 18.2). The rule above
       does nothing there, so the lettering is moved down by hand instead -
       0.12em, about 2px, measured from Damon's iPhone screenshot. This nudge
       is right only for the iPhone's own sans-serif, which is why it asks for
       an iPhone (-webkit-touch-callout exists nowhere else): other old
       browsers keep the row as it was rather than get a nudge that is wrong
       for their font. */
    @supports (-webkit-touch-callout: none) and (not (text-box: trim-both cap alphabetic)) {
        #fdnc-rmc-step2 .fdnc-rmc-filter-text,
        #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset {
            position: relative;
            top: 0.12em;
        }
        #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset {
            padding: 9px 0;
        }
    }
    /* 18px boxes and rings, down from desktop's 22px, so the five radios fit
       one line on a 375px phone. Same colors and the same tick and dot. */
    #fdnc-rmc-step2 .fdnc-rmc-filter input.fdnc-rmc-filter-input,
    #fdnc-rmc-step2 .fdnc-rmc-filter input.fdnc-rmc-filter-input:checked {
        width: 18px;
        height: 18px;
        background-size: 13px 13px;
    }
    #fdnc-rmc-step2 .fdnc-rmc-filter input.fdnc-rmc-filter-input[type="radio"]:checked {
        background-image: radial-gradient(circle, #172C51 0 4px, transparent 4.5px);
        background-size: auto;
    }
    /* The usual dark focus ring would vanish on the navy band, so it is white
       there; the steel band keeps the dark one. */
    #fdnc-rmc-step2 .fdnc-rmc-filter-group[data-fdnc-group="pool"] input.fdnc-rmc-filter-input:focus-visible,
    #fdnc-rmc-step2 .fdnc-rmc-filter button.fdnc-rmc-filter-reset:focus-visible {
        outline-color: #ffffff;
    }

    #fdnc-rmc-step2 > #fdnc-rmc-product-carousel {
        order: 4;
        flex: 0 0 100%;
    }
    /* A131 QA 4: 10px more between the filter bands and the picture (was 14px,
       the DYO carousel's). */
    #fdnc-rmc-product-grid.fdnc-carousel-on {
        margin-top: 24px;
    }
    /* A131 QA 2: the arrows come in from the screen edges to 12px from the
       picture (190px wide, centered), and grow from 46px to 60px so they stand
       apart from the small < 1 of 8 > under the picture. The carousel still
       measures their height onto the picture's middle.
       ★ QA 9 (Oct 1, 2026): DYO's step 2 the same - both carousels named. */
    #fdnc-product-carousel > .fdnc-carousel-arrow,
    #fdnc-rmc-product-carousel > .fdnc-carousel-arrow {
        width: 44px;
        height: 72px;
        font-size: 60px;
    }
    #fdnc-rmc-product-carousel > .fdnc-carousel-arrow {
        top: calc(24px + 190px / 2);
    }
    #fdnc-product-carousel > .fdnc-carousel-prev,
    #fdnc-rmc-product-carousel > .fdnc-carousel-prev {
        left: calc(50% - 95px - 12px - 44px);
    }
    #fdnc-product-carousel > .fdnc-carousel-next,
    #fdnc-rmc-product-carousel > .fdnc-carousel-next {
        right: calc(50% - 95px - 12px - 44px);
    }
    /* The count, where the dots would sit (Damon: "the enumeration solution");
       DYO's step 2 too since QA 8. */
    #fdnc-product-carousel > .fdnc-carousel-count,
    #fdnc-rmc-product-carousel > .fdnc-carousel-count {
        margin: 10px 0 0;
    }
    .fdnc-carousel-count-text {
        font-size: 14px;
        color: #333333;
    }
    /* A131 QA 3: shown as "< 1 of 8 >". The brackets are decoration only (Damon),
       and the count is hidden from screen readers anyway - the live line says it. */
    #fdnc-product-carousel .fdnc-carousel-count-text::before,
    #fdnc-rmc-product-carousel .fdnc-carousel-count-text::before {
        content: "<\00a0";
    }
    #fdnc-product-carousel .fdnc-carousel-count-text::after,
    #fdnc-rmc-product-carousel .fdnc-carousel-count-text::after {
        content: "\00a0>";
    }

    /* ── List view (slide 3) ─────────────────────────────────────────────────
       Over everything, scrolling on its own; the page under it is held still
       (html.fdnc-rmc-listview-on, set by js/shop.js). */
    html.fdnc-rmc-listview-on,
    html.fdnc-rmc-listview-on body {
        overflow: hidden;
    }
    #fdnc-rmc-listview {
        display: block;
        position: fixed;
        inset: 0;
        z-index: 100000;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        overscroll-behavior: contain;
        padding: 70px 16px 40px;
        box-sizing: border-box;
        background: #3B3838;
    }
    /* "✕ close": a white chip at the top right, and it stays there while the
       list scrolls under it. */
    #fdnc-rmc-listview-close,
    #fdnc-rmc-listview-close:hover,
    #fdnc-rmc-listview-close:focus,
    #fdnc-rmc-listview-close:active {
        position: fixed;
        top: 12px;
        right: 12px;
        z-index: 1;
        display: inline-flex;
        align-items: center;
        gap: 10px;
        margin: 0;
        padding: 6px 14px;
        border: 1px solid #1f3255;
        border-radius: 2px;
        background: #ffffff;
        box-shadow: none;
        text-shadow: none;
        color: #555555;
        font: inherit;
        font-size: 18px;
        font-weight: 700;
        line-height: 1.2;
        cursor: pointer;
    }
    #fdnc-rmc-listview-close .fdnc-rmc-listview-x {
        color: #1a1a1a;
        font-size: 1.2em;
        font-weight: 300;
        line-height: 1;
    }
    #fdnc-rmc-listview-close:focus:not(:focus-visible) {
        outline: none;
    }
    #fdnc-rmc-listview-list {
        display: flex;
        flex-direction: column;
        align-items: center;
        gap: 28px;
    }
    #fdnc-rmc-listview-list .fdnc-product-card {
        display: block;
        width: 190px;
        color: #ffffff;
    }
    #fdnc-rmc-listview-list .fdnc-product-card:focus:not(:focus-visible) {
        outline: none;
    }

    /* ── A143 (Oct 5, 2026): THE HELP BOX ON PHONES ────────────────────────────
       The picture at 350px (Damon), with the same short-screen limit. Desktop's
       box is 350px too, from its own rule, so the two can be tuned apart.
       ★ GOT IT! IS DESKTOP'S BUTTON NOW (Damon, after his phone pass: "make the
       same adjustments, proportionally, to the GOT IT! button on mobile that
       you did to desktop") - css/design-tool.css draws it for every width. All
       that is left here is the floor: never under 44px tall, for a short
       screen that shrinks the picture. At 350px it is 45px.
       The "? help" button is sized and placed in QA 75's rule above (it sits in
       .fdnc-dyo-editor-design, which js/shop.js moves into the pinned block). */
    /* 1385 x 2247 is the picture (the third cut, Oct 6, 2026; it was 1385 x
       1680 at first); the dvh line is for a phone with its address bar showing
       - see the same rule in css/design-tool.css. */
    #fdnc-lightbox.fdnc-lightbox-mode-help .fdnc-lightbox-box {
        max-width: min(350px, calc((100vh - 2em) * 1385 / 2247));
        max-width: min(350px, calc((100dvh - 2em) * 1385 / 2247));
    }
    #fdnc-help-gotit {
        min-height: 44px;
    }

    /* ── Oct 5, 2026, Damon's phone pass: THE PRODUCT COLOR ROW ────────────────
       "select" IS 20% LARGER ("can 'select' be increased in size 20%?") - 19.2px
       against the band's 16px. Only the product color's link, in the pinned
       band; the design rows' "click/tap to select" links are not touched. The
       band is centered, so the two rows move apart by themselves.
       THE BOX IS WHITE BEFORE A COLOR IS PICKED, ON PHONES ONLY ("just make the
       default color in the shirt color box white. It's confusing to have it
       grayed out"; "just mobile"). The plain swatch look - white, the 1px #999
       edge every swatch has - and still no ring, because the ring means "this
       is the current color". ⚠ PICKING IS STILL REQUIRED: the orange label and
       "Pick a shirt color." stay until a real pick, white included. Desktop
       keeps the pale grayed box (css/design-tool.css, .is-unchosen). */
    #fdnc-step3 .fdnc-dyo-phone-variants .fdnc-dyo-cp-open {
        font-size: 1.2em;
    }
    #fdnc-step3 .fdnc-dyo-swcurrent.is-unchosen .fdnc-dyo-swatch-color {
        background-color: #ffffff;
        border-color: #999;
    }

    /* ── #104 GUARDS - KEEP THESE LAST ──────────────────────────────────────────
       Every display value above out-ranks [hidden]. Nothing hidden may show. */
    #fdnc-step3 [hidden],
    #fdnc-step3 .fdnc-mode-hidden,
    #fdnc-step2 [hidden],
    #fdnc-rmc-step2[hidden],
    #fdnc-rmc-step2 [hidden],
    #fdnc-rmc-listview[hidden],
    #fdnc-product-carousel[hidden],
    #fdnc-product-carousel [hidden] {
        display: none !important;
    }
}

/* ── A155 QA #4 (Oct 13, 2026): "PLEASE ROTATE YOUR PHONE." ON THE SHOP PAGE ─────────
   Damon: "landscape view is completely broken on mobile ... put up an image/alert that
   says to rotate your phone"; "let's just have it on Shop for now". The message is made
   by js/shop.js and lives in every Shop page; it covers the screen only for a phone on
   its side - a touch screen, landscape, under 500px tall (an iPhone on its side is about
   430 tall; a tablet on its side is 700 or more). Turning the phone upright hides it
   again. The navy and white of the "tap preview to zoom" strip. Outside the 1023px block
   above on purpose: a large phone on its side is wider than 1023px. */
#fdnc-rotate-msg {
    display: none;
}
@media (orientation: landscape) and (max-height: 500px) and (hover: none) and (pointer: coarse) {
    #fdnc-rotate-msg {
        position: fixed;
        inset: 0;
        z-index: 2147483600;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 28px;   /* Oct 20, 2026: the room his mockup leaves between the phones and the words */
        padding: 16px;
        background-color: #3A5786;
        color: #ffffff;
        text-align: center;
    }
    #fdnc-rotate-msg p {
        margin: 0;
        font-size: 22px;
        font-weight: 700;
        line-height: 1.3;
    }
}
