/* =============================================================================
   Ring builder — DESKTOP — DRAWERS, POPUP and REVIEW
   Figma file Ex10uQ9OY3OuzSPi4g2hPb, SECTION 14465:38712 (named
   "[Mobile UI] PDP ring builder refresh" -- mislabelled; it holds the 1728px
   DESKTOP frames).

   Frames covered
   --------------
   14465:38713  Select metal      1728 x 1240   drawer `Frame 1171276585` 14465:38956
   14465:38995  Select Shape      1728 x 1240   drawer `Frame 1171276717` 14465:39240
   14465:39286  Select gemstone   1728 x 1240   modal  `gemstones`         14465:39529
   REVIEW       -- NO FRAME ON EITHER BOARD.  See section 5.

   [POPUP] Talk to gemologist has NO desktop frame. The desktop board is eight
   frames (LAYOUT.md section 1) and none of them is the gemologist popup, so
   #contact_modal_popup is deliberately NOT touched above 991px -- it keeps
   contact-modal.css's own `@media (min-width:992px)` treatment. Styling it from
   the mobile frame would be scaling a phone sheet onto a 1728 canvas, which the
   brief explicitly rules out.

   DESKTOP IS A DIFFERENT TREATMENT, NOT A SCALED SHEET
   ----------------------------------------------------
   Mobile parks all three sheets below the frame and slides them up 809px over a
   full-bleed scrim. Desktop splits them in two (LAYOUT.md section 6):

     a) IN-COLUMN DRAWERS (metal, shape). Not centred and not bottom-anchored:
        both sit at x=70, y=769 -- the exact origin of the `Settings` summary
        pill row in the left preview column -- and are 764 wide, i.e. the whole
        left column. They overlay the pills that opened them. Corner radius is
        8 on ALL FOUR corners here, not [8,8,0,0].
     b) A CENTRED MODAL (gemstones). 1394 x 634 at x=167, y=303 -- exactly
        centred on both axes: (1728-1394)/2 = 167 and (1240-634)/2 = 303.

   All three dim the page with a `black mask` that is 1728 x 1260 -- 20px taller
   than the artboard, an overscan so the scrim has no seam -- filled #000000 at
   paint opacity 0.699999988079071. The three STONE frames carry the same node
   at node-opacity 0. Same 0.70 as the mobile file.

   RESPONSIVE MODEL
   ----------------
   Fluid, matching _stone-desktop.css: the 1728 numbers are expressed as
   proportions of the 1576px column band (764 left + 60 gap + 752 right) so they
   land on the exact designed pixels at 1728 and hold the ratio down to 992,
   where the mobile sheet (max-width:991px) takes over. Type sizes stay fixed --
   the board gives one ramp.

   OPEN-STATE HOOKS -- unchanged from the mobile file, re-verified this pass:
     metal / shape   NO state class. simple-select.js:985 / :1011 write an
                     INLINE `display`. Nothing here sets `display` on
                     .metal_dropdown_ssq_options / .shape_dropdown_ssq_options.
     gemstone        .popup-modal-container.gemstone_selection_modal gated on
                     :has(.modal-gemstone-selection) -- Modal is a singleton
                     that never clears its classes (simple-select.js:2583).

   HARD RULE 1: nothing simple-select.js reads is display:none'd here. In
   particular .metal_current_option / .shape_current_option are not touched at
   all -- simple-select.js:989 / :1016 test
   `$(this).parent('.metal_current_option').length === 0`, so flattening or
   hiding either makes every metal and shape click a no-op.

   SPECIFICITY: _stone-desktop.css owns the pill row (`.select_metal_shape`,
   position:static; `.metal_dropdown_ssq`, overflow:hidden). The two rules below
   that have to win match its selectors and rely on load order --
   da-general.php:4355 enqueues _drawers-desktop after _stone-desktop -- rather
   than on !important (brief rule 4).
   ============================================================================= */

