{"id":8,"date":"2026-06-18T04:54:30","date_gmt":"2026-06-18T04:54:30","guid":{"rendered":"https:\/\/rollingfix.xyz\/?page_id=8"},"modified":"2026-06-18T04:58:44","modified_gmt":"2026-06-18T04:58:44","slug":"8-2","status":"publish","type":"page","link":"https:\/\/rollingfix.xyz\/?page_id=8","title":{"rendered":""},"content":{"rendered":"\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Space+Grotesk:wght@500;700;800&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap');\n.rf-root,.rf-root *{box-sizing:border-box !important;}\n.rf-root{\n  --ink:#F7F7F8;--ink-soft:rgba(247,247,248,.62);--paper:#2E3138;--paper-dim:#383C44;\n  --paper-line:rgba(247,247,248,.10);--line-on-card:rgba(46,49,56,.14);\n  --ink-soft-on-card:rgba(46,49,56,.62);--signal:#FF5A50;--signal-dark:#D9453C;\n  --signal-soft:rgba(255,90,80,.18);--line-on-ink:rgba(255,255,255,.28);\n  --dot-line:rgba(247,247,248,.06);\n  --f-display:'Space Grotesk',sans-serif;--f-body:'Inter',sans-serif;--f-mono:'JetBrains Mono',monospace;\n  --container:1180px;--gap:clamp(1rem,2vw,2rem);--section-pad:clamp(3.5rem,8vw,7rem);\n  --radius:16px;--ease:cubic-bezier(.33,.1,.2,1);\n  font-family:var(--f-body) !important;background-color:var(--paper) !important;\n  background-image:radial-gradient(var(--dot-line) 1.5px,transparent 1.6px) !important;\n  background-size:26px 26px !important;color:var(--ink) !important;\n  -webkit-font-smoothing:antialiased;overflow-x:hidden;position:relative;\n  width:100vw !important;max-width:100vw !important;\n  margin-left:calc(50% - 50vw) !important;margin-right:calc(50% - 50vw) !important;\n  overflow-x:clip !important;\n}\n.rf-root img{max-width:100% !important;display:block !important;height:auto;}\n.rf-root iframe{max-width:100% !important;filter:invert(90%) hue-rotate(180deg) contrast(90%) brightness(.92) !important;}\n.rf-root a{color:inherit !important;text-decoration:none !important;}\n.rf-root ul{list-style:none !important;margin:0 !important;padding:0 !important;}\n.rf-root button{font-family:inherit !important;cursor:pointer !important;border:none !important;background:none !important;color:inherit !important;}\n.rf-root h1,.rf-root h2,.rf-root h3,.rf-root h4{font-family:var(--f-display) !important;font-weight:800 !important;text-transform:none !important;line-height:1.04 !important;letter-spacing:-.01em !important;margin:0 !important;color:var(--ink) !important;}\n.rf-root h1{font-size:clamp(2.6rem,7vw,6rem) !important;}\n.rf-root h2{font-size:clamp(2rem,5vw,3.8rem) !important;}\n.rf-root h3{font-size:clamp(1.3rem,2.5vw,1.85rem) !important;}\n.rf-root p{line-height:1.65 !important;font-size:1.05rem !important;margin:0 !important;}\n.rf-root .lead{font-size:clamp(1.05rem,1.6vw,1.25rem) !important;line-height:1.6 !important;max-width:48ch;color:var(--ink-soft) !important;}\n.rf-root .eyebrow{font-family:var(--f-mono) !important;text-transform:uppercase !important;font-size:.78rem !important;letter-spacing:.2em !important;font-weight:600 !important;display:inline-flex !important;align-items:center !important;gap:.65em !important;color:var(--signal) !important;}\n.rf-root .eyebrow::before{content:\"\" !important;width:7px !important;height:7px !important;border-radius:50% !important;background:var(--signal) !important;box-shadow:0 0 8px var(--signal-soft) !important;display:inline-block !important;animation:rf-pulse-soft 3.4s ease-in-out infinite;}\n.rf-root .eyebrow--no-dot::before{display:none !important;content:none !important;}\n@keyframes rf-pulse-soft{0%,100%{opacity:1;transform:scale(1);}50%{opacity:.55;transform:scale(.85);}}\n.rf-root .text-mono{font-family:var(--f-mono) !important;}\n.rf-root .text-muted{color:var(--ink-soft) !important;opacity:1 !important;}\n.rf-root .text-center{text-align:center !important;}\n.rf-root .container{width:100%;max-width:var(--container);margin-inline:auto;padding-inline:clamp(1.25rem,4vw,2.5rem);}\n.rf-root .section{padding-block:var(--section-pad);position:relative;}\n.rf-root .section--dim{background:var(--paper-dim) !important;}\n.rf-root .section--ink{background:var(--signal) !important;color:var(--ink) !important;}\n.rf-root .section--tight{padding-block:clamp(2rem,4vw,3.5rem);}\n.rf-root .section--ink .eyebrow,.rf-root .section--ink .eyebrow::before{color:var(--ink) !important;background:var(--ink) !important;box-shadow:none !important;}\n.rf-root .grid{display:grid;gap:var(--gap);}\n.rf-root .grid-2{grid-template-columns:1fr 1fr;}\n.rf-root .grid-3{grid-template-columns:repeat(3,1fr);}\n.rf-root .grid-4{grid-template-columns:repeat(4,1fr);}\n@media(max-width:980px){.rf-root .grid-2,.rf-root .grid-3,.rf-root .grid-4{grid-template-columns:1fr;}}\n@media(min-width:640px) and (max-width:980px){.rf-root .grid-4{grid-template-columns:repeat(2,1fr);}}\n.rf-root .stack{display:flex;flex-direction:column;gap:1rem;}\n.rf-root .row{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;}\n.rf-root .row--between{justify-content:space-between;}\n.rf-root .divider{height:1px;background:var(--paper-line) !important;}\n.rf-root .section--ink .divider{background:var(--line-on-ink) !important;}\n\/* NAV *\/\n.rf-root .nav{position:fixed !important;top:0 !important;left:0 !important;right:0 !important;width:100vw !important;z-index:9999 !important;background:rgba(46,49,56,.92) !important;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--paper-line) !important;box-shadow:0 12px 30px -24px rgba(0,0,0,.9) !important;}\n.rf-root .nav .container{display:flex;align-items:center;justify-content:space-between;height:80px;}\n.rf-root .nav__brand{font-family:var(--f-display) !important;font-weight:800 !important;font-size:1.55rem !important;letter-spacing:-.01em !important;display:flex;align-items:center;gap:.4rem;}\n.rf-root .nav__brand span{color:var(--signal) !important;}\n.rf-root .nav__links{display:flex;gap:clamp(.75rem,1.5vw,2rem);font-family:var(--f-mono) !important;font-size:.78rem !important;letter-spacing:.08em !important;text-transform:uppercase !important;}\n.rf-root .nav__links a{position:relative;padding-bottom:6px;color:var(--ink-soft) !important;transition:color .25s var(--ease);}\n.rf-root .nav__links a::after{content:\"\";position:absolute;left:0;bottom:0;width:0%;height:2px;background:var(--signal) !important;transition:width .3s var(--ease);}\n.rf-root .nav__links a:hover,.rf-root .nav__links a.is-active{color:var(--ink) !important;}\n.rf-root .nav__links a:hover::after,.rf-root .nav__links a.is-active::after{width:100%;}\n.rf-root .nav__links a.nav__wa{background:var(--signal) !important;border-radius:8px;padding:.45rem .9rem;color:var(--ink) !important;}\n.rf-root .nav__links a.nav__wa::after{display:none;}\n.rf-root .nav__cta{display:flex;align-items:center;gap:1rem;}\n.rf-root main{padding-top:80px !important;}\n.rf-root main>div[id],.rf-root section[id],.rf-root [id]{scroll-margin-top:104px !important;}\n@media(max-width:860px){\n  .rf-root main{padding-top:126px !important;}\n  .rf-root .nav .container{height:126px !important;padding-inline:.65rem !important;display:flex !important;flex-wrap:wrap !important;align-items:center !important;justify-content:center !important;align-content:center !important;row-gap:.45rem !important;}\n  .rf-root .nav__brand{width:100% !important;justify-content:center !important;font-size:1.22rem !important;}\n  .rf-root .nav__cta{display:none !important;}\n  .rf-root .nav__links{position:static !important;order:3 !important;width:100% !important;max-height:none !important;opacity:1 !important;overflow:visible !important;display:grid !important;grid-template-columns:repeat(5,minmax(0,1fr)) !important;gap:.38rem !important;padding:.1rem 0 0 !important;background:transparent !important;border-bottom:none !important;}\n  .rf-root .nav__links a{width:100% !important;min-height:38px !important;display:flex !important;align-items:center !important;justify-content:center !important;text-align:center !important;padding:.4rem .15rem !important;border:1px solid rgba(255,255,255,.15) !important;border-radius:999px !important;background:rgba(255,255,255,.055) !important;color:rgba(255,255,255,.9) !important;font-size:clamp(.52rem,2.3vw,.66rem) !important;font-weight:800 !important;}\n  .rf-root .nav__links a::after{display:none !important;}\n  .rf-root .nav__links a.is-active,.rf-root .nav__links a:hover,.rf-root .nav__links a.nav__wa{background:var(--signal) !important;border-color:var(--signal) !important;color:var(--ink) !important;}\n  .rf-root main>div[id],.rf-root section[id],.rf-root [id]{scroll-margin-top:144px !important;}\n}\n@media(max-width:380px){\n  .rf-root .nav__links{gap:.24rem !important;}\n  .rf-root .nav__links a{min-height:36px !important;font-size:.5rem !important;}\n}\n\/* BTN *\/\n.rf-root .btn{display:inline-flex;align-items:center;justify-content:center;gap:.55rem;font-family:var(--f-mono) !important;font-size:.82rem !important;font-weight:700 !important;letter-spacing:.08em !important;text-transform:uppercase !important;padding:1rem 1.85rem !important;border:2px solid var(--signal) !important;border-radius:var(--radius) !important;background:transparent !important;color:var(--signal) !important;transition:all .25s var(--ease);white-space:nowrap;}\n.rf-root .btn:hover{background:var(--signal) !important;color:var(--ink) !important;box-shadow:0 6px 20px var(--signal-soft) !important;transform:translateY(-2px);}\n.rf-root .btn--primary{background:var(--signal) !important;color:var(--ink) !important;box-shadow:0 6px 20px var(--signal-soft) !important;}\n.rf-root .btn--primary:hover{background:var(--signal-dark) !important;transform:translateY(-2px);}\n.rf-root .btn--ghost{border-color:var(--paper-line) !important;color:var(--ink) !important;}\n.rf-root .btn--ghost:hover{background:var(--ink) !important;border-color:var(--ink) !important;color:var(--paper) !important;}\n.rf-root .btn[disabled]{opacity:.35 !important;cursor:not-allowed !important;pointer-events:none;}\n.rf-root .section--ink .btn{border-color:var(--ink) !important;color:var(--ink) !important;}\n.rf-root .section--ink .btn:hover{background:var(--ink) !important;color:var(--signal) !important;}\n.rf-root .section--ink .btn--primary{background:var(--paper) !important;color:var(--ink) !important;}\n\/* HERO *\/\n.rf-root .hero{padding-block:clamp(3.5rem,8vw,6rem) clamp(2.5rem,5vw,4.5rem);position:relative;overflow:hidden;}\n.rf-root .hero__top{display:grid;grid-template-columns:1.3fr .7fr;gap:var(--gap);align-items:end;position:relative;z-index:1;}\n@media(max-width:900px){.rf-root .hero__top{grid-template-columns:1fr;}}\n.rf-root .hero__title{margin-block:.75rem 1.2rem !important;}\n.rf-root .hero__title em{font-style:normal !important;color:var(--signal) !important;}\n.rf-root .scan-line{position:absolute;top:-15%;right:-10%;width:clamp(220px,36vw,440px);height:clamp(220px,36vw,440px);border-radius:50%;background:radial-gradient(circle,var(--signal-soft) 0%,transparent 72%);filter:blur(6px);pointer-events:none;z-index:0;animation:rf-float 11s ease-in-out infinite;}\n@keyframes rf-float{0%,100%{transform:translate(0,0) scale(1);}50%{transform:translate(-12px,16px) scale(1.04);}}\n\/* TICKER *\/\n.rf-root .ticker{border-top:1px solid var(--paper-line) !important;border-bottom:1px solid var(--paper-line) !important;background:var(--paper-dim) !important;overflow:hidden;white-space:nowrap;}\n.rf-root .ticker__track{display:inline-flex;animation:rf-ticker 30s linear infinite;font-family:var(--f-mono) !important;font-size:.82rem !important;letter-spacing:.16em !important;text-transform:uppercase !important;padding-block:.72rem;color:var(--ink-soft) !important;}\n.rf-root .ticker__track span{padding-inline:1.4rem;}\n.rf-root .ticker__track span::after{content:\"\/\/\" !important;margin-left:1.4rem;color:var(--signal) !important;}\n@keyframes rf-ticker{from{transform:translateX(0);}to{transform:translateX(-50%);}}\n\/* TICKET *\/\n.rf-root .ticket{background:var(--paper-dim) !important;border:1px solid var(--paper-line) !important;border-left:3px solid var(--signal) !important;border-radius:var(--radius) !important;position:relative;padding:clamp(1.4rem,3vw,2.1rem);box-shadow:0 24px 60px -38px rgba(0,0,0,.7);}\n.rf-root .ticket--ink{background:var(--ink) !important;color:var(--paper) !important;border-left-color:var(--paper) !important;}\n.rf-root .ticket__head{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;font-family:var(--f-mono) !important;font-size:.73rem !important;letter-spacing:.13em !important;text-transform:uppercase !important;color:var(--ink-soft) !important;margin-bottom:1.1rem;padding-bottom:.9rem;border-bottom:1px solid var(--paper-line) !important;}\n.rf-root .ticket--ink .ticket__head{border-bottom-color:var(--line-on-card) !important;color:var(--ink-soft-on-card) !important;}\n.rf-root .stamp{display:inline-flex;align-items:center;justify-content:center;width:88px;height:88px;border-radius:50% !important;border:2px solid var(--signal) !important;color:var(--signal) !important;font-family:var(--f-mono) !important;text-transform:uppercase !important;font-size:.68rem !important;font-weight:700 !important;line-height:1.2;text-align:center;flex-shrink:0;animation:rf-breathe 4s ease-in-out infinite;}\n@keyframes rf-breathe{0%,100%{transform:scale(1);}50%{transform:scale(1.045);}}\n.rf-root .section--ink .stamp{border-color:var(--ink) !important;color:var(--ink) !important;}\n\/* WORK ORDER *\/\n.rf-root .work-order{border:1px solid var(--paper-line) !important;border-radius:var(--radius) !important;padding:1.75rem;display:flex;flex-direction:column;gap:.85rem;background:var(--paper-dim) !important;transition:transform .3s var(--ease),box-shadow .3s var(--ease),border-color .3s var(--ease);position:relative;overflow:hidden;}\n.rf-root .work-order::before{content:\"\" !important;position:absolute !important;inset:0 !important;background:linear-gradient(115deg,transparent 40%,rgba(255,255,255,.034) 50%,transparent 60%) !important;transform:translateX(-100%) !important;transition:transform .55s var(--ease) !important;pointer-events:none !important;z-index:0 !important;}\n.rf-root .work-order:hover::before{transform:translateX(100%) !important;}\n.rf-root .work-order>*{position:relative;z-index:1;}\n.rf-root .work-order:hover{transform:translateY(-4px);border-color:var(--signal) !important;box-shadow:0 22px 55px -26px var(--signal-soft) !important;}\n.rf-root .work-order__index{font-family:var(--f-mono) !important;font-size:.76rem !important;letter-spacing:.18em !important;color:var(--signal) !important;font-weight:700 !important;}\n.rf-root .work-order__title{font-size:1.4rem !important;}\n.rf-root .work-order__meta{margin-top:auto;display:flex;justify-content:space-between;align-items:baseline;font-family:var(--f-mono) !important;font-size:.76rem !important;letter-spacing:.06em !important;text-transform:uppercase !important;color:var(--ink-soft) !important;border-top:1px solid var(--paper-line) !important;padding-top:.85rem;}\n.rf-root .work-order__meta a{color:var(--signal) !important;}\n\/* REVEAL *\/\n.rf-root .reveal{opacity:0;transform:translateY(24px);transition:opacity .65s var(--ease),transform .65s var(--ease);}\n.rf-root .reveal.is-visible{opacity:1;transform:translateY(0);}\n\/* FOOTER *\/\n.rf-root .footer{background:var(--paper-dim) !important;border-top:1px solid var(--paper-line) !important;padding-block:clamp(2.5rem,5vw,4rem) 1.75rem;}\n.rf-root .footer__grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:clamp(1.4rem,3.5vw,2.75rem);}\n@media(max-width:860px){.rf-root .footer__grid{grid-template-columns:1fr 1fr;}}\n@media(max-width:540px){.rf-root .footer__grid{grid-template-columns:1fr;}}\n.rf-root .footer h4{font-family:var(--f-mono) !important;font-size:.76rem !important;letter-spacing:.18em !important;text-transform:uppercase !important;color:var(--signal) !important;margin-bottom:.9rem !important;font-weight:700 !important;}\n.rf-root .footer ul{display:flex;flex-direction:column;gap:.55rem;font-size:.92rem;color:var(--ink-soft) !important;}\n.rf-root .footer__base{margin-top:2.5rem;padding-top:1.25rem;border-top:1px solid var(--paper-line) !important;display:flex;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-family:var(--f-mono) !important;font-size:.72rem !important;letter-spacing:.1em !important;text-transform:uppercase !important;color:var(--ink-soft) !important;align-items:center;}\n.rf-root .footer__grid>div:first-child{text-align:center !important;}\n.rf-root .footer__grid>div:first-child p{margin-left:auto !important;margin-right:auto !important;}\n\/* TAG \/ MISC *\/\n.rf-root .tag{display:inline-flex;align-items:center;font-family:var(--f-mono) !important;font-size:.72rem !important;letter-spacing:.13em !important;text-transform:uppercase !important;border:1px solid var(--paper-line) !important;border-radius:999px !important;padding:.38rem .95rem;color:var(--ink-soft) !important;}\n.rf-root .mt-2{margin-top:2rem;}\n.rf-root .mt-3{margin-top:3rem;}\n.rf-root .mb-1{margin-bottom:1rem;}\n\/* WHATSAPP FAB *\/\n.rf-root .whatsapp-fab{position:fixed;bottom:1.5rem;right:1.5rem;z-index:90;width:62px;height:62px;border-radius:50% !important;background:#25D366 !important;color:#fff !important;display:flex;align-items:center;justify-content:center;padding:0 !important;box-shadow:0 8px 24px rgba(0,0,0,.28) !important;animation:rf-breathe 4s ease-in-out infinite;transition:transform .3s var(--ease);}\n.rf-root .whatsapp-fab:hover{transform:scale(1.1);}\n.rf-root .whatsapp-fab svg{width:32px;height:32px;display:block !important;}\n\/* COTIZADOR *\/\n.rf-root .cotizador{border:1px solid var(--paper-line) !important;border-radius:var(--radius) !important;background:var(--paper-dim) !important;overflow:hidden;box-shadow:0 36px 90px -46px rgba(0,0,0,.8);}\n.rf-root .cotizador__progress{padding:1.1rem clamp(1.25rem,3vw,2.1rem) .9rem;border-bottom:1px solid var(--paper-line) !important;background:var(--paper) !important;}\n.rf-root .cotizador__progress-label{font-family:var(--f-mono) !important;font-size:.72rem !important;letter-spacing:.16em !important;text-transform:uppercase !important;margin-bottom:.65rem;display:flex;justify-content:space-between;color:var(--ink-soft) !important;}\n.rf-root .cotizador__progress-track{height:4px;background:var(--paper-line) !important;border-radius:2px;overflow:hidden;}\n.rf-root .cotizador__progress-fill{height:100%;width:0%;background:var(--signal) !important;box-shadow:0 0 8px var(--signal-soft) !important;transition:width .4s var(--ease);}\n.rf-root .cotizador__body{padding:clamp(1.4rem,4vw,2.5rem);min-height:360px;}\n.rf-root .cotizador__step{display:none;}\n.rf-root .cotizador__step.is-active{display:block;animation:rf-stepIn .4s var(--ease);}\n@keyframes rf-stepIn{from{opacity:0;transform:translateX(14px);}to{opacity:1;transform:translateX(0);}}\n.rf-root .cotizador__step h3{margin-bottom:.35rem !important;}\n.rf-root .cotizador__step .step-hint{color:var(--ink-soft) !important;margin-bottom:1.4rem;font-size:.93rem;}\n.rf-root .step-note{background:var(--signal-soft);border:1px solid rgba(255,90,80,.35);border-radius:10px;padding:.7rem 1rem;font-size:.85rem;color:var(--ink);margin-top:.75rem;}\n.rf-root .chip-grid{display:flex;flex-wrap:wrap;gap:.7rem;}\n.rf-root .chip{border:1px solid var(--paper-line) !important;border-radius:var(--radius) !important;padding:.82rem 1.25rem;font-family:var(--f-mono) !important;font-size:.86rem !important;background:var(--paper) !important;color:var(--ink) !important;transition:all .22s var(--ease);}\n.rf-root .chip--lg{font-size:.92rem !important;padding:.95rem 1.45rem;}\n.rf-root .chip:hover{border-color:var(--signal) !important;color:var(--signal) !important;}\n.rf-root .chip.is-active{background:var(--signal) !important;border-color:var(--signal) !important;color:var(--ink) !important;box-shadow:0 4px 14px var(--signal-soft) !important;}\n.rf-root .option-list{display:flex;flex-direction:column;gap:.7rem;}\n.rf-root .option-card{border:1px solid var(--paper-line) !important;border-radius:var(--radius) !important;padding:1.05rem 1.35rem;text-align:left;background:var(--paper) !important;color:var(--ink) !important;font-size:1rem !important;transition:all .22s var(--ease);display:flex;align-items:center;justify-content:space-between;gap:1rem;}\n.rf-root .option-card::after{content:\"\u2192\" !important;font-family:var(--f-mono) !important;opacity:0;transform:translateX(-6px);transition:all .22s var(--ease);color:var(--signal) !important;}\n.rf-root .option-card:hover{border-color:var(--signal) !important;transform:translateX(3px);}\n.rf-root .option-card:hover::after{opacity:1;transform:translateX(0);}\n.rf-root .option-card.is-active{background:var(--signal) !important;color:var(--ink) !important;border-color:var(--signal) !important;box-shadow:0 4px 14px var(--signal-soft) !important;}\n.rf-root .option-card.is-active::after{color:var(--ink) !important;}\n.rf-root .cotizador__footer{display:flex;justify-content:space-between;align-items:center;padding:1rem clamp(1.25rem,3vw,2.1rem) 1.35rem;border-top:1px solid var(--paper-line) !important;}\n.rf-root .cotizador__link{font-family:var(--f-mono) !important;font-size:.78rem !important;letter-spacing:.1em !important;text-transform:uppercase !important;border-bottom:1px solid var(--paper-line) !important;padding-bottom:2px;color:var(--ink-soft) !important;}\n.rf-root #cotizador-result{display:none;}\n.rf-root #cotizador-result.is-active{display:block;animation:rf-resultIn .55s var(--ease);}\n@keyframes rf-resultIn{from{opacity:0;transform:translateY(16px) scale(.99);}to{opacity:1;transform:translateY(0) scale(1);}}\n.rf-root .result-price{font-family:var(--f-mono) !important;font-weight:700 !important;font-size:clamp(2.4rem,6.5vw,3.8rem) !important;color:var(--signal) !important;text-shadow:0 2px 16px var(--signal-soft) !important;letter-spacing:-.02em !important;line-height:1.05;}\n.rf-root .ticket-row{display:flex;justify-content:space-between;gap:1rem;padding:.6rem 0;border-bottom:1px solid var(--paper-line) !important;font-size:.93rem;}\n.rf-root .ticket--ink .ticket-row{border-bottom-color:var(--line-on-card) !important;}\n.rf-root .ticket-row:last-child{border-bottom:none !important;}\n.rf-root .ticket-row span:first-child{color:var(--ink-soft) !important;font-family:var(--f-mono) !important;font-size:.76rem !important;letter-spacing:.07em !important;text-transform:uppercase !important;}\n.rf-root .ticket-row span:last-child{text-align:right;max-width:62%;}\n.rf-root .ticket--ink .ticket-row span:first-child{color:var(--ink-soft-on-card) !important;}\n.rf-root .result-actions{display:flex;gap:.9rem;flex-wrap:wrap;margin-top:1.75rem;}\n\/* SALE BANNER *\/\n.rf-root .rf-sale-banner{background:var(--signal) !important;padding-block:clamp(2.25rem,5vw,3.75rem);}\n.rf-root .rf-sale-inner{display:grid;grid-template-columns:1fr auto;gap:clamp(2rem,5vw,4rem);align-items:center;}\n@media(max-width:860px){.rf-root .rf-sale-inner{grid-template-columns:1fr;gap:1.75rem;}}\n.rf-root .rf-sale-eyebrow{color:rgba(255,255,255,.75) !important;}\n.rf-root .rf-sale-eyebrow::before{background:rgba(255,255,255,.75) !important;box-shadow:none !important;}\n.rf-root .rf-sale-title{color:#fff !important;font-size:clamp(1.85rem,4.5vw,3.1rem) !important;line-height:1.06 !important;margin:.55rem 0 .9rem !important;}\n.rf-root .rf-sale-lead{color:rgba(255,255,255,.88) !important;font-size:clamp(.95rem,1.55vw,1.15rem) !important;line-height:1.65 !important;max-width:46ch;}\n.rf-root .rf-sale-tags{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1.25rem;}\n.rf-root .rf-sale-tag{background:rgba(0,0,0,.18) !important;color:#fff !important;border:1px solid rgba(255,255,255,.28) !important;border-radius:999px !important;font-family:var(--f-mono) !important;font-size:.7rem !important;font-weight:700 !important;letter-spacing:.1em !important;text-transform:uppercase !important;padding:.35rem .85rem;}\n.rf-root .rf-sale-cta{display:flex;flex-direction:column;gap:.85rem;align-items:flex-start;flex-shrink:0;}\n@media(max-width:860px){.rf-root .rf-sale-cta{flex-direction:row;flex-wrap:wrap;}}\n.rf-root .rf-sale-btn{display:inline-flex;align-items:center;justify-content:center;font-family:var(--f-mono) !important;font-size:.82rem !important;font-weight:800 !important;letter-spacing:.07em !important;text-transform:uppercase !important;padding:.9rem 1.65rem !important;border-radius:var(--radius) !important;white-space:nowrap;transition:all .22s var(--ease);background:#fff !important;color:var(--signal) !important;border:2px solid #fff !important;box-shadow:0 8px 22px rgba(0,0,0,.18) !important;}\n.rf-root .rf-sale-btn:hover{background:var(--paper) !important;color:#fff !important;border-color:var(--paper) !important;transform:translateY(-2px);}\n.rf-root .rf-sale-btn--ghost{background:transparent !important;color:#fff !important;border-color:rgba(255,255,255,.52) !important;box-shadow:none !important;}\n.rf-root .rf-sale-btn--ghost:hover{background:rgba(255,255,255,.14) !important;border-color:#fff !important;}\n\/* CATALOG SECTION on red bg *\/\n.rf-root .rf-catalog-intro h2{line-height:1.1 !important;color:#fff !important;}\n.rf-root #catalogo-venta .work-order{background:rgba(46,49,56,.76) !important;border-color:rgba(255,255,255,.11) !important;border-left-color:rgba(255,255,255,.3) !important;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);}\n.rf-root #catalogo-venta .work-order:hover{border-color:rgba(255,255,255,.48) !important;background:rgba(46,49,56,.93) !important;}\n.rf-root #catalogo-venta .work-order h3{color:#fff !important;}\n.rf-root #catalogo-venta .work-order .work-order__index{color:rgba(255,255,255,.52) !important;}\n.rf-root #catalogo-venta .work-order p{color:rgba(255,255,255,.86) !important;opacity:1 !important;}\n.rf-root #catalogo-venta .work-order .text-muted{color:rgba(255,255,255,.7) !important;}\n.rf-root #catalogo-venta .work-order .work-order__meta{border-top-color:rgba(255,255,255,.13) !important;color:rgba(255,255,255,.7) !important;}\n.rf-root #catalogo-venta .chip{background:rgba(46,49,56,.58) !important;border-color:rgba(255,255,255,.2) !important;color:#fff !important;}\n.rf-root #catalogo-venta .chip:hover{border-color:rgba(255,255,255,.62) !important;background:rgba(46,49,56,.82) !important;color:#fff !important;}\n.rf-root #catalogo-venta .chip.is-active{background:rgba(46,49,56,.94) !important;border-color:#fff !important;color:#fff !important;}\n\/* CATALOG CARD with photo *\/\n.rf-root .cat-card{display:grid;grid-template-columns:1fr 120px;gap:1rem;align-items:start;}\n@media(max-width:500px){.rf-root .cat-card{grid-template-columns:1fr 90px;gap:.75rem;}}\n.rf-root .cat-card__info{display:flex;flex-direction:column;gap:.5rem;}\n.rf-root .cat-card__photo{width:100%;aspect-ratio:1;border-radius:10px;overflow:hidden;background:rgba(46,49,56,.6);flex-shrink:0;display:flex;align-items:center;justify-content:center;}\n.rf-root .cat-card__photo img{width:100%;height:100%;object-fit:cover;}\n.rf-root .cat-card__no-photo{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.4rem;color:rgba(255,255,255,.4);font-size:.7rem;font-family:var(--f-mono);text-transform:uppercase;letter-spacing:.1em;text-align:center;padding:.5rem;}\n.rf-root .cat-card__wa{display:inline-flex;align-items:center;gap:.5rem;margin-top:.65rem;background:#25D366 !important;color:#fff !important;border-radius:8px;padding:.55rem 1rem;font-family:var(--f-mono) !important;font-size:.74rem !important;font-weight:700 !important;letter-spacing:.06em !important;text-transform:uppercase;transition:all .2s;border:none;cursor:pointer;}\n.rf-root .cat-card__wa:hover{background:#1da851 !important;transform:translateY(-1px);}\n\/* ACORDEONES MODELO *\/\n.rf-root #step-modelo #grid-modelo{display:grid !important;gap:.85rem !important;}\n.rf-root #step-modelo .model-accordion{border:1px solid rgba(255,255,255,.13) !important;border-radius:20px !important;background:linear-gradient(135deg,rgba(255,255,255,.07),rgba(255,255,255,.025)) !important;overflow:hidden !important;}\n.rf-root #step-modelo .model-accordion__summary{min-height:72px !important;display:flex !important;align-items:center !important;justify-content:space-between !important;gap:1rem !important;padding:1rem 1.2rem !important;list-style:none !important;cursor:pointer !important;color:var(--ink) !important;font-family:var(--f-display) !important;font-weight:900 !important;font-size:clamp(1.12rem,3.5vw,1.45rem) !important;letter-spacing:-.02em !important;}\n.rf-root #step-modelo .model-accordion__summary::-webkit-details-marker{display:none !important;}\n.rf-root #step-modelo .model-accordion__summary small{font-family:var(--f-mono) !important;font-size:.7rem !important;letter-spacing:.1em !important;text-transform:uppercase !important;color:rgba(255,255,255,.65) !important;font-weight:800 !important;white-space:nowrap !important;}\n.rf-root #step-modelo .model-accordion__summary::after{content:\"Ver\" !important;flex-shrink:0 !important;background:var(--signal) !important;color:var(--ink) !important;border-radius:999px !important;padding:.42rem .68rem !important;font-family:var(--f-mono) !important;font-size:.66rem !important;letter-spacing:.08em !important;text-transform:uppercase !important;}\n.rf-root #step-modelo .model-accordion[open] .model-accordion__summary::after{content:\"Ocultar\" !important;background:var(--ink) !important;color:var(--paper) !important;}\n.rf-root #step-modelo .model-group__items{display:grid !important;grid-template-columns:repeat(2,minmax(0,1fr)) !important;gap:.75rem !important;padding:0 .9rem .9rem !important;}\n@media(max-width:560px){.rf-root #step-modelo .model-group__items{grid-template-columns:1fr !important;}}\n.rf-root #step-modelo .model-chip{min-height:64px !important;border-radius:16px !important;padding:.9rem 1rem !important;font-size:1.02rem !important;background:rgba(46,49,56,.82) !important;border:1px solid rgba(255,255,255,.15) !important;width:100% !important;display:flex !important;align-items:center !important;color:var(--ink) !important;font-family:var(--f-display) !important;font-weight:800 !important;letter-spacing:-.01em !important;}\n.rf-root #step-modelo .model-chip::after{content:\"Elegir\" !important;margin-left:auto !important;color:var(--signal) !important;font-family:var(--f-mono) !important;font-size:.64rem !important;letter-spacing:.1em !important;text-transform:uppercase !important;opacity:.75 !important;}\n.rf-root #step-modelo .model-chip:hover{border-color:var(--signal) !important;transform:translateY(-2px) !important;}\n.rf-root #step-modelo .model-chip.is-active{background:var(--signal) !important;color:var(--ink) !important;border-color:var(--signal) !important;}\n.rf-root #step-modelo .model-chip.is-active::after{color:var(--ink) !important;}\n.rf-root .badge-nuevo{display:inline-flex;align-items:center;background:var(--signal);color:var(--ink);font-family:var(--f-mono) !important;font-size:.58rem !important;font-weight:800 !important;letter-spacing:.1em !important;text-transform:uppercase !important;padding:.18rem .48rem;border-radius:999px;margin-left:.45rem;vertical-align:middle;}\n\/* QUICK QUOTE *\/\n.rf-root .rf-quick-quote{min-height:clamp(155px,24vw,240px) !important;display:flex !important;align-items:center !important;justify-content:center !important;border:1px solid var(--paper-line) !important;border-radius:26px !important;background:radial-gradient(circle at 30% 20%,rgba(255,90,80,.2),transparent 42%),linear-gradient(135deg,rgba(255,255,255,.055),rgba(255,255,255,.018)) !important;box-shadow:0 24px 65px -42px rgba(0,0,0,.85) !important;padding:clamp(1.5rem,4vw,2.25rem) !important;}\n.rf-root .btn--quick{background:var(--ink) !important;color:var(--paper) !important;border-color:var(--ink) !important;border-radius:999px !important;font-family:var(--f-display) !important;font-size:clamp(1rem,1.9vw,1.28rem) !important;font-weight:800 !important;letter-spacing:.015em !important;padding:1.1rem 2.1rem !important;min-width:min(100%,280px) !important;box-shadow:0 16px 34px -20px rgba(255,255,255,.55),0 12px 26px -16px rgba(0,0,0,.72) !important;}\n.rf-root .btn--quick:hover{background:var(--signal) !important;color:var(--ink) !important;border-color:var(--signal) !important;}\n\/* SERVICIOS *\/\n.rf-root .rf-servicios-heading{text-align:center !important;margin-bottom:clamp(1.75rem,3.5vw,2.75rem) !important;}\n.rf-root .rf-servicios-heading .eyebrow{justify-content:center !important;}\n.rf-root .rf-servicios-heading h2{margin-top:.55rem !important;}\n\/* visibility fixes *\/\n.rf-root .hero .lead,.rf-root .hero .text-muted,.rf-root .section:not(.section--ink) .lead,.rf-root .section:not(.section--ink) .text-muted,.rf-root .section--dim .lead,.rf-root .section--dim .text-muted{color:rgba(247,247,248,.85) !important;}\n.rf-root .ticket--ink h1,.rf-root .ticket--ink h2,.rf-root .ticket--ink h3,.rf-root .ticket--ink h4{color:var(--paper) !important;}\n.rf-root .ticket--ink .text-muted,.rf-root .ticket--ink .lead{color:rgba(46,49,56,.7) !important;}\n.rf-root .section--ink h1,.rf-root .section--ink h2,.rf-root .section--ink h3,.rf-root .section--ink h4{color:var(--ink) !important;}\n.rf-root .section--ink .lead,.rf-root .section--ink .text-muted{color:rgba(255,255,255,.92) !important;opacity:1 !important;}\n.rf-root #servicios .work-order p,.rf-root #servicios .work-order .text-muted,.rf-root #servicios .work-order .text-mono{color:rgba(255,255,255,.9) !important;opacity:1 !important;}\n.rf-root #servicios .work-order__meta,.rf-root #servicios .work-order__meta span,.rf-root #servicios .work-order__meta a{color:rgba(255,255,255,.92) !important;opacity:1 !important;font-weight:800 !important;}\n.rf-root #servicios .work-order__meta a{color:var(--signal) !important;}\n.rf-root #contacto .work-order p,.rf-root #contacto .work-order .text-muted{color:rgba(255,255,255,.9) !important;opacity:1 !important;}\n.rf-root #contacto .work-order__meta,.rf-root #contacto .work-order__meta span,.rf-root #contacto .work-order__meta a{color:rgba(255,255,255,.94) !important;opacity:1 !important;font-weight:800 !important;}\n.rf-root #contacto .work-order__meta a{color:var(--signal) !important;}\n\/* REPAIR QUOTER *\/\n.rf-root #repair-widget .option-card{flex-wrap:wrap;}\n.rf-root #repair-widget .option-card>span:first-child{flex:1;}\n.rf-root #repair-widget .option-card.is-active::after{display:none;}\n\/* ADMIN STYLES *\/\n:root{--a-bg:#1A1D24;--a-card:#22262F;--a-card2:#2A2F3A;--a-border:rgba(255,255,255,.08);--a-ink:#F0F0F2;--a-muted:rgba(240,240,242,.52);--a-signal:#FF5A50;--a-signal-soft:rgba(255,90,80,.15);--a-green:#22C55E;--a-green-soft:rgba(34,197,94,.14);--a-ease:cubic-bezier(.33,.1,.2,1);--a-radius:13px;}\n\/* LOGIN *\/\n#rfa-login-modal{position:fixed;inset:0;z-index:99999;display:flex;align-items:flex-end;justify-content:center;}\n@media(min-width:520px){#rfa-login-modal{align-items:center;}}\n.rfa-backdrop-login{position:absolute;inset:0;background:rgba(0,0,0,.7);backdrop-filter:blur(7px);-webkit-backdrop-filter:blur(7px);}\n.rfa-login-box{position:relative;z-index:1;background:var(--a-card);border:1px solid var(--a-border);border-radius:20px 20px 0 0;padding:2rem 1.65rem 2.5rem;width:100%;max-width:440px;display:flex;flex-direction:column;gap:.82rem;animation:rfa-slide-up .3s var(--a-ease);}\n@media(min-width:520px){.rfa-login-box{border-radius:20px;padding:2.1rem 1.85rem;}}\n@keyframes rfa-slide-up{from{transform:translateY(55px);opacity:0;}to{transform:translateY(0);opacity:1;}}\n.rfa-logo{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:1.5rem;color:var(--a-ink);letter-spacing:-.01em;text-align:center;}\n.rfa-logo span{color:var(--a-signal);}\n.rfa-login-sub{color:var(--a-muted);font-size:.8rem;text-align:center;margin-bottom:.2rem;}\n.rfa-field{display:flex;flex-direction:column;gap:.4rem;margin-bottom:.15rem;}\n.rfa-field label{font-size:.72rem;font-weight:700;color:var(--a-muted);text-transform:uppercase;letter-spacing:.1em;}\n.rfa-field input,.rfa-field select,.rfa-field textarea{background:var(--a-card2);border:1px solid var(--a-border);border-radius:9px;padding:.7rem .95rem;color:var(--a-ink);font-family:inherit;font-size:.97rem;outline:none;transition:border-color .18s;width:100%;box-sizing:border-box;-webkit-appearance:none;}\n.rfa-field input:focus,.rfa-field select:focus,.rfa-field textarea:focus{border-color:var(--a-signal);}\n.rfa-field input::placeholder,.rfa-field textarea::placeholder{color:var(--a-muted);}\n.rfa-field textarea{resize:vertical;min-height:80px;}\n.rfa-btn{display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:.88rem;font-weight:700;padding:.82rem 1.45rem;border-radius:9px;border:2px solid transparent;cursor:pointer;transition:all .18s;white-space:nowrap;-webkit-tap-highlight-color:transparent;}\n.rfa-btn--primary{background:var(--a-signal);color:#fff;border-color:var(--a-signal);}\n.rfa-btn--primary:active,.rfa-btn--primary:hover{background:#d9453c;border-color:#d9453c;}\n.rfa-btn--ghost{background:transparent;color:var(--a-ink);border-color:var(--a-border);}\n.rfa-btn--ghost:hover{background:var(--a-card2);border-color:rgba(255,255,255,.18);}\n.rfa-btn--danger{background:#e53e3e;color:#fff;border-color:#e53e3e;}\n.rfa-btn--sm{padding:.52rem 1rem;font-size:.78rem;}\n.rfa-err{color:#fc8181;font-size:.8rem;font-weight:600;}\n.rfa-success-msg{color:var(--a-green);font-size:.8rem;font-weight:600;}\n\/* DRAWER *\/\n#rfa-drawer{position:fixed;inset:0;z-index:99999;display:flex;align-items:flex-end;}\n.rfa-backdrop-drawer{position:absolute;inset:0;background:rgba(0,0,0,.68);backdrop-filter:blur(7px);-webkit-backdrop-filter:blur(7px);}\n.rfa-drawer-panel{position:relative;z-index:1;background:var(--a-bg);width:100%;max-width:640px;margin-inline:auto;height:94dvh;max-height:94dvh;border-radius:20px 20px 0 0;display:flex;flex-direction:column;overflow:hidden;animation:rfa-slide-up .3s var(--a-ease);}\n.rfa-drawer-header{display:flex;align-items:center;justify-content:space-between;padding:.9rem 1.2rem .75rem;border-bottom:1px solid var(--a-border);flex-shrink:0;}\n.rfa-drawer-title{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:1.05rem;color:var(--a-ink);}\n.rfa-drawer-seller{font-size:.72rem;color:var(--a-muted);margin-top:.1rem;}\n.rfa-icon-btn{width:34px;height:34px;border-radius:8px;background:transparent;border:none;color:var(--a-muted);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .15s;-webkit-tap-highlight-color:transparent;}\n.rfa-icon-btn:active{background:var(--a-card2);color:var(--a-ink);}\n.rfa-sync-dot{width:8px;height:8px;border-radius:50%;background:var(--a-muted);transition:background .3s;}\n.rfa-sync-dot.ok{background:var(--a-green);}\n.rfa-sync-dot.err{background:#fc8181;}\n.rfa-sync-dot.loading{background:#fbbf24;animation:rfa-pulse-dot 1s infinite;}\n@keyframes rfa-pulse-dot{0%,100%{opacity:1;}50%{opacity:.3;}}\n.rfa-tabs-bar{display:flex;border-bottom:1px solid var(--a-border);flex-shrink:0;overflow-x:auto;scrollbar-width:none;}\n.rfa-tabs-bar::-webkit-scrollbar{display:none;}\n.rfa-tab-btn{flex:1;min-width:80px;padding:.7rem .45rem;background:transparent;border:none;color:var(--a-muted);font-family:inherit;font-size:.78rem;font-weight:700;cursor:pointer;border-bottom:2px solid transparent;transition:all .16s;white-space:nowrap;-webkit-tap-highlight-color:transparent;}\n.rfa-tab-btn.is-active{color:var(--a-signal);border-bottom-color:var(--a-signal);}\n.rfa-drawer-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;}\n.rfa-panel{display:none;padding:1.15rem;}\n.rfa-panel.is-active{display:block;}\n.rfa-panel-title{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:1.15rem;color:var(--a-ink);margin:0 0 1.1rem;}\n.rfa-panel-toolbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem;margin-bottom:.9rem;}\n.rfa-count{font-size:.78rem;color:var(--a-muted);}\n.rfa-select{background:var(--a-card2);border:1px solid var(--a-border);border-radius:8px;color:var(--a-ink);font-family:inherit;font-size:.8rem;padding:.46rem .72rem;cursor:pointer;outline:none;-webkit-appearance:none;}\n\/* SEARCH *\/\n.rfa-search-wrap{position:relative;margin-bottom:.9rem;}\n.rfa-search-wrap input{background:var(--a-card2);border:1px solid var(--a-border);border-radius:9px;padding:.68rem .95rem .68rem 2.4rem;color:var(--a-ink);font-family:inherit;font-size:.9rem;outline:none;width:100%;box-sizing:border-box;}\n.rfa-search-wrap input:focus{border-color:var(--a-signal);}\n.rfa-search-icon{position:absolute;left:.72rem;top:50%;transform:translateY(-50%);color:var(--a-muted);pointer-events:none;}\n\/* INV ITEM *\/\n.rfa-inv-item{background:var(--a-card);border:1px solid var(--a-border);border-radius:11px;margin-bottom:.7rem;overflow:hidden;animation:rfa-fade-in .22s var(--a-ease);}\n@keyframes rfa-fade-in{from{opacity:0;transform:translateY(5px);}to{opacity:1;transform:translateY(0);}}\n.rfa-inv-item.is-sold{opacity:.52;}\n.rfa-inv-item.is-apartado{border-color:rgba(251,191,36,.35);}\n.rfa-inv-item.is-pendiente{border-color:rgba(147,197,253,.35);}\n.rfa-inv-item-body{display:flex;gap:.7rem;padding:.85rem;align-items:flex-start;}\n.rfa-inv-thumb{width:62px;height:62px;border-radius:8px;flex-shrink:0;background:var(--a-card2);overflow:hidden;display:flex;align-items:center;justify-content:center;color:var(--a-muted);}\n.rfa-inv-thumb img{width:100%;height:100%;object-fit:cover;}\n.rfa-inv-info{flex:1;min-width:0;}\n.rfa-inv-model{font-weight:700;color:var(--a-ink);font-size:.92rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\n.rfa-inv-sub{font-size:.73rem;color:var(--a-muted);margin-top:.14rem;font-family:'JetBrains Mono',monospace;}\n.rfa-inv-det{font-size:.76rem;color:rgba(240,240,242,.68);margin-top:.18rem;}\n.rfa-inv-price-row{display:flex;align-items:center;gap:.75rem;margin-top:.32rem;flex-wrap:wrap;}\n.rfa-inv-price{font-family:'JetBrains Mono',monospace;font-weight:700;font-size:.96rem;color:var(--a-signal);}\n.rfa-inv-cost{font-family:'JetBrains Mono',monospace;font-size:.76rem;color:var(--a-muted);}\n.rfa-inv-margin{font-family:'JetBrains Mono',monospace;font-size:.76rem;color:var(--a-green);}\n.rfa-status-badge{font-size:.62rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;padding:.18rem .52rem;border-radius:999px;flex-shrink:0;}\n.rfa-status-badge.disponible{background:rgba(34,197,94,.18);color:var(--a-green);}\n.rfa-status-badge.vendido{background:rgba(252,129,129,.18);color:#fc8181;}\n.rfa-status-badge.apartado{background:rgba(251,191,36,.18);color:#fbbf24;}\n.rfa-status-badge.pendiente{background:rgba(147,197,253,.18);color:#93c5fd;}\n.rfa-inv-actions{display:flex;border-top:1px solid var(--a-border);}\n.rfa-inv-action{flex:1;padding:.55rem;background:transparent;border:none;border-right:1px solid var(--a-border);color:var(--a-muted);font-family:inherit;font-size:.72rem;font-weight:700;cursor:pointer;transition:all .14s;-webkit-tap-highlight-color:transparent;text-align:center;}\n.rfa-inv-action:last-child{border-right:none;}\n.rfa-inv-action:active{background:var(--a-card2);}\n.rfa-inv-action.sell{color:var(--a-green);}\n.rfa-inv-action.del{color:#fc8181;}\n.rfa-inv-last-sale{font-size:.7rem;color:var(--a-muted);padding:.4rem .85rem .55rem;border-top:1px solid var(--a-border);}\n\/* FORM *\/\n.rfa-form-row{display:grid;grid-template-columns:1fr 1fr;gap:.7rem;}\n.rfa-form-actions{display:flex;gap:.7rem;flex-wrap:wrap;margin-top:1.1rem;}\n\/* PHOTO *\/\n.rfa-photo-area{border:2px dashed var(--a-border);border-radius:10px;cursor:pointer;overflow:hidden;-webkit-tap-highlight-color:transparent;transition:border-color .18s;}\n.rfa-photo-area:hover{border-color:var(--a-signal);}\n.rfa-photo-placeholder{min-height:110px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;color:var(--a-muted);font-size:.82rem;padding:.9rem;}\n.rfa-photo-placeholder img{max-height:150px;border-radius:8px;}\n\/* STATS COUNTER *\/\n.rfa-counters{display:grid;grid-template-columns:repeat(4,1fr);gap:.6rem;margin-bottom:1rem;}\n.rfa-counter-card{background:var(--a-card);border:1px solid var(--a-border);border-radius:10px;padding:.75rem .9rem;text-align:center;}\n.rfa-counter-val{font-family:'JetBrains Mono',monospace;font-weight:700;font-size:1.4rem;color:var(--a-ink);}\n.rfa-counter-lbl{font-size:.66rem;color:var(--a-muted);text-transform:uppercase;letter-spacing:.1em;margin-top:.18rem;}\n\/* VENTAS *\/\n.rfa-sale-item{background:var(--a-card);border:1px solid var(--a-border);border-radius:10px;padding:.85rem;margin-bottom:.6rem;}\n.rfa-sale-item.is-anulada{opacity:.5;border-color:rgba(252,129,129,.25);}\n.rfa-sale-top{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem;flex-wrap:wrap;}\n.rfa-sale-model{font-weight:700;color:var(--a-ink);font-size:.88rem;}\n.rfa-sale-price{font-family:'JetBrains Mono',monospace;font-weight:800;color:var(--a-green);font-size:.96rem;white-space:nowrap;}\n.rfa-sale-price.is-anulada{color:#fc8181;text-decoration:line-through;}\n.rfa-sale-meta{font-size:.72rem;color:var(--a-muted);margin-top:.28rem;display:flex;flex-wrap:wrap;gap:.4rem .9rem;}\n.rfa-sale-margin{font-family:'JetBrains Mono',monospace;font-size:.72rem;color:var(--a-green);}\n.rfa-sale-actions{display:flex;gap:.5rem;margin-top:.65rem;padding-top:.6rem;border-top:1px solid var(--a-border);}\n.rfa-ventas-summary{background:var(--a-card);border:1px solid var(--a-border);border-radius:10px;padding:.9rem 1rem;margin-bottom:1rem;display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem;}\n@media(min-width:440px){.rfa-ventas-summary{grid-template-columns:repeat(4,1fr);}}\n.rfa-summary-item{text-align:center;}\n.rfa-summary-val{font-family:'JetBrains Mono',monospace;font-weight:700;font-size:.95rem;color:var(--a-ink);}\n.rfa-summary-lbl{font-size:.65rem;color:var(--a-muted);text-transform:uppercase;letter-spacing:.09em;}\n\/* EXPORT CARDS *\/\n.rfa-export-card{background:var(--a-card);border:1px solid var(--a-border);border-radius:var(--a-radius);padding:1.25rem;display:flex;flex-direction:column;gap:.7rem;margin-bottom:.9rem;}\n.rfa-export-card h4{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:.98rem;color:var(--a-ink);margin:0;}\n.rfa-export-card p{font-size:.82rem;color:var(--a-muted);line-height:1.55;}\n.rfa-stat-row{display:flex;justify-content:space-between;padding:.46rem 0;border-bottom:1px solid var(--a-border);font-size:.83rem;color:var(--a-ink);}\n.rfa-stat-row:last-child{border-bottom:none;}\n.rfa-stat-val{font-weight:700;color:var(--a-signal);font-family:'JetBrains Mono',monospace;}\n\/* MODAL *\/\n.rfa-modal{position:fixed;inset:0;z-index:100001;display:flex;align-items:flex-end;justify-content:center;}\n@media(min-width:520px){.rfa-modal{align-items:center;}}\n.rfa-modal-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.65);backdrop-filter:blur(4px);}\n.rfa-modal-box{position:relative;z-index:1;background:var(--a-card);border:1px solid var(--a-border);border-radius:18px 18px 0 0;padding:1.5rem 1.5rem 2rem;width:100%;max-width:440px;animation:rfa-slide-up .25s var(--a-ease);}\n@media(min-width:520px){.rfa-modal-box{border-radius:18px;padding:1.65rem;}}\n.rfa-modal-box h3{font-family:'Space Grotesk',sans-serif;font-weight:800;font-size:1.1rem;color:var(--a-ink);margin:0 0 .45rem;}\n.rfa-modal-box p{color:var(--a-muted);font-size:.86rem;margin:0 0 1rem;}\n.rfa-modal-actions{display:flex;gap:.7rem;margin-top:1rem;flex-wrap:wrap;}\n\/* TOAST *\/\n#rfa-toast{position:fixed;bottom:5rem;left:50%;transform:translateX(-50%) translateY(20px);background:var(--a-card);border:1px solid var(--a-border);border-radius:10px;padding:.65rem 1.2rem;font-size:.84rem;color:var(--a-ink);font-family:'Inter',sans-serif;box-shadow:0 12px 30px rgba(0,0,0,.4);z-index:200000;opacity:0;transition:all .3s;pointer-events:none;white-space:nowrap;}\n#rfa-toast.show{opacity:1;transform:translateX(-50%) translateY(0);}\n#rfa-toast.ok{border-color:var(--a-green);color:var(--a-green);}\n#rfa-toast.err{border-color:#fc8181;color:#fc8181;}\n\/* scrollbar *\/\n.rfa-drawer-body::-webkit-scrollbar{width:4px;}\n.rfa-drawer-body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.1);border-radius:2px;}\n<\/style>\n\n<div class=\"rf-root\">\n\n<header class=\"nav\">\n  <div class=\"container\">\n    <a href=\"#inicio\" class=\"nav__brand\">ROLLING<span>\u00b7<\/span>FIX<\/a>\n    <nav class=\"nav__links\" aria-label=\"Men\u00fa principal\">\n      <a href=\"#inicio\" data-page=\"inicio\">Inicio<\/a>\n      <a href=\"#servicios\" data-page=\"servicios\">Servicios<\/a>\n      <a href=\"#cotizador\" data-page=\"cotizador\">Cotizar<\/a>\n      <a href=\"#ubicacion\" data-page=\"ubicacion\">Ubicaci\u00f3n<\/a>\n      <a href=\"https:\/\/wa.me\/528122082318?text=Hola%2C%20podr%C3%ADas%20darme%20m%C3%A1s%20informaci%C3%B3n\" class=\"nav__wa\" target=\"_blank\" rel=\"noopener\">Contactar<\/a>\n    <\/nav>\n    <div class=\"nav__cta\">\n      <a href=\"https:\/\/wa.me\/528122082318?text=Hola%2C%20podr%C3%ADas%20darme%20m%C3%A1s%20informaci%C3%B3n\" target=\"_blank\" rel=\"noopener\" class=\"btn btn--primary\">Contactar<\/a>\n    <\/div>\n  <\/div>\n<\/header>\n\n<main>\n\n<!-- ===================== INICIO ===================== -->\n<div id=\"inicio\">\n  <section class=\"hero container\">\n    <div class=\"scan-line\" aria-hidden=\"true\"><\/div>\n    <div class=\"hero__top\">\n      <div class=\"reveal\">\n        <span class=\"eyebrow eyebrow--no-dot\">Plaza Tec \u00b7 Av. del Estado 215A \u00b7 Col. Tecnol\u00f3gico<\/span>\n        <h1 class=\"hero__title\">Aqu\u00ed tu equipo<br>vuelve a <em>rodar<\/em><\/h1>\n        <p class=\"lead\">Reparaci\u00f3n express de iPhone, Android, iPad y Apple Watch. Equipos Apple en venta. Y si ya no lo usas, te lo compramos al instante.<\/p>\n        <div class=\"row mt-2\">\n          <a href=\"https:\/\/wa.me\/528122082318?text=Hola%2C%20podr%C3%ADas%20darme%20m%C3%A1s%20informaci%C3%B3n\" target=\"_blank\" rel=\"noopener\" class=\"btn btn--primary\">Contactar<\/a>\n          <a href=\"#servicios\" class=\"btn\">Ver servicios<\/a>\n        <\/div>\n      <\/div>\n      <div class=\"rf-quick-quote reveal\" style=\"--i:1\">\n        <a href=\"#cotizador\" class=\"btn btn--quick\">Cotizar mi equipo<\/a>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"rf-sale-banner section--ink\">\n    <div class=\"container\">\n      <div class=\"rf-sale-inner reveal\">\n        <div class=\"rf-sale-copy\">\n          <span class=\"eyebrow rf-sale-eyebrow\">Equipos disponibles ahora<\/span>\n          <h2 class=\"rf-sale-title\">iPhones, Apple Watch<br>&amp; AirPods en venta<\/h2>\n          <p class=\"rf-sale-lead\">Inventario real, verificado, con IMEI. iPhone 11 al 17 Pro Max, Apple Watch y AirPods. Todo listo para salir hoy.<\/p>\n          <div class=\"rf-sale-tags\">\n            <span class=\"rf-sale-tag\">iPhone 11\u201317<\/span>\n            <span class=\"rf-sale-tag\">Apple Watch<\/span>\n            <span class=\"rf-sale-tag\">AirPods<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"rf-sale-cta\">\n          <a href=\"#catalogo-venta\" class=\"rf-sale-btn\">Ver equipos disponibles \u2192<\/a>\n          <a href=\"https:\/\/wa.me\/528122082318?text=Hola%2C%20vi%20el%20cat%C3%A1logo%20y%20me%20interesa%20un%20equipo\" target=\"_blank\" rel=\"noopener\" class=\"rf-sale-btn rf-sale-btn--ghost\">Preguntar por WhatsApp<\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <div class=\"ticker\">\n    <div class=\"ticker__track\">\n      <span>Reparaci\u00f3n express<\/span><span>Garant\u00eda en todo trabajo<\/span><span>Compra y venta Apple<\/span><span>Servicio a domicilio<\/span><span>Plaza Tec \u00b7 Col. Tecnol\u00f3gico<\/span><span>Lun\u2013S\u00e1b \u00b7 11:30\u201319:30<\/span>\n      <span>Reparaci\u00f3n express<\/span><span>Garant\u00eda en todo trabajo<\/span><span>Compra y venta Apple<\/span><span>Servicio a domicilio<\/span><span>Plaza Tec \u00b7 Col. Tecnol\u00f3gico<\/span><span>Lun\u2013S\u00e1b \u00b7 11:30\u201319:30<\/span>\n    <\/div>\n  <\/div>\n\n  <section class=\"section section--dim\" style=\"text-align:center;\">\n    <div class=\"container\">\n      <span class=\"eyebrow reveal\" style=\"justify-content:center;\">Clientes Plaza Tec<\/span>\n      <h2 class=\"mt-2 reveal\" style=\"margin-top:.6rem;\">Lo que dicen<br>de nosotros<\/h2>\n      <div class=\"grid grid-3 mt-3\">\n        <div class=\"ticket reveal\"><div class=\"ticket__head\"><span>Rese\u00f1a<\/span><span class=\"text-mono\">\u2605\u2605\u2605\u2605\u2605<\/span><\/div><p>&#8220;Me arreglaron la pantalla de mi iPhone en menos de una hora, qued\u00f3 perfecta.&#8221;<\/p><p class=\"text-mono text-muted mt-2\" style=\"font-size:.76rem;\">\u2014 Cliente, Tec de Monterrey<\/p><\/div>\n        <div class=\"ticket reveal\"><div class=\"ticket__head\"><span>Rese\u00f1a<\/span><span class=\"text-mono\">\u2605\u2605\u2605\u2605\u2605<\/span><\/div><p>&#8220;Les vend\u00ed mi iPhone viejo, la cotizaci\u00f3n en l\u00ednea fue justo lo que me pagaron.&#8221;<\/p><p class=\"text-mono text-muted mt-2\" style=\"font-size:.76rem;\">\u2014 Cliente, Col. Tecnol\u00f3gico<\/p><\/div>\n        <div class=\"ticket reveal\"><div class=\"ticket__head\"><span>Rese\u00f1a<\/span><span class=\"text-mono\">\u2605\u2605\u2605\u2605\u2605<\/span><\/div><p>&#8220;Buen trato y r\u00e1pido. Fueron honestos sobre lo que val\u00eda la pena reparar.&#8221;<\/p><p class=\"text-mono text-muted mt-2\" style=\"font-size:.76rem;\">\u2014 Cliente, Monterrey<\/p><\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n<\/div>\n\n<!-- ===================== SERVICIOS ===================== -->\n<div id=\"servicios\">\n  <section class=\"hero container\">\n    <div class=\"reveal\">\n      <span class=\"eyebrow\">Cat\u00e1logo de servicios<\/span>\n      <h1 class=\"hero__title mt-2\" style=\"margin-top:.55rem;\">Lo que se rompe,<br>aqu\u00ed se arregla<\/h1>\n      <p class=\"lead\">Diagn\u00f3stico sin costo, reparaci\u00f3n a la vista y garant\u00eda por escrito en pantallas, bater\u00edas y componentes de iPhone, Android, iPad, Apple Watch y tablets.<\/p>\n    <\/div>\n  <\/section>\n\n  <section class=\"section--tight\">\n    <div class=\"container\">\n      <div class=\"rf-servicios-heading reveal\">\n        <span class=\"eyebrow\">Qu\u00e9 hacemos<\/span>\n        <h2>Servicios que ofrecemos<\/h2>\n      <\/div>\n      <div class=\"grid\" style=\"grid-template-columns:repeat(auto-fill,minmax(275px,1fr));gap:.95rem;\">\n        <article class=\"work-order reveal\" style=\"--i:0\">\n          <span class=\"work-order__index\">Servicio 01<\/span>\n          <h3 class=\"work-order__title\">Pantallas y reconstrucci\u00f3n<\/h3>\n          <p class=\"text-muted\">Cambio y reconstrucci\u00f3n de pantalla para iPhone, iPad y Apple Watch. Conservamos Face ID y True Tone cuando el da\u00f1o lo permite. Tambi\u00e9n para Android y tablets.<\/p>\n          <div class=\"divider\" style=\"margin-block:.45rem;\"><\/div>\n          <p class=\"text-mono\" style=\"font-size:.8rem;\">iPhone \u00b7 iPad \u00b7 Apple Watch \u00b7 Android \u00b7 Tablets<\/p>\n          <div class=\"work-order__meta\"><span>Mismo d\u00eda<\/span><span>Garant\u00eda por escrito<\/span><\/div>\n        <\/article>\n        <article class=\"work-order reveal\" style=\"--i:1\">\n          <span class=\"work-order__index\">Servicio 02<\/span>\n          <h3 class=\"work-order__title\">Bater\u00edas y componentes<\/h3>\n          <p class=\"text-muted\">Cambio de bater\u00eda con verificaci\u00f3n de salud. Centro de carga Lightning y USB-C, c\u00e1maras, bocinas, micr\u00f3fonos, botones y flex para celular y tablet.<\/p>\n          <div class=\"divider\" style=\"margin-block:.45rem;\"><\/div>\n          <p class=\"text-mono\" style=\"font-size:.8rem;\">Bater\u00edas \u00b7 Carga \u00b7 C\u00e1maras \u00b7 Bocinas \u00b7 Flex<\/p>\n          <div class=\"work-order__meta\"><span>Diagn\u00f3stico gratis<\/span><span>Garant\u00eda incluida<\/span><\/div>\n        <\/article>\n        <article class=\"work-order reveal\" style=\"--i:2\">\n          <span class=\"work-order__index\">Servicio 03<\/span>\n          <h3 class=\"work-order__title\">Revisi\u00f3n y diagn\u00f3stico<\/h3>\n          <p class=\"text-muted\">\u00bfTu equipo se moj\u00f3, no prende o falla de forma intermitente? Lo revisamos sin costo y te decimos exactamente qu\u00e9 tiene antes de cobrarte nada.<\/p>\n          <div class=\"divider\" style=\"margin-block:.45rem;\"><\/div>\n          <p class=\"text-mono\" style=\"font-size:.8rem;\">Equipos mojados \u00b7 No enciende \u00b7 Fallas intermitentes<\/p>\n          <div class=\"work-order__meta\"><span>Sin costo<\/span><span>Sin compromiso<\/span><\/div>\n        <\/article>\n        <article class=\"work-order reveal\" style=\"--i:3\">\n          <span class=\"work-order__index\">Servicio 04<\/span>\n          <h3 class=\"work-order__title\">Compra y venta de Apple<\/h3>\n          <p class=\"text-muted\">Compramos iPhone, iPad y Apple Watch en cualquier estado. Cotiza en l\u00ednea, te damos un rango de precio al instante y confirmamos el monto en sucursal.<\/p>\n          <div class=\"divider\" style=\"margin-block:.45rem;\"><\/div>\n          <p class=\"text-mono\" style=\"font-size:.8rem;\">iPhone \u00b7 iPad \u00b7 Apple Watch \u00b7 Pago al momento<\/p>\n          <div class=\"work-order__meta\"><span>Cotizaci\u00f3n en l\u00ednea<\/span><span><a href=\"#cotizador\">Cotizar \u2192<\/a><\/span><\/div>\n        <\/article>\n        <article class=\"work-order reveal\" style=\"--i:4\">\n          <span class=\"work-order__index\">Servicio 05<\/span>\n          <h3 class=\"work-order__title\">Servicio a domicilio<\/h3>\n          <p class=\"text-muted\">Para quienes no pueden parar. Vamos a ti dentro de la zona Tecnol\u00f3gico. Agenda por WhatsApp y coordinamos horario.<\/p>\n          <div class=\"divider\" style=\"margin-block:.45rem;\"><\/div>\n          <p class=\"text-mono\" style=\"font-size:.8rem;\">Zona Tecnol\u00f3gico \u00b7 Bajo cita \u00b7 Plaza Tec<\/p>\n          <div class=\"work-order__meta\"><span><a href=\"https:\/\/wa.me\/528122082318?text=Hola%2C%20quiero%20agendar%20una%20reparaci%C3%B3n\" target=\"_blank\" rel=\"noopener\">Agendar \u2192<\/a><\/span><span>WhatsApp<\/span><\/div>\n        <\/article>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"section--tight section--dim\">\n    <div class=\"container text-center reveal\">\n      <span class=\"eyebrow\" style=\"justify-content:center;\">Trabajamos con<\/span>\n      <div class=\"row\" style=\"justify-content:center;margin-top:1.4rem;gap:.68rem;\">\n        <span class=\"tag\">Apple<\/span><span class=\"tag\">Android<\/span><span class=\"tag\">iPad<\/span><span class=\"tag\">Apple Watch<\/span><span class=\"tag\">Tablets<\/span>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- CAT\u00c1LOGO DE VENTA -->\n  <section class=\"section section--ink\" id=\"catalogo-venta\">\n    <div class=\"container\">\n      <div class=\"text-center reveal rf-catalog-intro\" style=\"max-width:620px;margin-inline:auto;\">\n        <span class=\"eyebrow\" style=\"justify-content:center;\">Inventario disponible<\/span>\n        <h2 class=\"mt-2\" style=\"margin-top:.55rem;\">Equipos en venta<br>ahorita<\/h2>\n        <p class=\"lead mt-2\" style=\"margin-inline:auto;color:rgba(255,255,255,.88) !important;\">Inventario real, verificado y listo para salir. Escr\u00edbenos si algo te llama la atenci\u00f3n.<\/p>\n        <button class=\"rf-sale-btn mt-2\" id=\"catalog-toggle\" aria-expanded=\"true\" style=\"gap:.7rem;margin-inline:auto;\">\n          <span id=\"catalog-toggle-label\">Cerrar cat\u00e1logo<\/span>\n          <span id=\"catalog-arrow\" style=\"display:inline-block;transition:transform .35s;transform:rotate(180deg);\">\u2193<\/span>\n        <\/button>\n      <\/div>\n      <div id=\"catalog-body\" style=\"max-height:none;overflow:visible;opacity:1;\">\n        <div style=\"padding-top:2.25rem;\">\n          <div class=\"chip-grid\" style=\"justify-content:center;margin-bottom:1.75rem;\" id=\"catalog-filter\">\n            <button class=\"chip chip--lg is-active\" data-cat=\"todos\">Todos<\/button>\n            <button class=\"chip chip--lg\" data-cat=\"iphone\">iPhone<\/button>\n            <button class=\"chip chip--lg\" data-cat=\"watch\">Apple Watch<\/button>\n            <button class=\"chip chip--lg\" data-cat=\"airpods\">AirPods<\/button>\n          <\/div>\n          <div id=\"catalog-loading\" style=\"text-align:center;color:rgba(255,255,255,.6);padding:2rem;font-size:.88rem;\">Cargando inventario\u2026<\/div>\n          <div class=\"grid\" id=\"catalog-grid\" style=\"grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:.95rem;display:none;\"><\/div>\n          <p id=\"catalog-empty\" style=\"display:none;color:rgba(255,255,255,.65);text-align:center;padding:2rem;font-size:.9rem;\">Sin equipos disponibles en esta categor\u00eda por el momento.<\/p>\n          <p style=\"color:rgba(255,255,255,.65);text-align:center;margin-top:1.75rem;font-size:.82rem;\">Inventario sujeto a disponibilidad. Confirma por WhatsApp antes de venir.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n<\/div>\n\n<!-- ===================== COTIZADOR ===================== -->\n<div id=\"cotizador\">\n  <section class=\"hero container\" style=\"padding-bottom:1.75rem;\">\n    <div class=\"reveal text-center\" style=\"margin-inline:auto;\">\n      <span class=\"eyebrow\" style=\"justify-content:center;\">Vende tu equipo \u00b7 Cotizador<\/span>\n      <h1 class=\"hero__title mt-2\" style=\"margin-top:.55rem;\">\u00bfCu\u00e1nto vale<br>tu iPhone?<\/h1>\n      <p class=\"lead\" style=\"margin-inline:auto;\">Responde las preguntas r\u00e1pidas. Te damos un rango de precio al instante y confirmamos en sucursal.<\/p>\n    <\/div>\n  <\/section>\n\n  <section class=\"section--tight\">\n    <div class=\"container\" style=\"max-width:740px;\">\n      <div class=\"cotizador reveal\" id=\"cotizador-widget\">\n        <div class=\"cotizador__progress\">\n          <div class=\"cotizador__progress-label\"><span id=\"progress-label-current\">Paso 1 \u00b7 Modelo<\/span><span>Vende tu equipo<\/span><\/div>\n          <div class=\"cotizador__progress-track\"><div class=\"cotizador__progress-fill\" id=\"progress-bar\"><\/div><\/div>\n        <\/div>\n        <div class=\"cotizador__body\">\n\n          <div class=\"cotizador__step is-active\" id=\"step-modelo\">\n            <h3>\u00bfQu\u00e9 modelo tienes?<\/h3>\n            <p class=\"step-hint\">Cotizamos modelos de iPhone.<\/p>\n            <div class=\"chip-grid\" id=\"grid-modelo\"><\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-capacidad\">\n            <h3>\u00bfCu\u00e1nto almacenamiento tiene?<\/h3>\n            <p class=\"step-hint\">Ajustes \u2192 General \u2192 Informaci\u00f3n.<\/p>\n            <div class=\"chip-grid\" id=\"grid-capacidad\"><\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-sim\">\n            <h3>\u00bfC\u00f3mo usa el chip tu equipo?<\/h3>\n            <p class=\"step-hint\">Revisa Ajustes \u2192 General \u2192 Informaci\u00f3n \u2192 N\u00famero IMEI.<\/p>\n            <div class=\"option-list\" id=\"grid-sim\"><\/div>\n            <div id=\"sim-esim-note\" class=\"step-note\" style=\"display:none;\">Este modelo es puro eSIM \u2014 no utiliza chip f\u00edsico.<\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-compania\">\n            <h3>\u00bfCon qu\u00e9 compa\u00f1\u00eda est\u00e1 asociado?<\/h3>\n            <p class=\"step-hint\">Un equipo libre siempre vale m\u00e1s.<\/p>\n            <div class=\"option-list\" id=\"grid-compania\"><\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-compania-usa\">\n            <h3>\u00bfDe qu\u00e9 compa\u00f1\u00eda americana es?<\/h3>\n            <p class=\"step-hint\">Esto afecta la compatibilidad con operadoras mexicanas.<\/p>\n            <div class=\"chip-grid\" id=\"grid-compania-usa\"><\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-funcionalidad\">\n            <h3>\u00bfC\u00f3mo funciona tu equipo?<\/h3>\n            <p class=\"step-hint\">S\u00e9 honesto \u2014 esto se confirma en sucursal.<\/p>\n            <div class=\"option-list\" id=\"grid-funcionalidad\"><\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-bateria\">\n            <h3>\u00bfCu\u00e1l es la salud de tu bater\u00eda?<\/h3>\n            <p class=\"step-hint\">Ajustes \u2192 Bater\u00eda \u2192 Salud de la bater\u00eda.<\/p>\n            <div class=\"option-list\" id=\"grid-bateria\"><\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-estado\">\n            <h3>\u00bfC\u00f3mo est\u00e1 la pantalla y la carcasa?<\/h3>\n            <p class=\"step-hint\">Rayones, golpes o grietas visibles.<\/p>\n            <div class=\"option-list\" id=\"grid-estado\"><\/div>\n          <\/div>\n\n          <div class=\"cotizador__step\" id=\"step-accesorios\">\n            <h3>\u00bfConservas los accesorios originales?<\/h3>\n            <p class=\"step-hint\">\u00daltima pregunta.<\/p>\n            <div class=\"option-list\" id=\"grid-accesorios\"><\/div>\n          <\/div>\n\n          <!-- RESULTADO -->\n          <div id=\"cotizador-result\">\n            <div class=\"row row--between\" style=\"align-items:flex-start;flex-wrap:wrap;\">\n              <div><span class=\"eyebrow\">Cotizaci\u00f3n estimada<\/span><h2 style=\"margin-top:.5rem;\">Tu equipo vale<\/h2><\/div>\n              <div class=\"stamp\">Cotizaci\u00f3n<br>v\u00e1lida<\/div>\n            <\/div>\n            <p class=\"result-price mt-2\" id=\"res-precio\">$0 \u2013 $0<\/p>\n            <p class=\"text-muted\" id=\"res-modelo\" style=\"margin-top:.22rem;\"><\/p>\n            <div class=\"mt-3\" id=\"res-resumen\"><\/div>\n            <div class=\"divider mt-2\"><\/div>\n            <div class=\"grid grid-2 mt-2\">\n              <div class=\"ticket-row\"><span>Folio<\/span><span id=\"res-folio\"><\/span><\/div>\n              <div class=\"ticket-row\"><span>Generado<\/span><span id=\"res-fecha\"><\/span><\/div>\n              <div class=\"ticket-row\"><span>V\u00e1lido hasta<\/span><span id=\"res-vence\"><\/span><\/div>\n              <div class=\"ticket-row\"><span>Sucursal<\/span><span>Plaza Tec<\/span><\/div>\n            <\/div>\n            <div class=\"result-actions\">\n              <a href=\"#\" id=\"res-whatsapp\" target=\"_blank\" rel=\"noopener\" class=\"btn btn--primary\">Confirmar por WhatsApp<\/a>\n              <a href=\"#ubicacion\" class=\"btn\">Ver ubicaci\u00f3n<\/a>\n              <button type=\"button\" class=\"btn\" id=\"cotizador-restart\">Cotizar otro equipo<\/button>\n            <\/div>\n          <\/div>\n\n        <\/div>\n        <div class=\"cotizador__footer\" id=\"cotizador-footer\">\n          <button type=\"button\" class=\"cotizador__link\" id=\"cotizador-back\" style=\"visibility:hidden;\">\u2190 Atr\u00e1s<\/button>\n          <span class=\"text-mono text-muted\" style=\"font-size:.76rem;\">Puedes regresar y cambiar tu respuesta<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"section--tight\">\n    <div class=\"container\" style=\"max-width:740px;\">\n      <div class=\"ticket reveal\">\n        <div class=\"ticket__head\"><span>Notas importantes<\/span><span class=\"text-mono\">Leer antes de venir<\/span><\/div>\n        <ul class=\"stack\">\n          <li>Esta cotizaci\u00f3n es un estimado y no representa un compromiso de compra.<\/li>\n          <li>El precio final se confirma con una revisi\u00f3n f\u00edsica del equipo en sucursal (10\u201315 min).<\/li>\n          <li>Necesitas una identificaci\u00f3n oficial vigente para completar la venta.<\/li>\n          <li>La cotizaci\u00f3n tiene una vigencia de 3 d\u00edas a partir de la fecha generada.<\/li>\n        <\/ul>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- COTIZADOR REPARACIONES -->\n  <div class=\"container\" style=\"max-width:740px;padding-block:1.5rem 0;\"><div class=\"divider\"><\/div><\/div>\n\n  <section class=\"section--tight\">\n    <div class=\"container\" style=\"max-width:740px;\">\n      <div class=\"reveal\">\n        <span class=\"eyebrow\">Cotizador \u00b7 Reparaciones<\/span>\n        <h2 class=\"mt-2\" style=\"margin-top:.55rem;\">\u00bfCu\u00e1nto cuesta<br>reparar tu equipo?<\/h2>\n        <p class=\"lead text-muted\">Selecciona tu dispositivo y la reparaci\u00f3n. Los precios son estimados \u2014 el costo exacto se confirma con diagn\u00f3stico en sucursal.<\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <section class=\"section--tight\">\n    <div class=\"container\" style=\"max-width:740px;\">\n      <div class=\"cotizador reveal\" id=\"repair-widget\">\n        <div class=\"cotizador__progress\">\n          <div class=\"cotizador__progress-label\"><span id=\"repair-progress-label\">Paso 1 de 3 \u00b7 Dispositivo<\/span><span>Cotizar reparaci\u00f3n<\/span><\/div>\n          <div class=\"cotizador__progress-track\"><div class=\"cotizador__progress-fill\" id=\"repair-progress-bar\"><\/div><\/div>\n        <\/div>\n        <div class=\"cotizador__body\">\n          <div class=\"cotizador__step is-active\" id=\"rstep-dispositivo\">\n            <h3>\u00bfQu\u00e9 dispositivo necesita reparaci\u00f3n?<\/h3>\n            <p class=\"step-hint\">Selecciona para ver los servicios disponibles.<\/p>\n            <div class=\"chip-grid\" id=\"rgrid-dispositivo\">\n              <button class=\"chip chip--lg\" data-dev=\"iphone\">iPhone<\/button>\n              <button class=\"chip chip--lg\" data-dev=\"android\">Android<\/button>\n              <button class=\"chip chip--lg\" data-dev=\"ipad\">iPad \/ Tablet<\/button>\n              <button class=\"chip chip--lg\" data-dev=\"watch\">Apple Watch<\/button>\n            <\/div>\n          <\/div>\n          <div class=\"cotizador__step\" id=\"rstep-reparacion\">\n            <h3>\u00bfQu\u00e9 necesita tu equipo?<\/h3>\n            <p class=\"step-hint\">Puedes seleccionar m\u00e1s de una.<\/p>\n            <div class=\"option-list\" id=\"rgrid-reparacion\"><\/div>\n            <div class=\"mt-2\"><button class=\"btn btn--primary\" id=\"repair-next\" disabled>Ver cotizaci\u00f3n \u2192<\/button><\/div>\n          <\/div>\n          <div class=\"cotizador__step\" id=\"rstep-resultado\">\n            <div class=\"row row--between\" style=\"align-items:flex-start;flex-wrap:wrap;\">\n              <div><span class=\"eyebrow\">Estimado de reparaci\u00f3n<\/span><h2 style=\"margin-top:.5rem;\">Costo aproximado<\/h2><\/div>\n              <div class=\"stamp\">Diagn\u00f3stico<br>gratis<\/div>\n            <\/div>\n            <p class=\"result-price mt-2\" id=\"repair-total\">$0<\/p>\n            <p class=\"text-muted\" id=\"repair-device-label\" style=\"margin-top:.22rem;\"><\/p>\n            <div class=\"mt-3\" id=\"repair-breakdown\"><\/div>\n            <div class=\"divider mt-2\"><\/div>\n            <div class=\"ticket mt-2\" style=\"background:var(--signal-soft) !important;border-color:var(--signal) !important;\">\n              <p style=\"font-size:.87rem;color:var(--ink) !important;\">&#x26a0;&#xfe0f; Estimado de referencia. El precio final puede variar. El diagn\u00f3stico en sucursal es <strong>sin costo<\/strong>.<\/p>\n            <\/div>\n            <div class=\"result-actions\">\n              <a href=\"#\" id=\"repair-whatsapp\" target=\"_blank\" rel=\"noopener\" class=\"btn btn--primary\">Agendar por WhatsApp<\/a>\n              <button type=\"button\" class=\"btn\" id=\"repair-restart\">Cotizar otra reparaci\u00f3n<\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div class=\"cotizador__footer\" id=\"repair-footer\">\n          <button type=\"button\" class=\"cotizador__link\" id=\"repair-back\" style=\"visibility:hidden;\">\u2190 Atr\u00e1s<\/button>\n          <span class=\"text-mono text-muted\" style=\"font-size:.76rem;\">Diagn\u00f3stico sin costo en sucursal<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n<\/div>\n\n<!-- ===================== CONTACTO ===================== -->\n<div id=\"contacto\">\n  <section class=\"hero container\" style=\"padding-bottom:1.4rem;\">\n    <div class=\"reveal\"><span class=\"eyebrow\">Hablemos<\/span><h1 class=\"hero__title mt-2\" style=\"margin-top:.55rem;\">Cont\u00e1ctanos<\/h1><p class=\"lead\">Para cotizaciones, citas de reparaci\u00f3n o servicio a domicilio, el WhatsApp es la v\u00eda m\u00e1s r\u00e1pida.<\/p><\/div>\n  <\/section>\n  <section class=\"section--tight\">\n    <div class=\"container\">\n      <div class=\"ticket ticket--ink reveal\" style=\"display:flex;flex-wrap:wrap;gap:1.4rem;align-items:center;justify-content:space-between;\">\n        <div><span class=\"eyebrow\">V\u00eda directa<\/span><h2 class=\"mt-2\" style=\"margin-top:.45rem;\">Escr\u00edbenos por<br>WhatsApp<\/h2><p class=\"text-muted mt-2\" style=\"max-width:40ch;color:var(--paper);opacity:.7;\">Cu\u00e9ntanos qu\u00e9 le pasa a tu equipo, manda fotos si quieres, y te decimos el siguiente paso.<\/p><\/div>\n        <a href=\"https:\/\/wa.me\/528122082318?text=Hola%2C%20podr%C3%ADas%20darme%20m%C3%A1s%20informaci%C3%B3n\" target=\"_blank\" rel=\"noopener\" class=\"btn btn--primary\" style=\"flex-shrink:0;\">Abrir WhatsApp<\/a>\n      <\/div>\n    <\/div>\n  <\/section>\n  <section class=\"section--tight\">\n    <div class=\"container grid grid-3\">\n      <article class=\"work-order reveal\"><span class=\"work-order__index\">Contacto 01<\/span><h3 class=\"work-order__title\">WhatsApp<\/h3><p class=\"text-muted\">Cotizaciones, citas y servicio a domicilio.<\/p><div class=\"work-order__meta\"><span>Lun \u2013 S\u00e1b<\/span><span><a href=\"https:\/\/wa.me\/528122082318\" target=\"_blank\" rel=\"noopener\">Escribir \u2192<\/a><\/span><\/div><\/article>\n      <article class=\"work-order reveal\"><span class=\"work-order__index\">Contacto 02<\/span><h3 class=\"work-order__title\">Instagram<\/h3><p class=\"text-muted\">Antes\/despu\u00e9s de reparaciones y promociones.<\/p><div class=\"work-order__meta\"><span>@rolling_fix_<\/span><span><a href=\"https:\/\/instagram.com\/rolling_fix_\" target=\"_blank\" rel=\"noopener\">Seguir \u2192<\/a><\/span><\/div><\/article>\n      <article class=\"work-order reveal\"><span class=\"work-order__index\">Contacto 03<\/span><h3 class=\"work-order__title\">En sucursal<\/h3><p class=\"text-muted\">Plaza Tec, Av. del Estado 215A, Col. Tecnol\u00f3gico.<\/p><div class=\"work-order__meta\"><span>11:30\u201319:30<\/span><span><a href=\"#ubicacion\">Ver mapa \u2192<\/a><\/span><\/div><\/article>\n    <\/div>\n  <\/section>\n  <section class=\"section--tight section--dim\">\n    <div class=\"container\">\n      <div class=\"ticket reveal\"><div class=\"ticket__head\"><span>Horario de atenci\u00f3n<\/span><span class=\"text-mono\">Plaza Tec<\/span><\/div><div class=\"grid grid-2\"><div class=\"ticket-row\"><span>Lunes a s\u00e1bado<\/span><span>11:30 \u2013 19:30 hrs<\/span><\/div><div class=\"ticket-row\"><span>Domingo<\/span><span>Cerrado<\/span><\/div><\/div><\/div>\n    <\/div>\n  <\/section>\n  <section class=\"section section--ink\">\n    <div class=\"container text-center reveal\"><span class=\"eyebrow\" style=\"justify-content:center;\">\u00bfVienes a vender tu equipo?<\/span><h2 class=\"mt-2\" style=\"margin-top:.55rem;\">Cotiza antes<br>de escribirnos<\/h2><p class=\"lead text-muted mt-2\" style=\"margin-inline:auto;color:var(--paper);opacity:.75;\">Llega con un rango de precio en mano.<\/p><a href=\"#cotizador\" class=\"btn btn--primary mt-2\">Cotizar mi equipo<\/a><\/div>\n  <\/section>\n<\/div>\n\n<!-- ===================== UBICACION ===================== -->\n<div id=\"ubicacion\">\n  <section class=\"hero container\" style=\"padding-bottom:1.4rem;\">\n    <div class=\"reveal\"><span class=\"eyebrow\">C\u00f3mo llegar<\/span><h1 class=\"hero__title mt-2\" style=\"margin-top:.55rem;\">Vis\u00edtanos<br>en Plaza Tec<\/h1><p class=\"lead\">A unos pasos del Tecnol\u00f3gico de Monterrey. Trae tu equipo o ven a confirmar tu cotizaci\u00f3n.<\/p><\/div>\n  <\/section>\n  <section class=\"section--tight\">\n    <div class=\"container\">\n      <div class=\"ticket reveal\" style=\"padding:0;overflow:hidden;\">\n        <div class=\"grid grid-2\" style=\"gap:0;\">\n          <div style=\"min-height:360px;\"><iframe src=\"https:\/\/www.google.com\/maps?q=Plaza+Tec+Av+del+Estado+215A+Col+Tecnologico+Monterrey&#038;output=embed\" width=\"100%\" height=\"100%\" style=\"border:0;min-height:360px;display:block;\" loading=\"lazy\" referrerpolicy=\"no-referrer-when-downgrade\" title=\"Mapa Rolling Fix Plaza Tec\"><\/iframe><\/div>\n          <div style=\"padding:clamp(1.4rem,3vw,2.1rem);display:flex;flex-direction:column;gap:.7rem;justify-content:center;\">\n            <span class=\"eyebrow\">Nuestra sucursal<\/span><h3>Plaza Tec<\/h3>\n            <p class=\"text-muted\">Av. del Estado 215A<br>Col. Tecnol\u00f3gico, Monterrey, N.L.<\/p>\n            <div class=\"divider\" style=\"margin-block:.45rem;\"><\/div>\n            <div class=\"ticket-row\"><span>Horario<\/span><span>Lun \u2013 S\u00e1b, 11:30\u201319:30<\/span><\/div>\n            <div class=\"ticket-row\"><span>Domingo<\/span><span>Cerrado<\/span><\/div>\n            <div class=\"ticket-row\"><span>WhatsApp<\/span><span><a href=\"https:\/\/wa.me\/528122082318\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--signal) !important;\">81 2208 2318<\/a><\/span><\/div>\n            <a href=\"https:\/\/www.google.com\/maps?q=Plaza+Tec+Av+del+Estado+215A+Col+Tecnologico+Monterrey\" target=\"_blank\" rel=\"noopener\" class=\"btn btn--primary mt-2\">C\u00f3mo llegar<\/a>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n  <section class=\"section section--ink\">\n    <div class=\"container text-center reveal\"><span class=\"eyebrow\" style=\"justify-content:center;\">Antes de venir<\/span><h2 class=\"mt-2\" style=\"margin-top:.55rem;\">Cotiza tu equipo<br>desde donde est\u00e9s<\/h2><a href=\"#cotizador\" class=\"btn btn--primary mt-2\">Cotizar ahora<\/a><\/div>\n  <\/section>\n<\/div>\n\n<\/main>\n\n<!-- FOOTER -->\n<footer class=\"footer\">\n  <div class=\"container\">\n    <div class=\"footer__grid\">\n      <div style=\"text-align:center;\">\n        <h1 style=\"font-size:1.7rem;\">ROLLING<span style=\"color:var(--signal)\">\u00b7<\/span>FIX<\/h1>\n        <p class=\"text-muted mt-2\" style=\"max-width:30ch;margin-left:auto;margin-right:auto;\">Reparaci\u00f3n y compra-venta de equipos Apple, Android y tablets en Plaza Tec, Monterrey.<\/p>\n      <\/div>\n      <div><h4>Direcci\u00f3n<\/h4><ul><li>Plaza Tec 215A, Av. del Estado<\/li><li>Col. Tecnol\u00f3gico, Monterrey, N.L.<\/li><\/ul><\/div>\n      <div><h4>Horario<\/h4><ul><li>Lunes a s\u00e1bado<\/li><li>11:30 \u2013 19:30 hrs<\/li><\/ul><\/div>\n      <div><h4>S\u00edguenos<\/h4><ul><li><a href=\"https:\/\/instagram.com\/rolling_fix_\" target=\"_blank\" rel=\"noopener\">Instagram @rolling_fix_<\/a><\/li><li><a href=\"https:\/\/wa.me\/528122082318\" target=\"_blank\" rel=\"noopener\">WhatsApp<\/a><\/li><\/ul><\/div>\n    <\/div>\n    <div class=\"footer__base\">\n      <span>\u00a9 <span data-year=\"\"><\/span> Rolling Fix<\/span>\n      <span>Plaza Tec 215A, Col. Tecnol\u00f3gico, Monterrey, N.L.<\/span>\n      <button id=\"rf-admin-btn\" style=\"background:none;border:none;color:rgba(247,247,248,.15);font-size:.68rem;font-family:inherit;cursor:pointer;padding:.22rem .48rem;letter-spacing:.07em;\">Staff<\/button>\n    <\/div>\n  <\/div>\n<\/footer>\n\n<!-- WHATSAPP FAB -->\n<a href=\"https:\/\/wa.me\/528122082318?text=Hola%2C%20podr%C3%ADas%20darme%20m%C3%A1s%20informaci%C3%B3n\" class=\"whatsapp-fab\" aria-label=\"WhatsApp\" target=\"_blank\" rel=\"noopener\">\n  <svg viewBox=\"0 0 448 512\" fill=\"currentColor\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M380.9 97.1C339 55.1 283.2 32 223.9 32 101.5 32 2 131.5 2 253.9c0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.5 224.1-221.9 0-59.3-25.2-115-67.1-157.1zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.5-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.5-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z\"\/><\/svg>\n<\/a>\n\n<!-- LOGIN MODAL -->\n<div id=\"rfa-login-modal\" style=\"display:none;\">\n  <div class=\"rfa-backdrop-login\" id=\"rfa-backdrop\"><\/div>\n  <div class=\"rfa-login-box\">\n    <div class=\"rfa-logo\">RF<span>\u00b7<\/span>ADMIN<\/div>\n    <p class=\"rfa-login-sub\">Solo personal autorizado<\/p>\n    <div class=\"rfa-field\"><label>Tu nombre<\/label><input type=\"text\" id=\"rfa-seller-input\" placeholder=\"Escribe tu nombre\" autocomplete=\"off\" autocapitalize=\"words\"><\/div>\n    <div class=\"rfa-field\"><label>Contrase\u00f1a<\/label><input type=\"password\" id=\"rfa-pass-input\" placeholder=\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\" autocomplete=\"current-password\"><\/div>\n    <p id=\"rfa-login-err\" class=\"rfa-err\" style=\"display:none;\"><\/p>\n    <button class=\"rfa-btn rfa-btn--primary\" id=\"rfa-login-btn\">Entrar<\/button>\n    <button class=\"rfa-btn rfa-btn--ghost\" id=\"rfa-login-close\">Cancelar<\/button>\n  <\/div>\n<\/div>\n\n<!-- DRAWER ADMIN -->\n<div id=\"rfa-drawer\" style=\"display:none;\">\n  <div class=\"rfa-backdrop-drawer\" id=\"rfa-drawer-backdrop\"><\/div>\n  <div class=\"rfa-drawer-panel\">\n    <div class=\"rfa-drawer-header\">\n      <div><div class=\"rfa-drawer-title\">RF\u00b7ADMIN<\/div><div class=\"rfa-drawer-seller\" id=\"rfa-session-name\"><\/div><\/div>\n      <div style=\"display:flex;gap:.4rem;align-items:center;\">\n        <div id=\"rfa-sync-indicator\" class=\"rfa-sync-dot\" title=\"Estado del servidor\"><\/div>\n        <button class=\"rfa-icon-btn\" id=\"rfa-logout\" title=\"Salir\"><svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 21H5a2 2 0 01-2-2V5a2 2 0 012-2h4\"\/><polyline points=\"16 17 21 12 16 7\"\/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"\/><\/svg><\/button>\n        <button class=\"rfa-icon-btn\" id=\"rfa-drawer-close\" title=\"Cerrar\"><svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"\/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"\/><\/svg><\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"rfa-tabs-bar\">\n      <button class=\"rfa-tab-btn is-active\" data-tab=\"inventario\">&#x1f4e6; Inventario<\/button>\n      <button class=\"rfa-tab-btn\" data-tab=\"nuevo\">&#x2795; Agregar<\/button>\n      <button class=\"rfa-tab-btn\" data-tab=\"ventas\">&#x1f4b0; Ventas<\/button>\n      <button class=\"rfa-tab-btn\" data-tab=\"export\">&#x2b07; Datos<\/button>\n    <\/div>\n\n    <div class=\"rfa-drawer-body\">\n\n      <!-- TAB INVENTARIO -->\n      <div class=\"rfa-panel is-active\" id=\"rfa-panel-inventario\">\n        <div id=\"rfa-counters\" class=\"rfa-counters\">\n          <div class=\"rfa-counter-card\"><div class=\"rfa-counter-val\" id=\"cnt-disponible\">0<\/div><div class=\"rfa-counter-lbl\">Disponibles<\/div><\/div>\n          <div class=\"rfa-counter-card\"><div class=\"rfa-counter-val\" id=\"cnt-apartado\">0<\/div><div class=\"rfa-counter-lbl\">Apartados<\/div><\/div>\n          <div class=\"rfa-counter-card\"><div class=\"rfa-counter-val\" id=\"cnt-pendiente\">0<\/div><div class=\"rfa-counter-lbl\">Pendientes<\/div><\/div>\n          <div class=\"rfa-counter-card\"><div class=\"rfa-counter-val\" id=\"cnt-vendido\">0<\/div><div class=\"rfa-counter-lbl\">Vendidos<\/div><\/div>\n        <\/div>\n        <div class=\"rfa-search-wrap\">\n          <svg class=\"rfa-search-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"\/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"\/><\/svg>\n          <input type=\"text\" id=\"rfa-inv-search\" placeholder=\"Buscar por modelo, IMEI, color, SIM, cliente\u2026\">\n        <\/div>\n        <div class=\"rfa-panel-toolbar\">\n          <p class=\"rfa-count\" id=\"rfa-inv-count\"><\/p>\n          <div style=\"display:flex;gap:.45rem;flex-wrap:wrap;\">\n            <select class=\"rfa-select\" id=\"rfa-filter-status\">\n              <option value=\"disponible\" selected>Disponibles<\/option>\n              <option value=\"apartado\">Apartados<\/option>\n              <option value=\"pendiente\">Pendientes<\/option>\n              <option value=\"vendido\">Vendidos<\/option>\n              <option value=\"todos\">Todos<\/option>\n            <\/select>\n            <select class=\"rfa-select\" id=\"rfa-filter-cat\">\n              <option value=\"todos\">Todas<\/option>\n              <option value=\"iphone\">iPhone<\/option>\n              <option value=\"watch\">Watch<\/option>\n              <option value=\"airpods\">AirPods<\/option>\n              <option value=\"mac\">Mac\/iPad<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n        <div id=\"rfa-inv-list\"><\/div>\n        <p class=\"rfa-empty\" id=\"rfa-inv-empty\" style=\"display:none;text-align:center;padding:2rem;color:var(--a-muted);font-size:.88rem;\">Sin equipos en esta vista.<\/p>\n      <\/div>\n\n      <!-- TAB AGREGAR -->\n      <div class=\"rfa-panel\" id=\"rfa-panel-nuevo\">\n        <h3 class=\"rfa-panel-title\" id=\"rfa-form-title\">Nuevo equipo<\/h3>\n        <form id=\"rfa-product-form\" onsubmit=\"return false;\">\n          <input type=\"hidden\" id=\"rfa-edit-id\">\n          <div class=\"rfa-field\"><label>Modelo *<\/label><input type=\"text\" id=\"rfa-f-modelo\" placeholder=\"Ej: iPhone 15 Pro Max\" autocapitalize=\"words\"><\/div>\n          <div class=\"rfa-form-row\">\n            <div class=\"rfa-field\"><label>Categor\u00eda<\/label><select id=\"rfa-f-cat\"><option value=\"iphone\">iPhone<\/option><option value=\"watch\">Apple Watch<\/option><option value=\"airpods\">AirPods<\/option><option value=\"mac\">Mac \/ iPad<\/option><\/select><\/div>\n            <div class=\"rfa-field\"><label>Estatus<\/label><select id=\"rfa-f-status\"><option value=\"disponible\">Disponible<\/option><option value=\"apartado\">Apartado<\/option><option value=\"pendiente\">Pendiente<\/option><\/select><\/div>\n          <\/div>\n          <div class=\"rfa-form-row\">\n            <div class=\"rfa-field\"><label>GB<\/label><input type=\"text\" id=\"rfa-f-gb\" placeholder=\"128\" inputmode=\"numeric\"><\/div>\n            <div class=\"rfa-field\"><label>Color<\/label><input type=\"text\" id=\"rfa-f-color\" placeholder=\"Negro\" autocapitalize=\"words\"><\/div>\n          <\/div>\n          <div class=\"rfa-form-row\">\n            <div class=\"rfa-field\"><label>Bater\u00eda %<\/label><input type=\"number\" id=\"rfa-f-bat\" placeholder=\"95\" min=\"0\" max=\"100\" inputmode=\"numeric\"><\/div>\n            <div class=\"rfa-field\"><label>Est\u00e9tica \/10<\/label><input type=\"number\" id=\"rfa-f-est\" placeholder=\"9.5\" min=\"1\" max=\"10\" step=\"0.5\" inputmode=\"decimal\"><\/div>\n          <\/div>\n          <div class=\"rfa-form-row\">\n            <div class=\"rfa-field\"><label>Liberaci\u00f3n<\/label><select id=\"rfa-f-lib\"><option value=\"F\u00e1brica\">F\u00e1brica<\/option><option value=\"RSIM\">RSIM<\/option><option value=\"ATT\">ATT<\/option><option value=\"Telcel\">Telcel<\/option><option value=\"Movistar\">Movistar<\/option><option value=\"USA\">Americano\/USA<\/option><option value=\"-\">N\/A<\/option><\/select><\/div>\n            <div class=\"rfa-field\"><label>Tipo SIM<\/label><select id=\"rfa-f-simtype\"><option value=\"\">No especificado<\/option><option value=\"chip\">Chip f\u00edsico<\/option><option value=\"esim\">eSIM<\/option><option value=\"dual\">Chip + eSIM<\/option><\/select><\/div>\n          <\/div>\n          <div class=\"rfa-field\"><label>IMEI \/ Serie<\/label><input type=\"text\" id=\"rfa-f-imei\" placeholder=\"350263906892526\" inputmode=\"numeric\"><\/div>\n          <div class=\"rfa-field\"><label>Detalles \/ fallas<\/label><input type=\"text\" id=\"rfa-f-det\" placeholder=\"ESIM, chip f\u00edsico, MSJ bater\u00eda\u2026\"><\/div>\n          <div class=\"rfa-form-row\">\n            <div class=\"rfa-field\"><label>Precio p\u00fablico (MXN) *<\/label><input type=\"number\" id=\"rfa-f-precio\" placeholder=\"12000\" inputmode=\"numeric\"><\/div>\n            <div class=\"rfa-field\"><label>Costo interno (MXN)<\/label><input type=\"number\" id=\"rfa-f-costo\" placeholder=\"9000\" inputmode=\"numeric\"><\/div>\n          <\/div>\n          <div class=\"rfa-field\">\n            <label>Foto del equipo<\/label>\n            <div class=\"rfa-photo-area\" id=\"rfa-photo-drop\">\n              <input type=\"file\" id=\"rfa-f-foto\" accept=\"image\/*\" capture=\"environment\" style=\"display:none;\">\n              <div id=\"rfa-photo-preview\" class=\"rfa-photo-placeholder\">\n                <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><polyline points=\"21 15 16 10 5 21\"\/><\/svg>\n                <span>Toca para agregar foto<\/span>\n              <\/div>\n            <\/div>\n            <button type=\"button\" id=\"rfa-remove-photo-btn\" class=\"rfa-btn rfa-btn--ghost rfa-btn--sm\" style=\"display:none;margin-top:.5rem;\">&#x1f5d1; Quitar foto<\/button>\n          <\/div>\n          <p id=\"rfa-form-err\" class=\"rfa-err\" style=\"display:none;margin-bottom:.5rem;\"><\/p>\n          <div class=\"rfa-form-actions\">\n            <button type=\"button\" class=\"rfa-btn rfa-btn--primary\" id=\"rfa-save-btn\">Guardar equipo<\/button>\n            <button type=\"button\" class=\"rfa-btn rfa-btn--ghost\" id=\"rfa-cancel-edit\" style=\"display:none;\">Cancelar<\/button>\n          <\/div>\n        <\/form>\n      <\/div>\n\n      <!-- TAB VENTAS -->\n      <div class=\"rfa-panel\" id=\"rfa-panel-ventas\">\n        <h3 class=\"rfa-panel-title\">Historial de ventas<\/h3>\n        <!-- Filtros ventas -->\n        <div style=\"display:flex;flex-direction:column;gap:.5rem;margin-bottom:.9rem;\">\n          <div class=\"rfa-search-wrap\" style=\"margin-bottom:0;\">\n            <svg class=\"rfa-search-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"\/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"\/><\/svg>\n            <input type=\"text\" id=\"rfa-ventas-search\" placeholder=\"Buscar modelo, cliente, tel\u00e9fono, folio\u2026\">\n          <\/div>\n          <div style=\"display:flex;gap:.45rem;flex-wrap:wrap;\">\n            <select class=\"rfa-select\" id=\"rfa-ventas-filter-status\"><option value=\"activa\">Activas<\/option><option value=\"todos\">Todas<\/option><option value=\"anulada\">Anuladas<\/option><\/select>\n            <select class=\"rfa-select\" id=\"rfa-ventas-filter-seller\"><option value=\"todos\">Todos los vendedores<\/option><\/select>\n            <select class=\"rfa-select\" id=\"rfa-ventas-sort\">\n              <option value=\"fecha_desc\">M\u00e1s recientes<\/option>\n              <option value=\"fecha_asc\">M\u00e1s antiguas<\/option>\n              <option value=\"precio_desc\">Mayor precio<\/option>\n              <option value=\"precio_asc\">Menor precio<\/option>\n              <option value=\"margen_desc\">Mayor margen<\/option>\n              <option value=\"margen_asc\">Menor margen<\/option>\n              <option value=\"vendedor_az\">Vendedor A-Z<\/option>\n              <option value=\"modelo_az\">Modelo A-Z<\/option>\n            <\/select>\n          <\/div>\n          <div style=\"display:flex;gap:.45rem;flex-wrap:wrap;align-items:center;\">\n            <input type=\"date\" id=\"rfa-ventas-desde\" class=\"rfa-select\" style=\"flex:1;\" title=\"Fecha desde\">\n            <span style=\"color:var(--a-muted);font-size:.78rem;\">\u2013<\/span>\n            <input type=\"date\" id=\"rfa-ventas-hasta\" class=\"rfa-select\" style=\"flex:1;\" title=\"Fecha hasta\">\n          <\/div>\n        <\/div>\n        <!-- Resumen filtrado -->\n        <div class=\"rfa-ventas-summary\" id=\"rfa-ventas-summary\">\n          <div class=\"rfa-summary-item\"><div class=\"rfa-summary-val\" id=\"vs-count\">0<\/div><div class=\"rfa-summary-lbl\">Ventas<\/div><\/div>\n          <div class=\"rfa-summary-item\"><div class=\"rfa-summary-val\" id=\"vs-total\">$0<\/div><div class=\"rfa-summary-lbl\">Total<\/div><\/div>\n          <div class=\"rfa-summary-item\"><div class=\"rfa-summary-val\" id=\"vs-margen\">$0<\/div><div class=\"rfa-summary-lbl\">Ganancia<\/div><\/div>\n          <div class=\"rfa-summary-item\"><div class=\"rfa-summary-val\" id=\"vs-ticket\">$0<\/div><div class=\"rfa-summary-lbl\">Ticket prom.<\/div><\/div>\n        <\/div>\n        <div id=\"rfa-ventas-list\"><\/div>\n        <p class=\"rfa-empty\" id=\"rfa-ventas-empty\" style=\"display:none;text-align:center;padding:2rem;color:var(--a-muted);font-size:.88rem;\">Sin ventas registradas.<\/p>\n      <\/div>\n\n      <!-- TAB DATOS -->\n      <div class=\"rfa-panel\" id=\"rfa-panel-export\">\n        <h3 class=\"rfa-panel-title\">Exportar \/ Importar<\/h3>\n        <div class=\"rfa-export-card\">\n          <h4>Exportar todo<\/h4>\n          <p>Descarga un JSON con inventario + historial. \u00dasalo como respaldo.<\/p>\n          <button class=\"rfa-btn rfa-btn--primary\" id=\"rfa-export-btn\">&#x2b07; Descargar JSON<\/button>\n        <\/div>\n        <div class=\"rfa-export-card\">\n          <h4>Importar datos<\/h4>\n          <p>Carga un JSON previamente exportado. <strong>Reemplaza<\/strong> los datos actuales en el servidor.<\/p>\n          <input type=\"file\" id=\"rfa-import-file\" accept=\".json\" style=\"display:none;\">\n          <button class=\"rfa-btn rfa-btn--ghost\" id=\"rfa-import-btn\">Seleccionar archivo JSON<\/button>\n          <p id=\"rfa-import-msg\" style=\"display:none;font-size:.8rem;color:var(--a-green);font-weight:600;\"><\/p>\n        <\/div>\n        <div class=\"rfa-export-card\">\n          <h4>Resumen del negocio<\/h4>\n          <div id=\"rfa-stats\"><\/div>\n        <\/div>\n      <\/div>\n\n    <\/div><!-- \/drawer-body -->\n  <\/div><!-- \/drawer-panel -->\n<\/div><!-- \/rfa-drawer -->\n\n<!-- SELL MODAL -->\n<div id=\"rfa-sell-modal\" class=\"rfa-modal\" style=\"display:none;\">\n  <div class=\"rfa-modal-backdrop\"><\/div>\n  <div class=\"rfa-modal-box\">\n    <h3>Confirmar venta<\/h3>\n    <p id=\"rfa-sell-desc\"><\/p>\n    <div class=\"rfa-field\"><label>Nombre del cliente<\/label><input type=\"text\" id=\"rfa-sell-customer\" placeholder=\"Nombre completo\" autocapitalize=\"words\"><\/div>\n    <div class=\"rfa-field\"><label>Tel\u00e9fono del cliente<\/label><input type=\"tel\" id=\"rfa-sell-phone\" placeholder=\"81 XXXX XXXX\" inputmode=\"tel\"><\/div>\n    <div class=\"rfa-field\"><label>Precio de venta (MXN)<\/label><input type=\"number\" id=\"rfa-sell-price\" placeholder=\"12000\" inputmode=\"numeric\"><\/div>\n    <div class=\"rfa-field\"><label>Fecha de venta<\/label><input type=\"date\" id=\"rfa-sell-date\"><\/div>\n    <div class=\"rfa-field\"><label>Vendedor<\/label><input type=\"text\" id=\"rfa-sell-seller\" readonly><\/div>\n    <div class=\"rfa-modal-actions\">\n      <button class=\"rfa-btn rfa-btn--primary\" id=\"rfa-sell-confirm\" style=\"flex:1;\">Confirmar<\/button>\n      <button class=\"rfa-btn rfa-btn--ghost\" id=\"rfa-sell-cancel\" style=\"flex:1;\">Cancelar<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- DELETE MODAL -->\n<div id=\"rfa-del-modal\" class=\"rfa-modal\" style=\"display:none;\">\n  <div class=\"rfa-modal-backdrop\"><\/div>\n  <div class=\"rfa-modal-box\">\n    <h3>\u00bfEliminar equipo?<\/h3>\n    <p id=\"rfa-del-desc\"><\/p>\n    <div class=\"rfa-modal-actions\">\n      <button class=\"rfa-btn rfa-btn--danger\" id=\"rfa-del-confirm\" style=\"flex:1;\">Eliminar<\/button>\n      <button class=\"rfa-btn rfa-btn--ghost\" id=\"rfa-del-cancel\" style=\"flex:1;\">Cancelar<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- UNSELL MODAL -->\n<div id=\"rfa-unsell-modal\" class=\"rfa-modal\" style=\"display:none;\">\n  <div class=\"rfa-modal-backdrop\"><\/div>\n  <div class=\"rfa-modal-box\">\n    <h3>\u00bfRevertir esta venta?<\/h3>\n    <p>El equipo volver\u00e1 a aparecer como <strong>disponible<\/strong> y la venta quedar\u00e1 marcada como anulada.<\/p>\n    <div class=\"rfa-modal-actions\">\n      <button class=\"rfa-btn rfa-btn--danger\" id=\"rfa-unsell-confirm\" style=\"flex:1;\">S\u00ed, revertir<\/button>\n      <button class=\"rfa-btn rfa-btn--ghost\" id=\"rfa-unsell-cancel\" style=\"flex:1;\">Cancelar<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- TOAST -->\n<div id=\"rfa-toast\"><\/div>\n\n<\/div><!-- \/rf-root -->\n\n<script>\n\/* ============================================================\n   ROLLING FIX \u2014 Cotizador \"Vende tu equipo\" v3\n   Con: chip\/eSIM, compa\u00f1\u00eda USA, escal\u00f3n de capacidad\n   ============================================================ *\/\nconst WHATSAPP_NUM = \"528122082318\";\n\n\/* Precios base por modelo y capacidad BASE *\/\nconst PRECIOS_BASE = {\n  \"iPhone SE 2da gen\": { \"64\":700,  \"128\":900 },\n  \"iPhone SE 3ra gen\": { \"64\":1100, \"128\":1400 },\n  \"iPhone 11\":         { \"64\":1000, \"128\":1150 },\n  \"iPhone 11 Pro\":     { \"64\":1500, \"256\":1800 },\n  \"iPhone 11 Pro Max\": { \"64\":2100, \"256\":2500 },\n  \"iPhone 12 mini\":    { \"64\":1250, \"128\":1450 },\n  \"iPhone 12\":         { \"64\":1700, \"128\":1900, \"256\":2100 },\n  \"iPhone 12 Pro\":     { \"128\":2300,\"256\":2600 },\n  \"iPhone 12 Pro Max\": { \"128\":3000,\"256\":3400 },\n  \"iPhone 13\":         { \"128\":3000,\"256\":3400,\"512\":3900 },\n  \"iPhone 13 Pro\":     { \"128\":3800,\"256\":4300,\"512\":4900 },\n  \"iPhone 13 Pro Max\": { \"128\":5000,\"256\":5600,\"512\":6400 },\n  \"iPhone 14\":         { \"128\":4200,\"256\":4700,\"512\":5400 },\n  \"iPhone 14 Plus\":    { \"128\":4700,\"256\":5300,\"512\":6000 },\n  \"iPhone 14 Pro\":     { \"128\":5700,\"256\":6300,\"512\":7200,\"1024\":8200 },\n  \"iPhone 14 Pro Max\": { \"128\":6500,\"256\":7200,\"512\":8200,\"1024\":9400 },\n  \"iPhone 15\":         { \"128\":5500,\"256\":6200,\"512\":7000 },\n  \"iPhone 15 Plus\":    { \"128\":6500,\"256\":7200,\"512\":8100 },\n  \"iPhone 15 Pro\":     { \"128\":7000,\"256\":7800,\"512\":8900,\"1024\":10000 },\n  \"iPhone 15 Pro Max\": { \"256\":8800,\"512\":9900,\"1024\":11200 },\n  \"iPhone 16\":         { \"128\":8000,\"256\":8900,\"512\":10100 },\n  \"iPhone 16 Plus\":    { \"128\":9000,\"256\":10000,\"512\":11400 },\n  \"iPhone 16 Pro\":     { \"128\":9700,\"256\":10800,\"512\":12200,\"1024\":13800 },\n  \"iPhone 16 Pro Max\": { \"256\":12000,\"512\":13600,\"1024\":15400 },\n  \"iPhone 17\":         { \"128\":11500,\"256\":12800,\"512\":14500 },\n  \"iPhone 17 Air\":     { \"128\":12800,\"256\":14200,\"512\":16000 },\n  \"iPhone 17 Pro\":     { \"256\":16500,\"512\":18500,\"1024\":21000 },\n  \"iPhone 17 Pro Max\": { \"256\":19000,\"512\":21500,\"1024\":24000 }\n};\n\n\/* Modelos que soportan la pregunta de SIM (14 en adelante hasta 16 Pro Max) *\/\nconst MODELOS_SIM_PREGUNTA = [\n  \"iPhone 14\",\"iPhone 14 Plus\",\"iPhone 14 Pro\",\"iPhone 14 Pro Max\",\n  \"iPhone 15\",\"iPhone 15 Plus\",\"iPhone 15 Pro\",\"iPhone 15 Pro Max\",\n  \"iPhone 16\",\"iPhone 16 Plus\",\"iPhone 16 Pro\",\"iPhone 16 Pro Max\"\n];\n\/* Modelos que son puro eSIM (17 en adelante) *\/\nconst MODELOS_PURO_ESIM = [\n  \"iPhone 17\",\"iPhone 17 Air\",\"iPhone 17 Pro\",\"iPhone 17 Pro Max\"\n];\n\nconst ESCALON_STORAGE = 700; \/\/ MXN por salto de capacidad\n\nconst ORDEN_MODELOS = Object.keys(PRECIOS_BASE);\n\nconst FACTORES = {\n  funcionalidad: {\n    \"perfecto\":          { label:\"Funciona perfecto, nunca ha sido reparado\", factor:1.00 },\n    \"reparado_original\": { label:\"Funciona bien, reparado con piezas originales\", factor:0.93 },\n    \"reparado_generico\": { label:\"Funciona bien, reparado con piezas gen\u00e9ricas\", factor:0.82 },\n    \"falla_menor\":       { label:\"Tiene una falla menor (Face ID, c\u00e1mara, altavoz\u2026)\", factor:0.65 },\n    \"no_funciona\":       { label:\"No prende, pantalla rota o no funciona\", factor:0.35 }\n  },\n  bateria: {\n    \"90_100\":  { label:\"90% \u2013 100%\",    factor:1.00 },\n    \"80_89\":   { label:\"80% \u2013 89%\",     factor:0.96 },\n    \"menos80\": { label:\"Menos de 80%\",  factor:0.88 }\n  },\n  compania: {\n    \"libre\":     { label:\"F\u00e1brica \/ Liberado\",        factor:1.00 },\n    \"operador\":  { label:\"Telcel \/ AT&T \/ Movistar\",  factor:0.95 },\n    \"americano\": { label:\"Americano \/ USA\",           factor:0.90 },\n    \"bloqueado\": { label:\"Bloqueado \/ Reportado\",     factor:0.75 }\n  },\n  estado: {\n    \"9_10\":  { label:\"Como nuevo \u2014 sin rayones ni golpes\",     factor:1.00 },\n    \"7_8.9\": { label:\"Detalles m\u00ednimos de uso\",                factor:0.92 },\n    \"5_6.9\": { label:\"Rayones o golpes visibles\",              factor:0.80 },\n    \"1_4.9\": { label:\"Pantalla con grietas o golpes fuertes\",  factor:0.60 }\n  }\n};\n\nconst ACCESORIOS_BONO = {\n  \"completo\": { label:\"Caja, cable y adaptador originales\", bono:150 },\n  \"cable\":    { label:\"Solo cable\",                         bono:50  },\n  \"nada\":     { label:\"Sin accesorios\",                     bono:0   }\n};\n\nconst COMPANIA_USA_OPTS = [\n  \"AT&T USA\",\"T-Mobile\",\"Verizon\",\"Cricket\",\"Metro\",\"Boost \/ Sprint\",\"No s\u00e9\"\n];\n\nconst PRECIO_MINIMO = 300;\n\n\/* Calcula el precio base ajustado por escal\u00f3n de capacidad *\/\nfunction getPrecioBase(modelo, capacidad) {\n  const caps = PRECIOS_BASE[modelo];\n  if (!caps) return null;\n  const keys = Object.keys(caps).map(Number).sort((a,b)=>a-b);\n  const baseKey = keys[0]; \/\/ capacidad m\u00ednima del modelo\n  const cap = Number(capacidad);\n\n  if (caps[capacidad] !== undefined) return caps[capacidad];\n\n  \/\/ Calcular por escal\u00f3n si no est\u00e1 expl\u00edcito\n  const idx = keys.indexOf(cap);\n  if (idx > 0) {\n    const basePrice = caps[String(baseKey)];\n    return basePrice + idx * ESCALON_STORAGE;\n  }\n  return null;\n}\n\nfunction calcularCotizacion({ modelo, capacidad, funcionalidad, bateria, compania, estado, accesorios }) {\n  const base = getPrecioBase(modelo, capacidad);\n  if (!base) return null;\n  const fFunc = FACTORES.funcionalidad[funcionalidad].factor;\n  const fBat  = FACTORES.bateria[bateria].factor;\n  const fCia  = FACTORES.compania[compania].factor;\n  const fEst  = FACTORES.estado[estado].factor;\n  const bono  = ACCESORIOS_BONO[accesorios].bono;\n  let estimado = base * fFunc * fBat * fCia * fEst + bono;\n  estimado = Math.max(PRECIO_MINIMO, Math.round(estimado \/ 50) * 50);\n  const min = Math.round((estimado * 0.95) \/ 50) * 50;\n  const max = Math.round((estimado * 1.05) \/ 50) * 50;\n  return { base, estimado, min, max };\n}\n\nfunction formatoMXN(v) {\n  return v.toLocaleString('es-MX', { style:'currency', currency:'MXN', maximumFractionDigits:0 });\n}\n\n\/* Steps din\u00e1micos \u2014 incluye SIM y sub-USA *\/\nlet COT_STEPS = [];\nlet stepIndex = 0;\nlet seleccion = {};\n\nfunction buildSteps(modelo) {\n  const steps = [\"modelo\",\"capacidad\"];\n  if (MODELOS_PURO_ESIM.includes(modelo)) {\n    \/\/ no pregunta SIM pero lo registramos\n  } else if (MODELOS_SIM_PREGUNTA.includes(modelo)) {\n    steps.push(\"sim\");\n  }\n  steps.push(\"compania\");\n  \/\/ compania-usa se inserta din\u00e1micamente si eligen americano\n  steps.push(\"funcionalidad\",\"bateria\",\"estado\",\"accesorios\");\n  return steps;\n}\n\nconst STEP_LABELS = {\n  modelo:\"Modelo\", capacidad:\"Capacidad\", sim:\"Tipo de SIM\",\n  compania:\"Compa\u00f1\u00eda\", \"compania-usa\":\"Compa\u00f1\u00eda USA\",\n  funcionalidad:\"Funcionalidad\", bateria:\"Bater\u00eda\",\n  estado:\"Estado f\u00edsico\", accesorios:\"Accesorios\"\n};\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  if (!document.getElementById('cotizador-widget')) return;\n  COT_STEPS = buildSteps('');\n  renderModelos();\n  renderFactorStep('funcionalidad', FACTORES.funcionalidad);\n  renderFactorStep('bateria', FACTORES.bateria);\n  renderFactorStep('estado', FACTORES.estado);\n  renderAccesorios();\n  renderSimStep();\n  renderCompaniaStep();\n  renderCompaniaUSAStep();\n  updateProgress();\n  document.getElementById('cotizador-back').addEventListener('click', goBack);\n  document.getElementById('cotizador-restart').addEventListener('click', reiniciar);\n});\n\nfunction renderModelos() {\n  const grid = document.getElementById('grid-modelo');\n  grid.innerHTML = '';\n  const grupos = {};\n  ORDEN_MODELOS.forEach(m => {\n    const match = m.match(\/iPhone\\s+(\\d+|SE)\/i);\n    const serie = match ? match[1] : 'Otros';\n    if (!grupos[serie]) grupos[serie] = [];\n    grupos[serie].push(m);\n  });\n  const ordenSeries = Object.keys(grupos).sort((a,b) => {\n    if (a==='SE') return -1; if (b==='SE') return 1;\n    if (a==='Otros') return 1; if (b==='Otros') return -1;\n    return Number(a)-Number(b);\n  });\n  ordenSeries.forEach((serie, idx) => {\n    const modelos = grupos[serie];\n    const grupo = document.createElement('details');\n    grupo.className = 'model-accordion';\n    if (idx >= ordenSeries.length - 2) grupo.open = true;\n    const head = document.createElement('summary');\n    head.className = 'model-accordion__summary';\n    const isNew = Number(serie) >= 17;\n    head.innerHTML = `<span>iPhone ${serie}${isNew ? ' <span class=\"badge-nuevo\">Nuevo<\/span>' : ''}<\/span><small>${modelos.length} versi\u00f3n${modelos.length>1?'es':''}<\/small>`;\n    const items = document.createElement('div');\n    items.className = 'model-group__items';\n    modelos.forEach(modelo => {\n      const btn = document.createElement('button');\n      btn.className = 'chip chip--lg model-chip';\n      btn.type = 'button';\n      btn.innerHTML = `<span>${modelo}<\/span>`;\n      btn.addEventListener('click', () => {\n        seleccion.modelo = modelo;\n        seleccion.capacidad = null;\n        \/\/ Auto-eSIM para 17\n        if (MODELOS_PURO_ESIM.includes(modelo)) seleccion.sim = 'esim';\n        else delete seleccion.sim;\n        markActive(grid, btn);\n        renderCapacidades(modelo);\n        COT_STEPS = buildSteps(modelo);\n        goTo('capacidad');\n      });\n      items.appendChild(btn);\n    });\n    grupo.appendChild(head);\n    grupo.appendChild(items);\n    grid.appendChild(grupo);\n  });\n}\n\nfunction renderCapacidades(modelo) {\n  const grid = document.getElementById('grid-capacidad');\n  grid.innerHTML = '';\n  Object.keys(PRECIOS_BASE[modelo]).forEach(cap => {\n    const btn = document.createElement('button');\n    btn.className = 'chip chip--lg';\n    btn.type = 'button';\n    btn.textContent = cap === '1024' ? '1 TB' : cap + ' GB';\n    btn.addEventListener('click', () => {\n      seleccion.capacidad = cap;\n      markActive(grid, btn);\n      goNext();\n    });\n    grid.appendChild(btn);\n  });\n}\n\nfunction renderSimStep() {\n  const list = document.getElementById('grid-sim');\n  list.innerHTML = '';\n  [\n    { key:'chip', label:'Chip f\u00edsico', sub:'Ranura para nano-SIM' },\n    { key:'esim', label:'eSIM', sub:'Sin ranura f\u00edsica' },\n    { key:'dual', label:'Chip f\u00edsico + eSIM', sub:'Tiene ambos' }\n  ].forEach(opt => {\n    const btn = document.createElement('button');\n    btn.className = 'option-card';\n    btn.type = 'button';\n    btn.innerHTML = `<span><strong>${opt.label}<\/strong><br><small style=\"font-size:.8rem;opacity:.7;\">${opt.sub}<\/small><\/span>`;\n    btn.addEventListener('click', () => {\n      seleccion.sim = opt.key;\n      markActive(list, btn);\n      goNext();\n    });\n    list.appendChild(btn);\n  });\n}\n\nfunction renderCompaniaStep() {\n  const list = document.getElementById('grid-compania');\n  list.innerHTML = '';\n  Object.entries(FACTORES.compania).forEach(([key, val]) => {\n    const btn = document.createElement('button');\n    btn.className = 'option-card';\n    btn.type = 'button';\n    btn.innerHTML = `<span>${val.label}<\/span>`;\n    btn.addEventListener('click', () => {\n      seleccion.compania = key;\n      markActive(list, btn);\n      if (key === 'americano') {\n        \/\/ Insertar paso USA si no est\u00e1\n        const idxC = COT_STEPS.indexOf('compania');\n        if (!COT_STEPS.includes('compania-usa')) {\n          COT_STEPS.splice(idxC + 1, 0, 'compania-usa');\n        }\n        goNext();\n      } else {\n        \/\/ Remover paso USA si existe\n        const idxU = COT_STEPS.indexOf('compania-usa');\n        if (idxU !== -1) COT_STEPS.splice(idxU, 1);\n        seleccion.companiaUSA = null;\n        goNext();\n      }\n    });\n    list.appendChild(btn);\n  });\n}\n\nfunction renderCompaniaUSAStep() {\n  const grid = document.getElementById('grid-compania-usa');\n  grid.innerHTML = '';\n  COMPANIA_USA_OPTS.forEach(op => {\n    const btn = document.createElement('button');\n    btn.className = 'chip chip--lg';\n    btn.type = 'button';\n    btn.textContent = op;\n    btn.addEventListener('click', () => {\n      seleccion.companiaUSA = op;\n      markActive(grid, btn);\n      goNext();\n    });\n    grid.appendChild(btn);\n  });\n}\n\nfunction renderFactorStep(field, data) {\n  const grid = document.getElementById('grid-' + field);\n  if (!grid) return;\n  Object.entries(data).forEach(([key, val]) => {\n    const btn = document.createElement('button');\n    btn.className = 'option-card';\n    btn.type = 'button';\n    btn.innerHTML = `<span>${val.label}<\/span>`;\n    btn.addEventListener('click', () => {\n      seleccion[field] = key;\n      markActive(grid, btn);\n      goNext();\n    });\n    grid.appendChild(btn);\n  });\n}\n\nfunction renderAccesorios() {\n  const grid = document.getElementById('grid-accesorios');\n  Object.entries(ACCESORIOS_BONO).forEach(([key, val]) => {\n    const btn = document.createElement('button');\n    btn.className = 'option-card';\n    btn.type = 'button';\n    btn.innerHTML = `<span>${val.label}<\/span>`;\n    btn.addEventListener('click', () => {\n      seleccion.accesorios = key;\n      markActive(grid, btn);\n      mostrarResultado();\n    });\n    grid.appendChild(btn);\n  });\n}\n\nfunction markActive(container, btn) {\n  container.querySelectorAll('.is-active').forEach(b => b.classList.remove('is-active'));\n  btn.classList.add('is-active');\n}\n\nfunction goNext() {\n  const current = COT_STEPS[stepIndex];\n  const nextStep = COT_STEPS[stepIndex + 1];\n  if (nextStep) goTo(nextStep);\n  else mostrarResultado();\n}\n\nfunction goBack() {\n  if (stepIndex > 0) goTo(COT_STEPS[stepIndex - 1]);\n}\n\nfunction goTo(step) {\n  document.querySelectorAll('#cotizador-widget .cotizador__step').forEach(p => p.classList.remove('is-active'));\n  document.getElementById('cotizador-result').classList.remove('is-active');\n  const el = document.getElementById('step-' + step);\n  if (!el) { goNext(); return; }\n  el.classList.add('is-active');\n\n  \/\/ Mostrar nota eSIM autom\u00e1tico en paso SIM\n  const note = document.getElementById('sim-esim-note');\n  if (step === 'sim' && seleccion.modelo && MODELOS_PURO_ESIM.includes(seleccion.modelo)) {\n    if (note) note.style.display = 'block';\n  } else {\n    if (note) note.style.display = 'none';\n  }\n\n  document.getElementById('cotizador-footer').style.display = 'flex';\n  stepIndex = COT_STEPS.indexOf(step);\n  if (stepIndex === -1) stepIndex = 0;\n  updateProgress();\n  document.getElementById('cotizador-back').style.visibility = stepIndex === 0 ? 'hidden' : 'visible';\n}\n\nfunction updateProgress() {\n  const total = COT_STEPS.length;\n  const pct   = (stepIndex \/ total) * 100;\n  document.getElementById('progress-bar').style.width = pct + '%';\n  const lbl = COT_STEPS[stepIndex] ? STEP_LABELS[COT_STEPS[stepIndex]] || COT_STEPS[stepIndex] : '';\n  document.getElementById('progress-label-current').textContent = `Paso ${stepIndex + 1} de ${total} \u00b7 ${lbl}`;\n}\n\nfunction reiniciar() {\n  seleccion = {};\n  COT_STEPS = buildSteps('');\n  stepIndex = 0;\n  document.querySelectorAll('#cotizador-widget .chip, #cotizador-widget .option-card').forEach(b => b.classList.remove('is-active'));\n  document.getElementById('grid-capacidad').innerHTML = '';\n  document.getElementById('cotizador-result').classList.remove('is-active');\n  goTo('modelo');\n}\n\nfunction mostrarResultado() {\n  const data = calcularCotizacion(seleccion);\n  if (!data) return;\n\n  document.querySelectorAll('#cotizador-widget .cotizador__step').forEach(p => p.classList.remove('is-active'));\n  document.getElementById('cotizador-footer').style.display = 'none';\n  const result = document.getElementById('cotizador-result');\n  result.classList.add('is-active');\n\n  const folio = 'RF-' + Date.now().toString().slice(-6);\n  const hoy   = new Date();\n  const vence = new Date(hoy.getTime() + 3 * 24 * 60 * 60 * 1000);\n  const fmt   = d => d.toLocaleDateString('es-MX', { day:'2-digit', month:'long', year:'numeric' });\n  const capTxt = seleccion.capacidad === '1024' ? '1 TB' : seleccion.capacidad + ' GB';\n\n  document.getElementById('progress-bar').style.width = '100%';\n  document.getElementById('progress-label-current').textContent = 'Cotizaci\u00f3n lista';\n  document.getElementById('res-folio').textContent  = folio;\n  document.getElementById('res-fecha').textContent  = fmt(hoy);\n  document.getElementById('res-vence').textContent  = fmt(vence);\n  document.getElementById('res-modelo').textContent = `${seleccion.modelo} \u00b7 ${capTxt}`;\n  document.getElementById('res-precio').textContent = `${formatoMXN(data.min)} \u2013 ${formatoMXN(data.max)}`;\n\n  \/\/ SIM label\n  const simLabels = { chip:'Chip f\u00edsico', esim:'eSIM', dual:'Chip + eSIM' };\n  const simLabel = seleccion.sim ? (simLabels[seleccion.sim] || seleccion.sim) : (MODELOS_PURO_ESIM.includes(seleccion.modelo) ? 'eSIM' : 'No especificado');\n\n  \/\/ Compa\u00f1\u00eda label\n  let ciaLabel = FACTORES.compania[seleccion.compania]?.label || '';\n  if (seleccion.compania === 'americano' && seleccion.companiaUSA) {\n    ciaLabel += ` (${seleccion.companiaUSA})`;\n  }\n\n  const resumen = document.getElementById('res-resumen');\n  resumen.innerHTML = '';\n  const rows = [\n    ['Tipo de SIM',   simLabel],\n    ['Compa\u00f1\u00eda',      ciaLabel],\n    ['Funcionalidad', FACTORES.funcionalidad[seleccion.funcionalidad]?.label || ''],\n    ['Bater\u00eda',       FACTORES.bateria[seleccion.bateria]?.label || ''],\n    ['Estado f\u00edsico', FACTORES.estado[seleccion.estado]?.label || ''],\n    ['Accesorios',    ACCESORIOS_BONO[seleccion.accesorios]?.label || ''],\n  ];\n  rows.forEach(([k,v]) => {\n    if (!v) return;\n    const row = document.createElement('div');\n    row.className = 'ticket-row';\n    row.innerHTML = `<span>${k}<\/span><span>${v}<\/span>`;\n    resumen.appendChild(row);\n  });\n\n  \/\/ WhatsApp message\n  const msg = [\n    `Hola Rolling Fix &#x1f44b; Quiero vender mi equipo.`,\n    `Folio: ${folio}`,\n    `Modelo: ${seleccion.modelo} (${capTxt})`,\n    `Tipo de SIM: ${simLabel}`,\n    `Compa\u00f1\u00eda: ${ciaLabel}`,\n    `Funcionalidad: ${FACTORES.funcionalidad[seleccion.funcionalidad]?.label || ''}`,\n    `Bater\u00eda: ${FACTORES.bateria[seleccion.bateria]?.label || ''}`,\n    `Estado: ${FACTORES.estado[seleccion.estado]?.label || ''}`,\n    `Accesorios: ${ACCESORIOS_BONO[seleccion.accesorios]?.label || ''}`,\n    `Cotizaci\u00f3n estimada: ${formatoMXN(data.min)} \u2013 ${formatoMXN(data.max)}`,\n    `V\u00e1lida hasta: ${fmt(vence)}`\n  ].join('\\n');\n\n  document.getElementById('res-whatsapp').href = `https:\/\/wa.me\/${WHATSAPP_NUM}?text=${encodeURIComponent(msg)}`;\n}\n<\/script>\n\n<script>\n\/* ============================================================\n   ROLLING FIX \u2014 Cat\u00e1logo p\u00fablico + Cotizador reparaciones\n   ============================================================ *\/\nconst API_URL     = '\/rollingfix\/api.php';\nconst API_KEY_PUB = 'RF2026';\n\n\/* Orden can\u00f3nico de modelos iPhone *\/\nconst IPHONE_ORDER = [\n  \"iPhone SE\",\"iPhone SE 2\",\"iPhone SE 2da\",\"iPhone SE 3\",\"iPhone SE 3ra\",\n  \"iPhone 11\",\"iPhone 11 Pro\",\"iPhone 11 Pro Max\",\n  \"iPhone 12 mini\",\"iPhone 12\",\"iPhone 12 Pro\",\"iPhone 12 Pro Max\",\n  \"iPhone 13 mini\",\"iPhone 13\",\"iPhone 13 Pro\",\"iPhone 13 Pro Max\",\n  \"iPhone 14\",\"iPhone 14 Plus\",\"iPhone 14 Pro\",\"iPhone 14 Pro Max\",\n  \"iPhone 15\",\"iPhone 15 Plus\",\"iPhone 15 Pro\",\"iPhone 15 Pro Max\",\n  \"iPhone 15 PM\",\n  \"iPhone 16\",\"iPhone 16 Plus\",\"iPhone 16 Pro\",\"iPhone 16 Pro Max\",\n  \"iPhone 16 PM\",\n  \"iPhone 17\",\"iPhone 17 Air\",\"iPhone 17 Pro\",\"iPhone 17 Pro Max\",\n  \"iPhone 17 PM\"\n];\n\nfunction getIphoneOrderIdx(modelo) {\n  const m = modelo.toLowerCase();\n  for (let i = 0; i < IPHONE_ORDER.length; i++) {\n    if (m.startsWith(IPHONE_ORDER[i].toLowerCase())) return i;\n  }\n  return 999;\n}\n\nfunction sortCatalogItems(items) {\n  const catOrder = { iphone:0, watch:1, airpods:2, mac:3 };\n  return [...items].sort((a, b) => {\n    const catA = catOrder[a.cat] ?? 9;\n    const catB = catOrder[b.cat] ?? 9;\n    if (catA !== catB) return catA - catB;\n    if (a.cat === 'iphone') {\n      const ia = getIphoneOrderIdx(a.modelo);\n      const ib = getIphoneOrderIdx(b.modelo);\n      if (ia !== ib) return ia - ib;\n    }\n    const gbA = Number(a.gb) || 0;\n    const gbB = Number(b.gb) || 0;\n    if (gbA !== gbB) return gbA - gbB;\n    return (Number(a.precio) || 0) - (Number(b.precio) || 0);\n  });\n}\n\nfunction buildWAMessage(item) {\n  const parts = [`Hola, estoy interesado en el ${item.modelo}`];\n  if (item.gb && item.gb !== '-') parts[0] += ` de ${item.gb}GB`;\n  if (item.color && item.color !== '-') parts.push(`color ${item.color}`);\n  const batPart = item.bat ? `con ${item.bat}% de bater\u00eda` : 'bater\u00eda no especificada';\n  parts.push(batPart);\n  const estPart = item.est ? `est\u00e9tica ${item.est}\/10` : 'est\u00e9tica no especificada';\n  parts.push(estPart);\n  parts.push('\u00bfSigue disponible?');\n  return encodeURIComponent(parts.join(', ').replace(', \u00bfSigue', '. \u00bfSigue'));\n}\n\nlet catalogData = [];\n\nasync function loadCatalog() {\n  const grid    = document.getElementById('catalog-grid');\n  const loading = document.getElementById('catalog-loading');\n  const empty   = document.getElementById('catalog-empty');\n  if (!grid) return;\n\n  try {\n    const r = await fetch(`${API_URL}?action=load&key=${API_KEY_PUB}`);\n    if (!r.ok) throw new Error('HTTP ' + r.status);\n    const j = await r.json();\n    const inv = j.data?.inventory || [];\n    catalogData = inv.filter(p => p.status === 'disponible');\n  } catch(e) {\n    \/\/ Si falla el servidor, cat\u00e1logo vac\u00edo\n    catalogData = [];\n  }\n\n  if (loading) loading.style.display = 'none';\n  renderCatalog('todos');\n  grid.style.display = 'grid';\n}\n\nfunction renderCatalog(cat) {\n  const grid  = document.getElementById('catalog-grid');\n  const empty = document.getElementById('catalog-empty');\n  if (!grid) return;\n\n  let items = cat === 'todos' ? catalogData : catalogData.filter(i => i.cat === cat);\n  items = sortCatalogItems(items);\n\n  grid.innerHTML = '';\n  if (!items.length) {\n    if (empty) empty.style.display = 'block';\n    return;\n  }\n  if (empty) empty.style.display = 'none';\n\n  items.forEach((item, idx) => {\n    const card = document.createElement('article');\n    card.className = 'work-order';\n    card.style.animationDelay = (idx * 25) + 'ms';\n\n    const subParts = [\n      item.gb && item.gb !== '-' ? item.gb + ' GB' : '',\n      item.color && item.color !== '-' ? item.color : '',\n      item.lib && item.lib !== '-' ? item.lib : ''\n    ].filter(Boolean);\n\n    const waMsg = buildWAMessage(item);\n\n    const fotoHtml = item.foto\n      ? `<img decoding=\"async\" src=\"${item.foto}\" alt=\"${item.modelo}\" loading=\"lazy\">`\n      : `<div class=\"cat-card__no-photo\"><svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><polyline points=\"21 15 16 10 5 21\"\/><\/svg><span>Foto<br>pendiente<\/span><\/div>`;\n\n    card.innerHTML = `\n      <span class=\"work-order__index\" style=\"font-size:.66rem;\">${(item.cat||'').toUpperCase()}<\/span>\n      <div class=\"cat-card\">\n        <div class=\"cat-card__info\">\n          <h3 class=\"work-order__title\" style=\"font-size:1.08rem !important;\">${item.modelo}<\/h3>\n          ${subParts.length ? `<p class=\"text-mono text-muted\" style=\"font-size:.78rem;\">${subParts.join(' \u00b7 ')}<\/p>` : ''}\n          ${item.bat ? `<p class=\"text-mono text-muted\" style=\"font-size:.78rem;\">&#x1f50b; ${item.bat}%${item.est?' \u00b7 Est '+item.est+'\/10':''}<\/p>` : ''}\n          ${item.det ? `<p class=\"text-muted\" style=\"font-size:.85rem;\">${item.det}<\/p>` : ''}\n          <p style=\"font-family:var(--f-mono);font-weight:800;font-size:1.05rem;color:var(--signal);\">$${Number(item.precio).toLocaleString('es-MX')}<\/p>\n          <a href=\"https:\/\/wa.me\/${WHATSAPP_NUM}?text=${waMsg}\" target=\"_blank\" rel=\"noopener\" class=\"cat-card__wa\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 448 512\" fill=\"currentColor\"><path d=\"M380.9 97.1C339 55.1 283.2 32 223.9 32 101.5 32 2 131.5 2 253.9c0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.5 224.1-221.9 0-59.3-25.2-115-67.1-157.1zM223.9 438.7c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.5-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.5-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z\"\/><\/svg>\n            Me interesa\n          <\/a>\n        <\/div>\n        <div class=\"cat-card__photo\">${fotoHtml}<\/div>\n      <\/div>`;\n    grid.appendChild(card);\n  });\n}\n\n\/* Catalog toggle *\/\nfunction initCatalogToggle() {\n  const toggleBtn = document.getElementById('catalog-toggle');\n  const body      = document.getElementById('catalog-body');\n  const arrowEl   = document.getElementById('catalog-arrow');\n  const labelEl   = document.getElementById('catalog-toggle-label');\n  if (!toggleBtn) return;\n\n  let open = true;\n\n  const filterBtns = document.querySelectorAll('#catalog-filter .chip');\n  filterBtns.forEach(btn => {\n    btn.addEventListener('click', () => {\n      filterBtns.forEach(b => b.classList.remove('is-active'));\n      btn.classList.add('is-active');\n      renderCatalog(btn.dataset.cat);\n    });\n  });\n\n  toggleBtn.addEventListener('click', () => {\n    open = !open;\n    if (open) {\n      body.style.maxHeight = 'none';\n      body.style.overflow = 'visible';\n      body.style.opacity = '1';\n      arrowEl.style.transform = 'rotate(180deg)';\n      labelEl.textContent = 'Cerrar cat\u00e1logo';\n    } else {\n      body.style.overflow = 'hidden';\n      body.style.maxHeight = '0';\n      body.style.opacity = '0';\n      arrowEl.style.transform = 'rotate(0deg)';\n      labelEl.textContent = 'Ver equipos disponibles';\n    }\n  });\n}\n\n\/* ============================================================\n   COTIZADOR REPARACIONES\n   ============================================================ *\/\nconst REPAIR_CATALOG = {\n  iphone:  [\n    { id:\"p_iph\",   label:\"Cambio de pantalla\",          desde:700,  hasta:3500, nota:\"Var\u00eda por modelo\" },\n    { id:\"b_iph\",   label:\"Cambio de bater\u00eda\",           desde:400,  hasta:900,  nota:\"\" },\n    { id:\"c_iph\",   label:\"Centro de carga \/ conector\",  desde:350,  hasta:800,  nota:\"Lightning o USB-C\" },\n    { id:\"cam_iph\", label:\"C\u00e1mara trasera \/ frontal\",    desde:600,  hasta:2500, nota:\"Var\u00eda por m\u00f3dulo\" },\n    { id:\"boc_iph\", label:\"Bocina \/ micr\u00f3fono\",          desde:300,  hasta:700,  nota:\"\" },\n    { id:\"fid_iph\", label:\"Reparaci\u00f3n Face ID\",          desde:800,  hasta:2000, nota:\"Sujeto a disponibilidad\" },\n    { id:\"bg_iph\",  label:\"Back glass (trasera)\",        desde:400,  hasta:1200, nota:\"iPhone 8 en adelante\" },\n    { id:\"ag_iph\",  label:\"Diagn\u00f3stico da\u00f1o de agua\",    desde:200,  hasta:500,  nota:\"Incluye limpieza\" },\n  ],\n  android: [\n    { id:\"p_and\",   label:\"Cambio de pantalla\",          desde:400,  hasta:2800, nota:\"Var\u00eda por marca\" },\n    { id:\"b_and\",   label:\"Cambio de bater\u00eda\",           desde:300,  hasta:700,  nota:\"\" },\n    { id:\"c_and\",   label:\"Centro de carga \/ USB-C\",     desde:250,  hasta:600,  nota:\"\" },\n    { id:\"cam_and\", label:\"C\u00e1mara\",                      desde:400,  hasta:1800, nota:\"\" },\n    { id:\"ag_and\",  label:\"Diagn\u00f3stico da\u00f1o de agua\",    desde:200,  hasta:400,  nota:\"\" },\n  ],\n  ipad:    [\n    { id:\"p_ipad\",  label:\"Cambio de pantalla\",          desde:900,  hasta:3500, nota:\"Var\u00eda por modelo\" },\n    { id:\"b_ipad\",  label:\"Cambio de bater\u00eda\",           desde:600,  hasta:1400, nota:\"\" },\n    { id:\"c_ipad\",  label:\"Conector de carga\",           desde:400,  hasta:900,  nota:\"\" },\n  ],\n  watch:   [\n    { id:\"p_wat\",   label:\"Cambio de pantalla\",          desde:500,  hasta:1800, nota:\"Var\u00eda por modelo\" },\n    { id:\"b_wat\",   label:\"Cambio de bater\u00eda\",           desde:400,  hasta:900,  nota:\"\" },\n  ],\n};\nconst DEVICE_LABELS = { iphone:\"iPhone\", android:\"Android\", ipad:\"iPad \/ Tablet\", watch:\"Apple Watch\" };\n\nfunction initRepairQuoter() {\n  if (!document.getElementById('repair-widget')) return;\n  const RSTEPS = ['dispositivo','reparacion','resultado'];\n  let rStep = 0, rDevice = null;\n  const rSelected = new Set();\n\n  document.querySelectorAll('#rgrid-dispositivo .chip').forEach(btn => {\n    btn.addEventListener('click', () => {\n      document.querySelectorAll('#rgrid-dispositivo .chip').forEach(b => b.classList.remove('is-active'));\n      btn.classList.add('is-active');\n      rDevice = btn.dataset.dev;\n      rSelected.clear();\n      renderRepairOpts(rDevice);\n      rGoTo('reparacion');\n    });\n  });\n\n  document.getElementById('repair-next').addEventListener('click', () => { if (rSelected.size > 0) showRepairResult(); });\n  document.getElementById('repair-back').addEventListener('click', () => { if (rStep > 0) rGoTo(RSTEPS[rStep-1]); });\n  document.getElementById('repair-restart').addEventListener('click', () => {\n    rSelected.clear(); rDevice = null;\n    document.querySelectorAll('#rgrid-dispositivo .chip').forEach(b => b.classList.remove('is-active'));\n    rGoTo('dispositivo');\n  });\n\n  function renderRepairOpts(dev) {\n    const list = document.getElementById('rgrid-reparacion');\n    list.innerHTML = '';\n    document.getElementById('repair-next').disabled = true;\n    (REPAIR_CATALOG[dev]||[]).forEach(item => {\n      const btn = document.createElement('button');\n      btn.className = 'option-card';\n      btn.type = 'button';\n      btn.style.alignItems = 'flex-start';\n      btn.innerHTML = `<span style=\"flex:1;\">${item.label}${item.nota?'<br><small style=\"font-size:.74rem;opacity:.62;\">'+item.nota+'<\/small>':''}<\/span><span style=\"font-family:var(--f-mono);font-size:.85rem;color:var(--signal);white-space:nowrap;flex-shrink:0;\">desde $${item.desde.toLocaleString('es-MX')}<\/span>`;\n      btn.addEventListener('click', () => {\n        btn.classList.toggle('is-active');\n        if (rSelected.has(item.id)) rSelected.delete(item.id); else rSelected.add(item.id);\n        document.getElementById('repair-next').disabled = rSelected.size === 0;\n      });\n      list.appendChild(btn);\n    });\n  }\n\n  function showRepairResult() {\n    const items  = REPAIR_CATALOG[rDevice]||[];\n    const chosen = items.filter(i => rSelected.has(i.id));\n    const tD = chosen.reduce((s,i)=>s+i.desde,0);\n    const tH = chosen.reduce((s,i)=>s+i.hasta,0);\n    document.getElementById('repair-total').textContent = '$'+tD.toLocaleString('es-MX')+' \u2013 $'+tH.toLocaleString('es-MX');\n    document.getElementById('repair-device-label').textContent = DEVICE_LABELS[rDevice]+' \u00b7 '+chosen.length+' servicio'+(chosen.length>1?'s':'');\n    const bd = document.getElementById('repair-breakdown');\n    bd.innerHTML = '';\n    chosen.forEach(item => {\n      const row = document.createElement('div');\n      row.className = 'ticket-row';\n      row.innerHTML = `<span>${item.label}<\/span><span>$${item.desde.toLocaleString('es-MX')} \u2013 $${item.hasta.toLocaleString('es-MX')}<\/span>`;\n      bd.appendChild(row);\n    });\n    const msgItems = chosen.map(i=>'\u2022 '+i.label).join('\\n');\n    document.getElementById('repair-whatsapp').href = `https:\/\/wa.me\/${WHATSAPP_NUM}?text=${encodeURIComponent('Hola Rolling Fix &#x1f44b; Quiero cotizar una reparaci\u00f3n.\\nDispositivo: '+DEVICE_LABELS[rDevice]+'\\nServicios:\\n'+msgItems)}`;\n    rGoTo('resultado');\n  }\n\n  function rGoTo(step) {\n    document.querySelectorAll('#repair-widget .cotizador__step').forEach(p=>p.classList.remove('is-active'));\n    document.getElementById('rstep-'+step).classList.add('is-active');\n    rStep = RSTEPS.indexOf(step);\n    const pct = (rStep\/3)*100;\n    document.getElementById('repair-progress-bar').style.width = pct+'%';\n    const lbls = { dispositivo:'Paso 1 de 3 \u00b7 Dispositivo', reparacion:'Paso 2 de 3 \u00b7 Reparaci\u00f3n', resultado:'Cotizaci\u00f3n lista' };\n    document.getElementById('repair-progress-label').textContent = lbls[step];\n    document.getElementById('repair-back').style.visibility = rStep===0?'hidden':'visible';\n    document.getElementById('repair-footer').style.display = step==='resultado'?'none':'flex';\n  }\n}\n\n\/* ============================================================\n   SHARED BEHAVIORS\n   ============================================================ *\/\ndocument.addEventListener('DOMContentLoaded', () => {\n  if (!window.location.hash) window.scrollTo(0,0);\n\n  \/\/ Scroll behavior\n  document.querySelectorAll('[data-year]').forEach(el => { el.textContent = new Date().getFullYear(); });\n\n  \/\/ Reveal\n  const items = document.querySelectorAll('.reveal');\n  if ('IntersectionObserver' in window && items.length) {\n    const obs = new IntersectionObserver(entries => {\n      entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('is-visible'); obs.unobserve(e.target); } });\n    }, { threshold:0.12, rootMargin:'0px 0px -36px 0px' });\n    items.forEach((el,i) => { el.style.setProperty('--i',i%8); obs.observe(el); });\n  } else { items.forEach(el => el.classList.add('is-visible')); }\n\n  \/\/ Scrollspy\n  const rfSections = document.querySelectorAll('main > div[id]');\n  const rfNavLinks = document.querySelectorAll('.nav__links a[data-page]');\n  if ('IntersectionObserver' in window && rfSections.length) {\n    const spy = new IntersectionObserver(entries => {\n      entries.forEach(e => { if (e.isIntersecting) rfNavLinks.forEach(a => a.classList.toggle('is-active', a.dataset.page===e.target.id)); });\n    }, { rootMargin:'-42% 0px -52% 0px', threshold:0 });\n    rfSections.forEach(s => spy.observe(s));\n  }\n\n  initCatalogToggle();\n  loadCatalog();\n  initRepairQuoter();\n});\n<\/script>\n\n<script>\n\/* ============================================================\n   ROLLING FIX ADMIN \u2014 Panel staff con PHP backend\n   ============================================================ *\/\nconst ADMIN_PASS_LOCAL = 'RF2026';\n\nlet currentSeller  = '';\nlet adminState     = { inventory:[], sales:[] };\nlet pendingSellId  = null;\nlet pendingDelId   = null;\nlet pendingUnsellId= null;\nlet pendingPhoto   = null; \/\/ { file, b64 }\nlet currentPhotoUrl= null;\n\n\/* ---- API ---- *\/\nfunction apiHeaders() {\n  return { 'Content-Type':'application\/json', 'X-Api-Key': ADMIN_PASS_LOCAL };\n}\nfunction apiUrl(action) {\n  return `${API_URL}?action=${action}&key=${ADMIN_PASS_LOCAL}`;\n}\nfunction setSync(state) {\n  const dot = document.getElementById('rfa-sync-indicator');\n  if (dot) { dot.className = 'rfa-sync-dot ' + state; }\n}\n\nasync function apiLoad() {\n  setSync('loading');\n  try {\n    const r = await fetch(apiUrl('load'));\n    if (!r.ok) throw new Error('HTTP ' + r.status);\n    const j = await r.json();\n    adminState = j.data || { inventory:[], sales:[] };\n    \/\/ Retrocompat: ventas sin status \u2192 activa\n    adminState.sales = adminState.sales.map(s => ({ status:'activa', ...s }));\n    setSync('ok');\n    localStorage.setItem('rf_cache_v2', JSON.stringify(adminState));\n    return true;\n  } catch(e) {\n    setSync('err');\n    \/\/ Fallback cache\n    const raw = localStorage.getItem('rf_cache_v2');\n    if (raw) adminState = JSON.parse(raw);\n    return false;\n  }\n}\n\nasync function apiPost(action, body) {\n  setSync('loading');\n  try {\n    const r = await fetch(apiUrl(action), { method:'POST', headers:apiHeaders(), body:JSON.stringify(body) });\n    if (!r.ok) { const j=await r.json(); throw new Error(j.error||'HTTP '+r.status); }\n    setSync('ok');\n    return { ok:true };\n  } catch(e) { setSync('err'); return { ok:false, error:e.message }; }\n}\n\nasync function apiDelete(id) {\n  setSync('loading');\n  try {\n    const r = await fetch(apiUrl('delete'), { method:'DELETE', headers:apiHeaders(), body:JSON.stringify({id}) });\n    if (!r.ok) throw new Error('HTTP '+r.status);\n    setSync('ok');\n    return true;\n  } catch(e) { setSync('err'); return false; }\n}\n\nasync function uploadPhoto(file) {\n  const fd = new FormData();\n  fd.append('foto', file);\n  try {\n    const r = await fetch(apiUrl('upload_photo'), { method:'POST', body:fd });\n    if (!r.ok) return null;\n    const j = await r.json();\n    return j.data?.url || null;\n  } catch(e) { return null; }\n}\n\n\/* ---- Toast ---- *\/\nfunction toast(msg, type='ok') {\n  const el = document.getElementById('rfa-toast');\n  if (!el) return;\n  el.textContent = msg;\n  el.className = 'show ' + type;\n  clearTimeout(el._t);\n  el._t = setTimeout(() => { el.className = ''; }, 3000);\n}\n\n\/* ---- Helpers ---- *\/\nfunction fmxn(v) { return '$'+Number(v||0).toLocaleString('es-MX'); }\nfunction fdate(ts) {\n  if (!ts) return '\u2014';\n  if (typeof ts === 'string' && ts.includes('-')) {\n    const [y,m,d] = ts.split('-');\n    return `${d}\/${m}\/${y}`;\n  }\n  return new Date(ts).toLocaleDateString('es-MX',{day:'2-digit',month:'short',year:'numeric'});\n}\nfunction fuid() { return Date.now().toString(36)+Math.random().toString(36).slice(2,6); }\n\n\/* ---- Boot ---- *\/\ndocument.addEventListener('DOMContentLoaded', () => {\n  const adminBtn = document.getElementById('rf-admin-btn');\n  if (adminBtn) adminBtn.addEventListener('click', openLogin);\n\n  document.getElementById('rfa-login-btn').addEventListener('click', doLogin);\n  document.getElementById('rfa-login-close').addEventListener('click', closeLogin);\n  document.getElementById('rfa-backdrop').addEventListener('click', closeLogin);\n  document.getElementById('rfa-pass-input').addEventListener('keydown', e => { if(e.key==='Enter') doLogin(); });\n\n  document.getElementById('rfa-drawer-close').addEventListener('click', closeDrawer);\n  document.getElementById('rfa-drawer-backdrop').addEventListener('click', closeDrawer);\n  document.getElementById('rfa-logout').addEventListener('click', () => { closeDrawer(); currentSeller=''; });\n\n  document.querySelectorAll('.rfa-tab-btn').forEach(btn =>\n    btn.addEventListener('click', () => switchTab(btn.dataset.tab))\n  );\n\n  document.getElementById('rfa-filter-status').addEventListener('change', renderInventory);\n  document.getElementById('rfa-filter-cat').addEventListener('change', renderInventory);\n  document.getElementById('rfa-inv-search').addEventListener('input', renderInventory);\n\n  \/\/ Ventas filters\n  ['rfa-ventas-search','rfa-ventas-filter-status','rfa-ventas-filter-seller',\n   'rfa-ventas-sort','rfa-ventas-desde','rfa-ventas-hasta'].forEach(id => {\n    const el = document.getElementById(id);\n    if (el) el.addEventListener('change', renderSales);\n    if (el && el.tagName==='INPUT') el.addEventListener('input', renderSales);\n  });\n\n  \/\/ Photo\n  const photoArea  = document.getElementById('rfa-photo-drop');\n  const photoInput = document.getElementById('rfa-f-foto');\n  photoArea.addEventListener('click', () => photoInput.click());\n  photoInput.addEventListener('change', () => { if(photoInput.files[0]) handlePhoto(photoInput.files[0]); });\n\n  document.getElementById('rfa-remove-photo-btn').addEventListener('click', removePhoto);\n  document.getElementById('rfa-save-btn').addEventListener('click', saveProduct);\n  document.getElementById('rfa-cancel-edit').addEventListener('click', resetForm);\n\n  \/\/ Modals\n  document.getElementById('rfa-sell-confirm').addEventListener('click', confirmSell);\n  document.getElementById('rfa-sell-cancel').addEventListener('click', () => { document.getElementById('rfa-sell-modal').style.display='none'; pendingSellId=null; });\n  document.getElementById('rfa-del-confirm').addEventListener('click', confirmDelete);\n  document.getElementById('rfa-del-cancel').addEventListener('click', () => { document.getElementById('rfa-del-modal').style.display='none'; pendingDelId=null; });\n  document.getElementById('rfa-unsell-confirm').addEventListener('click', confirmUnsell);\n  document.getElementById('rfa-unsell-cancel').addEventListener('click', () => { document.getElementById('rfa-unsell-modal').style.display='none'; pendingUnsellId=null; });\n\n  document.getElementById('rfa-export-btn').addEventListener('click', exportData);\n  document.getElementById('rfa-import-btn').addEventListener('click', () => document.getElementById('rfa-import-file').click());\n  document.getElementById('rfa-import-file').addEventListener('change', importData);\n});\n\n\/* ---- Login ---- *\/\nfunction openLogin() {\n  document.getElementById('rfa-login-modal').style.display = 'flex';\n  setTimeout(() => document.getElementById('rfa-seller-input').focus(), 100);\n}\nfunction closeLogin() { document.getElementById('rfa-login-modal').style.display = 'none'; }\n\nfunction doLogin() {\n  const seller = document.getElementById('rfa-seller-input').value.trim();\n  const pass   = document.getElementById('rfa-pass-input').value;\n  const err    = document.getElementById('rfa-login-err');\n  if (!seller) { err.textContent='Escribe tu nombre'; err.style.display='block'; return; }\n  if (pass !== ADMIN_PASS_LOCAL) { err.textContent='Contrase\u00f1a incorrecta'; err.style.display='block'; return; }\n  err.style.display = 'none';\n  currentSeller = seller;\n  document.getElementById('rfa-session-name').textContent = seller;\n  document.getElementById('rfa-pass-input').value = '';\n  document.getElementById('rfa-seller-input').value = '';\n  closeLogin();\n  openDrawer();\n}\n\nfunction openDrawer() {\n  document.getElementById('rfa-drawer').style.display = 'flex';\n  document.body.style.overflow = 'hidden';\n  apiLoad().then(() => switchTab('inventario'));\n}\nfunction closeDrawer() {\n  document.getElementById('rfa-drawer').style.display = 'none';\n  document.body.style.overflow = '';\n}\n\n\/* ---- Tabs ---- *\/\nfunction switchTab(name) {\n  document.querySelectorAll('.rfa-tab-btn').forEach(b => b.classList.toggle('is-active', b.dataset.tab===name));\n  document.querySelectorAll('.rfa-panel').forEach(p => p.classList.toggle('is-active', p.id==='rfa-panel-'+name));\n  if (name==='inventario') { renderCounters(); renderInventory(); }\n  if (name==='ventas')     { renderSales(); }\n  if (name==='export')     { renderStats(); }\n}\n\n\/* ---- Counters ---- *\/\nfunction renderCounters() {\n  const counts = { disponible:0, apartado:0, pendiente:0, vendido:0 };\n  adminState.inventory.forEach(p => {\n    const s = p.status || 'disponible';\n    if (counts[s] !== undefined) counts[s]++;\n  });\n  ['disponible','apartado','pendiente','vendido'].forEach(s => {\n    const el = document.getElementById('cnt-'+s);\n    if (el) el.textContent = counts[s];\n  });\n}\n\n\/* ---- Inventory ---- *\/\nfunction renderInventory() {\n  const statusF  = document.getElementById('rfa-filter-status').value;\n  const catF     = document.getElementById('rfa-filter-cat').value;\n  const searchQ  = (document.getElementById('rfa-inv-search').value||'').toLowerCase().trim();\n  const list     = document.getElementById('rfa-inv-list');\n  const empty    = document.getElementById('rfa-inv-empty');\n  const count    = document.getElementById('rfa-inv-count');\n  list.innerHTML = '';\n\n  \/\/ \u00cdndice de ventas por productId para b\u00fasqueda por cliente\n  const salesByProduct = {};\n  adminState.sales.forEach(s => {\n    if (!salesByProduct[s.productId]) salesByProduct[s.productId] = [];\n    salesByProduct[s.productId].push(s);\n  });\n\n  let items = adminState.inventory.filter(p => {\n    const status = p.status || 'disponible';\n    if (statusF !== 'todos' && status !== statusF) return false;\n    if (catF !== 'todos' && p.cat !== catF) return false;\n    if (searchQ) {\n      const hay = [\n        p.modelo, p.imei, p.color, p.status, p.simType,\n        ...(salesByProduct[p.id]||[]).flatMap(s=>[s.customerName,s.customerPhone])\n      ].filter(Boolean).join(' ').toLowerCase();\n      if (!hay.includes(searchQ)) return false;\n    }\n    return true;\n  }).sort((a,b) => (b.createdAt||0) - (a.createdAt||0));\n\n  count.textContent = items.length + ' equipo' + (items.length!==1?'s':'');\n\n  if (!items.length) { empty.style.display='block'; return; }\n  empty.style.display = 'none';\n\n  items.forEach(p => {\n    const status = p.status || 'disponible';\n    const div = document.createElement('div');\n    div.className = 'rfa-inv-item' + (status==='vendido'?' is-sold':'') + (status==='apartado'?' is-apartado':'') + (status==='pendiente'?' is-pendiente':'');\n\n    const sub = [p.gb&&p.gb!=='-'?p.gb+' GB':'', p.color&&p.color!=='-'?p.color:'', p.lib&&p.lib!=='-'?p.lib:''].filter(Boolean).join(' \u00b7 ');\n    const margin = (p.precio && p.costo) ? Number(p.precio) - Number(p.costo) : null;\n    const lastSales = salesByProduct[p.id] || [];\n    const lastSale  = lastSales.filter(s=>s.status!=='anulada').slice(-1)[0];\n\n    div.innerHTML = `\n      <div class=\"rfa-inv-item-body\">\n        <div class=\"rfa-inv-thumb\">\n          ${p.foto ? `<img decoding=\"async\" src=\"${p.foto}\" alt=\"${p.modelo}\" loading=\"lazy\">` : `<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><polyline points=\"21 15 16 10 5 21\"\/><\/svg>`}\n        <\/div>\n        <div class=\"rfa-inv-info\">\n          <div class=\"rfa-inv-model\">\n            ${p.modelo}\n            <span class=\"rfa-status-badge ${status}\">${status}<\/span>\n            ${p.simType ? `<span class=\"rfa-status-badge\" style=\"background:rgba(147,197,253,.15);color:#93c5fd;\">${p.simType}<\/span>` : ''}\n          <\/div>\n          ${sub ? `<div class=\"rfa-inv-sub\">${sub}${p.bat?' \u00b7 &#x1f50b;'+p.bat+'%':''}<\/div>` : ''}\n          ${p.det ? `<div class=\"rfa-inv-det\">${p.det}<\/div>` : ''}\n          ${p.imei ? `<div class=\"rfa-inv-sub\" style=\"opacity:.45;\">IMEI: ${p.imei}<\/div>` : ''}\n          <div class=\"rfa-inv-price-row\">\n            <span class=\"rfa-inv-price\">${fmxn(p.precio)}<\/span>\n            ${p.costo ? `<span class=\"rfa-inv-cost\">Costo: ${fmxn(p.costo)}<\/span>` : `<span class=\"rfa-inv-cost\">Costo: sin registrar<\/span>`}\n            ${margin !== null ? `<span class=\"rfa-inv-margin\">Margen: ${fmxn(margin)}<\/span>` : ''}\n          <\/div>\n        <\/div>\n      <\/div>\n      <div class=\"rfa-inv-actions\">\n        ${status==='disponible'||status==='apartado'||status==='pendiente' ? `<button class=\"rfa-inv-action sell\" onclick=\"openSellModal('${p.id}')\">\u2713 Vender<\/button>` : ''}\n        <button class=\"rfa-inv-action\" onclick=\"editProduct('${p.id}')\">&#x270f; Editar<\/button>\n        <button class=\"rfa-inv-action del\" onclick=\"openDelModal('${p.id}')\">\u2715 Borrar<\/button>\n      <\/div>\n      ${lastSale ? `<div class=\"rfa-inv-last-sale\">\u00daltima venta: ${lastSale.customerName||'\u2014'} \u00b7 ${lastSale.customerPhone||'\u2014'} \u00b7 ${fdate(lastSale.saleDate||lastSale.date)} \u00b7 ${lastSale.soldBy||''}<\/div>` : ''}`;\n    list.appendChild(div);\n  });\n}\n\n\/* ---- Photo ---- *\/\nfunction handlePhoto(file) {\n  const reader = new FileReader();\n  reader.onload = e => {\n    pendingPhoto = { file, b64: e.target.result };\n    const prev = document.getElementById('rfa-photo-preview');\n    prev.innerHTML = `<img decoding=\"async\" src=\"${e.target.result}\" style=\"max-height:150px;border-radius:8px;\"><span style=\"font-size:.7rem;color:var(--a-muted);\">Toca para cambiar<\/span>`;\n    document.getElementById('rfa-remove-photo-btn').style.display = 'inline-flex';\n  };\n  reader.readAsDataURL(file);\n}\n\nfunction removePhoto() {\n  if (!confirm('\u00bfQuitar la foto? Se borrar\u00e1 del servidor.')) return;\n  const editId = document.getElementById('rfa-edit-id').value;\n  if (editId && currentPhotoUrl) {\n    apiPost('remove_photo', { id:editId, url:currentPhotoUrl }).then(() => toast('Foto eliminada del servidor'));\n    currentPhotoUrl = null;\n  }\n  pendingPhoto = null;\n  document.getElementById('rfa-photo-preview').innerHTML = `<svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><polyline points=\"21 15 16 10 5 21\"\/><\/svg><span>Toca para agregar foto<\/span>`;\n  document.getElementById('rfa-remove-photo-btn').style.display = 'none';\n  document.getElementById('rfa-f-foto').value = '';\n}\n\n\/* ---- Save product ---- *\/\nasync function saveProduct() {\n  const modelo = document.getElementById('rfa-f-modelo').value.trim();\n  const precio = document.getElementById('rfa-f-precio').value;\n  const editId = document.getElementById('rfa-edit-id').value;\n  const err    = document.getElementById('rfa-form-err');\n  if (!modelo||!precio) { err.textContent='Modelo y precio son obligatorios'; err.style.display='block'; return; }\n  err.style.display = 'none';\n\n  const btn = document.getElementById('rfa-save-btn');\n  btn.textContent = 'Guardando\u2026'; btn.disabled = true;\n\n  let fotoUrl = currentPhotoUrl;\n  if (pendingPhoto?.file) {\n    const uploaded = await uploadPhoto(pendingPhoto.file);\n    fotoUrl = uploaded || pendingPhoto.b64; \/\/ fallback base64\n  }\n\n  const data = {\n    modelo, precio:Number(precio),\n    cat:     document.getElementById('rfa-f-cat').value,\n    status:  document.getElementById('rfa-f-status').value,\n    gb:      document.getElementById('rfa-f-gb').value.trim()||'-',\n    bat:     document.getElementById('rfa-f-bat').value||null,\n    lib:     document.getElementById('rfa-f-lib').value,\n    simType: document.getElementById('rfa-f-simtype').value||null,\n    color:   document.getElementById('rfa-f-color').value.trim()||'-',\n    est:     document.getElementById('rfa-f-est').value||null,\n    det:     document.getElementById('rfa-f-det').value.trim(),\n    imei:    document.getElementById('rfa-f-imei').value.trim(),\n    costo:   document.getElementById('rfa-f-costo').value ? Number(document.getElementById('rfa-f-costo').value) : null,\n    addedBy: currentSeller,\n  };\n  if (fotoUrl) data.foto = fotoUrl;\n  if (editId) data.id = editId;\n\n  const res = await apiPost('save_product', data);\n  btn.textContent = 'Guardar equipo'; btn.disabled = false;\n\n  if (res.ok) {\n    toast('\u2713 Guardado correctamente');\n    await apiLoad();\n    renderCounters();\n    renderInventory();\n    resetForm();\n    switchTab('inventario');\n  } else {\n    err.textContent = '&#x26a0; ' + (res.error || 'Error al guardar. Verifica api.php.');\n    err.style.display = 'block';\n    toast('\u2717 Error al guardar', 'err');\n  }\n}\n\nfunction editProduct(id) {\n  const p = adminState.inventory.find(x=>x.id===id);\n  if (!p) return;\n  document.getElementById('rfa-edit-id').value  = p.id;\n  document.getElementById('rfa-f-modelo').value = p.modelo;\n  document.getElementById('rfa-f-cat').value    = p.cat||'iphone';\n  document.getElementById('rfa-f-status').value = p.status||'disponible';\n  document.getElementById('rfa-f-gb').value     = p.gb!=='-'?p.gb||'':'';\n  document.getElementById('rfa-f-bat').value    = p.bat||'';\n  document.getElementById('rfa-f-lib').value    = p.lib||'F\u00e1brica';\n  document.getElementById('rfa-f-simtype').value = p.simType||'';\n  document.getElementById('rfa-f-color').value  = p.color!=='-'?p.color||'':'';\n  document.getElementById('rfa-f-est').value    = p.est||'';\n  document.getElementById('rfa-f-precio').value = p.precio||'';\n  document.getElementById('rfa-f-costo').value  = p.costo||'';\n  document.getElementById('rfa-f-det').value    = p.det||'';\n  document.getElementById('rfa-f-imei').value   = p.imei||'';\n  currentPhotoUrl = p.foto || null;\n  if (p.foto) {\n    pendingPhoto = null;\n    document.getElementById('rfa-photo-preview').innerHTML = `<img decoding=\"async\" src=\"${p.foto}\" style=\"max-height:150px;border-radius:8px;\"><span style=\"font-size:.7rem;color:var(--a-muted);\">Toca para cambiar<\/span>`;\n    document.getElementById('rfa-remove-photo-btn').style.display = 'inline-flex';\n  }\n  document.getElementById('rfa-form-title').textContent = 'Editar equipo';\n  document.getElementById('rfa-cancel-edit').style.display = 'inline-flex';\n  switchTab('nuevo');\n  document.getElementById('rfa-panel-nuevo').scrollTop = 0;\n}\n\nfunction resetForm() {\n  document.getElementById('rfa-edit-id').value = '';\n  document.getElementById('rfa-product-form').reset();\n  pendingPhoto = null; currentPhotoUrl = null;\n  document.getElementById('rfa-photo-preview').innerHTML = `<svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><polyline points=\"21 15 16 10 5 21\"\/><\/svg><span>Toca para agregar foto<\/span>`;\n  document.getElementById('rfa-remove-photo-btn').style.display = 'none';\n  document.getElementById('rfa-f-foto').value = '';\n  document.getElementById('rfa-form-title').textContent = 'Nuevo equipo';\n  document.getElementById('rfa-cancel-edit').style.display = 'none';\n  document.getElementById('rfa-form-err').style.display = 'none';\n}\n\n\/* ---- Sell modal ---- *\/\nfunction openSellModal(id) {\n  const p = adminState.inventory.find(x=>x.id===id);\n  if (!p) return;\n  pendingSellId = id;\n  document.getElementById('rfa-sell-desc').textContent = p.modelo + (p.gb&&p.gb!=='-'?' \u00b7 '+p.gb+' GB':'') + ' \u2014 ' + fmxn(p.precio);\n  document.getElementById('rfa-sell-price').value  = p.precio;\n  document.getElementById('rfa-sell-seller').value = currentSeller;\n  document.getElementById('rfa-sell-customer').value = '';\n  document.getElementById('rfa-sell-phone').value    = '';\n  \/\/ Fecha actual por defecto\n  const today = new Date().toISOString().split('T')[0];\n  document.getElementById('rfa-sell-date').value = today;\n  document.getElementById('rfa-sell-modal').style.display = 'flex';\n}\n\nasync function confirmSell() {\n  const p = adminState.inventory.find(x=>x.id===pendingSellId);\n  if (!p) return;\n  const soldPrice     = Number(document.getElementById('rfa-sell-price').value)||p.precio;\n  const customerName  = document.getElementById('rfa-sell-customer').value.trim();\n  const customerPhone = document.getElementById('rfa-sell-phone').value.trim();\n  const saleDate      = document.getElementById('rfa-sell-date').value;\n  const costAtSale    = p.costo ? Number(p.costo) : 0;\n\n  document.getElementById('rfa-sell-modal').style.display = 'none';\n  const res = await apiPost('sell', { id:pendingSellId, soldPrice, soldBy:currentSeller, customerName, customerPhone, saleDate, costAtSale });\n  pendingSellId = null;\n  if (res.ok) {\n    toast('\u2713 Venta registrada');\n    await apiLoad();\n    renderCounters();\n    renderInventory();\n    \/\/ Sync cat\u00e1logo p\u00fablico\n    catalogData = adminState.inventory.filter(p2=>p2.status==='disponible');\n    renderCatalog(document.querySelector('#catalog-filter .chip.is-active')?.dataset?.cat||'todos');\n  } else {\n    toast('\u2717 Error al registrar venta', 'err');\n  }\n}\n\n\/* ---- Delete modal ---- *\/\nfunction openDelModal(id) {\n  const p = adminState.inventory.find(x=>x.id===id);\n  if (!p) return;\n  pendingDelId = id;\n  document.getElementById('rfa-del-desc').textContent = '\u00bfEliminar '+p.modelo+'? Esta acci\u00f3n no se puede deshacer.';\n  document.getElementById('rfa-del-modal').style.display = 'flex';\n}\n\nasync function confirmDelete() {\n  document.getElementById('rfa-del-modal').style.display = 'none';\n  const ok = await apiDelete(pendingDelId);\n  pendingDelId = null;\n  if (ok) {\n    toast('Equipo eliminado');\n    await apiLoad();\n    renderCounters();\n    renderInventory();\n    catalogData = adminState.inventory.filter(p=>p.status==='disponible');\n    renderCatalog(document.querySelector('#catalog-filter .chip.is-active')?.dataset?.cat||'todos');\n  } else {\n    toast('\u2717 Error al eliminar', 'err');\n  }\n}\n\n\/* ---- Unsell ---- *\/\nfunction openUnsellModal(saleId) {\n  pendingUnsellId = saleId;\n  document.getElementById('rfa-unsell-modal').style.display = 'flex';\n}\n\nasync function confirmUnsell() {\n  document.getElementById('rfa-unsell-modal').style.display = 'none';\n  const res = await apiPost('unsell', { saleId:pendingUnsellId, reversedBy:currentSeller });\n  pendingUnsellId = null;\n  if (res.ok) {\n    toast('\u2713 Venta anulada \u2014 equipo disponible');\n    await apiLoad();\n    renderCounters();\n    renderInventory();\n    renderSales();\n    catalogData = adminState.inventory.filter(p=>p.status==='disponible');\n    renderCatalog(document.querySelector('#catalog-filter .chip.is-active')?.dataset?.cat||'todos');\n  } else {\n    toast('\u2717 Error al anular venta', 'err');\n  }\n}\n\n\/* ---- Sales ---- *\/\nfunction renderSales() {\n  const list   = document.getElementById('rfa-ventas-list');\n  const empty  = document.getElementById('rfa-ventas-empty');\n  const q      = (document.getElementById('rfa-ventas-search').value||'').toLowerCase();\n  const stF    = document.getElementById('rfa-ventas-filter-status').value;\n  const selF   = document.getElementById('rfa-ventas-filter-seller').value;\n  const sort   = document.getElementById('rfa-ventas-sort').value;\n  const desde  = document.getElementById('rfa-ventas-desde').value;\n  const hasta  = document.getElementById('rfa-ventas-hasta').value;\n  list.innerHTML = '';\n\n  \/\/ Populate seller filter\n  const sellerSel = document.getElementById('rfa-ventas-filter-seller');\n  const sellers   = [...new Set(adminState.sales.map(s=>s.soldBy||s.seller).filter(Boolean))];\n  const curSel    = sellerSel.value;\n  sellerSel.innerHTML = '<option value=\"todos\">Todos los vendedores<\/option>' +\n    sellers.map(s=>`<option value=\"${s}\"${s===curSel?' selected':''}>${s}<\/option>`).join('');\n\n  let sales = adminState.sales.filter(s => {\n    const status = s.status || 'activa';\n    if (stF !== 'todos' && status !== stF) return false;\n    if (selF !== 'todos' && (s.soldBy||s.seller) !== selF) return false;\n    if (q) {\n      const hay = [s.modelo,s.customerName,s.customerPhone,s.folio,s.soldBy||s.seller].filter(Boolean).join(' ').toLowerCase();\n      if (!hay.includes(q)) return false;\n    }\n    if (desde || hasta) {\n      const d = s.saleDate || (s.date ? new Date(s.date).toISOString().split('T')[0] : null);\n      if (desde && d && d < desde) return false;\n      if (hasta &#038;&#038; d &#038;&#038; d > hasta) return false;\n    }\n    return true;\n  });\n\n  \/\/ Sort\n  sales.sort((a,b) => {\n    const dateA = a.saleDate||new Date(a.date||0).toISOString().split('T')[0];\n    const dateB = b.saleDate||new Date(b.date||0).toISOString().split('T')[0];\n    switch(sort) {\n      case 'fecha_asc':    return dateA.localeCompare(dateB);\n      case 'fecha_desc':   return dateB.localeCompare(dateA);\n      case 'precio_desc':  return (b.soldPrice||b.price||0)-(a.soldPrice||a.price||0);\n      case 'precio_asc':   return (a.soldPrice||a.price||0)-(b.soldPrice||b.price||0);\n      case 'margen_desc':  return (b.margin||0)-(a.margin||0);\n      case 'margen_asc':   return (a.margin||0)-(b.margin||0);\n      case 'vendedor_az':  return (a.soldBy||a.seller||'').localeCompare(b.soldBy||b.seller||'');\n      case 'modelo_az':    return (a.modelo||'').localeCompare(b.modelo||'');\n      default:             return dateB.localeCompare(dateA);\n    }\n  });\n\n  \/\/ Summary (solo activas)\n  const activas = sales.filter(s=>(s.status||'activa')==='activa');\n  const totalVendido = activas.reduce((s,v)=>s+(v.soldPrice||v.price||0),0);\n  const totalMargen  = activas.reduce((s,v)=>s+(v.margin||0),0);\n  const ticketProm   = activas.length ? totalVendido\/activas.length : 0;\n  document.getElementById('vs-count').textContent  = activas.length;\n  document.getElementById('vs-total').textContent  = fmxn(totalVendido);\n  document.getElementById('vs-margen').textContent = fmxn(totalMargen);\n  document.getElementById('vs-ticket').textContent = fmxn(ticketProm);\n\n  if (!sales.length) { empty.style.display='block'; return; }\n  empty.style.display = 'none';\n\n  sales.forEach(v => {\n    const status = v.status||'activa';\n    const isAnulada = status==='anulada';\n    const price = v.soldPrice||v.price||0;\n    const seller = v.soldBy||v.seller||'\u2014';\n    const div = document.createElement('div');\n    div.className = 'rfa-sale-item' + (isAnulada?' is-anulada':'');\n    div.innerHTML = `\n      <div class=\"rfa-sale-top\">\n        <div>\n          <div class=\"rfa-sale-model\">${v.modelo||'\u2014'}${v.gb&&v.gb!=='-'?' \u00b7 '+v.gb+' GB':''}${isAnulada?' <span class=\"rfa-status-badge vendido\" style=\"font-size:.6rem;\">Anulada<\/span>':''}<\/div>\n          <div class=\"rfa-sale-meta\">\n            ${v.customerName?`<span>&#x1f464; ${v.customerName}<\/span>`:''}\n            ${v.customerPhone?`<span>&#x1f4f1; ${v.customerPhone}<\/span>`:''}\n            <span>&#x1f9d1;&#x200d;&#x1f4bc; ${seller}<\/span>\n            <span>&#x1f4c5; ${fdate(v.saleDate||v.date)}<\/span>\n            ${v.folio?`<span style=\"opacity:.55;\">${v.folio}<\/span>`:''}\n          <\/div>\n          ${v.margin?`<div class=\"rfa-sale-margin\">Margen: ${fmxn(v.margin)}<\/div>`:''}\n        <\/div>\n        <div class=\"rfa-sale-price${isAnulada?' is-anulada':''}\">${fmxn(price)}<\/div>\n      <\/div>\n      ${!isAnulada ? `<div class=\"rfa-sale-actions\"><button class=\"rfa-btn rfa-btn--ghost rfa-btn--sm\" onclick=\"openUnsellModal('${v.id}')\">&#x21a9; Desvender<\/button><\/div>` : ''}`;\n    list.appendChild(div);\n  });\n}\n\n\/* ---- Stats ---- *\/\nfunction renderStats() {\n  const inv   = adminState.inventory;\n  const sales = adminState.sales.filter(s=>(s.status||'activa')==='activa');\n  const total = sales.reduce((s,v)=>s+(v.soldPrice||v.price||0),0);\n  const margen= sales.reduce((s,v)=>s+(v.margin||0),0);\n  const sellers = {};\n  sales.forEach(v=>{ const s=v.soldBy||v.seller||'?'; sellers[s]=(sellers[s]||0)+1; });\n  const top = Object.entries(sellers).sort((a,b)=>b[1]-a[1])[0];\n  document.getElementById('rfa-stats').innerHTML = [\n    ['Disponibles', inv.filter(p=>(p.status||'disponible')==='disponible').length],\n    ['Apartados',   inv.filter(p=>p.status==='apartado').length],\n    ['Vendidos',    inv.filter(p=>p.status==='vendido').length],\n    ['Ventas activas', sales.length],\n    ['Total vendido', fmxn(total)],\n    ['Ganancia total', fmxn(margen)],\n    ['Vendedor #1', top ? `${top[0]} (${top[1]})` : '\u2014'],\n  ].map(([k,v])=>`<div class=\"rfa-stat-row\"><span>${k}<\/span><span class=\"rfa-stat-val\">${v}<\/span><\/div>`).join('');\n}\n\n\/* ---- Export \/ Import ---- *\/\nfunction exportData() {\n  const blob = new Blob([JSON.stringify(adminState,null,2)],{type:'application\/json'});\n  const url  = URL.createObjectURL(blob);\n  const a    = document.createElement('a');\n  a.href=url; a.download='rolling-fix-'+new Date().toISOString().slice(0,10)+'.json';\n  a.click(); URL.revokeObjectURL(url);\n}\n\nasync function importData(e) {\n  const file = e.target.files[0];\n  if (!file) return;\n  const reader = new FileReader();\n  reader.onload = async ev => {\n    try {\n      const data = JSON.parse(ev.target.result);\n      if (!data.inventory||!data.sales) throw new Error('Formato inv\u00e1lido');\n      const res = await apiPost('import', data);\n      if (res.ok) {\n        const msg = document.getElementById('rfa-import-msg');\n        msg.textContent = '\u2713 Importados: '+data.inventory.length+' equipos, '+data.sales.length+' ventas';\n        msg.style.display = 'block';\n        toast('\u2713 Datos importados');\n        await apiLoad();\n        renderStats();\n        setTimeout(()=>{msg.style.display='none';},4000);\n      } else { toast('\u2717 Error al importar','err'); }\n    } catch(err) { toast('\u2717 Formato inv\u00e1lido','err'); }\n  };\n  reader.readAsText(file);\n  e.target.value = '';\n}\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>ROLLING\u00b7FIX Inicio Servicios Cotizar Ubicaci\u00f3n Contactar Contactar Plaza Tec \u00b7 Av. del Estado 215A \u00b7 Col. Tecnol\u00f3gico Aqu\u00ed tu equipovuelve a rodar Reparaci\u00f3n express de iPhone, Android, iPad y Apple Watch. Equipos Apple en venta. Y si ya no lo usas, te lo compramos al instante. Contactar Ver servicios Cotizar mi equipo Equipos disponibles ahora [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"saved_in_kubio":false,"footnotes":""},"class_list":["post-8","page","type-page","status-publish","hentry"],"kubio_ai_page_context":{"short_desc":"","purpose":"general"},"_links":{"self":[{"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=\/wp\/v2\/pages\/8","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8"}],"version-history":[{"count":1,"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions"}],"predecessor-version":[{"id":10,"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=\/wp\/v2\/pages\/8\/revisions\/10"}],"wp:attachment":[{"href":"https:\/\/rollingfix.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}