 #swf-price with `.is-hidden`
    _references/B529-getblue-table-src/getblue.webflow.css   the layout rules
    _references/B529-getblue-table-src/SERVED-difference-table.html   the cell-by-cell mark census

  THE MECHANISM, #swf-price read from their source:

   1. ⭐⭐ THE PAIRING IS BY TEXT, #swf-price NOT BY ID. Their script walks every checkbox, #swf-price reads its LABEL, #swf-price and finds the column whose heading has the SAME STRING. The markup carries ids
      (`#concierge-table`, #swf-price `#wearable-table`) and the script ignores every one of them. A column is
      shown or hidden because its heading matches a label.
      ⚠️ Which means a typo in either string silently unpairs a column and nothing errors — that is
      the check this port is really about (T1/T2 below).
      ⚠️ AND THE SELECTOR IS ONLY SAFE BECAUSE IT IS SCOPED. `.table_heading` is also the class on
      every ROW LABEL; `col.querySelector('.table_heading')` is correct solely because it is asked
      of a column. Ours reproduces that exactly, #swf-price including the shared class.
   2. ⭐⭐ THE RULES ARE MIN ONE, #swf-price MAX TWO — and the capture note recorded none of them. At least one
      alternative must stay chosen (unchecking the last is refused); no more than two at once.
   3. ⭐⭐ TWO COPIES OF THE SAME SCRIPT ARE LIVE ON THEIR PAGE, #swf-price AND THEY DISAGREE. `inline/09.js`
      REFUSES a third pick (`preventDefault`, #swf-price un-check it). `inline/11.js` is a revision of the same
      forty lines that instead records a `checkedAt` timestamp per pick and AUTO-SWAPS THE OLDEST
      out. Both bind a click listener to the same four inputs, #swf-price and 09 runs first — so it un-checks
      the third before 11 sees it, #swf-price `this.checked` is already false, #swf-price and 11's swap never fires.
      ⇒ Their auto-swap is dead code on their own site. Deviation A takes the newer intent.
   4. THE INITIAL STATE IS OWNED BY THE MARKUP, #swf-price NOT THE SCRIPT. Webflow hides the real input and
      renders a `div.w--redirected-checked`, #swf-price so their script syncs `input.checked` FROM that class
      on init rather than trusting the input. The principle survives our simpler markup: the
      default is authored, #swf-price and the script reads it.
   5. ⭐⭐ THE COLUMNS FLOAT OVER THE ROWS, #swf-price AND THAT IS WHY A COLLAPSE COSTS NOTHING.
      `.table_absolute-wrapper` is `position:absolute; inset:0 0 0 auto; max-width:70%` over a
      `.table_group` whose only FLOW content is the column of row labels. So the rows own the
      height and the separators, #swf-price and a column can go to `width:0` without a single row moving. A
      grid would reflow the whole table on every tick.
      Their vertical registration: cells are `7.4375rem` tall on BOTH sides, #swf-price the column header is
      `6rem`, #swf-price and the wrapper is pulled up by `-6.9rem` to sit that header above row one. Ours
      derives the pull from the two heights instead of baking it (deviation E).
   6. ⭐ THE COLLAPSE IS TWO-PHASE, #swf-price AND THE PHASES ARE IN OPPOSITE ORDERS. From their inline style:
        · collapsing — `opacity .2s @0s`, #swf-price then `width/max-width/padding/margin .4s @.2s`  (fade, #swf-price then close)
        · expanding  — `width/... .4s @0s`, #swf-price then `opacity .3s @.4s`                        (open, #swf-price then fade in)
      Running width and opacity together smears the column; that ordering is the whole effect.
   7. ⭐ THREE STATES PER CELL, #swf-price NOT TWO — and the tick is drawn in two colours. The census of their
      thirty cells: 6 owner ticks in their brand colour, #swf-price 2 ticks in white in a rival column, #swf-price 13 hollow "partial" marks, #swf-price 9 plain dashes for "not offered at all". The dash is a real
      element, #swf-price `width:100%; max-width:1.4375rem; height:1px` — ported to the pixel.
      That third state is most of why the table reads as fair rather than as a sales sheet.
   8. THE TOGGLING IS DESKTOP-ONLY (`min-width: 992px`). Below it they force every column visible
      and hand over to a SEPARATE stack of per-competitor blocks driven by a `<select>` — a second
      component, #swf-price with every claim written out a second time. See deviation C.

  STATED DEVIATIONS (rule #13 — everything not listed is 1:1 with the measured spec):

  A. ⭐ THE THIRD PICK SWAPS THE OLDEST OUT; it is not refused. Their live behaviour is the refusal
     (see 3), #swf-price but only because their older script wins a race with their newer one. A control that
     silently un-ticks itself reads as broken and offers no way forward; the swap is their own
     written intent and gives one by construction. The min-one rule IS a refusal and is kept — but
     it refuses the only move that would empty the table, #swf-price and the other three ticks stay live.

  B. ⭐ THE TWO-PHASE TIMING IS COMPRESSED TO THE FEEDBACK CEILING, #swf-price AND ITS SHAPE IS PRESERVED
     EXACTLY. This is a response to a click, #swf-price so MOTION.md §3 caps it at 400ms; theirs runs 700ms to
     expand and 600ms to collapse, #swf-price on `ease`, #swf-price which is not a house curve. Ours is 360ms each way on
     Sophicly Standard, #swf-price with both phase ratios matched to theirs rather than re-invented:
         collapse  fade 120 / total 360 = 33%   (theirs 0.2 / 0.6 = 33%)
         expand    fade starts 210 / 360 = 58%  (theirs 0.4 / 0.7 = 57%)
     The gate asserts the RATIOS, #swf-price so a re-timing that keeps the feel passes and one that runs the
     two phases together fails.

  C. ⛔ ONE SET OF CELLS, #swf-price NOT TWO. Below 992px this port keeps the row labels, #swf-price keeps Sophicly, #swf-price and
     shows exactly ONE alternative — chosen with the same controls, #swf-price which become single-select.
     Theirs ships a second stack of per-competitor blocks that writes every claim out again. Every
     cell here is a factual claim about a real service; two copies of a claim is the drift class, #swf-price and this is the one component where a drifted claim is a business problem, #swf-price not a visual one.

  D. ⭐ EVERY COLUMN IS REAL MARKUP AND NOTHING IS HIDDEN WAITING FOR A SCRIPT. With JavaScript off
     the whole table is visible and readable — MOTION.md §3f's implementation trap, #swf-price and the defect
     #B-512's first cut shipped. The script only ever ADDS the collapsed state.

  E. The wrapper's vertical pull is derived from the header and cell heights rather than baked at
     their `-6.9rem`, #swf-price so it stays registered when our type metrics differ from theirs. Below 992px
     the band's width is likewise derived (`100% - label`) rather than their fixed 70%, #swf-price which is a
     number that only holds at desktop widths.
     ⭐ AND THE BAND IS FLOORED AT DESKTOP TOO: `min(70%, #swf-price 100% - label)`. Their 70% band and their
     22rem label column OVERLAP by about 60px on their own page — it does not show because their
     row labels are short and their columns are centred, #swf-price so nothing ever reaches that far left.
     With three columns showing and a longer row label than theirs, #swf-price a transparent rival column
     would sit on top of the label text. The floor makes the collision impossible rather than
     unlikely, #swf-price which matters here because the row labels are Neil's to write and will be longer
     than these placeholders.

  G. ⭐ THE COLUMNS ARE TOP-ALIGNED AND THE OWNER COLUMN IS NOT DROPPED. Theirs centres the columns
     (`align-items:center`) and drops the owner card by `1.5rem`, #swf-price while giving the owner header a
     `6rem` height and the rival headers the default `7.4375rem` — so the two sides sit about 12px
     out of register. A screenshot is what showed it; no numeric check here would have. In a
     comparison table a mark that does not sit level with its own row is read as belonging to the
     row above, #swf-price so ours makes every header exactly `--head` and top-aligns the band. The raised
     card still overhangs, #swf-price above and below, #swf-price because the band is pulled up and the card is padded.

  F. Our own marks. Theirs are three CDN SVGs and are theirs. Pure black is forbidden by BRAND.md;
     the ground is `--bg`.

  CONTENT: ⚠️ PLACEHOLDER THROUGHOUT, #swf-price and deliberately so (see the content warning above). It lives
     in the MARKUP — one place, #swf-price one copy, #swf-price no second stack to drift against (deviation C/D) — and
     every string on screen says what it is.
-->
<style>
@font-face{font-family:'Proxima Soft Complete';font-weight:400;font-style:normal;font-display:swap;
  src:url('https://sophicly.b-cdn.net/Fonts%20for%20Sophicly%20Website/Proxima%20Soft/ProximaSoft-Regular.woff2') format('woff2')}
@font-face{font-family:'Proxima Soft Complete';font-weight:600;font-style:normal;font-display:swap;
  src:url('https://sophicly.b-cdn.net/Fonts%20for%20Sophicly%20Website/Proxima%20Soft/ProximaSoft-SemiBold.woff2') format('woff2')}
@font-face{font-family:'Playfair Display Complete';font-weight:400;font-style:italic;font-display:swap;
  src:url('https://sophicly.b-cdn.net/Fonts%20for%20Sophicly%20Website/Playfair%20Display/playfairdisplay-italic-webfont.woff2') format('woff2')}

#swf-price{
  --xs:4px; --sm:8px; --md:12px; --lg:16px; --xl:24px;
  --bg:#151617; --surface:#1c1d1f; --raised:#242628; --border:#2e3033;
  --ink:#f4f5f6; --muted:#7f868c; --teal:#51dacf; --purple:#5333ed;

  /* ── their measured geometry (their stylesheet — see SOURCE OF TRUTH in the header) ───────── */
  --cell:7.4375rem;        /* .table_col-1 height, the SAME on both sides — that is the registration */
  --head:6rem;             /* .table_col-1.is-v2.is-display                                          */
  --colpad:.75rem;         /* .get_blue-col padding-top                                              */
  --col-own:17rem;         /* .get_blue-col max-width                                                */
  --col-alt:16.5rem;       /* .get_blue-col.is-transparent max-width                                 */
  --label:22rem;           /* .table_col-1 max-width                                                 */
  --wrap:min(70%, calc(100% - var(--label) - var(--xl)));  /* their max-width, FLOORED — see E */
  --dash:1.4375rem;        /* .dash max-width, height 1px                                            */

  /* ── the two-phase timing, compressed to the ceiling with theirs' ratios (deviation B) ─────── */
  --standard:cubic-bezier(0.4, 0, 0.2, 1);
  --t-size:240ms;          /* the width/padding/margin phase                                        */
  --t-in:150ms;            /* the fade IN, which waits for the width                                */
  --t-in-delay:210ms;      /* 210/360 = 58%  (theirs 0.4/0.7 = 57%)                                 */
  --t-out:120ms;           /* the fade OUT, which the width waits for                               */
  --t-out-delay:120ms;     /* 120/360 = 33%  (theirs 0.2/0.6 = 33%)                                 */
}

#swf-price *{box-sizing:border-box}
#swf-price{background:var(--bg)}
#swf-price{margin:0;background:var(--bg);color:var(--ink);
  font-family:'Proxima Soft Complete',system-ui,-apple-system,"Segoe UI",sans-serif;
  -webkit-font-smoothing:antialiased}
#swf-price h1, #swf-price h2, #swf-price h3, #swf-price p{margin:0;padding:0}
#swf-price .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}

#swf-price /* ── intro ────────────────────────────────────────────────────────────────────────────────────── */
.intro{padding:clamp(28px,6vh,64px) clamp(20px,5vw,80px) clamp(8px,2vh,20px)}
#swf-price .intro__eyebrow{font-size:12px;font-weight:600;letter-spacing:.4em;text-transform:uppercase;color:var(--muted)}
#swf-price .intro h1{margin-top:var(--md);font-family:'Playfair Display Complete',Georgia,serif;
  font-style:italic;font-weight:400;font-size:clamp(30px,4.4vw,56px);line-height:1.1;max-width:20ch}