@media (min-width: 992px) {

  /* ===========================================================================
     0. TOKENS
     simple-select-redesign.css declares --rb-* inside its own max-width:991px
     block, so none of them exist up here; _stone-desktop.css re-declares them on
     #simple-select-quiz. The gemstone modal is appended to <body>
     (assets/js/main.js:614) and so inherits neither. They are re-declared on
     both roots with byte-identical values, which also means this file works if
     _stone-desktop.css is ever dropped from the enqueue loop.
     Counts are the desktop TOKENS.md occurrence counts.
     ------------------------------------------------------------------------ */
  .popup-modal-container,
  #simple-select-quiz {
    --rb-text-primary:   #0F0E0D;   /* 419 uses */
    --rb-text-secondary: #3E3C39;   /* 433 */
    --rb-border-subtle:  #E4DED8;   /* 193 */
    --rb-surface-card:   #FFFFFF;   /*  52 */
    --rb-surface-page:   #FAF3ED;   /*  75 */
    --rb-brand-green:    #27423B;   /* 120 */
    --rb-grey-disabled:  #D0D0D0;   /*  55 */
    --rb-border-subtle-40: rgba(228, 222, 216, 0.4000000059604645);
    --rb-border-subtle-60: rgba(228, 222, 216, 0.6000000238418579);
    --rb-font-body:      'FoundersGrotesk', sans-serif;
    --rb-font-display:   'Canela', serif;
    --rb-ls-tight:       -0.21px;
    --rb-ls-wide:        -0.5px;
    --rb-radius-sm:      4px;
    --rb-radius-md:      8px;
    --rb-stroke:         1px;
    --rb-stroke-thick:   2px;

    /* `black mask` 14465:38955 / 14465:39237 / 14465:39528 */
    --rb-scrim: rgba(0, 0, 0, 0.699999988079071);

    /* Picker panel box, identical on metal and shape: 754 x 194, pad
       t0 r21 b0 l21, itemSpacing 10, rectangleCornerRadii [0,0,8,8],
       fill #FFFFFF, clipsContent -- `Select metal popup` 14468:42509 and its
       shape twin 14468:42788. */
    --rb-d-pop-pad-top: 0px;
    --rb-d-pop-pad-x: 21px;
    --rb-d-pop-pad-bottom: 0px;
    --rb-d-pop-h: 194px;

    /* `Container` 14468:42771 is 754 x 724 and the 594 x 495 photo ends at
       container-relative y518, so the card carries 206px under the photo:
       50 to the pill row, the 44 row itself, then 112 of clear card.  All three
       as a share of the card's WIDTH (754), because that is what a percentage
       margin or padding resolves against. */
    --rb-d-card-photo-gap: 6.631299734748011%;   /*  50 / 754 */
    /* 92, NOT the board's 112. Owner: *"also padding bottom can be reduced"*,
       quoting this exact declaration through `.quiz-image`.
       This slack is not decoration -- it is the room the metal/shape panel
       opens into. MEASURED at 1728 with the metal sheet open:
       `.metal_dropdown_ssq_options` is [70,795,754,194] with `bottom: 0`, and
       the photo `.sss-metal-image` ends at y=769, so the board's 112 leaves 26px
       of clearance between the open panel and the ring. 20 of those 26 are given
       back here and 6 are kept, which is the most that can be returned without
       the sheet starting to cover the photo. Anything below 92 needs the panel
       re-anchored, not this number re-tuned. */
    --rb-d-card-slack: 12.201591511936340%;      /*  92 / 754 */
    /* `Settings` 14468:42774 -- 460 x 44, two 220 pills, 20 between them.
       460 / 754, and the gap as a share of the ROW (20 / 460) so the two
       measurements stay in their own coordinate systems. */
    --rb-d-pills-w: 61.007957559681698%;
    --rb-d-pills-gap: 4.347826086956522%;
    --rb-d-pills-h: 44px;
    /* 754 (Container) / 764 (the live column band's left column) -- see the
       WIDTH rule in section 1 for why the frame's 754 is kept and the 10px is
       taken off the right. */
    --rb-d-pop-w: 98.6910994764398%;
    /* 754 - 21 - 21 = 712: the content box every row inside the panel is
       measured against (swatch run, tile run, footer). */
    --rb-d-pop-content: 712px;

    /* SPACE_BETWEEN resolves the declared itemSpacing away on both rows, so the
       RESOLVED gaps are what is built:
         metal `Frame 38492` 712 x 72 -- 8 swatches x 48 = 384 over 7 gaps
                (712 - 384) / 7 = 46.857142857142854, pitch 94.857142857142854,
                landing the dots on the frame's 101 / 195.86 / ... / 765
         shape `Frame 38498` 712 x 55 -- 10 tiles x 55 = 550 over 9 gaps
                (712 - 550) / 9 = 18 exactly, pitch 73, landing the tiles on
                the frame's 91 / 164 / ... / 748
       The declared itemSpacings (42 on metal, 16 on shape) are auto-layout
       minima and are NOT the drawn gaps.
       Both are then expressed as a PERCENTAGE OF THE 712 CONTENT BOX rather
       than as a frozen pixel gap, which is what makes SPACE_BETWEEN survive the
       fluid grid: a percentage margin resolves against the containing block's
       width, so the gap shrinks with the panel exactly as an auto-layout
       SPACE_BETWEEN row would.
         metal  46.857142857142854 / 712 = 328/4984 = 41/623 = 6.58105939004815%
         shape                  18 / 712 = 2.528089887640449%
       clamp()ed the same way _stone-desktop.css:775 clamps the carat row's own
       SPACE_BETWEEN gap: an 8px floor so the run never closes up when it wraps
       at 992-1280, and the 1728 figure as the ceiling so the gap cannot grow
       past the drawn one on a viewport wider than the board. */
    --rb-d-pop-swatch-gap: clamp(8px, 6.58105939004815%, 46.857142857142854px);
    --rb-d-pop-tile-gap: clamp(8px, 2.528089887640449%, 18px);

    /* `Frame 1171276721` itemSpacing 18 -- the gap between the option row and
       the footer, on both panels. */
    --rb-d-pop-stack-gap: 18px;

    /* The metal/shape drawers overlay the left preview column, whose own stack
       ends well above the footer; z just has to clear the sticky CTA block. */
    --rb-d-drawer-z: 1000;
  }


  /* ===========================================================================
     1. THE PICKER PANEL -- `Select metal popup` 14468:42509 (in [Popup] Select
        Metal 14468:42267) and its shape twin 14468:42788 (in [Popup] Select
        Shape 14468:42546).  BOTH ARE 754 x 194.

     THIS SECTION WAS REBUILT AGAINST THE 14468:4xxxx POPUP FRAMES.
     It previously described section 14465:38712's `Select metal` /
     `Select Shape` frames, where the picker was a 764 x 218 / 764 x 201 card
     pinned to the TOP of the pill row with cornerRadius 8 on all four corners.
     The 14468 popup frames draw a different thing and they are the ones the
     client signed off, so every number below moved:

       was (14465)                     now (14468)
       -----------------------------   --------------------------------------
       764 wide (352+60+352)           754 wide  (Container width)
       top of the pill row             BOTTOM of the card, covering the pills
       height HUG (218 / 201)          194
       radius 8 8 8 8                  0 0 8 8   (`rectangleCornerRadii`)
       padding 19 / 21 / 21 / 21       0 / 21 / 0 / 21
       swatch pitch 96                 94.857142857142854  (SPACE_BETWEEN)
       tile pitch 74.11                73                  (SPACE_BETWEEN)

     THE POPUP IS A MODAL OVER THE PAGE, NOT AN IN-PLACE COLUMN SWAP.
     In both frames `black mask` (1728 x 1240, #000000 a=0.70) is child index 4
     of 5 -- above `Customization`, `Footer`, `Setting details` and `Header`, so
     all four are dimmed -- and `Container` is the LAST child, the only node
     rendered above the scrim at full brightness.  Nothing is removed or moved:
     `Customization` stays at x894 y194 and `Setting details` at y194.  So the
     scrim moved off the panel and onto the CARD (see the scrim rule below):
     an outer box-shadow paints outside its own border box and underneath its
     own background, which dims the page and leaves the card bright in one
     declaration.  On the old build the shadow sat on the panel, whose z-index
     put it above `.sss-metal-image`, and the ring photo was dimmed with the
     page -- the opposite of what the frames draw.

     ANCHORING.  `Container` is 754 x 724 and the panel is its child at
     container-relative x0 y525, i.e. flush with the card's left edge and glued
     to its bottom.  The live card is `.quiz-image` (764 at x70, owned by
     _stone-desktop.css:492), which already holds the same three things the
     Figma `Container` holds: the ring photo (`.sss-metal-image`), the two
     summary pills (`.select_metal_shape`) and this panel.  So the panel needs
     no page coordinates -- `.quiz-image` is made the containing block and the
     panel is `left:0; bottom:0` inside it, which is exactly the design's
     parent/child relationship and is proportional by construction.

     THE 5px SLIVER IS NOT BUILT.  In the source the panel ends at container-rel
     719 and the Container at 724, leaving a 5px white sliver of card below the
     panel's rounded bottom corners.  That is Container bleed, not a designed
     gap: [0,0,8,8] only reads as the card's own bottom radius when the two
     bottom edges coincide, and on the live card (which has no 112px tail below
     the pills, unlike the 724-tall Figma Container) a 5px inset would leave the
     bottom 5px of the pill row poking out from under the white panel.
     `bottom: 0` is used and the 5px drift recorded, the same way the old
     section recorded the 0.33px pill-row drift.

     x80 vs x70 -- NOT AVERAGED, AND NOT BUILT AS EITHER.  `Container` and
     `Setting details` are at x80 in the metal frame and x70 in the shape frame,
     while `Header`, `Footer` and `Customization` (x894) are identical in both.
     DRAWERS.md Q4 reads the 70 as a slip and says build 80.  Neither number is
     hard-coded here: the panel is pinned to the live card's own left edge, and
     the card is placed by _stone-desktop.css's column band (764 at x70), so the
     screens agree with each other whatever the board says.  The consequence is
     recorded on the width declaration below.
     ------------------------------------------------------------------------ */

  /* _stone-desktop.css:527 sets position:static on the pill row to undo the
     base sheet's absolute. relative + no offsets keeps it exactly where it is. */
  #simple-select-quiz .select_metal_shape {
    /* STATIC, and it matters now.  This row used to be `relative` here, which
       made IT the nearest positioned ancestor of the two absolutely positioned
       panels -- harmless only for as long as the row was the full width of the
       card, because then the panel's `width: 98.69%` resolved against 764 and
       landed on 754 by coincidence.  The moment the row became the source's
       460 (below), the same 98.69% resolved against 460 and the panel came out
       460 wide: its 712 content box collapsed to 418, the eight metal swatches
       wrapped two-up, and the panel grew from 194 to 256.  Static hands the
       containing block back to `.quiz-image`, which is the card the panel is
       measured against. */
    position: static;

    /* INSIDE THE CARD, not under it.  _stone-desktop.css:529 builds this row
       from the older 14465 frames: full card width (764) with a 60px gap, two
       352 pills, welded to the card's bottom edge.  `Settings` 14468:42774 on
       the current board is 460 x 44 centred in the 754 Container with 112px of
       card beneath it -- two buttons sitting IN the card, which is what the
       full-bleed row stopped reading as once the white moved to the card.
       Same selector, later sheet (da-general.php:4355 enqueues this after
       _stone-desktop), so no !important is needed. */
    width: var(--rb-d-pills-w);
    margin: var(--rb-d-card-photo-gap) auto 0;
    gap: var(--rb-d-pills-gap);
  }
  #simple-select-quiz .select_metal_shape > .metal_dropdown_ssq,
  #simple-select-quiz .select_metal_shape > .shape_dropdown_ssq {
    /* 220 of the row's 460, i.e. half of what the 20px gap leaves.  Written as
       a resolved percentage rather than `flex: 1` for the reason
       _stone-desktop.css:545 records: Chrome split two flexible items 353 / 351
       rather than evenly. */
    flex: 0 0 calc((100% - var(--rb-d-pills-gap)) / 2);
    height: var(--rb-d-pills-h);
  }

  /* THE CARD.  `Container` 754 x 724 -- the only node above the scrim.
     _stone-desktop.css:503 sets `position: static` on this element (to undo the
     base sheet's relative, which the base sheet used to park the pills; the
     pills are static there too, so relative is inert for them).  Restoring
     relative makes `.quiz-image` the containing block for the panel below.
     Matching selector + load order, not !important: da-general.php:4355
     enqueues _drawers-desktop AFTER _stone-desktop. */
  #simple-select-quiz .quiz-image {
    position: relative;

    /* THE CARD IS THE WHITE, and the pills live INSIDE it.
       `Container` 14468:42771 is 754 x 724 and holds BOTH the 594 x 495 photo
       and the 460 x 44 `Settings` pill pair, which sits at container-relative
       y568 with 112px of card under it.  The build had the white on
       `.sss-metal-image` (the photo panel) only, so the pill row -- full-bleed
       764 and welded to the card's bottom edge -- was drawn on the page ground
       BELOW the white, reading as two buttons under the card rather than two
       buttons in it.

       So the ground moves up to the card and the card carries the source's
       slack.  `.sss-metal-image` keeps its own white; same colour, so the two
       are indistinguishable where they overlap. */
    background: var(--rb-surface-card);
    border-radius: var(--rb-radius-md);

    /* Padding is what moves the PANEL off the photo, and it is the only thing
       that can: the panel is absolutely positioned at `bottom: 0`, and an
       absolutely positioned box resolves its offsets against the padding BOX,
       whose bottom edge is the card's bottom edge whatever the padding is.  So
       the panel stays welded to the card's bottom while the card grows
       downwards under the photo -- the one direction that clears the photo
       without resizing or moving it.  Before this the panel was drawn straight
       over the ring: 134px of overlap measured at 1728/1920/2560, 174px at
       1440 where the tile run wrapped and made the panel 234 tall.

       112 / 754 of the card's width -- percentage padding resolves against the
       containing block's WIDTH, which is what keeps the slack fluid with the
       column band instead of freezing at a 1728-only pixel figure.
       --rb-d-pop-reserve is the open-drawer top-up, normally 0: this slack
       alone clears the 194px panel at every width where its rows do not wrap
       (503 photo + 51 + 44 + 113 = 711 card, panel top 517 vs photo bottom 503),
       and JS adds the difference on the narrow viewports where the metal run
       still wraps and the panel grows past it. */
    padding-bottom: calc(var(--rb-d-card-slack) + var(--rb-d-pop-reserve, 0px));
  }

  /* simple-select.css:719 / :755 make each pill position:relative so the base
     sheet's 150px dropdown box could hang off it.  Static here so the panel's
     containing block resolves past the 352px pill and out to the 754-wide card.
     The only absolutely-positioned descendant of either pill is the visually
     hidden "Metal" / "Shape" lead-in span (_stone-desktop.css:562), and it
     declares no offsets -- an absolutely positioned box with all-auto offsets
     stays at its static position -- so re-parenting its containing block moves
     nothing. */
  #simple-select-quiz .select_metal_shape > .metal_dropdown_ssq,
  #simple-select-quiz .select_metal_shape > .shape_dropdown_ssq {
    position: static;
  }

  /* _stone-desktop.css:551 clips each pill (overflow:hidden) so the 34px pill
     radius holds.  An absolutely positioned box is still clipped by an ancestor
     with overflow:hidden when that ancestor sits between it and its containing
     block, which the pill does, so the clip has to be lifted or the panel is
     cropped to 48px.  Unclipped ONLY while the panel is actually open: jQuery
     .show() writes `display: block` inline (simple-select.js:990/:1016), which
     is a real, reachable hook -- and the clip is restored the moment it
     closes. */
  #simple-select-quiz .select_metal_shape > .metal_dropdown_ssq:has(.metal_dropdown_ssq_options[style*="display: block"]),
  #simple-select-quiz .select_metal_shape > .shape_dropdown_ssq:has(.shape_dropdown_ssq_options[style*="display: block"]) {
    overflow: visible;
  }

  /* ...AND THE PILL ITSELF STOPS PEEKING OUT OF THE TOP OF IT.
     Owner, circling a pale rounded strip directly above SELECT YOUR METAL:
     *"this should not be visible"*. It is the CLOSED pill, still painted behind
     the open panel -- MEASURED at 1440: `.metal_dropdown_ssq` is
     [621..665] with `background: rgba(228,222,216,0.4)` and `border-radius:
     34px`, while the panel starts at 628, so the pill's top 7px and its corner
     radius show above the panel's square top edge.

     The pill's CONTENT is already covered by the panel and its click target has
     to stay -- tapping the pill is how a picker closes (simple-select.js:986) --
     so only the ground is dropped, and only while the panel is open. */
  #simple-select-quiz .select_metal_shape > .metal_dropdown_ssq:has(.metal_dropdown_ssq_options[style*="display: block"]),
  #simple-select-quiz .select_metal_shape > .shape_dropdown_ssq:has(.shape_dropdown_ssq_options[style*="display: block"]) {
    background: transparent;
    border-radius: 0;
  }

  /* THE SCRIM HAS TO REACH THE BOTTOM BAR TOO.
     Owner, with an arrow drawn from the dimmed page to the undimmed bar: *"it
     kinda puts everything else into the background, right, but does not put the
     bottom bar in background -- this also needs to be in the background, not
     highlighted"*.

     The scrim is not an element: it is `box-shadow: 0 0 0 1440px` on
     `.sss-metal-image` (THE SCRIM, above), which paints outward from the photo
     and dims whatever is beneath it. `.ssq_bottom_nav` is `position: fixed` and
     does not end up beneath it -- MEASURED while the picker is open: scrim
     z-index 1000, bar z-index 99, and the bar still painted at full brightness.
     Lowering the bar's z-index does dim it, but it also drops the bar under the
     thumbnail strip, which then bleeds through it -- tried, screenshotted,
     rejected.

     So the bar is dimmed IN PLACE instead, with the same colour the shadow
     uses. It keeps its own stacking, nothing moves, and it is painted only
     while a picker is actually open -- the same inline-display hook the scrim
     and the clip-lift above both key off. `pointer-events: none` so the bar's
     controls are still reachable: the shopper can press CONTINUE straight from
     here, exactly as they could before. */
  /* ...AND ONLY ON THE STEP WHERE THE BAR ESCAPES THE SCRIM. Owner, with the
     picker open on RING SIZE: *"the background is black for the bottom bar in
     this -- make it like the others, rest opacity."* It was: the scrim DOES
     reach the bar on that step, so this overlay was a second 0.698 on top of
     it. MEASURED, same build, sampling the rendered pixels:

       stone step   bar rgb(76,74,72)   dimmed page rgb(72,70,68)   -- matched
       size step    bar rgb(23,22,21)   dimmed page rgb(76,74,72)   -- doubled

     0.698 over 0.698 is 0.909, and 0.091 of the bar's #FAF3ED is (23,22,21) --
     exactly what was measured. So the overlay is scoped to the stone step,
     which is the one state where the bar paints above the shadow. */
  #simple-select-quiz:has(#ssq_select_stone.active):has(.metal_dropdown_ssq_options[style*="display: block"]) .ssq_bottom_nav::after,
  #simple-select-quiz:has(#ssq_select_stone.active):has(.shape_dropdown_ssq_options[style*="display: block"]) .ssq_bottom_nav::after {
    content: "";
    position: absolute;
    /* THE BORDER IS OUTSIDE `inset: 0`. Owner, after the first pass: *"this line
       is still bright, not same like the rest, below the popup."* An absolutely
       positioned child resolves its offsets against the PADDING box, so
       `inset: 0` stops at the inside edge of the bar's 1px top rule and left it
       lit across the full width -- the one bright line in a dimmed page. Pulled
       up by the stroke's own width so the overlay covers it. */
    inset: calc(-1 * var(--rb-stroke)) 0 0;
    z-index: 3;
    background: var(--rb-scrim);
    pointer-events: none;
  }

  /* THE SCRIM.  `black mask` 14468:42268 / 14468:42547 -- 1728 x 1240, #000000
     at paint opacity 0.699999988079071, clip=true.  No DOM counterpart, and a
     real hit-tested scrim element would swallow the click on the pill, which is
     how a picker with no DONE control gets closed (simple-select.js:986).  An
     outer box-shadow is not hit-tested, paints outside the border box only, and
     paints beneath the element's own background -- so one declaration on the
     CARD dims the whole page and leaves the card, the ring photo, the pills and
     the panel all at full brightness, which is the z-order the frames draw.
     Gated on the same inline-display hook, so the page is only dimmed while a
     picker is actually open. */
  #simple-select-quiz .quiz-image:has(.metal_dropdown_ssq_options[style*="display: block"]),
  #simple-select-quiz .quiz-image:has(.shape_dropdown_ssq_options[style*="display: block"]) {
    z-index: var(--rb-d-drawer-z);
    box-shadow: 0 0 0 100vmax var(--rb-scrim);

    /* The card carries the white ground and the full radius in every state
       now (see THE CARD IS THE WHITE above), and the slack it reserves under
       the photo is what the panel drops into, so the open state adds only the
       scrim and -- on the narrow viewports where the panel's rows still wrap --
       the JS top-up below. */

}

  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options {
    /* Resets simple-select.css:691 / :726 (top:28; left:45-46; width:150;
       1px border) and _stone-desktop.css's inherited box. */
    position: absolute;
    /* Glued to the card's bottom edge -- see THE 5px SLIVER in the section
       header for why the source's 5px inset is recorded and not built. */
    top: auto;
    bottom: 0;
    z-index: var(--rb-d-drawer-z);
    box-sizing: border-box;

    /* `display` is DELIBERATELY ABSENT -- jQuery owns it (file header). */

    /* padding t0 r21 b0 l21 on both panels. The 21s are what turn the 754 box
       into the 712 content box that the swatch row, the tile row and the footer
       are all measured against. */
    padding: var(--rb-d-pop-pad-top) var(--rb-d-pop-pad-x) var(--rb-d-pop-pad-bottom);
    background: var(--rb-surface-card);
    border: 0;
    /* `rectangleCornerRadii` [0, 0, 8, 8] -- the inverse of the mobile sheet.
       The panel is glued to the bottom of the card, so only its bottom corners
       are round and they are the card's own bottom corners. */
    border-radius: 0 0 var(--rb-radius-md) var(--rb-radius-md);
    /* clipsContent: true on both panels. Nothing is expected to overflow --
       every row is inside the 21px inset and `min-height` below lets the box
       grow rather than crop when the rows wrap -- so this only guarantees the
       bottom radius clips its corners. */
    overflow: hidden;

    /* 194 on BOTH panels, even though the shape panel's inner stack is 115 and
       the metal panel's is 132: the source fixes the frame and top-aligns
       (primaryAxisAlignItems MIN), so the slack sits at the bottom -- 16px on
       metal (36 + 10 + 132 = 178), 33px on shape (36 + 10 + 115 = 161).

       min-height, NOT height. 194 is a design-space number that only holds at
       1728 (CHECKLIST assertion 87 is tagged @1728). Below roughly 1280 the
       712 content box is narrower than the 8 x 48 swatch run and the 10 x 55
       tile run, both rows wrap, and a rigid 194 with overflow:hidden would
       crop the wrapped rows off the bottom of the card. Growing downwards is
       impossible (bottom is pinned), so the panel grows UPWARDS over the ring
       photo, which is the same direction the design's own panel grew when it
       was given more rows. */
    min-height: var(--rb-d-pop-h);
    height: auto;

    font-family: var(--rb-font-body);
    /* The container's `display` cannot be changed to flex or grid, so the grids
       below are inline-block; font-size:0 removes the whitespace between them.
       Every descendant sets its own size. */
    font-size: 0;
    color: var(--rb-text-primary);
    text-align: left;
  }

  /* WIDTH -- 754 of the card's 764, flush with the card's left edge.

     The 10px is the ONLY place the x80/x70 question shows up in the build. The
     popup frames draw a 754-wide Container; _stone-desktop.css's column band
     draws the live card at 764 (LAYOUT 764 + 60 + 752 = 1576). The panel is
     built to the FRAME's 754 -- CHECKLIST assertions 88 and 99 pin 754 and its
     712 content box -- but positioned against the LIVE card's left edge, so the
     10px falls on the right where the card's own white ground shows through,
     rather than on the left where it would break the alignment with the ring
     photo and the pills directly above it.

     Proportional, not absolute: 754 / 764 = 98.6910994764398%, resolved against
     the card, which is itself 48.477157360406% of the 1576 column band. So the
     panel is 754.00 at 1728, 539.66 at 1280 and 401.87 at 992 -- the same
     percentage-of-an-exact-1728-figure model _stone-desktop.css uses for the
     columns, which is what keeps the two screens in agreement. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options {
    left: 0;
    right: auto;
    width: var(--rb-d-pop-w);
  }

  /* --- drawer title ---------------------------------------------------------
     `Title` 14465:38959 "SELECT YOUR METAL" (206 x 30) and 14465:39243
     "SELECT YOUR SHAPE" (202 x 30) -- Canela 300, 21px / 30px, ls -0.21,
     #0F0E0D, in a 722 x 36 SPACE_BETWEEN header row. Note 21px here where the
     mobile sheet is 20.

     Generated content, not markup, for the same reason as on mobile: the
     containers hold nothing but the generated option divs, and nothing in
     simple-select.js reads text out of them (it reads [name] and
     .data('friendly') at :989, :1016, :2047, :2061). A ::before cannot be
     reached by a selector, by .html()/.text(), or by the click delegation. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options::before,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options::before {
    display: block;
    /* The title is 21/30; the header row it sits in is 36. Padding carries the
       3px of air on each side rather than an inflated line-height, so the
       declared 30 survives (a 36px line-height reads back as the title's own
       leading and loses the 30 the design records). 3 + 30 + 3 = 36. */
    box-sizing: border-box;
    height: 36px;
    padding-top: 3px;
    line-height: 30px;
    font-family: var(--rb-font-display);
    font-weight: 300;
    font-size: 21px;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-primary);
    /* drawer itemSpacing 10 (header -> body) */
    margin: 0 0 10px;
  }
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options::before {
    content: "SELECT YOUR METAL";
    /* The metal swatch row is 722 x 72 with its 48px dots vertically CENTRED
       (cross=CENTER), i.e. 12px of air above them. Added to the drawer's own
       10px header gap here rather than as a margin on the dots, so every dot in
       the row still shares one baseline: 10 + 12 = 22. */
    margin-bottom: 22px;
  }
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options::before {
    content: "SELECT YOUR SHAPE";
    /* The shape row is 722 x 55 -- exactly one tile tall, no centring air -- so
       the drawer's plain 10px header gap stands. */
  }

  /* --- picker close, `exit button` 14468:42511 / 14468:42790 ----------------
     36 x 36 at the header row's right edge -- frame x777 on metal (panel x80,
     so panel-relative 697; 697 + 36 = 733 = 754 - 21, flush with the panel's
     right padding edge) and frame x767 on shape (panel x70, same panel-relative
     697). Panel-relative y is 0: the header row starts at the panel's top edge,
     which now carries no top padding.

     THE SOURCE DRAWS THIS NODE AT OPACITY 0 AND IT IS BUILT VISIBLE ANYWAY.
     In the frames the live dismiss is a Container-level 12 x 12 VECTOR at
     container-rel x718 y24 -- the card's top-right, over the ring photo -- and
     this panel-level button is the same control switched off. That card-level
     node cannot be reached from here: `.rb_drawer_close` is created as a child
     of the PANEL (simple-select-redesign.js:1646), and an absolutely positioned
     box is clipped by an ancestor with overflow:hidden that sits between it and
     its containing block, which the panel does (`clipsContent: true`). Hoisting
     it would mean either dropping the panel's clip -- which the wrapped rows
     below 1280 need, see min-height above -- or adding a second close node to
     simple-select-quiz.php plus a handler for it. Neither is worth it for a
     control that, in the live build, has nothing to dismiss: there is no popup
     to close, only this panel, and closing the panel is exactly what the
     existing handler does. So the design's own 36 x 36 exit button is used, at
     its own coordinates, with the card-level vector's 12 x 12 glyph inside it
     (which is also the glyph simple-select-redesign.js:1501 emits). Recorded
     for review rather than silently reinterpreted.

     Sizes below: the 36 x 36 is the hit target, the 12 x 12 SVG is the drawn
     glyph, matching both nodes at once.

     WHY THIS IS ALSO THE FIX FOR THE SWATCH ROW.
     simple-select-redesign.js:1558 PREPENDS this node as a direct child of the
     sheet, and the sheet's payload is a run of inline-blocks in one inline
     formatting context (the container's `display` belongs to jQuery -- see the
     container rule above, and the row rule below). An in-flow inline span
     therefore consumes the first 12px of the first line box: measured at 1728
     it pushed every dot right by exactly 12 (91 -> 103) and spilled the row
     past the 722 box onto three lines (x 103..583, then 679, then 91).
     Taking it out of flow is BOTH the design position and the repair -- the
     eight dots go back onto one line at the panel's own 91 / 185.86 / ... / 755.

     GEOMETRY. The panel's padding box is the anchor, so no page coordinate is
     needed: 754 - 21 (--rb-d-pop-pad-x) - 36 = 697 from the panel's left edge,
     which is the frame's x777 on metal (panel x80) and x767 on shape (panel
     x70) -- the same panel-relative 697 in both. Top is 0, the panel's own top
     edge, now that the top padding is 0.

     The node is a role=button <span>, deliberately NOT a <button>
     (simple-select-redesign.js:1428) so MASTER 419's `... , [class*="done"],
     ... button` selector keeps reporting the missing DONE control honestly.
     Nothing below changes that; only the box is set. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_close,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_close {
    position: absolute;
    top: var(--rb-d-pop-pad-top);      /* header row sits at the panel's top edge */
    right: var(--rb-d-pop-pad-x);      /* 754 - 21 - 36 = 697 panel-relative */
    display: flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    width: 36px;
    height: 36px;
    padding: 0;
    border: 0;
    border-radius: var(--rb-radius-sm);
    /* PAINT-HIDDEN in the source: the #E4DED8 ground is authored OFF, so the
       hue is recorded here and not applied. Only the glyph draws. */
    background: transparent;
    /* the Vector's #0F0E0D, reaching the stroke through currentColor */
    color: var(--rb-text-primary);
    /* The container is font-size:0; a zero line-height on a flex container is
       inert, and the glyph carries its own box. */
    line-height: 0;
    cursor: pointer;
  }
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_close svg,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_close svg {
    display: block;
    width: 12px;
    height: 12px;
    /* THE GLYPH HAD NO STROKE AT ALL, so the ✕ never painted on ANY desktop
       drawer -- MEASURED, the path computed `stroke: none` while the span
       around it was a hit-testable 36x36. The mobile twin (_drawers.css:645)
       sets the pair and documents why; this block only ever set the box.

       `Vector` 14543:43761 -- 12 x 12, stroke #0F0E0D (= --rb-text-primary),
       strokeWeight 1, strokeAlign CENTER.

       Declared on the SVG and inherited by the path, exactly as mobile does:
       `stroke` and `stroke-width` are inherited SVG properties, and
       RB_DRAWER_CLOSE_SVG deliberately carries no stroke presentation
       attribute (one would beat a stylesheet declaration).

       0.833333, not 1: the markup's viewBox is `0 0 10 10` drawn into a 12px
       box, so a user unit paints at 1.2 device px. 10 / 12 puts the drawn
       line back on the board's 1.0. Mobile's 0.75 needs no such correction --
       its 10px box renders the same viewBox at scale 1. */
    stroke: var(--rb-text-primary);
    stroke-width: 0.833333px;   /* 1.0 device px at the 10 -> 12 viewBox scale */
    fill: none;
  }
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_close svg path,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_close svg path {
    stroke: inherit;
    stroke-width: inherit;
  }
  /* The span is tabbable (tabindex=0 from the same JS), so it needs a visible
     focus ring; the design has no focus state, so the board's own brand green
     is used at the 2px stroke weight the rest of the sheets use. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_close:focus-visible,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_close:focus-visible {
    outline: var(--rb-stroke-thick) solid var(--rb-brand-green);
    outline-offset: 2px;
  }

  /* --- 1a. METAL SWATCHES ---------------------------------------------------
     `Frame 38492` 14468:42516 -- 712 x 72, AL:HORIZONTAL layoutWrap WRAP,
     itemSpacing 42, primaryAxisAlignItems SPACE_BETWEEN, counterAxisAlignItems
     CENTER, eight 48 x 48 circles in ONE row. SPACE_BETWEEN resolves the 42
     away: 712 - 8 x 48 = 328 over 7 gaps = 46.857142857142854, pitch
     94.857142857142854, x = 101, 195.86, 290.71, 385.57, 480.43, 575.29,
     670.14, 765 in the metal frame (Container x80). Against the live card's x70
     that is 91, 185.86, ... , 755.

     WHAT THE DESIGN DRAWS INSIDE EACH DOT, AND WHAT IT DOES NOT.
     Six karats ("14k"/"18k"), each INSIDE its own 48px ellipse, are the only
     text nodes in the whole swatch row; swatches seven and eight are bare
     ellipses -- no text child at all. Nowhere does the panel draw the full
     data-friendly name ("14k White Gold"), on this board or on the mobile one.

     simple-select.js:2061 prints that full name as a bare text node with no
     wrapper; simple-select-redesign.js:1478-1484 wraps it in
     `span.rb_metal_name` precisely so a rule can suppress it, and :1490 emits
     `span.rb_metal_karat` only where the metal's name actually starts with a
     karat -- which reproduces the six-labelled / two-bare split exactly.
     So the name is hidden here, matching _drawers.css's mobile block. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .select_metal_option {
    /* was: display:flex; gap:5px; align-items:center; padding:8px 5px */
    display: inline-block;
    vertical-align: top;
    box-sizing: border-box;
    /* containing block for the karat, which the design draws INSIDE the dot */
    position: relative;
    /* The box IS the 48px dot and the pitch IS itemSpacing 48: 8 x 48 + 7 x 48
       = 720 in the 722 row, which lands the dots on the designed x 91, 187,
       283, 379, 475, 571, 667, 763. Eight equal 12.5% columns were 90.25 wide
       and centred each dot in its column, which pushed the first dot 21px
       right and pulled the last 19px left of the design.
       Fluidity is kept by letting the inline row wrap on its own once the
       drawer is narrower than 720 -- four-up, then two-up -- rather than by a
       flexible column width; the container's `display` belongs to jQuery, so
       flex/grid is not available here (see the container rule above). */
    /* FLUID for the same reason as the shape tiles below: a frozen 48 next to
       a percentage gap wrapped the eight swatches two-up at 1440 (gap 37.8 of
       a 574 content box needs 648), which made the panel 256 tall instead of
       194.  `Frame 38492` is layoutWrap NO_WRAP -- eight dots, one row. */
    width: min(48px, calc((100% - 7 * var(--rb-d-pop-swatch-gap)) / 8));
    aspect-ratio: 1;
    /* The box IS the dot. Nothing is drawn under it any more -- the karat is
       absolutely placed inside the circle and the name is hidden below -- so
       the height is exactly the ellipse and the row pitch is exactly
       48 + 30 = 78, whatever simple-select.js writes into the option. */
    height: auto;
    overflow: visible;
    padding: 0;
    border: 0;
    /* RIGHT: the RESOLVED SPACE_BETWEEN gap, (712 - 8 x 48) / 7 =
       46.857142857142854, NOT the declared itemSpacing (42 on this row, 48 on
       the old 14465 frame). Pitch 94.857142857142854 lands the eight dots on
       the frame's 101 / 195.86 / 290.71 / 385.57 / 480.43 / 575.29 / 670.14 /
       765, i.e. 91 / 185.86 / ... / 755 against the live card's x70 origin.
       BOTTOM 30 is two design numbers that happen to sum: the swatch row is
       712 x 72 with its 48px dots cross-axis CENTRED, so 12 of air below each
       dot, plus `Frame 1171276721`'s own 18px stack gap to the footer.
       12 + 18 = 30. It doubles as the row gap when the run wraps below 1280. */
    margin: 0 var(--rb-d-pop-swatch-gap) calc(12px + var(--rb-d-pop-stack-gap)) 0;
    text-align: center;
    white-space: nowrap;
    /* Belt-and-braces, and the same pair mobile sets: `.rb_metal_name` is
       hidden below, but simple-select.js re-renders this sheet and the wrap in
       simple-select-redesign.js only lands after that. `font-size: 0` kills any
       bare text node still sitting in the option between the two, so an
       un-wrapped name can never re-open a line box under the dot and break the
       shared baseline. The karat span restates its own 14px. */
    font-size: 0;
    line-height: 0;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-secondary);
    cursor: pointer;
  }
  /* The trailing gutter would push the eighth dot's margin box past the
     712 row and wrap it onto a second line.

     This was `:last-child`, and it silently stopped matching: the eighth dot is
     no longer the sheet's last child, because simple-select-redesign.js:1552
     APPENDS `.rb_drawer_footer` to the same container (and :1558 / :1520 prepend
     the ✕ and the hero <img>). So the eighth dot kept its trailing margin, the
     line needed more than the row box, and the dot wrapped -- half of the
     reported three-row break.

     `:not(:has(~ .select_metal_option))` means "the last OPTION, whatever else
     is in the container", which is the thing actually being expressed here; no
     amount of chrome added around the row can break it. A leading-margin model
     (`.opt ~ .opt { margin-left }`) fixes it too but indents the first dot of
     every WRAPPED line, which shows up at 992-1280 where the eight dots no
     longer fit one row. 8 x 48 + 7 x 46.857142857142854 = 712 exactly, so the
     run fills the content box and x lands on the frame's own pitch. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options
    .select_metal_option:not(:has(~ .select_metal_option)) {
    margin-right: 0;
  }
  /* `Ellipse 52` 14465:38965 -- 48 x 48. Colour is an inline background written
     by simple-select.js:2064, so only the box is set. Overrides
     simple-select.css:662 (.select_metal_shape span { width:35px }). */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .select_metal_option span.metal_icon {
    display: block;
    /* The box IS the dot, so the ellipse fills it rather than re-stating 48 --
       a frozen 48 here would be a floor under the fluid width above. */
    width: 100%;
    aspect-ratio: 1;
    height: auto;
    margin: 0 auto;
    border-radius: 100px;
    font-weight: 400;
  }
  /* `14k` 14465:38966 / `18k` 14465:38969 -- Founders Grotesk 400, 14px / 30,
     ls -0.21, #3E3C39 (the selected dot's is #27423B -- see NOT REPRODUCIBLE
     below), drawn INSIDE the 48px circle: an 18-22 wide text box at x 106 in a
     dot at x 91, i.e. centred, and y 855 in a dot at 846..894, i.e. the 30px
     box centred in the 48 -- (48 - 30) / 2 = 9. Dots seven and eight carry no
     karat at all (14465:38982 / 14465:38984 have an Ellipse and nothing else),
     which is exactly what simple-select-redesign.js:1490 does: it only emits
     the span where the metal's name actually starts with one.

     OUT OF FLOW, and that is load-bearing. The span is inserted as the option's
     FIRST child, before the block-level dot, so in flow it opened a 30px line
     box above the dot -- the six dots that have a karat sat 30px BELOW the two
     that do not (y 5705 vs 5675 measured at 1728), i.e. the row lost its shared
     baseline. Absolute positioning is both where the design draws it and what
     puts all eight dots back on one line. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_metal_karat {
    position: absolute;
    /* CENTRED BY CONSTRUCTION. 9 is (48 - 30) / 2 -- the PHONE swatch's number,
       restated here where the swatch is 39, which left the label hard on the
       bottom edge (MEASURED at 1440: icon y719..758, label y728..758). Same
       correction as the base sheet; see its note. */
    top: 50%;
    transform: translateY(-50%);
    left: 0;
    right: 0;
    /* simple-select.css:662 (`.select_metal_shape span { width: 35px }`) also
       matches this span, and a used width over-constrains left+right, which
       drops `right` and de-centres the label. */
    width: auto;
    height: 30px;
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 14px;
    line-height: 30px;
    letter-spacing: var(--rb-ls-tight);
    text-align: center;
    color: var(--rb-text-secondary);
    /* the dot underneath is the click target; simple-select.js:989 delegates
       from `.select_metal_option`, so the label must not eat the event */
    pointer-events: none;
  }

  /* The full `data-friendly` name ("14k White Gold"). The desktop sheet draws
     only the karat inside each ellipse (14465:38966 / :38969 / :38972 / :38975
     / :38978 / :38981) and leaves swatches seven and eight bare
     (14465:38982 / 14465:38984), so the name is hidden -- exactly as
     _drawers.css already hides it below 992px.

     Hidden, not removed, and scoped to the SHEET only. simple-select.js:858 and
     :2067 copy an option's outerHTML into `.metal_current_option` to build the
     summary pill, where this same span is the pill's only label; a hide that
     reached the pill would blank it. `.select_metal_option` in the chain is
     what keeps the two apart -- the pill is not one. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .select_metal_option .rb_metal_name {
    display: none;
  }

  /* THE SELECTED METAL. DRAWERS.md section 1.2: the selected swatch is the
     ellipse with a 1.5px #27423B INSIDE stroke and a #27423B karat label. No
     size change, no fill change, no ring, no checkmark.

     This was recorded here as NOT REPRODUCIBLE and it no longer is:
     load_simple_select_quiz_shapes() (simple-select.js:2038-2068) still copies
     the active swatch's outerHTML into `.metal_current_option` rather than
     flagging the matching row, and CSS still cannot compare [name] across two
     elements -- but simple-select-redesign.js:1825 now does that one comparison
     and stamps `.rb_selected`. It writes a CLASS only, never a `display`, so
     nothing simple-select.js:989 / :1016 reads is disturbed. Same stamp and
     same treatment as _drawers.css:489 below 992; only the selector prefix
     differs, so the two widths cannot drift. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .select_metal_option.rb_selected span.metal_icon {
    /* Blink SNAPS a used border-width to whole CSS pixels -- a bare
       `border: 1.5px` renders and reads back as 1px, so the selected ring would
       be the same weight as an unselected one and only the colour would differ.
       The border carries the colour and the layout (border-box, so the 48 and
       the 94.857142857142854 pitch never move) and an inset shadow of the same
       colour tops it up to the designed 1.5. Same finding and same fix as
       _drawers.css:489. */
    border: 1.5px solid var(--rb-brand-green);
    box-shadow: inset 0 0 0 1.5px var(--rb-brand-green);
  }
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .select_metal_option.rb_selected .rb_metal_karat {
    color: var(--rb-brand-green);
  }


  /* --- 1b. SHAPE TILES ------------------------------------------------------
     `Frame 38498` 14468:42795 -- 712 x 55, AL:HORIZONTAL SPACE_BETWEEN,
     itemSpacing 16, counterAxisAlignItems MIN, layoutWrap NO_WRAP, TEN 55 x 55
     tiles in ONE row (mobile wraps these to two). SPACE_BETWEEN resolves the 16
     away: 712 - 10 x 55 = 162 over 9 gaps = 18 exactly, pitch 73, x = 91, 164,
     237, 310, 383, 456, 529, 602, 675, 748. The shape frame's Container is at
     x70, the same x as the live card, so those are live page coordinates.
     Order: Round, Oval, Radiant, Pear, Emerald, Cushion, Princess, Marquise,
     Asscher, Heart.
     Tile `Frame 38483` -- 55 x 55, r4, pad 3/0 (4/0 on the oval, cushion and
     princess tiles), stroke #E4DED8 w1 INSIDE, 30px vector. */
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option {
    /* was: padding:5px; border-bottom:1px solid var(--pearl-dark) */
    display: inline-flex;
    align-items: center;
    justify-content: center;
    vertical-align: top;
    box-sizing: border-box;
    /* FLUID, so the ten tiles hold ONE row at every width -- layoutWrap
       NO_WRAP on `Frame 38498`.  A rigid 55 only fits the 712 content box at
       1728; at 1440 the box is 574, the run needed 550 + 9 gaps, and it wrapped
       8 + 2.  That is not just off-spec: a wrapped run makes the panel 234 tall
       instead of 194, and the panel is what was covering the ring photo, so the
       wrap made the overlap worse (174px at 1440 vs 134 elsewhere).

       Sized off the gap rather than as a bare 7.7247% (55/712) because the two
       percentages sum to exactly 100 (10 x 7.7247 + 9 x 2.5281) and sub-pixel
       rounding on that boundary is what decides whether the tenth tile wraps.
       Dividing what is LEFT after the nine gaps can never overflow the row. */
    width: min(55px, calc((100% - 9 * var(--rb-d-pop-tile-gap)) / 10));
    /* Square at every width -- `Frame 38483` is 55 x 55.  height:55 next to a
       shrinking width would turn the tiles into portrait rectangles. */
    aspect-ratio: 1;
    height: auto;
    padding: 3px 0;
    /* RIGHT: the RESOLVED SPACE_BETWEEN gap, (712 - 10 x 55) / 9 = 18 exactly,
       NOT the declared itemSpacing 16. Pitch 73 lands the ten tiles on the
       shape frame's 91 / 164 / 237 / 310 / 383 / 456 / 529 / 602 / 675 / 748 --
       the frame's Container is at x70, the same x as the live card, so those
       are the live page coordinates too (CHECKLIST assertion 96).
       BOTTOM 18 is `Frame 1171276721`'s stack gap to the footer; the tile row
       is 712 x 55, exactly one tile tall, with no cross-axis centring air to
       add (counterAxisAlignItems MIN). It doubles as the row gap when the run
       wraps below 1280. */
    margin: 0 var(--rb-d-pop-tile-gap) var(--rb-d-pop-stack-gap) 0;
    border: var(--rb-stroke) solid var(--rb-border-subtle);
    border-radius: var(--rb-radius-sm);
    background: transparent;
    /* The friendly name is a bare text node beside span.icon and the designed
       tiles are icon-only. font-size:0 collapses it without removing it from
       the DOM or the accessibility tree; nothing reads it. */
    font-size: 0;
    cursor: pointer;
  }
  /* The Antique tile stays hidden. simple-select.css:701 already does this
     (specificity 0-3-0) but display:inline-flex above is 1-3-0 and outranks it,
     so the shipped behaviour is restated at matching specificity or Antique
     reappears and the ten-tile row becomes eleven. NOT a new hide, and not a
     JS-read node -- simple-select.js reads [name] / data-friendly off the
     SWATCHES (:2044), never off these generated options. */
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option[name="antique-cut"] {
    display: none;
  }
  /* The tenth tile's trailing 18px margin would push its margin box to 730 in a
     712 row and wrap it onto a second line at 1728, where the run fits exactly
     (10 x 55 + 9 x 18 = 712). Zeroed on the last OPTION rather than on
     :last-child for the same reason as the metal row above: the panel's last
     child is `.rb_drawer_footer` (simple-select-redesign.js:1552), not a tile.

     The previous build absorbed this margin into the panel's padding instead
     (padding-right 1.89 / padding-bottom 1) which cost the panel its designed
     21px inset and, with it, the 712 content box -- the shape footer measured
     741.13 rather than 712. */
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options
    .select_shape_option:not(:has(~ .select_shape_option)) {
    margin-right: 0;
  }

  /* Shape glyphs are 30px tall in every tile (Round_Vector 30 x 30,
     Oval_Vector 20 x 30, Marquise_Vector 16 x 30 ...). The live SVGs are drawn
     in a 50 x 50 viewBox with the glyph spanning about 8.25..41.75 -- 67% of
     the box -- so a 30px <svg> renders a ~20px glyph. 44px of svg renders 30px
     of glyph (30 / 0.67) and still clears the tile's 55 - 2x3 = 49px inner box.
     Overrides simple-select.css:666, which sizes these 26 x 26. */
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option span.icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    /* 44 of the tile's 55.  A frozen 44 is a floor on the tile's content box,
       so below 1728 the tile could shrink in width but not in height and came
       out 44.3 x 52 instead of square.  Proportional, the tile stays square at
       every width and the glyph keeps the 30/44 ratio the viewBox needs. */
    width: 80%;
    aspect-ratio: 1;
    height: auto;
    font-weight: 400;
  }
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option span.icon svg {
    width: 100%;
    height: 100%;
  }
  /* Unselected tiles fill their vector #000000. */
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option span.icon svg path {
    fill: #000000;
  }

  /* THE SELECTED SHAPE. DRAWERS.md section 2.2: the tile stroke goes
     #E4DED8 1px -> #27423B 1.5px AND the glyph fill goes #000000 -> #27423B.
     No background, no size change, no badge. The tile is already
     `box-sizing: border-box`, so the extra half-pixel is painted inside the 55
     box (strokeAlign INSIDE) and the 73 pitch does not move. Same
     `.rb_selected` stamp as the metal swatches above. */
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option.rb_selected {
    border-width: 1.5px;
    border-color: var(--rb-brand-green);
    /* Same Blink border snapping as the metal ellipse -- see that note. */
    box-shadow: inset 0 0 0 1.5px var(--rb-brand-green);
  }
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option.rb_selected span.icon svg path {
    fill: var(--rb-brand-green);
  }
  /* Unavailable shapes. No disabled state is designed anywhere on either board
     (STATES.md), so this keeps simple-select.css:707's existing intent and only
     restates it in the board's own disabled grey instead of that rule's
     #a3a3a3 fill. */
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option.disabled {
    background: transparent;
    border-color: var(--rb-grey-disabled);
  }
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option.disabled span.icon svg path {
    fill: var(--rb-grey-disabled);
  }

  /* --- 1c. THE FOOTER -------------------------------------------------------
     `Frame 1171276612` 712 x 42 at frame y913 (metal) / y896 (shape -- 17px
     higher because the shape row is 55 tall where the metal row is 72), holding
     `Frame 1171276611` 712 x 42, HORIZONTAL, itemSpacing 40, SPACE_BETWEEN,
     counterAxisAlignItems CENTER:
       left   TEXT 120 x 42, `14K White Gold\nSetting:  $680 ` (metal) /
              `Round\nSetting:  $680 ` (shape), Founders Grotesk 400 16/21,
              ls -0.21, textCase ORIGINAL, align LEFT / BOTTOM, #3E3C39
       right  `CTA` 90 x 40 -- metal at frame x723 (Container x80, content
              101..813; 723 + 90 = 813) and shape at frame x713 (Container x70,
              content 91..803; 713 + 90 = 803). Flush with the content box's
              right edge in BOTH frames, which is what SPACE_BETWEEN in a 712
              row gives for free.
     The `seperator` sibling above it is visible:false -- no hairline.

     THIS USED TO SAY "NOT BUILT ... for want of markup". That is out of date:
     simple-select-redesign.js:1796 now emits `.rb_drawer_footer_text` wrapping
     the two runs plus a real `<button class="rb_drawer_done">DONE</button>`,
     and :1542 wires it to the same `.hide()` simple-select.js:986 performs.
     The desktop file had not caught up, so at >=992 the DONE button rendered as
     an unstyled browser <button> in the footer row. _drawers.css:803 already
     styles it below 992; the numbers are IDENTICAL -- the footer is the one
     part of these sheets that does not scale up (CHECKLIST assertion 101) --
     so only the 342-wide row becomes 712. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_footer,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_footer {
    display: flex;
    align-items: center;             /* counterAxisAlignItems CENTER */
    justify-content: space-between;
    gap: 40px;                       /* itemSpacing 40 */
    box-sizing: border-box;
    width: 100%;                     /* the panel's 712 content box */
    min-height: 42px;
    margin: 0;
    padding: 0;
  }

  /* The two runs are wrapped because a flex row cannot give a FIXED width to an
     anonymous item, and the 120 is authored, not derived. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_footer_text,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_footer_text {
    display: block;
    flex: 0 0 120px;
    width: 120px;
    /* align LEFT / BOTTOM inside the 42 box. */
    align-self: flex-end;
    min-height: 42px;
    font-size: 16px;
    line-height: 21px;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-secondary);
    text-align: left;
  }

  /* `CTA` -- 90 x 40, fill #27423B, cornerRadius 4, clip=true, HORIZONTAL,
     primary CENTER, counter CENTER. Label `DONE` 40 x 19, Founders Grotesk 400
     16/19, ls -0.21, #FAF3ED, textCase ORIGINAL -- the string is ALREADY
     upper-case, so `text-transform` is explicitly `none`: the characters are
     the source of truth, not a CSS transform. */
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_done,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_done {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 90px;
    box-sizing: border-box;
    width: 90px;
    height: 40px;
    /* padding t12 r0 b12 l0 in Figma; the 19px label centred in a 40px box is
       the same result and survives a font fallback. */
    padding: 0;
    margin: 0;
    border: 0;
    border-radius: var(--rb-radius-sm);
    background: var(--rb-brand-green);
    overflow: hidden;                /* clipsContent: true */
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 16px;
    line-height: 19px;
    letter-spacing: var(--rb-ls-tight);
    text-transform: none;
    text-align: center;
    /* the row is `white-space: pre-line`; the CTA label is a single run. */
    white-space: nowrap;
    color: var(--rb-surface-page);
    cursor: pointer;
    -webkit-appearance: none;
    appearance: none;
  }
  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .rb_drawer_done:focus-visible,
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .rb_drawer_done:focus-visible {
    outline: var(--rb-stroke-thick) solid var(--rb-brand-green);
    outline-offset: 2px;
  }


  /* ===========================================================================
     1c. THE RING SECTION ALWAYS SHOWS THE RING
         (`simple-select.js:1567-1570`, the desktop half of the ssqChange
         handler bound at js:1437)

     ```js
     } else {                                  // desktop
         $('.quiz-handpicked-image').show();   // stone photo in
         $('.quiz-image').hide();              // the RING SECTION hidden
         $('.desktop-stone-details').hide();
     }
     ```

     Per DRAWERS.md Q1/Q3 the `Container` ring slot must ALWAYS hold the ring:
     the 594 x 495 `image` rectangle at container-rel x80 y23 is a RING photo
     (imageRef 88867c35a8ec7ad6ce649bc90e9e2a926c41c015, the TWIST RING setting)
     in BOTH popup frames, and neither frame contains a loose-stone photo or a
     stone-details table anywhere inside the card.

     FIXED FROM CSS, NOT FROM JS -- and the brief offered both. The write is an
     INLINE `display` from a handler that re-fires on EVERY step change while a
     handpicked stone is held, and js:1567-1570 is only one of four writers
     (diamond-search.js:2725-2726 and :2825-2826 and simple-select.js:1985-1986
     do the same swap, and none of those three fires `ssqChange` afterwards). A
     JS re-assert would have to chase four call sites, would repaint one frame
     of visible flicker each time it re-hid what the legacy had just shown, and
     would silently reopen the bug for any fifth call site added later. An
     author `!important` declaration outranks a non-important inline one, so a
     stylesheet pin has no ordering, no race and no flicker -- the same
     technique the file header records for `.quiz-image`,
     `.ssq_all_stone_options` and `.simple-quiz-carat-filter`.

     WHAT IS ALREADY PINNED, AND BY WHOM. Two thirds of this is not ours:
       .quiz-image          _stone-desktop.css:495 `display: flex !important`.
                            Measured: after js:1569 writes `display:none` inline
                            the element still computes `flex` and still measures
                            563.33 tall at 1728. Nothing is added here -- a
                            second pin would just be a second place to keep in
                            sync.
       .sss-metal-image     simple-select-redesign.css:229 `display: block
                            !important`, against diamond-search.js:2725/:2825.
       .desktop-stone-details
                            NOT touched. simple-select.css:1047 already leaves
                            it `display: none` at every width and nothing in the
                            redesign re-shows it above 992, so js:1570 is a
                            no-op and the panel already measures 0 tall. Pinning
                            it into the box tree would mean `display !important`
                            on a node that carries a 1px border, 16px padding
                            and `margin-top: -180px` from the base sheet -- real
                            risk, for a box that is already zero. Recorded here
                            rather than changed.

     WHAT THIS RULE CHANGES. `.quiz-handpicked-image` -- the big STONE photo
     with its own image/video thumb strip that js:1568 shows in the ring slot.
     simple-select-redesign.css:210 already suppresses it at every width with
     `display: none !important`. That is right for mobile, where js:1563-1565
     genuinely wants it gone, but DRAWERS.md section 6 is explicit that at
     desktop it must NOT be display:none'd wholesale -- the node has to stay in
     the box tree while occupying no space. So the global rule is narrowed HERE
     ONLY, inside this file's >=992 block, and the mobile half is left exactly
     as the max-width:991px owner wrote it.

     ZERO-BOX, NOT display:none. In flow (so no containing block is involved and
     nothing can be pushed), 0 x 0 with overflow:hidden, and every box property
     the base sheet sets zeroed so the box cannot round back up:
     simple-select.css:907 gives it `text-align: center`, :1253 a 70px
     `margin-top`, and _stone.css:79 an `order`. jQuery's `:visible` test reads
     offsetWidth/offsetHeight, so a 0 x 0 box is already "hidden" to anything in
     the legacy that asks -- but `display` stays `block`, so the node keeps its
     place in the box tree and js:1578-1579's `src` writes and js:2403-2419's
     child toggles all keep landing on a laid-out element.

     SCOPE. The markup prints `.quiz-handpicked-image` TWICE
     (simple-select-quiz.php:147 in the ring section, and :419 inside
     `.ssq_picked_selection` in the options column, where the stone photo IS the
     subject and is correct). `.quiz-left` scopes this to the first one only --
     the same scoping simple-select.js:1563 uses for its own mobile branch. */
  #simple-select-quiz .quiz-left .quiz-image-conatiner > .quiz-handpicked-image {
    /* Beats simple-select-redesign.css:210's `display: none !important` on
       specificity (1-3-0 vs 1-2-0); !important is required on every line
       because js:1568's `.show()` writes `display: block` inline. */
    display: block !important;
    width: 0 !important;
    height: 0 !important;
    min-width: 0 !important;
    min-height: 0 !important;
    overflow: hidden !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
  }


  /* ===========================================================================
     2. GEMSTONE MODAL -- `gemstones` 14465:39529
     1394 x 634 at x=167, y=303 -- centred on both axes. AL:VERTICAL,
     pad 24/24/42/24, fill #FFFFFF, stroke #E4DED8 w1 INSIDE, cornerRadius 8,
     no shadow. Scrim `black mask` 14465:39528, 1728 x 1260, #000000 @0.70.

     Hook: .popup-modal-container.gemstone_selection_modal gated on
     :has(.modal-gemstone-selection) -- see the file header. `display` is never
     set: Modal.open()/close() write it inline (main.js:617, :628).
     ------------------------------------------------------------------------ */

  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) {
    /* main.css:3089 already gives fixed inset-0 at z 99999; only the scrim
       alpha changes (base rgb(0 0 0 / 50%) -> the board's 0.70). This scrim IS
       a real element and SHOULD be hit-tested: Modal.handleOutsideClick
       (main.js:643) dismisses on a tap that lands on it. */
    background: var(--rb-scrim);
  }

  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) .flyout {
    /* main.css:3104 already centres this vertically, which is exactly right --
       (1240 - 634) / 2 = 303 is the designed y. Only the width and the box
       change. */
    box-sizing: border-box;
    /* 1394 / 1728 = 80.6712962962963%. Fluid, capped at the designed 1394 so it
       never grows past the artboard; the 167px side margins fall out of the
       percentage. */
    width: 80.6712962962963%;
    /* simple-select.js:2615 writes an INLINE `max-width` (the site container
       width) onto this element. Inline can only be beaten by !important -- the
       one place in this file where it is unavoidable. */
    max-width: 1394px !important;
    max-height: calc(100% - 48px);
    height: auto;
    overflow-y: auto;
    padding: 24px 24px 42px;
    background: var(--rb-surface-card);
    border-radius: var(--rb-radius-md);
    /* stroke #E4DED8 w1 strokeAlign INSIDE -- an inset shadow, not a border, so
       the 1346px content box is not reduced by 2px. */
    box-shadow: inset 0 0 0 var(--rb-stroke) var(--rb-border-subtle);
  }

  /* HEADER. The design does NOT have a header row: the close x
     (`Frame 1171276578` 14465:39530, 24 x 24 at x=1513, y=327) is a direct
     child of the card pinned top-right by cross=MAX, and the title
     ("GEMSTONES", Canela 300 21/30, 14465:39535) is the first line of the
     content block 26px lower. The markup ships a single .modal_header holding
     both, so the header row carries the title at its designed type and the
     close at its designed box; the 26px offset between them is not
     reproducible without splitting the node. */
  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) .modal_header {
    /* The title is the first line of `Frame 1171276723` 14465:39532, which is
       inset 10px (pad 0/10/0/10) -> x=201; the close x is a direct child of the
       card and is NOT inset -> its right edge is the card's own 24px pad, at
       x=1513. One asymmetric padding gives both. */
    padding: 0 0 0 10px;
    margin: 0 0 16px;              /* `Frame 1171276614` itemSpacing 16 */
    border-bottom: 0;              /* main.css:3132 draws a 1px #000 rule */
    align-items: flex-start;
    min-height: 30px;
  }
  /* COPY NOTE: simple-select.js:2584 sets "GEMSTONES | 0.5 Carat"; the design
     reads "GEMSTONES" alone. Text only, not fixable from CSS. */
  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) #modal-title {
    margin: 0;
    font-family: var(--rb-font-display);
    font-weight: 300;
    font-size: 21px;
    line-height: 30px;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-primary);   /* base: simple-select.css:1152 var(--jade) */
    text-transform: none;
  }
  /* `Frame 1171276578` 14465:39530 -- 24 x 24, r4, hidden #0F0E0D @0.4 fill,
     12 x 12 glyph. In Figma that glyph is a VECTOR stroked #0F0E0D w1 with NO
     interaction; here the same 12px box is a filled path on a control that
     really closes the modal (main.js:620), which is strictly better. */
  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) .modal_close {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 24px;
    height: 24px;
    border-radius: var(--rb-radius-sm);
  }
  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) .modal_close svg {
    width: 12px;
    height: 12px;
  }
  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) .modal_close svg path {
    fill: var(--rb-text-primary);
  }

  /* `Frame 1171276723` 14465:39532 -- pad 0/10/0/10 inside the card. */
  .popup-modal-container.gemstone_selection_modal:has(.modal-gemstone-selection) #modal-content {
    padding: 0 10px;               /* main.css:3141 sets 0 15px + 20px top */
    margin: 0;
  }

  /* `Frame 1171276724` 14465:39538 and siblings -- three cards per row,
     AL:HORIZONTAL itemSpacing 30, rows 28 apart (row y = 397, 545, 693; pitch
     148 = 120 + 28). Setting `display` here is safe: .modal-gemstone-selection
     is built by simple-select.js:2491 and never shown or hidden -- the modal's
     own container is what toggles. */
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    column-gap: 30px;
    row-gap: 28px;
  }

  /* Card `Frame 38805` 14465:39544 -- 421.33 x 120 (the first card measures
     423.33; the 2px is the SPACE_BETWEEN remainder, not a design difference),
     AL:HORIZONTAL gap 23, pad 16/17/16/17, fill #FFFFFF, stroke #E4DED8 w1
     INSIDE, r4.
     CARD COUNT: the design draws 3 x 3. The live list is generated from the
     `data-variations` payload (simple-select.js:2494), so the count is product
     data; the rules are per-card and hold for any number. */
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection .ssq-gemstone_option {
    display: flex;
    align-items: center;
    box-sizing: border-box;
    min-height: 120px;
    margin: 0;
    padding: 16px 17px;
    background: var(--rb-surface-card);
    border: 0;
    border-radius: var(--rb-radius-sm);
    /* strokeAlign INSIDE -- inset shadow so the 120px card does not become
       122 and the 69px thumbnail does not shift off x=218. */
    box-shadow: inset 0 0 0 var(--rb-stroke) var(--rb-border-subtle);
    color: var(--rb-text-primary);
  }
  /* Selected card 14465:39539 -- stroke #0F0E0D at weight 2.0, INSIDE.
     REACHABLE BUT NOT VISIBLE IN PRACTICE: simple-select.js:2660 adds .active
     and :2679 immediately triggers .modal_close, so the modal is gone in the
     same tick. Styled because the class is real; making it linger needs JS. */
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection .ssq-gemstone_option.active {
    box-shadow: inset 0 0 0 var(--rb-stroke-thick) var(--rb-text-primary);
    color: var(--rb-text-primary);   /* base: simple-select.css:1148 var(--jade) */
  }

  /* `Frame 38806` 14465:39545 -- SPACE_BETWEEN across the card. */
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection .stone_option.gemstone {
    display: flex;
    align-items: center;
    gap: 23px;                     /* `Frame 38805` itemSpacing 23 */
    width: 100%;
    min-width: 0;
    padding: 0;
    grid-template-columns: none;   /* base: simple-select.css:1237 */
    text-align: left;
  }
  /* `image` 14465:39547 -- 69 x 64, r4, scaleMode FIT. */
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection .ssq_stone_image {
    flex: none;
    width: 69px;
    height: 64px;
    max-width: none;               /* base: simple-select.css:1234 117px */
    border-radius: var(--rb-radius-sm);
    overflow: hidden;
  }
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection .ssq_stone_image img {
    width: 100%;
    height: 100%;
    object-fit: contain;           /* scaleMode FIT */
    transform: none;               /* base: simple-select.css:1129 scale(0.90) */
  }
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection .ssq_stone_text {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;                     /* `Frame 38806` itemSpacing 12 */
    flex: 1 1 auto;
    min-width: 0;
    grid-template-columns: none;
  }
  /* `Lab Created White Sapphire` 14465:39548 -- Founders Grotesk 400, 16/18,
     ls -0.5, #0F0E0D. Note 16 here where the mobile row is 14. */
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection p.ssq_type {
    margin: 0;
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 16px;
    line-height: 18px;
    letter-spacing: var(--rb-ls-wide);
    color: var(--rb-text-primary);
  }
  /* `+ $580` 14465:39549 -- same type, fill #0F0E0D. (The MOBILE board uses
     pure #000000 for this one node; desktop uses #0F0E0D. Both reproduced as
     found rather than unified.) .details_display_price is on the never-hide
     list and keeps a full box. */
  .popup-modal-container.gemstone_selection_modal .modal-gemstone-selection p.details_display_price {
    flex: none;
    margin: 0;
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 16px;
    line-height: 18px;
    letter-spacing: var(--rb-ls-wide);
    text-align: right;             /* base flips this to left at >=992 (:1276) */
    color: var(--rb-text-primary);
  }

  /* NOT BUILT in the desktop gemstone modal, for want of markup: the footer
     `Frame 1171276612` 14465:39594 -- 1326 x 42, a two-line restatement of the
     choice ("Lab Created Blue Sapphire / Stone: + $580 | 0.5 Carats") beside a
     90 x 40 #27423B DONE CTA (14465:39597). Nothing in #modal-content
     corresponds to it, and in the live flow the choice IS the dismissal
     (simple-select.js:2679), so a DONE would have nothing to do. Needs markup
     plus a JS change to defer the close. */


  /* ===========================================================================
     3. TALK TO A GEMOLOGIST -- INTENTIONALLY ABSENT
     There is no desktop frame for this popup on section 14465:38712 (eight
     frames, LAYOUT.md section 1). #contact_modal_popup is therefore left on
     contact-modal.css's own `@media (min-width:992px)` rules above 991px.
     Reproducing it would mean scaling the 390px phone card onto a 1728 canvas,
     which the brief rules out. Needs a desktop frame.
     ------------------------------------------------------------------------ */


  /* ===========================================================================
     4. REVIEW STEP -- #ssq_confirmation
     ---------------------------------------------------------------------------
     STYLED BY INFERENCE. There is NO Figma frame for this step on either board
     -- the mobile flow (section 14463:32244, 25 frames) ends at 1.3 Engraving
     and the desktop board (section 14465:38712) is 8 frames, none of them a
     review. Nothing below is a measurement. Every value is either a token or a
     type/box value lifted verbatim from a NAMED node on an adjacent DESKTOP
     screen, cited so it can be replaced the moment a Review frame exists.

     Borrowed from:
       right column     `Customization` 14465:39601 -- 752 wide at x=894
       card + radius    `Setting details` I14465:39837 -- r4, pad 16/18,
                        fill #E4DED8 @0.60
       section heading  `CARAT WEIGHT` / `HANDPICKED STONES` 14465:39836 --
                        Canela 300, 24/19, -0.21 (the desktop section tier; the
                        drawer titles are 21/30 and are a different role)
       line items       drawer footer 14465:38989 at the DESKTOP body tier --
                        Founders 400, 16/19, -0.21, #3E3C39, emphasised half at
                        weight 500 (16/21 is that node's mobile line-height)
       grand total      running-price role, `.ssq_nav_setting_total`
                        14465:39871 -- Canela 300, 28/19, TITLE
       divider          `seperator` 14465:38987 -- #E4DED8 @0.40, w1
       primary CTA      Footer CTA 14465:39875 -- 282 x 48, #27423B, r4,
                        Founders 400 18/19 -0.21 UPPER #FAF3ED

     `display` is not set on #ssq_confirmation or on any slide: simple-select.js
     drives those through the .active class on .simple-select-slide.
     ------------------------------------------------------------------------ */

  #simple-select-quiz #ssq_confirmation {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    text-align: left;
    font-family: var(--rb-font-body);
    color: var(--rb-text-primary);
  }

  #simple-select-quiz #ssq_confirmation .simple-select-subtotals {
    box-sizing: border-box;
    width: 100%;
    margin: 0 0 24px;              /* `Customization` itemSpacing 24 on SIZE */
    padding: 16px 18px;
    background: var(--rb-border-subtle-60);
    border-radius: var(--rb-radius-sm);
  }
  /* The desktop SECTION-HEADING role, not the drawer-title one: Canela 300
     24 / 19, the tier `CARAT WEIGHT` / `HANDPICKED STONES` (14465:39836) and
     `RING SIZE` use. The drawer titles are 21 / 30 and are a different role;
     borrowing them made this heading read 3px small against every other
     section heading on the desktop board. */
  #simple-select-quiz #ssq_confirmation .simple-select-subtotals h3 {
    margin: 0 0 12px;
    font-family: var(--rb-font-display);
    font-weight: 300;
    font-size: 24px;
    line-height: 19px;
    letter-spacing: var(--rb-ls-tight);
    text-transform: uppercase;
    color: var(--rb-text-primary);
  }
  #simple-select-quiz #ssq_confirmation p.selected_setting_info,
  #simple-select-quiz #ssq_confirmation p.selected_stone_info {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 16px;
    margin: 0 0 4px;
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 16px;
    /* Desktop body tier is 16 / 19. 21 is the MOBILE line-height for this
       role (14463:38989); at desktop every 16px body line on the board is 19. */
    line-height: 19px;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-secondary);
  }
  #simple-select-quiz #ssq_confirmation .totals {
    margin-top: 12px;
    padding-top: 12px;
    /* base: 1px dashed var(--pearl-dark). The board's only divider is
       `seperator` 14465:38987 -- solid #E4DED8 at paint opacity 0.40, weight 1. */
    border-top: var(--rb-stroke) solid var(--rb-border-subtle-40);
  }
  #simple-select-quiz #ssq_confirmation p.ssq_total {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 16px;
    margin: 0;
    font-family: var(--rb-font-body);
    font-weight: 500;              /* the emphasised half of 14465:38989 */
    font-size: 16px;
    line-height: 21px;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-primary);
  }
  /* The grand total takes the desktop RUNNING-PRICE role -- Canela 300 28 / 19,
     TITLE case -- the one role on the board that changes family and weight
     between breakpoints (assertion 26; the footer's `.ssq_nav_setting_total`
     is the same role). Set on the <span> only: the "Total" label stays on the
     body tier, so the price is what separates itself from the lines above it.
     `p.ssq_total` is align-items:baseline, so the two sit on one baseline. */
  #simple-select-quiz #ssq_confirmation .totals p.ssq_total span {
    font-family: var(--rb-font-display);
    font-weight: 300;
    font-size: 28px;
    line-height: 19px;
    letter-spacing: var(--rb-ls-tight);
    text-transform: capitalize;   /* case: TITLE */
    color: var(--rb-text-primary);
  }

  #simple-select-quiz #ssq_confirmation .simple-select-slide-content {
    padding: 0;
    text-align: left;
  }
  /* .affirm-as-low-as-pending is where Affirm injects .affirm-tag and
     #learn-more. It is on the never-hide list and keeps a full box; type only. */
  #simple-select-quiz #ssq_confirmation .affirm-as-low-as-pending {
    margin: 0 0 8px;
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 16px;
    line-height: 19px;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-secondary);
  }
  #simple-select-quiz #ssq_confirmation .simple-select-slide-content > p {
    margin: 0 0 20px;
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 14px;
    line-height: 19px;
    letter-spacing: var(--rb-ls-tight);
    color: var(--rb-text-secondary);
  }
  #simple-select-quiz #ssq_confirmation .ssq_add_to_cart {
    display: flex;
    justify-content: flex-start;
    margin: 0;
  }
  #simple-select-quiz #ssq_confirmation a.ssq_finale {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 5px;                      /* Primary CTA itemSpacing */
    box-sizing: border-box;
    width: 282px;
    max-width: 100%;
    height: 48px;
    padding: 14px 0;
    background: var(--rb-brand-green);
    border: 0;
    border-radius: var(--rb-radius-sm);
    font-family: var(--rb-font-body);
    font-weight: 400;
    font-size: 18px;
    line-height: 19px;
    letter-spacing: var(--rb-ls-tight);
    text-transform: uppercase;
    text-decoration: none;
    color: var(--rb-surface-page);
  }
  #simple-select-quiz #ssq_confirmation a.ssq_finale span {
    display: inline-flex;
    align-items: center;
    margin: 0;
  }
  #simple-select-quiz #ssq_confirmation a.ssq_finale svg {
    width: 18px;
    height: 18px;
  }
  #simple-select-quiz #ssq_confirmation a.ssq_finale svg path {
    stroke: var(--rb-surface-page);
  }

}

