{"version":3,"file":"TTGD_v8BL.D0f2O2tj.mjs","names":["React.useContext","React.useMemo","React.Fragment","React.forwardRef","useRef","React.useId"],"sources":["https:/framerusercontent.com/modules/ArcmD9PWqmL0TASfMZw2/LdFHBI0nrmMnOT3OSq6m/TTGD_v8BL.js"],"sourcesContent":["// Generated by Framer (e0809aa)\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{addFonts,ComponentViewportProvider,cx,getFonts,SmartComponentScopedContainer,useComponentViewport,useLocaleInfo,useVariantState,withCSS}from\"framer\";import{LayoutGroup,motion,MotionConfigContext}from\"framer-motion\";import*as React from\"react\";import{useRef}from\"react\";import Embed from\"https://framerusercontent.com/modules/o1PI5S8YtkA5bP5g4dFz/cAPMVEI6osbJ1UvICgTq/Embed.js\";const EmbedFonts=getFonts(Embed);const serializationHash=\"framer-IslDM\";const variantClassNames={tS7SUnhKD:\"framer-v-1035zql\"};function addPropertyOverrides(overrides,...variants){const nextOverrides={};variants?.forEach(variant=>variant&&Object.assign(nextOverrides,overrides[variant]));return nextOverrides;}const transition1={bounce:.2,delay:0,duration:.4,type:\"spring\"};const Transition=({value,children})=>{const config=React.useContext(MotionConfigContext);const transition=value??config.transition;const contextValue=React.useMemo(()=>({...config,transition}),[JSON.stringify(transition)]);return /*#__PURE__*/_jsx(MotionConfigContext.Provider,{value:contextValue,children:children});};const Variants=motion.create(React.Fragment);const getProps=({height,id,width,...props})=>{return{...props};};const createLayoutDependency=(props,variants)=>{if(props.layoutDependency)return variants.join(\"-\")+props.layoutDependency;return variants.join(\"-\");};const Component=/*#__PURE__*/React.forwardRef(function(props,ref){const fallbackRef=useRef(null);const refBinding=ref??fallbackRef;const defaultLayoutId=React.useId();const{activeLocale,setLocale}=useLocaleInfo();const componentViewport=useComponentViewport();const{style,className,layoutId,variant,...restProps}=getProps(props);const{baseVariant,classNames,clearLoadingGesture,gestureHandlers,gestureVariant,isLoading,setGestureState,setVariant,variants}=useVariantState({defaultVariant:\"tS7SUnhKD\",ref:refBinding,variant,variantClassNames});const layoutDependency=createLayoutDependency(props,variants);const sharedStyleClassNames=[];const scopingClassNames=cx(serializationHash,...sharedStyleClassNames);return /*#__PURE__*/_jsx(LayoutGroup,{id:layoutId??defaultLayoutId,children:/*#__PURE__*/_jsx(Variants,{animate:variants,initial:false,children:/*#__PURE__*/_jsx(Transition,{value:transition1,children:/*#__PURE__*/_jsx(motion.div,{...restProps,...gestureHandlers,className:cx(scopingClassNames,\"framer-1035zql\",className,classNames),\"data-framer-name\":\"Variant 1\",layoutDependency:layoutDependency,layoutId:\"tS7SUnhKD\",ref:refBinding,style:{borderBottomLeftRadius:12,borderBottomRightRadius:12,borderTopLeftRadius:12,borderTopRightRadius:12,...style},children:/*#__PURE__*/_jsx(ComponentViewportProvider,{children:/*#__PURE__*/_jsx(SmartComponentScopedContainer,{className:\"framer-obhczk-container\",isAuthoredByUser:true,isModuleExternal:true,layoutDependency:layoutDependency,layoutId:\"jgL1cI4yM-container\",nodeId:\"jgL1cI4yM\",rendersWithMotion:true,scopeId:\"TTGD_v8BL\",children:/*#__PURE__*/_jsx(Embed,{height:\"100%\",html:'<!DOCTYPE html>\\n<html lang=\"en\" data-theme=\"light\">\\n<head>\\n<meta charset=\"UTF-8\">\\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n<title>Movie membership break-even calculator</title>\\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\\n<link href=\"https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600;700;800;900&display=swap\" rel=\"stylesheet\">\\n<style>\\n:root{\\n  --navy:#0D1B2A; --sage:#6F8B7A; --rose:#C17A7A; --gold:#D4A017; --plum:#8E7CA7; --cream:#F7F3EF;\\n  --r-xl:24px; --r-lg:18px; --r-md:12px; --r-sm:8px; --r-pill:999px;\\n  --ease:cubic-bezier(.4,.14,.3,1); --tr:.18s var(--ease);\\n}\\n[data-theme=\"light\"]{\\n  --bg:#FFFFFF; --card:#FFFFFF; --soft:var(--cream); --ink:var(--navy); --muted:#7A8791;\\n  --line:#E5DED5; --line-2:#D4C9BC; --track:#EDE6DD;\\n  --pri:var(--navy); --pri-ink:#FFFFFF;\\n  --data-1:var(--navy); --data-2:var(--sage);\\n  --ok:var(--sage); --ok-bg:#EDF2EF; --ok-ink:#41604E;\\n  --warn-bg:#FAF1DA; --warn-ink:#8A6809;\\n  --shadow-sm:0 4px 16px rgba(13,27,42,.06);\\n}\\n[data-theme=\"dark\"]{\\n  --bg:#0A1621; --card:#122232; --soft:#18293A; --ink:var(--cream); --muted:#93A3B0;\\n  --line:#22364A; --line-2:#33495F; --track:#1F3346;\\n  --pri:var(--cream); --pri-ink:var(--navy);\\n  --data-1:#B7C6D2; --data-2:#8FAE9B;\\n  --ok:#8FAE9B; --ok-bg:#1A2A22; --ok-ink:#A9C9B6;\\n  --warn-bg:#2E2410; --warn-ink:#E7C767;\\n  --shadow-sm:0 6px 18px rgba(0,0,0,.32);\\n}\\n*{box-sizing:border-box}\\nhtml,body{margin:0}\\nbody{\\n  font-family:\\'Montserrat\\',system-ui,-apple-system,sans-serif;\\n  background:var(--bg);color:var(--ink);\\n  -webkit-font-smoothing:antialiased;font-feature-settings:\"tnum\" 1;\\n  transition:background .3s var(--ease),color .3s var(--ease);\\n}\\n:focus-visible{outline:2px solid var(--ink);outline-offset:3px;border-radius:4px}\\n@media (prefers-reduced-motion:reduce){*{transition:none!important}}\\n\\n.embed{padding:4px}\\n.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-xl);padding:26px}\\n@media(max-width:520px){.card{padding:18px}}\\n\\n.hdr{display:flex;align-items:flex-start;gap:14px;margin-bottom:22px}\\n.hdr h2{margin:0 0 7px;font-size:19px;font-weight:900;letter-spacing:-.03em;line-height:1.15}\\n.hdr p{margin:0;font-size:12.5px;font-weight:500;color:var(--muted);line-height:1.55;max-width:520px}\\n.icon-btn{\\n  width:34px;height:34px;display:grid;place-items:center;flex:none;margin-left:auto;\\n  background:var(--card);border:1px solid var(--line);border-radius:var(--r-pill);\\n  color:var(--ink);cursor:pointer;transition:var(--tr);\\n}\\n.icon-btn:hover{border-color:var(--ink)}\\n.icon-btn svg{width:16px;height:16px}\\n\\n.ctrls{display:flex;flex-wrap:wrap;gap:22px;align-items:flex-end}\\n.ctrl{flex:1;min-width:230px}\\n.flabel{display:block;font-size:11px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:9px}\\n.seg{display:inline-flex;background:var(--soft);border:1px solid var(--line);border-radius:var(--r-pill);padding:4px;gap:3px;flex-wrap:wrap}\\n.seg button{\\n  font:inherit;font-size:12.5px;font-weight:700;color:var(--muted);\\n  background:none;border:0;padding:8px 15px;border-radius:var(--r-pill);cursor:pointer;transition:var(--tr);\\n}\\n.seg button.on{background:var(--card);color:var(--ink);box-shadow:var(--shadow-sm)}\\n.slider-row{display:flex;align-items:center;gap:15px}\\ninput[type=range]{\\n  -webkit-appearance:none;appearance:none;flex:1;height:8px;border-radius:var(--r-pill);\\n  background:var(--track);outline:none;cursor:pointer;\\n}\\ninput[type=range]::-webkit-slider-thumb{\\n  -webkit-appearance:none;width:22px;height:22px;border-radius:50%;\\n  background:var(--pri);border:3px solid var(--card);box-shadow:var(--shadow-sm);cursor:pointer;\\n}\\ninput[type=range]::-moz-range-thumb{\\n  width:22px;height:22px;border-radius:50%;background:var(--pri);\\n  border:3px solid var(--card);box-shadow:var(--shadow-sm);cursor:pointer;\\n}\\n.slider-val{font-size:30px;font-weight:900;letter-spacing:-.035em;line-height:1;width:46px;text-align:right;flex:none}\\n\\n.verdict{\\n  display:flex;align-items:center;gap:15px;padding:17px 19px;border-radius:var(--r-lg);\\n  background:var(--ok-bg);color:var(--ok-ink);margin:22px 0 20px;\\n}\\n.verdict svg{width:22px;height:22px;flex:none}\\n.verdict strong{display:block;font-size:14px;font-weight:800;letter-spacing:-.01em;margin-bottom:3px}\\n.verdict p{margin:0;font-size:12.5px;font-weight:500;opacity:.88;line-height:1.5}\\n\\n.pbar{display:flex;align-items:center;gap:13px;margin-bottom:15px}\\n.pbar:last-child{margin-bottom:0}\\n.pbar .name{font-size:12.5px;font-weight:700;width:190px;flex:none;display:flex;align-items:center;gap:8px}\\n.pbar .track{flex:1;height:11px;border-radius:var(--r-pill);background:var(--track);overflow:hidden;min-width:40px}\\n.pbar .fill{height:100%;border-radius:var(--r-pill);background:var(--data-1);transition:width .45s var(--ease)}\\n.pbar .fill.best{background:var(--data-2)}\\n.pbar .amt{font-size:13px;font-weight:800;width:112px;text-align:right;flex:none;letter-spacing:-.01em}\\n.pbar .amt small{display:block;font-size:10.5px;font-weight:600;color:var(--muted);letter-spacing:0;margin-top:2px}\\n@media(max-width:700px){\\n  .pbar{flex-wrap:wrap;gap:6px 13px;margin-bottom:18px}\\n  .pbar .name{width:100%}\\n  .pbar .amt{width:auto;text-align:left;order:3;display:flex;align-items:baseline;gap:8px}\\n  .pbar .amt small{display:inline;margin-top:0}\\n  .pbar .track{order:2;flex-basis:100%}\\n}\\n@media(max-width:520px){\\n  .hdr{flex-wrap:wrap}\\n  .hdr h2{font-size:17px}\\n  .ctrls{gap:18px}\\n  .ctrl{min-width:100%}\\n  .seg{display:flex;width:100%}\\n  .seg button{flex:1;padding:9px 8px;justify-content:center}\\n  .slider-val{font-size:26px;width:38px}\\n  .verdict{align-items:flex-start;padding:15px 16px}\\n  .editbar{gap:8px}\\n  .btn{flex:1;justify-content:center;padding:10px 12px}\\n  .editor{padding:16px}\\n  .grid{grid-template-columns:repeat(2,1fr);gap:12px}\\n}\\n@media(max-width:380px){\\n  .grid{grid-template-columns:1fr}\\n}\\n.badge{\\n  display:inline-flex;align-items:center;font-size:10.5px;font-weight:800;padding:4px 9px;\\n  border-radius:var(--r-pill);background:var(--ok-bg);color:var(--ok-ink);white-space:nowrap;\\n}\\n.badge.edited{background:var(--warn-bg);color:var(--warn-ink)}\\n\\n/* ---- price editor ---- */\\n.editbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:22px;padding-top:18px;border-top:1px solid var(--line)}\\n.btn{\\n  font:inherit;font-size:12.5px;font-weight:700;color:var(--ink);\\n  display:inline-flex;align-items:center;gap:8px;\\n  background:var(--soft);border:1px solid var(--line);border-radius:var(--r-pill);\\n  padding:9px 16px;cursor:pointer;transition:var(--tr);\\n}\\n.btn:hover{border-color:var(--ink)}\\n.btn svg{width:14px;height:14px;transition:var(--tr)}\\n.btn.open svg.chev{transform:rotate(180deg)}\\n.btn.ghost{background:transparent;color:var(--muted);border-color:transparent}\\n.btn.ghost:hover{background:var(--soft);color:var(--ink);border-color:transparent}\\n\\n.editor{display:none;margin-top:18px;background:var(--soft);border:1px solid var(--line);border-radius:var(--r-lg);padding:20px}\\n.editor.show{display:block}\\n.editor h3{margin:0 0 5px;font-size:13px;font-weight:800;letter-spacing:-.01em}\\n.editor .hint{margin:0 0 18px;font-size:11.5px;font-weight:500;color:var(--muted);line-height:1.55}\\n.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px}\\n.fieldset{margin-bottom:20px}\\n.fieldset:last-of-type{margin-bottom:0}\\n.fieldset > span{display:block;font-size:10px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:11px}\\n.f label{display:block;font-size:11.5px;font-weight:700;color:var(--ink);margin-bottom:6px}\\n.inwrap{position:relative}\\n.inwrap .pre{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:13px;font-weight:700;color:var(--muted);pointer-events:none}\\n.inwrap .suf{position:absolute;right:12px;top:50%;transform:translateY(-50%);font-size:12px;font-weight:700;color:var(--muted);pointer-events:none}\\n.editor input[type=number]{\\n  width:100%;font:inherit;font-size:14px;font-weight:700;color:var(--ink);\\n  background:var(--card);border:1px solid var(--line-2);border-radius:var(--r-md);\\n  padding:10px 12px 10px 26px;transition:var(--tr);-moz-appearance:textfield;\\n}\\n.editor input.pct{padding:10px 34px 10px 12px}\\n.editor input[type=number]::-webkit-outer-spin-button,\\n.editor input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\\n.editor input[type=number]:focus{outline:0;border-color:var(--ink)}\\n.editor input[type=number].dirty{border-color:var(--ok);background:var(--ok-bg)}\\n\\n.note{font-size:11.5px;font-weight:500;color:var(--muted);line-height:1.65;margin:20px 0 0;padding-top:18px;border-top:1px solid var(--line)}\\n.note b{font-weight:800;color:var(--ink)}\\n</style>\\n</head>\\n<body>\\n<div class=\"embed\">\\n  <div class=\"card\">\\n\\n    <div class=\"hdr\">\\n      <div>\\n        <h2>Which membership actually pays you back</h2>\\n        <p>Set the slider to your real habit. The bars show what one month costs under each plan. Prices default to 2026 national averages, and you can swap in your own.</p>\\n      </div>\\n      <button class=\"icon-btn\" onclick=\"toggleTheme()\" aria-label=\"Switch theme\">\\n        <svg id=\"themeIcon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z\"/></svg>\\n      </button>\\n    </div>\\n\\n    <div class=\"ctrls\">\\n      <div class=\"ctrl\">\\n        <span class=\"flabel\">Movies per month</span>\\n        <div class=\"slider-row\">\\n          <input type=\"range\" id=\"cnt\" min=\"1\" max=\"10\" value=\"2\" aria-label=\"Movies per month\">\\n          <span class=\"slider-val\" id=\"cntVal\">2</span>\\n        </div>\\n      </div>\\n      <div class=\"ctrl\">\\n        <span class=\"flabel\">How you usually watch</span>\\n        <div class=\"seg\" id=\"fmtSeg\">\\n          <button data-f=\"std\" class=\"on\">Standard</button>\\n          <button data-f=\"plf\">Big screen</button>\\n          <button data-f=\"imax\">IMAX</button>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=\"verdict\">\\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m9 12 2 2 4-4\"/></svg>\\n      <div><strong id=\"vTitle\"></strong><p id=\"vBody\"></p></div>\\n    </div>\\n\\n    <div id=\"bars\"></div>\\n\\n    <div class=\"editbar\">\\n      <button class=\"btn\" id=\"editBtn\" aria-expanded=\"false\" aria-controls=\"editor\">\\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.1 2.1 0 0 1 3 3L12 15l-4 1 1-4z\"/></svg>\\n        Use your own prices\\n        <svg class=\"chev\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\\n      </button>\\n      <span class=\"badge edited\" id=\"dirtyFlag\" style=\"display:none\">Using your numbers</span>\\n      <button class=\"btn ghost\" id=\"resetBtn\" style=\"display:none\">Reset to defaults</button>\\n    </div>\\n\\n    <div class=\"editor\" id=\"editor\">\\n      <h3>Your local prices</h3>\\n      <p class=\"hint\">Membership pricing moves around and ticket prices are wildly local. Put in what you actually pay and the bars recalculate as you type. Nothing is saved, so a refresh puts the defaults back.</p>\\n\\n      <div class=\"fieldset\">\\n        <span>Ticket prices where you live</span>\\n        <div class=\"grid\">\\n          <div class=\"f\"><label for=\"p_std\">Standard</label><div class=\"inwrap\"><span class=\"pre\">$</span><input type=\"number\" id=\"p_std\" data-path=\"ticket.std\" min=\"0\" max=\"99\" step=\"0.01\"></div></div>\\n          <div class=\"f\"><label for=\"p_plf\">Big screen</label><div class=\"inwrap\"><span class=\"pre\">$</span><input type=\"number\" id=\"p_plf\" data-path=\"ticket.plf\" min=\"0\" max=\"99\" step=\"0.01\"></div></div>\\n          <div class=\"f\"><label for=\"p_imax\">IMAX</label><div class=\"inwrap\"><span class=\"pre\">$</span><input type=\"number\" id=\"p_imax\" data-path=\"ticket.imax\" min=\"0\" max=\"99\" step=\"0.01\"></div></div>\\n          <div class=\"f\"><label for=\"p_disc\">Midweek discount</label><div class=\"inwrap\"><input class=\"pct\" type=\"number\" id=\"p_disc\" data-path=\"discount\" min=\"0\" max=\"100\" step=\"1\"><span class=\"suf\">%</span></div></div>\\n        </div>\\n      </div>\\n\\n      <div class=\"fieldset\">\\n        <span>Monthly membership fees</span>\\n        <div class=\"grid\">\\n          <div class=\"f\"><label for=\"f_marcus\">Marcus Movie Club</label><div class=\"inwrap\"><span class=\"pre\">$</span><input type=\"number\" id=\"f_marcus\" data-path=\"fees.marcus\" min=\"0\" max=\"999\" step=\"0.01\"></div></div>\\n          <div class=\"f\"><label for=\"f_cinemark\">Cinemark Movie Club</label><div class=\"inwrap\"><span class=\"pre\">$</span><input type=\"number\" id=\"f_cinemark\" data-path=\"fees.cinemark\" min=\"0\" max=\"999\" step=\"0.01\"></div></div>\\n          <div class=\"f\"><label for=\"f_regal\">Regal Unlimited</label><div class=\"inwrap\"><span class=\"pre\">$</span><input type=\"number\" id=\"f_regal\" data-path=\"fees.regal\" min=\"0\" max=\"999\" step=\"0.01\"></div></div>\\n          <div class=\"f\"><label for=\"f_alist\">AMC Stubs A-List</label><div class=\"inwrap\"><span class=\"pre\">$</span><input type=\"number\" id=\"f_alist\" data-path=\"fees.alist\" min=\"0\" max=\"999\" step=\"0.01\"></div></div>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <p class=\"note\" id=\"assump\"></p>\\n\\n  </div>\\n</div>\\n\\n<script>\\n/* ============================================================\\n   CONFIG — defaults are 2026 national averages\\n   ============================================================ */\\nconst DEFAULTS={\\n  ticket:{std:12.75, plf:18.26, imax:20.57},\\n  discount:50,\\n  fees:{marcus:9.99, cinemark:11.99, regal:25.99, alist:29.99}\\n};\\nlet cfg=JSON.parse(JSON.stringify(DEFAULTS));\\n\\n/* premium upcharge over a standard seat, never negative */\\nfunction delta(f,c){return Math.max(0, c.ticket[f]-c.ticket.std);}\\n\\nconst PLANS=[\\n  {key:\\'free\\',     name:\\'Free tier + half&#8209;off midweek\\',\\n   cost:(n,f,c)=>n*(c.ticket.std*(1-c.discount/100)+delta(f,c))},\\n  {key:\\'marcus\\',   name:\\'Marcus Movie Club\\',\\n   cost:(n,f,c)=>c.fees.marcus*Math.max(n,1)+n*delta(f,c)},\\n  {key:\\'cinemark\\', name:\\'Cinemark Movie Club\\',\\n   cost:(n,f,c)=>c.fees.cinemark*Math.max(n,1)+n*delta(f,c)},\\n  {key:\\'regal\\',    name:\\'Regal Unlimited\\',\\n   cost:(n,f,c)=>c.fees.regal+n*delta(f,c)},\\n  {key:\\'alist\\',    name:\\'AMC Stubs A&#8209;List\\',\\n   cost:(n,f,c)=>c.fees.alist},\\n  {key:\\'payg\\',     name:\\'No membership at all\\',\\n   cost:(n,f,c)=>n*c.ticket[f]}\\n];\\n\\nlet count=2, fmt=\\'std\\';\\nconst $=id=>document.getElementById(id);\\nconst money=v=>\\'$\\'+v.toFixed(2);\\nconst FMT_NAME={std:\\'a standard screen\\',plf:\\'a premium large format screen\\',imax:\\'IMAX\\'};\\n\\n/* ============================================================\\n   CONFIG PLUMBING\\n   ============================================================ */\\nconst get=path=>path.split(\\'.\\').reduce((o,k)=>o[k],cfg);\\nconst getDefault=path=>path.split(\\'.\\').reduce((o,k)=>o[k],DEFAULTS);\\nconst set=(path,v)=>{\\n  const keys=path.split(\\'.\\'), last=keys.pop();\\n  keys.reduce((o,k)=>o[k],cfg)[last]=v;\\n};\\n\\nfunction fillInputs(){\\n  document.querySelectorAll(\\'[data-path]\\').forEach(el=>{\\n    el.value=get(el.dataset.path);\\n    el.classList.remove(\\'dirty\\');\\n  });\\n}\\n\\nfunction isDirty(){\\n  return [...document.querySelectorAll(\\'[data-path]\\')]\\n    .some(el=>get(el.dataset.path)!==getDefault(el.dataset.path));\\n}\\n\\ndocument.querySelectorAll(\\'[data-path]\\').forEach(el=>{\\n  el.addEventListener(\\'input\\',()=>{\\n    const path=el.dataset.path;\\n    const raw=parseFloat(el.value);\\n    const min=parseFloat(el.min), max=parseFloat(el.max);\\n    /* an empty or half-typed box falls back to the default instead of breaking the math */\\n    let v=Number.isFinite(raw)?raw:getDefault(path);\\n    v=Math.min(Math.max(v,min),max);\\n    set(path,v);\\n    el.classList.toggle(\\'dirty\\', v!==getDefault(path));\\n    render();\\n  });\\n  el.addEventListener(\\'blur\\',()=>{\\n    /* tidy the box on the way out, without fighting the user mid-type */\\n    el.value=get(el.dataset.path);\\n  });\\n});\\n\\n$(\\'editBtn\\').addEventListener(\\'click\\',()=>{\\n  const open=$(\\'editor\\').classList.toggle(\\'show\\');\\n  $(\\'editBtn\\').classList.toggle(\\'open\\',open);\\n  $(\\'editBtn\\').setAttribute(\\'aria-expanded\\',open);\\n  sizeUp();\\n});\\n\\n$(\\'resetBtn\\').addEventListener(\\'click\\',()=>{\\n  cfg=JSON.parse(JSON.stringify(DEFAULTS));\\n  fillInputs();\\n  render();\\n});\\n\\n/* ============================================================\\n   RENDER\\n   ============================================================ */\\nfunction render(){\\n  const rows=PLANS.map(p=>({...p,total:p.cost(count,fmt,cfg)})).sort((a,b)=>a.total-b.total);\\n  const max=Math.max(...rows.map(r=>r.total),0.01);\\n  const best=rows[0], runner=rows[1];\\n\\n  $(\\'bars\\').innerHTML=rows.map((r,i)=>`\\n    <div class=\"pbar\">\\n      <span class=\"name\">${r.name}${i===0?\\' <span class=\"badge\">Cheapest</span>\\':\\'\\'}</span>\\n      <div class=\"track\"><div class=\"fill${i===0?\\' best\\':\\'\\'}\" style=\"width:${Math.max((r.total/max)*100,3)}%\"></div></div>\\n      <span class=\"amt\">${money(r.total)}<small>${money(r.total/count)} per movie</small></span>\\n    </div>`).join(\\'\\');\\n\\n  const gap=runner.total-best.total;\\n  $(\\'vTitle\\').innerHTML=`${best.name} wins at ${count} ${count===1?\\'movie\\':\\'movies\\'} a month`;\\n  $(\\'vBody\\').innerHTML=`${money(best.total)} a month on ${FMT_NAME[fmt]}, or ${money(best.total/count)} a ticket. `+\\n    (gap<1.5\\n      ? `${runner.name} is within ${money(gap)} of it, so pick on convenience, not price.`\\n      : `Next closest is ${runner.name} at ${money(runner.total)}, a gap of ${money(gap)} every month.`);\\n\\n  const dirty=isDirty();\\n  $(\\'dirtyFlag\\').style.display=dirty?\\'inline-flex\\':\\'none\\';\\n  $(\\'resetBtn\\').style.display=dirty?\\'inline-flex\\':\\'none\\';\\n\\n  $(\\'assump\\').innerHTML=`<b>The math:</b> `+\\n    (dirty\\n      ? `your own figures, currently ${money(cfg.ticket.std)} standard, ${money(cfg.ticket.plf)} premium large format and ${money(cfg.ticket.imax)} IMAX, with a ${cfg.discount}% midweek discount.`\\n      : `2026 national averages of $12.75 standard, $18.26 premium large format and $20.57 IMAX, per Cinema United and EntTelligence.`)+\\n    ` The midweek line assumes a Tuesday or Wednesday, when AMC Stubs and Regal Rewards members get the discount off the base adult evening price &mdash; premium upcharges and online fees still apply. `+\\n    `Marcus and Cinemark cover one ticket with the monthly fee, then price extra tickets at the member rate. `+\\n    `A-List is flat up to 16 movies a month with every format included. Regal Unlimited is flat but adds an upcharge on premium screens. Concession savings are not counted here.`;\\n  sizeUp();\\n}\\n\\n$(\\'cnt\\').addEventListener(\\'input\\',e=>{count=+e.target.value;$(\\'cntVal\\').textContent=count;render();});\\n$(\\'fmtSeg\\').addEventListener(\\'click\\',e=>{\\n  const b=e.target.closest(\\'button\\');if(!b)return;\\n  $(\\'fmtSeg\\').querySelectorAll(\\'button\\').forEach(x=>x.classList.remove(\\'on\\'));\\n  b.classList.add(\\'on\\');fmt=b.dataset.f;render();\\n});\\n\\nfunction toggleTheme(){\\n  const html=document.documentElement, dark=html.dataset.theme===\\'dark\\';\\n  html.dataset.theme=dark?\\'light\\':\\'dark\\';\\n  $(\\'themeIcon\\').innerHTML=dark\\n    ?\\'<path d=\"M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z\"/>\\'\\n    :\\'<circle cx=\"12\" cy=\"12\" r=\"4.2\"/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"/>\\';\\n}\\n\\n/* tells a parent page how tall the iframe should be */\\nfunction sizeUp(){\\n  if(window.parent!==window){\\n    window.parent.postMessage({poppEmbed:\\'breakeven-calculator\\',height:document.body.scrollHeight},\\'*\\');\\n  }\\n}\\nwindow.addEventListener(\\'resize\\',sizeUp);\\n\\nfillInputs();\\nrender();\\n</script>\\n</body>\\n</html>',id:\"jgL1cI4yM\",layoutId:\"jgL1cI4yM\",radius:\"0px\",style:{width:\"100%\"},type:\"html\",url:\"\",width:\"100%\",zoom:1})})})})})})});});const css=[\".framer-IslDM.framer-2hx2f1, .framer-IslDM .framer-2hx2f1 { display: block; }\",\".framer-IslDM.framer-1035zql { align-content: center; align-items: center; display: flex; flex-direction: column; flex-wrap: nowrap; gap: 0px; height: min-content; justify-content: flex-start; overflow: var(--overflow-clip-fallback, clip); padding: 0px; position: relative; width: min-content; will-change: var(--framer-will-change-override, transform); }\",\".framer-IslDM .framer-obhczk-container { flex: none; height: auto; position: relative; width: 900px; }\"];/**\n * This is a generated Framer component.\n * @framerIntrinsicHeight 830\n * @framerIntrinsicWidth 900\n * @framerCanvasComponentVariantDetails {\"propertyName\":\"variant\",\"data\":{\"default\":{\"layout\":[\"auto\",\"auto\"]}}}\n * @framerImmutableVariables true\n * @framerDisplayContentsDiv false\n * @framerAutoSizeImages true\n * @framerComponentViewportWidth true\n * @framerColorSyntax true\n */const FramerTTGD_v8BL=withCSS(Component,css,\"framer-IslDM\");export default FramerTTGD_v8BL;FramerTTGD_v8BL.displayName=\"Movie Membership Comparison Calculator\";FramerTTGD_v8BL.defaultProps={height:830,width:900};addFonts(FramerTTGD_v8BL,[{explicitInter:true,fonts:[]},...EmbedFonts],{supportsExplicitInterCodegen:true});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FramerTTGD_v8BL\",\"slots\":[],\"annotations\":{\"framerIntrinsicHeight\":\"830\",\"framerDisplayContentsDiv\":\"false\",\"framerContractVersion\":\"1\",\"framerColorSyntax\":\"true\",\"framerImmutableVariables\":\"true\",\"framerAutoSizeImages\":\"true\",\"framerIntrinsicWidth\":\"900\",\"framerComponentViewportWidth\":\"true\",\"framerCanvasComponentVariantDetails\":\"{\\\"propertyName\\\":\\\"variant\\\",\\\"data\\\":{\\\"default\\\":{\\\"layout\\\":[\\\"auto\\\",\\\"auto\\\"]}}}\"}},\"Props\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TTGD_v8BL.map"],"mappings":"wZAC0C,IAA4J,IAAkE,IAA4B,IAAsI,EAAO,EAAW,EAAS,CAAK,EAAQ,EAAkB,eAAqB,EAAkB,CAAC,UAAU,kBAAkB,EAA+L,EAAY,CAAC,OAAO,GAAG,MAAM,EAAE,SAAS,GAAG,KAAK,QAAQ,EAAQ,GAAY,CAAC,QAAM,cAAY,CAAC,IAAM,EAAOA,EAAiB,CAAmB,EAAQ,EAAW,GAAO,EAAO,WAAiB,EAAaC,OAAmB,CAAC,GAAG,EAAO,YAAU,GAAG,CAAC,KAAK,UAAU,CAAU,CAAC,CAAC,EAAE,OAAoB,EAAK,EAAoB,SAAS,CAAC,MAAM,EAAsB,UAAQ,CAAC,CAAE,EAAQ,EAAS,EAAO,OAAOC,CAAc,EAAQ,GAAU,CAAC,SAAO,KAAG,QAAM,GAAG,MAAgB,CAAC,GAAG,CAAK,GAAU,GAAwB,EAAM,IAAe,EAAM,iBAAwB,EAAS,KAAK,GAAG,EAAE,EAAM,iBAAwB,EAAS,KAAK,GAAG,EAUx1C,EAAgB,EAVy2CC,EAAiB,SAAS,EAAM,EAAI,CAAC,IAAM,EAAYC,EAAO,IAAI,EAAQ,EAAW,GAAK,EAAkB,EAAgBC,EAAY,EAAO,CAAC,eAAa,aAAW,EAAc,EAA0B,EAAqB,EAAE,GAAK,CAAC,QAAM,YAAU,WAAS,UAAQ,GAAG,GAAW,EAAS,CAAK,EAAO,CAAC,cAAY,aAAW,sBAAoB,kBAAgB,iBAAe,YAAU,kBAAgB,aAAW,YAAU,EAAgB,CAAC,eAAe,YAAY,IAAI,EAAW,UAAQ,mBAAiB,CAAC,EAAQ,EAAiB,EAAuB,EAAM,CAAQ,EAAuC,EAAkB,EAAG,CAA0C,EAAE,OAAoB,EAAK,EAAY,CAAC,GAAG,GAAU,EAAgB,SAAsB,EAAK,EAAS,CAAC,QAAQ,EAAS,QAAQ,GAAM,SAAsB,EAAK,EAAW,CAAC,MAAM,EAAY,SAAsB,EAAK,EAAO,IAAI,CAAC,GAAG,EAAU,GAAG,EAAgB,UAAU,EAAG,EAAkB,iBAAiB,EAAU,CAAU,EAAE,mBAAmB,YAA6B,mBAAiB,SAAS,YAAY,IAAI,EAAW,MAAM,CAAC,uBAAuB,GAAG,wBAAwB,GAAG,oBAAoB,GAAG,qBAAqB,GAAG,GAAG,CAAK,EAAE,SAAsB,EAAK,EAA0B,CAAC,SAAsB,EAAK,EAA8B,CAAC,UAAU,0BAA0B,iBAAiB,GAAK,iBAAiB,GAAsB,mBAAiB,SAAS,sBAAsB,OAAO,YAAY,kBAAkB,GAAK,QAAQ,YAAY,SAAsB,EAAK,EAAM,CAAC,OAAO,OAAO,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAA21nB,GAAG,YAAY,SAAS,YAAY,OAAO,MAAM,MAAM,CAAC,MAAM,MAAM,EAAE,KAAK,OAAO,IAAI,GAAG,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAUh3tB,EAAE,CAV43tB,gFAAgF,sWAAsW,wGAUhzuB,EAAE,cAAc,EAAiC,EAAgB,YAAY,yCAAyC,EAAgB,aAAa,CAAC,OAAO,IAAI,MAAM,GAAG,EAAE,EAAS,EAAgB,CAAC,CAAC,cAAc,GAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAU,EAAE,CAAC,6BAA6B,EAAI,CAAC,EACpT,EAAqB,CAAC,QAAU,CAAC,QAAU,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,MAAQ,CAAC,EAAE,YAAc,CAAC,sBAAwB,MAAM,yBAA2B,QAAQ,sBAAwB,IAAI,kBAAoB,OAAO,yBAA2B,OAAO,qBAAuB,OAAO,qBAAuB,MAAM,6BAA+B,OAAO,oCAAsC,0EAAwF,CAAC,EAAE,MAAQ,CAAC,KAAO,SAAS,YAAc,CAAC,sBAAwB,GAAG,CAAC,EAAE,mBAAqB,CAAC,KAAO,UAAU,CAAC,CAAC"}