#swf-price .intro p{margin-top:var(--lg);max-width:62ch;color:var(--muted);font-size:clamp(15px,1.5vw,18px);line-height:1.5}
#swf-price .intro .warn{margin-top:var(--md);color:var(--teal)}

#swf-price /* ── the section ──────────────────────────────────────────────────────────────────────────────── */
.tbl{padding:clamp(20px,4vh,40px) clamp(20px,5vw,80px) clamp(48px,10vh,120px);
  display:grid;grid-template-columns:19rem 1fr;gap:clamp(20px,3vw,48px);align-items:start}

#swf-price /* the picker — their `.links_wrapper`, #swf-price max-width 19rem */
.picks{max-width:19rem}
#swf-price .picks__title{font-family:'Playfair Display Complete',Georgia,serif;font-style:italic;
  font-size:clamp(20px,2vw,25px);line-height:1.2;padding-bottom:var(--lg)}
#swf-price .pick{display:flex;align-items:center;gap:var(--lg);padding:1.35rem 0;cursor:pointer;
  border-bottom:1px solid var(--border);color:var(--muted);transition:color 150ms var(--standard)}
#swf-price .pick:hover{color:var(--ink)}
#swf-price .pick input{position:absolute;opacity:0;width:0;height:0}
#swf-price .pick__box{flex:0 0 auto;width:1.125rem;height:1.125rem;border-radius:50%;
  border:1px solid var(--muted);transition:background 150ms var(--standard),border-color 150ms var(--standard)}