/* =============================================================================
   DRAWER FOOTERS — desktop (Figma 14465:38988 metal/shape, 14465:39594 gemstone)
   -----------------------------------------------------------------------------
   These render correctly at <=991 but were invisible at >=992, and the cause is
   worth recording: the sheets carry `font-size: 0` as a whitespace reset (it
   collapses the literal text nodes jQuery leaves between generated options), and
   the footer inherits it. At mobile a rule re-establishes 16px; there was no
   desktop equivalent, so the metal and shape footers measured 722x0 and 741x0
   with both child spans at 0x0, and the gemstone footer fell back to the base
   theme's 16/17.6 with its two spans laid out side by side inline.

   So every rule below re-establishes type explicitly rather than relying on
   inheritance -- that is the whole bug.
   ============================================================================= */
@media (min-width: 992px) {

  /* THE GEMSTONE FOOTER IS A ROW HERE TOO, AND IT CARRIES DONE.
     14393:48111 `Frame 1171276611`: 1326 x 42, HORIZONTAL, itemSpacing 40 --
     the 174 x 42 two-line selection at the leading edge and a 90 x 40 CTA at
     x1270, i.e. flush with the row's trailing edge. Identical to the phone
     frame (14557:45775) apart from the row width, which is why both get the
     same declarations.

     This block previously styled only the TEXT, so above 992 the new DONE
     button fell back to the theme's own button: MEASURED at 1440, 56 x 27 sitting
     at the row's LEFT, 1038px from where the board puts it, and the footer
     wrapped to 90 tall. Phone was already correct because its rules live in
     _drawers.css's max-width:991 block, which this file never mirrored. */
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 40px;                 /* itemSpacing 40 */
      width: 100%;
      box-sizing: border-box;
      /* THE 40 BETWEEN THE GRID AND THIS ROW. `Frame 1171276723` -- the frame
         that holds the title+grid block and this footer -- is VERTICAL with
         itemSpacing 40, and the board's own numbers say the same: the grid ends
         at y510 (94 + 416) and the footer starts at y550.

         It was ZERO. MEASURED at 1440: the grid's last row ran y366..486 and the
         footer began at y486, so DONE sat directly against the bottom row of
         cards. The phone sheet states its own 30 (14557:45775's `gemstones`
         itemSpacing) at _drawers.css:1235; this sheet set no margin at all, so
         the desktop gap fell to 0. */
      margin: 40px 0 0;
  }
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_text {
      /* TAKES THE FREE SPACE, so each line stays on one line.
         `Title` 14557:52479 is 174 x 42 -- TWO 21px lines, one per run. MEASURED
         with `flex: 0 1 auto`: the block sized itself to 182px inside a 1094px
         row, which is narrower than the second run needs, so "Stone: + $680 |
         0.5 Carats" wrapped and the block came out 63 tall -- three lines where
         the board draws two. Figma's 174 is a HUG on the longest run, not a cap;
         the thing to reproduce is two lines, and growing into the room the row
         already has is what guarantees it at any stone name length. DONE is
         `flex: 0 0 90px` with an auto start-margin, so it keeps its box and its
         right edge regardless. */
      flex: 1 1 auto;
      min-width: 0;
      white-space: pre-line;
  }
  /* `CTA` 14393:48111 -- 90 x 40, #27423B, r4, label DONE 40 x 19 in #FAF3ED.
     `margin-left: auto` for the same reason as phone: with no gemstone picked
     the text run is collapsed, and space-between alone would drop the lone
     button back to the leading edge. */
  .popup-modal-container.gemstone_selection_modal .rb_gem_done {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      flex: 0 0 90px;
      box-sizing: border-box;
      width: 90px;
      height: 40px;
      padding: 0;
      margin: 0 0 0 auto;
      border: 0;
      border-radius: var(--rb-radius-sm, 4px);
      background: var(--rb-brand-green, #27423B);
      overflow: hidden;
      font-family: var(--rb-font-body, 'FoundersGrotesk'), sans-serif;
      font-weight: 400;
      font-size: 16px;
      line-height: 19px;
      letter-spacing: var(--rb-ls-tight, -0.21px);
      text-transform: none;
      text-align: center;
      white-space: nowrap;
      color: var(--rb-surface-page, #FAF3ED);
      cursor: pointer;
      -webkit-appearance: none;
      appearance: none;
  }
  .popup-modal-container.gemstone_selection_modal .rb_gem_done:focus-visible {
      outline: var(--rb-stroke-thick, 2px) solid var(--rb-brand-green, #27423B);
      outline-offset: 2px;
  }
  /* Nothing selected yet -> the run has nothing to say, so it collapses and the
     CTA stays. (Phone twin in _drawers.css.) */
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer:has(.rb_gem_footer_name:empty) .rb_gem_footer_text {
      display: none;
  }

  .metal_dropdown_ssq_options .rb_drawer_footer,
  .shape_dropdown_ssq_options .rb_drawer_footer,
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_text {
      /* white-space: pre-line keeps the "\n" between the selection and the price
         line as a real break, matching the two-line block in the source. */
      white-space: pre-line;
      font-family: var(--rb-font-body, 'FoundersGrotesk'), sans-serif;
      font-size: 16px;
      line-height: 21px;
      letter-spacing: var(--rb-ls-tight, -0.21px);
      color: var(--rb-text-secondary, #3E3C39);
      min-height: 42px;
  }

  /* the selection name is the 500 cut; the meta/price line stays 400 */
  .metal_dropdown_ssq_options .rb_drawer_footer_sel,
  .shape_dropdown_ssq_options .rb_drawer_footer_sel,
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_name {
      font-family: var(--rb-font-body, 'FoundersGrotesk'), sans-serif;
      font-size: 16px;
      line-height: 21px;
      letter-spacing: var(--rb-ls-tight, -0.21px);
      font-weight: 500;
      color: var(--rb-text-secondary, #3E3C39);
  }

  .metal_dropdown_ssq_options .rb_drawer_footer_price,
  .shape_dropdown_ssq_options .rb_drawer_footer_price,
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_meta {
      font-family: var(--rb-font-body, 'FoundersGrotesk'), sans-serif;
      font-size: 16px;
      line-height: 21px;
      letter-spacing: var(--rb-ls-tight, -0.21px);
      font-weight: 400;
      color: var(--rb-text-secondary, #3E3C39);
  }

  /* the two spans are stacked lines, not inline siblings -- this is what the
     gemstone footer was getting wrong at 1728 */
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_name,
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_meta {
      display: block;
  }


  /* ===========================================================================
     D4 -- "in the button, align the text with SVG ... and make the SVG slightly
     bigger". The two summary pills on the stone step (`Settings` 14468:42774,
     460 x 44, itemSpacing 20, two 220 pills; and the single pill 14468:41896 on
     the back-to-stone board 14468:41807).

     This sheet already owns the ROW (460 wide, 20 gap, 220 pills, 44 tall --
     see "INSIDE THE CARD" above). What was never brought over from the new
     board is the pill's INNER row, which _stone-desktop.css:575-665 still
     builds from the older 14465 frames. Measured on dev-0 at 1728 before this
     block:

       glyph -> label gap      8px        board 6      (the 8 is
                                                        simple-select-redesign.css,
                                                        selector (1,4,0), which
                                                        outranks _stone-desktop's
                                                        12px at (1,2,0))
       label font-size         17px metal / 19px shape  board 18 for both
                                                        (14468:42779, 14468:42786)
       metal swatch box        24 x 24                  board 20 x 20
       shape glyph BOX         24 x 24                  board 18-20
       shape glyph INK         16.08 x 16.08            board 18-20
       pill padding            8px 14px / 8px 12px 8px 14px   board 12 / 16

     Two pills side by side at 17px and 19px, with their two glyph boxes the
     same size but their two inks 24 vs 16.08, is the whole of "the text isn't
     aligned with the SVG".

     VERTICAL alignment was already correct and is untouched: measured glyph ink
     centre 841.98, label ink centre 841.98 on both pills. The board aligns by
     cross-axis centring (counterAxisAlignItems CENTER on 14468:42777 /
     14468:42783 / 14468:41898), not by baseline, which is what
     `align-items: center` already does here.

     SPECIFICITY. simple-select-redesign.css wins the gap at
     `#simple-select-quiz .quiz-image .metal_dropdown_ssq > .metal_current_option
      > .select_metal_option` = (1,4,0), and it is NOT in a media query, so it
     reaches desktop. These selectors add `.select_metal_shape` to the chain for
     (1,5,0) -- outranked by nothing, and still scoped to the pill, never to the
     drawer options that share the class name.
     ------------------------------------------------------------------------ */

  /* `Frame 1171276586` / the shape pill's left group: HORIZONTAL,
     itemSpacing 6, counterAxisAlignItems CENTER. Label 18 / 16, ls -0.21,
     SMALL_CAPS_FORCED, weight 400 -- the weight pin in
     simple-select-redesign.css:291 stays untouched. */
  #simple-select-quiz .quiz-image .select_metal_shape > .metal_dropdown_ssq > .metal_current_option > .select_metal_option,
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option > .select_shape_option {
    gap: 6px;
    align-items: center;
    font-size: 18px;
    line-height: 16px;
  }

  /* ONE glyph box for both pills. `Round icon` is 20 x 20 on the metal pill
     (14468:42778, 14468:41899, stroke 3px #D0D0D0) and 18 x 18 on the shape
     pill (14468:42784); they are given the SAME 20 here on purpose, because
     the customer's first ask is that the two labels line up, and two different
     glyph boxes put the two labels at two different offsets from their pill's
     content edge. At 20 + 6 both labels start 26px in, flush.

     The metal swatch keeps its inline background -- simple-select.js:2064
     writes the real metal colour there and it is the only place on the pill the
     chosen metal is visible. The board draws a hollow #D0D0D0 ring because
     Figma has no product data to put in it; that deviation is recorded rather
     than built. Only the box is imposed. */
  #simple-select-quiz .quiz-image .select_metal_shape > .metal_dropdown_ssq > .metal_current_option > .select_metal_option > .metal_icon,
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option > .select_shape_option > .icon {
    width: 20px;
    height: 20px;
    flex: none;
  }

  /* "make the SVG slightly bigger". The glyph is genuinely undersized and the
     box is not why: the shipped shape SVGs declare `viewBox="0 0 50 50"` and
     their artwork's getBBox() is 33.5 x 33.5 at (8.25, 8.25) -- 8.25 units of
     padding on every side, so only 67% of the box is ever painted. A 24px box
     rendered 16.08px of ink (measured). The board sizes its glyph FRAME to the
     artwork, so the board's 20 is an INK measurement.

     50 / 33.5 = 1.4925373134328 is the factor that makes ink = box. Applied as
     a transform rather than by growing the box, so the ink reaches the board's
     20px while the LAYOUT box stays 20 and the label stays flush with the
     metal pill's. `overflow: visible` because _stone-desktop.css:628 clips this
     span and the scaled glyph paints 5px past it on each side, inside the
     pill's own padding. Tightening the viewBox instead would be cleaner but it
     is written by simple-select.js -- see the report. */
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option > .select_shape_option > .icon {
    overflow: visible;
  }
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option > .select_shape_option > .icon > svg {
    width: 100%;
    height: 100%;
    transform: scale(1.4925373134328);
  }

  /* pill padding 12 / 16 (14468:42775, 14468:42781). 12 + 20 + 12 = 44, the
     pill's own height, so the row does not grow; 16 + 20 + 6 + label + chevron
     + 16 sits inside the 220 the row above allots. Both pills get the same
     padding -- the 2px asymmetry in _stone-desktop.css:556-557 came off the
     older 14465 frames and is what put the two labels at different insets. */
  #simple-select-quiz .quiz-image .select_metal_shape > .metal_dropdown_ssq,
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq {
    padding: 12px 16px;
  }

  /* FLUID FLOOR. The pill row is 61.008% of the card, so at 992 the two pills
     are 118.8 wide against 222.91 at 1728 and the metal label no longer fits:
     measured at 992 the label hard-clipped mid-word AND took the chevron with
     it, because `.select_metal_option` is `white-space: nowrap` and a flex item
     whose min-content width is the whole label refuses to shrink. `min-width: 0`
     lets it give way and `overflow: hidden` keeps the clip inside the pill, so
     the chevron -- the only thing on the pill that says it opens -- survives to
     the 992 floor. Pre-existing at 1728-only type sizes too; the board draws one
     ramp (18px) and gives no narrow-width alternate, so the label is clipped
     rather than resized. */
  #simple-select-quiz .quiz-image .select_metal_shape > .metal_dropdown_ssq > .metal_current_option > .select_metal_option,
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option > .select_shape_option {
    min-width: 0;
    overflow: hidden;
  }
  /* and it has to be given the whole pill to divide up: `.metal_current_option`
     is sized to its content, so at 992 it settled at 68.8 of an 86.8 content
     box and threw 18px away while the label was being cut mid-word. Growing it
     hands that slack back to the label, which is the part with something to
     say. Board 14468:42776 is `layoutGrow: 1` inside the pill for the same
     reason. */
  #simple-select-quiz .quiz-image .select_metal_shape > .metal_dropdown_ssq > .metal_current_option,
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option {
    flex: 1 1 auto;
    min-width: 0;
    max-width: 100%;
  }

}

/* =============================================================================
   ROUND 2 — three corrections to the D4 pill block above, all measured on dev-0
   before being written. Appended rather than edited in place so the cascade
   order is the only thing doing the work (same selectors, later in the file).
   ========================================================================== */
@media (min-width: 992px) {

  /* ---- (1) the metal label was hard-cut mid-word at 992 --------------------
     Measured at 992 BEFORE: card 407.20 wide, the pill row 61.007957559681698%
     of it = 248.42, each pill 118.80. The "14k White Gold" label's ink is 91.06
     and the pill's content box is 118.80 - 32 (padding) - 20 (swatch) - 6 (gap)
     - 28.09 (chevron + its 11px margin) = 32.71, so the label ran 30.27px past
     the inner right edge and read "14k White G". At 1280 it cleared by 10.47
     and at 1728 by 73.84 — a 992-only failure.

     It cannot be solved inside 118.80: the label + swatch + gap + chevron is
     134.15px of incompressible content before any padding, and dropping the
     label to 10px still needs 125.6. The row itself has to stop shrinking.

     `Settings` 14468:42774 is a FIXED 460 x 44 row of two 220 pills inside a
     754-wide Container — fixed in the source, not FILL — so the proportional
     61.008% is only the right expression while the card is at least as wide as
     the row it holds. Below that the board's own 460 is the floor, and the card
     is the ceiling:

        min(100%, max(61.007957559681698%, 460px))

     1728: card 764 -> max(466.09, 460) = 466.09, min(764, 466.09) = 466.09.
           Byte-identical to what shipped; nothing at 1728 moves.
     1280: card ~546.8 -> 460, i.e. the board's row and two 220 pills exactly.
      992: card 407.20 -> min(407.20, 460) = 407.20, the full card, pills 194.75.
           Content box 194.75 - 32 - 26 - 28.09 = 108.66 against a 91.06 label. */
  #simple-select-quiz .select_metal_shape {
    width: min(100%, max(var(--rb-d-pills-w), 460px));
  }

  /* ---- (2) the shape glyph is 18, not 20 ----------------------------------
     The block above deliberately gave both glyph boxes 20 so the two labels
     would start at the same inset. The board does not: `Round icon` is
     14468:42778 = 20 x 20 on the METAL pill and 14468:42784 = 18 x 18 with a
     17.74 vector on the SHAPE pill (CHECKLIST 106 / 174), which puts the metal
     label at 16 + 20 + 6 = 42 and the shape label at 16 + 18 + 6 = 40. Measured
     before this rule: both sat at 42 and the shape ink painted 20.00 x 20.00,
     11% over the board. The board is the authority over the symmetry argument,
     so the box goes back to 18 and the two labels sit 2px apart by design.

     The scale factor is re-derived for the smaller box. The shipped shape SVGs
     are `viewBox="0 0 50 50"` with a 33.5 x 33.5 bbox, so only 33.5/50 = 0.67
     of the box is ever inked: 18 x 0.67 = 12.06 painted. 17.74 / 12.06 =
     1.4709784412935324 brings the ink to the board's 17.74 inside an 18 box. */
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option > .select_shape_option > .icon {
    width: 18px;
    height: 18px;
  }
  #simple-select-quiz .quiz-image .select_metal_shape > .shape_dropdown_ssq > .shape_current_option > .select_shape_option > .icon > svg {
    transform: scale(var(--rb-shape-k, 1.4709784412935324));
  }

  /* --- ONE FACTOR PER SHAPE, because 1.4709784412935324 is ROUND'S ----------
     The derivation above is sound and its arithmetic is right -- for the glyph
     it was measured on. It divides the board's 17.74 by the ink a ROUND icon
     paints, and round is the only shape whose artwork is square (bbox 33.5 x
     33.5 in a 50 viewBox). Every other shape is TALLER, so the same factor
     scales it past the box. MEASURED, ink height in the 18px icon:

       Round 17.74   Princess 19.06   Cushion 19.96   Heart 20.69
       Oval  21.32   Emerald  21.45   Radiant 21.76   Marquise 22.56
       Asscher 17.43                                  Pear    23.35

     Pear is 5.6px over the box it sits in and 32% taller than round beside it
     in the same pill -- the owner's "in this pear or any shape looks good"
     against the 85%-plus-1.4925 they tried, which is a uniform 0.86 shrink:
     it pulls pear down to 20.1 but takes round to 15.3, 14% UNDER the board.
     The shapes do not disagree by a constant, so no constant fixes them.

     NORMALISED ON HEIGHT, which is the board's own model, not a choice made
     here. The ten `Vector`s in the shape drawer 14468:42788 measure 29.56 /
     19.79x28.76 / 23.65x29.36 / 20.69x28.76 / 23.08x28.93 / 29.76 / 29.5x30.0
     / 15.8x29.05 / 28.86x29.04 / 27.79x29.31 -- every height 28.76-30.0 while
     the widths run 15.8 to 29.76. The design gives every shape ONE vertical
     extent and lets the width follow its aspect.

     k = 17.74 / (bboxHeight x 0.36), the 0.36 being 18px over the 50 viewBox.
     The resulting widths land on the board's own aspects: oval 0.688 against
     the drawer's 0.688, pear 0.715 against 0.719, princess 0.984 against
     0.983, marquise 0.556 against 0.544.

     Keyed on `name`, which simple-select.js already writes on both the option
     and the clone it puts in `.shape_current_option`. Anything unlisted keeps
     round's factor, i.e. exactly today's behaviour -- the antique set's glyphs
     have not been measured. */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="round-cut"]    > .icon { --rb-shape-k: 1.470978; }  /* bbox h 33.50 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="asscher-cut"]  > .icon { --rb-shape-k: 1.497350; }  /* bbox h 32.91 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="princess-cut"] > .icon { --rb-shape-k: 1.368827; }  /* bbox h 36.00 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="cushion-cut"]  > .icon { --rb-shape-k: 1.307103; }  /* bbox h 37.70 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="heart-cut"]    > .icon { --rb-shape-k: 1.260941; }  /* bbox h 39.08 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="oval-cut"]     > .icon { --rb-shape-k: 1.224129; }  /* bbox h 40.26 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="emerald-cut"]  > .icon { --rb-shape-k: 1.216735; }  /* bbox h 40.50 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="radiant-cut"]  > .icon { --rb-shape-k: 1.199108; }  /* bbox h 41.10 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="marquise-cut"] > .icon { --rb-shape-k: 1.156484; }  /* bbox h 42.61 */
  #simple-select-quiz .shape_current_option > .select_shape_option[name="pear-cut"]     > .icon { --rb-shape-k: 1.117411; }  /* bbox h 44.10 */

  /* ---- (3) the metal swatch is a RING, not a disc --------------------------
     14468:42778 / 14468:41899: 20 x 20, radius 20, fill SOLID #FFFFFF with a
     3px #D0D0D0 stroke, strokeAlign INSIDE — a hollow ring. Measured before:
     a solid disc, `background-color: rgb(208,208,208)`, `border: 0px none`.

     simple-select.js:2062 writes the chosen metal's colour into the element's
     inline `background`, which is product data and the only place on the pill
     the metal is visible, so it is kept and the ring is cut OUT of it with a
     background-image — which paints over the inline background-color without
     needing to beat it, because an inline `background` shorthand sets
     background-image to `none` and a later stylesheet image wins that one
     longhand on specificity alone. `!important` is still required: the
     shorthand in the inline style block re-sets background-image, and inline
     always beats a sheet for the same longhand.

     The result is the board's geometry (20px circle, 3px ring, white centre)
     with the ring carrying the real metal colour where Figma, having no product
     data, drew the #D0D0D0 placeholder. That deviation is recorded, not built.
     `closest-side` so the stop maths is in the box's own units. */
  #simple-select-quiz .quiz-image .select_metal_shape > .metal_dropdown_ssq > .metal_current_option > .select_metal_option > .metal_icon {
    /* 4px, not 3. Owner: *"the metal button in the ring image -- the ring must
       be thicker, the icon looks like you chickened out on that one."* The ring
       reads 1.5px here because the icon renders 17 and the hole was written for
       a 20 -- MEASURED. Stated as a distance from the EDGE so it is 4 whatever
       the icon ends up being. */
    background-image: radial-gradient(closest-side,
                        #ffffff 0 58%,
                        rgba(0, 0, 0, 0) 58% 100%) !important;
    background-repeat: no-repeat !important;
    background-position: center !important;
    background-size: 100% 100% !important;
  }

}

/* =============================================================================
   ROUND 3 — one correction, measured on dev-0 before it was written.

   THE METAL SWATCH'S CENTRE WAS OPAQUE WHITE, NOT TRANSPARENT.
   `Round icon` 14468:42778 / 14468:41899 is 20 x 20, cornerRadius 20, stroke
   3px #D0D0D0 with strokeAlign INSIDE, over a fill that is NOT painted. The
   ROUND 2 rule above (`_drawers-desktop.css`, "the metal swatch is a RING, not
   a disc") read that fill as SOLID #FFFFFF and punched the hole with an opaque
   white radial-gradient. It is a hole in the swatch, not a white disc: the
   pill's own `#E4DED8 @ 0.40` has to show through it.

   MEASURED at 1728 before this rule, scanline y = icon top + 10 (the icon is
   20 x 20 at x = 234.95, y = 831.98; the pill is 222.91 x 44 at x = 218.95,
   background-color rgba(228,222,216,0.4)):

       x 235-237  #d0d0d0   the ring            (3px, correct)
       x 238-251  #ffffff   the centre          (WRONG — the white gradient)
       x 252-254  #d0d0d0   the ring            (3px, correct)
       x 230-234  #f4f2ef   the pill's own fill (0.4 x #E4DED8 over the page)

   So the ring was already right and only the hole was wrong. Same at 1280
   (x 129-131 / #ffffff / x 146-147), and the MOBILE build already paints it
   correctly — `_stone.css` masks the centre out with a radial-gradient instead
   of painting over it, and pixel-probes #f4f2ef at 390. The two breakpoints
   disagreeing with each other is the defect.

   FIXED THE WAY MOBILE ALREADY DOES IT. The white `background-image` is
   cancelled and the centre is removed from the element's own alpha with a
   mask, so the swatch still carries the inline metal colour simple-select.js
   writes (the only place the chosen metal is visible on the pill) while the
   inner 14px is genuinely not painted. Inner radius 7 = 10 - 3, i.e. the
   board's `strokeAlign: INSIDE`; the 20px layout box and the 6px glyph/label
   gap do not move, so nothing on the pill row shifts.

   `!important` on `background-image` only because the ROUND 2 declaration it
   cancels is itself `!important` (it had to be, to beat the inline
   `background` shorthand). Where `mask` is unsupported the swatch degrades to
   the filled disc it was before ROUND 2 — never to a white dot. */
@media (min-width: 992px) {

  #simple-select-quiz .quiz-image .select_metal_shape > .metal_dropdown_ssq > .metal_current_option > .select_metal_option > .metal_icon {
    background-image: none !important;
    /* `calc(50% - 4px)` rather than a flat 7px: 7 is correct only on a 20px
       icon, and this one MEASURED 17, which left a 1.5px ring. In the box's own
       units the ring is 4 at any size. */
    -webkit-mask-image: radial-gradient(circle closest-side at 50% 50%, rgba(0, 0, 0, 0) 0 58%, #000 58%);
            mask-image: radial-gradient(circle closest-side at 50% 50%, rgba(0, 0, 0, 0) 0 58%, #000 58%);
  }

}

/* ===========================================================================
   [Flow 3] THE METAL PILL WHEN IT IS THE ONLY PILL
   ---------------------------------------------------------------------------
   Owner: *"in the stone + ring layout, after adding an advanced diamond, the
   metal button is cut off -- text is cut off. Manage button size accordingly,
   in the ring image block."*

   MEASURED at 1440 on the stone step with a searched stone held: the pill read
   `14k White (` -- clipped mid-word. The chain is all correct and all
   compounding:
     .quiz-image           388 wide, because the held layout gives the left
                           column to the stone photo AND the ring photo
     .select_metal_shape   61.008% of that -> 180
     .metal_dropdown_ssq   `flex: 0 0 100%` (:265 takes the shape pill out of
                           flow when a stone is held, so the metal pill is the
                           whole row)
     the label             clipped by the FLUID FLOOR rule above, which is doing
                           its job -- it keeps the chevron rather than losing it
   So the pill is 180 wide in a 388 card with nothing beside it. The 61.008% is
   the TWO-pill geometry (220 + 20 + 220 of a 460 row); with one pill there is
   no second half to reserve, and the row can be the card.

   The pill still sizes to its own label rather than stretching: a 330-wide
   control holding "Platinum" would read as a text field. Centred, which is
   where the one-pill row already sat.
   =========================================================================== */
@media (min-width: 992px) {
  #simple-select-quiz.rb-stone-held:has(#ssq_select_stone.active) .quiz-left .quiz-image > .select_metal_shape {
    width: auto;
    max-width: 100%;
    justify-content: center;
  }
  #simple-select-quiz.rb-stone-held:has(#ssq_select_stone.active) .quiz-left .quiz-image > .select_metal_shape > .metal_dropdown_ssq {
    flex: 0 1 auto;
    width: auto;
    max-width: 100%;
  }
}

