Files
2026-06-10 11:48:40 +02:00

9 lines
23 KiB
JavaScript

(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode("._wrapper_8in6g_1{--gc-bg: var(--color-bg, #0a0a0f);--gc-bg-secondary: var(--color-bg-secondary, #12121a);--gc-text: var(--color-text, #e8e8ec);--gc-text-muted: var(--color-text-muted, #9999a8);--gc-primary: var(--color-primary, #6366f1);--gc-accent: var(--color-accent, #22d3ee);--gc-border: var(--color-border, #2a2a3a);--gc-font-main: var(--font-main, system-ui, sans-serif);--gc-font-display: var(--font-display, var(--gc-font-main));--gc-font-mono: var(--font-mono, monospace);--gc-shell-padding: clamp(8px, 2vw, 18px);width:100%;min-height:100dvh;display:grid;place-items:center;padding:var(--gc-shell-padding);box-sizing:border-box}._wrapper_8in6g_1 *,._wrapper_8in6g_1 *:before,._wrapper_8in6g_1 *:after{box-sizing:inherit}._frame_8in6g_27{position:relative;width:min(100%,calc((100dvh - (var(--gc-shell-padding) * 2)) * 16 / 9));max-height:calc(100dvh - (var(--gc-shell-padding) * 2));aspect-ratio:16 / 9;display:grid;grid-template-rows:auto minmax(0,1fr) auto auto;gap:.5em;overflow:hidden;padding:1em;color:var(--gc-text);font-family:var(--gc-font-main);font-size:clamp(10px,1.12cqw,18px);line-height:1.25;background:radial-gradient(circle at 12% 10%,color-mix(in srgb,var(--gc-primary) 26%,transparent),transparent 34%),radial-gradient(circle at 86% 16%,color-mix(in srgb,var(--gc-accent) 18%,transparent),transparent 30%),linear-gradient(145deg,var(--gc-bg),var(--gc-bg-secondary));border:1px solid color-mix(in srgb,var(--gc-border) 74%,transparent);box-shadow:inset 0 0 0 1px #ffffff0a,0 18px 48px #00000057;container-type:inline-size}._header_8in6g_52,._stageGrid_8in6g_53,._readoutRow_8in6g_54,._proofHeader_8in6g_55,._timeline_8in6g_56,._controls_8in6g_57,._legend_8in6g_58,._meter_8in6g_59{display:flex;align-items:center}._header_8in6g_52,._readoutRow_8in6g_54,._proofHeader_8in6g_55,._meter_8in6g_59{justify-content:space-between;gap:1em}._label_8in6g_72{display:block;margin:0 0 .25em;color:color-mix(in srgb,var(--gc-accent) 80%,white);font-family:var(--gc-font-mono);font-size:.62em;font-weight:600;letter-spacing:.14em;text-transform:uppercase}._controls_8in6g_57{gap:.45em;justify-content:stretch;width:100%}._iconButton_8in6g_89,._modeButton_8in6g_90,._completeButton_8in6g_91{border:1px solid color-mix(in srgb,var(--gc-border) 78%,transparent);color:var(--gc-text);font:inherit;font-family:var(--gc-font-mono);font-size:.68em;font-weight:600;letter-spacing:.08em;text-transform:uppercase;cursor:pointer;transition:transform .12s ease,border-color .12s ease,background-color .12s ease}._iconButton_8in6g_89:hover,._modeButton_8in6g_90:hover,._completeButton_8in6g_91:hover{transform:translateY(-1px);border-color:color-mix(in srgb,var(--gc-accent) 62%,var(--gc-border))}._iconButton_8in6g_89{min-width:3.7em;min-height:2.75em;background:#0a0e18b8}._modeButton_8in6g_90{min-height:2.75em;padding:0 .85em;background:#0a0e1894}._modeActive_8in6g_123{color:#090b10;background:linear-gradient(90deg,#e7b84f,color-mix(in srgb,var(--gc-accent) 58%,#e7b84f));border-color:#ffffff8f}._stageGrid_8in6g_53{min-height:0;display:grid;grid-template-columns:minmax(0,1.36fr) minmax(12em,.64fr);align-items:stretch;gap:.65em}._wavePanel_8in6g_137,._eventPanel_8in6g_138,._proofPanel_8in6g_139,._timeline_8in6g_56{min-width:0;border:1px solid color-mix(in srgb,var(--gc-border) 76%,transparent);background:#0509128a}._wavePanel_8in6g_137{min-height:0;display:grid;grid-template-rows:auto minmax(0,1fr);gap:.45em;padding:.7em}._year_8in6g_154{display:block;font-family:var(--gc-font-display);font-size:1.85em;line-height:.9}._legend_8in6g_58{gap:.4em;justify-content:end;color:var(--gc-text-muted);font-family:var(--gc-font-mono);font-size:.62em;letter-spacing:.05em;text-transform:uppercase}._legend_8in6g_58 i{display:inline-block;width:.8em;height:.8em;margin-right:0;border-radius:999px}._track_8in6g_179{position:relative;min-height:0;overflow:hidden;border:1px solid color-mix(in srgb,var(--gc-border) 70%,transparent);background:linear-gradient(90deg,rgb(113 166 210 / 6%),transparent 32%,rgb(231 184 79 / 8%) 62%,rgb(126 224 160 / 7%)),#070b11c7}._canvas_8in6g_189{display:block;width:100%;height:100%}._ageMarks_8in6g_195,._stageMarks_8in6g_196{position:absolute;left:7%;right:7%;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));color:#e8e8ec99;font-family:var(--gc-font-mono);font-size:.58em;font-weight:600;letter-spacing:.08em;pointer-events:none;text-transform:uppercase}._ageMarks_8in6g_195{top:.8em}._stageMarks_8in6g_196{bottom:.75em;text-align:center}._eventPanel_8in6g_138{display:flex;align-items:center;justify-content:space-between;flex-direction:row;gap:1em;padding:.9em}._eventPanel_8in6g_138 h3,._proofHeader_8in6g_55 h3{margin:0;color:var(--gc-text);font-family:var(--gc-font-display);letter-spacing:.04em;text-transform:uppercase}._eventPanel_8in6g_138 h3{font-size:1.1em}._eventPanel_8in6g_138 p{display:none;margin:.65em 0 0;color:color-mix(in srgb,var(--gc-text-muted) 86%,white);font-size:.88em}._meter_8in6g_59{margin-top:0;padding-top:0;border-top:0;color:var(--gc-text-muted);font-family:var(--gc-font-mono);font-size:.7em;letter-spacing:.08em;text-transform:uppercase}._meter_8in6g_59 strong{color:#e7b84f;font-family:var(--gc-font-display);font-size:2.2em;letter-spacing:.02em}._timeline_8in6g_56{display:grid;grid-template-columns:minmax(0,1fr) 3.5em;gap:.8em;padding:.62em .8em}._timeline_8in6g_56 ._label_8in6g_72{margin:0}._timeline_8in6g_56 input{width:100%;accent-color:#e7b84f}._timeline_8in6g_56 strong{text-align:right;font-family:var(--gc-font-mono);font-size:.72em}._proofPanel_8in6g_139{display:grid;grid-template-columns:minmax(0,1fr);gap:.8em;padding:.8em}._proofHeader_8in6g_55{grid-column:1 / -1}._proofHeader_8in6g_55 h3{display:none}._modePill_8in6g_304{white-space:nowrap;border:1px solid color-mix(in srgb,var(--gc-border) 72%,transparent);min-width:3em;padding:.45em .7em;color:var(--gc-text-muted);font-family:var(--gc-font-mono);font-size:.62em;letter-spacing:.08em;text-transform:uppercase}._proofActions_8in6g_316{display:flex;align-items:center;gap:.45em}._bars_8in6g_322{display:grid;gap:.45em}._barRow_8in6g_327{display:grid;grid-template-columns:1.3em minmax(0,1fr) 2.2em;align-items:center;gap:.65em;color:var(--gc-text-muted);font-family:var(--gc-font-mono);font-size:.68em;letter-spacing:.05em;text-transform:uppercase}._barTrack_8in6g_339{height:1.35em;overflow:hidden;border:1px solid color-mix(in srgb,var(--gc-border) 76%,transparent);background:#03060cb8}._barFill_8in6g_346{height:100%;transition:width .18s ease}._barRow_8in6g_327 strong{color:var(--gc-text);text-align:right}._silent_8in6g_356{background:#71a6d2}._boomer_8in6g_360{background:#e7b84f}._post_8in6g_364{background:#7ee0a0}._completeButton_8in6g_91{min-height:2.35em;padding:0 .8em;background:color-mix(in srgb,var(--gc-primary) 28%,rgb(5 9 18))}._completeButton_8in6g_91:disabled{cursor:default;opacity:.68;transform:none}@media(orientation:portrait){._frame_8in6g_27{width:min(100%,calc((100dvh - (var(--gc-shell-padding) * 2)) / 2));aspect-ratio:1 / 2;grid-template-rows:auto minmax(0,1.24fr) auto minmax(0,.56fr);font-size:clamp(10px,3.2cqw,16px)}._title_8in6g_388{font-size:1.2em}._header_8in6g_52{align-items:flex-start;flex-direction:column;gap:.55em}._controls_8in6g_57{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}._iconButton_8in6g_89,._modeButton_8in6g_90{min-height:2.35em}._stageGrid_8in6g_53{grid-template-columns:1fr;grid-template-rows:minmax(0,1.25fr) auto}._wavePanel_8in6g_137{padding:.75em}._readoutRow_8in6g_54{align-items:flex-start;flex-direction:column;gap:.45em}._legend_8in6g_58{justify-content:start}._eventPanel_8in6g_138{min-height:0;padding:.72em}._eventPanel_8in6g_138 h3{font-size:1em}._eventPanel_8in6g_138 p{margin-top:.42em;font-size:.78em;line-height:1.22}._meter_8in6g_59{padding-top:.48em}._meter_8in6g_59 strong{font-size:1.7em}._stageMarks_8in6g_196{display:none}._proofPanel_8in6g_139{grid-template-columns:1fr;gap:.5em;padding:.65em}._proofHeader_8in6g_55{align-items:flex-start;flex-direction:column;gap:.45em}._proofActions_8in6g_316{width:100%;display:grid;grid-template-columns:minmax(0,1fr) auto}._proofHeader_8in6g_55 h3{font-size:.82em}._barRow_8in6g_327{grid-template-columns:1fr 2.2em;gap:.32em;font-size:.6em}._barRow_8in6g_327 span{grid-column:1 / -1}._barTrack_8in6g_339{height:.85em}._completeButton_8in6g_91{min-height:2.35em}}")),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}})();
var GlitchComponent=(function(J,d){"use strict";var X={exports:{}},z={};var ce;function he(){if(ce)return z;ce=1;var r=Symbol.for("react.transitional.element"),u=Symbol.for("react.fragment");function p(m,f,b){var h=null;if(b!==void 0&&(h=""+b),f.key!==void 0&&(h=""+f.key),"key"in f){b={};for(var i in f)i!=="key"&&(b[i]=f[i])}else b=f;return f=b.ref,{$$typeof:r,type:m,key:h,ref:f!==void 0?f:null,props:b}}return z.Fragment=u,z.jsx=p,z.jsxs=p,z}var D={};var le;function ge(){return le||(le=1,process.env.NODE_ENV!=="production"&&(function(){function r(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===I?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case N:return"Fragment";case R:return"Profiler";case x:return"StrictMode";case G:return"Suspense";case P:return"SuspenseList";case L:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case y:return"Portal";case Y:return e.displayName||"Context";case A:return(e._context.displayName||"Context")+".Consumer";case F:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ae:return t=e.displayName||null,t!==null?t:r(e.type)||"Memo";case M:t=e._payload,e=e._init;try{return r(e(t))}catch{}}return null}function u(e){return""+e}function p(e){try{u(e);var t=!1}catch{t=!0}if(t){t=console;var o=t.error,l=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return o.call(t,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",l),u(e)}}function m(e){if(e===N)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===M)return"<...>";try{var t=r(e);return t?"<"+t+">":"<...>"}catch{return"<...>"}}function f(){var e=H.A;return e===null?null:e.getOwner()}function b(){return Error("react-stack-top-frame")}function h(e){if(B.call(e,"key")){var t=Object.getOwnPropertyDescriptor(e,"key").get;if(t&&t.isReactWarning)return!1}return e.key!==void 0}function i(e,t){function o(){V||(V=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",t))}o.isReactWarning=!0,Object.defineProperty(e,"key",{get:o,configurable:!0})}function g(){var e=r(this.type);return K[e]||(K[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function c(e,t,o,l,w,oe){var _=o.ref;return e={$$typeof:S,type:e,key:t,props:o,_owner:l},(_!==void 0?_:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:g}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:w}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:oe}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function E(e,t,o,l,w,oe){var _=t.children;if(_!==void 0)if(l)if(U(_)){for(l=0;l<_.length;l++)v(_[l]);Object.freeze&&Object.freeze(_)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else v(_);if(B.call(t,"key")){_=r(e);var W=Object.keys(t).filter(function(xe){return xe!=="key"});l=0<W.length?"{key: someKey, "+W.join(": ..., ")+": ...}":"{key: someKey}",a[_+l]||(W=0<W.length?"{"+W.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
let props = %s;
<%s {...props} />
React keys must be passed directly to JSX without using spread:
let props = %s;
<%s key={someKey} {...props} />`,l,_,W,_),a[_+l]=!0)}if(_=null,o!==void 0&&(p(o),_=""+o),h(t)&&(p(t.key),_=""+t.key),"key"in t){o={};for(var se in t)se!=="key"&&(o[se]=t[se])}else o=t;return _&&i(o,typeof e=="function"?e.displayName||e.name||"Unknown":e),c(e,_,o,f(),w,oe)}function v(e){T(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===M&&(e._payload.status==="fulfilled"?T(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function T(e){return typeof e=="object"&&e!==null&&e.$$typeof===S}var k=d,S=Symbol.for("react.transitional.element"),y=Symbol.for("react.portal"),N=Symbol.for("react.fragment"),x=Symbol.for("react.strict_mode"),R=Symbol.for("react.profiler"),A=Symbol.for("react.consumer"),Y=Symbol.for("react.context"),F=Symbol.for("react.forward_ref"),G=Symbol.for("react.suspense"),P=Symbol.for("react.suspense_list"),ae=Symbol.for("react.memo"),M=Symbol.for("react.lazy"),L=Symbol.for("react.activity"),I=Symbol.for("react.client.reference"),H=k.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,B=Object.prototype.hasOwnProperty,U=Array.isArray,j=console.createTask?console.createTask:function(){return null};k={react_stack_bottom_frame:function(e){return e()}};var V,K={},q=k.react_stack_bottom_frame.bind(k,b)(),$=j(m(b)),a={};D.Fragment=N,D.jsx=function(e,t,o){var l=1e4>H.recentlyCreatedOwnerStacks++;return E(e,t,o,!1,l?Error("react-stack-top-frame"):q,l?j(m(e)):$)},D.jsxs=function(e,t,o){var l=1e4>H.recentlyCreatedOwnerStacks++;return E(e,t,o,!0,l?Error("react-stack-top-frame"):q,l?j(m(e)):$)}})()),D}var ie;function ve(){return ie||(ie=1,process.env.NODE_ENV==="production"?X.exports=he():X.exports=ge()),X.exports}var n=ve();const s={wrapper:"_wrapper_8in6g_1",frame:"_frame_8in6g_27",header:"_header_8in6g_52",stageGrid:"_stageGrid_8in6g_53",readoutRow:"_readoutRow_8in6g_54",proofHeader:"_proofHeader_8in6g_55",timeline:"_timeline_8in6g_56",controls:"_controls_8in6g_57",legend:"_legend_8in6g_58",meter:"_meter_8in6g_59",label:"_label_8in6g_72",iconButton:"_iconButton_8in6g_89",modeButton:"_modeButton_8in6g_90",completeButton:"_completeButton_8in6g_91",modeActive:"_modeActive_8in6g_123",wavePanel:"_wavePanel_8in6g_137",eventPanel:"_eventPanel_8in6g_138",proofPanel:"_proofPanel_8in6g_139",year:"_year_8in6g_154",track:"_track_8in6g_179",canvas:"_canvas_8in6g_189",ageMarks:"_ageMarks_8in6g_195",stageMarks:"_stageMarks_8in6g_196",modePill:"_modePill_8in6g_304",proofActions:"_proofActions_8in6g_316",bars:"_bars_8in6g_322",barRow:"_barRow_8in6g_327",barTrack:"_barTrack_8in6g_339",barFill:"_barFill_8in6g_346",silent:"_silent_8in6g_356",boomer:"_boomer_8in6g_360",post:"_post_8in6g_364",title:"_title_8in6g_388"},ee=Array.from({length:82},(r,u)=>1928+u),Z=1957,ue=1946,te=2038,ne=[{min:0,title:"SCHOOLS",copy:"A large child cohort pulls classrooms, teachers, and local budgets toward youth infrastructure.",policy:"Education and schools"},{min:18,title:"CAMPUS",copy:"The wave enters college and first jobs. Credentials, housing, and entry labor markets start to flex.",policy:"Universities and entry jobs"},{min:30,title:"FAMILY",copy:"The cohort becomes parents and buyers. Homes, childcare, transport, and suburbs absorb the demand.",policy:"Housing and family subsidies"},{min:50,title:"VOTES",copy:"High turnout meets cohort size. Tax, asset, and stability preferences become easier to pass.",policy:"Tax and asset rules"},{min:65,title:"RETIREMENT",copy:"The wave reaches old age. Health care, pensions, and age-linked spending gain political gravity.",policy:"Pensions and health care"}],O=[{key:"silent",label:"Silent generation"},{key:"boomer",label:"Boomers"},{key:"post",label:"Later cohorts"}],C=(r,u,p)=>Math.min(p,Math.max(u,r)),Q=(r,u)=>typeof r=="number"?r:u,de=(r,u)=>typeof r=="boolean"?r:u,me=r=>r>=1946&&r<=1964?"boomer":r<1946?"silent":"post",fe=r=>r<18||r>88?0:r<30?.42:r<45?.62:r<65?.82:.9-Math.max(0,r-72)*.018,pe=r=>ne.reduce((u,p)=>r>=p.min?p:u,ne[0]),_e=(r,u)=>p=>{if(r)return 1;const m=Math.exp(-Math.pow((p-Z)/7.5,2))*u,f=Math.exp(-Math.pow((p-1974)/8,2))*-.22,b=Math.exp(-Math.pow((p-1991)/9,2))*.18;return Math.max(.5,.78+m+f+b)};function ye(r,u,p,m,f){const b=r.getBoundingClientRect(),h=window.devicePixelRatio||1,i=b.width,g=b.height;r.width=Math.floor(i*h),r.height=Math.floor(g*h);const c=r.getContext("2d");if(!c)return;c.setTransform(h,0,0,h,0,0),c.clearRect(0,0,i,g);const E=i*.07,v=g*.72,T=g*.68,k=_e(p,m);c.lineWidth=1,c.strokeStyle=f.grid;for(let x=0;x<=4;x+=1){const R=E+x/4*(i-E*2);c.beginPath(),c.moveTo(R,g*.14),c.lineTo(R,g*.88),c.stroke()}for(const x of ee){const R=u-x;if(R<0||R>88)continue;const A=k(x),Y=E+R/88*(i-E*2),F=Math.max(4,i*.006+A*i*.009),G=v-A*T*.52-Math.sin((x+u)*.18)*g*.025,P=me(x);c.beginPath(),c.arc(Y,G,F,0,Math.PI*2),c.fillStyle=f[P],c.globalAlpha=P==="boomer"?.94:.68,c.fill(),c.globalAlpha=1}const S=u-Z;if(S<0||S>88)return;const y=E+S/88*(i-E*2),N=v-k(Z)*T*.52;c.beginPath(),c.moveTo(y,g*.16),c.lineTo(y,g*.9),c.strokeStyle=f.boomer,c.globalAlpha=.42,c.lineWidth=2,c.stroke(),c.globalAlpha=1,c.beginPath(),c.arc(y,N,Math.max(16,i*.035),0,Math.PI*2),c.strokeStyle=f.accent,c.lineWidth=3,c.stroke()}function be({config:r,onComplete:u,onProgress:p,theme:m,className:f,host:b}){const h=r.params,i=C(Math.round(Q(h.startYear,ue)),ue,te),g=C(Math.round(Q(h.endYear,te)),i+1,te),c=C(Q(h.animationSpeed,1),.25,3),E=C(Q(h.waveScale,1.15),.2,1.8),[v,T]=d.useState(i),[k,S]=d.useState(!0),[y,N]=d.useState(()=>de(h.startEqualized,!1)),[x,R]=d.useState(!1),A=d.useRef(null),Y=d.useRef(0),F=d.useMemo(()=>({silent:"#71a6d2",boomer:"#e7b84f",post:"#7ee0a0",accent:m?.accent??"#22d3ee",grid:"rgba(232, 232, 236, 0.13)",text:m?.text??"#e8e8ec"}),[m?.accent,m?.text]),G=d.useMemo(()=>({"--gc-primary":m?.primary,"--gc-accent":m?.accent,"--gc-bg":m?.bg,"--gc-bg-secondary":m?.bgSecondary,"--gc-text":m?.text,"--gc-text-muted":m?.textMuted,"--gc-border":m?.border}),[m]),P=d.useMemo(()=>_e(y,E),[y,E]),ae=v-Z,M=pe(C(ae,0,88)),L=d.useMemo(()=>{const a=Object.fromEntries(ne.map(t=>[t.policy,0]));for(const t of ee){const o=v-t;if(o<0||o>88)continue;const l=P(t)*fe(o);a[pe(o).policy]+=l}const e=Object.values(a).reduce((t,o)=>t+o,0);return e>0?Math.round(a[M.policy]/e*100):0},[M.policy,P,v]),I=d.useMemo(()=>{const a=Object.fromEntries(O.map(e=>[e.key,0]));for(let e=i;e<=v;e+=1){const t=Object.fromEntries(O.map(l=>[l.key,0]));for(const l of ee){const w=e-l;w<18||w>88||(t[me(l)]+=P(l)*fe(w))}const o=O.reduce((l,w)=>t[w.key]>t[l.key]?w:l,O[0]);t[o.key]>0&&(a[o.key]+=1)}return a},[P,i,v]),H=Math.max(...Object.values(I),1),B=Math.round((v-i)/Math.max(1,g-i)*100),U=d.useCallback(()=>{A.current&&ye(A.current,v,y,E,F)},[y,F,E,v]);d.useEffect(()=>{T(a=>C(a,i,g))},[g,i]),d.useEffect(()=>{N(de(h.startEqualized,!1))},[h.startEqualized]),d.useEffect(()=>{p?.(B)},[p,B]),d.useEffect(()=>{U();const a=A.current;if(!a)return;const e=new ResizeObserver(U);return e.observe(a),()=>e.disconnect()},[U]),d.useEffect(()=>{let a=0;const e=t=>{const o=260/c;k&&t-Y.current>o&&(T(l=>l>=g?i:l+1),Y.current=t),a=window.requestAnimationFrame(e)};return a=window.requestAnimationFrame(e),()=>window.cancelAnimationFrame(a)},[c,g,k,i]);const j=d.useCallback(a=>{b?.playSound?.("ui.button_click",{target:a,component:r.name})},[r.name,b]),V=d.useCallback(a=>{j(a?"equal-generations":"boomer-wave"),N(a)},[j]),K=d.useCallback(a=>{j("timeline"),S(!1),T(Number(a.currentTarget.value))},[j]),q=d.useCallback(()=>{x||(R(!0),j("complete"),u({success:!0,score:100,data:{year:v,mode:y?"equal-generations":"boomer-wave",generationWins:I,currentPressure:L,configId:r.id,completedAt:new Date().toISOString()}}))},[x,r.id,L,y,I,u,j,v]),$=f?`${s.wrapper} ${f}`:s.wrapper;return n.jsx("section",{className:$,style:G,"aria-label":"Demographic wave simulator",children:n.jsxs("div",{className:s.frame,children:[n.jsx("header",{className:s.header,children:n.jsxs("div",{className:s.controls,"aria-label":"Simulation controls",children:[n.jsx("button",{className:s.iconButton,type:"button",onClick:()=>S(a=>!a),children:k?"II":">"}),n.jsx("button",{className:`${s.modeButton} ${y?"":s.modeActive}`,type:"button",onClick:()=>V(!1),children:"W"}),n.jsx("button",{className:`${s.modeButton} ${y?s.modeActive:""}`,type:"button",onClick:()=>V(!0),children:"="})]})}),n.jsxs("div",{className:s.stageGrid,children:[n.jsxs("div",{className:s.wavePanel,children:[n.jsxs("div",{className:s.readoutRow,children:[n.jsx("div",{children:n.jsx("strong",{className:s.year,children:v})}),n.jsx("div",{className:s.legend,children:O.map(a=>n.jsx("span",{children:n.jsx("i",{className:s[a.key]})},a.key))})]}),n.jsxs("div",{className:s.track,children:[n.jsxs("div",{className:s.ageMarks,"aria-hidden":"true",children:[n.jsx("span",{children:"0"}),n.jsx("span",{children:"20"}),n.jsx("span",{children:"40"}),n.jsx("span",{children:"60"}),n.jsx("span",{children:"80"})]}),n.jsx("canvas",{ref:A,className:s.canvas}),n.jsxs("div",{className:s.stageMarks,"aria-hidden":"true",children:[n.jsx("span",{children:"Kids"}),n.jsx("span",{children:"Campus"}),n.jsx("span",{children:"Work"}),n.jsx("span",{children:"Assets"}),n.jsx("span",{children:"Care"})]})]})]}),n.jsxs("aside",{className:s.eventPanel,children:[n.jsx("h3",{children:M.title}),n.jsx("div",{className:s.meter,children:n.jsxs("strong",{children:[L,"%"]})})]})]}),n.jsxs("div",{className:s.timeline,children:[n.jsx("input",{"aria-label":"Simulation year",type:"range",min:i,max:g,value:v,onChange:K}),n.jsxs("strong",{children:[B,"%"]})]}),n.jsxs("section",{className:s.proofPanel,"aria-label":"Accepted policy preference winners",children:[n.jsxs("div",{className:s.proofHeader,children:[n.jsx("div",{children:n.jsx("h3",{children:"Policy wins"})}),n.jsxs("div",{className:s.proofActions,children:[n.jsx("span",{className:s.modePill,children:y?"=":"W"}),n.jsx("button",{className:s.completeButton,type:"button",onClick:q,disabled:x,children:x?"OK":"✓"})]})]}),n.jsx("div",{className:s.bars,children:O.map(a=>{const e=Math.round(I[a.key]/H*100);return n.jsxs("div",{className:s.barRow,children:[n.jsx("span",{children:a.key==="silent"?"S":a.key==="boomer"?"B":"L"}),n.jsx("div",{className:s.barTrack,children:n.jsx("div",{className:`${s.barFill} ${s[a.key]}`,style:{width:`${e}%`}})}),n.jsx("strong",{children:e})]},a.key)})})]})]})})}const re={name:"demographic-wave",displayName:"Demographic Wave",version:"1.0.0",paramSchema:{startYear:{type:"range",label:"Start Year",default:1946,min:1946,max:2028,step:1},endYear:{type:"range",label:"End Year",default:2038,min:1964,max:2038,step:1},animationSpeed:{type:"range",label:"Animation Speed",default:1,min:.25,max:3,step:.25},waveScale:{type:"range",label:"Boomer Wave Scale",default:1.15,min:.2,max:1.8,step:.05},startEqualized:{type:"boolean",label:"Start Equalized",default:!1}},defaultParams:{startYear:1946,endYear:2038,animationSpeed:1,waveScale:1.15,startEqualized:!1}};return typeof window<"u"&&(window.GlitchComponents??={},window.GlitchComponents[re.name]={default:be,metadata:re}),J.default=be,J.metadata=re,Object.defineProperties(J,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),J})({},React);
//# sourceMappingURL=demographic-wave.iife.js.map