Spaces:
Running
Running
Download shared/v1/stealthmark-map.js from stealth-model/stealthmark: direct link, hf CLI and curl.
- Browser
- Download file 140 kB
-
https://huggingface.co/spaces/stealth-model/stealthmark/resolve/main/shared/v1/stealthmark-map.js
- Command line
-
hf download hf://spaces/stealth-model/stealthmark/shared/v1/stealthmark-map.js
-
curl -L -o stealthmark-map.js https://huggingface.co/spaces/stealth-model/stealthmark/resolve/main/shared/v1/stealthmark-map.js
140 kB
| var Ce=i=>(i?.identityStatus==="revealed"||i?.identityStatus===void 0&&i?.group==="Revealed models")&&!!i.revealedName?.trim();function ne(i){return Ce(i)?i.stealthName||(i.name!==i.revealedName?i.name:""):""}function de(i){return Ce(i)?i.revealedName.trim():i?.name||""}function oe(i){let e=ne(i);return e?`Stealth name: ${e}`:""}var Le=i=>String(i??"").normalize("NFKD").toLowerCase().replace(/\p{M}/gu,"").replace(/[^\p{L}\p{N}]/gu,"");function Te(i=""){return String(i).split(",").map(e=>e.trim().split(/\s+/).map(Le).filter(Boolean)).filter(e=>e.length)}function qe(i,e){if(!i.length)return!0;let t=e.filter(o=>typeof o=="string"&&o).map(Le);return i.some(o=>o.every(s=>t.some(a=>a.includes(s))))}function Ne(i){let e=ne(i);return{...i,...e?{stealthName:e}:{},name:de(i)}}var me=`@font-face{font-family:'SM Map';src:url('./stealthmark-map-font.ttf') format('truetype');font-display:swap}\r | |
| .metric-controls [data-metric]{display:flex;align-items:center;justify-content:center;gap:6px;min-height:38px}\r | |
| .plot-axis-label{position:absolute;display:flex;align-items:center;gap:6px;max-width:calc(100% - 78px);font-size:13px;font-weight:400;line-height:1.3;padding:4px 0;min-height:30px;color:var(--sm-map-muted);white-space:nowrap}\r | |
| .plot-axis-label.metric-caption{font-weight:600}.plot-axis-label[data-emphasized=true]{color:var(--sm-map-ink)}\r | |
| .plot-axis-label.axis-y{top:0;left:64px}.plot-axis-label.axis-x{bottom:0;right:24px}\r | |
| .metric-label .metric-caption{display:flex;align-items:center;gap:5px;font-size:inherit;line-height:inherit;padding:4px 0;text-align:left}\r | |
| @media(max-width:580px){.plot-axis-label{font-size:12px}.metric-controls [data-metric]{min-height:40px}}\r | |
| :host{display:block;contain:style;--sm-map-accent:#a65b38;--sm-map-surface:#fbfaf4;--sm-map-ink:#213a2e;--sm-map-muted:#647567;--sm-map-line:#dce1d4;--sm-map-radius:var(--radius-structure,6px);color:var(--sm-map-ink);font-family:'SM Map','DM Sans',system-ui,sans-serif;line-height:1.45;text-align:left}\r | |
| :host([hidden]){display:none}*{box-sizing:border-box}button,input,select{font:inherit}button,a,input,select,summary{outline-offset:4px}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:2px solid var(--sm-map-accent)}button{cursor:pointer}button:disabled{cursor:default;opacity:.45}button,select{color:inherit}a{color:inherit;text-underline-offset:4px}button{border:0;background:transparent}h2,h3,p{margin:0}[hidden]{display:none!important}\r | |
| .map{position:relative;padding:24px 28px 16px;border:1px solid var(--sm-map-line);border-radius:var(--sm-map-radius);background:var(--sm-map-surface);color:var(--sm-map-ink);overflow:visible}.map[data-theme=dark]{--sm-map-surface:#142821;--sm-map-ink:#f5f5e9;--sm-map-muted:#aebeb2;--sm-map-line:#385246;--sm-map-accent:#e7ae79}.top{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;padding-bottom:16px;border-bottom:1px solid var(--sm-map-line)}.brand{display:flex;align-items:center;gap:10px;font-size:17px;font-weight:700;letter-spacing:-.5px}.brand svg{width:31px;height:31px;flex:none}.top-actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.segmented{display:flex;background:color-mix(in srgb,var(--sm-map-line) 35%,transparent);border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);padding:3px;gap:2px}.segmented button{font-size:11px;border-radius:var(--radius-control,4px);padding:7px 11px;white-space:nowrap;color:var(--sm-map-muted)}.segmented button[aria-pressed=true]{background:var(--sm-map-surface);color:var(--sm-map-ink);box-shadow:0 1px 3px #15291912}.share{position:relative}.share-trigger{display:flex;align-items:center;gap:7px;font-size:12px;padding:8px 0 8px 8px}.share-trigger svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.5}.share-menu{position:absolute;z-index:5;right:0;top:calc(100% + 8px);padding:7px;min-width:192px;background:var(--sm-map-surface);border:1px solid var(--sm-map-line);box-shadow:0 12px 28px #14281f1a;border-radius:var(--radius-control,4px)}.share-menu button,.share-menu a{display:block;text-align:left;width:100%;padding:10px 12px;border-radius:var(--radius-control,4px);font-size:12px;text-decoration:none}.share-menu button:hover,.share-menu a:hover{background:color-mix(in srgb,var(--sm-map-line) 35%,transparent)}.heading{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;margin:23px 0 14px}.heading h2{font-size:clamp(21px,2.4vw,29px);letter-spacing:-1px;font-weight:600;line-height:1.15}.caption{font-size:11px;color:var(--sm-map-muted)}.composition{display:grid;grid-template-columns:minmax(0,1fr) 235px;gap:24px;align-items:start}.plot{position:relative;min-width:0;touch-action:pan-y}.plot>svg{display:block;max-width:100%;height:auto;width:100%;font-family:'SM Map',sans-serif!important}.plot svg g[data-map-point].hovered circle:not(.marker-ring,.reference-ring),.plot svg g[data-map-point].hovered>path:first-child{stroke:var(--sm-map-accent);stroke-width:3}.focus-bracket{transition:opacity .18s}.tooltip{position:absolute;z-index:3;pointer-events:none;max-width:min(260px,90%);padding:12px 14px;background:var(--sm-map-ink);color:var(--sm-map-surface);border-radius:var(--radius-control,4px);box-shadow:0 8px 18px #14281f20;font-size:11px}.tooltip strong{display:block;font-size:13px;margin-bottom:6px}.tooltip .tip-values{display:flex;gap:12px;white-space:nowrap}.tooltip small{display:block;margin-top:7px;opacity:.72}.inspector{min-height:315px;padding:19px 0 0 22px;border-left:1px solid var(--sm-map-line)}.kicker{font-size:9px;letter-spacing:1.5px;text-transform:uppercase;color:var(--sm-map-muted);font-weight:650}.anchor-name{font-size:15px;line-height:1.35;font-weight:650;margin:7px 0 10px;overflow-wrap:anywhere}.overall{font-size:62px;line-height:1;letter-spacing:-4px;font-weight:600;font-variant-numeric:tabular-nums}.overall small{font-size:12px;letter-spacing:0;margin-left:5px;font-weight:500;color:var(--sm-map-muted)}.rank{font-size:11px;color:var(--sm-map-muted);margin-top:9px}.metrics{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:22px}.metric-label{font-size:10px;color:var(--sm-map-muted)}.metric-value{font-size:24px;letter-spacing:-.7px;font-weight:550;font-variant-numeric:tabular-nums;margin-top:2px}.metric:first-child .metric-value{color:#39685b}.map[data-theme=dark] .metric:first-child .metric-value{color:#98c7b6}.metric:last-child .metric-value{color:var(--sm-map-accent)}.projected-badge{display:inline-flex;align-items:center;gap:5px;border:1px dashed #b47f3680;border-radius:var(--radius-label,999px);color:var(--sm-map-accent);font-size:9px;letter-spacing:.8px;padding:3px 5px;margin:4px 0 7px;text-transform:uppercase}.range-note,.coverage{font-size:10px;color:var(--sm-map-muted);line-height:1.5;margin-top:5px}.peer{border-top:1px solid var(--sm-map-line);margin-top:18px;padding-top:12px;min-height:74px}.peer strong{font-size:12px;display:block}.peer-values{display:flex;flex-wrap:wrap;gap:9px;font-size:11px;margin-top:6px;color:var(--sm-map-muted)}.peer-values b{font-weight:600;color:var(--sm-map-ink)}.evidence-link{display:inline-block;font-size:11px;margin-top:17px;text-decoration:none}.evidence-link:hover{text-decoration:underline}.family-count{font-size:32px;letter-spacing:-1.5px;margin-top:15px}.empty-note{font-size:12px;color:var(--sm-map-muted);margin-top:10px}.range-controls{display:flex;gap:10px;align-items:center;font-size:10px;color:var(--sm-map-muted);padding:9px 0 12px;flex-wrap:wrap}.range-controls button{font-size:10px;text-decoration:underline;text-underline-offset:3px;padding:5px;color:var(--sm-map-ink)}.legend{display:flex;gap:14px;flex-wrap:wrap;margin-left:auto}.legend span{display:flex;align-items:center;gap:5px}.dot{width:7px;height:7px;border-radius:50%;background:#91a38c}.dot.hollow{background:transparent;border:1.5px solid #91a38c}.dot.forecast{background:transparent;border:1.5px solid #b47f36;border-radius:0;transform:rotate(45deg)}.bottom{border-top:1px solid var(--sm-map-line);padding-top:13px;display:flex;gap:18px;align-items:start;flex-wrap:wrap}.data{flex:1;min-width:0}.data summary,.settings summary{font-size:11px;cursor:pointer;color:var(--sm-map-muted);padding:3px 0}.data summary{color:var(--sm-map-ink)}.search{width:100%;padding:9px 11px;margin:12px 0 7px;background:var(--sm-map-surface);color:inherit;border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);font-size:12px}.table-wrap{max-height:300px;overflow:auto;scrollbar-width:thin}table{border-collapse:collapse;width:100%;font-size:11px;font-variant-numeric:tabular-nums}th{font-size:9px;text-align:right;font-weight:500;color:var(--sm-map-muted);padding:8px 6px;border-bottom:1px solid var(--sm-map-line)}th:first-child{text-align:left}td{padding:7px 6px;border-bottom:1px solid color-mix(in srgb,var(--sm-map-line) 65%,transparent);text-align:right}td:first-child{text-align:left}td button{text-align:left;color:var(--sm-map-ink);padding:5px 0;font-size:11px;width:100%}td button:hover{text-decoration:underline}tr[aria-current=true]{background:color-mix(in srgb,var(--sm-map-line) 30%,transparent)}.table-projected{color:var(--sm-map-accent);font-size:9px;margin-left:6px}.settings{position:relative}.settings-panel{position:absolute;right:0;bottom:calc(100% + 10px);z-index:5;min-width:280px;width:320px;max-width:calc(100vw - 50px);padding:18px;background:var(--sm-map-surface);border:1px solid var(--sm-map-line);border-radius:var(--radius-structure,6px);box-shadow:0 10px 30px #14281f1a}.settings-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.settings label{font-size:10px;color:var(--sm-map-muted);display:block}.settings select,.settings input{display:block;width:100%;margin-top:5px;padding:7px;border:1px solid var(--sm-map-line);background:var(--sm-map-surface);color:inherit;border-radius:var(--radius-control,4px);font-size:11px;min-width:0}.settings .wide{grid-column:1/-1}.projection-action{font-size:11px;color:var(--sm-map-accent);padding:12px 0 0;text-decoration:underline}.overlay{position:absolute;inset:0;z-index:6;background:color-mix(in srgb,var(--sm-map-surface) 92%,transparent);backdrop-filter:blur(6px);padding:24px 28px;border-radius:var(--sm-map-radius);overflow:auto}.overlay-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.overlay-head h3{font-size:20px;letter-spacing:-.5px}.close{width:36px;height:36px;font-size:24px}.picker-list{max-height:380px;overflow:auto}.picker-row{display:flex;align-items:center;gap:12px;font-size:12px;min-height:44px;padding:8px 0;border-bottom:1px solid var(--sm-map-line);cursor:pointer}.picker-row input{accent-color:var(--sm-map-accent);width:16px;height:16px}.picker-row span{flex:1}.picker-row small{color:var(--sm-map-muted)}.primary{padding:10px 16px;background:var(--sm-map-ink);color:var(--sm-map-surface);border-radius:var(--radius-control,4px);font-size:12px;margin-top:16px}.chooser{position:absolute;z-index:4;left:20px;right:20px;top:45px;padding:15px 18px;background:var(--sm-map-surface);border:1px solid var(--sm-map-line);box-shadow:0 12px 30px #14281f20;border-radius:var(--radius-control,4px)}.chooser p{font-size:10px;color:var(--sm-map-muted);margin-bottom:9px}.chooser button{display:flex;gap:12px;justify-content:space-between;width:100%;text-align:left;padding:12px 0;border-bottom:1px solid var(--sm-map-line);font-size:12px}.chooser button:last-child{border:0}.chooser small{white-space:nowrap;color:var(--sm-map-muted)}.status{font-size:11px;color:var(--sm-map-accent);min-height:1.5em;margin-top:8px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.projection-form{max-width:530px}.projection-form label{display:block;font-size:11px;color:var(--sm-map-muted);margin-top:10px}.projection-form input,.projection-form textarea{width:100%;padding:9px 10px;margin-top:5px;border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);background:var(--sm-map-surface);color:inherit;font:inherit;font-size:12px}.projection-grid{display:grid;grid-template-columns:1.3fr 1fr 1fr;gap:10px}.projection-grid .row-label{grid-column:1/-1;font-size:11px;font-weight:600;margin-top:12px}.projection-grid label{margin-top:0}.projection-form .remove-projection{color:var(--sm-map-accent);font-size:11px;padding:8px 0}.no-points{position:absolute;inset:60px 35px auto 70px;font-size:14px;max-width:36ch;color:var(--sm-map-muted)}.overview .composition{grid-template-columns:minmax(0,1fr) 235px}\r | |
| @media(max-width:760px){.map{padding:20px}.top-actions{gap:9px}.segmented button{padding:7px 8px}.composition,.overview .composition{grid-template-columns:minmax(0,1fr) 200px;gap:16px}.inspector{padding-left:16px}.overall{font-size:52px}}\r | |
| @media(max-width:580px){.map{padding:18px 14px 12px}.top{gap:12px;padding-bottom:14px}.brand{font-size:16px}.top-actions{width:100%;justify-content:space-between}.heading{margin:19px 0 10px;gap:7px}.heading h2{font-size:23px}.composition,.overview .composition{display:flex;flex-direction:column;gap:10px}.plot{width:100%}.inspector{order:-1;width:100%;min-height:0;border-left:0;padding:0 0 12px;display:grid;grid-template-columns:1fr 1fr;gap:0 16px;border-bottom:1px solid var(--sm-map-line)}.inspector .kicker,.inspector .anchor-name,.inspector .projected-badge{grid-column:1}.anchor-name{font-size:13px;margin:4px 0 7px}.overall{font-size:43px;letter-spacing:-2.5px;grid-column:1}.rank{grid-column:1;margin-top:6px;font-size:10px}.metrics{grid-column:2;grid-row:1/5;margin-top:0;align-self:center;gap:10px}.metric-value{font-size:24px}.metric-label{font-size:10px}.peer{grid-column:1/-1;margin-top:12px;min-height:0;padding-top:10px;display:flex;flex-wrap:wrap;gap:5px 12px}.peer .kicker{width:100%}.peer-values{margin-top:0}.evidence-link{grid-column:1/-1;margin-top:8px}.family-count,.empty-note,.coverage,.range-note{grid-column:1/-1}.legend{margin-left:0}.bottom{gap:12px}.settings-panel{bottom:calc(100% + 8px)}.overlay{padding:18px 15px}.tooltip{max-width:220px;font-size:10px}.tooltip strong{font-size:12px}.table-wrap{max-height:250px}td{padding:6px 4px}th{padding:8px 4px}.picker-list{max-height:330px}.status{font-size:10px}}\r | |
| @media(prefers-reduced-motion:reduce){.focus-bracket{transition:none}.overlay{backdrop-filter:none}}@media(forced-colors:active){.map,.share-menu,.chooser,.settings-panel{border:1px solid CanvasText}.plot svg{forced-color-adjust:none}.projected-badge{border-style:dashed}}\r | |
| .family-count small{display:block;font-size:11px;letter-spacing:0;margin-top:4px;color:var(--sm-map-muted)}\r | |
| .overall-range{font-size:10px;color:var(--sm-map-muted);margin-top:6px;grid-column:1/-1}\r | |
| .no-points{position:static;min-height:260px;max-width:none;padding:45px 28px;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:12px}.no-points h3{font-size:24px;font-weight:550;letter-spacing:-.6px;color:var(--sm-map-ink)}.no-points .unscored-members{max-width:38ch;font-size:12px;line-height:1.8}.no-points .primary{margin:0 16px 0 0}.no-points a{font-size:11px;display:inline-block;padding:10px 0}\r | |
| \r | |
| /* The data remains quiet; the reading hierarchy and actions carry the emphasis. */\r | |
| .brand{font-size:18px}.segmented button,.share-trigger{font-size:12px}.caption{font-size:12px}.heading{align-items:center}.heading h2{font-size:clamp(24px,2.5vw,32px)}.heading .caption{flex-basis:100%;order:3}.estimate-cta{margin-left:auto;flex:none;display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;padding:8px;border-radius:var(--radius-control,4px);color:var(--sm-map-muted)}.estimate-cta svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}.estimate-cta:hover,.estimate-cta:focus-visible{color:var(--sm-map-ink);background:color-mix(in srgb,var(--sm-map-line) 35%,transparent)}.composition,.overview .composition{grid-template-columns:minmax(0,1fr) 252px}.inspector{padding-top:9px;min-height:0}.kicker{font-size:10px}.anchor-name{font-size:17px}.rank,.metric-label,.range-note,.coverage,.overall-range,.evidence-link{font-size:12px}.metrics{gap:14px;margin-top:18px}.metric-value{font-size:29px}.family-summary{padding-bottom:13px;margin-bottom:16px;border-bottom:1px solid var(--sm-map-line)}.family-summary strong{font-size:16px;display:block;margin:4px 0}.family-summary p:last-child{font-size:12px;color:var(--sm-map-muted)}.comparison-story{margin-top:20px;padding-top:16px;border-top:1px solid var(--sm-map-line)}.comparison-story>strong{display:block;font-size:13px;margin:5px 0 12px}.delta-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.delta-grid span{display:block;font-size:11px;color:var(--sm-map-muted)}.delta-grid b{display:block;font-size:19px;font-weight:550;margin-top:3px}.range-controls,.range-controls button,.data summary,.settings summary{font-size:12px}.legend{gap:13px}.dot{width:8px;height:8px}table,td button{font-size:12px}th{font-size:11px;font-weight:550;max-width:140px;line-height:1.4}th:first-child{min-width:150px}td{vertical-align:top;padding-top:10px;padding-bottom:10px}.cell-range{display:block;font-size:10px;white-space:nowrap;color:var(--sm-map-muted);margin-top:3px}.tooltip{max-width:min(320px,95%);font-size:12px;padding:14px 16px}.tooltip strong{font-size:14px;margin-bottom:10px}.tooltip .tip-values{display:block;white-space:normal}.tip-values>div{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:16px;padding:3px 0}.tip-values span{line-height:1.4}.tip-values b{font-weight:600;text-align:right;font-variant-numeric:tabular-nums}.tooltip .cell-range{color:inherit;opacity:.8;font-weight:400}.projection-form select{width:100%;padding:9px;margin-top:5px;background:var(--sm-map-surface);color:inherit;border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);font-size:12px}.baseline-start{margin:16px 0 8px;padding:12px 15px;background:color-mix(in srgb,var(--sm-map-line) 25%,transparent);border:1px solid var(--sm-map-line);border-radius:var(--radius-structure,6px)}.baseline-start label{margin:0}.baseline-start button{font-size:12px;color:var(--sm-map-accent);padding:10px 0 5px}.baseline-start p{font-size:11px;color:var(--sm-map-muted)}.estimate-list{display:flex;align-items:center;gap:14px;border-top:1px solid var(--sm-map-line);margin-top:12px;padding-top:10px;font-size:12px}.estimate-list span{flex:1}.estimate-list button{font-size:12px;text-decoration:underline}.projection-form .remove-projection{font-size:12px}.projection-form .caption{font-size:13px}.projected-badge{font-size:10px}\r | |
| @media(max-width:760px){.composition,.overview .composition{grid-template-columns:minmax(0,1fr) 220px}.heading h2{font-size:26px}.overall{font-size:54px}.metric-value{font-size:25px}}\r | |
| @media(max-width:580px){.composition,.overview .composition{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px 16px}.inspector{display:contents}.family-summary{grid-column:1/-1;grid-row:1;margin:0;padding:0 0 10px}.family-summary p:last-child{font-size:11px}.score-summary{grid-column:1;grid-row:2}.score-summary .kicker{font-size:9px}.anchor-name{font-size:14px}.overall{font-size:43px;letter-spacing:-2px}.rank,.overall-range{font-size:11px}.metrics{grid-column:2;grid-row:2;margin:0;align-self:center;gap:12px}.metric-label{font-size:11px}.metric-value{font-size:25px}.plot{grid-column:1/-1;grid-row:3}.inspection-detail{grid-column:1/-1;grid-row:4;border-top:1px solid var(--sm-map-line);padding-top:10px}.comparison-story{margin:0;border:0;padding:0}.comparison-story>strong{font-size:13px}.delta-grid{gap:16px}.delta-grid>div{display:flex;gap:10px;align-items:center;justify-content:space-between}.delta-grid b{font-size:17px;white-space:nowrap}.coverage,.range-note,.evidence-link{font-size:11px}.heading h2{font-size:25px}.heading{gap:10px}.heading .caption{font-size:11px}.estimate-cta{width:44px;height:44px;padding:12px}.range-controls,.range-controls button,.data summary,.settings summary{font-size:11px}th{font-size:11px;min-width:84px}td{font-size:12px}.table-wrap{max-height:260px}.tooltip{max-width:95%;font-size:11px}.tooltip strong{font-size:13px}.projection-grid{gap:8px}.projected-badge{font-size:9px}.composition:has(.no-points){display:block}.composition:has(.no-points) .inspector{display:block}}\r | |
| \r | |
| .metrics{grid-template-rows:auto auto auto;row-gap:0}.metric{display:grid;grid-template-rows:subgrid;grid-row:span 3;row-gap:0}.metric-label{min-height:2.8em}.metric-value{align-self:end}.bottom{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px}.data{grid-column:1/-1;grid-row:1}.data summary{padding-right:90px}.settings{grid-column:2;grid-row:1;align-self:start;z-index:5}.scroll-cue{display:none}.data .search{width:100%}.family-summary{margin-bottom:12px;padding-bottom:10px}.family-summary .kicker{display:none}.family-summary strong{display:inline;margin-right:7px}.family-summary p:last-child{display:inline;font-size:11px}.comparison-story{margin-top:16px;padding-top:13px}.comparison-story>strong{margin-bottom:9px}\r | |
| @media(max-width:580px){.bottom{display:grid}.scroll-cue{display:block;margin-top:8px;color:var(--sm-map-muted);font-size:10px;text-align:right}.metrics{grid-template-rows:auto auto auto}.metric-label{min-height:2.8em}.settings{z-index:5}.family-summary{display:block}.delta-grid>div{align-items:center}}\r | |
| \r | |
| .missing-score{font-size:20px;letter-spacing:0;line-height:1.5;display:block;color:var(--sm-map-muted);padding:12px 0}\r | |
| \r | |
| .target-roster{display:flex;flex-wrap:wrap;gap:7px;margin:0 0 18px}.target-chip{display:flex;align-items:center;gap:7px;border:1px solid var(--sm-map-line);border-radius:var(--radius-label,999px);padding:8px 10px;font-size:12px;font-weight:600}.target-chip i{width:7px;height:7px;border-radius:50%;background:var(--sm-map-ink);flex:none}.target-chip.projected i{width:8px;height:8px;border-radius:0;background:transparent;border:1.6px solid #b47f36;transform:rotate(45deg)}.target-chip[aria-pressed=true]{border-color:var(--sm-map-accent);background:color-mix(in srgb,var(--sm-map-accent) 10%,var(--sm-map-surface));box-shadow:inset 0 -2px var(--sm-map-accent)}.target-chip:hover{border-color:var(--sm-map-accent)}.dot.target{background:var(--sm-map-ink);width:10px;height:10px;box-shadow:0 0 0 3px color-mix(in srgb,var(--sm-map-ink) 10%,transparent)}.dot.baseline{background:#39685b}.map[data-theme=dark] .dot.baseline{background:#98c7b6}.without-total .overall,.without-total .rank,.without-total .overall-range{display:none}.primary-metrics{margin-top:14px}.primary-metrics .metric-value{font-size:42px}.missing-total-note{font-size:11px;color:var(--sm-map-muted);margin-top:12px}.plot svg [data-map-point].hovered .model-marker{stroke:var(--sm-map-accent);stroke-width:3}.plot svg [data-map-point].hovered .target-halo{stroke-width:1}.data tr[data-map-role=target] td:first-child{border-left:3px solid var(--sm-map-accent);padding-left:9px}.data tr[data-map-role=baseline] td button{font-weight:600}.data tr[data-map-role=target] td button{font-weight:700}.map[data-theme=dark] .target-chip.projected i{border-color:#dca664}\r | |
| @media(max-width:580px){.target-roster{gap:6px;margin-bottom:15px}.target-chip{font-size:11px;padding:7px 8px}.primary-metrics .metric-value{font-size:32px}.without-total{align-self:center}.primary-metrics{margin:0}.missing-total-note{font-size:10px}}\r | |
| \r | |
| .comparison-roster{display:flex;flex-wrap:wrap;align-items:center;gap:8px 15px;border-top:1px solid var(--sm-map-line);padding:12px 0 15px;font-size:11px}.comparison-roster>span{color:var(--sm-map-muted);font-size:10px}.comparison-chip{display:flex;align-items:center;gap:6px;font-size:11px;padding:4px 0;color:var(--sm-map-muted)}.comparison-chip i{width:6px;height:6px;background:#91a38c;border-radius:50%;flex:none}.comparison-chip.baseline{color:var(--sm-map-ink)}.comparison-chip.baseline i{background:#39685b}.comparison-chip[aria-pressed=true]{color:var(--sm-map-ink);text-decoration:underline;text-underline-offset:4px}.map[data-theme=dark] .comparison-chip.baseline i{background:#98c7b6}@media(max-width:580px){.comparison-roster{gap:5px 13px;padding:10px 0 12px}.comparison-roster>span{width:100%}.comparison-chip{font-size:10px}}\r | |
| \r | |
| .range-note,.overall-range,.cell-range{white-space:pre-line}.central-bounds{grid-column:1/-1;font-size:11px;color:var(--sm-map-muted);margin:6px 0}.central-bounds>summary{cursor:pointer}.central-bounds .bounds-pair{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:9px}.central-bounds p{font-size:10px;margin-top:5px}\r | |
| \r | |
| .bounds-key{width:12px;height:9px;border:1.2px solid #b47f36;border-radius:0}.bounds-key.wide{border-style:dashed;opacity:.6}\r | |
| \r | |
| .range-line{display:block}.range-values{white-space:nowrap}@media(max-width:580px){.metric .range-label{display:block}}\r | |
| \r | |
| .forecast-ranges{display:none}@media(max-width:580px){.inspector .overall-range,.inspector .metric .range-note{display:none}.forecast-ranges{display:table;margin:0 0 16px;font-size:11px;table-layout:fixed}.forecast-ranges th,.forecast-ranges td{min-width:0;max-width:none;padding:7px 0;vertical-align:middle}.forecast-ranges th:first-child{width:42%;min-width:0;padding-right:12px;line-height:1.4;text-align:left}.forecast-ranges td{white-space:nowrap;text-align:right;font-variant-numeric:tabular-nums}.forecast-ranges th:not(:first-child){text-align:right}.forecast-ranges tbody th{font-size:11px;font-weight:500;color:var(--sm-map-muted)}}\r | |
| /* A narrow phone still needs room for the cohort controls and score labels. */\r | |
| @media(max-width:360px){.top-actions{flex-wrap:wrap;gap:9px}.segmented{max-width:100%}.segmented button{padding-inline:7px}.delta-grid{grid-template-columns:minmax(0,1fr);gap:8px}.delta-grid>div{min-width:0}.metrics{grid-template-columns:minmax(0,1fr);gap:10px}.metric-label{min-height:0;overflow-wrap:normal}.score-summary{align-self:center}.share-trigger{padding-left:0}}\r | |
| \r | |
| .quicksearch{display:block;margin:14px 0;font-size:12px;font-weight:600}.quicksearch-input{display:block;width:100%;margin:7px 0;padding:10px 12px;border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);background:var(--sm-map-surface);color:inherit;font:inherit;font-weight:400}.quicksearch>span{font-size:11px;font-weight:400;color:var(--sm-map-muted)}\r | |
| .metric-controls{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 18px}.metric-controls>span{font-size:11px;color:var(--sm-map-muted)}.metric-controls .segmented{background:transparent}.metric-controls .segmented button[aria-pressed=true]{background:color-mix(in srgb,var(--sm-map-line) 35%,var(--sm-map-surface));box-shadow:none}.metric-controls .segmented button{min-width:76px}@media(max-width:580px){.metric-controls{gap:8px;margin-bottom:16px}.metric-controls .segmented button{min-width:0;padding:8px 12px}.metric-controls>span{font-size:10px}}\r | |
| \r | |
| /* The homepage dialog already supplies the model title and map identity. */\r | |
| :host([compact-popup]) .map{padding:14px 18px 10px;border:0;border-radius:0}\r | |
| :host([compact-popup]) .compact-tools{border-bottom:1px solid var(--sm-map-line);margin-bottom:10px}\r | |
| :host([compact-popup]) .compact-tools>summary{cursor:pointer;padding:10px 0;font-size:12px;color:var(--sm-map-ink);min-height:44px}\r | |
| :host([compact-popup]) .compact-tools>summary:focus-visible{outline:2px solid var(--sm-map-accent);outline-offset:2px;border-radius:var(--radius-control,4px)}\r | |
| :host([compact-popup]) .brand,:host([compact-popup]) .heading h2,:host([compact-popup]) .heading .estimate-cta{display:none}\r | |
| :host([compact-popup]) .top{padding:6px 0 0;border:0}\r | |
| :host([compact-popup]) .top-actions{width:100%;justify-content:space-between;flex-wrap:wrap}\r | |
| :host([compact-popup]) .quicksearch{margin:10px 0 14px}\r | |
| :host([compact-popup]) .heading{margin:0 0 8px}\r | |
| :host([compact-popup]) .heading .caption{font-size:11px;line-height:1.5}\r | |
| :host([compact-popup]) .metric-controls{gap:8px;margin-bottom:12px}\r | |
| :host([compact-popup]) .metric-controls .segmented button{min-width:0;min-height:40px}\r | |
| :host([compact-popup]) .inspector{padding-top:0}\r | |
| :host([compact-popup]) .anchor-name{margin:4px 0 6px;font-size:15px}\r | |
| :host([compact-popup]) .overall{font-size:48px;line-height:1.05}\r | |
| :host([compact-popup]) .rank{margin-top:5px}\r | |
| :host([compact-popup]) .metrics{margin-top:12px}\r | |
| @media(max-width:580px){\r | |
| :host([compact-popup]) .map{padding:6px 12px 10px}\r | |
| :host([compact-popup]) .composition{gap:10px 12px}\r | |
| :host([compact-popup]) .score-summary,:host([compact-popup]) .metrics{grid-row:1}\r | |
| :host([compact-popup]) .composition:has(.family-summary) .score-summary,:host([compact-popup]) .composition:has(.family-summary) .metrics{grid-row:2}\r | |
| :host([compact-popup]) .plot{grid-row:3}\r | |
| :host([compact-popup]) .metrics{margin:0;gap:10px}\r | |
| :host([compact-popup]) .metric-value{font-size:24px}\r | |
| :host([compact-popup]) .metric-label{font-size:10px;min-height:2.8em}\r | |
| :host([compact-popup]) .overall{font-size:39px}\r | |
| :host([compact-popup]) .rank{font-size:10px;line-height:1.5}\r | |
| :host([compact-popup]) .metric-controls>span{display:none}\r | |
| :host([compact-popup]) .metric-controls .segmented{width:100%}\r | |
| :host([compact-popup]) .metric-controls .segmented button{flex:1;padding:8px 10px}\r | |
| :host([compact-popup]) .target-roster{margin-bottom:10px}\r | |
| }\r | |
| \r | |
| .plot svg [data-map-label].hovered>rect{stroke:var(--sm-map-accent);stroke-width:2}\r | |
| .plot svg [data-map-label].hovered>text{text-decoration:underline}\r | |
| .router-badge{display:inline-block;vertical-align:middle;margin-left:7px;padding:2px 5px;border:1px solid currentColor;border-radius:var(--radius-label,999px);font-size:10px;line-height:1.25;font-weight:500;white-space:nowrap;color:var(--sm-map-ink)}\r | |
| \r | |
| .router-filter{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:12px}\r | |
| .router-filter input[type=checkbox]{width:17px;height:17px;min-height:0;margin:0;flex:none;accent-color:currentColor}\r | |
| \r | |
| .search-tools{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:14px;margin:14px 0 18px}.search-tools .quicksearch{margin:0}\r | |
| .model-filters{position:relative;align-self:start;margin-top:24px}.model-filters>summary{min-height:38px;display:flex;align-items:center;gap:8px;cursor:pointer;padding:8px 12px;border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);font-size:12px;list-style:none}.model-filters>summary::-webkit-details-marker{display:none}.model-filters>summary:after{content:'\u2304';margin-left:3px}.model-filters[open]>summary{background:var(--sm-map-surface)}\r | |
| .filter-menu{position:absolute;z-index:30;right:0;top:calc(100% + 8px);width:260px;padding:16px;background:var(--sm-map-surface);border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);box-shadow:0 10px 28px #14281f20}\r | |
| .routing-filter{margin:0;padding:0;border:0;min-width:0}.routing-filter legend{margin-bottom:8px;color:var(--sm-map-muted);font-size:11px;font-weight:600}.routing-filter .router-filter{min-height:44px;margin:0;padding:8px 10px;border:1px solid var(--sm-map-line);border-radius:var(--radius-control,4px);cursor:pointer}.router-filter:has(input:checked){background:color-mix(in srgb,var(--sm-map-context) 12%,var(--sm-map-surface))}.router-filter span{font-size:12px;font-weight:500}.router-filter small{display:block;margin-top:3px;font-size:11px;font-weight:400;color:var(--sm-map-muted)}\r | |
| .filter-footer{margin-top:14px;padding-top:10px;border-top:1px solid var(--sm-map-line)}.filter-footer button{font-size:11px;padding:6px 0;color:var(--sm-map-muted)}.filter-footer button:disabled{opacity:.5;cursor:default}.filter-count{display:inline-grid;place-items:center;min-width:17px;height:17px;padding:0 4px;border-radius:50%;background:var(--sm-map-ink);color:var(--sm-map-surface);font-size:10px}\r | |
| @media(max-width:580px){.search-tools{grid-template-columns:minmax(0,1fr);gap:10px}.model-filters{margin-top:0}.model-filters>summary{width:max-content}.filter-menu{position:static;width:100%;margin-top:8px;box-shadow:none}}\r | |
| \r | |
| .brand .stealthmark-version{display:inline-block;font-size:12px;font-weight:500;color:var(--sm-map-muted);margin-left:6px;white-space:nowrap}\r | |
| \r | |
| .share-feedback{max-width:240px;margin:6px 5px 0;padding:10px 7px 5px;border-top:1px solid var(--sm-map-line);font-size:12px;line-height:1.5;color:var(--sm-map-ink)}\r | |
| .share-feedback:empty{display:none}\r | |
| \r | |
| /* Keep transient model details small and clear of the plotted evidence. */\r | |
| .plot{padding-bottom:var(--popover-space,0px)}\r | |
| .plot-axis-label.axis-x{bottom:var(--popover-space,0px)}\r | |
| .plot svg [data-map-connector].hovered .label-connector,.plot svg [data-map-label].hovered .label-connector{stroke:var(--sm-map-accent);stroke-width:2.5;stroke-opacity:1}\r | |
| .plot svg:has(.hovered) [data-map-connector]:not(.hovered) .label-connector{stroke-opacity:.25}\r | |
| .plot:focus-visible{outline:2px solid var(--sm-map-accent);outline-offset:4px;border-radius:var(--radius-control,4px)}\r | |
| .plot .tooltip{width:250px;max-width:calc(100% - 8px);padding:11px 13px;border:1px solid var(--sm-map-line);background:var(--sm-map-surface);color:var(--sm-map-ink);box-shadow:0 4px 16px #14281f18;font-size:11px;line-height:1.4}\r | |
| .plot .tooltip strong{font-size:13px;margin-bottom:7px;overflow-wrap:anywhere}\r | |
| .plot .tooltip p{font-size:10px;color:var(--sm-map-muted);margin-bottom:7px}\r | |
| .plot .tip-values>div{gap:12px;padding:2px 0}\r | |
| .plot .tip-values span{color:var(--sm-map-muted)}\r | |
| .plot .tooltip small{margin-top:7px;opacity:1;color:var(--sm-map-muted)}\r | |
| .plot .chooser{left:auto;right:auto;top:auto;width:292px;max-width:calc(100% - 8px);padding:8px;border-radius:var(--radius-control,4px);box-shadow:0 5px 20px #14281f20}\r | |
| .chooser-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-left:6px}\r | |
| .chooser-head strong{font-size:12px;font-weight:600}\r | |
| .chooser .chooser-head button{width:32px;min-height:32px;padding:0;display:grid;place-items:center;border:0;border-radius:var(--radius-control,4px);font-size:22px;line-height:1;color:var(--sm-map-muted)}\r | |
| .chooser-columns{display:flex;justify-content:space-between;gap:12px;padding:6px 7px;font-size:10px;color:var(--sm-map-muted)}\r | |
| .chooser-list{max-height:min(220px,40vh);overflow:auto;overscroll-behavior:contain;scrollbar-width:thin}\r | |
| .chooser .chooser-list button{align-items:center;gap:12px;min-height:44px;padding:9px 7px;font-size:12px;border-radius:var(--radius-control,4px)}\r | |
| .chooser-list [data-picker-name]{min-width:0;overflow-wrap:anywhere}\r | |
| .chooser-list b{font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}\r | |
| .chooser button:hover{background:color-mix(in srgb,var(--sm-map-line) 35%,transparent)}\r | |
| .chooser button:focus-visible{outline-offset:-2px;border-radius:var(--radius-control,4px)}\r | |
| .top-actions .share{margin-left:auto}\r | |
| \r | |
| /* Plot text: engines that ignore @font-face inside a shadow root fall back to the\r | |
| document copy of the same licensed font, so labels match their measured widths. */\r | |
| .plot>svg{font-family:'SM Map','DM Sans',sans-serif!important}\r | |
| .plot{touch-action:manipulation}\r | |
| /* Reserve the graph's space while its code and results load. */\r | |
| :host{-webkit-text-size-adjust:100%;text-size-adjust:100%}.pending{min-height:640px}:host([compact-popup]) .pending{min-height:0}@media(max-width:580px){.pending{min-height:1100px}}\r | |
| .quicksearch .quicksearch-label{display:block;font-size:12px;font-weight:600;color:var(--sm-map-ink)}\r | |
| .quicksearch .quicksearch-field{position:relative;display:block;font-size:12px;color:var(--sm-map-ink)}\r | |
| .quicksearch .search-icon{position:absolute;left:12px;top:50%;width:16px;height:16px;transform:translateY(-50%);fill:none;stroke:var(--sm-map-muted);stroke-width:2;stroke-linecap:round;pointer-events:none}\r | |
| .quicksearch .quicksearch-input{padding-left:36px}\r | |
| .quicksearch .search-count{display:block;font-size:12px;font-weight:400;color:var(--sm-map-muted)}.search-count:empty{display:none}\r | |
| .th-short{display:none}\r | |
| /* No graph text below 11px at any width. */\r | |
| .kicker,.settings label,.router-badge,.cell-range,.table-projected,.projected-badge,.plot .tooltip p,.plot .tooltip small,.chooser-columns,.missing-total-note{font-size:11px}\r | |
| @keyframes sm-sheet{from{transform:translateY(28px);opacity:0}to{transform:none;opacity:1}}\r | |
| \r | |
| /* Phones: one column, 44-point controls and text no smaller than 11px. */\r | |
| @media(max-width:580px){\r | |
| .top{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px}\r | |
| .top-actions{display:contents}\r | |
| .top .brand{grid-column:1;grid-row:1}\r | |
| .top .share{grid-column:2;grid-row:1;margin-left:0}\r | |
| .top .segmented{grid-column:1/-1;grid-row:2;width:100%}\r | |
| .top .segmented button{flex:1;min-height:44px;font-size:13px;padding-inline:6px}\r | |
| .share-trigger{min-height:44px;padding:8px 4px 8px 10px;font-size:13px}\r | |
| .search-tools{grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:start;margin:14px 0 16px}\r | |
| .quicksearch .quicksearch-label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}\r | |
| .quicksearch .quicksearch-input{margin:0;min-height:44px;font-size:16px}\r | |
| .quicksearch .search-count{margin-top:6px}\r | |
| .model-filters{margin-top:0}\r | |
| .model-filters>summary{min-height:44px;width:auto;font-size:13px}\r | |
| .filter-menu{position:absolute;right:0;top:calc(100% + 8px);width:min(290px,calc(100vw - 40px));margin-top:0;box-shadow:0 10px 28px #14281f20}\r | |
| .heading{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;column-gap:8px;row-gap:6px;margin:18px 0 10px}.heading h2{grid-column:1}.heading .estimate-cta{grid-column:2;grid-row:1;margin:-4px -6px 0 0}.heading .caption{grid-column:1/-1;font-size:12px}\r | |
| .metric-controls{display:grid;grid-template-columns:minmax(0,1fr);gap:6px}\r | |
| .metric-controls>span{font-size:12px}\r | |
| .metric-controls .segmented{width:100%}\r | |
| .metric-controls .segmented button{flex:1;min-height:44px;font-size:13px}\r | |
| .kicker,.score-summary .kicker{font-size:11px;letter-spacing:1.2px}\r | |
| .rank,.overall-range,.metric-label,.coverage,.range-note,.evidence-link,.missing-total-note,.delta-grid span,.family-summary p:last-child{font-size:12px}\r | |
| .comparison-chip,.target-chip,.comparison-roster>span,.legend,.range-controls,.range-controls button,.status{font-size:12px}\r | |
| .router-badge,.projected-badge,.cell-range,.table-projected,.chooser-columns,.plot .tooltip p,.plot .tooltip small{font-size:11px}\r | |
| :host([compact-popup]) .metric-label,:host([compact-popup]) .rank{font-size:12px}\r | |
| .bottom{grid-template-columns:minmax(0,1fr);gap:0}\r | |
| .data{grid-row:1;grid-column:1}.settings{grid-row:2;grid-column:1;border-top:1px solid var(--sm-map-line)}\r | |
| .data summary{padding:13px 0;font-size:13px}.settings summary{padding:13px 0;font-size:13px}\r | |
| .settings-panel{position:static;width:auto;min-width:0;max-width:none;margin:2px 0 14px;padding:14px;box-shadow:none}\r | |
| .settings label{font-size:12px}\r | |
| .settings select,.settings input{min-height:44px;font-size:16px}\r | |
| .projection-action{min-height:44px;font-size:13px}\r | |
| /* The score table fits the phone width; its rows are full-size touch targets. */\r | |
| .inspection-detail .comparison-story{margin-top:0;padding-top:4px}\r | |
| .plot .tooltip{width:min(240px,calc(100% - 12px))}\r | |
| .data .search{font-size:16px;min-height:44px}\r | |
| .table-wrap{max-height:none;overflow-x:auto}\r | |
| .th-full{display:none}.th-short{display:inline}\r | |
| th,th:first-child{min-width:0;max-width:none;font-size:12px;padding:8px 4px}\r | |
| td{font-size:13px;padding:0 4px;vertical-align:middle}\r | |
| td:not(:first-child){white-space:nowrap}\r | |
| td button{min-height:44px;font-size:13px;padding:6px 0;line-height:1.3}\r | |
| .data tr[data-map-role=target] td:first-child{padding-left:8px}\r | |
| }\r | |
| \r | |
| /* Phones and short landscape screens: choices and editors open as sheets. */\r | |
| @media(max-width:580px),(pointer:coarse) and (max-height:520px){\r | |
| .overlay{position:fixed;inset:0;z-index:50;border-radius:0;display:flex;flex-direction:column;padding:calc(10px + env(safe-area-inset-top,0px)) calc(16px + env(safe-area-inset-right,0px)) calc(14px + env(safe-area-inset-bottom,0px)) calc(16px + env(safe-area-inset-left,0px));background:var(--sm-map-surface);backdrop-filter:none;overscroll-behavior:contain;animation:sm-sheet .3s cubic-bezier(.2,.85,.25,1)}\r | |
| .overlay>*{flex:none;width:100%;max-width:640px;margin-inline:auto}\r | |
| .overlay>.picker-list{flex:1 1 auto;min-height:120px;max-height:none;overscroll-behavior:contain}\r | |
| .overlay .overlay-head{margin-bottom:10px}\r | |
| .overlay .close{width:44px;height:44px}\r | |
| .overlay .picker-search{font-size:16px;min-height:44px;margin-top:0}\r | |
| .overlay .primary{min-height:48px;margin-top:12px;font-size:15px}\r | |
| .picker-row{min-height:48px;font-size:14px}\r | |
| .projection-form label{font-size:12px}\r | |
| .projection-form input,.projection-form select,.projection-form textarea{font-size:16px;min-height:44px}\r | |
| }\r | |
| \r | |
| /* Touch screens of every size: 44-point targets and 16px fields, so iOS never zooms. */\r | |
| @media(pointer:coarse){\r | |
| button,a,summary,select,input,label{touch-action:manipulation}\r | |
| input,select,textarea{font-size:16px}\r | |
| .segmented button,.share-trigger,.model-filters>summary,.estimate-cta,.target-chip,.comparison-chip,.projection-action,.range-controls button,.filter-footer button,.chooser .chooser-head button,.close{min-height:44px}\r | |
| .estimate-cta,.chooser .chooser-head button,.close{min-width:44px}\r | |
| .data summary,.settings summary{min-height:44px;padding-top:13px;padding-bottom:13px}\r | |
| .metric-controls [data-metric],.quicksearch .quicksearch-input,.data .search{min-height:44px}\r | |
| /* Small inline links and help labels keep their layout but gain a full-height hit area. */\r | |
| .anchor-name a{display:inline-block;padding:13px 0;margin:-13px 0}\r | |
| .metric-label .metric-caption{padding-block:14px;margin-block:-14px}\r | |
| .evidence-link{display:inline-flex;align-items:center;min-height:44px}\r | |
| .share-menu button,.share-menu a{display:flex;align-items:center;min-height:44px}\r | |
| td button{min-height:44px}\r | |
| .plot-axis-label{min-height:44px}\r | |
| .settings select,.settings input{min-height:44px}\r | |
| .picker-row{min-height:48px}\r | |
| }\r | |
| /* Nearby models as a sheet at the bottom edge, clear of the safe areas. */\r | |
| .plot .chooser[data-sheet]{position:fixed;left:max(calc(10px + env(safe-area-inset-left,0px)),calc(50% - 260px));right:max(calc(10px + env(safe-area-inset-right,0px)),calc(50% - 260px));bottom:calc(10px + env(safe-area-inset-bottom,0px));top:auto;width:auto;max-width:none;z-index:45;padding:10px;border-radius:var(--radius-structure,6px);box-shadow:0 -6px 30px #14281f33;animation:sm-sheet .26s cubic-bezier(.2,.85,.25,1)}\r | |
| .plot .chooser[data-sheet] .chooser-list{max-height:min(320px,50vh)}\r | |
| @media(prefers-reduced-motion:reduce){.overlay,.plot .chooser[data-sheet]{animation:none}}\r | |
| /* Compact panel (22 October 2026): one header row with the brand line above\r | |
| the subject, one toolbar row and one footer row, so the chart takes most of\r | |
| the panel height. The footer overlays legend, range and Configure on the\r | |
| "Models and scores" summary row; the table still opens full width below. */\r | |
| .top{flex-wrap:nowrap;align-items:center;gap:16px;padding-bottom:14px}\r | |
| .top .brand{flex:1;min-width:0;gap:12px;font-size:inherit;letter-spacing:0}\r | |
| .top .brand svg{width:36px;height:36px}\r | |
| .title-stack{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:14px;row-gap:1px;min-width:0}\r | |
| .title-stack .brand-name{flex-basis:100%;font-size:12px;font-weight:600;color:var(--sm-map-muted)}\r | |
| .title-stack .brand-name .stealthmark-version{font-size:11px;margin-left:3px}\r | |
| .title-stack h2{font-size:clamp(21px,2.1vw,27px);letter-spacing:-.8px;font-weight:600;line-height:1.15;overflow-wrap:anywhere}\r | |
| .title-stack .caption{font-size:12px;font-weight:400;color:var(--sm-map-muted)}\r | |
| .top-actions{flex:none;flex-wrap:nowrap;gap:4px}\r | |
| .top-actions .estimate-cta{margin:0}\r | |
| .toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin:14px 0 16px}\r | |
| .toolbar .search-tools{flex:1 1 240px;margin:0;gap:10px;align-items:center}\r | |
| .toolbar .model-filters{margin-top:0;align-self:center}\r | |
| .toolbar .quicksearch .quicksearch-label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}\r | |
| .toolbar .quicksearch .quicksearch-input{margin:0;padding-top:8px;padding-bottom:8px}\r | |
| .toolbar .metric-controls{margin:0;gap:8px}\r | |
| .toolbar .metric-controls [data-metric]{min-height:30px}\r | |
| .toolbar .metric-controls .segmented button{min-width:0}\r | |
| .bottom{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;align-items:start;column-gap:18px;row-gap:6px;padding-top:10px}\r | |
| .bottom>.data{grid-column:1/-1;grid-row:1}\r | |
| .bottom>.legend,.bottom>.range-controls,.bottom>.settings{grid-row:1;position:relative;z-index:2}\r | |
| .bottom>.legend{grid-column:2;margin:0;min-height:28px;align-items:center;font-size:12px;color:var(--sm-map-muted)}\r | |
| .bottom>.range-controls{grid-column:3;padding:0;gap:8px}\r | |
| .bottom>.settings{grid-column:4;z-index:5}\r | |
| .bottom .data>summary,.bottom .settings>summary{min-height:28px;display:flex;align-items:center;gap:6px}\r | |
| .bottom .data>summary::before,.bottom .settings>summary::before{content:'\u25B8';font-size:10px}\r | |
| .bottom .data[open]>summary::before,.bottom .settings[open]>summary::before{content:'\u25BE'}\r | |
| .bottom .data>summary::-webkit-details-marker,.bottom .settings>summary::-webkit-details-marker{display:none}\r | |
| .range-controls .range-toggle{padding:2px}\r | |
| .range-controls .range-toggle button{font-size:11px;padding:4px 9px;text-decoration:none;color:var(--sm-map-muted)}\r | |
| .range-controls .range-toggle button[aria-pressed=true]{color:var(--sm-map-ink)}\r | |
| .status:empty{min-height:0;margin:0}\r | |
| :host([compact-popup]) .toolbar{margin:10px 0 12px}\r | |
| :host([compact-popup]) .toolbar .quicksearch{margin:0}\r | |
| @media(max-width:1080px){\r | |
| .bottom>.legend{grid-column:1/3;grid-row:1}\r | |
| .bottom>.range-controls{grid-column:3/5;grid-row:1;justify-self:end}\r | |
| .bottom>.data,.bottom>.settings{grid-row:2}\r | |
| }\r | |
| @media(max-width:580px){\r | |
| .top{display:flex;gap:10px;padding-bottom:12px}\r | |
| .top-actions{display:flex;width:auto;justify-content:flex-end}\r | |
| .top .share{margin-left:0}\r | |
| .top .brand svg{width:31px;height:31px}\r | |
| .title-stack h2{font-size:22px}\r | |
| .toolbar{flex-direction:column;align-items:stretch;gap:10px;margin:12px 0 14px}\r | |
| .toolbar .search-tools{flex:none}\r | |
| .toolbar .scope{width:100%}\r | |
| .toolbar .scope button{flex:1;min-height:44px;font-size:13px;padding-inline:6px}\r | |
| .toolbar .metric-controls [data-metric]{min-height:44px}\r | |
| .bottom{grid-template-columns:minmax(0,1fr);column-gap:0;row-gap:0}\r | |
| .bottom>.legend{grid-column:1;grid-row:1;padding:2px 0 8px}\r | |
| .bottom>.range-controls{grid-column:1;grid-row:2;justify-self:start;padding-bottom:8px}\r | |
| .bottom>.data{grid-column:1;grid-row:3}\r | |
| .bottom>.settings{grid-column:1;grid-row:4;border-top:1px solid var(--sm-map-line)}\r | |
| }\r | |
| /* Plot and control hierarchy (22 October 2026). Emphasised axis titles share | |
| the summary's metric colours (horizontal green, vertical accent); every | |
| switch uses the scope switch's track; chevrons are drawn, not glyphs. */ | |
| .plot-axis-label.axis-x[data-emphasized=true]{color:#39685b} | |
| .map[data-theme=dark] .plot-axis-label.axis-x[data-emphasized=true]{color:#98c7b6} | |
| .plot-axis-label.axis-y[data-emphasized=true]{color:var(--sm-map-accent)} | |
| .metric-controls .segmented{background:color-mix(in srgb,var(--sm-map-line) 35%,transparent)} | |
| .metric-controls .segmented button[aria-pressed=true]{background:var(--sm-map-surface);box-shadow:0 1px 3px #15291912} | |
| .model-filters>summary:after{content:'';width:6px;height:6px;margin:0 2px 3px 4px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(45deg)} | |
| .model-filters[open]>summary:after{transform:translateY(3px) rotate(-135deg)} | |
| .bottom .data>summary::before,.bottom .settings>summary::before,.bottom .data[open]>summary::before,.bottom .settings[open]>summary::before{content:'';flex:none;width:5px;height:5px;margin:0 4px 0 1px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:rotate(-45deg)} | |
| .bottom .data[open]>summary::before,.bottom .settings[open]>summary::before{transform:translateY(-2px) rotate(45deg)} | |
| /* Phones: brand line and buttons share the first row; the title gets the | |
| full width below, so a descriptive axis title wraps at most once. */ | |
| @media(max-width:580px){ | |
| .top{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;column-gap:10px;row-gap:4px} | |
| .top .brand,.top .title-stack{display:contents} | |
| .top .brand svg{grid-column:1;grid-row:1;width:28px;height:28px} | |
| .title-stack .brand-name{grid-column:2;grid-row:1;flex-basis:auto} | |
| .top .top-actions{grid-column:3;grid-row:1} | |
| .title-stack h2{grid-column:1/-1;grid-row:2;font-size:21px} | |
| .title-stack .caption{grid-column:1/-1;grid-row:3} | |
| } | |
| /* Search fields show focus with an ink border and a soft green ring instead | |
| of the accent outline, which reads as an error state on a text field. */ | |
| .quicksearch .quicksearch-input:focus-visible,.data .search:focus-visible,.picker-search:focus-visible{outline:none;border-color:var(--sm-map-ink);box-shadow:0 0 0 3px #39685b2e} | |
| /* Model type choices share the routing option style. Open and Local span the | |
| row to fit their definitions; the others share a compact two-column grid. */ | |
| .type-filter{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin-bottom:14px} | |
| .type-filter legend{grid-column:1/-1} | |
| .type-filter .type-choice{min-height:40px;padding:7px 9px;align-items:flex-start} | |
| .type-filter .type-choice:first-of-type{grid-column:1/-1;min-height:34px;align-items:center} | |
| .type-filter .type-choice.wide{grid-column:1/-1} | |
| .type-filter input[type=radio]{width:15px;height:15px;min-height:0;margin:2px 0 0;flex:none;accent-color:currentColor} | |
| `;var ye=`.metric-icon{display:block;flex:none;width:18px;height:18px} | |
| [data-metric-help]{touch-action:manipulation} | |
| .metric-caption{cursor:default;color:var(--sm-map-muted,var(--muted,#647567));font-weight:400} | |
| .metric-caption .metric-icon{width:15px;height:15px} | |
| .metric-caption:focus-visible{outline:1px solid currentColor;outline-offset:4px;border-radius:var(--radius-control,4px)} | |
| .metric-tooltip{position:fixed;z-index:1001;width:270px;max-width:calc(100vw - 20px);padding:12px 14px;border:1px solid var(--sm-map-line,var(--line,#cdd5c8));border-radius:var(--radius-control,4px);background:var(--sm-map-surface,var(--surface,#fffdf8));color:var(--sm-map-ink,var(--ink,#26392f));box-shadow:0 6px 20px #26392f20;font-size:12px;line-height:1.5;pointer-events:auto;text-align:left;white-space:normal} | |
| .metric-tooltip strong{display:block;font-size:12px;font-weight:600} | |
| .metric-tooltip p{margin:5px 0 0;font-size:12px;color:var(--sm-map-ink,var(--ink,#26392f));line-height:1.5} | |
| @media(forced-colors:active){.metric-tooltip{border-color:CanvasText;background:Canvas;color:CanvasText;box-shadow:none}.metric-tooltip p{color:CanvasText}} | |
| `;var ae={overall:"Overall score",general:"General Intelligence",visual:"Visual Intelligence"},he={overall:"Overall",general:"General",visual:"Visual"},Pe={"reasoning:single-step":"Reasoning efficiency \xB7 single step","reasoning:multi-step":"Reasoning efficiency \xB7 multi-step"},Q={general:"The ability to reason, plan, solve problems and understand how things relate and behave. A high score means it thinks hard problems through, from careful analysis to plans that span many steps.",visual:"The ability to understand visual intent and turn ideas, descriptions and plans into coherent, effective visuals. A high score means design ideas come out the way you meant them, in illustrations, icons, diagrams or interface visuals.","reasoning:single-step":"How much reasoning a model needs to understand a problem and work out how to solve it. A high score means good answers with less waiting and fewer tokens. Results and reasoning are compared with every other model on the same task; 50 is the average model. A side score, not part of StealthMark.","reasoning:multi-step":"How efficiently a model keeps working on a task, building on its earlier reasoning instead of starting over at every step, as in agentic workflows and multi-step reasoning. A high score means good results on long tasks with less waiting and fewer tokens. Results and reasoning across all steps are compared with every other model on the same task; 50 is the average model. A side score, not part of StealthMark."},Ee={general:'<path d="M12 5.5C12 3.6 9.9 2.6 8.4 3.7 6.6 3.1 4.8 4.5 4.9 6.4 2.9 7.1 2.3 9.6 3.7 11.1 2.7 13.1 3.7 15.6 5.8 16 5.9 18.6 8.8 20 10.7 18.5c.8-.6 1.3-1.5 1.3-2.5V5.5Z"/><path d="M12 5.5c0-1.9 2.1-2.9 3.6-1.8 1.8-.6 3.6.8 3.5 2.7 2 .7 2.6 3.2 1.2 4.7 1 2 0 4.5-2.1 4.9-.1 2.6-3 4-4.9 2.5-.8-.6-1.3-1.5-1.3-2.5"/><path d="M5 7c1.5-.2 2.7.6 3 2M5.8 16c1.2.1 2.3-.5 2.8-1.5M19 7c-1.5-.2-2.7.6-3 2m2.2 7c-1.2.1-2.3-.5-2.8-1.5"/>',visual:'<path d="M2.2 12s3.4-6 9.8-6 9.8 6 9.8 6-3.4 6-9.8 6-9.8-6-9.8-6Z"/><circle cx="12" cy="12" r="3"/>',"reasoning:single-step":'<path d="M4 17.5a8 8 0 1 1 16 0"/><path d="m12 17.5 4.2-5"/><circle cx="12" cy="17.5" r="1.2"/>',"reasoning:multi-step":'<path d="M5 12a7 7 0 0 1 12-4.9L19 9"/><path d="M19 4.5V9h-4.5"/><path d="M19 12a7 7 0 0 1-12 4.9L5 15"/><path d="M5 19.5V15h4.5"/>'},ue=(i,e=18)=>Ee[i]?`<svg class="metric-icon" viewBox="0 0 24 24" width="${e}" height="${e}" fill="none" stroke="currentColor" stroke-width="1.65" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">${Ee[i]}</svg>`:"";function Ie(i,e){let t,o,s=()=>i.querySelector(".metric-tooltip"),a=()=>{clearTimeout(o),t?.removeAttribute("aria-describedby"),t=null;let d=s();d&&(d.hidden=!0)},r=()=>{let d=s();if(!t?.isConnected||!d)return a();let l=t.getBoundingClientRect(),v=i.host.closest("dialog"),b=(v?.querySelector(".dialog-body")||v)?.getBoundingClientRect(),w=Math.max(10,(b?.left??0)+10),S=Math.min(window.innerWidth-10,(b?.right??window.innerWidth)-10),A=Math.max(10,(b?.top??0)+10),T=Math.min(window.innerHeight-10,(b?.bottom??window.innerHeight)-10);if(l.bottom<A||l.top>T||l.right<w||l.left>S)return a();d.style.maxWidth=`${S-w}px`;let g=d.getBoundingClientRect();d.style.left=`${Math.max(w,Math.min(l.left+l.width/2-g.width/2,S-g.width))}px`,d.style.top=`${Math.max(A,Math.min(l.bottom+g.height+8<=T?l.bottom+8:l.top-g.height-8,T-g.height))}px`},n=d=>{clearTimeout(o);let l=d?.dataset.metricHelp,v=s();!Q[l]||!v||(t!==d&&a(),t=d,v.innerHTML=`<strong>${ae[l]??Pe[l]}</strong><p>${Q[l]}</p>`,v.hidden=!1,d.setAttribute("aria-describedby",v.id),r())},c=d=>{!t||t.contains(d.relatedTarget)||s()?.contains(d.relatedTarget)||i.activeElement!==t&&(o=setTimeout(a,120))};return i.addEventListener("pointerover",d=>{if(s()?.contains(d.target)){clearTimeout(o);return}let l=d.target.closest?.("[data-metric-help]");l&&n(l)},{signal:e}),i.addEventListener("pointerout",c,{signal:e}),i.addEventListener("focusin",d=>{let l=d.target.closest?.("[data-metric-help]");l?n(l):a()},{signal:e}),i.addEventListener("focusout",()=>queueMicrotask(()=>{i.activeElement!==t&&a()}),{signal:e}),i.addEventListener("click",d=>{let l=d.target.closest?.("[data-metric-help]");l?.isConnected&&n(l)},{signal:e}),document.addEventListener("keydown",d=>{d.key==="Escape"&&t&&(a(),d.preventDefault(),d.stopPropagation())},{signal:e,capture:!0}),document.addEventListener("pointerdown",d=>{!d.composedPath().includes(t)&&!d.composedPath().includes(s())&&a()},{signal:e}),window.addEventListener("scroll",r,{signal:e,passive:!0,capture:!0}),window.addEventListener("resize",r,{signal:e,passive:!0}),e.addEventListener("abort",a,{once:!0}),{show:n,hide:a}}var Et=Object.freeze({coding:"Coding",agents:"Agents",visual:"Images & SVG","long-context":"Long context",reasoning:"Reasoning",research:"Research","open-weights":"Open weights"}),ct=Object.freeze(["confirmed","suspected"]),Pt=Object.freeze(["normal","fast"].flatMap(i=>["","Min","Max"].map(e=>`${i}TokensPerSecond${e}`)));function Oe(i){if(!(i===void 0||i==="")){if(!ct.includes(i))throw new Error("routerStatus must be confirmed or suspected");return i}}var se=i=>i?.routerStatus==="confirmed"?"Router":i?.routerStatus==="suspected"?"Router?":"",le=i=>i?.routerStatus==="confirmed"?"Confirmed router or multi-model system. Scores measure the system\u2019s observed benchmark performance.":i?.routerStatus==="suspected"?"Suspected router based on our research. The underlying architecture is unconfirmed.":"";var fe="/benchmarks/map",De="/benchmarks/map/social.png",ge="https://stealthmodels.com",$e=7,ke=["focus","family","compare","metric","models","exclude","baselines","inspect","range","theme","presentation","competitors","x-axis","y-axis","projections","domains","title","subtitle","page","search","routers","type"];function Fe(i){let e={};for(let t of ke)if(i.hasAttribute(t)){let o=i.getAttribute(t);if(["x-axis","y-axis"].includes(t))e.axes??={},e.axes[t[0]]=o;else if(["projections","domains"].includes(t))try{e[t]=JSON.parse(o)}catch{throw Error(`Invalid ${t} JSON.`)}else e[t]=t==="competitors"?Number(o):o}return e}var Z=(i,e="hide")=>e!=="hide"||i.routerStatus!=="confirmed",dt=["all","open","local","proprietary","stealth"],ve=(i,e="all")=>e==="all"||i.projected===!0||(e==="stealth"?i.identityStatus==="stealth"||i.group==="Stealth models":e==="local"?i.local===!0:i.access===e),h=i=>String(i??"").replace(/[&<>"']/g,e=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e]),E=i=>Number.isFinite(i)?i.toFixed(1):"\u2014",_e=i=>i?.lower===void 0?"":i.central?`Central ${E(i.central.lower)}\u2013${E(i.central.upper)} | |
| Wider ${E(i.lower)}\u2013${E(i.upper)}`:`Range ${E(i.lower)}\u2013${E(i.upper)}`,W=i=>i!==null&&typeof i=="object"&&!Array.isArray(i),j=i=>{throw new Error(i)},ee=i=>[...new Set((Array.isArray(i)?i:typeof i=="string"?i.split(","):[]).map(e=>String(e).trim()).filter(Boolean))].sort(),X=(i,e,t)=>((typeof i!="string"||!i.trim()||i.length>e||/[\u0000-\u001f]/.test(i))&&j(`Invalid ${t}.`),i.trim()),G=i=>i==null?null:typeof i=="number"&&Number.isFinite(i)&&i>=0&&i<=100?i:j("Scores must be numbers from 0 to 100."),J=(i,e,t,o)=>{let s=i??t;return e.includes(s)||j(`Invalid ${o}: ${s}.`),s},we=(i,e)=>(i.position??1/0)-(e.position??1/0)||i.id.localeCompare(e.id);function Se(i){(!W(i)||i.schemaVersion!==1||typeof i.revision!="string"||!Array.isArray(i.models)||!Array.isArray(i.metrics)||!Array.isArray(i.families))&&j("Unsupported StealthMark Map data.");let e=new Set;for(let t of i.models)(t?.access!==void 0&&!["open","proprietary"].includes(t.access)||t?.local!==void 0&&(t.local!==!0||t.access!=="open"))&&j("Invalid map model access.");for(let t of i.models)for(let o of["logo","favicon"])t?.[o]!==void 0&&!/^\/(benchmarks\/brands|_shared\/favicons)\/[a-z0-9-]+\.(png|svg|webp)$/.test(t[o])&&j("Invalid map model image.");for(let t of i.models){(!W(t)||typeof t.id!="string"||e.has(t.id)||!W(t.metrics))&&j("Invalid map model."),e.add(t.id),Oe(t.routerStatus);for(let o of Object.values(t.metrics))G(o)}return i}function mt(i,e){if(typeof i=="number")return{value:G(i)};W(i)||j(`Invalid projected ${e}.`);let t=G(i.value);t===null&&j(`Projected ${e} needs a value.`);let o=G(i.lower),s=G(i.upper);(o===null!=(s===null)||o!==null&&(o>t||s<t))&&j(`Projected ${e} range must contain its value.`);let a;if(i.central!==void 0){(!W(i.central)||o===null)&&j(`Projected ${e} central range needs wider bounds.`);let r=G(i.central.lower),n=G(i.central.upper);(r===null||n===null||r>t||n<t||r<o||n>s)&&j(`Projected ${e} central range must contain its value and fit inside the wider range.`),a={lower:r,upper:n}}return o===null?{value:t}:{value:t,lower:o,upper:s,...a?{central:a}:{}}}function ht(i){let e=r=>typeof r=="number"&&Number.isFinite(r)&&r>=-100&&r<=100?r:j("Projection gains must be numbers from -100 to 100.");W(i)||j("Invalid projection gain.");let t=e(i.value),o=i.lower===void 0?null:e(i.lower),s=i.upper===void 0?null:e(i.upper);(o===null!=(s===null)||o!==null&&(o>t||s<t))&&j("A projection gain range must contain its value.");let a;if(i.central!==void 0){(!W(i.central)||o===null)&&j("A central gain range needs wider bounds.");let r=e(i.central.lower),n=e(i.central.upper);(r>t||n<t||r<o||n>s)&&j("A central gain range must contain its value and fit inside the wider range."),a={lower:r,upper:n}}return o===null?{value:t}:{value:t,lower:o,upper:s,...a?{central:a}:{}}}var ut=(i,e)=>{let t=o=>Math.round(Math.min(100,Math.max(0,i+o))*10)/10;return{value:t(e.value),...e.lower===void 0?{}:{lower:t(e.lower),upper:t(e.upper)},...e.central?{central:{lower:t(e.central.lower),upper:t(e.central.upper)}}:{}}};function ft(i=[],e=null){(!Array.isArray(i)||i.length>12)&&j("Supply at most 12 projected models.");let t=new Set;return i.map(o=>{W(o)||j("Invalid projected model.");let s=X(o.id,100,"projection ID");(!/^projection:[a-z0-9][a-z0-9._-]*$/i.test(s)||t.has(s))&&j("Use unique projection:NAME IDs."),t.add(s);let a=o.gain===void 0?null:ht(o.gain),r=a?ee(o.start??o.baseline):[],n=o.metrics??Object.fromEntries(["general","visual","overall"].filter(d=>o[d]!==void 0).map(d=>[d,o[d]]));if(a){(!r.length||r.length>4)&&j("A gain projection needs one to four measured starting models."),e||j("A gain projection needs measured scores.");let d=r.map(l=>e.models.find(v=>v.id===l)??j(`Unknown projection start: ${l}.`));n=Object.fromEntries(["general","visual","overall"].filter(l=>d.every(v=>Number.isFinite(v.metrics[l]))).map(l=>[l,ut(d.reduce((v,b)=>v+b.metrics[l],0)/d.length,a)]))}(!W(n)||!Object.keys(n).length)&&j("A projection needs forecast scores.");let c=Object.fromEntries(Object.keys(n).sort().map(d=>[d,mt(n[d],d)]));return{id:s,name:X(o.name,80,"projection name"),metrics:c,kind:J(o.kind,["supplied","editorial"],"supplied","projection kind"),...o.baseline?{baseline:X(o.baseline,100,"projection baseline")}:{},...o.family?{family:X(o.family,80,"projection family")}:{},...o.note?{note:X(o.note,180,"projection note")}:{},...a?{gain:a,...o.start?{start:r}:{}}:{}}}).sort((o,s)=>o.id.localeCompare(s.id))}var Be=i=>i.map(e=>e.gain?(({metrics:t,...o})=>o)(e):e);function gt(i){let e=new TextEncoder().encode(JSON.stringify(i));return btoa(String.fromCharCode(...e)).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function xt(i){(i.length>5e3||!/^[\w-]+$/.test(i))&&j("Invalid projection payload.");try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Uint8Array.from(atob(i.replaceAll("-","+").replaceAll("_","/")),e=>e.charCodeAt(0))))}catch{j("Invalid projection payload.")}}function Ve(i){let e=i instanceof URL?i:new URL(i,ge),t=e.searchParams,o=Object.fromEntries(["focus","family","compare","metric","inspect","range","theme","title","subtitle","page","search","routers","type"].filter(s=>t.has(s)).map(s=>[s,t.get(s)]));if(![fe,fe+"/",De].includes(e.pathname)){let s=e.pathname.replace(/\/social\.png$/,"").replace(/\/$/,"").match(/^\/benchmarks\/map\/([a-z0-9][a-z0-9._-]*(?:\/[a-z0-9][a-z0-9._-]*)?)$/);s||j("Unknown map link."),o.preset=s[1]}if(t.has("models")&&(o.models=ee(t.get("models"))),t.has("exclude")&&(o.exclude=ee(t.get("exclude"))),t.has("baselines")&&(o.baselines=ee(t.get("baselines"))),(t.has("x")||t.has("y"))&&(o.axes={x:t.get("x")||"general",y:t.get("y")||"visual"}),t.has("competitors")&&(o.competitors=Number(t.get("competitors"))),t.has("projections")&&(o.projections=xt(t.get("projections"))),t.has("domains"))try{o.domains=JSON.parse(t.get("domains"))}catch{j("Invalid axis domains.")}return o}function He(i={},e){if(W(i)||j("Map configuration must be an object."),i.preset){let g=e.presets?.find(y=>y.id===i.preset||Object.hasOwn(y.selections??{},i.preset));g||j("Unknown map link."),i={...g.config,...g.selections?.[i.preset]?{inspect:g.selections[i.preset]}:{},...i}}let t=ft(i.projections,e),o=new Set([...e.models.map(g=>g.id),...t.map(g=>g.id)]),s=new Set(e.families.map(g=>g.id));for(let g of t)for(let y of Object.keys(g.metrics))e.metrics.some(R=>R.id===y)||j(`Unknown projection metric: ${y}.`);for(let g of t)g.baseline&&!e.models.some(y=>y.id===g.baseline)&&j(`Unknown measured projection baseline: ${g.baseline}.`);for(let g of t)g.family&&!s.has(g.family)&&j(`Unknown projection family: ${g.family}.`);let a=i.focus||null,r=i.family||null;a&&r&&j("Choose a model focus or a family, not both."),a&&!o.has(a)&&j(`Unknown model: ${a}.`),r&&!s.has(r)&&j(`Unknown family: ${r}.`);let n=ee(i.models),c=ee(i.exclude),d=ee(i.baselines);for(let g of[...n,...c,...d])o.has(g)||j(`Unknown model: ${g}.`);d.some(g=>!e.models.some(y=>y.id===g))&&j("Baseline models must have measured results.");let l=J(i.compare,["all","competitive","selected"],i.models!==void 0?"selected":a||r?"competitive":"all","comparison");l!=="selected"&&i.models!==void 0&&j('Explicit model IDs require compare="selected".'),l==="competitive"&&!a&&!r&&j("Choose a model or family to compare similar scores.");let v=J(i.metric,["overall","general","visual"],"overall","comparison metric"),b={x:i.axes?.x??"general",y:i.axes?.y??"visual"};for(let g of Object.values(b))e.metrics.some(y=>y.id===g)||j(`Unknown axis metric: ${g}.`);b.x===b.y&&j("Choose different metrics for the axes.");let w=i.competitors??$e;(!Number.isInteger(w)||w<1||w>20)&&j("Comparison model count must be between 1 and 20.");let S=null;if(i.page){let g;try{g=new URL(i.page,ge)}catch{j("Invalid linked page.")}g.origin===ge&&g.pathname!=="/"&&(g.pathname=g.pathname.replace(/\/+$/,""));let y=new URL(g);y.hash="",(e.pages??[]).some(R=>R===y.href||R.replace(/\/$/,"")===y.href)||j("The linked page is not in the public catalog."),S=g.href}let A=null;if(i.domains){A={};for(let g of["x","y"]){let y=i.domains[g];(!Array.isArray(y)||y.length!==2||y.some(R=>G(R)===null)||y[0]>=y[1])&&j("Axis domains need increasing bounds from 0 to 100."),A[g]=[...y]}}let T=i.search==null?"":(String(i.search).trim()?X(String(i.search),500,"search"):"").split(",").map(g=>g.trim()).filter(Boolean).join(", ");return{...i.labelSearch?{labelSearch:String(i.labelSearch).slice(0,500)}:{},routers:J(i.routers,["all","hide"],"hide","router filter"),type:J(i.type,dt,"all","model type"),search:T,focus:a,family:r,compare:l,metric:v,models:n,exclude:c,baselines:d,axes:b,competitors:w,projections:t,domains:A,page:S,range:J(i.range,["auto","full","detail"],"auto","range"),theme:J(i.theme,["light","dark"],"light","theme"),presentation:J(i.presentation,["overview","embed","explorer"],a||r?"embed":"overview","presentation"),inspect:i.inspect??null,title:i.title?X(i.title,110,"title"):null,subtitle:i.subtitle?X(i.subtitle,180,"subtitle"):null}}function Ue(i,e){let t=Math.max(0,Math.min(...i)-3),o=Math.min(100,Math.max(...i)+3),s=[];for(let a=0;a<=100-e;a+=5)a<=t&&a+e>=o&&s.push(a);return s.length?(s.sort((a,r)=>Math.abs(a+e/2-(t+o)/2)-Math.abs(r+e/2-(t+o)/2)||a-r),[s[0],s[0]+e]):null}function bt(i,e,t=""){let o=Te(t);if(!o.length)return!0;let s=e.company?.id?i.models.filter(n=>n.company?.id===e.company.id).flatMap(n=>[n.company.name,n.company.sourceName]):[],a=i.families.filter(n=>n.id===e.family||n.members.some(c=>c.benchmarkModelId===e.id)),r=[e.id,e.name,e.stealthName,e.revealedName,e.group,typeof e.company=="string"?e.company:e.company?.name,e.company?.id,e.company?.sourceName,...s,...e.aliases??[],...a.flatMap(n=>[n.id,n.name])];return qe(o,r)}function pe(i,e={}){Se(i);let t=He(e,i),o=t.metric,s=(f,M)=>o==="overall"?we(f,M):(M.metrics[o]??-1/0)-(f.metrics[o]??-1/0)||we(f,M),a=t.projections.map(f=>({...f,projected:!0,position:null,total:null,href:null,metrics:Object.fromEntries(Object.entries(f.metrics).map(([M,z])=>[M,z.value])),ranges:f.metrics})),r=i.models.map(f=>Ne(f,t.search||t.labelSearch)),n=[...r,...a],c=new Map(n.map(f=>[f.id,f])),d=i.families.find(f=>f.id===t.family),l=t.focus?[c.get(t.focus)]:d?[...d.members.flatMap(f=>c.has(f.benchmarkModelId)?[c.get(f.benchmarkModelId)]:[]),...a.filter(f=>f.family===d.id)]:[],v=new Set(l.map(f=>f.id)),b=new Set(t.exclude),w=new Set([...t.baselines,...l.filter(f=>f.projected&&f.baseline).map(f=>f.baseline)]),S=r.filter(f=>w.has(f.id)&&!b.has(f.id)),A=l.filter(f=>Number.isFinite(f.metrics[o])),T=!A.length&&l.some(f=>f.projected)&&S.length>0,g;if(t.compare==="all")g=n;else if(t.compare==="selected")g=[...l,...t.models.map(f=>c.get(f)),...a];else{let f=(T?S:A).flatMap(M=>Number.isFinite(M.metrics[o])?n.filter(z=>!z.projected&&!v.has(z.id)&&z.id!==M.id&&!w.has(z.id)&&!b.has(z.id)&&Z(z,t.routers)&&ve(z,t.type)&&Number.isFinite(z.metrics[o])).sort((z,K)=>Math.abs(z.metrics[o]-M.metrics[o])-Math.abs(K.metrics[o]-M.metrics[o])||we(z,K)).slice(0,t.competitors):[]);g=[...l,...S,...f,...a]}g=g.filter(f=>Z(f,t.routers)&&ve(f,t.type)&&bt(i,f,t.search));let y=l.filter(f=>g.some(M=>M.id===f.id)),R=y.map(f=>f.id),C=!!(t.focus&&(!Z(c.get(t.focus),t.routers)||!ve(c.get(t.focus),t.type)));g=[...new Map(g.filter(f=>!b.has(f.id)||v.has(f.id)).map(f=>[f.id,f])).values()].sort(s);let L=g.filter(f=>Number.isFinite(f.metrics[t.axes.x])&&Number.isFinite(f.metrics[t.axes.y])),m=t.domains?"custom":t.range==="auto"?"detail":t.range,$=t.domains??{x:[0,100],y:[0,100]};if(m==="detail"&&L.length){let f=M=>L.flatMap(z=>{let K=z.ranges?.[t.axes[M]];return K?.lower!==void 0?[K.lower,K.upper]:[z.metrics[t.axes[M]]]});for(let M of[20,30,40,50,60,80,100]){let z=Ue(f("x"),M),K=Ue(f("y"),M);if(z&&K){$={x:z,y:K};break}}}let p=!1,k=t.inspect;k&&!g.some(f=>f.id===k)&&(t.compare!=="competitive"&&!t.search&&t.routers!=="hide"&&t.type==="all"&&j("The inspected model is not in this comparison."),k=null,p=!0),k=k??(g.some(f=>f.id===t.focus)?t.focus:null)??(d?[...l].filter(f=>L.some(M=>M.id===f.id)).sort(s)[0]?.id??L.find(f=>!f.projected)?.id:null)??null;let u=L.filter(f=>f.metrics[t.axes.x]<$.x[0]||f.metrics[t.axes.x]>$.x[1]||f.metrics[t.axes.y]<$.y[0]||f.metrics[t.axes.y]>$.y[1]).length,_=i.metrics.find(f=>f.id===t.axes.x),q=i.metrics.find(f=>f.id===t.axes.y),[P,O]=[_.name.split(" "),q.name.split(" ")],I=P.length>1&&O.length>1&&P.at(-1)===O.at(-1),N=t.title||c.get(t.focus)?.name||d?.name||`${I?P.slice(0,-1).join(" "):_.name} vs. ${q.name}`,D=i.metrics.find(f=>f.id===o),B=t.compare==="competitive"&&T?"Peers of the measured baselines"+(o==="overall"?"":" \xB7 "+D.name):t.subtitle||(t.compare==="competitive"?"Similar "+(o==="overall"?"StealthMark":D.name)+" scores":(t.compare==="selected"?"Selected models":"All models")+(o==="overall"?"":" \xB7 "+D.name)),U=i.presets?.find(f=>{if((f.config.focus||null)!==t.focus||(f.config.family||null)!==t.family)return!1;let M=He(f.config,i);return Object.keys(t).filter(z=>!["inspect","presentation","labelSearch"].includes(z)).every(z=>JSON.stringify(t[z])===JSON.stringify(M[z]))}),V=U&&Object.entries(U.selections??{}).find(([,f])=>f===k)?.[0],H=U?{slug:V??U.id,inspect:V||k===(U.config.inspect??U.config.focus??null)?null:k}:null;return{config:{...t,inspect:k},sharePreset:H,revision:i.revision,rendererRevision:i.rendererRevision??"map-1",subject:N,caption:B+(t.type==="all"?"":" \xB7 "+{open:"Open models",local:"Local models",proprietary:"Proprietary",stealth:"Stealth models"}[t.type])+(t.routers==="hide"?" \xB7 Confirmed routers hidden":""),focusHidden:C,family:d,anchors:y,anchorIds:R,baselines:g.filter(f=>w.has(f.id)),cohort:g,plotted:L,outsideCount:u,inspect:k,inspectionChanged:p,domains:$,range:m,metricX:_,metricY:q,comparisonMetric:D}}function xe(i){let e=i.config,t=i.cohort.find(n=>n.id===e.focus),s=i.cohort.find(n=>n.id===i.inspect)??t??i.cohort.find(n=>!n.projected&&Number.isFinite(n.metrics[e.metric]));if(!s)return{primary:null,reference:null};let a=i.cohort.filter(n=>!n.projected),r=i.cohort.find(n=>n.id===s.baseline)??(t&&s.id!==t.id?t:[...i.baselines,...a].find(n=>n.id!==s.id&&Number.isFinite(n.metrics.overall)));return{primary:s,reference:r??null}}function We(i,e,t="overall"){if(e.projected||!Number.isFinite(e.metrics[t]))return null;if(t==="overall")return e.position?{position:e.position,total:e.total}:null;let o=i.models.filter(s=>Number.isFinite(s.metrics[t]));return{position:1+o.filter(s=>s.metrics[t]>e.metrics[t]).length,total:o.length}}function Ye(i,e){return e.config.metric==="overall"?[e.metricX,e.metricY]:["overall",e.config.metric==="general"?"visual":"general"].map(t=>i.metrics.find(o=>o.id===t))}function te(i,e=ge,{image:t=!1,expectedDataRevision:o}={}){let s=i.config,a=new URL(t?De:fe,e),r=a.searchParams;if(i.sharePreset)return a.pathname=fe+"/"+i.sharePreset.slug+(t?"/social.png":""),i.sharePreset.inspect&&r.set("inspect",i.sharePreset.inspect),t&&(r.set("v",i.revision+"."+i.rendererRevision),o&&r.set("expectedDataRevision",o)),a;for(let n of["focus","family"])s[n]&&r.set(n,s[n]);(s.compare!=="all"||s.focus||s.family)&&r.set("compare",s.compare),s.compare==="selected"&&s.models.length&&r.set("models",s.models.join(",")),s.metric!=="overall"&&r.set("metric",s.metric),s.search&&r.set("search",s.search),s.routers==="all"&&r.set("routers","all"),s.type!=="all"&&r.set("type",s.type),s.exclude.length&&r.set("exclude",s.exclude.join(",")),s.baselines.length&&r.set("baselines",s.baselines.join(",")),s.inspect&&r.set("inspect",s.inspect),s.range!=="auto"&&r.set("range",s.range),s.domains&&r.set("domains",JSON.stringify(s.domains)),s.theme!=="light"&&r.set("theme",s.theme),(s.axes.x!=="general"||s.axes.y!=="visual")&&(r.set("x",s.axes.x),r.set("y",s.axes.y)),s.competitors!==$e&&r.set("competitors",String(s.competitors));for(let n of["title","subtitle","page","search"])s[n]&&r.set(n,s[n]);return s.projections.length&&r.set("projections",gt(Be(s.projections))),t&&(r.set("v",i.revision+"."+i.rendererRevision),o&&r.set("expectedDataRevision",o)),a.pathname.length+a.search.length>6e3&&j("This configuration is too large for a share link. Reduce projection notes or the comparison set."),a}function Ke(i){let e=i.anchors.find(t=>t.id===i.config.focus&&t.href)??(i.config.inspect?i.cohort.find(t=>t.id===i.config.inspect&&t.href):null);return e?{href:e.href,label:`View ${e.name}\u2019s full benchmark results`}:null}function Ze(i){let e=i.config,t=[];for(let o of["focus","family","compare","inspect","range","theme","presentation","title","subtitle","page","search"])e[o]!==null&&e[o]!==void 0&&e[o]!==""&&!(["theme"].includes(o)&&e[o]==="light")&&t.push(`${o}="${h(e[o])}"`);return e.routers==="all"&&t.push('routers="all"'),e.type!=="all"&&t.push(`type="${e.type}"`),e.metric!=="overall"&&t.push(`metric="${e.metric}"`),e.models.length&&t.push(`models="${h(e.models.join(","))}"`),e.baselines.length&&t.push(`baselines="${h(e.baselines.join(","))}"`),e.exclude.length&&t.push(`exclude="${h(e.exclude.join(","))}"`),t.push(`x-axis="${h(e.axes.x)}"`,`y-axis="${h(e.axes.y)}"`),e.competitors!==$e&&t.push(`competitors="${e.competitors}"`),e.projections.length&&t.push(`projections="${h(JSON.stringify(Be(e.projections)))}"`),e.domains&&t.push(`domains="${h(JSON.stringify(e.domains))}"`),`<stealthmark-map ${t.join(" ")}><a href="${h(te(i).href)}">${h(i.subject)} on StealthMark</a></stealthmark-map> | |
| <script type="module" src="https://stealthmodels.com/shared/v1/stealthmark-map.js"><\/script>`}var Xe='<path fill="#273b32" d="M11 81c11-12 5-25 10-44C26 18 38 9 54 10c23 1 35 21 27 40-6 14-19 20-12 30 2 3 6 6 11 7-14 7-27 3-37-6-10 7-23 7-32 0Z"/><path fill="#fffdf4" d="M28 71c5-11-2-22 3-36 4-11 12-17 23-16 16 1 23 14 18 26-4 11-19 17-15 32-11-11-19-10-29-6Z"/><path fill="#273b32" d="M45 33c3 0 5 2 5 6s-2 7-5 7-5-3-5-7 2-6 5-6Zm18-3c3 0 5 2 5 6s-2 7-5 7-5-3-5-7 2-6 5-6Z"/><circle cx="75" cy="75" r="15" fill="#fffdf4"/><path d="m66 75 6 6 12-14" fill="none" stroke="#a24f31" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>',yt=i=>i==="dark"?{paper:"#142821",ink:"#f5f5e9",muted:"#aebeb2",line:"#385246",context:"#7f9c8c",named:"#a9c4b5",label:"#dde6dc",accent:"#e7ae79",general:"#98c7b6",visual:"#e7ae79",projection:"#dca664"}:{paper:"#fbfaf4",ink:"#213a2e",muted:"#647567",line:"#dce1d4",context:"#7a8f76",named:"#566b52",label:"#3b5246",accent:"#a65b38",general:"#39685b",visual:"#a65b38",projection:"#b47f36"};function Je(i,e,t){return[...String(i)].reduce((o,s)=>o+(t?.advances?.[s.codePointAt(0)]??.54),0)*e}var vt=(i,e)=>i.x<e.x+e.w&&i.x+i.w>e.x&&i.y<e.y+e.h&&i.y+i.h>e.y;function Ge([i,e]){let t=e-i<=30?5:e-i<=80?10:20,o=Array.from({length:Math.floor(e/t)+1},(a,r)=>r*t).filter(a=>a>i&&a<e),s=(a,r)=>a%t!==0&&r!==void 0&&Math.abs(a-r)<=t/2;return[...new Set([i,...o,e])].map(a=>({value:a,label:!(a===i&&s(i,o[0]))&&!(a===e&&s(e,o.at(-1)))}))}function je(i,{width:e=680,height:t=440,textMetrics:o,presentation:s="interactive",retainedLabelIds:a=[],labelPass:r=0}={}){let n=s==="social",c={x:54,y:n?37:30,w:e-78,h:t-(n?101:86)},d=(p,k)=>k==="x"?c.x+(p-i.domains.x[0])/(i.domains.x[1]-i.domains.x[0])*c.w:c.y+c.h-(p-i.domains.y[0])/(i.domains.y[1]-i.domains.y[0])*c.h,l=i.plotted.filter(p=>p.metrics[i.config.axes.x]>=i.domains.x[0]&&p.metrics[i.config.axes.x]<=i.domains.x[1]&&p.metrics[i.config.axes.y]>=i.domains.y[0]&&p.metrics[i.config.axes.y]<=i.domains.y[1]).map(p=>({model:p,x:d(p.metrics[i.config.axes.x],"x"),y:d(p.metrics[i.config.axes.y],"y"),anchor:i.anchorIds.includes(p.id),baseline:i.baselines.some(k=>k.id===p.id),inspected:p.id===i.inspect,partial:!!(p.partial?.[i.config.axes.x]||p.partial?.[i.config.axes.y]),range:p.projected?{x:p.ranges?.[i.config.axes.x],y:p.ranges?.[i.config.axes.y]}:null})),v=xe(i),b=!l.some(p=>p.anchor||p.inspected);for(let p of l)p.subject=b&&p.model.id===v.primary?.id,p.reference=!n&&p.model.id===v.reference?.id&&p.model.id!==v.primary?.id;let w=l.find(p=>p.anchor&&p.model.baseline)?.model.baseline,S=p=>p.anchor?0:p.model.id===w?1:p.baseline?3:2,A=[...l].sort((p,k)=>S(p)-S(k)||(p.model.position??1/0)-(k.model.position??1/0)||p.model.id.localeCompare(k.model.id)),T=i.config.compare==="selected",g=[],y=[],R=l.length<=9&&e>=440||l.length<=6?l.length:e<440?4:8,C=A.find(p=>p.anchor),L=T?A:e<440&&C?.model.projected?[C,A.find(p=>p.model.id===w),...A.filter(p=>!p.anchor&&!p.baseline).slice(0,2)].filter(Boolean):A.slice(0,R);for(let p of A.filter(k=>k.inspected&&!L.includes(k)))L.push(p);let m=[...new Set(["open","local"].flatMap(p=>{let k=l.filter(_=>!_.model.projected&&(p==="local"?_.model.local===!0:_.model.access==="open")&&Number.isFinite(_.model.metrics[i.config.metric])),u=Math.max(...k.map(_=>_.model.metrics[i.config.metric]));return k.filter(_=>_.model.metrics[i.config.metric]===u).sort((_,q)=>_.model.id.localeCompare(q.model.id))}))],$=[...new Set([...T?A:[],...m,...l.filter(p=>a.includes(p.model.id))])];for(let[p,k]of[...L.map(u=>[u,T&&s!=="social"]),...$.map(u=>[u,!0])]){if(g.some(H=>H.id===p.model.id))continue;let u=p.model.name,_=s==="social"?p.anchor?22:p.baseline?17:18:e<440?11:p.anchor?13:p.baseline?12:13,q=se(p.model),P=11,O=q?Je(q,P,o)+10:0,I=Je(u,_,o)+12+(q?O+7:0),N=s==="social"?p.anchor?30:26:24,D=[[p.x+15,p.y-12],[p.x-I-15,p.y-12],[p.x+15,p.y-N-10],[p.x-I-15,p.y-N-10],[p.x+15,p.y+12],[p.x-I-15,p.y+12],[p.x-I/2,p.y-N-14],[p.x-I/2,p.y+14]],B=H=>Math.max(c.x+3,Math.min(H,c.x+c.w-I-3));D.push([B(p.x-I/2),p.y-N-14],[B(p.x-I/2),p.y+14]);let U=([H,f])=>H>=c.x+3&&H+I<=c.x+c.w-3&&f>=c.y+1&&f+N<=c.y+c.h-2&&!y.some(M=>vt({x:H-4,y:f-4,w:I+8,h:N+8},M))&&!l.some(M=>{let z=s==="social"?M.anchor?M.model.projected?11:9:M.baseline?6:5.3:e<440?5:6;return M.x>H-z&&M.x<H+I+z&&M.y>f-z&&M.y<f+N+z}),V=D.find(U);if(k||!V){let H=D.filter(U);for(let M=c.y+1;M+N<=c.y+c.h-2;M+=4)for(let z=c.x+3;z+I<=c.x+c.w-3;z+=6)U([z,M])&&H.push([z,M]);let f=([M,z])=>Math.hypot(p.x-Math.max(M,Math.min(p.x,M+I)),p.y-Math.max(z,Math.min(p.y,z+N)));V=H.sort((M,z)=>f(M)-f(z)||M[1]-z[1]||M[0]-z[0])[0]}if(V){let[H,f]=V,M={x:H,y:f,w:I,h:N};g.push({id:p.model.id,text:u,size:_,badge:q,badgeSize:P,badgeWidth:O,...M,point:p}),y.push(M)}}return s!=="social"&&r<(T?Math.max(6,l.length):6)&&$.some(p=>!g.some(k=>k.id===p.model.id))?je(i,{width:e,height:t+40,textMetrics:o,presentation:s,retainedLabelIds:[...new Set([...a,...g.map(p=>p.id)])],labelPass:r+1}):{width:e,height:t,plot:c,points:l,labels:g,presentation:s,xTicks:Ge(i.domains.x).map(p=>({...p,position:d(p.value,"x")})),yTicks:Ge(i.domains.y).map(p=>({...p,position:d(p.value,"y")})),scale:d}}var x=i=>Number(i.toFixed(2));function wt(i,e,t){let o=0,s=1;for(let[a,r]of[["x","w"],["y","h"]]){let n=e[a]-i[a],c=t[a]-2,d=t[a]+t[r]+2;if(Math.abs(n)<.001){if(i[a]<=c||i[a]>=d)return!1;continue}let l=(c-i[a])/n,v=(d-i[a])/n;if(o=Math.max(o,Math.min(l,v)),s=Math.min(s,Math.max(l,v)),o>=s)return!1}return!0}function $t(i,e){let t=i.point,o=[],s=i.x+3,a=i.y+4,r=i.w-6,n=i.h-8,c=[Math.max(s+9,Math.min(t.x,s+r-9)),s+9,s+r/2,s+r-9];t.x<=s&&o.push({x:s,y:a+n/2,side:"left"}),t.x>=s+r&&o.push({x:s+r,y:a+n/2,side:"right"}),t.y<=a&&o.push(...c.map(b=>({x:b,y:a,side:"top"}))),t.y>=a+n&&o.push(...c.map(b=>({x:b,y:a+n,side:"bottom"})));let d=b=>{let w=b.side==="left"?-10:b.side==="right"?10:0,S={x:b.x+w,y:b.y};return w&&Math.abs(t.y-b.y)>.5&&(w<0?t.x<=S.x:t.x>=S.x)?[t,S,b]:[t,b]},l=b=>{let w=d(b),S=w.slice(1).map((R,C)=>[w[C],R]),A=S.reduce((R,[C,L])=>R+Math.hypot(L.x-C.x,L.y-C.y),0),T=e.labels.filter(R=>R!==i&&S.some(([C,L])=>wt(C,L,R))).length,g=e.points.filter(R=>R!==t&&S.some(([C,L])=>{let m=L.x-C.x,$=L.y-C.y,p=((R.x-C.x)*m+(R.y-C.y)*$)/(m*m+$*$||1);return p>0&&p<1&&Math.hypot(R.x-C.x-p*m,R.y-C.y-p*$)<7})).length,y=(b.side==="top"||b.side==="bottom")&&Math.abs(b.x-t.x)>1;return A+T*45+g*30+(y?30:0)},v=o.map(b=>({...b,cost:l(b)})).sort((b,w)=>b.cost-w.cost)[0];return{...v,path:d(v).map((b,w)=>`${w?"L":"M"}${x(b.x)} ${x(b.y)}`).join("")}}var ce=(i,e)=>i.config.metric==="overall"||i.config.axes[e]===i.config.metric;function Qe(i,e,{id:t="map",accessible:o=!1,axisLabels:s=!0}={}){let a=yt(i.config.theme),{width:r,height:n,plot:c}=e,d=(m,$,p,k=12,u=a.muted,_="")=>`<text x="${x(m)}" y="${x($)}" font-size="${k}" fill="${u}" ${_}>${h(p)}</text>`,l=`<rect width="${r}" height="${n}" fill="${a.paper}"/><defs><clipPath id="${t}-plot"><rect x="${c.x-10}" y="${c.y-10}" width="${c.w+20}" height="${c.h+20}"/></clipPath><linearGradient id="${t}-forecast" x2="0" y2="1"><stop stop-color="${a.projection}" stop-opacity=".065"/><stop offset="1" stop-color="${a.projection}" stop-opacity=".025"/></linearGradient></defs>`,v=e.presentation==="social",b=v?16:11,w=v?18:r<440?12:13;for(let m of e.xTicks)l+=`<line x1="${x(m.position)}" x2="${x(m.position)}" y1="${c.y}" y2="${c.y+c.h}" stroke="${a.line}" stroke-width=".8"/>`+(m.label?d(m.position,c.y+c.h+(v?24:20),m.value,b,a.muted,'text-anchor="middle"'):"");for(let m of e.yTicks)l+=`<line x1="${c.x}" x2="${c.x+c.w}" y1="${x(m.position)}" y2="${x(m.position)}" stroke="${a.line}" stroke-width=".8"/>`+(m.label?d(c.x-12,m.position+4,m.value,b,a.muted,'text-anchor="end"'):"");let S=c.y+c.h,A=c.x+c.w,T=m=>ce(i,m)?a.ink:a.muted;for(let m of["x","y"]){let $=ce(i,m),p=m==="x"?A+10:c.y-9,k=m==="x"?`M${c.x} ${S}H${p}`:`M${c.x} ${S}V${p}`,u=m==="x"?`M${p-5} ${S-4}L${p} ${S}L${p-5} ${S+4}`:`M${c.x-4} ${p+5}L${c.x} ${p}L${c.x+4} ${p+5}`;l+=`<path data-map-axis="${m}" data-emphasized="${$}" d="${k}${u}" fill="none" stroke="${T(m)}" stroke-width="${$?1.8:1}" stroke-opacity="${$?1:.7}" stroke-linecap="round" stroke-linejoin="round" pointer-events="none"/>`}let g=m=>ce(i,m)?m==="x"?a.general:a.visual:a.muted;s&&(l+=d(c.x+(v?0:12),18,i.metricY.name,w,g("y"),'font-weight="600"')+d(A,n-15,i.metricX.name,w,g("x"),'font-weight="600" text-anchor="end"')),l+=`<g clip-path="url(#${t}-plot)">`;for(let m of e.points.filter($=>$.range&&(e.presentation!=="social"||$.inspected))){let $=m.range.x,p=m.range.y,k=$?.lower!==void 0?e.scale($.lower,"x"):m.x-7,u=$?.upper!==void 0?e.scale($.upper,"x"):m.x+7,_=p?.upper!==void 0?e.scale(p.upper,"y"):m.y-7,q=p?.lower!==void 0?e.scale(p.lower,"y"):m.y+7,P=$?.lower!==void 0,O=p?.lower!==void 0,I=".65";l+=`<g data-map-range="${h(m.model.id)}"${m.inspected?"":' style="display:none"'}>`,P&&O&&(l+=`<rect class="projection-range" x="${x(k)}" y="${x(_)}" width="${x(u-k)}" height="${x(q-_)}" rx="6" fill="url(#${t}-forecast)" stroke="${a.projection}" stroke-opacity="${I}" stroke-width="${e.presentation==="social"?2:1.5}" stroke-dasharray="3 4"/>`),(P||O)&&!(P&&O)&&(l+=`<path class="projection-whisker" d="${P?`M${x(k)} ${x(m.y)}H${x(u)}M${x(k)} ${x(m.y-4)}v8M${x(u)} ${x(m.y-4)}v8`:""}${O?`M${x(m.x)} ${x(_)}V${x(q)}M${x(m.x-4)} ${x(_)}h8M${x(m.x-4)} ${x(q)}h8`:""}" fill="none" stroke="${a.projection}" stroke-opacity="${I}"/>`);let N=$?.central,D=p?.central;if(N&&D){let B=e.scale(N.lower,"x"),U=e.scale(N.upper,"x"),V=e.scale(D.upper,"y"),H=e.scale(D.lower,"y");l+=`<rect class="projection-central-range" x="${x(B)}" y="${x(V)}" width="${x(U-B)}" height="${x(H-V)}" rx="4" fill="${a.projection}" fill-opacity=".045" stroke="${a.projection}" stroke-opacity=".8" stroke-width="${e.presentation==="social"?2.5:2}"/>`}else if(N||D){let B=e.scale((N??D).lower,N?"x":"y"),U=e.scale((N??D).upper,N?"x":"y");l+=`<path class="projection-central-whisker" d="${N?`M${x(B)} ${x(m.y)}H${x(U)}M${x(B)} ${x(m.y-5)}v10M${x(U)} ${x(m.y-5)}v10`:`M${x(m.x)} ${x(B)}V${x(U)}M${x(m.x-5)} ${x(B)}h10M${x(m.x-5)} ${x(U)}h10`}" fill="none" stroke="${a.projection}" stroke-opacity=".85" stroke-width="1.4"/>`}l+="</g>"}for(let m of[e.points.find($=>$.inspected)??e.points.find($=>$.anchor)??e.points.find($=>$.subject)].filter(Boolean))l+=`<path d="M${c.x} ${x(m.y)}H${x(m.x)}V${c.y+c.h}" fill="none" stroke="${a.accent}" stroke-width="1" stroke-opacity=".22" stroke-dasharray="2 5"/>`;for(let m of e.labels){let $=m.point,{path:p}=$t(m,e);l+=`<g data-map-connector="${h(m.id)}" pointer-events="none" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="${p}" stroke="${a.paper}" stroke-width="3"/><path class="label-connector" d="${p}" stroke="${$.model.projected?a.projection:$.anchor||$.subject?a.ink:a.muted}" stroke-width="1.2" stroke-opacity=".75"/></g>`}let y=m=>m.anchor||m.inspected?2:m.subject||m.reference?1:0,R=new Set(e.labels.map(m=>m.id)),C=m=>!m.model.projected&&!m.anchor&&!m.subject&&!m.baseline,L=e.points.some(m=>C(m)&&!R.has(m.model.id));for(let m of[...e.points].sort(($,p)=>y($)-y(p))){let{model:$,x:p,y:k}=m,u=e.presentation==="social",_=m.anchor||m.subject,q=m.anchor?u?11:8:u?8:6,P=$.projected?a.projection:_?a.ink:m.baseline?a.general:L&&R.has($.id)?a.named:a.context,O=!u&&r<440,I=_?u?9:O?6:7:m.baseline?u?6:O?4.5:5:u?5.6:O?3.9:4.6,N=u?2:O?1.2:1.5;l+=`<g data-map-point="${h($.id)}" data-map-role="${m.anchor?"target":m.baseline?"baseline":"comparison"}"><title>${h(oe($,i.config.search||i.config.labelSearch)||$.name)}</title>`,(m.anchor&&(m.inspected||i.config.focus)||m.subject)&&(l+=`<circle class="target-halo" cx="${x(p)}" cy="${x(k)}" r="${u?18:13}" fill="${P}" fill-opacity=".09" stroke="${P}" stroke-opacity=".22" stroke-width="1"/>`),m.reference&&(l+=`<circle class="reference-ring" cx="${x(p)}" cy="${x(k)}" r="10" fill="none" stroke="${a.ink}" stroke-opacity=".55" stroke-width="1.2"/>`),$.projected?l+=`<path class="model-marker" d="M${x(p)} ${x(k-q)}L${x(p+q)} ${x(k)}L${x(p)} ${x(k+q)}L${x(p-q)} ${x(k)}Z" fill="${a.paper}" stroke="${P}" stroke-width="${m.anchor?2.5:1.8}"/>`:(m.partial||(l+=`<circle class="marker-ring" cx="${x(p)}" cy="${x(k)}" r="${x(I+N)}" fill="${a.paper}"/>`),l+=`<circle class="model-marker" cx="${x(p)}" cy="${x(k)}" r="${I}" fill="${m.partial?a.paper:P}" stroke="${P}" stroke-width="${m.partial?1.7:.8}"/>`),m.inspected&&(l+=`<path class="focus-bracket" d="M${x(p-15)} ${x(k-7)}v-8h8M${x(p+7)} ${x(k-15)}h8v8M${x(p+15)} ${x(k+7)}v8h-8M${x(p-7)} ${x(k+15)}h-8v-8" fill="none" stroke="${a.accent}" stroke-width="1.5"/>`),l+="</g>"}l+="</g>";for(let m of e.labels){let $=m.point,p=$.anchor,k=p&&($.inspected||i.config.focus),u=$.model.projected,_=k&&!u?a.paper:p||$.subject?a.ink:$.baseline?a.general:a.label,q=k&&!u?a.ink:a.paper;if(l+=`<g data-map-label="${h(m.id)}" data-map-role="${p?"target":$.baseline?"baseline":"comparison"}" style="cursor:pointer"><title>${h(oe($.model,i.config.search||i.config.labelSearch)||$.model.name)}</title><rect x="${x(m.x)}" y="${x(m.y)}" width="${x(m.w)}" height="${m.h}" rx="4" fill="${k?u?a.projection:a.ink:a.paper}" fill-opacity="${k?u?".16":".85":".5"}"/>`+d(m.x+6,m.y+(e.presentation==="social"?21:17),m.text,m.size,_,`font-weight="${p||$.subject?700:500}" stroke="${q}" stroke-width="3" stroke-linejoin="round" paint-order="stroke fill"`),m.badge){let P=m.x+m.w-m.badgeWidth-5,O=m.y+(m.h-16)/2;l+=`<g data-router-badge="${h(m.id)}" aria-label="${h(le($.model))}"><title>${h(le($.model))}</title><rect x="${x(P)}" y="${x(O)}" width="${x(m.badgeWidth)}" height="16" rx="3" fill="${_}" fill-opacity=".08" stroke="${_}" stroke-opacity=".55"/>`+d(P+5,O+11.2,m.badge,m.badgeSize,_,'font-weight="500"')+"</g>"}l+="</g>"}return`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${n}" viewBox="0 0 ${r} ${n}" ${o?`role="img" aria-label="${h(i.metricX.name+" and "+i.metricY.name+" for "+i.subject)}"`:'aria-hidden="true"'} style="font-family:'DM Sans',sans-serif;font-kerning:none;font-variant-ligatures:none">${l}</svg>`}function Me(i,e,t,o=22){return i.points.map(s=>({...s,distance:Math.hypot(s.x-e,s.y-t)})).filter(s=>s.distance<=o).sort((s,a)=>s.distance-a.distance||(s.model.position??1/0)-(a.model.position??1/0)||s.model.id.localeCompare(a.model.id))}function ze(i,e){return`${i.name}${se(i)?" \xB7 "+(i.routerStatus==="confirmed"?"Router":"Suspected router"):""}${i.projected?" \xB7 Projected":""}. ${e.metricX.name} ${E(i.metrics[e.config.axes.x])}. ${e.metricY.name} ${E(i.metrics[e.config.axes.y])}. StealthMark Score ${E(i.metrics.overall)}.`}var kt=(i,e)=>i.x<e.x+e.w&&i.x+i.w>e.x&&i.y<e.y+e.h&&i.y+i.h>e.y;function et({bounds:i,width:e,height:t,anchor:o,protectedRects:s=[],obstacles:a=[]}){if(e>i.w||t>i.h)return null;let r=(w,S,A)=>Math.max(S,Math.min(w,A)),n=[o.x+18,o.x-e-18,i.x,i.x+i.w-e],c=[o.y-t-18,o.y+18,i.y,i.y+i.h-t];for(let w of[...s,...a])n.push(w.x-e-8,w.x+w.w+8),c.push(w.y-t-8,w.y+w.h+8);let d=[...new Set(n.map(w=>r(w,i.x,i.x+i.w-e)))],l=[...new Set(c.map(w=>r(w,i.y,i.y+i.h-t)))],v=null,b=1/0;for(let w of d)for(let S of l){let A={x:w,y:S,w:e,h:t};if([...s,...a].some(g=>kt(A,g)))continue;let T=Math.hypot(o.x-r(o.x,w,w+e),o.y-r(o.y,S,S+t));T<b&&(b=T,v={x:w,y:S})}return v}var Y=i=>se(i)?`<span class="router-badge" data-router-status="${i.routerStatus}" title="${le(i)}" aria-label="${i.routerStatus==="confirmed"?"Confirmed router or multi-model system":"Suspected router"}">${se(i)}</span>`:"",_t="https://stealthmodels.com",F=()=>window.STEALTH_MODELS_PREVIEW?.origins?.[_t]||new URL(import.meta.url).origin,Ae,St=0,ie=new Map;function tt(i){return ie.has(i)||ie.set(i,fetch(i,{credentials:"omit"}).then(e=>{if(!e.ok)throw Error("StealthMark results are unavailable.");return e.json()}).then(Se).catch(e=>{throw ie.delete(i),e})),ie.get(i)}function jt(){return!Ae&&typeof FontFace<"u"&&(Ae=new FontFace("DM Sans",`url(${F()}/shared/v1/stealthmark-map-font.ttf)`).load().then(i=>{document.fonts.add(i)}).catch(()=>{})),Ae}var be=i=>i?.projected&&i.kind==="editorial",rt=()=>matchMedia("(pointer: coarse)").matches,nt=()=>matchMedia("(max-width: 580px), (pointer: coarse) and (max-height: 520px)").matches,it="(pointer: coarse) and (max-height: 520px)",ot=(i,e)=>{let t=i.querySelector("h3");!nt()&&i.getBoundingClientRect().top<0&&i.scrollIntoView({block:"start"}),rt()&&t?(t.tabIndex=-1,t.focus({preventScroll:!0})):e?.focus({preventScroll:!0})},at=i=>i.central?["Central","Wider"].map((e,t)=>{let o=t?i:i.central;return`<span class="range-line"><span class="range-label">${e}</span> <span class="range-values">${E(o.lower)}\u2013${E(o.upper)}</span></span>`}).join(""):h(_e(i)),st=(i,e)=>E(i.metrics[e])+(i.ranges?.[e]?.lower!==void 0?` <small class="cell-range">${h(_e(i.ranges[e]))}</small>`:""),Mt=i=>(i>0?"+":"")+E(i),zt=ke,Re=class extends HTMLElement{static observedAttributes=[...zt,"label-links","compact-popup","external-router-filter","label-search","data-feed"];constructor(){super(),this.attachShadow({mode:"open"}),this._id="sm-map-"+ ++St,this._config=null,this._ready=!1,this._queue=!1,this._width=680,this._dismissedChooserPointer=null,this.shadowRoot.innerHTML=`<style>${me.replaceAll("url('./stealthmark-map-font.ttf')",`url('${F()}/shared/v1/stealthmark-map-font.ttf')`)}${ye}</style><div class="pending"><slot></slot></div>`}connectedCallback(){if(Object.hasOwn(this,"config")){let t=this.config;delete this.config,this.config=t}this._lifecycle=new AbortController;let e=this._lifecycle.signal;this._metricHelp=Ie(this.shadowRoot,e),this.shadowRoot.addEventListener("click",t=>this._click(t),{signal:e}),this.shadowRoot.addEventListener("change",t=>this._change(t),{signal:e}),this.shadowRoot.addEventListener("input",t=>this._input(t),{signal:e}),document.addEventListener("pointerdown",t=>{let o=t.composedPath(),s=this.shadowRoot.querySelector(".model-filters"),a=this.shadowRoot.querySelector(".chooser");s?.open&&!o.includes(s)&&(s.open=!1),this._dismissedChooserPointer=null,a&&!a.hidden&&!o.includes(a)&&(this._dismissedChooserPointer=t.pointerId,this._closeChooser());let r=this.shadowRoot.querySelector(".plot");this._touchCard&&r&&!o.includes(r)&&(this._touchCard=!1,this._clearHover())},{signal:e}),this.shadowRoot.addEventListener("pointerdown",t=>{this._pointerType=t.pointerType},{signal:e,capture:!0}),matchMedia(it).addEventListener("change",()=>this._renderPlot(),{signal:e}),this.shadowRoot.addEventListener("focusout",t=>{let o=this.shadowRoot.querySelector(".chooser");o&&!o.hidden&&o.contains(t.target)&&!o.contains(t.relatedTarget)&&this._closeChooser()},{signal:e}),this.shadowRoot.addEventListener("pointermove",t=>this._hover(t),{signal:e}),this.shadowRoot.addEventListener("pointerout",t=>{t.target.closest?.(".plot")&&!t.relatedTarget?.closest?.(".plot")&&this._showModelHover()},{signal:e}),this.shadowRoot.addEventListener("keydown",t=>{if(t.key==="Escape"){let o=this.shadowRoot.querySelector(".chooser");if(o&&!o.hidden){t.preventDefault(),t.stopPropagation(),this._closeChooser(!0),this._clearHover();return}let s=this.shadowRoot.querySelector(".model-filters");if(s?.open){t.preventDefault(),s.open=!1,s.querySelector("summary").focus({preventScroll:!0});return}let a=this.shadowRoot.querySelector(".overlay"),r=a&&!a.hidden;r&&t.preventDefault(),this._closeTransient(),this._clearHover(),r&&this._editorTrigger?.focus({preventScroll:!0})}if(t.key==="Tab"){let o=this.shadowRoot.querySelector(".overlay");if(o&&!o.hidden){let s=[...o.querySelectorAll("button,input,select,a[href]")].filter(c=>!c.disabled&&!c.hidden),a=s[0],r=s.at(-1),n=this.shadowRoot.activeElement;t.shiftKey&&n===a?(t.preventDefault(),r?.focus()):!t.shiftKey&&n===r&&(t.preventDefault(),a?.focus())}}},{signal:e}),this._resize=new ResizeObserver(()=>{let t=this.shadowRoot.querySelector(".plot")?.clientWidth;t&&Math.abs(t-this._width)>1&&(this._width=t,this._renderPlot())}),this._resize.observe(this),"IntersectionObserver"in window?(this._visibility=new IntersectionObserver(t=>{t.some(o=>o.isIntersecting)&&(this._visibility.disconnect(),this._start())},{rootMargin:"400px"}),this._visibility.observe(this)):this._start()}disconnectedCallback(){this._lifecycle?.abort(),this._resize?.disconnect(),this._visibility?.disconnect(),this._generation=(this._generation||0)+1}attributeChangedCallback(e){if(e==="data-feed"){this.isConnected&&this._start();return}if(e==="label-search"){this._view&&!this._view.config.search&&(this._view.config.labelSearch||"")!==(this.getAttribute("label-search")||"")&&this._commit({},"labels");return}if(e==="label-links"||e==="compact-popup"||e==="external-router-filter"){this._view&&this._render();return}this._queue||(this._queue=!0,queueMicrotask(()=>{if(this._queue=!1,this.isConnected&&this._doc&&this._config===null)try{let t=this._attributes();if(this._view&&this._sameConfig(t))return;this._apply(t,"configuration")}catch(t){this._error(t)}}))}set config(e){this._config=e,this._doc&&this.isConnected&&this._apply(e??this._attributes(),"configuration")}get config(){return this._config}get state(){return this._view?{revision:this._view.revision,config:structuredClone(this._view.config),cohortIds:this._view.cohort.map(e=>e.id),inspect:this._view.inspect,domains:structuredClone(this._view.domains)}:null}highlightModel(e){return this._externalHighlight=e??null,this._showModelHover()}openProjectionEditor({id:e,name:t}={}){return this._view?(this._projection(e),t&&!e&&(this.shadowRoot.querySelector('[name="name"]').value=t),!0):!1}getShareUrl(){return this._view?te(this._view).href:null}getModelDetailLink(){return this._view?Ke(this._view):null}_attributes(){return Fe(this)}_feedUrl(){return this.getAttribute("data-feed")||F()+"/data/v1/stealthmark-map.json"}async _start(){let e=this._generation=(this._generation||0)+1;try{if(this._doc=await tt(this._feedUrl()),await jt(),!this.isConnected||e!==this._generation)return;this._apply(this._config??this._attributes(),"initial")}catch(t){this._error(t),this._ready||(this.shadowRoot.innerHTML=`<style>${me}</style><slot></slot><p class="status">${h(t.message)} <button type="button" data-action="retry">Retry</button></p>`)}}_error(e){this._status(e.message),this.dispatchEvent(new CustomEvent("stealthmark-map:error",{bubbles:!0,composed:!0,detail:{message:e.message}}))}_apply(e,t){try{let o=pe(this._doc,{...e,labelSearch:this.getAttribute("label-search")||""});te(o);let s=["axes","configuration","anchor"].includes(t)&&this.shadowRoot.querySelector(".settings")?.open,a=this.shadowRoot.activeElement?.dataset.setting;this._view=o,this._render(),t==="router-filter"&&this.shadowRoot.querySelector("[data-setting=routers]")?.focus({preventScroll:!0}),t==="type-filter"&&this.shadowRoot.querySelector("[data-setting=type]:checked")?.focus({preventScroll:!0}),s&&(this.shadowRoot.querySelector(".settings").open=!0,a&&this.shadowRoot.querySelector(`[data-setting="${a}"]`)?.focus({preventScroll:!0})),this.dispatchEvent(new CustomEvent(this._ready?"stealthmark-map:change":"stealthmark-map:ready",{bubbles:!0,composed:!0,detail:{...this.state,reason:t}})),this._ready=!0,o.focusHidden?this._status("Focus hidden by router filter."):o.inspectionChanged&&this._status("The comparison models have changed.")}catch(o){this._error(o)}}_commit(e,t){let o={...this._view.config,...e};o.compare!=="selected"&&delete o.models,this._apply(o,t)}_render(){this._metricHelp?.hide();let e=this.shadowRoot.activeElement?.matches?.(".quicksearch-input")?this.shadowRoot.activeElement:null,t=e&&[e.selectionStart,e.selectionEnd],o=this.hasAttribute("compact-popup"),s=this.shadowRoot.querySelector(".compact-tools")?.open,a=this.shadowRoot.querySelector(".model-filters")?.open,r=this._view,n=r.config,c=this._doc.families.find(u=>r.baselines.length&&r.baselines.every(_=>u.members.some(q=>q.benchmarkModelId===_.id))),d=[...new Set([n.metric,"overall",n.axes.x,n.axes.y])],l=`<svg viewBox="4 4 88 88" aria-hidden="true">${Xe}</svg>`,v=u=>this._doc.metrics.map(_=>`<option value="${h(_.id)}"${u===_.id?" selected":""}>${h(this._name(_))}</option>`).join(""),b=`<option value="">The whole field</option><optgroup label="Models">${this._doc.models.filter(u=>Z(u,n.routers)||u.id===n.focus).map(u=>`<option value="model:${h(u.id)}"${n.focus===u.id?" selected":""}${Z(u,n.routers)?"":" disabled"}>${h(this._name(u))}${Z(u,n.routers)?"":" \xB7 Hidden router"}</option>`).join("")}${n.projections.map(u=>`<option value="model:${h(u.id)}"${n.focus===u.id?" selected":""}>${h(this._name(u))} \xB7 Projected</option>`).join("")}</optgroup><optgroup label="Families">${this._doc.families.map(u=>`<option value="family:${h(u.id)}"${n.family===u.id?" selected":""}>${h(u.name)}</option>`).join("")}</optgroup>`,w=this._doc.models.find(u=>u.id===n.focus),S=h(n.title?"":this._tooltip(w)),A=[n.subtitle,r.focusHidden?"Focus hidden by router filter":"",r.cohort.length!==r.plotted.length?r.plotted.length+" plotted of "+r.cohort.length:""].filter(Boolean).join(" \xB7 "),T=o?`<span class="caption">${h(r.caption)}${r.focusHidden?" \xB7 Focus hidden by router filter":""}${r.cohort.length!==r.plotted.length?" \xB7 "+r.plotted.length+" plotted of "+r.cohort.length:""}</span>`:`<span class="caption${A?"":" sr-only"}">${h(A||r.caption)}</span>`,g=`<h2 title="${S}" aria-description="${S}">${h(r.subject)}${!n.title&&n.focus?Y(w):""}</h2>`,y=`<button class="estimate-cta" type="button" data-action="projection" aria-label="${h(r.family?"Add "+r.family.name+" estimate":"Add estimate")}" title="${h(r.family?"Add "+r.family.name+" estimate":"Add estimate")}" aria-haspopup="dialog"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m12 3 9 9-9 9-9-9Z" stroke-dasharray="2 3"/><path d="M12 8v8m-4-4h8"/></svg></button>`,R=`<div class="segmented scope" role="group" aria-label="Compared models">${[["all","All models"],["competitive","Similar scores"],["selected","Selected"]].map(([u,_])=>`<button type="button" data-compare="${u}" aria-pressed="${n.compare===u}"${u==="competitive"&&!n.focus&&!n.family?" disabled":""}>${_}</button>`).join("")}</div>`,C=`<div class="metric-controls"><span>Compare by</span><div class="segmented" role="group" aria-label="Comparison score">${Object.entries(ae).map(([u,_])=>`<button type="button" data-metric="${u}" ${Q[u]?`data-metric-help="${u}"`:""} aria-label="${_}" aria-pressed="${n.metric===u}">${ue(u)}<span>${he[u]}</span></button>`).join("")}</div></div>`,L=this.hasAttribute("external-router-filter"),m=(n.type!=="all"?1:0)+(!L&&n.routers!=="hide"?1:0),$=[["all","All models",""],["open","Open models","Downloadable weights you can use commercially",!0],["local","Local models","Runs on consumer hardware at a practical quantization",!0],["proprietary","Proprietary",""],["stealth","Stealth","Identity not yet revealed"]],p=`<details class="model-filters"${a?" open":""}><summary>Filters${m?` <span class="filter-count" aria-label="${m} active ${m===1?"filter":"filters"}">${m}</span>`:""}</summary><div class="filter-menu"><fieldset class="routing-filter type-filter"><legend>Model type</legend>${$.map(([u,_,q,P])=>`<label class="router-filter type-choice${P?" wide":""}"><input type="radio" name="${this._id}-type" data-setting="type" value="${u}"${n.type===u?" checked":""}><span>${_}${q?`<small>${q}</small>`:""}</span></label>`).join("")}</fieldset>${L?"":`<fieldset class="routing-filter"><legend>Routing</legend><label class="router-filter"><input type="checkbox" data-setting="routers"${n.routers!=="hide"?" checked":""}><span>Include confirmed routers<small>Suspected routers stay included</small></span></label></fieldset>`}<div class="filter-footer"><button type="button" data-action="reset-router-filter"${m?"":" disabled"}>Reset these filters</button></div></div></details>`;this.shadowRoot.innerHTML=`<style>${me.replaceAll("url('./stealthmark-map-font.ttf')",`url('${F()}/shared/v1/stealthmark-map-font.ttf')`)}${ye}</style><section class="map ${n.presentation}" data-theme="${n.theme}" aria-label="${h(r.subject)} StealthMark comparison">${o?`<details class="compact-tools"${s?" open":""}><summary>Search, compare and share${n.search||n.routers!=="hide"?" / Filter active":""}</summary>`:""}<header class="top"><div class="brand">${l}<div class="title-stack"><span class="brand-name">StealthMark Map${this._doc.stealthmarkVersion?' <small class="stealthmark-version">'+h(this._doc.stealthmarkVersion)+"</small>":""}</span>${o?"":g+T}</div></div><div class="top-actions">${o?"":y}<div class="share"><button type="button" class="share-trigger" data-action="share" aria-expanded="false"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 16V3m-5 5 5-5 5 5M5 13v7h14v-7"/></svg>Share</button><div class="share-menu" hidden><button data-action="copy-link" type="button">Copy social link</button><a class="direct-share" href="${h(te(r,F()).href)}">Open share page \u2197</a><button data-action="download" type="button">Download PNG</button><button data-action="copy-embed" type="button">Copy embed code</button><button data-action="refresh" type="button" hidden>Refresh results</button><p class="share-feedback" role="status" aria-live="polite" aria-atomic="true"></p></div></div></div></header><div class="toolbar"><div class="search-tools"><label class="quicksearch"><span class="quicksearch-label">Quicksearch</span><span class="sr-only">Search models, families, companies or stealth names. Separate several searches with commas.</span><span class="quicksearch-field"><svg class="search-icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m15.5 15.5 5 5"/></svg><input type="search" class="quicksearch-input" maxlength="500" value="${h(n.search)}" placeholder="GPT, Claude, Qwen\u2026" enterkeyhint="search" autocomplete="off" spellcheck="false" aria-describedby="${this._id}-search-help"></span><span id="${this._id}-search-help" class="search-count">${n.search?`${r.cohort.length} ${r.cohort.length===1?"match":"matches"}`:""}</span></label>${p}</div>${R}${o?"":C}</div>${o?`</details><div class="heading">${T}</div>${C}`:""}${r.anchors.length>1?`<div class="target-roster" role="group" aria-label="Target models">${r.anchors.map(u=>`<button type="button" class="target-chip${u.projected?" projected":""}" data-inspect="${h(u.id)}" title="${h(this._tooltip(u))}" aria-description="${h(this._tooltip(u))}" aria-pressed="${r.inspect===u.id}"><i aria-hidden="true"></i>${h(this._name(u))}${Y(u)}</button>`).join("")}</div>`:""}<div class="composition"><div class="plot" aria-label="Interactive comparison graph" aria-describedby="${this._id}-plot-summary"><p class="sr-only" id="${this._id}-plot-summary"></p><div class="tooltip" hidden></div><div class="chooser" hidden></div></div><aside class="inspector" aria-label="Model scores"></aside></div>${r.family&&n.projections.length?`<div class="comparison-roster" role="group" aria-label="Measured comparison models"><span>Measured comparisons</span>${(n.compare==="selected"||r.cohort.filter(u=>!u.projected).length<=6?r.cohort.filter(u=>!u.projected):[...r.baselines,...r.cohort.filter(u=>!u.projected&&!r.baselines.some(_=>_.id===u.id)).slice(0,2)]).map(u=>`<button type="button" class="comparison-chip${r.baselines.some(_=>_.id===u.id)?" baseline":""}" data-inspect="${h(u.id)}" title="${h(this._tooltip(u))}" aria-description="${h(this._tooltip(u))}" aria-pressed="${r.inspect===u.id}"><i aria-hidden="true"></i>${h(this._name(u))}${Y(u)}</button>`).join("")}</div>`:""}<div class="bottom"><details class="data"${r.cohort.length?"":" hidden"}${r.cohort.length<=6?" open":""}><summary>Models and scores \xB7 ${r.cohort.length}</summary><input class="search" type="search" placeholder="Find a model" aria-label="Find a model in this comparison"><div class="table-wrap" tabindex="0" aria-label="Model scores"><table><thead><tr><th scope="col">Model</th>${d.map(u=>{let _=this._doc.metrics.find(q=>q.id===u);return`<th scope="col"><span class="th-full">${h(_.name)}</span><span class="th-short">${h(he[u]??_.shortName??_.name)}</span></th>`}).join("")}</tr></thead><tbody></tbody></table></div></details><div class="legend"${r.plotted.length?"":" hidden"}>${r.anchors.length?`<span><i class="dot ${r.anchors.some(u=>u.projected)?"forecast":"target"}"></i>${r.family&&r.anchors.some(u=>u.projected)?h(r.family.name)+" estimates":"In focus"}</span>`:""}${r.baselines.length?`<span><i class="dot baseline"></i>${c?h(c.name)+" measurements":"Measured baselines"}</span>`:""}<span><i class="dot"></i>Comparison models</span>${n.projections.some(u=>Object.values(n.axes).some(_=>u.metrics[_]?.central))?'<span><i class="bounds-key"></i>Central</span><span><i class="bounds-key wide"></i>Wider</span>':""}${r.plotted.some(u=>u.partial?.[n.axes.x]||u.partial?.[n.axes.y])?'<span><i class="dot hollow"></i>Partial coverage</span>':""}</div><div class="range-controls"${r.plotted.length?"":" hidden"}><div class="segmented range-toggle" role="group" aria-label="Axis range">${[["detail","Detail view"],["full","Full scale"]].map(([u,_])=>`<button type="button" data-range="${u}" aria-pressed="${r.range===u}">${_}</button>`).join("")}</div>${r.range==="custom"||r.outsideCount?`<span>${[r.range==="custom"?"Custom range":"",r.outsideCount?r.outsideCount+" outside view":""].filter(Boolean).join(" \xB7 ")}</span>`:""}</div><details class="settings"><summary>Configure</summary><div class="settings-panel"><div class="settings-grid"><label class="wide">Compare a model or family<select data-setting="anchor">${b}</select></label><label>Horizontal axis<select data-setting="x">${v(n.axes.x)}</select></label><label>Vertical axis<select data-setting="y">${v(n.axes.y)}</select></label><label>Comparison models per focus<input data-setting="competitors" type="number" min="1" max="20" value="${n.competitors}"></label><label>Appearance<select data-setting="theme"><option value="light"${n.theme==="light"?" selected":""}>Light</option><option value="dark"${n.theme==="dark"?" selected":""}>Dark</option></select></label></div><button class="projection-action" type="button" data-action="projection">Add a projected model +</button></div></details></div><p class="status" role="status" aria-live="polite"></p><div class="overlay" hidden></div><div class="metric-tooltip" id="metric-tooltip" role="tooltip" hidden></div></section>`,this._width=this.shadowRoot.querySelector(".plot").clientWidth||this._width,this._renderPlot(),this._renderInspector(),this._renderTable(),this.hasAttribute("data-feed")&&this.shadowRoot.querySelector(".share-trigger")?.setAttribute("hidden","");let k=e&&this.shadowRoot.querySelector(".quicksearch-input");if(k){k.focus({preventScroll:!0});try{k.setSelectionRange(...t)}catch{}}}_reflectType(e){this._config===null&&(e==="all"?this.removeAttribute("type"):this.setAttribute("type",e))}_sameConfig(e){let t=({inspect:o,labelSearch:s,...a})=>JSON.stringify(a);return t(pe(this._doc,e).config)===t(this._view.config)}_renderPlot(){if(!this._view)return;let e=this.shadowRoot.querySelector(".plot");if(!e)return;this._closeChooser(),this._clearHover(),this._metricHelp?.hide(),e.querySelectorAll(".plot-axis-label").forEach(a=>a.remove());let t=Math.min(this._width<420?335:420,matchMedia(it).matches?Math.max(280,window.innerHeight-56):1/0);this._scene=je(this._view,{width:Math.max(200,this._width),height:t,textMetrics:this._doc.textMetrics});let o=e.querySelector(".sr-only"),s=this._view.cohort.find(a=>a.id===this._view.inspect);if(o&&(o.textContent=`${this._view.plotted.length} ${this._view.plotted.length===1?"model":"models"} plotted. Horizontal axis: ${this._view.metricX.name}. Vertical axis: ${this._view.metricY.name}.${s?" "+ze(s,this._view):""} Every score is listed under Models and scores.`),e.querySelector(".no-points")?.remove(),!this._view.plotted.length){e.querySelector("svg")?.remove(),e.insertAdjacentHTML("beforeend",`<div class="no-points"><p class="kicker">${this._view.family?"Family benchmark results":"This comparison"}</p><h3>${this._view.cohort.length?"No values for this axis pair yet.":this._view.config.routers==="hide"?"No models match this view.":"No measured scores yet."}</h3>${this._view.family?`<p class="unscored-members">${this._view.family.members.filter(a=>!a.benchmarkModelId).map(a=>h(this._name(a))).join(" \xB7 ")}</p>`:""}<div>${this._view.config.routers==="hide"?'<button type="button" data-action="show-routers">Show confirmed routers</button>':""}<button type="button" class="primary" data-action="projection">Add an estimate</button><a href="${h(F()+"/benchmarks/map/")}">View all models \u2192</a></div></div>`);return}e.querySelector("svg")?.remove(),e.insertAdjacentHTML("afterbegin",Qe(this._view,this._scene,{id:this._id,axisLabels:!1})),e.tabIndex=-1,e.setAttribute("role","group"),e.querySelectorAll("[data-map-point]>title,[data-map-label]>title").forEach(a=>a.remove());for(let[a,r]of[["x",this._view.metricX],["y",this._view.metricY]]){let n=Q[r.id];e.insertAdjacentHTML("beforeend",`<span class="plot-axis-label metric-caption axis-${a}" data-emphasized="${ce(this._view,a)}" ${n?`tabindex="0" data-metric-help="${r.id}" aria-label="${h(ae[r.id]??r.name)}, ${a==="x"?"horizontal":"vertical"} axis"`:""}>${ue(r.id)}<span>${h(r.name)}</span></span>`)}if(this.getAttribute("label-links")==="gallery")for(let a of e.querySelectorAll("[data-map-label]")){let r=this._view.cohort.find(n=>n.id===a.dataset.mapLabel);if(r?.galleryHref){let n=document.createElementNS("http://www.w3.org/2000/svg","a");n.setAttribute("href",F()+r.galleryHref),a.replaceWith(n),n.append(a)}}this._externalHighlight&&this._showModelHover()}_renderInspector(){let e=this._view,t=e.config,o=e.cohort.find(S=>S.id===t.focus),s=e.cohort.find(S=>S.id===e.inspect),{primary:a,reference:r}=xe(e),n=this.shadowRoot.querySelector(".inspector"),c=e.cohort.filter(S=>!S.projected),d=e.anchors.filter(S=>!S.projected),l=e.family&&!d.length,v=Ye(this._doc,e),b=e.family&&!l?`<div class="family-summary"><p class="kicker">${l?"Next-generation scenarios":"Model family"}</p><strong>${h(e.family.name)}</strong><p>${l?(e.baselines.length||c.length)+" measured baselines":d.length+" measured members"} \xB7 ${t.projections.length} ${t.projections.length===1?"estimate":"estimates"}</p></div>`:"";if(a){let S=e.comparisonMetric,A=a.metrics[t.metric],T=a.ranges?.[t.metric],g=We(this._doc,a,t.metric);if(b+=`<div class="score-summary${Number.isFinite(A)?"":" without-total"}"><p class="kicker">${a.projected?be(a)?"Editorial outlook":"Your scenario":l?e.baselines.length&&!e.baselines.some(y=>y.id===a.id)?"Measured reference":"Measured baseline":e.family?e.anchorIds.includes(a.id)?"Measured member":"Measured comparison":o?.id===a.id?"Model in focus":s?"Inspecting":"Field leader"}</p><div class="anchor-name">${this._modelLabel(a)}</div>${a.projected?`<span class="projected-badge">\u25C7 ${be(a)?"Editorial estimate":"Projected estimate"}</span>`:""}<div class="overall">${Number.isFinite(A)?`${E(A)}<small>/100</small>`:'<span class="missing-score">Not supplied</span>'}</div><p class="rank">${h(S.name)}${a.projected?" \xB7 Projected":a.estimated?" \xB7 Estimated":""}${g?` \xB7 ${t.routers==="hide"?"global rank":"rank"} ${g.position} of ${g.total}`:""}</p>${T?.lower!==void 0?`<p class="overall-range">${at(T)}</p>`:""}</div><div class="metrics${Number.isFinite(A)?"":" primary-metrics"}">${v.map(y=>`<div class="metric"><div class="metric-label">${Q[y.id]?`<span class="metric-caption" tabindex="0" data-metric-help="${y.id}" aria-label="${h(ae[y.id]??y.name)}">${ue(y.id)}<span>${h(he[y.id]??y.shortName)}</span></span>`:h(y.name)}</div><div class="metric-value">${E(a.metrics[y.id])}</div>${a.ranges?.[y.id]?.lower!==void 0?`<div class="range-note">${at(a.ranges[y.id])}</div>`:""}</div>`).join("")}</div>`,b+='<div class="inspection-detail">',a.projected){let y=[...new Set(["overall",t.axes.x,t.axes.y])].filter(R=>a.ranges?.[R]?.lower!==void 0);y.length&&(b+=`<table class="forecast-ranges" aria-label="Projected plausible ranges"><thead><tr><th scope="col">Score</th><th scope="col">Central</th><th scope="col">Wider</th></tr></thead><tbody>${y.map(R=>{let C=a.ranges[R];return`<tr><th scope="row">${h(this._doc.metrics.find(L=>L.id===R).name)}</th><td>${C.central?`${E(C.central.lower)}\u2013${E(C.central.upper)}`:'<span class="sr-only">Not supplied</span>'}</td><td>${E(C.lower)}\u2013${E(C.upper)}</td></tr>`}).join("")}</tbody></table>`)}Number.isFinite(a.metrics.overall)||(b+='<p class="missing-total-note">StealthMark Score: not supplied</p>'),r&&(b+=`<div class="comparison-story"><p class="kicker">${a.projected?r.projected?"Estimate vs estimate":"Measured comparison":"Compared with"}</p><strong title="${h(this._tooltip(r))}">${h(this._name(r))}${Y(r)}</strong><div class="delta-grid">${(t.metric==="overall"?v:[e.comparisonMetric]).map(y=>{let R=a.metrics[y.id]-r.metrics[y.id],C=Number.isFinite(a.metrics[y.id])&&Number.isFinite(r.metrics[y.id]);return`<div><span>${h(y.name)}</span><b>${C?Mt(R)+" pts":"\u2014"}</b></div>`}).join("")}</div></div>`),a.projected?b+=`${a.note?`<p class="coverage">${h(a.note)}</p>`:""}<button class="evidence-link" type="button" data-edit-projection="${h(a.id)}">Edit this estimate \u2192</button>`:(a.partial?.[t.axes.x]||a.partial?.[t.axes.y])&&(b+=`<p class="coverage">${h([...new Set([...a.missing?.[t.axes.x]??[],...a.missing?.[t.axes.y]??[]])].map(y=>this._doc.metrics.find(R=>R.id==="benchmark:"+y)?.shortName||y).join(", "))} not yet scored</p>`)}else e.family||(b+='<p class="empty-note">Hover over a model to see its scores. Select it to compare.</p>');l&&!e.plotted.length&&!t.projections.length&&(b+='<p class="coverage">No measured '+h(e.family.name)+" scores yet. Add an estimate to explore the next generation.</p>"),a?.projected&&t.compare==="competitive"&&!Number.isFinite(a.metrics[t.metric])&&!e.baselines.length&&(b+='<p class="coverage">Add a '+h(e.comparisonMetric.name)+" to find similar models, or choose Selected.</p>");let w=a?.href||o?.href||e.family?.href;w&&(b+=`<a class="evidence-link" href="${h(w.startsWith("/")?F()+w:w)}">${a?.href?"View benchmark results":"Explore the family guide"} \u2197</a>`),s&&!o&&t.presentation==="explorer"&&(b+=` <button class="evidence-link" type="button" data-anchor="${h(s.id)}">Compare this model \u2192</button>`),a&&(b+="</div>"),n.innerHTML=b}_name(e,t){return de(e,t||this._view?.config.search||this.getAttribute("label-search")||"")}_tooltip(e,t){return oe(e,t||this._view?.config.search||this.getAttribute("label-search")||"")}_modelLabel(e){let t=e.href&&(e.href.startsWith("/")?F()+e.href:e.href);return(t?`<a href="${h(t)}" title="${h(this._tooltip(e))}" aria-description="${h(this._tooltip(e))}">${h(this._name(e))}</a>`:`<span title="${h(this._tooltip(e))}" aria-description="${h(this._tooltip(e))}">${h(this._name(e))}</span>`)+Y(e)}_renderTable(e=""){let t=this._view,o=this.shadowRoot.querySelector(".data tbody");if(!o)return;let s=this.shadowRoot.activeElement,a=s?.closest(".data tbody")?s.dataset.inspect:null,r=e.toLocaleLowerCase(),n=new Set(t.anchorIds),c=new Set(t.baselines.map(l=>l.id)),d=[...t.cohort].sort((l,v)=>Number(n.has(v.id))-Number(n.has(l.id))||Number(c.has(v.id))-Number(c.has(l.id)));o.innerHTML=d.filter(l=>[l.name,l.stealthName,l.revealedName,l.id].some(v=>v?.toLocaleLowerCase().includes(r))).map(l=>`<tr data-map-role="${t.anchorIds.includes(l.id)?"target":t.baselines.some(v=>v.id===l.id)?"baseline":"comparison"}"${l.id===t.inspect?' aria-current="true"':""}><td>${this.getAttribute("label-links")==="gallery"&&l.galleryHref?`<a href="${h(F()+l.galleryHref)}" title="${h(this._tooltip(l,e))}" aria-description="${h(this._tooltip(l,e))}">${h(this._name(l,e))}</a><button type="button" data-inspect="${h(l.id)}" aria-label="Inspect ${h(this._name(l,e))}">Inspect`:`<button type="button" data-inspect="${h(l.id)}" title="${h(this._tooltip(l,e))}" aria-description="${h(this._tooltip(l,e))}">${h(this._name(l,e))}`}${Y(l)}${l.projected?`<span class="table-projected">${be(l)?"Editorial estimate":"Projected"}</span>`:""}</button></td>${[...new Set([t.config.metric,"overall",t.config.axes.x,t.config.axes.y])].map(v=>`<td>${st(l,v)}</td>`).join("")}</tr>`).join(""),a&&[...o.querySelectorAll("button")].find(l=>l.dataset.inspect===a)?.focus({preventScroll:!0})}_pin(e){this._view=pe(this._doc,{...this._view.config,...this._view.config.compare!=="selected"?{models:void 0}:{},inspect:e}),this._renderPlot(),this._renderInspector(),this._renderTable(this.shadowRoot.querySelector(".search")?.value||""),this.shadowRoot.querySelectorAll(".target-chip,.comparison-chip").forEach(t=>t.setAttribute("aria-pressed",String(t.dataset.inspect===e))),this._closeTransient(),this._status(ze(this._view.cohort.find(t=>t.id===e),this._view)),this.dispatchEvent(new CustomEvent("stealthmark-map:change",{bubbles:!0,composed:!0,detail:{...this.state,reason:"inspection"}})),this.shadowRoot.querySelector(".direct-share").href=te(this._view,F()).href}_status(e){let t=this.shadowRoot.querySelector(".status");t&&(t.textContent=e)}_closeChooser(e=!1){let t=this.shadowRoot.querySelector(".chooser");t&&(t.hidden=!0,delete t.dataset.docked,delete t.dataset.sheet),this.shadowRoot.querySelector(".plot")?.style.removeProperty("--popover-space"),e&&this.shadowRoot.querySelector(".plot")?.focus({preventScroll:!0})}_closeTransient(){this._closeChooser();for(let e of[".share-menu",".overlay"]){let t=this.shadowRoot.querySelector(e);t&&(t.hidden=!0)}this.shadowRoot.querySelector(".share-trigger")?.setAttribute("aria-expanded","false")}_highlightRange(e){this.shadowRoot.querySelectorAll("[data-map-range]").forEach(t=>t.style.display=t.dataset.mapRange===e?"":"none")}_clearHover(){this._hoverKey=null,this._highlightRange(this._view?.inspect);let e=this.shadowRoot.querySelector(".tooltip");e&&(e.hidden=!0,e.dataset.docked&&(delete e.dataset.docked,this.shadowRoot.querySelector(".plot")?.style.removeProperty("--popover-space"))),this.shadowRoot.querySelectorAll("[data-map-point].hovered,[data-map-label].hovered,[data-map-connector].hovered").forEach(t=>t.classList.remove("hovered"))}_placePopover(e,t,o){let s=this.shadowRoot.querySelector(".plot"),a=s.querySelector("svg"),r=a.getBoundingClientRect(),n=r.width/this._scene.width,c=r.height/this._scene.height,d=o??{x:t[0].x*n,y:t[0].y*c},l=new Set(t.map(m=>m.model.id)),v=[{x:d.x-16,y:d.y-16,w:32,h:32}],b=[],w=this._coverPlacement,S=w?[]:b;for(let m of this._scene.points)(l.has(m.model.id)?v:S).push({x:m.x*n-12,y:m.y*c-12,w:24,h:24});for(let m of this._scene.labels)(l.has(m.id)?v:S).push({x:m.x*n-5,y:m.y*c-5,w:m.w*n+10,h:m.h*c+10});let A=this._scene.plot,T=Math.max((A.y+4)*c,8-r.top),g=Math.min((A.y+A.h-4)*c,window.innerHeight-r.top-8);if(e.hidden=!1,delete e.dataset.docked,delete e.dataset.sheet,e.classList.contains("chooser")&&nt()){e.dataset.sheet="true",e.style.left=e.style.top="";return}let y=e.offsetWidth,R=e.offsetHeight,C=w?{x:4,y:Math.max(4,8-r.top),w:r.width-8,h:Math.max(0,Math.min(r.height-4,window.innerHeight-r.top-8)-Math.max(4,8-r.top))}:{x:A.x*n+4,y:T,w:A.w*n-8,h:Math.max(0,g-T)},L=et({bounds:C,width:y,height:R,anchor:d,protectedRects:v,obstacles:b});if(e.style.left=(L?.x??Math.max(0,(r.width-y)/2))+"px",e.style.top=(L?.y??r.height+8)+"px",!L&&e.classList.contains("chooser")&&rt()){e.dataset.sheet="true",e.style.left=e.style.top="";return}L||(e.dataset.docked="true",s.style.setProperty("--popover-space",R+16+"px"))}_showModelHover(e=this._scene?.points.filter(o=>o.model.id===this._externalHighlight)||[],t){let o=e.map(l=>l.model.id).join("|");if(o&&o===this._hoverKey)return!0;this._clearHover();let s=this.shadowRoot.querySelector(".plot"),a=s?.querySelector("svg");if(!a||!e.length||!s.querySelector(".chooser")?.hidden)return!1;let r=a.getBoundingClientRect();if(!r.width||!r.height)return!1;let n=e[0],c=n.model;this._highlightRange(c.projected?c.id:this._view.inspect);for(let l of s.querySelectorAll("[data-map-point],[data-map-label],[data-map-connector]"))(l.dataset.mapPoint??l.dataset.mapLabel??l.dataset.mapConnector)===c.id&&l.classList.add("hovered");let d=s.querySelector(".tooltip");return d.innerHTML=`<strong>${h(this._name(c))}${c.projected?be(c)?" \xB7 Editorial estimate":" \xB7 Projected":""}</strong>${Y(c)}${ne(c)?`<p>${h(this._tooltip(c)).replaceAll(` | |
| `,"<br>")}</p>`:""}<div class="tip-values">${[...new Set(["overall",this._view.config.axes.x,this._view.config.axes.y])].map(l=>`<div><span>${h(this._doc.metrics.find(v=>v.id===l).name)}</span><b>${st(c,l)}</b></div>`).join("")}</div>${e.length>1?`<small>${e.length} nearby models \xB7 click to choose</small>`:""}`,this._placePopover(d,e,t),this._hoverKey=o,!0}_tapCard(e){if(!(this._pointerType!=="touch"&&this._pointerType!=="pen")){this._coverPlacement=!0;try{this._touchCard=this._showModelHover(this._scene?.points.filter(t=>t.model.id===e)||[])}finally{this._coverPlacement=!1}}}_hover(e){if(e.pointerType==="touch"||!this._scene||!this.shadowRoot.querySelector(".chooser")?.hidden)return;let t=e.target.closest?.(".plot");if(!t){this._showModelHover();return}let o=t.querySelector("svg");if(!o)return;let s=o.getBoundingClientRect(),a=(e.clientX-s.left)*this._scene.width/s.width,r=(e.clientY-s.top)*this._scene.height/s.height,n=e.target.closest?.("[data-map-label]")??e.target.closest?.("[data-map-point]"),c=n?this._scene.points.filter(d=>d.model.id===(n.dataset.mapLabel??n.dataset.mapPoint)):Me(this._scene,a,r,14);this._showModelHover(c,{x:e.clientX-s.left,y:e.clientY-s.top})}async _click(e){let t=e.target.closest?.("button"),o=t?.dataset.action;if(o==="retry"){ie.delete(this._feedUrl()),this._start();return}if(!this._view||this._dismissedChooserPointer!==null&&this._dismissedChooserPointer===e.pointerId&&(this._dismissedChooserPointer=null,e.target.closest?.(".plot")))return;if(o==="close-chooser"){this._closeChooser(!0),this._clearHover();return}let s=e.target.closest?.("[data-map-label]");if(s){if(s.closest("a[href]"))return;this._pin(s.dataset.mapLabel),this._tapCard(s.dataset.mapLabel);return}if(t?.dataset.inspect){let a=!!t.closest(".chooser");this._pin(t.dataset.inspect),a&&(this.shadowRoot.querySelector(".plot")?.focus({preventScroll:!0}),this._tapCard(t.dataset.inspect));return}if(t?.dataset.anchor){this._commit({focus:t.dataset.anchor,family:null,compare:"competitive",inspect:t.dataset.anchor},"anchor");return}if(t?.dataset.compare){t.dataset.compare==="selected"?this._picker():this._commit({compare:t.dataset.compare,inspect:this._view.config.focus},"comparison");return}if(t?.dataset.metric){let a=t.dataset.metric;this._commit({metric:a},"metric"),this.shadowRoot.querySelector(`[data-metric="${a}"]`)?.focus({preventScroll:!0});return}if(!e.target.closest?.("[data-metric-help]")){if(t?.dataset.range){this._commit({range:t.dataset.range,domains:null},"range");return}if(o==="close"){this._closeTransient(),(this._editorTrigger?.isConnected?this._editorTrigger:this.shadowRoot.querySelector(".estimate-cta"))?.focus({preventScroll:!0});return}if(o==="share"){let a=this.shadowRoot.querySelector(".share-menu");a.hidden=!a.hidden,t.setAttribute("aria-expanded",String(!a.hidden));return}if(o==="copy-link"||o==="copy-embed"){await this._copy(o==="copy-link"?this.getShareUrl():Ze(this._view),o==="copy-link"?"Social link copied.":"Embed code copied.",t);return}if(o==="download"){await this._download();return}if(o==="refresh"){try{ie.delete(this._feedUrl()),this._doc=await tt(this._feedUrl()),this._commit({},"refresh"),this._status("Results refreshed.")}catch(a){this._error(a)}return}if(o==="projection"){this._projection();return}if(t?.dataset.editProjection){this._projection(t.dataset.editProjection);return}if(o==="use-baseline"){this._useBaseline();return}if(o==="apply-selection"){let a=[...this._view.config.models.filter(r=>!Z(this._doc.models.find(n=>n.id===r)??{},this._view.config.routers)),...this.shadowRoot.querySelectorAll(".picker-row input:checked")].map(r=>typeof r=="string"?r:r.value);this._commit({compare:"selected",models:a,inspect:null},"comparison");return}if(o==="reset-router-filter"){this._reflectType("all"),this._commit({...this.hasAttribute("external-router-filter")?{}:{routers:"hide"},type:"all"},"router-filter");return}if(o==="show-routers"){this._commit({routers:"all"},"router-filter");return}if(o==="apply-projection"){this._saveProjection();return}if(t?.dataset.removeProjection){this._commit({projections:this._view.config.projections.filter(a=>a.id!==t.dataset.removeProjection),models:this._view.config.models.filter(a=>a!==t.dataset.removeProjection),exclude:this._view.config.exclude.filter(a=>a!==t.dataset.removeProjection),inspect:this._view.inspect===t.dataset.removeProjection?null:this._view.inspect,...this._view.config.focus===t.dataset.removeProjection?{focus:null,compare:"all",inspect:null}:{}},"projection");return}if(e.target.closest?.(".plot")&&!e.target.closest?.(".chooser,.tooltip")){let a=this.shadowRoot.querySelector(".plot>svg");if(!a)return;let r=a.getBoundingClientRect(),n={x:e.clientX-r.left,y:e.clientY-r.top},c=Me(this._scene,n.x*this._scene.width/r.width,n.y*this._scene.height/r.height,22);if(c.length===1)this._pin(c[0].model.id),this._tapCard(c[0].model.id);else if(c.length){this._clearHover();let d=this.shadowRoot.querySelector(".chooser");d.setAttribute("role","dialog"),d.setAttribute("aria-label","Choose a nearby model"),d.innerHTML=`<div class="chooser-head"><strong>${c.length} nearby models</strong><button type="button" data-action="close-chooser" aria-label="Close nearby models">\xD7</button></div><div class="chooser-columns"><span>Model</span><span>StealthMark</span></div><div class="chooser-list">${c.map(({model:l})=>`<button type="button" data-inspect="${h(l.id)}" aria-description="${h(this._tooltip(l))}"><span data-picker-name>${h(this._name(l))}${Y(l)}</span><b>${E(l.metrics.overall)}</b></button>`).join("")}</div>`,this._placePopover(d,c,n),d.querySelector("[data-inspect]").focus({preventScroll:!0})}}}}_change(e){if(e.target.dataset.projectionMember!==void 0){let s=this._view.config.projections.find(a=>a.name===e.target.value&&a.family===this._view.config.family);s?this._projection(s.id):this.shadowRoot.querySelector('[name="name"]').value=e.target.value;return}let t=e.target.dataset.setting;if(!t)return;let o=this._view.config;if(t==="routers")this._commit({routers:e.target.checked?"all":"hide"},"router-filter");else if(t==="type")this._reflectType(e.target.value),this._commit({type:e.target.value},"type-filter");else if(t==="anchor"){let s=e.target.value;this._commit({focus:s.startsWith("model:")?s.slice(6):null,family:s.startsWith("family:")?s.slice(7):null,compare:s?"competitive":"all",inspect:null},"anchor")}else if(t==="x"||t==="y"){let s=t==="x"?"y":"x",a={...o.axes,[t]:e.target.value};a[t]===a[s]&&(a[s]=o.axes[t]),this._commit({axes:a},"axes")}else this._commit({[t]:t==="competitors"?Number(e.target.value):e.target.value},"configuration")}_input(e){if(e.target.matches(".quicksearch-input")){let t=e.target,o=t.value;this._commit({search:o,compare:"all",focus:null,family:null,inspect:null},"search"),this.shadowRoot.querySelector(".quicksearch-input")?.replaceWith(t),t.focus({preventScroll:!0});return}if(e.target.matches(".search")&&this._renderTable(e.target.value),e.target.matches(".picker-search")){let t=e.target.value.toLowerCase();for(let o of this.shadowRoot.querySelectorAll(".picker-row")){let s=this._doc.models.find(a=>a.id===o.dataset.pickerModel)||this._view.config.projections.find(a=>a.id===o.dataset.pickerModel);o.hidden=![s.name,s.stealthName,s.revealedName,s.id,...s.aliases||[]].some(a=>a?.toLowerCase().includes(t)),o.querySelector("[data-picker-name]").innerHTML=h(this._name(s,t))+Y(s),o.title=this._tooltip(s,t)}}}_picker(){this._editorTrigger=this.shadowRoot.activeElement;let e=this.shadowRoot.querySelector(".overlay");e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label","Choose the comparison"),this.shadowRoot.querySelector(".settings")?.removeAttribute("open"),e.innerHTML=`<div class="overlay-head"><h3>Choose the comparison</h3><button type="button" class="close" data-action="close" aria-label="Close model selection">\xD7</button></div><input class="search picker-search" type="search" placeholder="Find a model" aria-label="Search available models"><div class="picker-list">${[...this._doc.models,...this._view.config.projections.map(t=>({...t,metrics:Object.fromEntries(Object.entries(t.metrics).map(([o,s])=>[o,s.value]))}))].filter(t=>Z(t,this._view.config.routers)).map(t=>`<label class="picker-row" data-picker-model="${h(t.id)}" title="${h(this._tooltip(t))}"><input type="checkbox" value="${h(t.id)}"${this._view.cohort.some(o=>o.id===t.id)?" checked":""}${this._view.anchorIds.includes(t.id)||this._view.config.projections.some(o=>o.id===t.id)?" disabled":""}><span data-picker-name>${h(this._name(t))}${Y(t)}</span><small>${E(t.metrics[this._view.config.metric])}</small></label>`).join("")}</div><button type="button" class="primary" data-action="apply-selection">Apply selection</button>`,e.hidden=!1,ot(e,e.querySelector("input"))}_projection(e){let t=this._view,o=t.config.projections.find(d=>d.id===e),s=[...new Set([t.config.axes.x,t.config.axes.y,"overall"])],a=this.shadowRoot.querySelector(".overlay");a.hidden&&(this._editorTrigger=this.shadowRoot.activeElement),a.setAttribute("role","dialog"),a.setAttribute("aria-modal","true"),a.setAttribute("aria-label",o?"Edit estimate":"Add estimate"),this._editingProjection=e??null,this._startingBaselineId=o?.baseline??null,this._projectionKeys=s,this.shadowRoot.querySelector(".settings")?.removeAttribute("open");let r=t.family?.members.filter(d=>!d.benchmarkModelId)??[],n=(t.baselines.length?t.baselines:t.cohort).filter(d=>!d.projected&&s.every(l=>l==="overall"||Number.isFinite(d.metrics[l]))),c=d=>`<div class="row-label">${h(this._doc.metrics.find(l=>l.id===d).name)}${d==="overall"&&!Object.values(t.config.axes).includes(d)?" (optional)":""}</div>${[["value","Score"],["lower",o?.metrics[d]?.central?"Wider lower bound":"Lower bound"],["upper",o?.metrics[d]?.central?"Wider upper bound":"Upper bound"]].map(([l,v])=>`<label>${v}<input name="${h(d)}-${l}" type="number" min="0" max="100" step="0.1" inputmode="decimal" value="${o?.metrics[d]?.[l]??""}"></label>`).join("")}<details class="central-bounds"${o?.metrics[d]?.central?" open":""}><summary>Central plausible range (optional)</summary><div class="bounds-pair">${["lower","upper"].map(l=>`<label>${l==="lower"?"Central lower bound":"Central upper bound"}<input name="${h(d)}-central-${l}" type="number" min="0" max="100" step="0.1" inputmode="decimal" value="${o?.metrics[d]?.central?.[l]??""}"></label>`).join("")}</div><p>Keep the central range inside the wider bounds above.</p></details>`;a.innerHTML=`<div class="overlay-head"><h3>${o?"Edit estimate":t.family?"Estimate "+h(t.family.name):"Add a projected model"}</h3><button type="button" class="close" data-action="close" aria-label="Close projection editor">\xD7</button></div><div class="projection-form"><p class="caption">Your scenario \xB7 enter scores and optional uncertainty ranges.</p>${r.length&&!o?`<label>Model template<select data-projection-member><option value="">Choose a family member</option>${r.map(d=>`<option value="${h(this._name(d))}">${h(this._name(d))}</option>`).join("")}</select></label>`:""}<label>Model name<input name="name" maxlength="80" placeholder="${h(t.family?.name??"Projected model")}" value="${h(o?.name??"")}" required></label>${n.length?`<div class="baseline-start"><label>Start from measured scores<select name="baseline">${n.map(d=>`<option value="${h(d.id)}"${o?.baseline===d.id?" selected":""}>${h(this._name(d))}</option>`).join("")}</select></label><button type="button" data-action="use-baseline">Use starting values \u2192</button><p>Copies measured scores. Adjust them to your scenario.</p></div>`:""}<div class="projection-grid">${s.map(c).join("")}</div><label>Scenario note (optional)<input name="note" maxlength="180" placeholder="What this estimate assumes" value="${h(o?.note??"")}"></label><button class="primary" type="button" data-action="apply-projection">${o?"Save estimate":"Add estimate"}</button>${t.config.projections.map(d=>`<div class="estimate-list"><span>${h(this._name(d))}</span><button type="button" data-edit-projection="${h(d.id)}">Edit</button><button type="button" class="remove-projection" data-remove-projection="${h(d.id)}">Remove</button></div>`).join("")}<p class="projection-error status" role="alert"></p></div>`,a.hidden=!1,ot(a,a.querySelector("select,input"))}_useBaseline(){let e=this.shadowRoot.querySelector(".projection-form"),t=this._doc.models.find(o=>o.id===e.querySelector('[name="baseline"]').value);this._startingBaselineId=t.id;for(let o of this._projectionKeys)for(let s of["value","lower","upper","central-lower","central-upper"])e.querySelector(`[name="${o}-${s}"]`).value=s==="value"&&Number.isFinite(t.metrics[o])?String(t.metrics[o]):"";e.querySelector('[name="note"]').value="Your scenario, starting from measured "+this._name(t)+" scores."}_saveProjection(){try{let e=this.shadowRoot.querySelector(".projection-form"),t=c=>e.querySelector(`[name="${c}"]`).value,o=this._view.config.projections.find(c=>c.id===this._editingProjection),s={...o?.metrics};for(let c of this._projectionKeys){let d=t(c+"-value"),l=t(c+"-lower"),v=t(c+"-upper"),b=t(c+"-central-lower"),w=t(c+"-central-upper");if(d===""){if(Object.values(this._view.config.axes).includes(c))throw Error("Supply scores for both selected axes.");if(l!==""||v!==""||b!==""||w!=="")throw Error("A range needs a score.");delete s[c];continue}s[c]={value:Number(d),...l!==""?{lower:Number(l)}:{},...v!==""?{upper:Number(v)}:{},...b!==""||w!==""?{central:{lower:b===""?null:Number(b),upper:w===""?null:Number(w)}}:{}}}let a=1;for(;this._view.config.projections.some(c=>c.id==="projection:model-"+a);)a++;let r={id:o?.id??"projection:model-"+a,name:t("name"),metrics:s,kind:"supplied",...this._startingBaselineId?{baseline:this._startingBaselineId}:{},...o?.family||this._view.config.family?{family:o?.family??this._view.config.family}:{},...t("note")?{note:t("note")}:{}},n=[...this._view.config.projections.filter(c=>c.id!==r.id),r];pe(this._doc,{...this._view.config,projections:n,...this._view.config.compare!=="selected"?{models:void 0}:{},inspect:r.id}),this._commit({projections:n,inspect:r.id},"projection")}catch(e){this.shadowRoot.querySelector(".projection-error").textContent=e.message}}async _copy(e,t,o){let s=this.shadowRoot.querySelector(".share-feedback"),a=this.shadowRoot.activeElement??o;s&&(s.textContent=""),o&&(o.dataset.copyLabel??=o.textContent,clearTimeout(o._copyReset),o.textContent="Copying\u2026",o.disabled=!0);let r=!1,n=!1;try{await navigator.clipboard.writeText(e),r=!0}catch{n=!0;let d=document.createElement("textarea");try{d.value=e,d.style.cssText="position:fixed;left:-10000px",document.body.append(d),d.select(),r=document.execCommand?.("copy")===!0}catch{}finally{d.remove()}}let c=r?t:"Copy unavailable. Open the share page to copy its address.";return s?s.textContent=c:this._status(c),o&&(o.disabled=!1,o.textContent=r?"Copied!":"Copy failed",o._copyReset=setTimeout(()=>{o.isConnected&&(o.textContent=o.dataset.copyLabel)},3e3)),n&&a?.isConnected&&a.focus({preventScroll:!0}),r}async _download(){try{this._status("Preparing image\u2026");let e=te(this._view,F(),{image:!0,expectedDataRevision:this._view.revision}),t=await fetch(e);if(t.status===409){ie.delete(this._feedUrl()),this.shadowRoot.querySelector('[data-action="refresh"]').hidden=!1,this._status("Results changed. Refresh results before exporting.");return}if(!t.ok)throw Error("Image export is unavailable.");let o=await t.blob(),s=URL.createObjectURL(o),a=document.createElement("a");a.href=s,a.download="stealthmark-map.png",a.click(),setTimeout(()=>URL.revokeObjectURL(s),1e4),this._status("Image downloaded.")}catch(e){this._status(e.message)}}};customElements.get("stealthmark-map")||customElements.define("stealthmark-map",Re);var re=document.querySelector("stealthmark-map[data-map-page]");if(re){let i=()=>{let o=document.querySelector("[data-map-model-action]");if(!o)return;let s=re.getModelDetailLink();o.hidden=!s,s&&(o.querySelector("a").href=new URL(s.href,F()).href,o.querySelector("[data-map-model-label]").textContent=s.label)};re.addEventListener("stealthmark-map:ready",i);let e=!1,t=()=>{e=!0,re.config={...Ve(location.href),presentation:"explorer"},e=!1};t(),re.addEventListener("stealthmark-map:change",o=>{if(i(),e||o.detail.reason==="configuration")return;let s=re.getShareUrl();if(s){let a=new URL(s);history.pushState(null,"",a.pathname+a.search)}}),window.addEventListener("popstate",t)}export{Re as StealthmarkMap}; | |