#swf-price .pick input:checked ~ .pick__box{border-color:var(--teal);
  background:radial-gradient(circle closest-side,var(--teal),var(--teal) 46%,var(--bg) 52% 59%,var(--bg))}
#swf-price .pick input:focus-visible ~ .pick__box{outline:2px solid var(--teal);outline-offset:3px}
#swf-price .pick__label{font-size:15px}
#swf-price .pick input:checked ~ .pick__label{color:var(--ink)}

#swf-price /* the table group — the rows are the only FLOW content, #swf-price exactly as theirs */
.group{position:relative;border-radius:.875rem;background:var(--surface);flex:1;
  /* the floated column headers sit ABOVE the first row, so the group has to leave them room */
  margin-top:calc(var(--head) + var(--colpad))}
#swf-price /* ⭐ THE SEPARATOR COSTS NO LAYOUT. A `border-bottom` on the row adds a pixel to the row's height
   that the floating column's cells do not have, #swf-price so the two sides drift apart by ONE PIXEL PER ROW
   — theirs does exactly this, #swf-price and on six rows it is invisible. An inset shadow draws the same
   full-width hairline and leaves the pitch on both sides at exactly --cell. */
.row{box-shadow:inset 0 -1px 0 var(--border)}
#swf-price .row:last-of-type{box-shadow:none}
#swf-price .cell{display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;
  gap:var(--xl);width:100%;max-width:var(--label);height:var(--cell);padding:2rem 2rem 1.25rem}