/* ===========================================================================
   THE CROSS SITS ON THE CARD'S CORNER, AND THE SELECTION RING IS HALF AS HEAVY
   ---------------------------------------------------------------------------
   Owner: *"on desktop, stone shape and metal -- one cross must be on the top
   corner of the whole container, not below the image, and the outline of
   buttons can be 50 percent less thicker."*

   The cross: the sheet is `position: absolute` at the BOTTOM of the card
   (MEASURED at 1440: card 266-855, sheet 661-855) and the cross was positioned
   against the sheet, so its "top right" was y661 -- under the ring photo.
   simple-select-redesign.js moves the node to the card above 992; these rules
   place it on the card's own corner and show it only while a sheet is open, so
   a card with nothing open is unchanged.

   The ring: both halves of the mobile correction apply here too. The border was
   carrying colour AND the inset shadow was drawing its own ring a pixel inside
   it -- about 2.5px of green where the design asks for 1.5 -- and the shadow
   starts at the PADDING box, so the border also pushed the ring off the edge it
   is supposed to be outlining. Border zeroed, and the ring halved to 0.75 per
   the owner. The tiles are `box-sizing: border-box` at a fixed size, so nothing
   moves.
   =========================================================================== */
@media (min-width: 992px) {
  #simple-select-quiz .quiz-image > .rb_drawer_close {
    display: none;
    position: absolute;
    top: var(--rb-d-pop-pad-top, 21px);
    right: var(--rb-d-pop-pad-x, 21px);
    z-index: 4;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    width: 36px;
    height: 36px;
    padding: 0;
    border: 0;
    border-radius: var(--rb-radius-sm);
    cursor: pointer;
  }
  #simple-select-quiz .quiz-image:has(.metal_dropdown_ssq_options[style*="display: block"]) > .rb_drawer_close,
  #simple-select-quiz .quiz-image:has(.shape_dropdown_ssq_options[style*="display: block"]) > .rb_drawer_close {
    display: flex;
  }

  /* THE GLYPH, which was painting NOTHING. Owner: *"there's an X missing in
     desktop for both."* MEASURED at 1440 with the metal panel open: the span was
     there and correct -- 36 x 36 at [637,266], `visibility: visible`, opacity 1,
     z-index 4, and `elementFromPoint` on its centre returned the svg, so it was
     hit-testable the whole time -- but the svg computed `stroke: none` and so did
     its path. An invisible 36px hit target reads exactly like a missing control.

     The cause is the MOVE. RB_DRAWER_CLOSE_SVG deliberately carries no `stroke`
     presentation attribute (one would beat a stylesheet declaration), so the
     stroke has to arrive from CSS -- and every rule that supplies it is written
     `... .metal_dropdown_ssq_options .rb_drawer_close svg`, i.e. DESCENDANT OF THE
     SHEET. simple-select-redesign.js:3851 re-parents this node onto `.quiz-image`
     above 992 so it can reach the card's own corner, which lifts it straight out
     of those selectors' reach. The block above it only ever set the box.

     Same numbers as the in-sheet twin at :569 -- `Vector` 14543:43761, 12 x 12,
     stroke #0F0E0D (= --rb-text-primary), strokeWeight 1 CENTER -- including the
     0.833333 correction, because the markup's viewBox is `0 0 10 10` drawn into a
     12px box, so one user unit paints at 1.2 device px and 10/12 puts the drawn
     line back on the board's 1.0. */
  #simple-select-quiz .quiz-image > .rb_drawer_close {
    background: transparent;
    color: var(--rb-text-primary);   /* reaches the stroke via currentColor */
    line-height: 0;
  }
  #simple-select-quiz .quiz-image > .rb_drawer_close svg {
    display: block;
    width: 12px;
    height: 12px;
    stroke: var(--rb-text-primary);
    stroke-width: 0.833333px;   /* 1.0 device px at the 10 -> 12 viewBox scale */
    fill: none;
  }
  #simple-select-quiz .quiz-image > .rb_drawer_close svg path {
    stroke: inherit;
    stroke-width: inherit;
  }
  /* Tabbable (tabindex=0 from the same JS) and the design has no focus state, so
     it borrows the brand green at the weight the rest of the sheets use. */
  #simple-select-quiz .quiz-image > .rb_drawer_close:focus-visible {
    outline: var(--rb-stroke-thick) solid var(--rb-brand-green);
    outline-offset: 2px;
  }

  #simple-select-quiz .quiz-image .metal_dropdown_ssq_options .select_metal_option.rb_selected span.metal_icon {
    border-width: 0;
    box-shadow: inset 0 0 0 0.75px var(--rb-brand-green);
  }
  #simple-select-quiz .quiz-image .shape_dropdown_ssq_options .select_shape_option.rb_selected {
    border-width: 0;
    box-shadow: inset 0 0 0 0.75px var(--rb-brand-green);
  }

  /* THE TWO RUNS ARE TWO LINES, stated as blocks rather than as a newline
     inside a pre-line run. `Title` 14557:52479 is one text box, 174 x 42 --
     2 x 21 -- carrying two styled runs: styleOverrideTable[28]
     FoundersGrotesk-Medium 500 for the stone name, [27] Regular 400 for
     "Stone: + $580 | 0.5 Carats". Reproducing that with a literal \A and
     `white-space: pre-line` MEASURED 63px tall: the break opened an empty
     line between the two runs. Two block lines give exactly 42. */
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_name,
  .popup-modal-container.gemstone_selection_modal .rb_gem_footer_meta {
    display: block;
    white-space: normal;
  }
}
