diff --git a/docs/assets/index-CpA1DfjE.js b/docs/assets/index-Co4wqFEb.js similarity index 95% rename from docs/assets/index-CpA1DfjE.js rename to docs/assets/index-Co4wqFEb.js index 2271aef..8f24464 100644 --- a/docs/assets/index-CpA1DfjE.js +++ b/docs/assets/index-Co4wqFEb.js @@ -6,6 +6,6 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r= `+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Ue=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?He(n):``}function Ge(e,t){switch(e.tag){case 26:case 27:case 5:return He(e.type);case 16:return He(`Lazy`);case 13:return e.child!==t&&t!==null?He(`Suspense Fallback`):He(`Suspense`);case 19:return He(`SuspenseList`);case 0:case 15:return We(e.type,!1);case 11:return We(e.type.render,!1);case 1:return We(e.type,!0);case 31:return He(`Activity`);case 30:return He(`ViewTransition`);default:return``}}function Ke(e){try{var t=``,n=null;do t+=Ge(e,n),n=e,e=e.return;while(e);return t}catch(e){return` Error generating stack: `+e.message+` `+e.stack}}var qe=Object.prototype.hasOwnProperty,Je=t.unstable_scheduleCallback,Ye=t.unstable_cancelCallback,Xe=t.unstable_shouldYield,Ze=t.unstable_requestPaint,Qe=t.unstable_now,$e=t.unstable_getCurrentPriorityLevel,et=t.unstable_ImmediatePriority,tt=t.unstable_UserBlockingPriority,nt=t.unstable_NormalPriority,rt=t.unstable_LowPriority,it=t.unstable_IdlePriority,at=t.log,ot=t.unstable_setDisableYieldValue,st=null,ct=null;function lt(e){if(typeof at==`function`&&ot(e),ct&&typeof ct.setStrictMode==`function`)try{ct.setStrictMode(st,e)}catch{}}var ut=Math.clz32?Math.clz32:pt,dt=Math.log,ft=Math.LN2;function pt(e){return e>>>=0,e===0?32:31-(dt(e)/ft|0)|0}var mt=256,ht=262144,gt=4194304;function _t(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function vt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=_t(n))):i=_t(o):i=_t(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=_t(n))):i=_t(o)):i=_t(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function yt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function bt(e,t){t&8&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function wt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Tt(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),zn=!1;if(Rn)try{var Bn={};Object.defineProperty(Bn,"passive",{get:function(){zn=!0}}),window.addEventListener(`test`,Bn,Bn),window.removeEventListener(`test`,Bn,Bn)}catch{zn=!1}var Vn=null,Hn=null,Un=null;function Wn(){if(Un)return Un;var e,t=Hn,n=t.length,r,i=`value`in Vn?Vn.value:Vn.textContent,a=i.length;for(e=0;e=Cr),Er=` `,Dr=!1;function Or(e,t){switch(e){case`keyup`:return xr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function kr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Ar=!1;function jr(e,t){switch(e){case`compositionend`:return kr(t);case`keypress`:return t.which===32?(Dr=!0,Er):null;case`textInput`:return e=t.data,e===Er&&Dr?null:e;default:return null}}function Mr(e,t){if(Ar)return e===`compositionend`||!Sr&&Or(e,t)?(e=Wn(),Un=Hn=Vn=null,Ar=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=ti(n)}}function ri(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ri(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ii(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ei(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=ei(e.document)}return t}function ai(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var oi=Rn&&`documentMode`in document&&11>=document.documentMode,si=null,ci=null,li=null,ui=!1;function di(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ui||si==null||si!==ei(r)||(r=si,`selectionStart`in r&&ai(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),li&&$r(li,r)||(li=r,r=Jf(ci,`onSelect`),0>=o,i-=o,sa=1<<32-ut(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),A&&la(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),A&&la(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return A&&la(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&(_=v.alternate,_!==null&&h.delete(_.key===null?g:_.key)),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),A&&la(a,g),u}function _(e,r,o,c){if(typeof o==`object`&&o&&o.type===C&&o.key===null&&o.props.ref===void 0&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case oe:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===C){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),vo(c,o),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===ge&&uo(l)===r.type){n(e,r.sibling),c=a(r,o.props),vo(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===C?(c=Ji(o.props.children,e.mode,c,o.key),vo(c,o),c.return=e,e=c):(c=qi(o.type,o.key,o.props,null,e.mode,c),vo(c,o),c.return=e,e=c)}return s(e);case se:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=Zi(o,e.mode,c),c.return=e,e=c}return s(e);case ge:return o=uo(o),_(e,r,o,c)}if(Ee(o))return h(e,r,o,c);if(Ce(o)){if(l=Ce(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return _(e,r,_o(o),c);if(o.$$typeof===de)return _(e,r,Ia(e,o),c);yo(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=Yi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{go=0;var i=_(e,t,n,r);return ho=null,i}catch(t){if(t===io||t===oo)throw t;var a=Ui(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var xo=bo(!0),So=bo(!1),Co=!1;function wo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function To(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Eo(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Do(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Bi(e),zi(e,null,n),t}return Ii(e,r,t,n),Bi(e)}function Oo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Dt(e,n)}}function ko(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ao=!1;function jo(){if(Ao){var e=Ya;if(e!==null)throw e}}function Mo(e,t,n,r){Ao=!1;var i=e.updateQueue;Co=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===Ja&&(Ao=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,h=s;f=t;var g=n;switch(h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(g,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(g,d,f):m,f==null)break a;d=S({},d,f);break a;case 2:Co=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),sd|=o,e.lanes=o,e.memoizedState=d}}function No(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Po(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=w.T,s={};s.types=o===null?null:o.types,w.T=s,_c(e,!1,t,n);try{var c=i(),l=w.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?gc(e,t,Qa(c,r),jd(e)):gc(e,t,r,jd(e))}catch(n){gc(e,t,{then:function(){},status:`rejected`,reason:n},jd())}finally{T.p=a,o!==null&&s.types!==null&&(o.types=s.types),w.T=o}}function oc(){}function sc(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=cc(e).queue;ac(e,a,t,De,n===null?oc:function(){return lc(e),n(r)})}function cc(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:De,baseState:De,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:vs,lastRenderedState:De},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:vs,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function lc(e){var t=cc(e);t.next===null&&(t=e.alternate.memoizedState),gc(e,t.next.queue,{},jd())}function uc(){return Fa(sh)}function dc(){return I().memoizedState}function fc(){return I().memoizedState}function pc(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=jd();e=Eo(n);var r=Do(t,e,n);r!==null&&(Pd(r,t,n),Oo(r,t,n)),t={cache:Va()},e.payload=t;return}t=t.return}}function mc(e,t,n){var r=jd();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},vc(e)?yc(t,n):(n=Li(e,t,n,r),n!==null&&(Pd(n,e,r),bc(n,t,r)))}function hc(e,t,n){gc(e,t,n,jd())}function gc(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(vc(e))yc(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Qr(s,o))return Ii(e,t,i,0),G===null&&Fi(),!1}catch{}if(n=Li(e,t,i,r),n!==null)return Pd(n,e,r),bc(n,t,r),!0}return!1}function _c(e,t,n,r){if(r={lane:2,revertLane:Pf(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},vc(e)){if(t)throw Error(i(479))}else t=Li(e,n,r,2),t!==null&&Pd(t,e,2)}function vc(e){var t=e.alternate;return e===M||t!==null&&t===M}function yc(e,t){$o=Qo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function bc(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Dt(e,n)}}var xc={readContext:Fa,use:gs,useCallback:F,useContext:F,useEffect:F,useImperativeHandle:F,useLayoutEffect:F,useInsertionEffect:F,useMemo:F,useReducer:F,useRef:F,useState:F,useDebugValue:F,useDeferredValue:F,useTransition:F,useSyncExternalStore:F,useId:F,useHostTransitionStatus:F,useFormState:F,useActionState:F,useOptimistic:F,useMemoCache:F,useCacheRefresh:F,useEffectEvent:F},Sc={readContext:Fa,use:gs,useCallback:function(e,t){return ps().memoizedState=[e,t===void 0?null:t],e},useContext:Fa,useEffect:Ks,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),Ws(4194308,4,Qs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ws(4194308,4,e,t)},useInsertionEffect:function(e,t){Ws(4,2,e,t)},useMemo:function(e,t){var n=ps();t=t===void 0?null:t;var r=e();if(es){lt(!0);try{e()}finally{lt(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ps();if(n!==void 0){var i=n(t);if(es){lt(!0);try{n(t)}finally{lt(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=mc.bind(null,M,e),[r.memoizedState,e]},useRef:function(e){var t=ps();return e={current:e},t.memoizedState=e},useState:function(e){e=Os(e);var t=e.queue,n=hc.bind(null,M,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ec,useDeferredValue:function(e,t){return rc(ps(),e,t)},useTransition:function(){var e=Os(!1);return e=ac.bind(null,M,e.queue,!0,!1),ps().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=M,a=ps();if(A){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),G===null)throw Error(i(349));q&127||Cs(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,Ks(Ts.bind(null,r,o,e),[e]),r.flags|=2048,Hs(9,{destroy:void 0},ws.bind(null,r,o,n,t),null),n},useId:function(){var e=ps(),t=G.identifierPrefix;if(A){var n=ca,r=sa;n=(r&~(1<<32-ut(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=ts++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[Pt]=t,o[Ft]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(np(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&vl(t)}}return z(t),t.subtreeFlags&=-33554433,yl(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&vl(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=Pe.current,xa(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=ma,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[Pt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||ep(e.nodeValue,n)),e||va(t,!0)}else e=lp(e).createTextNode(r),e[Pt]=t,t.stateNode=e}return z(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=xa(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[Pt]=t}else Sa(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;z(t),e=!1}else n=Ca(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Ko(t),t):(Ko(t),null);if(t.flags&128)throw Error(i(558))}return z(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=xa(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[Pt]=t}else Sa(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;z(t),a=!1}else a=Ca(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(Ko(t),t):(Ko(t),null)}return Ko(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),xl(t,t.updateQueue),z(t),null);case 4:return Le(),e===null&&Wf(t.stateNode.containerInfo),t.flags|=67108864,z(t),null;case 10:return ka(t.type),z(t),null;case 19:if(Yo(t),r=t.memoizedState,r===null)return z(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Sl(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Xo(e),o!==null){for(t.flags|=128,Sl(r,!1),e=o.updateQueue,t.updateQueue=e,xl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Ki(n,e),n=n.sibling;return Jo(t,qo.current&1|2),A&&la(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Qe()>_d&&(t.flags|=128,a=!0,Sl(r,!1),t.lanes=4194304)}}else{if(!a){if(e=Xo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,xl(t,e),Sl(r,!0),r.tail===null&&r.tailMode!==`collapsed`&&r.tailMode!==`visible`&&!o.alternate&&!A)return z(t),null}else 2*Qe()-r.renderingStartTime>_d&&n!==536870912&&(t.flags|=128,a=!0,Sl(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}if(r.tail!==null){e=r.tail;a:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break a}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Qe(),e.sibling=null,o=qo.current,o=a?o&1|2:o&1,r.tailMode===`visible`||r.tailMode===`collapsed`||!n||A?Jo(t,o):(n=o,E(Bo,t),E(qo,n),Vo===null&&(Vo=t)),A&&la(t,r.treeForkCount),e}return z(t),null;case 22:case 23:return Ko(t),zo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(z(t),t.subtreeFlags&6&&(t.flags|=8192)):z(t),n=t.updateQueue,n!==null&&xl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&je(eo),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ka(j),z(t),null;case 25:return null;case 30:return t.flags|=33554432,z(t),null}throw Error(i(156,t.tag))}function wl(e,t){switch(fa(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ka(j),Le(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ze(t),null;case 31:if(t.memoizedState!==null){if(Ko(t),t.alternate===null)throw Error(i(340));Sa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Ko(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Sa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Yo(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return Le(),null;case 10:return ka(t.type),null;case 22:case 23:return Ko(t),zo(),e!==null&&je(eo),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ka(j),null;case 25:return null;default:return null}}function Tl(e,t){switch(fa(t),t.tag){case 3:ka(j),Le();break;case 26:case 27:case 5:ze(t);break;case 4:Le();break;case 31:t.memoizedState!==null&&Ko(t);break;case 13:Ko(t);break;case 19:Yo(t);break;case 10:ka(t.type);break;case 22:case 23:Ko(t),zo(),e!==null&&je(eo);break;case 24:ka(j)}}function El(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Dl(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Ol(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Po(t,n)}catch(t){Z(e,e.return,t)}}}function kl(e,t,n){n.props=kc(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Al(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var i=e.stateNode,a=Oi(e.memoizedProps,i);(i.ref===null||i.ref.name!==a)&&(i.ref=Pp(a)),r=i.ref;break;case 7:if(e.stateNode===null){var o=new Fp(e);h(e.child,!1,Qp,o,void 0,void 0),e.stateNode=o}r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function jl(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Ml(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title`))),np(r,t,n),r[Pt]=e,D(r),t=r;break a;case`link`:if(o=Gm(`link`,`href`,a).get(t+(n.href||``))){for(s=0;sg&&(o=g,g=h,h=o);var _=ni(s,h),v=ni(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,w.T=null,n=wd,wd=null;var o=bd,s=Sd;if(X=0,xd=bd=null,Sd=0,W&6)throw Error(i(331));var c=W;if(W|=4,Zu(o.current),Uu(o,o.current,s,n),W=c,Df(0,!1),ct&&typeof ct.onPostCommitFiberRoot==`function`)try{ct.onPostCommitFiberRoot(st,o)}catch{}return!0}finally{T.p=a,w.T=r,uf(e,t)}}function pf(e,t,n){t=$i(n,t),t=Fc(e.stateNode,t,2),e=Do(e,t,2),e!==null&&(wt(e,2),Ef(e))}function Z(e,t,n){if(e.tag===3)pf(e,e,n);else for(;t!==null;){if(t.tag===3){pf(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(yd===null||!yd.has(r))){e=$i(n,e),n=Ic(2),r=Do(t,n,2),r!==null&&(Lc(n,r,t,e),wt(r,2),Ef(r));break}}t=t.return}}function mf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new td;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(ad=!0,i.add(n),e=hf.bind(null,e,t,n),t.then(e,e))}function hf(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Qe()-hd?W&2?ld|=n:Vd(e,0):ld|=n,dd===q&&(dd=0)),Ef(e)}function gf(e,t){t===0&&(t=St()),e=Ri(e,t),e!==null&&(wt(e,t),Ef(e))}function _f(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gf(e,n)}function vf(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),gf(e,n)}function yf(e,t){return Je(e,t)}var bf=null,xf=null,Sf=!1,Cf=!1,wf=!1,Tf=0;function Ef(e){e!==xf&&e.next===null&&(xf===null?bf=xf=e:xf=xf.next=e),Cf=!0,Sf||(Sf=!0,Nf())}function Df(e,t){if(!wf&&Cf){wf=!0;do for(var n=!1,r=bf;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-ut(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,Mf(r,a))}else a=q,a=vt(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||yt(r,a)||(n=!0,Mf(r,a))}r=r.next}while(n);wf=!1}}function Of(){kf()}function kf(){Cf=Sf=!1;var e=0;Tf!==0&&hp()&&(e=Tf);for(var t=Qe(),n=null,r=bf;r!==null;){var i=r.next,a=Af(r,t);a===0?(r.next=null,n===null?bf=i:n.next=i,i===null&&(xf=n)):(n=r,(e!==0||a&3)&&(Cf=!0)),r=i}X!==0&&X!==5||Df(e,!1),Tf!==0&&(Tf=0)}function Af(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=mn(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),D(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+mn(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+mn(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+mn(n.imageSizes)+`"]`)):i+=`[href="`+mn(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=S({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[Ht]=!0,o.onload=o.onerror=function(){Jt(o)}),D(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+mn(r)+`"][href="`+mn(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=S({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),D(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=qt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=S({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);D(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=qt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),D(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=qt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),D(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var a=(a=Pe.current)?bm(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=qt(a).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var o=qt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Fm(e)))?o._p||(s.instance=o,s.state.loading=5):(o=vm.get(e),o||(o={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,o)),Lm(a,e,o,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=qt(a).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pm(e){return`href="`+mn(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return S({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[Ht]){r.loading=1;return}}else t=e.createElement(`link`),t[Ht]=!0,t.onload=t.onerror=Jt.bind(null,t),np(t,`link`,n),D(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+mn(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+mn(n.href)+`"]`);if(r)return t.instance=r,D(r),r;var a=S({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),D(r),np(r,`style`,a),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Pm(n.href);var o=e.querySelector(Fm(a));if(o)return t.state.loading|=4,t.instance=o,D(o),o;r=Im(n),(a=vm.get(a))&&Hm(r,a),o=(e.ownerDocument||e).createElement(`link`),D(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),np(o,`link`,r),t.state.loading|=4,Vm(o,n.precedence,e),t.instance=o;case`script`:return o=Rm(n.src),(a=e.querySelector(zm(o)))?(t.instance=a,D(a),a):(r=n,(a=vm.get(o))&&(r=S({},n),Um(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),D(a),np(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,D(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),D(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y={width:1200,height:900,pad:{left:76,right:46,top:55,bottom:82}},b=[[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[1,-1],[-1,1],[1,1]],ee=[22,34,48,64,82,104,130,160,196],te=(e,t,n,r)=>({cx:e,cy:t,width:n,height:r}),ne=(e,t)=>Math.abs(e.cx-t.cx)*2e.cx-e.width/2>=t.left&&e.cx+e.width/2<=t.right&&e.cy-e.height/2>=t.top&&e.cy+e.height/2<=t.bottom;function x(e){let t=[...e.countries,...e.models],n=Math.min(...t.map(e=>e.x)),r=Math.max(...t.map(e=>e.x)),i=Math.min(...t.map(e=>e.y)),a=Math.max(...t.map(e=>e.y)),o=(r-n)*.17,s=(a-i)*.17,c={x0:n-o,x1:r+o,y0:i-s,y1:a+s*1.22},l={left:y.pad.left,right:y.width-y.pad.right,top:y.pad.top,bottom:y.height-y.pad.bottom};return{x:e=>l.left+(e-c.x0)/(c.x1-c.x0)*(l.right-l.left),y:e=>l.bottom-(e-c.y0)/(c.y1-c.y0)*(l.bottom-l.top),bounds:l,limits:c}}function ie(e,t){let n=t===`zone`?15:t===`model`?13:11;return{width:e.length*n*.59+10,height:n+7}}function S(e,t){let{x:n,y:r,bounds:i}=t,a=[...e.countries.map(e=>te(n(e.x),r(e.y),10,10)),...e.models.map(e=>te(n(e.x),r(e.y),22,22))],o=[...e.models.filter(e=>e.label).map(e=>({id:`model:${e.name}`,point:e,text:e.label,kind:`model`})),...e.countries.filter(e=>e.label).map(e=>({id:`country:${e.name}`,point:e,text:e.name,kind:`country`})),...e.zone_hulls.map(e=>({id:`zone:${e.name}`,point:{x:e.label_anchor[0],y:e.label_anchor[1]},text:e.name,kind:`zone`}))],s={};for(let e of o){let t={x:n(e.point.x),y:r(e.point.y)},o=ie(e.text,e.kind),c=null;for(let e of ee){for(let[n,r]of b){let s=te(t.x+n*(e+o.width/3),t.y+r*e,o.width,o.height);if(re(s,i)&&!a.some(e=>ne(s,e))){c=s;break}}if(c)break}if(!c)throw Error(`no collision-free label location for ${e.id}`);s[e.id]={...c,anchor:t,kind:e.kind,text:e.text},a.push(c)}return s}function ae(e,t){let n=e.slice(0,-1).map(([e,n])=>({x:t.x(e),y:t.y(n)}));if(n.length<3)throw Error(`a closed hull needs three points`);let r=e=>n[(e+n.length)%n.length],i=(e,t)=>Math.hypot(e.x-t.x,e.y-t.y),a=(e,t,n)=>({x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}),o=e=>{let t=r(e-1),n=r(e),o=r(e+1),s=Math.min(.24,14/i(t,n),14/i(n,o));return{before:a(n,t,s),current:n,after:a(n,o,s)}},s=o(0),c=`M ${s.after.x} ${s.after.y}`;for(let e=1;e<=n.length;e+=1){let t=o(e%n.length);c+=` L ${t.before.x} ${t.before.y} Q ${t.current.x} ${t.current.y} ${t.after.x} ${t.after.y}`}return`${c} Z`}function oe(e){let t=x(e),n=S(e,t),r=Object.entries(n);for(let[e,n]of r)if(!re(n,t.bounds))throw Error(`label out of bounds: ${e}`);for(let e=0;e{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),C=o(((e,t)=>{t.exports=se()}))(),ce=`wvs/`;function le(e,t){return Object.keys(e).filter(e=>!t.has(e))}function ue({active:e,geometry:t,data:n,id:r=`model-tooltip`}){if(!e)return null;let{provenance:i}=e,a=e.tooltipLeft??`${Math.min(86,t.x(e.x)/y.width*100)}%`,o=e.tooltipTop??`${Math.min(82,t.y(e.y)/y.height*100)}%`,s=i.items===null?`historical coordinate`:`${i.items} items x ${i.samples} samples`;return(0,C.jsxs)(`aside`,{id:r,className:`tooltip`,style:{left:a,top:o},role:`status`,children:[(0,C.jsx)(`strong`,{children:e.name}),(0,C.jsx)(`span`,{children:e.family}),(0,C.jsxs)(`span`,{children:[n.axis.x[0],` `,`->`,` `,n.axis.x[1],`: `,e.x.toFixed(3)]}),(0,C.jsxs)(`span`,{children:[n.axis.y[0],` `,`->`,` `,n.axis.y[1],`: `,e.y.toFixed(3)]}),(0,C.jsxs)(`span`,{children:[i.readout,`, `,s]}),(0,C.jsx)(`span`,{children:i.release_created?`release ${i.release_created}`:i.release_source})]})}function de({model:e,placement:t,geometry:n,setActive:r,clearActive:i,markerRef:a,logo:o}){let s=n.x(e.x),c=n.y(e.y),l=e.label?t[`model:${e.name}`]:null,u=l&&Math.hypot(l.cx-s,l.cy-c)>20;return(0,C.jsxs)(`g`,{ref:a,className:`model-mark`,"data-family":e.family,"data-model":e.name,"data-x":e.x,"data-y":e.y,tabIndex:`0`,role:`button`,"aria-label":`${e.name}, ${e.family}`,"aria-describedby":`model-tooltip`,onPointerEnter:()=>r(e),onPointerLeave:i,onFocus:()=>r(e),onBlur:i,children:[u&&(0,C.jsx)(`line`,{className:`leader`,x1:s,y1:c,x2:l.cx,y2:l.cy}),(0,C.jsx)(`circle`,{className:`model-ring`,cx:s,cy:c,r:`11`,stroke:e.color}),(0,C.jsx)(`image`,{href:`${ce}${o}`,x:s-7,y:c-7,width:`14`,height:`14`,preserveAspectRatio:`xMidYMid meet`,"aria-hidden":`true`,focusable:`false`}),l&&(0,C.jsx)(`text`,{className:`model-label`,x:l.cx,y:l.cy+4,textAnchor:`middle`,children:e.label})]})}function fe({data:e,hidden:t,field:n,title:r}){let i=(0,_.useMemo)(()=>e.models.filter(e=>Number.isFinite(Date.parse(e.provenance.release_created??``))).toSorted((e,t)=>e.provenance.release_created.localeCompare(t.provenance.release_created)||e.name.localeCompare(t.name)),[e]),a=i.filter(e=>!t.has(e.family)),[o,s]=(0,_.useState)(null),c=1200,l=i.map(e=>Date.parse(e.provenance.release_created)),u=i.map(e=>e[n]),d=Math.min(...l),f=Math.max(...l),p=Math.min(...u),m=Math.max(...u),h=e=>74+(e-d)/(f-d)*1091,g=e=>42+(m-e)/(m-p||1)*230,v=`release-${n}`,y=`${v}-tooltip`,b=(e,t)=>{let n=t.currentTarget.closest(`.scatter-shell`).getBoundingClientRect(),r=t.currentTarget.getBoundingClientRect();s({...e,tooltipLeft:`${Math.min(82,(r.left-n.left)/n.width*100)}%`,tooltipTop:`${Math.min(78,(r.top-n.top)/n.height*100)}%`})};return(0,C.jsxs)(`section`,{className:`release-panel`,"data-coordinate":n,"aria-labelledby":`${v}-heading`,children:[(0,C.jsx)(`h2`,{id:`${v}-heading`,children:r}),(0,C.jsxs)(`div`,{className:`scatter-shell`,children:[(0,C.jsxs)(`svg`,{viewBox:`0 0 ${c} 320`,role:`img`,"aria-labelledby":`${v}-svg-title ${v}-svg-desc`,"data-panel-model-count":a.length,children:[(0,C.jsx)(`title`,{id:`${v}-svg-title`,children:r}),(0,C.jsxs)(`desc`,{id:`${v}-svg-desc`,children:[`Scatter plot with release date on the horizontal axis and `,n===`y`?`Secular-Rational`:`Self-expression`,` on the vertical axis. `,a.length,` dated models are visible from `,le(Object.groupBy(e.models,e=>e.family),t).join(`, `)||`no families`,`. Each white-ring logo mark is a model. Hover or keyboard focus a mark for model-specific details.`]}),(0,C.jsx)(`rect`,{className:`canvas`,width:c,height:320}),(0,C.jsx)(`g`,{className:`scatter-grid`,children:Array.from({length:5},(e,t)=>(0,C.jsx)(`line`,{x1:74,x2:1165,y1:42+t*230/4,y2:42+t*230/4},t))}),(0,C.jsx)(`line`,{className:`scatter-axis`,x1:74,x2:1165,y1:272,y2:272}),(0,C.jsx)(`line`,{className:`scatter-axis`,x1:74,x2:74,y1:42,y2:272}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:74,y:302,children:new Date(d).toISOString().slice(0,10)}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:1165,y:302,textAnchor:`end`,children:new Date(f).toISOString().slice(0,10)}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:66,y:46,textAnchor:`end`,children:m.toFixed(2)}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:66,y:272,textAnchor:`end`,children:p.toFixed(2)}),i.map(r=>(0,C.jsxs)(`g`,{className:`release-mark`,"data-family":r.family,"data-release-model":r.name,"data-release-date":r.provenance.release_created,display:t.has(r.family)?`none`:`inline`,tabIndex:`0`,role:`button`,"aria-label":`${r.name}, ${r.family}, ${r.provenance.release_created}`,"aria-describedby":y,onPointerEnter:e=>b(r,e),onPointerLeave:()=>s(null),onFocus:e=>b(r,e),onBlur:()=>s(null),children:[(0,C.jsx)(`circle`,{className:`model-ring`,cx:h(Date.parse(r.provenance.release_created)),cy:g(r[n]),r:`10`,stroke:r.color}),(0,C.jsx)(`image`,{href:`${ce}${e.logos[r.family]}`,x:h(Date.parse(r.provenance.release_created))-6.5,y:g(r[n])-6.5,width:`13`,height:`13`,preserveAspectRatio:`xMidYMid meet`,"aria-hidden":`true`,focusable:`false`})]},r.name))]}),(0,C.jsx)(ue,{active:o,geometry:null,data:e,id:y})]})]})}function pe({data:e,hidden:t}){return(0,C.jsxs)(`section`,{className:`release-panels`,"aria-label":`Release-date scatter panels`,children:[(0,C.jsx)(fe,{data:e,hidden:t,field:`y`,title:`Release date vs Secular-Rational`}),(0,C.jsx)(fe,{data:e,hidden:t,field:`x`,title:`Release date vs Self-expression`})]})}function me({data:e}){let t=new URLSearchParams(location.search),[n,r]=(0,_.useState)(()=>new Set(t.get(`hide`)?.split(`,`).filter(Boolean))),[i,a]=(0,_.useState)(()=>e.models.find(e=>e.name===(t.get(`tooltip`)||t.get(`focus`)))??null),o=t.get(`focus`),s=(0,_.useRef)(null),c=(0,_.useMemo)(()=>Object.groupBy(e.models,e=>e.family),[e]),{labels:l,geometry:u}=(0,_.useMemo)(()=>oe(e),[e]),d=le(c,n),f=e.models.filter(e=>!n.has(e.family)).length;(0,_.useEffect)(()=>{o&&s.current?.focus()},[o]);let p=e=>{e.currentTarget.matches(`:focus`)||a(null)},m=e=>r(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),h=u.x(e.median.x),g=u.y(e.median.y);return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`section`,{className:`controls`,"aria-label":`Model-family visibility`,children:Object.entries(c).map(([t])=>{let r=!n.has(t);return(0,C.jsxs)(`button`,{className:`chip`,type:`button`,"aria-pressed":r,onClick:()=>m(t),children:[(0,C.jsx)(`img`,{src:`${ce}${e.logos[t]}`,alt:``,"aria-hidden":`true`}),t]},t)})}),(0,C.jsxs)(`div`,{className:`chart-shell`,children:[(0,C.jsxs)(`svg`,{viewBox:`0 0 ${y.width} ${y.height}`,role:`img`,"aria-labelledby":`map-svg-title map-svg-desc`,"data-median-x":e.median.x,"data-median-y":e.median.y,"data-visible-model-count":f,children:[(0,C.jsx)(`title`,{id:`map-svg-title`,children:`Frontier LLMs on the World Values Survey`}),(0,C.jsxs)(`desc`,{id:`map-svg-desc`,children:[`World Values Survey cultural map. Horizontal direction runs from Self-expression on the left to Survival on the right. Vertical direction runs from Traditional below to Secular-Rational above. Coloured dots are selected WVS countries, outlines are cultural regions, and white-ring logo marks are models. `,f,` model marks are visible from `,d.join(`, `)||`no families`,`. Use the family controls to hide marks and labels. Hover or keyboard focus a model for model-specific details.`]}),(0,C.jsx)(`defs`,{children:(0,C.jsx)(`marker`,{id:`arrow`,markerWidth:`8`,markerHeight:`8`,refX:`6`,refY:`3`,orient:`auto`,children:(0,C.jsx)(`path`,{d:`M0,0 L0,6 L6,3 z`,className:`arrow`})})}),(0,C.jsx)(`rect`,{className:`canvas`,width:y.width,height:y.height}),(0,C.jsxs)(`g`,{className:`grid`,children:[Array.from({length:8},(e,t)=>(0,C.jsx)(`line`,{x1:u.bounds.left+t*(u.bounds.right-u.bounds.left)/7,y1:u.bounds.top,x2:u.bounds.left+t*(u.bounds.right-u.bounds.left)/7,y2:u.bounds.bottom},`v${t}`)),Array.from({length:6},(e,t)=>(0,C.jsx)(`line`,{x1:u.bounds.left,y1:u.bounds.top+t*(u.bounds.bottom-u.bounds.top)/5,x2:u.bounds.right,y2:u.bounds.top+t*(u.bounds.bottom-u.bounds.top)/5},`h${t}`))]}),(0,C.jsx)(`line`,{className:`median`,x1:u.bounds.left,y1:g,x2:u.bounds.right,y2:g}),(0,C.jsx)(`line`,{className:`median`,x1:h,y1:u.bounds.top,x2:h,y2:u.bounds.bottom}),e.zone_hulls.map(e=>(0,C.jsx)(`path`,{className:`zone`,d:ae(e.points,u),stroke:e.color},e.name)),e.countries.map(e=>(0,C.jsxs)(`g`,{children:[(0,C.jsx)(`circle`,{className:`country`,"data-country":e.name,"data-x":e.x,"data-y":e.y,cx:u.x(e.x),cy:u.y(e.y),r:`3.5`,fill:e.color}),e.label&&(0,C.jsx)(`text`,{className:`country-label`,x:l[`country:${e.name}`].cx,y:l[`country:${e.name}`].cy+4,textAnchor:`middle`,children:e.name})]},e.name)),e.zone_hulls.map(e=>(0,C.jsx)(`text`,{className:`zone-label`,x:l[`zone:${e.name}`].cx,y:l[`zone:${e.name}`].cy+5,textAnchor:`middle`,fill:e.color,children:e.name},e.name)),Object.entries(c).map(([t,r])=>(0,C.jsx)(`g`,{"data-family":t,display:n.has(t)?`none`:`inline`,children:r.map(t=>(0,C.jsx)(de,{model:t,placement:l,geometry:u,setActive:a,clearActive:p,markerRef:t.name===o?s:null,logo:e.logos[t.family]},t.name))},t)),(0,C.jsxs)(`g`,{className:`poles`,children:[(0,C.jsx)(`line`,{x1:h,y1:`62`,x2:h,y2:u.bounds.top,markerEnd:`url(#arrow)`}),(0,C.jsx)(`line`,{x1:h,y1:u.bounds.bottom,x2:h,y2:`838`,markerEnd:`url(#arrow)`}),(0,C.jsx)(`line`,{x1:`64`,y1:g,x2:u.bounds.left,y2:g,markerEnd:`url(#arrow)`}),(0,C.jsx)(`line`,{x1:u.bounds.right,y1:g,x2:`1184`,y2:g,markerEnd:`url(#arrow)`}),(0,C.jsx)(`text`,{x:h,y:`40`,textAnchor:`middle`,children:e.axis.y[1]}),(0,C.jsx)(`text`,{x:h,y:`870`,textAnchor:`middle`,children:e.axis.y[0]}),(0,C.jsx)(`text`,{x:`25`,y:g+7,children:e.axis.x[0]}),(0,C.jsx)(`text`,{x:`1136`,y:g+7,textAnchor:`end`,children:e.axis.x[1]})]}),(0,C.jsx)(`text`,{className:`map-title`,x:u.bounds.left+8,y:u.bounds.bottom-34,children:e.title.split(` +`).replace(Qf,``)}function ep(e,t){return t=$f(t),$f(e)===t}function $(e,t,n,r,a,o){switch(n){case`children`:if(typeof r==`string`)t===`body`||t===`textarea`&&r===``||xn(e,r);else if(typeof r==`number`||typeof r==`bigint`)t!==`body`&&xn(e,``+r);else return;break;case`className`:on(e,`class`,r);break;case`tabIndex`:on(e,`tabindex`,r);break;case`dir`:case`role`:case`viewBox`:case`width`:case`height`:on(e,n,r);break;case`style`:wn(e,r,o);return;case`data`:if(t!==`object`){on(e,`data`,r);break}case`src`:case`href`:if(r===``&&(t!==`a`||n!==`href`)){e.removeAttribute(n);break}if(r==null||typeof r==`function`||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=On(r),e.setAttribute(n,r);break;case`action`:case`formAction`:if(typeof r==`function`){e.setAttribute(n,`javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')`);break}if(typeof o==`function`&&(n===`formAction`?(t!==`input`&&$(e,t,`name`,a.name,a,null),$(e,t,`formEncType`,a.formEncType,a,null),$(e,t,`formMethod`,a.formMethod,a,null),$(e,t,`formTarget`,a.formTarget,a,null)):($(e,t,`encType`,a.encType,a,null),$(e,t,`method`,a.method,a,null),$(e,t,`target`,a.target,a,null))),r==null||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=On(r),e.setAttribute(n,r);break;case`onClick`:r!=null&&(e.onclick=kn);return;case`onScroll`:r!=null&&Q(`scroll`,e);return;case`onScrollEnd`:r!=null&&Q(`scrollend`,e);return;case`dangerouslySetInnerHTML`:if(r!=null){if(typeof r!=`object`||!(`__html`in r))throw Error(i(61));if(n=r.__html,n!=null){if(a.children!=null)throw Error(i(60));o?.__html!==n&&(e.innerHTML=n)}}break;case`multiple`:e.multiple=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`muted`:e.muted=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`suppressContentEditableWarning`:case`suppressHydrationWarning`:case`defaultValue`:case`defaultChecked`:case`innerHTML`:case`ref`:break;case`autoFocus`:break;case`xlinkHref`:if(r==null||typeof r==`function`||typeof r==`boolean`||typeof r==`symbol`){e.removeAttribute(`xlink:href`);break}n=On(r),e.setAttributeNS(`http://www.w3.org/1999/xlink`,`xlink:href`,n);break;case`contentEditable`:case`spellCheck`:case`draggable`:case`value`:case`autoReverse`:case`externalResourcesRequired`:case`focusable`:case`preserveAlpha`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,r):e.removeAttribute(n);break;case`inert`:case`allowFullScreen`:case`async`:case`autoPlay`:case`controls`:case`credentialless`:case`default`:case`defer`:case`disabled`:case`disablePictureInPicture`:case`disableRemotePlayback`:case`formNoValidate`:case`hidden`:case`loop`:case`noModule`:case`noValidate`:case`open`:case`playsInline`:case`readOnly`:case`required`:case`reversed`:case`scoped`:case`seamless`:case`itemScope`:r&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``):e.removeAttribute(n);break;case`capture`:case`download`:!0===r?e.setAttribute(n,``):!1!==r&&r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,r):e.removeAttribute(n);break;case`cols`:case`rows`:case`size`:case`span`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case`rowSpan`:case`start`:r==null||typeof r==`function`||typeof r==`symbol`||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case`popover`:Q(`beforetoggle`,e),Q(`toggle`,e),an(e,`popover`,r);break;case`xlinkActuate`:sn(e,`http://www.w3.org/1999/xlink`,`xlink:actuate`,r);break;case`xlinkArcrole`:sn(e,`http://www.w3.org/1999/xlink`,`xlink:arcrole`,r);break;case`xlinkRole`:sn(e,`http://www.w3.org/1999/xlink`,`xlink:role`,r);break;case`xlinkShow`:sn(e,`http://www.w3.org/1999/xlink`,`xlink:show`,r);break;case`xlinkTitle`:sn(e,`http://www.w3.org/1999/xlink`,`xlink:title`,r);break;case`xlinkType`:sn(e,`http://www.w3.org/1999/xlink`,`xlink:type`,r);break;case`xmlBase`:sn(e,`http://www.w3.org/XML/1998/namespace`,`xml:base`,r);break;case`xmlLang`:sn(e,`http://www.w3.org/XML/1998/namespace`,`xml:lang`,r);break;case`xmlSpace`:sn(e,`http://www.w3.org/XML/1998/namespace`,`xml:space`,r);break;case`is`:an(e,`is`,r);break;case`innerText`:case`textContent`:return;default:if(!(2s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=mn(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),D(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+mn(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+mn(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+mn(n.imageSizes)+`"]`)):i+=`[href="`+mn(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=S({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[Ht]=!0,o.onload=o.onerror=function(){Jt(o)}),D(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+mn(r)+`"][href="`+mn(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=S({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),D(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=qt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=S({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);D(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=qt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),D(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=qt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),D(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var a=(a=Pe.current)?bm(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=qt(a).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var o=qt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Fm(e)))?o._p||(s.instance=o,s.state.loading=5):(o=vm.get(e),o||(o={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,o)),Lm(a,e,o,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=qt(a).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pm(e){return`href="`+mn(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return S({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[Ht]){r.loading=1;return}}else t=e.createElement(`link`),t[Ht]=!0,t.onload=t.onerror=Jt.bind(null,t),np(t,`link`,n),D(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+mn(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+mn(n.href)+`"]`);if(r)return t.instance=r,D(r),r;var a=S({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),D(r),np(r,`style`,a),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Pm(n.href);var o=e.querySelector(Fm(a));if(o)return t.state.loading|=4,t.instance=o,D(o),o;r=Im(n),(a=vm.get(a))&&Hm(r,a),o=(e.ownerDocument||e).createElement(`link`),D(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),np(o,`link`,r),t.state.loading|=4,Vm(o,n.precedence,e),t.instance=o;case`script`:return o=Rm(n.src),(a=e.querySelector(zm(o)))?(t.instance=a,D(a),a):(r=n,(a=vm.get(o))&&(r=S({},n),Um(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),D(a),np(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,D(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),D(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y={width:1200,height:900,pad:{left:76,right:46,top:55,bottom:82}},b=[[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[1,-1],[-1,1],[1,1]],ee=[22,34,48,64,82,104,130,160,196],te=(e,t,n,r)=>({cx:e,cy:t,width:n,height:r}),ne=(e,t)=>Math.abs(e.cx-t.cx)*2e.cx-e.width/2>=t.left&&e.cx+e.width/2<=t.right&&e.cy-e.height/2>=t.top&&e.cy+e.height/2<=t.bottom;function x(e){let t=[...e.countries,...e.models],n=Math.min(...t.map(e=>e.x)),r=Math.max(...t.map(e=>e.x)),i=Math.min(...t.map(e=>e.y)),a=Math.max(...t.map(e=>e.y)),o=(r-n)*.17,s=(a-i)*.17,c={x0:n-o,x1:r+o,y0:i-s,y1:a+s*1.22},l={left:y.pad.left,right:y.width-y.pad.right,top:y.pad.top,bottom:y.height-y.pad.bottom};return{x:e=>l.left+(e-c.x0)/(c.x1-c.x0)*(l.right-l.left),y:e=>l.bottom-(e-c.y0)/(c.y1-c.y0)*(l.bottom-l.top),bounds:l,limits:c}}function ie(e,t){let n=t===`zone`?15:t===`model`?13:11;return{width:e.length*n*.59+10,height:n+7}}function S(e,t){let{x:n,y:r,bounds:i}=t,a=[...e.countries.map(e=>te(n(e.x),r(e.y),10,10)),...e.models.map(e=>te(n(e.x),r(e.y),22,22))],o=[...e.models.filter(e=>e.label).map(e=>({id:`model:${e.name}`,point:e,text:e.label,kind:`model`})),...e.countries.filter(e=>e.label).map(e=>({id:`country:${e.name}`,point:e,text:e.name,kind:`country`})),...e.zone_hulls.map(e=>({id:`zone:${e.name}`,point:{x:e.label_anchor[0],y:e.label_anchor[1]},text:e.name,kind:`zone`}))],s={};for(let e of o){let t={x:n(e.point.x),y:r(e.point.y)},o=ie(e.text,e.kind),c=null;for(let e of ee){for(let[n,r]of b){let s=te(t.x+n*(e+o.width/3),t.y+r*e,o.width,o.height);if(re(s,i)&&!a.some(e=>ne(s,e))){c=s;break}}if(c)break}if(!c)throw Error(`no collision-free label location for ${e.id}`);s[e.id]={...c,anchor:t,kind:e.kind,text:e.text},a.push(c)}return s}function ae(e,t){let n=e.slice(0,-1).map(([e,n])=>({x:t.x(e),y:t.y(n)}));if(n.length<3)throw Error(`a closed hull needs three points`);let r=e=>n[(e+n.length)%n.length],i=(e,t)=>Math.hypot(e.x-t.x,e.y-t.y),a=(e,t,n)=>({x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}),o=e=>{let t=r(e-1),n=r(e),o=r(e+1),s=Math.min(.24,14/i(t,n),14/i(n,o));return{before:a(n,t,s),current:n,after:a(n,o,s)}},s=o(0),c=`M ${s.after.x} ${s.after.y}`;for(let e=1;e<=n.length;e+=1){let t=o(e%n.length);c+=` L ${t.before.x} ${t.before.y} Q ${t.current.x} ${t.current.y} ${t.after.x} ${t.after.y}`}return`${c} Z`}function oe(e){let t=x(e),n=S(e,t),r=Object.entries(n);for(let[e,n]of r)if(!re(n,t.bounds))throw Error(`label out of bounds: ${e}`);for(let e=0;e{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),C=o(((e,t)=>{t.exports=se()}))(),ce=`wvs/`;function le(e,t){return Object.keys(e).filter(e=>!t.has(e))}function ue({active:e,geometry:t,data:n,id:r=`model-tooltip`}){if(!e)return null;let{provenance:i}=e,a=e.tooltipLeft??`${Math.min(86,t.x(e.x)/y.width*100)}%`,o=e.tooltipTop??`${Math.min(82,t.y(e.y)/y.height*100)}%`,s=i.items===null?`historical coordinate`:`${i.items} items x ${i.samples} samples`;return(0,C.jsxs)(`aside`,{id:r,className:`tooltip`,style:{left:a,top:o},role:`status`,children:[(0,C.jsx)(`strong`,{children:e.name}),(0,C.jsx)(`span`,{children:e.family}),(0,C.jsxs)(`span`,{children:[n.axis.x[0],` `,`->`,` `,n.axis.x[1],`: `,e.x.toFixed(3)]}),(0,C.jsxs)(`span`,{children:[n.axis.y[0],` `,`->`,` `,n.axis.y[1],`: `,e.y.toFixed(3)]}),(0,C.jsxs)(`span`,{children:[i.readout,`, `,s]}),(0,C.jsx)(`span`,{children:i.release_created?`release ${i.release_created}`:i.release_source})]})}function de({model:e,placement:t,geometry:n,setActive:r,clearActive:i,markerRef:a,logo:o}){let s=n.x(e.x),c=n.y(e.y),l=e.label?t[`model:${e.name}`]:null,u=l&&Math.hypot(l.cx-s,l.cy-c)>20;return(0,C.jsxs)(`g`,{ref:a,className:`model-mark`,"data-family":e.family,"data-model":e.name,"data-x":e.x,"data-y":e.y,tabIndex:`0`,role:`button`,"aria-label":`${e.name}, ${e.family}`,"aria-describedby":`model-tooltip`,onPointerEnter:()=>r(e),onPointerLeave:i,onFocus:()=>r(e),onBlur:i,children:[u&&(0,C.jsx)(`line`,{className:`leader`,x1:s,y1:c,x2:l.cx,y2:l.cy}),(0,C.jsx)(`circle`,{className:`model-ring`,cx:s,cy:c,r:`8`,stroke:e.color}),(0,C.jsx)(`image`,{href:`${ce}${o}`,x:s-5,y:c-5,width:`10`,height:`10`,preserveAspectRatio:`xMidYMid meet`,"aria-hidden":`true`,focusable:`false`}),l&&(0,C.jsx)(`text`,{className:`model-label`,x:l.cx,y:l.cy+4,textAnchor:`middle`,children:e.label})]})}function fe(e,t){let n=e.map(e=>Date.parse(e.provenance.release_created)),r=e.map(e=>e[t]);if(new Set(n).size<2)return null;let i=n.reduce((e,t)=>e+t,0)/n.length,a=r.reduce((e,t)=>e+t,0)/r.length,o=n.reduce((e,t,n)=>e+(t-i)*(r[n]-a),0)/n.reduce((e,t)=>e+(t-i)**2,0),s=a-o*i,c=r.reduce((e,t,r)=>e+(t-(s+o*n[r]))**2,0),l=r.reduce((e,t)=>e+(t-a)**2,0);return{slope:o,intercept:s,n:e.length,r2:l===0?null:1-c/l}}function pe({data:e,hidden:t,field:n,title:r}){let i=(0,_.useMemo)(()=>e.models.filter(e=>Number.isFinite(Date.parse(e.provenance.release_created??``))).toSorted((e,t)=>e.provenance.release_created.localeCompare(t.provenance.release_created)||e.name.localeCompare(t.name)),[e]),a=i.filter(e=>!t.has(e.family)),o=fe(a,n),[s,c]=(0,_.useState)(null),l=1200,u=i.map(e=>Date.parse(e.provenance.release_created)),d=i.map(e=>e[n]),f=Math.min(...u),p=Math.max(...u),m=Math.min(...d),h=Math.max(...d),g=e=>96+(e-f)/(p-f)*1069,v=e=>42+(h-e)/(h-m||1)*230,y=`release-${n}`,b=`${y}-tooltip`,ee=n===`y`?e.axis.y:e.axis.x,te=a.map(e=>Date.parse(e.provenance.release_created)),ne=o&&[Math.min(...te),Math.max(...te)].map(e=>[g(e),v(o.intercept+o.slope*e)]),re=(e,t)=>{let n=t.currentTarget.closest(`.scatter-shell`).getBoundingClientRect(),r=t.currentTarget.getBoundingClientRect();c({...e,tooltipLeft:`${Math.min(82,(r.left-n.left)/n.width*100)}%`,tooltipTop:`${Math.min(78,(r.top-n.top)/n.height*100)}%`})};return(0,C.jsxs)(`section`,{className:`release-panel`,"data-coordinate":n,"aria-labelledby":`${y}-heading`,children:[(0,C.jsx)(`h2`,{id:`${y}-heading`,children:r}),(0,C.jsxs)(`div`,{className:`scatter-shell`,children:[(0,C.jsxs)(`svg`,{viewBox:`0 0 ${l} 320`,role:`img`,"aria-labelledby":`${y}-svg-title ${y}-svg-desc`,"data-panel-model-count":a.length,"data-fit-n":o?.n??0,"data-fit-r2":o?.r2??``,children:[(0,C.jsx)(`title`,{id:`${y}-svg-title`,children:r}),(0,C.jsxs)(`desc`,{id:`${y}-svg-desc`,children:[`Scatter plot with release date on the horizontal axis and `,ee.join(` to `),` increasing upward on the vertical axis. `,a.length,` dated models are visible from `,le(Object.groupBy(e.models,e=>e.family),t).join(`, `)||`no families`,`. Each white-ring logo mark is a model. `,o?`The thin line is an ordinary least squares descriptive fit to the ${o.n} currently visible dated models${o.r2===null?`; R squared is unavailable because the y values are constant`:`; R squared is ${o.r2.toFixed(2)}`}.`:`The fit is hidden because fewer than two distinct release dates are visible.`,` Hover or keyboard focus a mark for model-specific details.`]}),(0,C.jsxs)(`defs`,{children:[(0,C.jsx)(`marker`,{id:`${y}-arrow`,markerWidth:`8`,markerHeight:`8`,refX:`6`,refY:`3`,orient:`auto`,children:(0,C.jsx)(`path`,{d:`M0,0 L0,6 L6,3 z`,className:`scatter-arrow`})}),(0,C.jsx)(`clipPath`,{id:`${y}-fit-clip`,children:(0,C.jsx)(`rect`,{x:96,y:42,width:1069,height:230})})]}),(0,C.jsx)(`rect`,{className:`canvas`,width:l,height:320}),(0,C.jsx)(`g`,{className:`scatter-grid`,children:Array.from({length:5},(e,t)=>(0,C.jsx)(`line`,{x1:96,x2:1165,y1:42+t*230/4,y2:42+t*230/4},t))}),(0,C.jsx)(`line`,{className:`scatter-axis`,x1:96,x2:1165,y1:272,y2:272}),(0,C.jsx)(`line`,{className:`scatter-axis`,x1:96,x2:96,y1:272,y2:42,markerEnd:`url(#${y}-arrow)`}),(0,C.jsxs)(`text`,{className:`scatter-y-label`,x:`17`,y:157,textAnchor:`middle`,transform:`rotate(-90 17 157)`,children:[ee.join(` -> `),` `,`↑`]}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:96,y:302,children:new Date(f).toISOString().slice(0,10)}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:1165,y:302,textAnchor:`end`,children:new Date(p).toISOString().slice(0,10)}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:88,y:46,textAnchor:`end`,children:h.toFixed(2)}),(0,C.jsx)(`text`,{className:`scatter-tick`,x:88,y:272,textAnchor:`end`,children:m.toFixed(2)}),ne&&(0,C.jsxs)(`g`,{className:`release-fit`,"data-fit-n":o.n,"data-fit-r2":o.r2??``,children:[(0,C.jsx)(`line`,{clipPath:`url(#${y}-fit-clip)`,x1:ne[0][0],y1:ne[0][1],x2:ne[1][0],y2:ne[1][1]}),` `,(0,C.jsxs)(`text`,{x:102,y:55,children:[`OLS, n=`,o.n,`, R² `,o.r2===null?`unavailable`:o.r2.toFixed(2)]})]}),!o&&(0,C.jsx)(`text`,{className:`release-fit-unavailable`,x:102,y:55,children:`Fit unavailable: fewer than two release dates`}),i.map(r=>(0,C.jsxs)(`g`,{className:`release-mark`,"data-family":r.family,"data-release-model":r.name,"data-release-date":r.provenance.release_created,display:t.has(r.family)?`none`:`inline`,tabIndex:`0`,role:`button`,"aria-label":`${r.name}, ${r.family}, ${r.provenance.release_created}`,"aria-describedby":b,onPointerEnter:e=>re(r,e),onPointerLeave:()=>c(null),onFocus:e=>re(r,e),onBlur:()=>c(null),children:[(0,C.jsx)(`circle`,{className:`model-ring`,cx:g(Date.parse(r.provenance.release_created)),cy:v(r[n]),r:`8`,stroke:r.color}),(0,C.jsx)(`image`,{href:`${ce}${e.logos[r.family]}`,x:g(Date.parse(r.provenance.release_created))-5,y:v(r[n])-5,width:`10`,height:`10`,preserveAspectRatio:`xMidYMid meet`,"aria-hidden":`true`,focusable:`false`})]},r.name))]}),(0,C.jsx)(ue,{active:s,geometry:null,data:e,id:b})]})]})}function me({data:e,hidden:t}){return(0,C.jsxs)(`section`,{className:`release-panels`,"aria-label":`Release-date scatter panels`,children:[(0,C.jsx)(pe,{data:e,hidden:t,field:`y`,title:`Release date vs Secular-Rational`}),(0,C.jsx)(pe,{data:e,hidden:t,field:`x`,title:`Release date vs Self-expression`})]})}function he({data:e}){let t=new URLSearchParams(location.search),[n,r]=(0,_.useState)(()=>new Set(t.get(`hide`)?.split(`,`).filter(Boolean))),[i,a]=(0,_.useState)(()=>e.models.find(e=>e.name===(t.get(`tooltip`)||t.get(`focus`)))??null),o=t.get(`focus`),s=(0,_.useRef)(null),c=(0,_.useMemo)(()=>Object.groupBy(e.models,e=>e.family),[e]),{labels:l,geometry:u}=(0,_.useMemo)(()=>oe(e),[e]),d=le(c,n),f=e.models.filter(e=>!n.has(e.family)).length;(0,_.useEffect)(()=>{o&&s.current?.focus()},[o]);let p=e=>{e.currentTarget.matches(`:focus`)||a(null)},m=e=>r(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),h=u.x(e.median.x),g=u.y(e.median.y);return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`section`,{className:`controls`,"aria-label":`Model-family visibility`,children:Object.entries(c).map(([t])=>{let r=!n.has(t);return(0,C.jsxs)(`button`,{className:`chip`,type:`button`,"aria-pressed":r,onClick:()=>m(t),children:[(0,C.jsx)(`img`,{src:`${ce}${e.logos[t]}`,alt:``,"aria-hidden":`true`}),t]},t)})}),(0,C.jsxs)(`div`,{className:`chart-shell`,children:[(0,C.jsxs)(`svg`,{viewBox:`0 0 ${y.width} ${y.height}`,role:`img`,"aria-labelledby":`map-svg-title map-svg-desc`,"data-median-x":e.median.x,"data-median-y":e.median.y,"data-visible-model-count":f,children:[(0,C.jsx)(`title`,{id:`map-svg-title`,children:`Frontier LLMs on the World Values Survey`}),(0,C.jsxs)(`desc`,{id:`map-svg-desc`,children:[`World Values Survey cultural map. Horizontal direction runs from Self-expression on the left to Survival on the right. Vertical direction runs from Traditional below to Secular-Rational above. Coloured dots are selected WVS countries, outlines are cultural regions, and white-ring logo marks are models. `,f,` model marks are visible from `,d.join(`, `)||`no families`,`. Use the family controls to hide marks and labels. Hover or keyboard focus a model for model-specific details.`]}),(0,C.jsx)(`defs`,{children:(0,C.jsx)(`marker`,{id:`arrow`,markerWidth:`8`,markerHeight:`8`,refX:`6`,refY:`3`,orient:`auto`,children:(0,C.jsx)(`path`,{d:`M0,0 L0,6 L6,3 z`,className:`arrow`})})}),(0,C.jsx)(`rect`,{className:`canvas`,width:y.width,height:y.height}),(0,C.jsxs)(`g`,{className:`grid`,children:[Array.from({length:8},(e,t)=>(0,C.jsx)(`line`,{x1:u.bounds.left+t*(u.bounds.right-u.bounds.left)/7,y1:u.bounds.top,x2:u.bounds.left+t*(u.bounds.right-u.bounds.left)/7,y2:u.bounds.bottom},`v${t}`)),Array.from({length:6},(e,t)=>(0,C.jsx)(`line`,{x1:u.bounds.left,y1:u.bounds.top+t*(u.bounds.bottom-u.bounds.top)/5,x2:u.bounds.right,y2:u.bounds.top+t*(u.bounds.bottom-u.bounds.top)/5},`h${t}`))]}),(0,C.jsx)(`line`,{className:`median`,x1:u.bounds.left,y1:g,x2:u.bounds.right,y2:g}),(0,C.jsx)(`line`,{className:`median`,x1:h,y1:u.bounds.top,x2:h,y2:u.bounds.bottom}),e.zone_hulls.map(e=>(0,C.jsx)(`path`,{className:`zone`,d:ae(e.points,u),stroke:e.color},e.name)),e.countries.map(e=>(0,C.jsxs)(`g`,{children:[(0,C.jsx)(`circle`,{className:`country`,"data-country":e.name,"data-x":e.x,"data-y":e.y,cx:u.x(e.x),cy:u.y(e.y),r:`3.5`,fill:e.color}),e.label&&(0,C.jsx)(`text`,{className:`country-label`,x:l[`country:${e.name}`].cx,y:l[`country:${e.name}`].cy+4,textAnchor:`middle`,children:e.name})]},e.name)),e.zone_hulls.map(e=>(0,C.jsx)(`text`,{className:`zone-label`,x:l[`zone:${e.name}`].cx,y:l[`zone:${e.name}`].cy+5,textAnchor:`middle`,fill:e.color,children:e.name},e.name)),Object.entries(c).map(([t,r])=>(0,C.jsx)(`g`,{"data-family":t,display:n.has(t)?`none`:`inline`,children:r.map(t=>(0,C.jsx)(de,{model:t,placement:l,geometry:u,setActive:a,clearActive:p,markerRef:t.name===o?s:null,logo:e.logos[t.family]},t.name))},t)),(0,C.jsxs)(`g`,{className:`poles`,children:[(0,C.jsx)(`line`,{x1:h,y1:`62`,x2:h,y2:u.bounds.top,markerEnd:`url(#arrow)`}),(0,C.jsx)(`line`,{x1:h,y1:u.bounds.bottom,x2:h,y2:`838`,markerEnd:`url(#arrow)`}),(0,C.jsx)(`line`,{x1:`64`,y1:g,x2:u.bounds.left,y2:g,markerEnd:`url(#arrow)`}),(0,C.jsx)(`line`,{x1:u.bounds.right,y1:g,x2:`1184`,y2:g,markerEnd:`url(#arrow)`}),(0,C.jsx)(`text`,{x:h,y:`40`,textAnchor:`middle`,children:e.axis.y[1]}),(0,C.jsx)(`text`,{x:h,y:`870`,textAnchor:`middle`,children:e.axis.y[0]}),(0,C.jsx)(`text`,{x:`25`,y:g+7,children:e.axis.x[0]}),(0,C.jsx)(`text`,{x:`1136`,y:g+7,textAnchor:`end`,children:e.axis.x[1]})]}),(0,C.jsx)(`text`,{className:`map-title`,x:u.bounds.left+8,y:u.bounds.bottom-34,children:e.title.split(` `).map((e,t)=>(0,C.jsx)(`tspan`,{x:u.bounds.left+8,dy:t?17:0,children:e},e))}),(0,C.jsx)(`text`,{className:`map-note`,x:u.bounds.right-8,y:u.bounds.bottom-20,textAnchor:`end`,children:e.note.split(` -`).map((e,t)=>(0,C.jsx)(`tspan`,{x:u.bounds.right-8,dy:t?11:0,children:e},e))})]}),(0,C.jsx)(ue,{active:i,geometry:u,data:e})]}),(0,C.jsx)(pe,{data:e,hidden:n})]})}function he(){let[e,t]=(0,_.useState)(null);return(0,_.useEffect)(()=>{fetch(`wvs/wvs_map_data.json`).then(e=>e.json()).then(t)},[]),(0,C.jsxs)(`main`,{children:[(0,C.jsx)(`h1`,{children:`How do AI models score on human values surveys? Which culture are they most similar to? Is it changing over time?`}),(0,C.jsxs)(`p`,{className:`lede`,children:[`To answer these we start with the `,(0,C.jsx)(`a`,{href:`https://www.worldvaluessurvey.org/`,children:`World Values Survey`}),`, the standard culture map of the world. Since 1981 it has asked people in about ninety countries the same questions. Two axes drawn from it sort societies by how traditional or secular they are and how much they weigh survival over self-expression.`]}),(0,C.jsxs)(`p`,{className:`caption`,children:[`Use the family controls to compare saved model coordinates. Hover or keyboard focus a mark for its model-specific provenance. See the `,(0,C.jsx)(`a`,{href:`https://github.com/wassname/moral-maps`,children:`code and records`}),`.`]}),e&&(0,C.jsx)(me,{data:e})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,C.jsx)(he,{})); \ No newline at end of file +`).map((e,t)=>(0,C.jsx)(`tspan`,{x:u.bounds.right-8,dy:t?11:0,children:e},e))})]}),(0,C.jsx)(ue,{active:i,geometry:u,data:e})]}),(0,C.jsx)(me,{data:e,hidden:n})]})}function ge(){let[e,t]=(0,_.useState)(null);return(0,_.useEffect)(()=>{fetch(`wvs/wvs_map_data.json`).then(e=>e.json()).then(t)},[]),(0,C.jsxs)(`main`,{children:[(0,C.jsx)(`h1`,{children:`How do AI models score on human values surveys? Which culture are they most similar to? Is it changing over time?`}),(0,C.jsxs)(`p`,{className:`lede`,children:[`To answer these we start with the `,(0,C.jsx)(`a`,{href:`https://www.worldvaluessurvey.org/`,children:`World Values Survey`}),`, the standard culture map of the world. Since 1981 it has asked people in about ninety countries the same questions. Two axes drawn from it sort societies by how traditional or secular they are and how much they weigh survival over self-expression.`]}),(0,C.jsxs)(`p`,{className:`caption`,children:[`Use the family controls to compare saved model coordinates. The release-date panels fit ordinary least squares lines only to the dated models currently shown; n and R² update with visibility and describe correlation, not cause. Hover or keyboard focus a mark for model-specific provenance. See the `,(0,C.jsx)(`a`,{href:`https://github.com/wassname/moral-maps`,children:`code and records`}),`.`]}),e&&(0,C.jsx)(he,{data:e})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,C.jsx)(ge,{})); \ No newline at end of file diff --git a/docs/assets/index-Ctfw88gw.css b/docs/assets/index-Ctfw88gw.css deleted file mode 100644 index 9cfb295..0000000 --- a/docs/assets/index-Ctfw88gw.css +++ /dev/null @@ -1 +0,0 @@ -:root{--ink:#333;--muted:#8a857a;--rule:#eceadf;--canvas:#faf8f2}*{box-sizing:border-box}body{background:var(--canvas);color:var(--ink);margin:0;font:16px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}main{max-width:1200px;margin:auto;padding:1.5rem 1rem 3rem}h1{margin:0 0 .35rem;font-size:1.65rem;line-height:1.2}.lede{color:#59544b;max-width:75ch}.controls{flex-wrap:wrap;gap:.35rem;margin:1rem 0;display:flex}.chip{color:var(--ink);cursor:pointer;background:#fff;border:1px solid #d9d5ca;border-radius:999px;align-items:center;gap:.3rem;padding:.22rem .48rem;font:600 .78rem/1 inherit;display:flex}.chip img{width:13px;height:13px}.chip:hover{border-color:#8a857a}.chip:focus-visible,.model-mark:focus-visible{outline-offset:2px;outline:2px solid #2563eb}.chip[aria-pressed=false]{color:#8a857a;background:#f6f4ef;text-decoration:line-through}.chip[aria-pressed=false] img{opacity:.3}.chart-shell{position:relative}.chart-shell svg{background:var(--canvas);border:1px solid #ded9cc;width:100%;height:auto;display:block}.canvas{fill:var(--canvas)}.grid line{stroke:var(--rule);stroke-width:.7px}.median{stroke:#c9c4b4;stroke-width:1.2px}.zone{fill:none;stroke-width:2px;opacity:.9}.country{stroke:#fff;stroke-width:.7px;opacity:.88}.country-label,.model-label,.zone-label,.poles text{paint-order:stroke;stroke:var(--canvas);stroke-width:4px;stroke-linejoin:round}.country-label{fill:#222;font-size:11px}.model-ring{fill:#fff;stroke-width:2px}.model-mark{cursor:default}.model-mark:focus{outline:none}.model-label{fill:#222;font-size:13px;font-weight:700}.leader{stroke:#aaa398;stroke-width:1px}.zone-label{font-size:15px;font-style:italic;font-weight:700}.poles line{stroke:#999;stroke-width:1.8px}.arrow{fill:#999}.poles text{fill:#555;font-size:18px;font-weight:700}.map-title{fill:#333;font-size:14px;font-weight:700}.map-note{fill:var(--muted);font-size:10px}.release-panels{grid-template-columns:1fr;gap:1rem;margin-top:1.5rem;display:grid}.release-panel{border-top:1px solid #ded9cc;padding-top:1rem}.release-panel h2{margin:0;font-size:1rem}.release-panel p{color:#756f64;margin:.2rem 0 .5rem;font-size:.82rem}.scatter-shell{position:relative}.scatter-shell svg{background:var(--canvas);border:1px solid #ded9cc;width:100%;height:auto;display:block}.scatter-grid line{stroke:var(--rule);stroke-width:.7px}.scatter-axis{stroke:#aaa398;stroke-width:1px}.scatter-tick{fill:#756f64;font-size:11px}.release-mark{cursor:default}.release-mark:focus{outline:none}.tooltip{z-index:2;pointer-events:none;background:#fffffff7;border:1px solid #ddd7ca;border-radius:5px;max-width:275px;padding:.45rem .6rem;font-size:.82rem;line-height:1.35;position:absolute;transform:translate(14px,14px);box-shadow:0 2px 8px #0002}.tooltip strong,.tooltip span{display:block}.tooltip span{color:#5b554b}@media (width<=700px){main{padding:.9rem .5rem 2rem}.chip{font-size:.7rem}.poles text{font-size:14px}.country-label,.model-label{font-size:10px}.tooltip{max-width:230px;font-size:.75rem}} diff --git a/docs/assets/index-CyPTsa3p.css b/docs/assets/index-CyPTsa3p.css new file mode 100644 index 0000000..fd4eecc --- /dev/null +++ b/docs/assets/index-CyPTsa3p.css @@ -0,0 +1 @@ +:root{--ink:#333;--muted:#8a857a;--rule:#eceadf;--canvas:#faf8f2}*{box-sizing:border-box}body{background:var(--canvas);color:var(--ink);margin:0;font:16px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}main{max-width:1200px;margin:auto;padding:1.5rem 1rem 3rem}h1{margin:0 0 .35rem;font-size:1.65rem;line-height:1.2}.lede{color:#59544b;max-width:75ch}.controls{flex-wrap:wrap;gap:.35rem;margin:1rem 0;display:flex}.chip{color:var(--ink);cursor:pointer;background:#fff;border:1px solid #d9d5ca;border-radius:999px;align-items:center;gap:.3rem;padding:.22rem .48rem;font:600 .78rem/1 inherit;display:flex}.chip img{width:13px;height:13px}.chip:hover{border-color:#8a857a}.chip:focus-visible,.model-mark:focus-visible{outline-offset:2px;outline:2px solid #2563eb}.chip[aria-pressed=false]{color:#8a857a;background:#f6f4ef;text-decoration:line-through}.chip[aria-pressed=false] img{opacity:.3}.chart-shell{position:relative}.chart-shell svg{background:var(--canvas);border:1px solid #ded9cc;width:100%;height:auto;display:block}.canvas{fill:var(--canvas)}.grid line{stroke:var(--rule);stroke-width:.7px}.median{stroke:#c9c4b4;stroke-width:1.2px}.zone{fill:none;stroke-width:2px;opacity:.9}.country{stroke:#fff;stroke-width:.7px;opacity:.88}.country-label,.model-label,.zone-label,.poles text{paint-order:stroke;stroke:var(--canvas);stroke-width:4px;stroke-linejoin:round}.country-label{fill:#222;font-size:11px}.model-ring{fill:#fff;stroke-width:1.3px}.model-mark{cursor:default}.model-mark:focus{outline:none}.model-label{fill:#222;font-size:13px;font-weight:700}.leader{stroke:#aaa398;stroke-width:1px}.zone-label{font-size:15px;font-style:italic;font-weight:700}.poles line{stroke:#999;stroke-width:1.8px}.arrow{fill:#999}.poles text{fill:#555;font-size:18px;font-weight:700}.map-title{fill:#333;font-size:14px;font-weight:700}.map-note{fill:var(--muted);font-size:10px}.release-panels{grid-template-columns:1fr;gap:1rem;margin-top:1.5rem;display:grid}.release-panel{border-top:1px solid #ded9cc;padding-top:1rem}.release-panel h2{margin:0;font-size:1rem}.release-panel p{color:#756f64;margin:.2rem 0 .5rem;font-size:.82rem}.scatter-shell{position:relative}.scatter-shell svg{background:var(--canvas);border:1px solid #ded9cc;width:100%;height:auto;display:block}.scatter-grid line{stroke:var(--rule);stroke-width:.7px}.scatter-axis{stroke:#aaa398;stroke-width:1px}.scatter-arrow{fill:#aaa398}.scatter-y-label{fill:#555;font-size:12px;font-weight:700}.scatter-tick{fill:#756f64;font-size:11px}.release-fit line{stroke:#56514a;stroke-width:1.4px;stroke-dasharray:4 3}.release-fit text,.release-fit-unavailable{fill:#56514a;font-size:11px;font-weight:700}.release-mark{cursor:default}.release-mark:focus{outline:none}.tooltip{z-index:2;pointer-events:none;background:#fffffff7;border:1px solid #ddd7ca;border-radius:5px;max-width:275px;padding:.45rem .6rem;font-size:.82rem;line-height:1.35;position:absolute;transform:translate(14px,14px);box-shadow:0 2px 8px #0002}.tooltip strong,.tooltip span{display:block}.tooltip span{color:#5b554b}@media (width<=700px){main{padding:.9rem .5rem 2rem}.chip{font-size:.7rem}.poles text{font-size:14px}.country-label,.model-label{font-size:10px}.tooltip{max-width:230px;font-size:.75rem}} diff --git a/docs/index.html b/docs/index.html index d965a2b..50ea27b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,8 +4,8 @@ Frontier LLMs on the World Values Survey - - + +
diff --git a/docs/wvs/index.html b/docs/wvs/index.html index 47ad6b6..a35a665 100644 --- a/docs/wvs/index.html +++ b/docs/wvs/index.html @@ -1,43 +1,13 @@ - - -Frontier LLMs on the World Values Survey - -
-

Frontier LLMs on the World Values Survey

-

Rated sampling, 12 items x 12 samples for new points. Filled chips are visible; an outlined, struck-through chip hides that family’s stars. Each chip carries the family’s latest-release name. Grey dots are WVS countries, coloured stars are models, and dashed hulls are cultural regions. Coordinates, labels, family membership and colours come from wvs_map_data.json, the generated artifact shared with the static map.

-

Try the matching React/SVG renderer.

-
- -

Historical coordinates are recovered rounded display values. Coder and vision-language Qwen variants are visible but are specialized variants, not direct-instruct size-trend evidence. See the repository CI table and request ledger for sample and protocol evidence.

-
- + + + + + + + Frontier LLMs on the World Values Survey + + +

The WVS map moved to the site root.

+ + diff --git a/scripts/wvs_react/src/main.jsx b/scripts/wvs_react/src/main.jsx index c457ec2..3b63c87 100644 --- a/scripts/wvs_react/src/main.jsx +++ b/scripts/wvs_react/src/main.jsx @@ -34,18 +34,34 @@ function ModelMarker({ model, placement, geometry, setActive, clearActive, marke onPointerEnter={() => setActive(model)} onPointerLeave={clearActive} onFocus={() => setActive(model)} onBlur={clearActive}> {leader && } - - + + {label && {model.label}} ; } +function ordinaryLeastSquares(models, field) { + const x = models.map(model => Date.parse(model.provenance.release_created)); + const y = models.map(model => model[field]); + const uniqueX = new Set(x); + if (uniqueX.size < 2) return null; + const xMean = x.reduce((sum, value) => sum + value, 0) / x.length; + const yMean = y.reduce((sum, value) => sum + value, 0) / y.length; + const slope = x.reduce((sum, value, index) => sum + (value - xMean) * (y[index] - yMean), 0) + / x.reduce((sum, value) => sum + (value - xMean) ** 2, 0); + const intercept = yMean - slope * xMean; + const residual = y.reduce((sum, value, index) => sum + (value - (intercept + slope * x[index])) ** 2, 0); + const total = y.reduce((sum, value) => sum + (value - yMean) ** 2, 0); + return { slope, intercept, n: models.length, r2: total === 0 ? null : 1 - residual / total }; +} + function ReleaseScatter({ data, hidden, field, title }) { const dated = useMemo(() => data.models.filter(model => Number.isFinite(Date.parse(model.provenance.release_created ?? ''))) .toSorted((a, b) => a.provenance.release_created.localeCompare(b.provenance.release_created) || a.name.localeCompare(b.name)), [data]); const visible = dated.filter(model => !hidden.has(model.family)); + const fit = ordinaryLeastSquares(visible, field); const [active, setActive] = useState(null); - const width = 1200, height = 320, left = 74, right = 35, top = 42, bottom = 48; + const width = 1200, height = 320, left = 96, right = 35, top = 42, bottom = 48; const dates = dated.map(model => Date.parse(model.provenance.release_created)); const values = dated.map(model => model[field]); const minDate = Math.min(...dates), maxDate = Math.max(...dates); @@ -54,6 +70,9 @@ function ReleaseScatter({ data, hidden, field, title }) { const valueY = value => top + (maxValue - value) / (maxValue - minValue || 1) * (height - top - bottom); const panelId = `release-${field}`; const tooltipId = `${panelId}-tooltip`; + const yDirection = field === 'y' ? data.axis.y : data.axis.x; + const visibleDates = visible.map(model => Date.parse(model.provenance.release_created)); + const fitEnd = fit && [Math.min(...visibleDates), Math.max(...visibleDates)].map(date => [dateX(date), valueY(fit.intercept + fit.slope * date)]); const activate = (model, event) => { const box = event.currentTarget.closest('.scatter-shell').getBoundingClientRect(); const point = event.currentTarget.getBoundingClientRect(); @@ -62,22 +81,26 @@ function ReleaseScatter({ data, hidden, field, title }) { return

{title}

- + {title} - Scatter plot with release date on the horizontal axis and {field === 'y' ? 'Secular-Rational' : 'Self-expression'} on the vertical axis. {visible.length} dated models are visible from {visibleFamilyNames(Object.groupBy(data.models, model => model.family), hidden).join(', ') || 'no families'}. Each white-ring logo mark is a model. Hover or keyboard focus a mark for model-specific details. + Scatter plot with release date on the horizontal axis and {yDirection.join(' to ')} increasing upward on the vertical axis. {visible.length} dated models are visible from {visibleFamilyNames(Object.groupBy(data.models, model => model.family), hidden).join(', ') || 'no families'}. Each white-ring logo mark is a model. {fit ? `The thin line is an ordinary least squares descriptive fit to the ${fit.n} currently visible dated models${fit.r2 === null ? '; R squared is unavailable because the y values are constant' : `; R squared is ${fit.r2.toFixed(2)}`}.` : 'The fit is hidden because fewer than two distinct release dates are visible.'} Hover or keyboard focus a mark for model-specific details. + {Array.from({ length: 5 }, (_, index) => )} - + + {yDirection.join(' -> ')} {'↑'} {new Date(minDate).toISOString().slice(0, 10)} {new Date(maxDate).toISOString().slice(0, 10)} {maxValue.toFixed(2)} {minValue.toFixed(2)} + {fitEnd && OLS, n={fit.n}, R² {fit.r2 === null ? 'unavailable' : fit.r2.toFixed(2)}} + {!fit && Fit unavailable: fewer than two release dates} {dated.map(model => activate(model, event)} onPointerLeave={() => setActive(null)} onFocus={event => activate(model, event)} onBlur={() => setActive(null)}> - - + + )} @@ -153,7 +176,7 @@ function App() { return

How do AI models score on human values surveys? Which culture are they most similar to? Is it changing over time?

To answer these we start with the World Values Survey, the standard culture map of the world. Since 1981 it has asked people in about ninety countries the same questions. Two axes drawn from it sort societies by how traditional or secular they are and how much they weigh survival over self-expression.

-

Use the family controls to compare saved model coordinates. Hover or keyboard focus a mark for its model-specific provenance. See the code and records.

+

Use the family controls to compare saved model coordinates. The release-date panels fit ordinary least squares lines only to the dated models currently shown; n and R² update with visibility and describe correlation, not cause. Hover or keyboard focus a mark for model-specific provenance. See the code and records.

{data && } ; } diff --git a/scripts/wvs_react/src/style.css b/scripts/wvs_react/src/style.css index ec76e3e..ec68eee 100644 --- a/scripts/wvs_react/src/style.css +++ b/scripts/wvs_react/src/style.css @@ -1 +1 @@ -:root{--ink:#333;--muted:#8a857a;--rule:#eceadf;--canvas:#faf8f2}*{box-sizing:border-box}body{margin:0;background:var(--canvas);color:var(--ink);font:16px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}main{max-width:1200px;margin:auto;padding:1.5rem 1rem 3rem}h1{font-size:1.65rem;line-height:1.2;margin:0 0 .35rem}.lede{max-width:75ch;color:#59544b}.controls{display:flex;flex-wrap:wrap;gap:.35rem;margin:1rem 0}.chip{display:flex;align-items:center;gap:.3rem;padding:.22rem .48rem;border:1px solid #d9d5ca;border-radius:999px;background:white;color:var(--ink);font:600 .78rem/1 inherit;cursor:pointer}.chip img{width:13px;height:13px}.chip:hover{border-color:#8a857a}.chip:focus-visible,.model-mark:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.chip[aria-pressed="false"]{color:#8a857a;background:#f6f4ef;text-decoration:line-through}.chip[aria-pressed="false"] img{opacity:.3}.chart-shell{position:relative}.chart-shell svg{display:block;width:100%;height:auto;border:1px solid #ded9cc;background:var(--canvas)}.canvas{fill:var(--canvas)}.grid line{stroke:var(--rule);stroke-width:.7}.median{stroke:#c9c4b4;stroke-width:1.2}.zone{fill:none;stroke-width:2;opacity:.9}.country{stroke:white;stroke-width:.7;opacity:.88}.country-label,.model-label,.zone-label,.poles text{paint-order:stroke;stroke:var(--canvas);stroke-width:4px;stroke-linejoin:round}.country-label{fill:#222;font-size:11px}.model-ring{fill:white;stroke-width:2}.model-mark{cursor:default}.model-mark:focus{outline:none}.model-label{fill:#222;font-size:13px;font-weight:700}.leader{stroke:#aaa398;stroke-width:1}.zone-label{font-size:15px;font-style:italic;font-weight:700}.poles line{stroke:#999;stroke-width:1.8}.arrow{fill:#999}.poles text{fill:#555;font-size:18px;font-weight:700}.map-title{fill:#333;font-size:14px;font-weight:700}.map-note{fill:var(--muted);font-size:10px}.release-panels{display:grid;grid-template-columns:1fr;gap:1rem;margin-top:1.5rem}.release-panel{border-top:1px solid #ded9cc;padding-top:1rem}.release-panel h2{font-size:1rem;margin:0}.release-panel p{margin:.2rem 0 .5rem;color:#756f64;font-size:.82rem}.scatter-shell{position:relative}.scatter-shell svg{display:block;width:100%;height:auto;border:1px solid #ded9cc;background:var(--canvas)}.scatter-grid line{stroke:var(--rule);stroke-width:.7}.scatter-axis{stroke:#aaa398;stroke-width:1}.scatter-tick{fill:#756f64;font-size:11px}.release-mark{cursor:default}.release-mark:focus{outline:none}.tooltip{position:absolute;z-index:2;max-width:275px;transform:translate(14px,14px);pointer-events:none;border:1px solid #ddd7ca;border-radius:5px;padding:.45rem .6rem;background:rgba(255,255,255,.97);box-shadow:0 2px 8px #0002;font-size:.82rem;line-height:1.35}.tooltip strong,.tooltip span{display:block}.tooltip span{color:#5b554b}@media(max-width:700px){main{padding:.9rem .5rem 2rem}.chip{font-size:.7rem}.poles text{font-size:14px}.country-label,.model-label{font-size:10px}.tooltip{max-width:230px;font-size:.75rem}} \ No newline at end of file +:root{--ink:#333;--muted:#8a857a;--rule:#eceadf;--canvas:#faf8f2}*{box-sizing:border-box}body{margin:0;background:var(--canvas);color:var(--ink);font:16px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}main{max-width:1200px;margin:auto;padding:1.5rem 1rem 3rem}h1{font-size:1.65rem;line-height:1.2;margin:0 0 .35rem}.lede{max-width:75ch;color:#59544b}.controls{display:flex;flex-wrap:wrap;gap:.35rem;margin:1rem 0}.chip{display:flex;align-items:center;gap:.3rem;padding:.22rem .48rem;border:1px solid #d9d5ca;border-radius:999px;background:white;color:var(--ink);font:600 .78rem/1 inherit;cursor:pointer}.chip img{width:13px;height:13px}.chip:hover{border-color:#8a857a}.chip:focus-visible,.model-mark:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.chip[aria-pressed="false"]{color:#8a857a;background:#f6f4ef;text-decoration:line-through}.chip[aria-pressed="false"] img{opacity:.3}.chart-shell{position:relative}.chart-shell svg{display:block;width:100%;height:auto;border:1px solid #ded9cc;background:var(--canvas)}.canvas{fill:var(--canvas)}.grid line{stroke:var(--rule);stroke-width:.7}.median{stroke:#c9c4b4;stroke-width:1.2}.zone{fill:none;stroke-width:2;opacity:.9}.country{stroke:white;stroke-width:.7;opacity:.88}.country-label,.model-label,.zone-label,.poles text{paint-order:stroke;stroke:var(--canvas);stroke-width:4px;stroke-linejoin:round}.country-label{fill:#222;font-size:11px}.model-ring{fill:white;stroke-width:1.3}.model-mark{cursor:default}.model-mark:focus{outline:none}.model-label{fill:#222;font-size:13px;font-weight:700}.leader{stroke:#aaa398;stroke-width:1}.zone-label{font-size:15px;font-style:italic;font-weight:700}.poles line{stroke:#999;stroke-width:1.8}.arrow{fill:#999}.poles text{fill:#555;font-size:18px;font-weight:700}.map-title{fill:#333;font-size:14px;font-weight:700}.map-note{fill:var(--muted);font-size:10px}.release-panels{display:grid;grid-template-columns:1fr;gap:1rem;margin-top:1.5rem}.release-panel{border-top:1px solid #ded9cc;padding-top:1rem}.release-panel h2{font-size:1rem;margin:0}.release-panel p{margin:.2rem 0 .5rem;color:#756f64;font-size:.82rem}.scatter-shell{position:relative}.scatter-shell svg{display:block;width:100%;height:auto;border:1px solid #ded9cc;background:var(--canvas)}.scatter-grid line{stroke:var(--rule);stroke-width:.7}.scatter-axis{stroke:#aaa398;stroke-width:1}.scatter-arrow{fill:#aaa398}.scatter-y-label{fill:#555;font-size:12px;font-weight:700}.scatter-tick{fill:#756f64;font-size:11px}.release-fit line{stroke:#56514a;stroke-width:1.4;stroke-dasharray:4 3}.release-fit text,.release-fit-unavailable{fill:#56514a;font-size:11px;font-weight:700}.release-mark{cursor:default}.release-mark:focus{outline:none}.tooltip{position:absolute;z-index:2;max-width:275px;transform:translate(14px,14px);pointer-events:none;border:1px solid #ddd7ca;border-radius:5px;padding:.45rem .6rem;background:rgba(255,255,255,.97);box-shadow:0 2px 8px #0002;font-size:.82rem;line-height:1.35}.tooltip strong,.tooltip span{display:block}.tooltip span{color:#5b554b}@media(max-width:700px){main{padding:.9rem .5rem 2rem}.chip{font-size:.7rem}.poles text{font-size:14px}.country-label,.model-label{font-size:10px}.tooltip{max-width:230px;font-size:.75rem}} \ No newline at end of file diff --git a/scripts/wvs_react/uat.py b/scripts/wvs_react/uat.py index a0643fb..7ee6fe3 100644 --- a/scripts/wvs_react/uat.py +++ b/scripts/wvs_react/uat.py @@ -30,6 +30,12 @@ def svg_description(page, selector: str, title_id: str, desc_id: str) -> None: assert svg.locator(f"desc#{desc_id}").text_content() +def country_positions(page) -> list[list[str]]: + return page.locator("circle.country").evaluate_all( + "nodes => nodes.map(node => [node.getAttribute('cx'), node.getAttribute('cy')])" + ) + + def main() -> None: OUT.mkdir(parents=True, exist_ok=True) chrome = shutil.which("google-chrome") @@ -42,6 +48,8 @@ def main() -> None: assert len(data["zone_hulls"]) == 4 assert len(data["latest_by_family"]) == 13 assert all(len(zone["points"]) >= 30 for zone in data["zone_hulls"]) + dated = [model for model in data["models"] if model["provenance"]["release_created"]] + families = {model["family"] for model in data["models"]} with sync_playwright() as playwright: browser = playwright.chromium.launch(executable_path=chrome, headless=True, args=["--no-sandbox"]) @@ -50,8 +58,9 @@ def main() -> None: page.on("pageerror", lambda error: errors.append(str(error))) screenshot(page, f"{BASE}/img/wvs/wvs_map_iw.png", "wvs_static_playwright.png") - screenshot(page, f"{BASE}/wvs/", "wvs_vanilla_playwright.png") - assert page.locator("#map").count() == 1 + screenshot(page, f"{BASE}/wvs/", "wvs_static_redirect.png") + page.wait_for_selector("svg .model-mark") + assert page.url == f"{BASE}/" screenshot(page, f"{BASE}/", "wvs_react_root_playwright_default.png") page.wait_for_selector("svg .model-mark") @@ -59,37 +68,34 @@ def main() -> None: assert page.locator("html").get_attribute("lang") == "en" assert page.locator('meta[name="viewport"]').count() == 1 assert page.locator("h1").inner_text().startswith("How do AI models score on human values surveys?") - assert "React/SVG rendering" not in page.locator("main").inner_text() - assert "Artificial Analysis" not in page.locator("main").inner_text() - assert "Historical coordinates" not in page.locator("main").inner_text() - assert "Dated releases only" not in page.locator("main").inner_text() + visible_copy = page.locator("main").inner_text() + for absent in ("React/SVG rendering", "Artificial Analysis", "Historical coordinates", "Dated releases only"): + assert absent not in visible_copy + assert "ordinary least squares" in visible_copy map_svg = page.locator("svg[data-median-x]") svg_description(page, "svg[data-median-x]", "map-svg-title", "map-svg-desc") - assert "64 model marks" in map_svg.locator("desc").text_content() assert page.locator("path.zone").count() == 4 assert page.locator("polygon.zone").count() == 0 assert page.locator(".map-note").get_attribute("text-anchor") == "end" assert float(page.locator(".map-note").get_attribute("x")) > float(page.locator(".map-title").get_attribute("x")) assert float(map_svg.get_attribute("data-median-x")) == data["median"]["x"] assert float(map_svg.get_attribute("data-median-y")) == data["median"]["y"] - rendered_models = page.locator(".model-mark").evaluate_all( + models_dom = page.locator(".model-mark").evaluate_all( "nodes => nodes.map(node => [node.dataset.model, Number(node.dataset.x), Number(node.dataset.y)])" ) - assert sorted(rendered_models) == sorted([[model["name"], model["x"], model["y"]] for model in data["models"]]) - rendered_countries = page.locator("circle.country").evaluate_all( + assert sorted(models_dom) == sorted([[model["name"], model["x"], model["y"]] for model in data["models"]]) + countries_dom = page.locator("circle.country").evaluate_all( "nodes => nodes.map(node => [node.dataset.country, Number(node.dataset.x), Number(node.dataset.y)])" ) - assert rendered_countries == [[country["name"], country["x"], country["y"]] for country in data["countries"]] + assert countries_dom == [[country["name"], country["x"], country["y"]] for country in data["countries"]] assert page.locator(".chip").count() == 13 - assert all(name for name in page.locator(".chip").evaluate_all("nodes => nodes.map(node => node.getAttribute('aria-label') || node.innerText)")) - assert all(value == "true" for value in page.locator(".chip img").evaluate_all("nodes => nodes.map(node => node.getAttribute('aria-hidden'))")) - assert all(value == "true" for value in page.locator(".model-mark image, .release-mark image").evaluate_all("nodes => nodes.map(node => node.getAttribute('aria-hidden'))")) - assert all(page.locator(".model-mark").evaluate_all("nodes => nodes.map(node => node.getAttribute('aria-label'))")) - country_before = page.locator("circle.country").evaluate_all( - "nodes => nodes.map(node => [node.getAttribute('cx'), node.getAttribute('cy')])" - ) - dated = [model for model in data["models"] if model["provenance"]["release_created"]] + assert all(page.locator(".chip").evaluate_all("nodes => nodes.map(node => node.innerText)")) + assert all(value == "true" for value in page.locator(".chip img, .model-mark image, .release-mark image").evaluate_all("nodes => nodes.map(node => node.getAttribute('aria-hidden'))")) + assert all(float(value) == 8 for value in page.locator(".model-ring").evaluate_all("nodes => nodes.map(node => node.getAttribute('r'))")) + assert all(width > 10 for width in page.locator(".chip img").evaluate_all("nodes => nodes.map(node => node.getBoundingClientRect().width)")) + country_before = country_positions(page) + assert page.locator(".release-panel").count() == 2 svg_description(page, '.release-panel[data-coordinate="y"] svg', "release-y-svg-title", "release-y-svg-desc") svg_description(page, '.release-panel[data-coordinate="x"] svg', "release-x-svg-title", "release-x-svg-desc") @@ -97,51 +103,75 @@ def main() -> None: for panel in page.locator(".release-panel").all(): dates = panel.locator(".release-mark").evaluate_all("nodes => nodes.map(node => node.dataset.releaseDate)") assert dates == sorted(dates) - page.screenshot(path=OUT / "wvs_react_playwright_release_panels.png", full_page=True) + assert panel.locator(".scatter-y-label").count() == 1 + assert "->" in panel.locator(".scatter-y-label").text_content() + assert panel.locator(".scatter-axis[marker-end]").count() == 1 + assert panel.locator(".release-fit").count() == 1 + assert int(panel.locator("svg").get_attribute("data-fit-n")) == len(dated) + assert panel.locator(".release-fit line").count() == 1 + page.screenshot(path=OUT / "wvs_react_playwright_release_fit_all_families.png", full_page=True) page.get_by_role("button", name="qwen", exact=True).click() page.wait_for_timeout(100) - qwen_group = map_svg.locator(':scope > g[data-family="qwen"]') - assert qwen_group.get_attribute("display") == "none" + assert map_svg.locator(':scope > g[data-family="qwen"]').get_attribute("display") == "none" assert "qwen" not in map_svg.locator("desc").text_content().split("from ", 1)[1] assert all(group.get_attribute("display") == "none" for group in page.locator('.release-panel [data-family="qwen"]').all()) - assert all(group.get_attribute("display") != "none" for group in page.locator('.release-panel [data-family="muse"]').all()) - country_after = page.locator("circle.country").evaluate_all( - "nodes => nodes.map(node => [node.getAttribute('cx'), node.getAttribute('cy')])" - ) - assert country_after == country_before + assert country_positions(page) == country_before page.screenshot(path=OUT / "wvs_react_root_playwright_qwen_hidden.png", full_page=True) page.get_by_role("button", name="qwen", exact=True).click() marker = page.locator('[data-model="qwen3.8-flash"]') marker.locator(".model-ring").hover() page.wait_for_selector("#model-tooltip") - tooltip_text = page.locator("#model-tooltip").inner_text() for required in ("qwen3.8-flash", "qwen", "rated categorical response", "12 items x 12 samples"): - assert required in tooltip_text, required + assert required in page.locator("#model-tooltip").inner_text() page.screenshot(path=OUT / "wvs_react_root_playwright_tooltip_hover.png", full_page=True) - marker.focus() assert page.evaluate("document.activeElement.dataset.model") == "qwen3.8-flash" assert page.locator("#model-tooltip").is_visible() page.screenshot(path=OUT / "wvs_react_root_playwright_keyboard_focus.png", full_page=True) - release_marker = page.locator('.release-panel[data-coordinate="y"] [data-release-model="qwen3.8-flash"]') - release_marker.locator(".model-ring").hover() + release_y_marker = page.locator('.release-panel[data-coordinate="y"] [data-release-model="qwen3.8-flash"]') + release_y_marker.locator(".model-ring").hover() page.wait_for_selector("#release-y-tooltip") assert "qwen3.8-flash" in page.locator("#release-y-tooltip").inner_text() page.screenshot(path=OUT / "wvs_react_root_playwright_release_panel_hover.png", full_page=True) - release_marker.focus() + release_y_marker.focus() assert page.evaluate("document.activeElement.dataset.releaseModel") == "qwen3.8-flash" assert page.locator("#release-y-tooltip").is_visible() page.screenshot(path=OUT / "wvs_react_root_playwright_release_panel_keyboard_focus.png", full_page=True) release_x_marker = page.locator('.release-panel[data-coordinate="x"] [data-release-model="qwen3.8-flash"]') release_x_marker.locator(".model-ring").hover() page.wait_for_selector("#release-x-tooltip") - assert page.locator("#release-x-tooltip").is_visible() - assert release_marker.get_attribute("aria-describedby") == "release-y-tooltip" + assert release_y_marker.get_attribute("aria-describedby") == "release-y-tooltip" assert release_x_marker.get_attribute("aria-describedby") == "release-x-tooltip" + qwen_dated = sum(model["family"] == "qwen" and bool(model["provenance"]["release_created"]) for model in data["models"]) + for family in sorted(families - {"qwen"}): + page.get_by_role("button", name=family, exact=True).click() + page.wait_for_timeout(100) + for family in families: + expected = "inline" if family == "qwen" else "none" + assert map_svg.locator(f':scope > g[data-family="{family}"]').get_attribute("display") == expected + for panel in page.locator(".release-panel").all(): + assert int(panel.locator("svg").get_attribute("data-fit-n")) == qwen_dated + assert panel.locator(".release-fit").count() == 1 + assert country_positions(page) == country_before + page.screenshot(path=OUT / "wvs_react_playwright_release_fit_qwen_only.png", full_page=True) + + page.get_by_role("button", name="qwen", exact=True).click() + page.get_by_role("button", name="muse", exact=True).click() + page.wait_for_timeout(100) + for family in families: + expected = "inline" if family == "muse" else "none" + assert map_svg.locator(f':scope > g[data-family="{family}"]').get_attribute("display") == expected + for panel in page.locator(".release-panel").all(): + assert int(panel.locator("svg").get_attribute("data-fit-n")) == 0 + assert panel.locator(".release-fit").count() == 0 + assert panel.locator(".release-fit-unavailable").count() == 1 + assert country_positions(page) == country_before + page.screenshot(path=OUT / "wvs_react_playwright_release_fit_insufficient.png", full_page=True) + screenshot(page, f"{BASE}/wvs/react/", "wvs_react_compat_redirect.png") page.wait_for_selector("svg .model-mark") assert page.url == f"{BASE}/" @@ -159,13 +189,14 @@ def main() -> None: )} print(json.dumps({ "root": "React app loaded at /", - "compatibility": "/wvs/ static retained; /wvs/react/ redirects to root", + "compatibility": "/wvs/ and /wvs/react/ redirect to the root React app; shared data remains at /wvs/wvs_map_data.json", "shared": {"models": 64, "countries": 90, "buffered_hulls": 4, "latest_labels": 13, "numeric_model_country_median_equality": "verified against DOM data attributes"}, "svg_accessibility": "main map and both release panels have stable title/desc aria-labelledby; descriptions update after family visibility change", "qwen_toggle": "clicked, map and dated-panel family groups hidden, country coordinates invariant", "tooltip": "map and release-panel pointer hover and focus show model-specific fields", - "release_panels": {"panels": 2, "dated_models": len(dated), "date_order": "DOM order verified", "no_paths": True}, + "release_panels": {"panels": 2, "dated_models": len(dated), "date_order": "DOM order verified", + "ols": "line, n, and R squared recompute from currently visible dated models; fewer than two distinct dates hide the fit"}, "copy": "reader-facing WVS introduction; no model-count, archaeological, implementation, or Artificial Analysis text", "hashes": hashes, }, indent=2)) diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_compat_redirect.png b/slop/research/wvs/20260916_openrouter/wvs_react_compat_redirect.png index 6313fc0..e547026 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_react_compat_redirect.png and b/slop/research/wvs/20260916_openrouter/wvs_react_compat_redirect.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_all_families.png b/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_all_families.png new file mode 100644 index 0000000..e547026 Binary files /dev/null and b/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_all_families.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_insufficient.png b/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_insufficient.png new file mode 100644 index 0000000..c2ea980 Binary files /dev/null and b/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_insufficient.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_qwen_only.png b/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_qwen_only.png new file mode 100644 index 0000000..4d0eccf Binary files /dev/null and b/slop/research/wvs/20260916_openrouter/wvs_react_playwright_release_fit_qwen_only.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_release_fit_playwright_uat.json b/slop/research/wvs/20260916_openrouter/wvs_react_release_fit_playwright_uat.json new file mode 100644 index 0000000..d76f616 --- /dev/null +++ b/slop/research/wvs/20260916_openrouter/wvs_react_release_fit_playwright_uat.json @@ -0,0 +1,25 @@ +{ + "root": "React app loaded at /", + "compatibility": "/wvs/ and /wvs/react/ redirect to the root React app; shared data remains at /wvs/wvs_map_data.json", + "shared": { + "models": 64, + "countries": 90, + "buffered_hulls": 4, + "latest_labels": 13, + "numeric_model_country_median_equality": "verified against DOM data attributes" + }, + "svg_accessibility": "main map and both release panels have stable title/desc aria-labelledby; descriptions update after family visibility change", + "qwen_toggle": "clicked, map and dated-panel family groups hidden, country coordinates invariant", + "tooltip": "map and release-panel pointer hover and focus show model-specific fields", + "release_panels": { + "panels": 2, + "dated_models": 48, + "date_order": "DOM order verified", + "ols": "line, n, and R squared recompute from currently visible dated models; fewer than two distinct dates hide the fit" + }, + "copy": "reader-facing WVS introduction; no model-count, archaeological, implementation, or Artificial Analysis text", + "hashes": { + "wvs_map_data.json": "c0b7aa0554ebbf5d819308932e058f4ff6e19d1e817ffebbbe381dbd2d063ffe", + "index.html": "324afb7ec7e686e1eb9b7f660f51665475ffcd55e9f546f528674781aab771a6" + } +} diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_default.png b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_default.png index 6313fc0..e547026 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_default.png and b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_default.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_keyboard_focus.png b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_keyboard_focus.png index 3b1c69c..60494fb 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_keyboard_focus.png and b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_keyboard_focus.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_qwen_hidden.png b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_qwen_hidden.png index 64b732b..f384ed3 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_qwen_hidden.png and b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_qwen_hidden.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_hover.png b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_hover.png index 686dcc9..cbf4fd2 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_hover.png and b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_hover.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_keyboard_focus.png b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_keyboard_focus.png index f2de0e2..c273281 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_keyboard_focus.png and b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_release_panel_keyboard_focus.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_tooltip_hover.png b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_tooltip_hover.png index 3b1c69c..60494fb 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_tooltip_hover.png and b/slop/research/wvs/20260916_openrouter/wvs_react_root_playwright_tooltip_hover.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_static_react_root_playwright_side_by_side.png b/slop/research/wvs/20260916_openrouter/wvs_static_react_root_playwright_side_by_side.png index d55635f..bf5d3b1 100644 Binary files a/slop/research/wvs/20260916_openrouter/wvs_static_react_root_playwright_side_by_side.png and b/slop/research/wvs/20260916_openrouter/wvs_static_react_root_playwright_side_by_side.png differ diff --git a/slop/research/wvs/20260916_openrouter/wvs_static_redirect.png b/slop/research/wvs/20260916_openrouter/wvs_static_redirect.png new file mode 100644 index 0000000..e547026 Binary files /dev/null and b/slop/research/wvs/20260916_openrouter/wvs_static_redirect.png differ diff --git a/slop/reviews/20260917_wvs_react_redirect_ols_fresh_eyes_openai.md b/slop/reviews/20260917_wvs_react_redirect_ols_fresh_eyes_openai.md new file mode 100644 index 0000000..63e5818 --- /dev/null +++ b/slop/reviews/20260917_wvs_react_redirect_ols_fresh_eyes_openai.md @@ -0,0 +1,41 @@ +# Fresh-eyes visual review + +Read root `AGENTS.md`; no additional `AGENTS.md` found under `slop`. Review limited to the six supplied screenshots. No files edited, code inspected, or browser checks run. + +## Verdict + +No blocking visual defect observed at the supplied 1440px desktop width. Visibility states visibly change the fitted lines and statistics without disturbing the chart layout. + +## Observations + +All paths below are relative to `slop/research/wvs/20260916_openrouter/`. + +- **Root/redirect appearance:** `wvs_react_root_playwright_default.png` and `wvs_static_redirect.png` show the same complete page appearance: introduction, family chips, culture map, and two release-date panels. Neither shows an error, blank state, or redirect interstitial. Screenshots cannot establish the actual URL or redirect mechanism. +- **Marker hierarchy:** In those default views, plotted logos have thin rings and small footprints relative to the labeled control chips. They do not resemble oversized buttons. The dense purple cluster remains visually prominent through repetition, and individual logos are harder to distinguish than chip logos. +- **Vertical labels:** Both scatter panels have readable, unclipped vertical labels with directional arrows: "Traditional -> Secular-Rational up" and "Self-expression -> Survival up". The second panel heading, "Release date vs Self-expression", names the opposite endpoint from its upward direction. This is not demonstrably incorrect, but readers must notice the axis label to interpret an upward trend. +- **Fit readability and visibility changes:** Dashed gray lines remain distinguishable from pale gridlines. The small, bold upper-left annotations are readable in these captures. + +| Screenshot | Secular-Rational annotation | Second-panel annotation | +|---|---|---| +| `wvs_react_root_playwright_default.png` | `OLS, n=48, R2 0.28` | `OLS, n=48, R2 0.26` | +| `wvs_react_playwright_release_fit_all_families.png` | `OLS, n=48, R2 0.28` | `OLS, n=48, R2 0.26` | +| `wvs_react_root_playwright_qwen_hidden.png` | `OLS, n=9, R2 0.08` | `OLS, n=9, R2 0.22` | +| `wvs_react_playwright_release_fit_qwen_only.png` | `OLS, n=39, R2 0.21` | `OLS, n=39, R2 0.24` | + +The Qwen-hidden first-panel line slopes downward, unlike the default upward line. Its second-panel line becomes steeper and occupies the recent-date portion. Qwen-only lines also visibly differ from the all-family fits. + +- **Insufficient data:** `wvs_react_playwright_release_fit_insufficient.png` shows only Muse enabled, a single mark in each release panel, and "Fit unavailable: fewer than two release dates". No fitted line or stale numerical fit annotation is visible. The message is readable and contained within each panel. +- **Qwen-hide geometry:** Comparing the two root screenshots, the Qwen chip becomes muted and struck through, purple Qwen marks and the `qwen3.8-flash` label disappear, and surviving marks, country outlines, chart frames, and axis extents appear stationary. Large empty historical areas remain in the release panels, consistent with keeping the original date domain rather than rescaling. +- **Copy:** The introductory explanation explicitly limits fitting to "dated models currently shown" and says statistics "describe correlation, not cause." That scope is useful and consistent with the pictured state changes. "Hover or keyboard focus" describes interactions that these screenshots do not verify. + +## Nonblocking concern and disproof check + +**Directional naming may invite reversed interpretation.** In all six screenshots, "Release date vs Self-expression" accompanies an axis pointing upward toward "Survival". An upward line could be mistaken for increasing self-expression if the reader follows the heading alone. + +This is a visual interpretation risk, not an established sign error. Check the coordinate definition and ask a reader to explain what an upward line means without prompting; correct interpretation would weaken this concern. + +## Limits + +These images demonstrate distinct rendered states, not live interaction or numerical correctness. They do not establish redirect behavior, fit calculations, keyboard access, tooltips, responsive layout, or zero-point/same-date edge cases. No earlier marker design was supplied, so reduced prominence over time cannot be verified; only the current marker-versus-chip hierarchy can be assessed. + +-- reviewer-openai