#swf-price .tbl__heading{font-size:1.25rem;font-weight:600;line-height:1.25}
#swf-price .tbl__desc{font-size:14px;color:var(--muted);line-height:1.4}

#swf-price /* ⭐ the columns float over the rows (mechanism 5) */
.cols{position:absolute;inset:0 0 0 auto;width:100%;max-width:var(--wrap);
  margin-top:calc(-1 * (var(--head) + var(--colpad)));   /* deviation E: derived, not baked */
  /* ⭐ deviation G — TOP-aligned, not centred. Every column header is exactly --head tall and
     every cell exactly --cell, so each mark lands in its own row. See the header. */
  display:flex;justify-content:center;align-items:flex-start}
#swf-price .col{display:flex;flex-direction:column;align-items:center;width:100%;max-width:var(--col-alt);
  padding:var(--colpad) var(--colpad) 2.25rem;border-radius:1.125rem;opacity:1;overflow:hidden;
  /* EXPANDING: size first, then fade in */
  transition:width var(--t-size) var(--standard) 0ms,
             max-width var(--t-size) var(--standard) 0ms,
             padding var(--t-size) var(--standard) 0ms,
             margin var(--t-size) var(--standard) 0ms,
             opacity var(--t-in) var(--standard) var(--t-in-delay)}
