/* 2026-10-01 Customer reviews as his phone blowing up (Quinten OK'd): one big quote, three phones holding the real threads
   (customer = tan bubble, Frausto's reply = black), emoji as stickers, a "10 out of 10" stamp. (2026-10-02: the receipts strip was removed - Quinten.)
   Every customer line is word for word from Eric's intake. Shared by the home page and the product page. */
.fxr{--ink:#000;--tan:#C9BCAC;--paper:#fffdf8;max-width:1180px;margin:0 auto;padding:0 clamp(16px,4vw,40px);text-align:center;color:var(--ink)}
.fxr .fxr-kick{max-width:none;margin:0;font:600 .78rem/1.2 "Libre Franklin",system-ui,sans-serif;letter-spacing:.2em;text-transform:uppercase}
.fxr .fxr-big{text-wrap-style:balance;margin:14px auto 0;max-width:16ch;font:400 clamp(40px,7vw,92px)/1 "Rye",Georgia,serif}
.fxr-u{position:relative;display:inline-block;white-space:nowrap}
.fxr-u svg{position:absolute;left:-4%;bottom:-.16em;width:108%;height:.32em;overflow:visible;fill:none;stroke:var(--ink);stroke-width:6;stroke-linecap:round;stroke-dasharray:420;stroke-dashoffset:420;transition:stroke-dashoffset 1.1s cubic-bezier(.65,0,.35,1) .3s}
.fxr.is-in .fxr-u svg{stroke-dashoffset:0}
.fxr .fxr-by{max-width:none;margin:18px auto 0;font:500 1rem/1.4 "Libre Franklin",system-ui,sans-serif}

/* phones */
.fxr-phones{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(18px,3vw,40px);align-items:start;margin-top:clamp(36px,5vw,60px);text-align:left}
.fxr-phone{position:relative;border:3px solid var(--ink);border-radius:34px;background:var(--paper);box-shadow:8px 10px 0 var(--ink);padding:12px 12px 18px;rotate:var(--r,0deg);transition:rotate .5s cubic-bezier(.34,1.56,.64,1)}
.fxr-phone:hover{rotate:0deg}
.fxr-phone:nth-child(1){--r:-3deg}.fxr-phone:nth-child(2){--r:2deg;margin-top:34px}.fxr-phone:nth-child(3){--r:-1.5deg;margin-top:10px}
.fxr-notch{width:84px;height:20px;margin:0 auto 10px;border-radius:12px;background:var(--ink)}
.fxr-head{display:flex;align-items:center;gap:10px;padding:2px 6px 12px;border-bottom:1.5px dashed rgb(0 0 0 / .25)}
.fxr-head img{width:36px;height:36px;border-radius:50%;background:var(--tan);object-fit:contain;padding:4px;border:2px solid var(--ink)}
.fxr-head b{display:block;font:400 1rem/1.1 "Rye",Georgia,serif}
.fxr-head small{display:block;font:500 .72rem/1.3 "Libre Franklin",system-ui,sans-serif;color:rgb(0 0 0 / .55)}
.fxr-thread{display:flex;flex-direction:column;gap:12px;padding:16px 4px 4px}
.fxr-msg{position:relative;max-width:88%;opacity:0;transform:translateY(18px) scale(.55);transform-origin:0 100%;transition:opacity .25s ease,transform .6s cubic-bezier(.34,1.9,.5,1);transition-delay:calc(var(--k) * .55s + .25s)}
.fxr-msg--us{transform-origin:100% 100%}
.fxr-phone.is-in .fxr-msg{opacity:1;transform:none}
.fxr-msg p{margin:0;padding:11px 15px;border:2px solid var(--ink);border-radius:18px 18px 18px 5px;background:var(--tan);font:500 .98rem/1.38 "Libre Franklin",system-ui,sans-serif;box-shadow:3px 4px 0 var(--ink)}
.fxr-who{display:block;margin:0 0 4px 6px;font:700 .7rem/1.2 "Libre Franklin",system-ui,sans-serif;letter-spacing:.1em;text-transform:uppercase;color:rgb(0 0 0 / .6)}
.fxr-msg--us{align-self:flex-end}
.fxr-msg--us p{background:var(--ink);color:#fff;border-radius:18px 18px 5px 18px;box-shadow:3px 4px 0 var(--tan)}
.fxr-msg--us .fxr-who{text-align:right;margin:0 6px 4px 0}
/* typing dots before each customer bubble */
.fxr-dots{position:absolute;left:0;top:20px;display:flex;gap:4px;padding:10px 12px;border:2px solid var(--ink);border-radius:16px;background:#fff;opacity:0}
.fxr-dots i{width:6px;height:6px;border-radius:50%;background:var(--ink);animation:fxr-dot .9s infinite}
.fxr-dots i:nth-child(2){animation-delay:.15s}.fxr-dots i:nth-child(3){animation-delay:.3s}
@keyframes fxr-dot{50%{transform:translateY(-4px);opacity:.4}}
.fxr-phone.is-in .fxr-msg:not(.fxr-msg--us) .fxr-dots{animation:fxr-type .5s steps(1) calc(var(--k) * .55s - .2s) both}
@keyframes fxr-type{0%{opacity:1}100%{opacity:0}}
/* emoji stickers */
.fxr-emo{position:absolute;right:-14px;top:-16px;display:grid;place-items:center;width:42px;height:42px;border:2px solid var(--ink);border-radius:50%;background:#fff;font-size:22px;line-height:1;box-shadow:2px 3px 0 var(--ink);rotate:14deg;scale:0;transition:scale .5s cubic-bezier(.34,1.8,.5,1);transition-delay:calc(var(--k) * .55s + .7s)}
.fxr-phone.is-in .fxr-emo{scale:1}
/* "10 out of 10" stamp */
.fxr-stamp{position:absolute;right:-22px;bottom:-26px;display:grid;place-items:center;width:104px;height:104px;border-radius:50%;background:var(--ink);color:var(--tan);font:400 1.05rem/1 "Rye",Georgia,serif;text-align:center;box-shadow:0 0 0 4px var(--tan),0 0 0 6px var(--ink);rotate:-12deg;z-index:2}
.fxr-stamp span{display:block;font-size:2rem}

/* phones */
@media (max-width:900px){
 .fxr-phones{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;gap:22px;margin-inline:calc(-1 * clamp(16px,4vw,40px));padding:10px clamp(16px,4vw,40px) 34px;scrollbar-width:none}
 .fxr-phones::-webkit-scrollbar{display:none}
 .fxr-phone{flex:0 0 min(310px,82vw);scroll-snap-align:center;margin-top:0!important;min-height:400px}
 .fxr-stamp{right:-6px;width:88px;height:88px;font-size:.9rem}.fxr-stamp span{font-size:1.6rem}
 .fxr-swipe{display:block;margin:4px 0 0;font:600 .75rem/1 "Libre Franklin",system-ui,sans-serif;letter-spacing:.16em;text-transform:uppercase;color:rgb(0 0 0 / .6)}
}
@media (min-width:901px){.fxr-swipe{display:none}}
@media (prefers-reduced-motion:reduce){
 .fxr-msg,.fxr-emo,.fxr-u svg{transition:none}.fxr-msg{opacity:1;transform:none}.fxr-emo{scale:1}.fxr-u svg{stroke-dashoffset:0}
 .fxr-dots,.fxr-phone.is-in .fxr-msg .fxr-dots{display:none;animation:none}.fxr-phone{transition:none}
}
/* 2026-10-02 Quinten: messages pop out, then keep moving - each bubble bobs on its own beat, the emoji stickers rock */
/* 10-02 build check 29: the bubbles no longer bob endlessly - they pop in and settle so people can read; the emoji keep rocking */

@keyframes fxr-bob{0%,100%{translate:0 0}50%{translate:0 -5px}}
.fxr-phone.is-in .fxr-emo{animation:fxr-rock 2.6s ease-in-out calc(var(--k) * .55s + 1.3s) infinite}
@keyframes fxr-rock{0%,100%{rotate:14deg}50%{rotate:-8deg}}
@media (prefers-reduced-motion:reduce){.fxr-phone.is-in .fxr-msg p,.fxr-phone.is-in .fxr-emo{animation:none}}
/* 2026-10-02 Quinten: every phone the same size; the chat plays live inside it - typing dots, the message pops in at the bottom,
   older ones slide up and out the top, then the thread loops. JS adds .is-live (reduced motion keeps the still phones). */
.fxr-phone.is-live{display:flex;flex-direction:column;height:480px;box-sizing:border-box}
.fxr-phone.is-live .fxr-thread{flex:1;min-height:0;overflow:hidden;justify-content:flex-end;gap:0;padding:0 0 2px}
.fxr-row{display:grid;grid-template-rows:0fr;transition:grid-template-rows .5s cubic-bezier(.3,.7,.3,1)}
.fxr-row.on{grid-template-rows:1fr}
.fxr-row>div{min-height:0;overflow:hidden;display:flex;flex-direction:column;padding:18px 16px 6px 4px}
.fxr-phone.is-live .fxr-thread .fxr-msg{opacity:1;transform:none;transition:none;animation:fxr-pop .55s cubic-bezier(.34,1.9,.5,1) both}
@keyframes fxr-pop{from{opacity:0;transform:translateY(14px) scale(.55)}}
.fxr-phone.is-live .fxr-thread .fxr-msg .fxr-dots{display:none}
.fxr-phone.is-live .fxr-thread .fxr-emo{scale:1;transition:none;animation:fxr-emo-in .5s cubic-bezier(.34,1.8,.5,1) .3s both,fxr-rock 2.6s ease-in-out 1s infinite}
@keyframes fxr-emo-in{from{scale:0}}
.fxr-typing{align-self:flex-start;display:flex;gap:4px;padding:10px 12px;border:2px solid var(--ink);border-radius:16px;background:#fff;animation:fxr-pop .4s cubic-bezier(.34,1.9,.5,1) both;transform-origin:0 100%}
.fxr-typing i{width:6px;height:6px;border-radius:50%;background:var(--ink);animation:fxr-dot .9s infinite}
.fxr-typing i:nth-child(2){animation-delay:.15s}.fxr-typing i:nth-child(3){animation-delay:.3s}
.fxr-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
@media (max-width:900px){.fxr-phone.is-live{height:440px}}
.fxr-phone.is-live .fxr-stamp{bottom:auto;top:-30px} /* the stamp rides the top corner so it never covers the newest message */
@media (max-width:900px){.fxr-phone.is-live .fxr-stamp{top:-22px}.fxr-phones{padding-top:30px}}
/* 2026-10-02 Quinten: on phones the three phones stack one under the other instead of a swipe row */
@media (max-width:900px){
 .fxr-phones{flex-direction:column;align-items:center;overflow:visible;scroll-snap-type:none;gap:48px;margin-inline:0;padding:30px 0 34px}
 .fxr-phone{flex:none;width:min(340px,100%);box-sizing:border-box}
 .fxr-swipe{display:none}
}