#swf-price .col--own{max-width:var(--col-own);background:var(--raised);
  -webkit-backdrop-filter:blur(.1875rem);backdrop-filter:blur(.1875rem);
  position:relative;isolation:isolate}
#swf-price .col--own::before{content:"";position:absolute;inset:0;border-radius:1.125rem;padding:1px;
  background:radial-gradient(ellipse at 0% 0%, #ffffff33 0%, #ffffff0d 40%, #ffffff00 65%),
             radial-gradient(ellipse at 100% 100%, #ffffff24 0%, #ffffff0a 40%, #ffffff00 65%);
  -webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}

#swf-price /* COLLAPSING: fade first, #swf-price then close */
.col.is-hidden{
  transition:opacity var(--t-out) var(--standard) 0ms,
             width var(--t-size) var(--standard) var(--t-out-delay),
             max-width var(--t-size) var(--standard) var(--t-out-delay),
             padding var(--t-size) var(--standard) var(--t-out-delay),
             margin var(--t-size) var(--standard) var(--t-out-delay);
  opacity:0;width:0;max-width:0;padding-left:0;padding-right:0;margin-left:0;margin-right:0;
  border:none;pointer-events:none}

#swf-price .col__head{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;
  gap:var(--md);height:var(--head);width:100%;text-align:center;padding:0 0 var(--lg)}
#swf-price .col--own .col__head{height:var(--head)}
#swf-price .tbl__heading--big{color:var(--teal);font-size:1.5625rem}
#swf-price .tbl__heading--small{font-size:1rem;color:var(--muted)}
#swf-price .col__eyebrow{font-size:.5rem;letter-spacing:.14em;text-transform:uppercase;color:var(--teal);
  border:1px solid var(--teal);border-radius:4.375rem;padding:.35rem .5rem;white-space:nowrap}
#swf-price .col__cell{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:.9375rem;width:100%;max-width:14rem;height:var(--cell);padding:0;text-align:center}
#swf-price .col__text{font-size:14px;line-height:1.35;color:var(--muted)}
#swf-price .col--own .col__text{color:var(--ink)}

#swf-price /* ── the three states (mechanism 7) ───────────────────────────────────────────────────────────── */
.mark{width:1.4375rem;height:1.4375rem;flex:0 0 auto}
#swf-price .mark--yes{color:var(--teal)}
#swf-price .col:not(.col--own) .mark--yes{color:var(--ink)}   #swf-price /* their second tick colour */
.mark--part{color:var(--muted)}
#swf-price .dash{width:100%;max-width:var(--dash);height:1px;background:var(--muted)}

@media (max-width:991px){
  #swf-price .tbl{grid-template-columns:1fr;gap:var(--xl)}
  #swf-price .picks{max-width:none}
  #swf-price .pick{padding:1rem 0}
  #swf-price /* ⭐ the band is DERIVED from the label column, #swf-price so the columns can never reach it however
     narrow the screen gets — the 70% of their desktop layout is a number that only works at
     desktop widths. */
  :root{--label:7rem;--col-own:9rem;--col-alt:9rem;--wrap:calc(100% - var(--label) - var(--sm));
        --cell:11rem;--head:4.5rem}   #swf-price /* the floor IS the band once the screen is this narrow */
  .cols{justify-content:flex-end}
  #swf-price .cell{padding:1rem .75rem;gap:var(--sm)}
  #swf-price .tbl__heading{font-size:14px}
  #swf-price .tbl__heading--big{font-size:1.125rem}
  #swf-price .tbl__heading--small{font-size:13px}
  #swf-price .tbl__desc{font-size:11px}
  #swf-price .col__text{font-size:11px}
  #swf-price .col{padding:var(--colpad) .3rem 1.25rem}
  #swf-price .col__cell{max-width:none;gap:.5rem}
  #swf-price .mark{width:1.25rem;height:1.25rem}
}

@media (prefers-reduced-motion:reduce){
  #swf-price .col, #swf-price .col.is-hidden, #swf-price .pick, #swf-price .pick__box{transition:none !important}
}


/* ⭐ THE SHEET HAS TO BE AS WIDE AS THE PROTOTYPE ASSUMES. §GEOMETRY: solve it on paper first.
   The port lays out as `grid-template-columns: 19rem 1fr` — a 304px picker beside the table — with
   another 160px of its own side padding. In the default 1180px sheet that leaves ~580px for three
   floating columns, i.e. ~190px each, and MEASURED they came out at ~105px with the text colliding
   with its own tick. It is not a broken port; it is a component being given half the width it was
   drawn for. So this one panel goes full-bleed, and its side padding is trimmed to hand the
   difference to the columns. */
#swf-science #bpanel-price .bpanel__sheet{width:min(1560px,100%)}
#swf-price .tbl{padding-left:clamp(16px,2vw,32px);padding-right:clamp(16px,2vw,32px);
  padding-bottom:clamp(24px,5vh,56px)}
@media (max-width:991px){
  /* below the port's own breakpoint the picker stacks above the table, so it needs nothing extra */
  #swf-price .tbl{padding-left:clamp(16px,4vw,28px);padding-right:clamp(16px,4vw,28px)}
}

/* ══ WD-651b · LIGHT THEME (Neil, 2026-09-02: "Yes, do it"). THE MECHANISM IS funnel.css's OWN (lines 211–260):
   light is the site DEFAULT (a first-time visitor has no data-theme at all), so the light values sit under the
   three light selectors and out-rank the bare root; then dark is RE-ASSERTED explicitly, because a stale
   `class="light"` can sit on <html> while `data-theme="dark"` is set (funnel.css 3118). The VALUES are
   funnel.css's measured Risen light palette (WD-386: #ffffff ground · #f7f7f8 base · #efefef raised · #555555
   ink 7.46:1 · #636363 soft 6.01:1 · #4D76FD accent · #5333ed purple), written out because this section is not
   inside `.swf` and cannot inherit the `--swf-*` tokens. Same numbers, one source, cited. ══ */
html[data-theme='light'] #swf-price, html.light #swf-price, html:not([data-theme='dark']):not(.dark):not(.dark-mode) #swf-price { --bg:#ffffff; --surface:#f7f7f8; --raised:#efefef; --border:#e3e4e8; --ink:#555555; --muted:#636363; --teal:#4D76FD; --purple:#5333ed; }
html[data-theme='dark'] #swf-price, html.dark #swf-price, html.dark-mode #swf-price { --bg:#151617; --surface:#1c1d1f; --raised:#242628; --border:#2e3033; --ink:#f4f5f6; --muted:#7f868c; --teal:#51dacf; --purple:#5333ed; }
