From 180fd713ae2f1164b201521ebe0fa6a95d3e08f5 Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Sat, 24 Oct 2026 12:51:39 +0800 Subject: [PATCH 1/2] Run CI on Bun 1.4.4 Co-Authored-By: Claude Opus 5.5 --- .bun-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bun-version b/.bun-version index 7962dcfdb6..1c99cf0e80 100644 --- a/.bun-version +++ b/.bun-version @@ -1 +1 @@ -1.3.13 +1.4.4 From 607cec888bc7619f5352840255a96dfe535da94a Mon Sep 17 00:00:00 2001 From: Abdul Wahab Date: Sat, 24 Oct 2026 12:57:17 +0800 Subject: [PATCH 2/2] Rebuild the component review bundle with Bun 1.4.4 Bun 1.4 minifies with different identifier names, so the committed bundle no longer matched Bun.build output. Regenerated with scripts/build-component-review.mjs; no source change. Co-Authored-By: Claude Opus 5.5 --- crates/context/assets/component-review.js | 188 +++++++++++----------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/crates/context/assets/component-review.js b/crates/context/assets/component-review.js index 6de4aa60da..29a5ab47d6 100644 --- a/crates/context/assets/component-review.js +++ b/crates/context/assets/component-review.js @@ -1,4 +1,4 @@ -(()=>{function we(i,n){let o=n?.changes[i],a=n?.feedback?.[i],t=a?.decision??(n?.submitted?n.draft.decisions[i]:void 0),p=o?.kind==="unchanged"&&(o.carried??(n?.submitted&&t?.action==="approve"))===!0;return{change:o,prior:t,feedbackRound:a?.round??n?.packet.round,carried:p,label:o?.kind==="added"?"New component":o?.kind==="changed"?"Review again":p?"Approval kept":t?.action==="revise"?"Changes still requested":"Awaiting review"}}function bn(i,n,o){let a=n.decisions[i.id],t=a?.revision===i.revision?a:void 0,p=we(i.id,o);if(t?.action==="approve")return{kind:"approved",label:p.carried?"Approval kept":"Approved",priority:3};if(t?.action==="revise")return{kind:"feedback",label:"Feedback ready",priority:2};return{kind:"pending",label:p.change?.kind==="changed"?"Review again":p.change?.kind==="added"?"New · review needed":"Not reviewed",priority:p.change?.kind==="changed"||p.change?.kind==="added"?0:1}}function mi(i){return{packetRevision:i.revision,decisions:{},missing:[],inventoryConfirmed:!1}}function We(i){return Object.values(i).every(Number.isFinite)&&i.x>=0&&i.y>=0&&i.w>0&&i.h>0&&i.x+i.w<=1.00001&&i.y+i.h<=1.00001}function Cn(i,n){let o=i.components.map((g)=>n.decisions[g.id]?.revision===g.revision?n.decisions[g.id]:void 0),a=o.filter((g)=>g?.action==="approve").length,t=o.filter((g)=>g?.action==="revise").length,p=o.length-a-t,y=t>0||n.missing.length>0;return{approved:a,revisions:t,pending:p,hasFeedback:y,canSubmit:n.packetRevision===i.revision&&n.missing.every((g)=>g.name.trim()&&We(g.box))&&(y||!p&&n.inventoryConfirmed)}}function wi(i,n){let o={...n.decisions};for(let a of i.components)if(!o[a.id]||o[a.id].revision!==a.revision)o[a.id]={revision:a.revision,action:"approve",feedback:"",split:!1};return{...n,decisions:o}}function fi(i,n){if(!Cn(i,n).canSubmit)throw Error("Review is incomplete or stale");return{schemaVersion:1,requestId:i.id,...structuredClone(n)}}function Fn(i){let n=i.preview.kind==="page"||i.preview.sourceKind==="page",o=i.preview.sourceKind==="page";return{code:n,captured:o,label:n?i.medium.match(/html|css|svg/i)?i.medium:"HTML / CSS / SVG":"Raster",caption:n?o?i.preview.isolation?"Component only":"Region capture":"Live component":"Produced asset",fileLabel:o?"Open captured preview":"Open source image"}}function yi(i,n,o){let a=i.components.findIndex((t)=>t.id===o);for(let t=1;t<=i.components.length;t++){let p=i.components[(a+t)%i.components.length];if(bn(p,n).kind==="pending")return p.id}}function fe(i,n){if(!n.reviewGroup||!Fn(n).code)return[n];return i.components.filter((o)=>o.reviewGroup===n.reviewGroup&&Fn(o).code)}function pe(i,n,o,a,t=[]){let p=a?fe(i,o):[o];if(p.length===1)return[o];return p.filter((y)=>bn(y,n).kind==="pending"&&(y.id===o.id||!t.includes(y.id)))}function zi(i,n,o){let a=new Set;return i.components.flatMap((t)=>{if(a.has(t.id))return[];let p=fe(i,t);p.forEach((v)=>a.add(v.id));let y=p.filter((v)=>bn(v,n,o).kind==="pending"),g=p.filter((v)=>bn(v,n,o).kind==="feedback"),b=y[0]??g[0]??t,z=y.length?"pending":g.length?"feedback":"approved";return[{id:t.id,members:p,representative:b,pending:y.length,kind:z,label:p.length>1?t.reviewGroup.replace(/[-_]+/g," ").replace(/^./,(v)=>v.toUpperCase()):t.name,box:{x:Math.min(...p.map((v)=>v.box.x)),y:Math.min(...p.map((v)=>v.box.y)),w:Math.max(...p.map((v)=>v.box.x+v.box.w))-Math.min(...p.map((v)=>v.box.x)),h:Math.max(...p.map((v)=>v.box.y+v.box.h))-Math.min(...p.map((v)=>v.box.y))},stateLabel:y.length?p.length>1?`${y.length} to review`:bn(b,n,o).label:g.length?p.length>1?`${g.length} ${g.length===1?"needs":"need"} work`:"Feedback ready":"Approved"}]})}function ye(i,n){let o=new Set(n.preview.isolation?.excludedComponents??[]),a=n.box,t=i.components.filter((p)=>{if(p.id===n.id)return!1;if(o.has(p.id))return!0;let y=p.box,g=Math.min(a.x+a.w,y.x+y.w)-Math.max(a.x,y.x),b=Math.min(a.y+a.h,y.y+y.h)-Math.max(a.y,y.y);return y.w*y.h1&&b*i.comp.height>1});return{description:n.note.trim(),related:t,excluded:t.filter((p)=>o.has(p.id))}}function Ie(i,n,o,a,t){let p=t==="fit"?Math.min(1,o/i,a/n):t;return{scale:p,width:i*p,height:n*p}}function Oe(i,n,o,a){if(o<=0||a<=o)return 0;return Math.max(0,Math.min(1,((i-n)/o-0.08)/0.84))*(a-o)}var ji=` +(()=>{function kt(n,e){let r=e?.changes[n],o=e?.feedback?.[n],a=o?.decision??(e?.submitted?e.draft.decisions[n]:void 0),l=r?.kind==="unchanged"&&(r.carried??(e?.submitted&&a?.action==="approve"))===!0;return{change:r,prior:a,feedbackRound:o?.round??e?.packet.round,carried:l,label:r?.kind==="added"?"New component":r?.kind==="changed"?"Review again":l?"Approval kept":a?.action==="revise"?"Changes still requested":"Awaiting review"}}function ve(n,e,r){let o=e.decisions[n.id],a=o?.revision===n.revision?o:void 0,l=kt(n.id,r);if(a?.action==="approve")return{kind:"approved",label:l.carried?"Approval kept":"Approved",priority:3};if(a?.action==="revise")return{kind:"feedback",label:"Feedback ready",priority:2};return{kind:"pending",label:l.change?.kind==="changed"?"Review again":l.change?.kind==="added"?"New · review needed":"Not reviewed",priority:l.change?.kind==="changed"||l.change?.kind==="added"?0:1}}function kn(n){return{packetRevision:n.revision,decisions:{},missing:[],inventoryConfirmed:!1}}function Wt(n){return Object.values(n).every(Number.isFinite)&&n.x>=0&&n.y>=0&&n.w>0&&n.h>0&&n.x+n.w<=1.00001&&n.y+n.h<=1.00001}function Je(n,e){let r=n.components.map((g)=>e.decisions[g.id]?.revision===g.revision?e.decisions[g.id]:void 0),o=r.filter((g)=>g?.action==="approve").length,a=r.filter((g)=>g?.action==="revise").length,l=r.length-o-a,y=a>0||e.missing.length>0;return{approved:o,revisions:a,pending:l,hasFeedback:y,canSubmit:e.packetRevision===n.revision&&e.missing.every((g)=>g.name.trim()&&Wt(g.box))&&(y||!l&&e.inventoryConfirmed)}}function wn(n,e){let r={...e.decisions};for(let o of n.components)if(!r[o.id]||r[o.id].revision!==o.revision)r[o.id]={revision:o.revision,action:"approve",feedback:"",split:!1};return{...e,decisions:r}}function yn(n,e){if(!Je(n,e).canSubmit)throw Error("Review is incomplete or stale");return{schemaVersion:1,requestId:n.id,...structuredClone(e)}}function _e(n){let e=n.preview.kind==="page"||n.preview.sourceKind==="page",r=n.preview.sourceKind==="page";return{code:e,captured:r,label:e?n.medium.match(/html|css|svg/i)?n.medium:"HTML / CSS / SVG":"Raster",caption:e?r?n.preview.isolation?"Component only":"Region capture":"Live component":"Produced asset",fileLabel:r?"Open captured preview":"Open source image"}}function $n(n,e,r){let o=n.components.findIndex((a)=>a.id===r);for(let a=1;a<=n.components.length;a++){let l=n.components[(o+a)%n.components.length];if(ve(l,e).kind==="pending")return l.id}}function wt(n,e){if(!e.reviewGroup||!_e(e).code)return[e];return n.components.filter((r)=>r.reviewGroup===e.reviewGroup&&_e(r).code)}function lt(n,e,r,o,a=[]){let l=o?wt(n,r):[r];if(l.length===1)return[r];return l.filter((y)=>ve(y,e).kind==="pending"&&(y.id===r.id||!a.includes(y.id)))}function Mn(n,e,r){let o=new Set;return n.components.flatMap((a)=>{if(o.has(a.id))return[];let l=wt(n,a);l.forEach((h)=>o.add(h.id));let y=l.filter((h)=>ve(h,e,r).kind==="pending"),g=l.filter((h)=>ve(h,e,r).kind==="feedback"),v=y[0]??g[0]??a,M=y.length?"pending":g.length?"feedback":"approved";return[{id:a.id,members:l,representative:v,pending:y.length,kind:M,label:l.length>1?a.reviewGroup.replace(/[-_]+/g," ").replace(/^./,(h)=>h.toUpperCase()):a.name,box:{x:Math.min(...l.map((h)=>h.box.x)),y:Math.min(...l.map((h)=>h.box.y)),w:Math.max(...l.map((h)=>h.box.x+h.box.w))-Math.min(...l.map((h)=>h.box.x)),h:Math.max(...l.map((h)=>h.box.y+h.box.h))-Math.min(...l.map((h)=>h.box.y))},stateLabel:y.length?l.length>1?`${y.length} to review`:ve(v,e,r).label:g.length?l.length>1?`${g.length} ${g.length===1?"needs":"need"} work`:"Feedback ready":"Approved"}]})}function yt(n,e){let r=new Set(e.preview.isolation?.excludedComponents??[]),o=e.box,a=n.components.filter((l)=>{if(l.id===e.id)return!1;if(r.has(l.id))return!0;let y=l.box,g=Math.min(o.x+o.w,y.x+y.w)-Math.max(o.x,y.x),v=Math.min(o.y+o.h,y.y+y.h)-Math.max(o.y,y.y);return y.w*y.h1&&v*n.comp.height>1});return{description:e.note.trim(),related:a,excluded:a.filter((l)=>r.has(l.id))}}function Vt(n,e,r,o,a){let l=a==="fit"?Math.min(1,r/n,o/e):a;return{scale:l,width:n*l,height:e*l}}function Gt(n,e,r,o){if(r<=0||o<=r)return 0;return Math.max(0,Math.min(1,((n-e)/r-0.08)/0.84))*(o-r)}var En=` :host{height:var(--component-review-height,100dvh);min-height:0;overflow:hidden} .review{height:100%;max-width:none;min-height:0;padding:0;display:flex;flex-direction:column;overflow:hidden;background:var(--color-bg,var(--ks-paper))} .review>header{flex-shrink:0;padding:16px 24px;margin:0;border-bottom:1px solid var(--line);gap:16px}.review>header>div{min-width:0}.review h1{font-size:30px;line-height:1}.review>header p{font-size:12px;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.review .badge{font-size:11px} @@ -47,7 +47,7 @@ .review>.inventory-section{height:160px;padding:6px 14px}.inventory-section>.section-head{flex-direction:row;flex-wrap:nowrap;align-items:center;gap:6px;min-height:34px;margin-bottom:4px}.inventory-section h2{display:none}.tray-actions svg{width:16px;height:16px}.review>.inventory-section.tray-collapsed{height:46px;padding:6px 14px}.review>.inventory-section.tray-expanded{height:160px}.inventory .item{flex-basis:130px;grid-template-rows:auto 1fr auto;padding:6px}.inventory .item-thumb{display:none}.inventory.all{display:flex;overflow-x:auto;overflow-y:hidden}.inventory .item strong{font-size:11px;min-height:22px}.inventory .state{font-size:10px}.inventory .item-number{font-size:10px;min-height:14px}.inventory-empty{padding:8px 0;font-size:12px} .review>footer{padding:8px 14px calc(8px + env(safe-area-inset-bottom));gap:8px;flex-direction:column;align-items:stretch}.review>footer>div:first-child{gap:10px;justify-content:space-between}.review>footer .check{font-size:10px;max-width:48%;gap:4px}.review>footer .check input{width:14px;height:14px}.review>footer .submit-area{justify-content:space-between;gap:10px}.review>footer .submit-area p{font-size:10px;max-width:22ch} } -`;var Mi=`/* VENDORED from impeccable-site/site/styles/kinpaku-tokens.css (the source of truth). +`;var zn=`/* VENDORED from impeccable-site/site/styles/kinpaku-tokens.css (the source of truth). Do not edit here: change the site, then run node scripts/sync-kinpaku-kit.mjs. */ /* * impeccable.style tokens (page-global, single source of truth) @@ -268,7 +268,7 @@ --ks-quick: 120ms; --ks-settle: 200ms; } -`,Ti=`/* VENDORED from impeccable-site/site/styles/kinpaku-kit.css (buttons, tabs, select, icon button, instrument strip, grain, switch, paper strip, thumb) (the source of truth). +`,Sn=`/* VENDORED from impeccable-site/site/styles/kinpaku-kit.css (buttons, tabs, select, icon button, instrument strip, grain, switch, paper strip, thumb) (the source of truth). Do not edit here: change the site, then run node scripts/sync-kinpaku-kit.mjs. */ /* ============================================================ Buttons: primary, secondary, ghost, disabled @@ -996,7 +996,7 @@ body::before { padding-block: 10px; } } -`,qi=`/* VENDORED from impeccable-site/site/styles/docs-kinpaku.css (the command rail list: the site's selected-row pattern) (the source of truth). +`,Ln=`/* VENDORED from impeccable-site/site/styles/docs-kinpaku.css (the command rail list: the site's selected-row pattern) (the source of truth). Do not edit here: change the site, then run node scripts/sync-kinpaku-kit.mjs. */ /* Group headings are ink and bold, so they read as headings over their links rather than as meta beside them; the links are muted and a step @@ -1046,7 +1046,7 @@ body::before { font-weight: 600; border-left-color: var(--ks-gold-line); } -`;var Vi=`/* Local review chrome. Keep the vendored site kit and inspected artwork independent. */ +`;var Tn=`/* Local review chrome. Keep the vendored site kit and inspected artwork independent. */ :root, :host { --review-media-paper: oklch(97.8% 0 0); --review-media-raised: oklch(99.5% 0 0); @@ -1092,10 +1092,10 @@ img, iframe { color-scheme: light; } border-color: var(--ks-text-muted); } } -`;var Ei=(i)=>i.replace(/^:root\s*\{/gm,":root, :host {"),ze=Ei(Mi)+` -`+Ei(Ti)+` -`+qi+` -`+Vi,Bn='';var Yi=` +`;var Cn=(n)=>n.replace(/^:root\s*\{/gm,":root, :host {"),$t=Cn(zn)+` +`+Cn(Sn)+` +`+Ln+` +`+Tn,Ue='';var Pn=` .review-peers{display:grid;gap:8px;padding:8px 0 12px;font-size:12px} .review-peers strong span{font-weight:400}.review-peers>div{display:flex;flex-wrap:wrap;gap:4px} .review-peers button{min-width:28px;min-height:28px;padding:3px;border:1px solid var(--line);border-radius:4px;background:var(--paper);color:inherit} @@ -1133,7 +1133,7 @@ img, iframe { color-scheme: light; } @media(prefers-reduced-motion:reduce){*{scroll-behavior:auto}} .item-medium{margin-left:auto;font-weight:400;display:flex;align-items:center;gap:4px;font-size:10px;color:var(--muted);min-height:16px}.item-medium .utility-icon{width:14px;height:14px;flex-shrink:0}.material>.utility-icon{width:18px;height:18px;align-self:center;color:var(--teal)} .feedback-actions{display:flex;align-items:center;gap:10px;margin-top:12px;flex-wrap:wrap}.feedback-actions svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.5}.feedback-hint,.shortcut-hint{font-size:12px;color:var(--muted)}.feedback-hint{margin-top:6px}.shortcut-hint{flex-basis:100%;text-align:right}.record-verdict{display:flex;flex-wrap:wrap;align-items:baseline;gap:5px 12px;font-size:13px}.record-verdict span{font-size:11px;color:var(--muted)}.review>.record-footer{font-size:12px;color:var(--muted);flex-wrap:wrap;gap:6px 16px}.saved-feedback{font-size:13px;white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0}.decision-notice{display:flex;align-items:center;gap:12px;font-size:12px;margin-bottom:10px}.decision-notice>span{flex:1;overflow-wrap:anywhere}.decision-notice button{color:var(--teal);flex-shrink:0}.review-summary{padding:4px 2px}.completion-mark{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:var(--ks-gray);color:var(--ks-patina-deep);float:left;margin:0 10px 8px 0}.completion-mark svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.6}.completion-link{display:inline-flex;align-items:center;gap:8px;color:var(--teal);border:0;background:transparent;padding:0;font-size:12px;text-align:left}.completion-link svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;flex-shrink:0}.review-summary h2{font-size:22px;line-height:32px}.review-summary p{clear:both;margin-top:8px;color:var(--muted)}.summary-decisions{margin-top:24px;display:grid}.summary-decisions button{display:grid;grid-template-columns:1fr auto;gap:6px 16px;text-align:left;border:0;border-bottom:1px solid var(--line);border-radius:0;padding:12px 0;background:transparent}.summary-decisions strong{font-size:13px;font-weight:500}.summary-decisions span{font-size:12px;color:var(--teal)}.summary-decisions small{grid-column:1/-1;font-size:12px;color:var(--muted);white-space:pre-wrap;overflow-wrap:anywhere} -`+ji+` +`+En+` .review-form:has(#feedback-form){max-height:75%;min-height:0;flex-shrink:1;display:flex;flex-direction:column;overflow:hidden;padding-top:8px} #feedback-form{display:flex;flex-direction:column;flex:1;min-height:0} /* Leave room inside the scrollport for the 2px focus ring and 3px offset. */ @@ -1264,7 +1264,7 @@ input[type=checkbox]{accent-color:var(--ks-ink)} .assembled-review .decisions{padding:0} .assembled-review .page-review-status{color:var(--ks-text-muted);font-size:var(--ks-type-label-size)} @media(max-width:800px){.assembled-review>.workbench{padding:12px 16px 0}.assembled-review .compare{gap:12px}} -`+ze+` +`+$t+` /* Local fit for the vendored kit: sizes the legacy layout expects, the link-style text action, and the paper grain the site puts on its page ground (kit body::before, here on the review root). */ .review{position:relative;isolation:isolate} @@ -1283,7 +1283,7 @@ input[type=checkbox]{accent-color:var(--ks-ink)} .mobile-panes{padding:8px 14px} .ks-checkbox input{margin:0} .review .ks-switch,.review .ks-switch[aria-pressed=true],.review .ks-instrument-key[aria-pressed=true]{box-shadow:none} -`;var rr={chevronDown:'',code:'',image:'',expand:'',compact:'',hideTray:'',showTray:'',next:'',mark:'',close:'',undo:'',external:'',zoom:''};function fn(i){return``}var De=[{kind:"plate",label:"Illustration / plate",hint:"Painted or drawn artwork"},{kind:"image",label:"Photo / image",hint:"A photograph"},{kind:"texture",label:"Texture",hint:"A surface or material"}];function Me(i){let n=i;return!!n&&n.schemaVersion===3&&n.stage==="components"}function Re(i){return i.role==="plan"&&(!!i.flags?.length||!!i.codeDrawn)}function Fe(i){let n=(o)=>Re(o)?0:o.role==="asset"?1:2;return i.components.map((o,a)=>({c:o,i:a})).sort((o,a)=>n(o.c)-n(a.c)||o.i-a.i).map((o)=>o.c)}function Te(i){let n=new Set(i.components.map((o)=>o.id));return(i.codeRegions??[]).filter((o)=>!n.has(o.id))}function zn(i,n){let o=n.decisions[i.id];return o?.revision===i.revision?o:void 0}function yn(i,n){let o=zn(i,n);return o?o.action==="approve"?"approved":o.action:"pending"}function qe(i,n){return i.reclassify?.find((o)=>o.id===n)}function Ce(i){let n=[i.name,i.note,...(i.flags??[]).map((o)=>o.message)].join(" ");if(/\b(textures?|surfaces?|grain|grainy|brushed|metal(lic)?|steel|brass|copper|paper|linen|canvas|fabric|cloth|wood(en)?|stone|marble|concrete|plaster|leather|noise|pattern(ed)?|weave|patina)\b/i.test(n))return"texture";if(/\b(photo|photos|photograph|photographs|photographic|photography)\b/i.test(n)&&!/\bphotographic shading\b/i.test(n))return"image";return"plate"}function Ji(i){return`Drawn in code (${i.kind})`}function Pe(i){return i.message}function Pn(i,n){let o=i.components.map((m)=>yn(m,n)),a=o.filter((m)=>m==="approved").length,t=o.filter((m)=>m==="revise").length,p=new Set(Te(i).map((m)=>m.id)),y=(n.reclassify??[]).filter((m)=>p.has(m.id)).length,g=o.filter((m)=>m==="reclassify").length+y,b=o.filter((m)=>m==="pending").length,z=n.missing.length,v=t+g+z>0,w=n.packetRevision===i.revision,M=n.missing.every((m)=>m.name.trim()&&We(m.box)),u=w&&!v&&b===0;return{total:o.length,approved:a,revise:t,reclassify:g,pending:b,missing:z,hasChanges:v,canApprove:u,mode:v?"changes":"approve",canSubmit:w&&M&&(v||u)}}function Se(i,n,o,a={}){if(a.split&&!(o==="revise"&&n.role==="asset"))throw Error("Only a generated asset can be split into layers");if(o==="revise"&&n.role!=="asset"&&!(a.feedback??"").trim())throw Error("Revising a plan item needs feedback");if(o==="reclassify"&&n.role!=="plan")throw Error("Only planned code can become an image");let t={revision:n.revision,action:o,feedback:o==="approve"?"":(a.feedback??"").trim(),split:!!a.split};if(o==="reclassify")t.kind=a.kind??Ce(n);return{...i,inventoryConfirmed:!1,decisions:{...i.decisions,[n.id]:t}}}function $i(i,n){let o={...i.decisions};return delete o[n],{...i,inventoryConfirmed:!1,decisions:o}}function ni(i,n,o){let a=(i.reclassify??[]).filter((t)=>t.id!==n);return{...i,inventoryConfirmed:!1,reclassify:o?[...a,{id:n,kind:o.kind,feedback:(o.feedback??"").trim()}]:a}}function Gi(i,n){let o=Pn(i,n);if(!o.canSubmit)throw Error("Review is incomplete or stale");let a={};for(let y of i.components){let g=zn(y,n);if(g)a[y.id]=structuredClone(g)}let t=new Set(Te(i).map((y)=>y.id)),p=(n.reclassify??[]).filter((y)=>t.has(y.id)).map((y)=>({...y}));return{schemaVersion:1,requestId:i.id,packetRevision:n.packetRevision,decisions:a,missing:structuredClone(n.missing),inventoryConfirmed:o.mode==="approve",...p.length?{reclassify:p}:{}}}function Qi(i){return{packetRevision:i.revision,decisions:{},missing:[],inventoryConfirmed:!1,reclassify:[]}}function Zi(i,n,o,a,t=0.02){let p=Math.max(0,Math.floor((a.x-t)*n)),y=Math.min(n-1,Math.ceil((a.x+a.w+t)*n)),g=Math.max(0,Math.floor((a.y-t)*o)),b=Math.min(o-1,Math.ceil((a.y+a.h+t)*o)),z=Math.floor(a.x*n),v=Math.ceil((a.x+a.w)*n),w=Math.floor(a.y*o),M=Math.ceil((a.y+a.h)*o),u=[],m=Math.max(1,Math.round(Math.max(y-p,b-g)/80));for(let Q=g;Q<=b;Q+=m)for(let Z=p;Z<=y;Z+=m){if(Z>=z&&Z=w&&Q{let a=i.map((t)=>t[o]).sort((t,p)=>t-p);return a[a.length>>1]};return"#"+[0,1,2].map((o)=>n(o).toString(16).padStart(2,"0")).join("")}function ei(i,n,o,a,t,p=4,y=24){let g=i.w*n,b=i.h*o,z=Math.min(24,Math.max(8,0.04*Math.max(g,b))),v=Math.min(n,g+z*2),w=Math.min(o,b+z*2),M=Math.min(p,a/v,t/w);if(b*M0)M=Math.min(p,y/b,t/w),v=Math.min(v,a/M);let u=(i.x+i.w/2)*n,m=(i.y+i.h/2)*o,Q=Math.max(0,Math.min(n-v,u-v/2)),Z=Math.max(0,Math.min(o-w,m-w/2));return{scale:M,width:v*M,height:w*M,view:{x:Q/n,y:Z/o,w:v/n,h:w/o}}}var ar=["no","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"],je=(i)=>ar[i]??String(i),Xi=(i)=>i[0].toUpperCase()+i.slice(1);function Ai(i,n,o){let a=i.components.filter((p)=>yn(p,n)==="pending").length;if(o&&i.round>1){let p=i.components.filter((g)=>["changed","added"].includes(o.changes[g.id]?.kind??"")||o.feedback?.[g.id]).length,y=i.components.filter((g)=>yn(g,n)==="approved").length;return`The agent worked on your notes for ${je(p)} ${p===1?"item":"items"}. ${Xi(je(y))} ${y===1?"approval is":"approvals are"} kept.`}let t=Math.max(1,Math.round(a*15/60));return`${Xi(je(a))} ${a===1?"thing":"things"} to check before any page code is written. About ${je(t)} ${t===1?"minute":"minutes"}.`}var Li="Frame, view and moving parts as separate pieces, e.g. the shutters.";function ii(i){return i.role==="asset"?i.flags??[]:[]}var ri=(i)=>ii(i).some((n)=>n.id==="baked-composite"),ai=(i)=>i?.action==="revise"&&i.split===!0;function Ve(i,n){if(!n)return null;let o=n.feedback?.[i]?void 0:Object.entries(n.feedback??{}).filter(([g,b])=>b.decision.action==="revise"&&b.decision.split&&i.startsWith(`${g}-`)).sort((g,b)=>b[0].length-g[0].length)[0];if(o){let[g,b]=o;return{round:b.round,action:"split",words:(b.decision.feedback??"").trim(),splitFrom:n.packet.components.find((z)=>z.id===g)?.name??g,beforeUrl:void 0,wasCode:!1,wasKind:void 0,wasNote:""}}let a=n.feedback?.[i],t=n.packet.components.find((g)=>g.id===i),p=n.packet.codeRegions?.find((g)=>g.id===i),y=n.changes[i]?.kind;if(!a&&y!=="changed")return null;return{round:a?.round??n.packet.round,action:a?.decision.action,words:(a?.decision.feedback??"").trim(),beforeUrl:t?.role==="asset"?t.preview.url:void 0,wasCode:t?.role==="plan"||!t&&!!p,wasKind:t?.kind??p?.kind,wasNote:t?.note??p?.note??"",splitFrom:void 0}}function Ni(i,n,o,a,t,p=4,y){let g=i.length,b=Math.max(0,Math.min(o-t,(n-a*(g-1))/i.reduce((M,u)=>M+u,0))),z=Math.max(0,Math.min(n,(o-g*t-a*(g-1))/i.reduce((M,u)=>M+1/u,0)));if(y)b=Math.min(b,y.h*p),z=Math.min(z,y.w*p);let v=i.reduce((M,u)=>M+u*b*b,0),w=i.reduce((M,u)=>M+z*z/u,0);return v>=w?{direction:"row",sizes:i.map((M)=>({w:M*b,h:b}))}:{direction:"column",sizes:i.map((M)=>({w:z,h:z/M}))}}function Ki(i,n,o,a,t,p){return{x:t-i*o*p,y:t-n*a*p}}function _i(i,n,o){return Fe(i).map((a)=>({id:a.id,name:a.name,state:yn(a,n),current:a.id===o}))}function Bi(i,n){let o=Pn(i,n);if(o.mode==="approve")return"Approve plan and assets";let a=i.components.filter((y)=>ai(zn(y,n))).length,t=o.revise-a;return`Send notes (${[t?`${t} ${t===1?"note":"notes"}`:"",a?`${a} to split`:"",o.reclassify?`${o.reclassify} to become ${o.reclassify===1?"an image":"images"}`:"",o.missing?`${o.missing} missing`:""].filter(Boolean).join(", ")})`}var Hi=ze+` +`;var oi={chevronDown:'',code:'',image:'',expand:'',compact:'',hideTray:'',showTray:'',next:'',mark:'',close:'',undo:'',external:'',zoom:''};function we(n){return``}var Yt=[{kind:"plate",label:"Illustration / plate",hint:"Painted or drawn artwork"},{kind:"image",label:"Photo / image",hint:"A photograph"},{kind:"texture",label:"Texture",hint:"A surface or material"}];function Et(n){let e=n;return!!e&&e.schemaVersion===3&&e.stage==="components"}function Xt(n){return n.role==="plan"&&(!!n.flags?.length||!!n.codeDrawn)}function _t(n){let e=(r)=>Xt(r)?0:r.role==="asset"?1:2;return n.components.map((r,o)=>({c:r,i:o})).sort((r,o)=>e(r.c)-e(o.c)||r.i-o.i).map((r)=>r.c)}function zt(n){let e=new Set(n.components.map((r)=>r.id));return(n.codeRegions??[]).filter((r)=>!e.has(r.id))}function $e(n,e){let r=e.decisions[n.id];return r?.revision===n.revision?r:void 0}function ye(n,e){let r=$e(n,e);return r?r.action==="approve"?"approved":r.action:"pending"}function St(n,e){return n.reclassify?.find((r)=>r.id===e)}function Jt(n){let e=[n.name,n.note,...(n.flags??[]).map((r)=>r.message)].join(" ");if(/\b(textures?|surfaces?|grain|grainy|brushed|metal(lic)?|steel|brass|copper|paper|linen|canvas|fabric|cloth|wood(en)?|stone|marble|concrete|plaster|leather|noise|pattern(ed)?|weave|patina)\b/i.test(e))return"texture";if(/\b(photo|photos|photograph|photographs|photographic|photography)\b/i.test(e)&&!/\bphotographic shading\b/i.test(e))return"image";return"plate"}function Dn(n){return`Drawn in code (${n.kind})`}function Qt(n){return n.message}function Qe(n,e){let r=n.components.map((b)=>ye(b,e)),o=r.filter((b)=>b==="approved").length,a=r.filter((b)=>b==="revise").length,l=new Set(zt(n).map((b)=>b.id)),y=(e.reclassify??[]).filter((b)=>l.has(b.id)).length,g=r.filter((b)=>b==="reclassify").length+y,v=r.filter((b)=>b==="pending").length,M=e.missing.length,h=a+g+M>0,k=e.packetRevision===n.revision,z=e.missing.every((b)=>b.name.trim()&&Wt(b.box)),f=k&&!h&&v===0;return{total:r.length,approved:o,revise:a,reclassify:g,pending:v,missing:M,hasChanges:h,canApprove:f,mode:h?"changes":"approve",canSubmit:k&&z&&(h||f)}}function Zt(n,e,r,o={}){if(o.split&&!(r==="revise"&&e.role==="asset"))throw Error("Only a generated asset can be split into layers");if(r==="revise"&&e.role!=="asset"&&!(o.feedback??"").trim())throw Error("Revising a plan item needs feedback");if(r==="reclassify"&&e.role!=="plan")throw Error("Only planned code can become an image");let a={revision:e.revision,action:r,feedback:r==="approve"?"":(o.feedback??"").trim(),split:!!o.split};if(r==="reclassify")a.kind=o.kind??Jt(e);return{...n,inventoryConfirmed:!1,decisions:{...n.decisions,[e.id]:a}}}function An(n,e){let r={...n.decisions};return delete r[e],{...n,inventoryConfirmed:!1,decisions:r}}function en(n,e,r){let o=(n.reclassify??[]).filter((a)=>a.id!==e);return{...n,inventoryConfirmed:!1,reclassify:r?[...o,{id:e,kind:r.kind,feedback:(r.feedback??"").trim()}]:o}}function Hn(n,e){let r=Qe(n,e);if(!r.canSubmit)throw Error("Review is incomplete or stale");let o={};for(let y of n.components){let g=$e(y,e);if(g)o[y.id]=structuredClone(g)}let a=new Set(zt(n).map((y)=>y.id)),l=(e.reclassify??[]).filter((y)=>a.has(y.id)).map((y)=>({...y}));return{schemaVersion:1,requestId:n.id,packetRevision:e.packetRevision,decisions:o,missing:structuredClone(e.missing),inventoryConfirmed:r.mode==="approve",...l.length?{reclassify:l}:{}}}function qn(n){return{packetRevision:n.revision,decisions:{},missing:[],inventoryConfirmed:!1,reclassify:[]}}function In(n,e,r,o,a=0.02){let l=Math.max(0,Math.floor((o.x-a)*e)),y=Math.min(e-1,Math.ceil((o.x+o.w+a)*e)),g=Math.max(0,Math.floor((o.y-a)*r)),v=Math.min(r-1,Math.ceil((o.y+o.h+a)*r)),M=Math.floor(o.x*e),h=Math.ceil((o.x+o.w)*e),k=Math.floor(o.y*r),z=Math.ceil((o.y+o.h)*r),f=[],b=Math.max(1,Math.round(Math.max(y-l,v-g)/80));for(let q=g;q<=v;q+=b)for(let I=l;I<=y;I+=b){if(I>=M&&I=k&&q{let o=n.map((a)=>a[r]).sort((a,l)=>a-l);return o[o.length>>1]};return"#"+[0,1,2].map((r)=>e(r).toString(16).padStart(2,"0")).join("")}function tn(n,e,r,o,a,l=4,y=24){let g=n.w*e,v=n.h*r,M=Math.min(24,Math.max(8,0.04*Math.max(g,v))),h=Math.min(e,g+M*2),k=Math.min(r,v+M*2),z=Math.min(l,o/h,a/k);if(v*z0)z=Math.min(l,y/v,a/k),h=Math.min(h,o/z);let f=(n.x+n.w/2)*e,b=(n.y+n.h/2)*r,q=Math.max(0,Math.min(e-h,f-h/2)),I=Math.max(0,Math.min(r-k,b-k/2));return{scale:z,width:h*z,height:k*z,view:{x:q/e,y:I/r,w:h/e,h:k/r}}}var ri=["no","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"],Mt=(n)=>ri[n]??String(n),Rn=(n)=>n[0].toUpperCase()+n.slice(1);function jn(n,e,r){let o=n.components.filter((l)=>ye(l,e)==="pending").length;if(r&&n.round>1){let l=n.components.filter((g)=>["changed","added"].includes(r.changes[g.id]?.kind??"")||r.feedback?.[g.id]).length,y=n.components.filter((g)=>ye(g,e)==="approved").length;return`The agent worked on your notes for ${Mt(l)} ${l===1?"item":"items"}. ${Rn(Mt(y))} ${y===1?"approval is":"approvals are"} kept.`}let a=Math.max(1,Math.round(o*15/60));return`${Rn(Mt(o))} ${o===1?"thing":"things"} to check before any page code is written. About ${Mt(a)} ${a===1?"minute":"minutes"}.`}var Nn="Frame, view and moving parts as separate pieces, e.g. the shutters.";function nn(n){return n.role==="asset"?n.flags??[]:[]}var on=(n)=>nn(n).some((e)=>e.id==="baked-composite"),rn=(n)=>n?.action==="revise"&&n.split===!0;function Lt(n,e){if(!e)return null;let r=e.feedback?.[n]?void 0:Object.entries(e.feedback??{}).filter(([g,v])=>v.decision.action==="revise"&&v.decision.split&&n.startsWith(`${g}-`)).sort((g,v)=>v[0].length-g[0].length)[0];if(r){let[g,v]=r;return{round:v.round,action:"split",words:(v.decision.feedback??"").trim(),splitFrom:e.packet.components.find((M)=>M.id===g)?.name??g,beforeUrl:void 0,wasCode:!1,wasKind:void 0,wasNote:""}}let o=e.feedback?.[n],a=e.packet.components.find((g)=>g.id===n),l=e.packet.codeRegions?.find((g)=>g.id===n),y=e.changes[n]?.kind;if(!o&&y!=="changed")return null;return{round:o?.round??e.packet.round,action:o?.decision.action,words:(o?.decision.feedback??"").trim(),beforeUrl:a?.role==="asset"?a.preview.url:void 0,wasCode:a?.role==="plan"||!a&&!!l,wasKind:a?.kind??l?.kind,wasNote:a?.note??l?.note??"",splitFrom:void 0}}function On(n,e,r,o,a,l=4,y){let g=n.length,v=Math.max(0,Math.min(r-a,(e-o*(g-1))/n.reduce((z,f)=>z+f,0))),M=Math.max(0,Math.min(e,(r-g*a-o*(g-1))/n.reduce((z,f)=>z+1/f,0)));if(y)v=Math.min(v,y.h*l),M=Math.min(M,y.w*l);let h=n.reduce((z,f)=>z+f*v*v,0),k=n.reduce((z,f)=>z+M*M/f,0);return h>=k?{direction:"row",sizes:n.map((z)=>({w:z*v,h:v}))}:{direction:"column",sizes:n.map((z)=>({w:M,h:M/z}))}}function Fn(n,e,r,o,a,l){return{x:a-n*r*l,y:a-e*o*l}}function Un(n,e,r){return _t(n).map((o)=>({id:o.id,name:o.name,state:ye(o,e),current:o.id===r}))}function Kn(n,e){let r=Qe(n,e);if(r.mode==="approve")return"Approve plan and assets";let o=n.components.filter((y)=>rn($e(y,e))).length,a=r.revise-o;return`Send notes (${[a?`${a} ${a===1?"note":"notes"}`:"",o?`${o} to split`:"",r.reclassify?`${r.reclassify} to become ${r.reclassify===1?"an image":"images"}`:"",r.missing?`${r.missing} missing`:""].filter(Boolean).join(", ")})`}var Wn=$t+` :host{display:block;height:var(--component-review-height,100dvh);min-height:0;overflow:hidden;color:var(--ks-text);font:400 var(--ks-type-small-size)/1.5 var(--ks-font); --asset:var(--ks-patina);--plan:var(--ks-ink);--flag:var(--ks-vermilion);--missing:var(--ks-vermilion);--stage-ease:var(--ks-ease)} *{box-sizing:border-box} @@ -1518,116 +1518,116 @@ button.region:hover{opacity:1;background-color:oklch(99.5% 0 0 / .14);z-index:4} .send-row p{text-align:left} } @media (prefers-reduced-motion:reduce){*,*::before{animation:none!important;transition:none!important}} -`;var Wi=new Map;function Ee(i){let n=i.querySelector('.ks-instrument-key:is(.is-active, [aria-selected="true"], [aria-pressed="true"])');if(!n){if(i.classList.contains("has-thumb"))i.classList.remove("has-thumb");return}let o=i.getBoundingClientRect(),a=n.getBoundingClientRect();if(!o.width)return;let t=getComputedStyle(i),p=o.width/parseFloat(t.width)||1,y=parseFloat(t.borderLeftWidth)||0,g=Math.round(((a.left-o.left)/p-y+i.scrollLeft)*100)/100,b=Math.round(a.width/p*100)/100,z=i.querySelector(":scope > .ks-thumb"),v=i.dataset.ksStrip;if(!z){z=document.createElement("span"),z.className="ks-thumb",z.setAttribute("aria-hidden","true"),i.appendChild(z);let M=v?Wi.get(v):void 0;if(M&&(M.x!==g||M.w!==b))z.style.transition="none",z.style.width=`${M.w}px`,z.style.transform=`translateX(${M.x}px)`,z.offsetWidth,z.style.transition=""}if(v)Wi.set(v,{x:g,w:b});if(z.style.width!==`${b}px`)z.style.width=`${b}px`;let w=`translateX(${g}px)`;if(z.style.transform!==w)z.style.transform=w;if(!i.classList.contains("has-thumb"))i.classList.add("has-thumb")}function or(i,n,o){if(i.dataset.thumb)return;i.dataset.thumb="1",Ee(i);let a=new MutationObserver((M)=>{if(M.some((u)=>u.target!==i&&!u.target.classList?.contains("ks-thumb")))Ee(i)});a.observe(i,{subtree:!0,attributes:!0,attributeFilter:["class","aria-selected","aria-pressed"],childList:!0});let t=new ResizeObserver(()=>Ee(i));t.observe(i);let p=null,y=!1,g=0,b=null,z=(M,u)=>n.elementFromPoint(M,u)?.closest(".ks-instrument-key")??null;i.addEventListener("pointerdown",(M)=>{if(!["mouse","pen"].includes(M.pointerType)||!M.isPrimary||M.button!==0||p!==null)return;p=M.pointerId,y=!1,g=M.clientX,b=z(M.clientX,M.clientY)}),i.addEventListener("pointermove",(M)=>{if(M.pointerId!==p)return;if(!y&&Math.abs(M.clientX-g)<6)return;y=!0;let u=z(M.clientX,M.clientY);if(u&&u!==b&&i.contains(u))b=u,u.click()});let v=()=>{p=null,y=!1,b=null},w=(M)=>{if(M.pointerId===p)v()};window.addEventListener("pointerup",w),window.addEventListener("pointercancel",w),window.addEventListener("blur",v),o.push(()=>{a.disconnect(),t.disconnect(),window.removeEventListener("pointerup",w),window.removeEventListener("pointercancel",w),window.removeEventListener("blur",v)})}function Ye(i){let n=[];return i.querySelectorAll(".ks-instrument-strip").forEach((o)=>or(o,i,n)),document.fonts?.ready.then(()=>i.querySelectorAll(".ks-instrument-strip").forEach(Ee)),()=>n.forEach((o)=>o())}var Y=(i)=>i.replace(/[&<>"']/g,(n)=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[n]),Xe=(i)=>`${i*100}%`,Hn=(i)=>{let n=new URL(i,location.href);if(!["http:","https:"].includes(n.protocol))throw Error("Unsupported preview URL");return Y(n.href)},Sn=(i)=>`left:${Xe(i.x)};top:${Xe(i.y)};width:${Xe(i.w)};height:${Xe(i.h)}`,Ii=(i)=>``,Je={check:Ii(''),alert:Ii('')},jn=(i)=>`${i}`,An={plate:"illustration",image:"photo",texture:"texture"};function tr(i){let n=i.match(/^review is stale:\s*(.+?)\s+changed\b/i);if(n)return`${n[1]} changed after this round was prepared.`;let o=i.replace(/;?\s*prepare a new round\.?\s*$/i,"").trim();return o?`${o[0].toUpperCase()}${o.slice(1)}${/[.!?]$/.test(o)?"":"."}`:""}var Oi={get(i){try{return localStorage.getItem(i)}catch{return null}},set(i,n){try{localStorage.setItem(i,n)}catch{}}};function Di(i,n,o){let a=i.shadowRoot??i.attachShadow({mode:"open"}),t={...Qi(n),...structuredClone(o.initialDraft??{})};t.reclassify??=[];let p=Fe(n),y=Te(n),g=o.history??null,b=new URLSearchParams(location.search),z=!!o.completed,v=z?"summary":["intro","stage","summary"].includes(b.get("view")??"")?b.get("view"):"intro",w=(b.get("item")&&p.some((r)=>r.id===b.get("item"))?b.get("item"):void 0)??p.find((r)=>yn(r,t)==="pending")?.id??p[0]?.id,M=null,u=null,m=null,Q=!1,Z=!1,dn=!1,xn={},U=!1,Qn=!1,Yn="",W=null,en=()=>W?`

${Y(W.label)}

`:"",Tn=Oi.get("impeccable.review.flipHint")==="1",I=null,Wn=null,ln=new Map,Xn=new Map,C=null,qn=()=>matchMedia("(prefers-reduced-motion: reduce)").matches,rn=(r)=>n.components.find((s)=>s.id===r),Nn=(r)=>y.find((s)=>s.id===r),N=()=>z||U||!!o.status,hn=(r)=>r.w*n.comp.width/(r.h*n.comp.height),an=new Image;an.onload=()=>{try{let r=Math.min(1,480/an.naturalWidth),s=document.createElement("canvas");s.width=Math.max(1,Math.round(an.naturalWidth*r)),s.height=Math.max(1,Math.round(an.naturalHeight*r));let l=s.getContext("2d",{willReadFrequently:!0});if(l.drawImage(an,0,0,s.width,s.height),C={data:l.getImageData(0,0,s.width,s.height).data,width:s.width,height:s.height},v==="stage")A()}catch{}},an.src=new URL(n.comp.url,location.href).href;function ne(r){if(!Xn.has(r.id)&&C)Xn.set(r.id,Ui(Zi(C.data,C.width,C.height,r.box))??"");return Xn.get(r.id)||n.comp.background||"var(--review-media-deep)"}function Zn(r,s){if(r.material?.alpha==="transparent")return!0;if(r.material?.alpha==="opaque")return!1;if(ln.has(s))return ln.get(s);if(ln.set(s,!1),!/\.(png|webp)(\?|$)/i.test(s))return!1;let l=new Image;return l.onload=()=>{try{let h=Math.min(1,160/Math.max(l.naturalWidth,l.naturalHeight)),f=document.createElement("canvas");f.width=Math.max(1,Math.round(l.naturalWidth*h)),f.height=Math.max(1,Math.round(l.naturalHeight*h));let k=f.getContext("2d",{willReadFrequently:!0});k.drawImage(l,0,0,f.width,f.height);let x=k.getImageData(0,0,f.width,f.height).data;for(let c=3;cl.id===w)+r;if(s>=p.length)return on("summary",void 0,"next");if(s<0)return;on("stage",p[s].id,r>0?"next":"prev")}function In(r,s){if(W)clearTimeout(W.timer);W={label:r,before:s,view:v,current:w,timer:window.setTimeout(()=>{W=null,a.querySelector(".undo-line")?.classList.add("gone")},6000)}}function Un(r,s){let l=t;t=r,u=null,Yn="",In(s,l)}function Jn(){let r=p.findIndex((l)=>l.id===w),s=[...p.slice(r+1),...p.slice(0,r+1)].find((l)=>yn(l,t)==="pending");if(s)on("stage",s.id,"next");else on("summary",void 0,"next")}function le(){let r=rn(w);if(v!=="stage"||!r||N()||u)return;Un(Se(t,r,"approve"),`${r.role==="asset"?"Approved":"Kept in code"}: ${r.name}.`),Jn()}function $n(r,s,l=!1){if(N())return;let h=s?Nn(s):void 0,f=h?void 0:rn(w),k=f??h;if(!k||f&&r==="reclassify"&&f.role!=="plan")return;let x=f?zn(f,t):void 0,c=h?qe(t,h.id):void 0,V=x?.action===r&&!!x.split===l;u={type:r,split:l,id:k.id,region:!!h,text:V?x.feedback:l?Li:c?.feedback??"",kind:x?.kind??c?.kind??Ce({name:k.name,note:k.note??"",flags:f?.flags})},A(),a.getElementById("form-text")?.focus()}function On(){if(!u||N())return;let r=u;if(r.region){let l=Nn(r.id);Un(ni(t,l.id,{kind:r.kind,feedback:r.text}),`${l.name} will become ${An[r.kind]}.`),A();return}let s=rn(r.id);if(r.type==="revise"&&s.role==="plan"&&!r.text.trim()){a.getElementById("form-text")?.focus();return}Un(Se(t,s,r.type,{feedback:r.text,kind:r.kind,split:r.split}),r.split?`Split into layers: ${s.name}.`:r.type==="revise"?`Noted: ${s.name}.`:`${s.name} will become ${An[r.kind]}.`),Jn()}function de(){if(!W||N())return;let r=W;clearTimeout(r.timer),W=null,t=r.before,on(r.view,r.current,"prev")}async function ie(){let r=Pn(n,t);if(U||z||u||!r.canSubmit||o.status)return;U=!0,Yn="",A();try{await o.onSubmit(Gi(n,t)),z=!0,Qn=!0,Q=!1,W=null}catch(s){Yn=s instanceof Error?s.message:"The review could not be saved."}finally{U=!1,A()}}function G(r){let s=`missing-${crypto.randomUUID()}`;t={...t,inventoryConfirmed:!1,missing:[...t.missing,{id:s,name:"",feedback:"",box:r}]},Q=!1,m={type:"missing",id:s},A(),a.getElementById("missing-name")?.focus()}let X=(r)=>{let s=yn(r,t);if(s==="approved")return r.role==="asset"?"Looks good":"Code is fine";if(s==="revise")return ai(zn(r,t))?"Split into layers":"Needs work";if(s==="reclassify")return`Becomes ${An[zn(r,t).kind]}`;return z?"Not decided":"To decide"},J=(r,s="")=>``,K=(r,s,l="gen")=>{let h=Zn(r,s),f=xn[r.id]??"comp",k=!h?"":f==="light"?"var(--review-media-raised)":f==="dark"?"var(--ks-instrument)":ne(r);return``};function H(r){return[...r.code?y.map((l)=>({kind:"region",id:l.id,name:l.name,box:l.box,cls:`code ${qe(t,l.id)?"reclassify":""}`})):[],...n.components.map((l)=>({kind:"item",id:l.id,name:l.name,box:l.box,cls:`is-${l.role} ${Re(l)||ri(l)?"flagged":""} ${yn(l,t)}`})),...t.missing.map((l)=>({kind:"missing",id:l.id,name:l.name||"Missing",box:l.box,cls:"missing"}))].sort((l,h)=>h.box.w*h.box.h-l.box.w*l.box.h).map((l)=>{let h=m?.id===l.id||Z&&v==="stage"&&l.id===w,f=`${Y(l.name)}`;return r.interactive?``:``}).join("")}function R(){let r=_i(n,t,v==="stage"?w:void 0),s=r.filter((l)=>l.state!=="pending").length;return`
-
${Y(n.title)}Round ${n.round}
- ${p.length?``:""} - ${v==="stage"?``:""} -
`}function Gn(){if(o.status)return``;if(Yn)return``;return""}function P(){let r=!!g&&n.round>1;return`
+`;var Vn=new Map;function Tt(n){let e=n.querySelector('.ks-instrument-key:is(.is-active, [aria-selected="true"], [aria-pressed="true"])');if(!e){if(n.classList.contains("has-thumb"))n.classList.remove("has-thumb");return}let r=n.getBoundingClientRect(),o=e.getBoundingClientRect();if(!r.width)return;let a=getComputedStyle(n),l=r.width/parseFloat(a.width)||1,y=parseFloat(a.borderLeftWidth)||0,g=Math.round(((o.left-r.left)/l-y+n.scrollLeft)*100)/100,v=Math.round(o.width/l*100)/100,M=n.querySelector(":scope > .ks-thumb"),h=n.dataset.ksStrip;if(!M){M=document.createElement("span"),M.className="ks-thumb",M.setAttribute("aria-hidden","true"),n.appendChild(M);let z=h?Vn.get(h):void 0;if(z&&(z.x!==g||z.w!==v))M.style.transition="none",M.style.width=`${z.w}px`,M.style.transform=`translateX(${z.x}px)`,M.offsetWidth,M.style.transition=""}if(h)Vn.set(h,{x:g,w:v});if(M.style.width!==`${v}px`)M.style.width=`${v}px`;let k=`translateX(${g}px)`;if(M.style.transform!==k)M.style.transform=k;if(!n.classList.contains("has-thumb"))n.classList.add("has-thumb")}function ai(n,e,r){if(n.dataset.thumb)return;n.dataset.thumb="1",Tt(n);let o=new MutationObserver((z)=>{if(z.some((f)=>f.target!==n&&!f.target.classList?.contains("ks-thumb")))Tt(n)});o.observe(n,{subtree:!0,attributes:!0,attributeFilter:["class","aria-selected","aria-pressed"],childList:!0});let a=new ResizeObserver(()=>Tt(n));a.observe(n);let l=null,y=!1,g=0,v=null,M=(z,f)=>e.elementFromPoint(z,f)?.closest(".ks-instrument-key")??null;n.addEventListener("pointerdown",(z)=>{if(!["mouse","pen"].includes(z.pointerType)||!z.isPrimary||z.button!==0||l!==null)return;l=z.pointerId,y=!1,g=z.clientX,v=M(z.clientX,z.clientY)}),n.addEventListener("pointermove",(z)=>{if(z.pointerId!==l)return;if(!y&&Math.abs(z.clientX-g)<6)return;y=!0;let f=M(z.clientX,z.clientY);if(f&&f!==v&&n.contains(f))v=f,f.click()});let h=()=>{l=null,y=!1,v=null},k=(z)=>{if(z.pointerId===l)h()};window.addEventListener("pointerup",k),window.addEventListener("pointercancel",k),window.addEventListener("blur",h),r.push(()=>{o.disconnect(),a.disconnect(),window.removeEventListener("pointerup",k),window.removeEventListener("pointercancel",k),window.removeEventListener("blur",h)})}function Ct(n){let e=[];return n.querySelectorAll(".ks-instrument-strip").forEach((r)=>ai(r,n,e)),document.fonts?.ready.then(()=>n.querySelectorAll(".ks-instrument-strip").forEach(Tt)),()=>e.forEach((r)=>r())}var P=(n)=>n.replace(/[&<>"']/g,(e)=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e]),Pt=(n)=>`${n*100}%`,Ke=(n)=>{let e=new URL(n,location.href);if(!["http:","https:"].includes(e.protocol))throw Error("Unsupported preview URL");return P(e.href)},Ze=(n)=>`left:${Pt(n.x)};top:${Pt(n.y)};width:${Pt(n.w)};height:${Pt(n.h)}`,Gn=(n)=>``,Rt={check:Gn(''),alert:Gn('')},Me=(n)=>`${n}`,Be={plate:"illustration",image:"photo",texture:"texture"};function si(n){let e=n.match(/^review is stale:\s*(.+?)\s+changed\b/i);if(e)return`${e[1]} changed after this round was prepared.`;let r=n.replace(/;?\s*prepare a new round\.?\s*$/i,"").trim();return r?`${r[0].toUpperCase()}${r.slice(1)}${/[.!?]$/.test(r)?"":"."}`:""}var Yn={get(n){try{return localStorage.getItem(n)}catch{return null}},set(n,e){try{localStorage.setItem(n,e)}catch{}}};function Xn(n,e,r){let o=n.shadowRoot??n.attachShadow({mode:"open"}),a={...qn(e),...structuredClone(r.initialDraft??{})};a.reclassify??=[];let l=_t(e),y=zt(e),g=r.history??null,v=new URLSearchParams(location.search),M=!!r.completed,h=M?"summary":["intro","stage","summary"].includes(v.get("view")??"")?v.get("view"):"intro",k=(v.get("item")&&l.some((i)=>i.id===v.get("item"))?v.get("item"):void 0)??l.find((i)=>ye(i,a)==="pending")?.id??l[0]?.id,z=null,f=null,b=null,q=!1,I=!1,de=!1,ce={},B=!1,He=!1,Ce="",V=null,ne=()=>V?`

${P(V.label)}

`:"",ze=Yn.get("impeccable.review.flipHint")==="1",G=null,We=null,pe=new Map,Pe=new Map,Q=null,Se=()=>matchMedia("(prefers-reduced-motion: reduce)").matches,ie=(i)=>e.components.find((s)=>s.id===i),Ne=(i)=>y.find((s)=>s.id===i),O=()=>M||B||!!r.status,me=(i)=>i.w*e.comp.width/(i.h*e.comp.height),oe=new Image;oe.onload=()=>{try{let i=Math.min(1,480/oe.naturalWidth),s=document.createElement("canvas");s.width=Math.max(1,Math.round(oe.naturalWidth*i)),s.height=Math.max(1,Math.round(oe.naturalHeight*i));let p=s.getContext("2d",{willReadFrequently:!0});if(p.drawImage(oe,0,0,s.width,s.height),Q={data:p.getImageData(0,0,s.width,s.height).data,width:s.width,height:s.height},h==="stage")j()}catch{}},oe.src=new URL(e.comp.url,location.href).href;function et(i){if(!Pe.has(i.id)&&Q)Pe.set(i.id,Bn(In(Q.data,Q.width,Q.height,i.box))??"");return Pe.get(i.id)||e.comp.background||"var(--review-media-deep)"}function qe(i,s){if(i.material?.alpha==="transparent")return!0;if(i.material?.alpha==="opaque")return!1;if(pe.has(s))return pe.get(s);if(pe.set(s,!1),!/\.(png|webp)(\?|$)/i.test(s))return!1;let p=new Image;return p.onload=()=>{try{let m=Math.min(1,160/Math.max(p.naturalWidth,p.naturalHeight)),w=document.createElement("canvas");w.width=Math.max(1,Math.round(p.naturalWidth*m)),w.height=Math.max(1,Math.round(p.naturalHeight*m));let u=w.getContext("2d",{willReadFrequently:!0});u.drawImage(p,0,0,w.width,w.height);let c=u.getImageData(0,0,w.width,w.height).data;for(let x=3;xp.id===k)+i;if(s>=l.length)return re("summary",void 0,"next");if(s<0)return;re("stage",l[s].id,i>0?"next":"prev")}function Ve(i,s){if(V)clearTimeout(V.timer);V={label:i,before:s,view:h,current:k,timer:window.setTimeout(()=>{V=null,o.querySelector(".undo-line")?.classList.add("gone")},6000)}}function Ie(i,s){let p=a;a=i,f=null,Ce="",Ve(s,p)}function Re(){let i=l.findIndex((p)=>p.id===k),s=[...l.slice(i+1),...l.slice(0,i+1)].find((p)=>ye(p,a)==="pending");if(s)re("stage",s.id,"next");else re("summary",void 0,"next")}function pt(){let i=ie(k);if(h!=="stage"||!i||O()||f)return;Ie(Zt(a,i,"approve"),`${i.role==="asset"?"Approved":"Kept in code"}: ${i.name}.`),Re()}function De(i,s,p=!1){if(O())return;let m=s?Ne(s):void 0,w=m?void 0:ie(k),u=w??m;if(!u||w&&i==="reclassify"&&w.role!=="plan")return;let c=w?$e(w,a):void 0,x=m?St(a,m.id):void 0,T=c?.action===i&&!!c.split===p;f={type:i,split:p,id:u.id,region:!!m,text:T?c.feedback:p?Nn:x?.feedback??"",kind:c?.kind??x?.kind??Jt({name:u.name,note:u.note??"",flags:w?.flags})},j(),o.getElementById("form-text")?.focus()}function Ge(){if(!f||O())return;let i=f;if(i.region){let p=Ne(i.id);Ie(en(a,p.id,{kind:i.kind,feedback:i.text}),`${p.name} will become ${Be[i.kind]}.`),j();return}let s=ie(i.id);if(i.type==="revise"&&s.role==="plan"&&!i.text.trim()){o.getElementById("form-text")?.focus();return}Ie(Zt(a,s,i.type,{feedback:i.text,kind:i.kind,split:i.split}),i.split?`Split into layers: ${s.name}.`:i.type==="revise"?`Noted: ${s.name}.`:`${s.name} will become ${Be[i.kind]}.`),Re()}function dt(){if(!V||O())return;let i=V;clearTimeout(i.timer),V=null,a=i.before,re(i.view,i.current,"prev")}async function nt(){let i=Qe(e,a);if(B||M||f||!i.canSubmit||r.status)return;B=!0,Ce="",j();try{await r.onSubmit(Hn(e,a)),M=!0,He=!0,q=!1,V=null}catch(s){Ce=s instanceof Error?s.message:"The review could not be saved."}finally{B=!1,j()}}function H(i){let s=`missing-${crypto.randomUUID()}`;a={...a,inventoryConfirmed:!1,missing:[...a.missing,{id:s,name:"",feedback:"",box:i}]},q=!1,b={type:"missing",id:s},j(),o.getElementById("missing-name")?.focus()}let R=(i)=>{let s=ye(i,a);if(s==="approved")return i.role==="asset"?"Looks good":"Code is fine";if(s==="revise")return rn($e(i,a))?"Split into layers":"Needs work";if(s==="reclassify")return`Becomes ${Be[$e(i,a).kind]}`;return M?"Not decided":"To decide"},D=(i,s="")=>``,F=(i,s,p="gen")=>{let m=qe(i,s),w=ce[i.id]??"comp",u=!m?"":w==="light"?"var(--review-media-raised)":w==="dark"?"var(--ks-instrument)":et(i);return``};function W(i){return[...i.code?y.map((p)=>({kind:"region",id:p.id,name:p.name,box:p.box,cls:`code ${St(a,p.id)?"reclassify":""}`})):[],...e.components.map((p)=>({kind:"item",id:p.id,name:p.name,box:p.box,cls:`is-${p.role} ${Xt(p)||on(p)?"flagged":""} ${ye(p,a)}`})),...a.missing.map((p)=>({kind:"missing",id:p.id,name:p.name||"Missing",box:p.box,cls:"missing"}))].sort((p,m)=>m.box.w*m.box.h-p.box.w*p.box.h).map((p)=>{let m=b?.id===p.id||I&&h==="stage"&&p.id===k,w=`${P(p.name)}`;return i.interactive?``:``}).join("")}function _(){let i=Un(e,a,h==="stage"?k:void 0),s=i.filter((p)=>p.state!=="pending").length;return`
+
${P(e.title)}Round ${e.round}
+ ${l.length?``:""} + ${h==="stage"?``:""} +
`}function Ae(){if(r.status)return``;if(Ce)return``;return""}function Z(){let i=!!g&&e.round>1;return`
-

${r?`Round ${n.round}`:"Before any page code"}

-

${r?"Check what changed.":"Review the plan and assets."}

-

${Y(Ai(n,t,g))}

+

${i?`Round ${e.round}`:"Before any page code"}

+

${i?"Check what changed.":"Review the plan and assets."}

+

${P(jn(e,a,g))}

A generated image
Does it match the comp?
A region drawn in code
Can code do it justice, or should it be an image?
- +
-
The approved comp${H({code:!1,interactive:!1})}
-
`}function re(r){let s=Ve(r.id,g),l=hn(r.box),h=`${r.box.w*n.comp.width}x${r.box.h*n.comp.height}`;if(r.role==="asset"&&r.preview.url){let f=r.preview.url,k=Zn(r,f),x=xn[r.id]??"comp",c=k?``:"",V=`
${dn?"In the comp":s?.beforeUrl?"After":"Generated"}${c}
${K(r,f)}${J(r.box,"flip")}
`,O=`
In the comp
${J(r.box)}
`;if(s?.beforeUrl){let L=`
Before · round ${s.round}
${K(r,s.beforeUrl,"gen before")}
`;return`
${L}${V}${O}
`}return`
${O}${V}
`}if(r.role==="asset")return'

This image has no generated file.

';return`
In the comp
${J(r.box)}
`}function $e(r){if(z)return`

${Y(X(r))}${zn(r,t)?.feedback?`: “${Y(zn(r,t).feedback)}”`:"."}

`;if(u&&!u.region){let h=u.type==="reclassify",f=!h&&r.role==="plan",k=!!u.split;return`
- ${h?`
Make it
${De.map((x)=>``).join("")}
`:""} - -
-
`}let s=zn(r,t),l=r.role==="asset";return`
- ${s?`

${s.action==="approve"?Je.check:""}${Y(X(r))}${s.feedback?`: “${Y(s.feedback)}”`:"."}

`:""} +
The approved comp${W({code:!1,interactive:!1})}
+
`}function it(i){let s=Lt(i.id,g),p=me(i.box),m=`${i.box.w*e.comp.width}x${i.box.h*e.comp.height}`;if(i.role==="asset"&&i.preview.url){let w=i.preview.url,u=qe(i,w),c=ce[i.id]??"comp",x=u?``:"",T=`
${de?"In the comp":s?.beforeUrl?"After":"Generated"}${x}
${F(i,w)}${D(i.box,"flip")}
`,Y=`
In the comp
${D(i.box)}
`;if(s?.beforeUrl){let N=`
Before · round ${s.round}
${F(i,s.beforeUrl,"gen before")}
`;return`
${N}${T}${Y}
`}return`
${Y}${T}
`}if(i.role==="asset")return'

This image has no generated file.

';return`
In the comp
${D(i.box)}
`}function Dt(i){if(M)return`

${P(R(i))}${$e(i,a)?.feedback?`: “${P($e(i,a).feedback)}”`:"."}

`;if(f&&!f.region){let m=f.type==="reclassify",w=!m&&i.role==="plan",u=!!f.split;return`
+ ${m?`
Make it
${Yt.map((c)=>``).join("")}
`:""} + +
+
`}let s=$e(i,a),p=i.role==="asset";return`
+ ${s?`

${s.action==="approve"?Rt.check:""}${P(R(i))}${s.feedback?`: “${P(s.feedback)}”`:"."}

`:""}
- - - ${l?``:``} + + + ${p?``:``}
-
`}function Ge(){let r=rn(w);if(!r)return'

Nothing to review.

';let s=p.findIndex((x)=>x.id===r.id)+1,l=Ve(r.id,g),h=r.role==="plan"?[...(r.flags??[]).map(Pe),...r.codeDrawn?["The plan draws this artwork in code."]:[]]:ii(r).map(Pe),f=(r.note??"").trim(),k=r.role==="plan"?`

Will be drawn in code: ${Y(f||Ji(r).toLowerCase())}

`:l?.wasCode?`

Was going to be drawn in code: ${Y(l.wasNote)} Now a generated ${Y(An[r.kind]??r.kind)}.

`:f?`

${Y(f)}

`:"";return`
+
`}function At(){let i=ie(k);if(!i)return'

Nothing to review.

';let s=l.findIndex((c)=>c.id===i.id)+1,p=Lt(i.id,g),m=i.role==="plan"?[...(i.flags??[]).map(Qt),...i.codeDrawn?["The plan draws this artwork in code."]:[]]:nn(i).map(Qt),w=(i.note??"").trim(),u=i.role==="plan"?`

Will be drawn in code: ${P(w||Dn(i).toLowerCase())}

`:p?.wasCode?`

Was going to be drawn in code: ${P(p.wasNote)} Now a generated ${P(Be[i.kind]??i.kind)}.

`:w?`

${P(w)}

`:"";return`
-

${r.role==="asset"?`Generated ${Y(An[r.kind]??r.kind)}`:`Drawn in code · ${Y(r.kind)}`} · ${s} of ${p.length}

-

${Y(r.name)}

- ${l?.splitFrom?`
A layer of ${Y(l.splitFrom)} · you asked to split it in round ${l.round}${l.words?`

“${Y(l.words)}”

`:""}
`:l?.words?`
You asked in round ${l.round}

“${Y(l.words)}”

`:""} +

${i.role==="asset"?`Generated ${P(Be[i.kind]??i.kind)}`:`Drawn in code · ${P(i.kind)}`} · ${s} of ${l.length}

+

${P(i.name)}

+ ${p?.splitFrom?`
A layer of ${P(p.splitFrom)} · you asked to split it in round ${p.round}${p.words?`

“${P(p.words)}”

`:""}
`:p?.words?`
You asked in round ${p.round}

“${P(p.words)}”

`:""}
- ${re(r)} + ${it(i)}
- ${k} - ${h.map((x)=>`

${Y(x)}

`).join("")} - ${W?en():r.role==="asset"&&!Tn&&!z?`

Hold ${jn("Space")} to flip to the comp. Hover to magnify both.

`:""} + ${u} + ${m.map((c)=>`

${P(c)}

`).join("")} + ${V?ne():i.role==="asset"&&!ze&&!M?`

Hold ${Me("Space")} to flip to the comp. Hover to magnify both.

`:""}
- +
- ${$e(r)}`}function Qe(){if(m?.type==="missing"){let r=t.missing.find((s)=>s.id===m.id);if(!r)return"";return`

Missing from the review

- - -
${N()?"":''}
`}if(m?.type==="region"){let r=Nn(m.id);if(!r)return"";let s=qe(t,r.id),l=u?.region&&u.id===r.id;return`

Set in code · ${Y(r.kind)}

${Y(r.name)}

-
${J(r.box)}
- ${l?`
${De.map((h)=>``).join("")}
`:s?`

Becomes ${Y(An[s.kind])}${s.feedback?`: “${Y(s.feedback)}”`:"."}${N()?"":''}

`:`

Checked in the first-viewport review, once the page is built.

${N()?"":''}
`} -
`}return`

Every outlined region above was on your list. Hover the comp to see what is set in code; click a region to make it an image.

${N()?"":``}${Q?'

Drag on the comp around what is missing.

':""}${t.missing.length?`
    ${t.missing.map((r)=>`
  • `).join("")}
`:""}
`}function xe(){let r=Pn(n,t),s=o.status?"This round can no longer be sent.":r.pending&&!r.hasChanges?`${r.pending} still to decide.`:r.mode==="approve"?"Approval confirms nothing is missing from the comp.":`${r.pending?`${r.pending} undecided stay open. `:""}The agent applies your notes and opens a new round.`,l=(h)=>{let f=zn(h,t),k=yn(h,t),x;if(h.role==="asset"&&h.preview.url){let c=hn(h.box);x=`${K(h,h.preview.url)}`}else{let c=ei(h.box,n.comp.width,n.comp.height,220,118),V=c.view;x=``}return``};return`
+ ${Dt(i)}`}function Ht(){if(b?.type==="missing"){let i=a.missing.find((s)=>s.id===b.id);if(!i)return"";return`

Missing from the review

+ + +
${O()?"":''}
`}if(b?.type==="region"){let i=Ne(b.id);if(!i)return"";let s=St(a,i.id),p=f?.region&&f.id===i.id;return`

Set in code · ${P(i.kind)}

${P(i.name)}

+
${D(i.box)}
+ ${p?`
${Yt.map((m)=>``).join("")}
`:s?`

Becomes ${P(Be[s.kind])}${s.feedback?`: “${P(s.feedback)}”`:"."}${O()?"":''}

`:`

Checked in the first-viewport review, once the page is built.

${O()?"":''}
`} +
`}return`

Every outlined region above was on your list. Hover the comp to see what is set in code; click a region to make it an image.

${O()?"":``}${q?'

Drag on the comp around what is missing.

':""}${a.missing.length?`
    ${a.missing.map((i)=>`
  • `).join("")}
`:""}
`}function ct(){let i=Qe(e,a),s=r.status?"This round can no longer be sent.":i.pending&&!i.hasChanges?`${i.pending} still to decide.`:i.mode==="approve"?"Approval confirms nothing is missing from the comp.":`${i.pending?`${i.pending} undecided stay open. `:""}The agent applies your notes and opens a new round.`,p=(m)=>{let w=$e(m,a),u=ye(m,a),c;if(m.role==="asset"&&m.preview.url){let x=me(m.box);c=`${F(m,m.preview.url)}`}else{let x=tn(m.box,e.comp.width,e.comp.height,220,118),T=x.view;c=``}return``};return`
-

${z?`Round ${n.round} · sent`:"Summary"}

-

${z?r.hasChanges?"Notes sent.":"Plan and assets approved.":r.pending?"Almost there.":"Your decisions."}

- ${z?`

${r.hasChanges?"The agent applies them and opens a new round for anything that changed.":"The agent continues to the first viewport."}${Qn?"":" This round is read-only."}

`:""} +

${M?`Round ${e.round} · sent`:"Summary"}

+

${M?i.hasChanges?"Notes sent.":"Plan and assets approved.":i.pending?"Almost there.":"Your decisions."}

+ ${M?`

${i.hasChanges?"The agent applies them and opens a new round for anything that changed.":"The agent continues to the first viewport."}${He?"":" This round is read-only."}

`:""}
-
${p.map(l).join("")}
+
${l.map(p).join("")}

Anything on the comp we didn't cover?

-
The approved comp${H({code:!0,interactive:!0})}
- ${Qe()} +
The approved comp${W({code:!0,interactive:!0})}
+ ${Ht()}
- ${z?"":`
${W?en():`

${Y(s)}

`}
`}`}function he(){if(!Z)return"";return``}function A(){I?.disconnect(),Wn?.();let s=a.activeElement?.id,l=v==="summary"?a.querySelector(".view-summary .screen")?.scrollTop??0:0;a.innerHTML=`
- ${R()}${Gn()} -
${v==="intro"?P():v==="stage"?Ge():xe()}
- ${he()} -
`,M=null;let h=a.querySelector(".screen");if(h&&l)h.scrollTop=l;if(s)a.getElementById(s)?.focus({preventScroll:!0});if(kn(),ke(),I=new ResizeObserver(ke),I.observe(a.querySelector(".screen")),Wn=Ye(a),!z)o.onDraftChange?.(structuredClone(t))}function ke(){let r=matchMedia("(max-width: 760px)").matches,s=a.querySelector(".figures[data-ratios]");if(s&&s.clientWidth){let h=s.dataset.ratios.split(",").map(Number),[f,k]=(s.dataset.natural??"0x0").split("x").map(Number),x=r?{direction:"column",sizes:h.map((c)=>({w:Math.min(s.clientWidth,360*c),h:Math.min(s.clientWidth,360*c)/c}))}:Ni(h,s.clientWidth,s.clientHeight,28,30,4,{w:f,h:k});s.dataset.direction=x.direction,s.querySelectorAll(":scope > .fig > .frame").forEach((c,V)=>{c.style.width=`${Math.floor(x.sizes[V].w)}px`,c.style.height=`${Math.floor(x.sizes[V].h)}px`}),F(s)}let l=a.querySelector(".figures.single");if(l?.clientWidth){let h=JSON.parse(l.dataset.box),f=l.closest(".stage"),k=f.clientHeight-36-28-(f.querySelector(".stage-head")?.offsetHeight??0)-(f.querySelector(".stage-foot")?.offsetHeight??0)-30-80,x=ei(h,n.comp.width,n.comp.height,Math.min(l.clientWidth,1120),r?320:Math.max(80,k)),c=l.querySelector(".frame"),V=c.querySelector("img"),O=c.querySelector(".focus-box"),L=x.view;c.style.width=`${Math.floor(x.width)}px`,c.style.height=`${Math.floor(x.height)}px`,V.style.cssText=`width:${100/L.w}%;left:${-100*L.x/L.w}%;top:${-100*L.y/L.h}%`,O.style.cssText=Sn({x:(h.x-L.x)/L.w,y:(h.y-L.y)/L.h,w:h.w/L.w,h:h.h/L.h}),F(l)}for(let h of a.querySelectorAll(".overlay-body .map, .intro-comp .map")){let f=h.parentElement,k=getComputedStyle(f),x=f.clientWidth-parseFloat(k.paddingLeft)-parseFloat(k.paddingRight),c=f.clientHeight-parseFloat(k.paddingTop)-parseFloat(k.paddingBottom);if(!x||!c)continue;let V=Math.min(x/n.comp.width,c/n.comp.height);h.style.width=`${n.comp.width*V}px`,h.style.height=`${n.comp.height*V}px`}}let $=78,D=3;function F(r){r.querySelectorAll(".frame").forEach((s)=>{s.querySelector(".lens")?.remove();let l=document.createElement("span");l.className="lens",l.setAttribute("aria-hidden","true");let h=document.createElement("span");h.className="lens-inner",h.style.width=`${s.clientWidth}px`,h.style.height=`${s.clientHeight}px`,s.querySelectorAll(":scope > .pic, :scope > .focus-box").forEach((f)=>h.append(f.cloneNode(!0))),l.append(h),s.append(l)})}function tn(r,s){a.querySelectorAll(".figures .frame").forEach((l)=>{let h=l.querySelector(".lens"),f=h?.querySelector(".lens-inner");if(!h||!f)return;let{clientWidth:k,clientHeight:x}=l;h.style.transform=`translate(${r*k-$}px, ${s*x-$}px)`;let c=Ki(r,s,k,x,$,D);f.style.transform=`translate(${c.x}px, ${c.y}px) scale(${D})`})}function kn(){let r=(k,x)=>a.getElementById(k)?.addEventListener("click",x);r("start",()=>{let k=p.find((x)=>yn(x,t)==="pending")??p[0];if(k)on("stage",k.id,"next");else on("summary")}),a.querySelectorAll("[data-go]").forEach((k)=>k.addEventListener("click",()=>{let x=k.dataset.go,c=p.findIndex((V)=>V.id===w);on("stage",x,v!=="stage"?"fade":p.findIndex((V)=>V.id===x)>=c?"next":"prev")})),r("to-summary",()=>on("summary",void 0,"next")),r("decide-yes",le),r("decide-no",()=>$n(rn(w)?.role==="asset"?"revise":"reclassify")),r("decide-other",()=>$n("revise")),r("decide-split",()=>$n("revise",void 0,!0)),r("decision-clear",()=>{let k=rn(w);if(k&&!N())Un($i(t,k.id),`Cleared: ${k.name}.`),A()}),r("form-cancel",()=>{u=null,A()}),a.getElementById("decision-form")?.addEventListener("submit",(k)=>{k.preventDefault(),On()}),a.getElementById("form-text")?.addEventListener("input",(k)=>{if(u)u.text=k.target.value}),a.querySelectorAll("[data-kind]").forEach((k)=>k.addEventListener("click",()=>{if(!u)return;u.kind=k.dataset.kind,a.querySelectorAll("[data-kind]").forEach((x)=>x.setAttribute("aria-pressed",String(x===k)))})),r("backdrop",()=>{let k=rn(w);if(!k)return;let x=["comp","light","dark"];xn[k.id]=x[(x.indexOf(xn[k.id]??"comp")+1)%3],A()}),r("undo",de),r("send",()=>void ie()),r("retry",()=>void ie()),r("reload",()=>location.reload());let s=()=>{Z=!0,A(),a.getElementById("close-map")?.focus()};if(r("open-map",s),r("open-map-bar",s),r("close-map",()=>{Z=!1,A()}),r("mark",()=>{if(N())return;Q=!Q,m=null,u=null,A()}),r("panel-done",()=>{m=null,u=null,A()}),r("region-image",()=>{if(m?.type==="region")$n("reclassify",m.id)}),r("region-keep",()=>{let k=m?.type==="region"?Nn(m.id):void 0;if(k&&!N())Un(ni(t,k.id,null),`${k.name} stays in code.`),A()}),r("missing-remove",()=>{if(m?.type!=="missing")return;let k=m.id;t={...t,missing:t.missing.filter((x)=>x.id!==k)},m=null,A()}),a.getElementById("missing-name")?.addEventListener("input",(k)=>{let x=t.missing.find((c)=>c.id===m?.id);if(x){x.name=k.target.value;let c=a.getElementById("send");if(c)c.disabled=!Pn(n,t).canSubmit||U||!!o.status;o.onDraftChange?.(structuredClone(t))}}),a.getElementById("missing-feedback")?.addEventListener("input",(k)=>{let x=t.missing.find((c)=>c.id===m?.id);if(x)x.feedback=k.target.value,o.onDraftChange?.(structuredClone(t))}),N())a.querySelectorAll("#decide-yes,#decide-no,#decide-other,#decide-split,#decision-clear,#mark,#region-image").forEach((k)=>k.disabled=!0);a.querySelectorAll(".map [data-item]").forEach((k)=>k.addEventListener("click",()=>{if(!Q)on("stage",k.dataset.item,"fade")}));let l=(k)=>{if(Q)return;if(m=k,u=null,v!=="summary")v="summary",Z=!1,M=qn()?null:"fade";A(),a.querySelector(".coverage")?.scrollIntoView({block:"start"})};a.querySelectorAll("[data-region]").forEach((k)=>k.addEventListener("click",()=>l({type:"region",id:k.dataset.region}))),a.querySelectorAll("[data-missing]").forEach((k)=>k.addEventListener("click",()=>l({type:"missing",id:k.dataset.missing})));let h=a.querySelector(".figures");h?.querySelectorAll(":scope > .fig > .frame").forEach((k)=>{k.addEventListener("pointerenter",(x)=>{if(x.pointerType==="mouse")h.classList.add("looking")}),k.addEventListener("pointerleave",()=>h.classList.remove("looking")),k.addEventListener("pointermove",(x)=>{let c=k.getBoundingClientRect();tn((x.clientX-c.left)/c.width,(x.clientY-c.top)/c.height)})});let f=a.getElementById("summary-map");if(f){let k=(V)=>{let O=f.getBoundingClientRect();return{x:Math.max(0,Math.min(1,(V.clientX-O.left)/O.width)),y:Math.max(0,Math.min(1,(V.clientY-O.top)/O.height))}},x=null,c=null;f.addEventListener("pointerdown",(V)=>{if(!Q)return;x=k(V),c=null,f.setPointerCapture(V.pointerId),V.preventDefault()}),f.addEventListener("pointermove",(V)=>{if(!x)return;let O=k(V);c={x:Math.min(x.x,O.x),y:Math.min(x.y,O.y),w:Math.abs(O.x-x.x),h:Math.abs(O.y-x.y)};let L=a.querySelector(".draw-box");L.hidden=!1,L.style.cssText=Sn(c)}),f.addEventListener("pointerup",()=>{if(c&&c.w>0.01&&c.h>0.01)G(c);x=null,c=null}),f.addEventListener("pointercancel",()=>{x=null,c=null,A()})}}function Kn(r){if(dn===r)return;dn=r,a.querySelectorAll('[data-role="generated"] .frame').forEach((l)=>l.classList.toggle("flipped",r));let s=a.querySelector('[data-role="generated"] figcaption .eyebrow');if(s)s.textContent=r?"In the comp":Ve(w??"",g)?.beforeUrl?"After":"Generated";if(r&&!Tn)Tn=!0,Oi.set("impeccable.review.flipHint","1"),a.querySelector(".hint")?.classList.add("gone")}let ae=(r)=>{let s=r;if(!i.isConnected||s.defaultPrevented)return;let l=s.composedPath()[0],h=l instanceof HTMLTextAreaElement||l instanceof HTMLInputElement;if(s.key==="Escape"){if(Z)s.preventDefault(),Z=!1,A();else if(u)s.preventDefault(),u=null,A();else if(Q)s.preventDefault(),Q=!1,A();else if(m)s.preventDefault(),m=null,A();return}if(s.key==="Enter"&&(s.metaKey||s.ctrlKey)&&u){s.preventDefault(),On();return}if(h||s.altKey||s.isComposing)return;if((s.metaKey||s.ctrlKey)&&s.key.toLowerCase()==="z"){if(W)s.preventDefault(),de();return}if(s.metaKey||s.ctrlKey)return;if(v==="intro"&&s.key==="Enter"&&l?.tagName!=="BUTTON"){s.preventDefault(),a.getElementById("start")?.click();return}if(Z||u)return;let f=s.key.toLowerCase();if(s.key===" "&&v==="stage"&&rn(w)?.role==="asset"&&l?.tagName!=="BUTTON"&&l?.tagName!=="A"){if(s.preventDefault(),!s.repeat)Kn(!0);return}if(s.key===" "&&v==="stage"&&rn(w)?.role==="asset"){if(s.preventDefault(),!s.repeat)Kn(!0);return}if(f==="c"&&v!=="intro"){s.preventDefault(),Z=!0,A();return}if(v!=="stage"||N()){if(v==="summary"&&(f==="k"||s.key==="ArrowLeft")&&p.length&&!N())s.preventDefault(),on("stage",p[p.length-1].id,"prev");return}if(f==="a")s.preventDefault(),le();else if(f==="n")s.preventDefault(),a.getElementById("decide-no")?.click();else if(f==="f"&&rn(w)?.role==="plan")s.preventDefault(),$n("revise");else if(f==="s"&&rn(w)?.role==="asset")s.preventDefault(),$n("revise",void 0,!0);else if(f==="j"||s.key==="ArrowRight")s.preventDefault(),ee(1);else if(f==="k"||s.key==="ArrowLeft")s.preventDefault(),ee(-1)},oe=(r)=>{if(r.key===" "&&dn)r.preventDefault(),Kn(!1)},vn=()=>Kn(!1);return document.addEventListener("keydown",ae),document.addEventListener("keyup",oe),window.addEventListener("blur",vn),A(),{destroy(){I?.disconnect(),Wn?.(),document.removeEventListener("keydown",ae),document.removeEventListener("keyup",oe),window.removeEventListener("blur",vn),a.replaceChildren()},getDraft(){return structuredClone(t)}}}var T=(i)=>i.replace(/[&<>"']/g,(n)=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[n]),Ln=(i)=>`${i*100}%`,Mn=(i)=>{let n=new URL(i,location.href);if(!["http:","https:"].includes(n.protocol))throw Error("Unsupported preview URL");return T(n.href)};function Ri(i,n,o){if(Me(n))return Di(i,n,{...o,history:o.history,initialDraft:o.initialDraft,onDraftChange:o.onDraftChange,onSubmit:o.onSubmit});let a=i.attachShadow({mode:"open"}),t=structuredClone(o.initialDraft??mi(n)),p=n.stage==="hero"&&n.components.length===1&&!t.missing.length,y=()=>[...n.components].sort((X,J)=>bn(X,t,o.history).priority-bn(J,t,o.history).priority),g=y().find((X)=>bn(X,t,o.history).kind!=="approved")?.id??n.components[0]?.id,b=Cn(n,t).pending?"pending":"reviewed",z=!1,v=!1,w=o.completed??!1,M="",u={},m=!!o.completed||!Cn(n,t).pending,Q=null,Z=!0,dn=/Mac|iPhone|iPad/.test(navigator.platform)?"⌘Enter":"Ctrl+Enter",xn=!1,U=!1,Qn=!1,Yn=null,W=!1,en=!0,Tn=!1,I="comp",Wn=I,ln="fit",Xn="checker",C=!1,qn="isolated",rn,Nn="fit",N=null,hn=null,an=null,ne=null,Zn='',on='',ee=(X,J)=>{if(X.stage==="hero")return"";let K=ye(X,J);if(!K.related.length)return"";let H=K.related.map((R)=>T(R.name)).join(" · ");return`

Reviewing ${T(K.description||J.name)}

Outlined · reviewed separately ${H}

${K.excluded.length?`

Hidden in this preview: ${K.excluded.map((R)=>T(R.name)).join(" · ")}

`:""}
`},In=(X)=>`left:${Ln(X.x)};top:${Ln(X.y)};width:${Ln(X.w)};height:${Ln(X.h)}`,Un=(X,J)=>X.stage==="hero"?"":ye(X,J).related.map((K)=>{let H=J.box,R=K.box,Gn=Math.max(H.x,R.x),P=Math.max(H.y,R.y),re={x:(Gn-H.x)/H.w,y:(P-H.y)/H.h,w:Math.max(0,Math.min(H.x+H.w,R.x+R.w)-Gn)/H.w,h:Math.max(0,Math.min(H.y+H.h,R.y+R.h)-P)/H.h};return`${T(K.name)}`}).join("");function Jn(X){a.getElementById(X)?.focus({preventScroll:!0})}function le(X){let J=yi(n,t,X);if(m=!J,J)g=J;I="component",C=!1,xn=!1,ln="fit",qn="isolated",Z=!0,b=m?"reviewed":"pending";let K=()=>{G(),Jn(m?"review-summary":u[g]?"feedback":"approve")};if(m&&U&&Yn)Yn(K);else K()}async function $n(){if(v||w||C||Object.keys(u).length)return;v=!0,M="",G();try{await o.onSubmit(fi(n,t)),w=!0,m=!0,z=!1,b="reviewed"}catch(X){M=X instanceof Error?X.message:"Could not save. Try again."}finally{v=!1,G()}}function On(X){if(v||w||C||Qn)return;let J=n.components.find((P)=>P.id===g);if(!J||!pe(n,t,J,Z,Object.keys(u)).length)return;let K=t.decisions[J.id],H=K?.revision===J.revision?K:void 0,R=pe(n,t,J,Z,Object.keys(u));Q={id:J.id,name:R.length>1?`${J.reviewGroup} · ${R.length} instances`:J.name,action:X,previous:Object.fromEntries(R.map((P)=>[P.id,t.decisions[P.id]?{...t.decisions[P.id]}:void 0]))};let Gn=u[J.id]??H;for(let P of R)t.decisions[P.id]={revision:P.revision,action:X,feedback:X==="revise"?Gn?.feedback??"":"",split:X==="revise"&&(Gn?.split??!1)};if(delete u[J.id],Tn)en=!0,Tn=!1;if(p)t.inventoryConfirmed=X==="approve",Q=null,$n();else le(J.id)}function de(){if(v||w||C||Qn)return;let X=n.components.find((H)=>H.id===g);if(!X||!pe(n,t,X,Z,Object.keys(u)).length)return;let J=t.decisions[X.id],K=J?.revision===X.revision?J:void 0;if(u[X.id]??={feedback:K?.feedback??"",split:K?.split??!1},en&&(a.querySelector(".workbench")?.clientHeight??0)<420)Tn=!0,en=!1;m=!1,G(),Jn("feedback")}function ie(X){let J=`missing-${crypto.randomUUID()}`;t.missing.push({id:J,name:"Missing component",feedback:"",box:X}),t.inventoryConfirmed=!1,m=!1,g=J,I="component",z=!1,N=null,hn=null,G(),a.querySelector("#missing-name")?.focus()}function G(){if(an?.disconnect(),ne?.(),w||m&&!p)U=!1;let X=a.activeElement,J=X?.id,K=X?.dataset.select,H=window.scrollX,R=window.scrollY,Gn=a.querySelector(".inventory")?.scrollLeft??0,P=rn===g,re=I==="component"&&(!P||Wn!==I);Wn=I;let $e=P?a.querySelector(".inspection-content")?.scrollTop??0:0,Ge=P&&(a.querySelector(".changed-files")?.open??!1),Qe=a.querySelector(".comparison-slot")?.clientHeight??200,xe=a.querySelector(".pan-viewport"),he=rn===g&&Nn===ln,A=he?xe?.scrollLeft??0:0,ke=he?xe?.scrollTop??0:0;rn=g,Nn=ln;let $=n.components.find((e)=>e.id===g),D=t.missing.find((e)=>e.id===g),F=zi(n,t,o.history),tn=F.find((e)=>e.members.some((d)=>d.id===g)),kn=!!tn&&tn.members.length>1&&Z,Kn=kn?tn.box:$?.box??D?.box,ae=tn?F.indexOf(tn)+1:F.length+t.missing.findIndex((e)=>e.id===g)+1,oe=$?t.decisions[$.id]:void 0,vn=oe?.revision===$?.revision?oe:void 0,r=$?u[$.id]:void 0,s=Object.keys(u).length>0,l=$?fe(n,$):[],h=$?pe(n,t,$,Z,Object.keys(u)):[],f=$?!n.components.some((e)=>!h.some((d)=>d.id===e.id)&&bn(e,t).kind==="pending"):!1,k=Q&&!w?`
${T(Q.name)} ${Q.action==="approve"?"approved":"flagged for repair"}.
`:"",x=Cn(n,t),c=o.history,V=$?we($.id,c):void 0,O=c?.packet.components.find((e)=>e.id===$?.id),L=C&&!!O,q=L?O:$,pn=L?c.packet:n,oi=Object.values(c?.changes??{}),ti=oi.filter((e)=>e.kind==="changed").length,si=oi.filter((e)=>e.kind==="added").length,Ze=n.components.filter((e)=>bn(e,t,c).kind==="approved"&&we(e.id,c).carried).length,Ue=(e)=>{let d=bn(e,t,c);return w&&d.kind==="feedback"?{...d,label:"Changes requested"}:d},te=F.filter((e)=>e.kind==="pending").length,Fi=F.length-te+t.missing.length,pi=F.filter((e)=>b==="all"||e.kind==="pending"===(b==="pending")).map((e)=>e.representative),Ci=(e)=>F.find((d)=>d.members.some((j)=>j.id===e))?.label??e,Pi=[x.revisions+t.missing.length?`${x.revisions+t.missing.length} feedback ready`:"",Ze?`${Ze} ${Ze===1?"approval":"approvals"} kept`:"",ti?`${ti} changed`:"",si?`${si} added`:"",c?.removed.length?`${c.removed.length} removed`:""].filter(Boolean).join(" · "),Si=M||(s?"Save or cancel your open feedback before sending.":w?o.preview?"Preview submitted. No run changed.":"Review submitted.":x.hasFeedback?"Ready to send for corrections.":x.pending?`${te} left to review`:!t.inventoryConfirmed?"Confirm the map is complete.":"Ready to continue."),Vn=q?Fn(q):null,Ae=q?.preview.kind==="image"&&!Vn?.code,Le=Ae||q?.material?.alpha==="transparent",mn=!!(q?.context&&qn==="context"),li=q&&(mn?q.context?.kind!=="image":q.preview.kind==="page"),Ne=mn&&q?.context?q.context.url:q?.preview.url,di=q?ye(pn,q):null,nr=Vn?.code?`${Vn.label} · ${Vn.captured?"captured from code":"live preview"}`:q?.material?`${q.material.alpha==="transparent"?"Transparent":q.material.alpha==="opaque"?"Opaque":"Transparency unverified"} ${q.material.format}`:"Raster · transparency unverified";a.innerHTML=`
-

${w?"Review record.":p?"Review the assembled page.":"Review the components."}

${T(n.title)} · Round ${n.round}

${w?'Submitted · read-only':o.preview?'Interactive preview':""}
- ${o.preview?'

Historical hotel artwork for testing this interface. Decisions stay in this preview; no run is changed.

':""} - ${c&&!p?`

${te} ${te===1?"item":"items"} to review${Pi}

${x.pending?``:""}${c.removed.length?`
Removed from the map

${c.removed.map((e)=>T(e.name)).join(" · ")}. Confirm these omissions are intentional before accepting the map.

`:""}
`:""} - ${!p?`
`:""} -
${!p?` + ${M?"":`
${V?ne():`

${P(s)}

`}
`}`}function mt(){if(!I)return"";return``}function j(){G?.disconnect(),We?.();let s=o.activeElement?.id,p=h==="summary"?o.querySelector(".view-summary .screen")?.scrollTop??0:0;o.innerHTML=`
+ ${_()}${Ae()} +
${h==="intro"?Z():h==="stage"?At():ct()}
+ ${mt()} +
`,z=null;let m=o.querySelector(".screen");if(m&&p)m.scrollTop=p;if(s)o.getElementById(s)?.focus({preventScroll:!0});if(ue(),ut(),G=new ResizeObserver(ut),G.observe(o.querySelector(".screen")),We=Ct(o),!M)r.onDraftChange?.(structuredClone(a))}function ut(){let i=matchMedia("(max-width: 760px)").matches,s=o.querySelector(".figures[data-ratios]");if(s&&s.clientWidth){let m=s.dataset.ratios.split(",").map(Number),[w,u]=(s.dataset.natural??"0x0").split("x").map(Number),c=i?{direction:"column",sizes:m.map((x)=>({w:Math.min(s.clientWidth,360*x),h:Math.min(s.clientWidth,360*x)/x}))}:On(m,s.clientWidth,s.clientHeight,28,30,4,{w,h:u});s.dataset.direction=c.direction,s.querySelectorAll(":scope > .fig > .frame").forEach((x,T)=>{x.style.width=`${Math.floor(c.sizes[T].w)}px`,x.style.height=`${Math.floor(c.sizes[T].h)}px`}),J(s)}let p=o.querySelector(".figures.single");if(p?.clientWidth){let m=JSON.parse(p.dataset.box),w=p.closest(".stage"),u=w.clientHeight-36-28-(w.querySelector(".stage-head")?.offsetHeight??0)-(w.querySelector(".stage-foot")?.offsetHeight??0)-30-80,c=tn(m,e.comp.width,e.comp.height,Math.min(p.clientWidth,1120),i?320:Math.max(80,u)),x=p.querySelector(".frame"),T=x.querySelector("img"),Y=x.querySelector(".focus-box"),N=c.view;x.style.width=`${Math.floor(c.width)}px`,x.style.height=`${Math.floor(c.height)}px`,T.style.cssText=`width:${100/N.w}%;left:${-100*N.x/N.w}%;top:${-100*N.y/N.h}%`,Y.style.cssText=Ze({x:(m.x-N.x)/N.w,y:(m.y-N.y)/N.h,w:m.w/N.w,h:m.h/N.h}),J(p)}for(let m of o.querySelectorAll(".overlay-body .map, .intro-comp .map")){let w=m.parentElement,u=getComputedStyle(w),c=w.clientWidth-parseFloat(u.paddingLeft)-parseFloat(u.paddingRight),x=w.clientHeight-parseFloat(u.paddingTop)-parseFloat(u.paddingBottom);if(!c||!x)continue;let T=Math.min(c/e.comp.width,x/e.comp.height);m.style.width=`${e.comp.width*T}px`,m.style.height=`${e.comp.height*T}px`}}let A=78,X=3;function J(i){i.querySelectorAll(".frame").forEach((s)=>{s.querySelector(".lens")?.remove();let p=document.createElement("span");p.className="lens",p.setAttribute("aria-hidden","true");let m=document.createElement("span");m.className="lens-inner",m.style.width=`${s.clientWidth}px`,m.style.height=`${s.clientHeight}px`,s.querySelectorAll(":scope > .pic, :scope > .focus-box").forEach((w)=>m.append(w.cloneNode(!0))),p.append(m),s.append(p)})}function ae(i,s){o.querySelectorAll(".figures .frame").forEach((p)=>{let m=p.querySelector(".lens"),w=m?.querySelector(".lens-inner");if(!m||!w)return;let{clientWidth:u,clientHeight:c}=p;m.style.transform=`translate(${i*u-A}px, ${s*c-A}px)`;let x=Fn(i,s,u,c,A,X);w.style.transform=`translate(${x.x}px, ${x.y}px) scale(${X})`})}function ue(){let i=(u,c)=>o.getElementById(u)?.addEventListener("click",c);i("start",()=>{let u=l.find((c)=>ye(c,a)==="pending")??l[0];if(u)re("stage",u.id,"next");else re("summary")}),o.querySelectorAll("[data-go]").forEach((u)=>u.addEventListener("click",()=>{let c=u.dataset.go,x=l.findIndex((T)=>T.id===k);re("stage",c,h!=="stage"?"fade":l.findIndex((T)=>T.id===c)>=x?"next":"prev")})),i("to-summary",()=>re("summary",void 0,"next")),i("decide-yes",pt),i("decide-no",()=>De(ie(k)?.role==="asset"?"revise":"reclassify")),i("decide-other",()=>De("revise")),i("decide-split",()=>De("revise",void 0,!0)),i("decision-clear",()=>{let u=ie(k);if(u&&!O())Ie(An(a,u.id),`Cleared: ${u.name}.`),j()}),i("form-cancel",()=>{f=null,j()}),o.getElementById("decision-form")?.addEventListener("submit",(u)=>{u.preventDefault(),Ge()}),o.getElementById("form-text")?.addEventListener("input",(u)=>{if(f)f.text=u.target.value}),o.querySelectorAll("[data-kind]").forEach((u)=>u.addEventListener("click",()=>{if(!f)return;f.kind=u.dataset.kind,o.querySelectorAll("[data-kind]").forEach((c)=>c.setAttribute("aria-pressed",String(c===u)))})),i("backdrop",()=>{let u=ie(k);if(!u)return;let c=["comp","light","dark"];ce[u.id]=c[(c.indexOf(ce[u.id]??"comp")+1)%3],j()}),i("undo",dt),i("send",()=>void nt()),i("retry",()=>void nt()),i("reload",()=>location.reload());let s=()=>{I=!0,j(),o.getElementById("close-map")?.focus()};if(i("open-map",s),i("open-map-bar",s),i("close-map",()=>{I=!1,j()}),i("mark",()=>{if(O())return;q=!q,b=null,f=null,j()}),i("panel-done",()=>{b=null,f=null,j()}),i("region-image",()=>{if(b?.type==="region")De("reclassify",b.id)}),i("region-keep",()=>{let u=b?.type==="region"?Ne(b.id):void 0;if(u&&!O())Ie(en(a,u.id,null),`${u.name} stays in code.`),j()}),i("missing-remove",()=>{if(b?.type!=="missing")return;let u=b.id;a={...a,missing:a.missing.filter((c)=>c.id!==u)},b=null,j()}),o.getElementById("missing-name")?.addEventListener("input",(u)=>{let c=a.missing.find((x)=>x.id===b?.id);if(c){c.name=u.target.value;let x=o.getElementById("send");if(x)x.disabled=!Qe(e,a).canSubmit||B||!!r.status;r.onDraftChange?.(structuredClone(a))}}),o.getElementById("missing-feedback")?.addEventListener("input",(u)=>{let c=a.missing.find((x)=>x.id===b?.id);if(c)c.feedback=u.target.value,r.onDraftChange?.(structuredClone(a))}),O())o.querySelectorAll("#decide-yes,#decide-no,#decide-other,#decide-split,#decision-clear,#mark,#region-image").forEach((u)=>u.disabled=!0);o.querySelectorAll(".map [data-item]").forEach((u)=>u.addEventListener("click",()=>{if(!q)re("stage",u.dataset.item,"fade")}));let p=(u)=>{if(q)return;if(b=u,f=null,h!=="summary")h="summary",I=!1,z=Se()?null:"fade";j(),o.querySelector(".coverage")?.scrollIntoView({block:"start"})};o.querySelectorAll("[data-region]").forEach((u)=>u.addEventListener("click",()=>p({type:"region",id:u.dataset.region}))),o.querySelectorAll("[data-missing]").forEach((u)=>u.addEventListener("click",()=>p({type:"missing",id:u.dataset.missing})));let m=o.querySelector(".figures");m?.querySelectorAll(":scope > .fig > .frame").forEach((u)=>{u.addEventListener("pointerenter",(c)=>{if(c.pointerType==="mouse")m.classList.add("looking")}),u.addEventListener("pointerleave",()=>m.classList.remove("looking")),u.addEventListener("pointermove",(c)=>{let x=u.getBoundingClientRect();ae((c.clientX-x.left)/x.width,(c.clientY-x.top)/x.height)})});let w=o.getElementById("summary-map");if(w){let u=(T)=>{let Y=w.getBoundingClientRect();return{x:Math.max(0,Math.min(1,(T.clientX-Y.left)/Y.width)),y:Math.max(0,Math.min(1,(T.clientY-Y.top)/Y.height))}},c=null,x=null;w.addEventListener("pointerdown",(T)=>{if(!q)return;c=u(T),x=null,w.setPointerCapture(T.pointerId),T.preventDefault()}),w.addEventListener("pointermove",(T)=>{if(!c)return;let Y=u(T);x={x:Math.min(c.x,Y.x),y:Math.min(c.y,Y.y),w:Math.abs(Y.x-c.x),h:Math.abs(Y.y-c.y)};let N=o.querySelector(".draw-box");N.hidden=!1,N.style.cssText=Ze(x)}),w.addEventListener("pointerup",()=>{if(x&&x.w>0.01&&x.h>0.01)H(x);c=null,x=null}),w.addEventListener("pointercancel",()=>{c=null,x=null,j()})}}function Oe(i){if(de===i)return;de=i,o.querySelectorAll('[data-role="generated"] .frame').forEach((p)=>p.classList.toggle("flipped",i));let s=o.querySelector('[data-role="generated"] figcaption .eyebrow');if(s)s.textContent=i?"In the comp":Lt(k??"",g)?.beforeUrl?"After":"Generated";if(i&&!ze)ze=!0,Yn.set("impeccable.review.flipHint","1"),o.querySelector(".hint")?.classList.add("gone")}let ot=(i)=>{let s=i;if(!n.isConnected||s.defaultPrevented)return;let p=s.composedPath()[0],m=p instanceof HTMLTextAreaElement||p instanceof HTMLInputElement;if(s.key==="Escape"){if(I)s.preventDefault(),I=!1,j();else if(f)s.preventDefault(),f=null,j();else if(q)s.preventDefault(),q=!1,j();else if(b)s.preventDefault(),b=null,j();return}if(s.key==="Enter"&&(s.metaKey||s.ctrlKey)&&f){s.preventDefault(),Ge();return}if(m||s.altKey||s.isComposing)return;if((s.metaKey||s.ctrlKey)&&s.key.toLowerCase()==="z"){if(V)s.preventDefault(),dt();return}if(s.metaKey||s.ctrlKey)return;if(h==="intro"&&s.key==="Enter"&&p?.tagName!=="BUTTON"){s.preventDefault(),o.getElementById("start")?.click();return}if(I||f)return;let w=s.key.toLowerCase();if(s.key===" "&&h==="stage"&&ie(k)?.role==="asset"&&p?.tagName!=="BUTTON"&&p?.tagName!=="A"){if(s.preventDefault(),!s.repeat)Oe(!0);return}if(s.key===" "&&h==="stage"&&ie(k)?.role==="asset"){if(s.preventDefault(),!s.repeat)Oe(!0);return}if(w==="c"&&h!=="intro"){s.preventDefault(),I=!0,j();return}if(h!=="stage"||O()){if(h==="summary"&&(w==="k"||s.key==="ArrowLeft")&&l.length&&!O())s.preventDefault(),re("stage",l[l.length-1].id,"prev");return}if(w==="a")s.preventDefault(),pt();else if(w==="n")s.preventDefault(),o.getElementById("decide-no")?.click();else if(w==="f"&&ie(k)?.role==="plan")s.preventDefault(),De("revise");else if(w==="s"&&ie(k)?.role==="asset")s.preventDefault(),De("revise",void 0,!0);else if(w==="j"||s.key==="ArrowRight")s.preventDefault(),tt(1);else if(w==="k"||s.key==="ArrowLeft")s.preventDefault(),tt(-1)},rt=(i)=>{if(i.key===" "&&de)i.preventDefault(),Oe(!1)},he=()=>Oe(!1);return document.addEventListener("keydown",ot),document.addEventListener("keyup",rt),window.addEventListener("blur",he),j(),{destroy(){G?.disconnect(),We?.(),document.removeEventListener("keydown",ot),document.removeEventListener("keyup",rt),window.removeEventListener("blur",he),o.replaceChildren()},getDraft(){return structuredClone(a)}}}var S=(n)=>n.replace(/[&<>"']/g,(e)=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[e]),je=(n)=>`${n*100}%`,Ee=(n)=>{let e=new URL(n,location.href);if(!["http:","https:"].includes(e.protocol))throw Error("Unsupported preview URL");return S(e.href)};function _n(n,e,r){if(Et(e))return Xn(n,e,{...r,history:r.history,initialDraft:r.initialDraft,onDraftChange:r.onDraftChange,onSubmit:r.onSubmit});let o=n.attachShadow({mode:"open"}),a=structuredClone(r.initialDraft??kn(e)),l=e.stage==="hero"&&e.components.length===1&&!a.missing.length,y=()=>[...e.components].sort((R,D)=>ve(R,a,r.history).priority-ve(D,a,r.history).priority),g=y().find((R)=>ve(R,a,r.history).kind!=="approved")?.id??e.components[0]?.id,v=Je(e,a).pending?"pending":"reviewed",M=!1,h=!1,k=r.completed??!1,z="",f={},b=!!r.completed||!Je(e,a).pending,q=null,I=!0,de=/Mac|iPhone|iPad/.test(navigator.platform)?"⌘Enter":"Ctrl+Enter",ce=!1,B=!1,He=!1,Ce=null,V=!1,ne=!0,ze=!1,G="comp",We=G,pe="fit",Pe="checker",Q=!1,Se="isolated",ie,Ne="fit",O=null,me=null,oe=null,et=null,qe='',re='',tt=(R,D)=>{if(R.stage==="hero")return"";let F=yt(R,D);if(!F.related.length)return"";let W=F.related.map((_)=>S(_.name)).join(" · ");return`

Reviewing ${S(F.description||D.name)}

Outlined · reviewed separately ${W}

${F.excluded.length?`

Hidden in this preview: ${F.excluded.map((_)=>S(_.name)).join(" · ")}

`:""}
`},Ve=(R)=>`left:${je(R.x)};top:${je(R.y)};width:${je(R.w)};height:${je(R.h)}`,Ie=(R,D)=>R.stage==="hero"?"":yt(R,D).related.map((F)=>{let W=D.box,_=F.box,Ae=Math.max(W.x,_.x),Z=Math.max(W.y,_.y),it={x:(Ae-W.x)/W.w,y:(Z-W.y)/W.h,w:Math.max(0,Math.min(W.x+W.w,_.x+_.w)-Ae)/W.w,h:Math.max(0,Math.min(W.y+W.h,_.y+_.h)-Z)/W.h};return`${S(F.name)}`}).join("");function Re(R){o.getElementById(R)?.focus({preventScroll:!0})}function pt(R){let D=$n(e,a,R);if(b=!D,D)g=D;G="component",Q=!1,ce=!1,pe="fit",Se="isolated",I=!0,v=b?"reviewed":"pending";let F=()=>{H(),Re(b?"review-summary":f[g]?"feedback":"approve")};if(b&&B&&Ce)Ce(F);else F()}async function De(){if(h||k||Q||Object.keys(f).length)return;h=!0,z="",H();try{await r.onSubmit(yn(e,a)),k=!0,b=!0,M=!1,v="reviewed"}catch(R){z=R instanceof Error?R.message:"Could not save. Try again."}finally{h=!1,H()}}function Ge(R){if(h||k||Q||He)return;let D=e.components.find((Z)=>Z.id===g);if(!D||!lt(e,a,D,I,Object.keys(f)).length)return;let F=a.decisions[D.id],W=F?.revision===D.revision?F:void 0,_=lt(e,a,D,I,Object.keys(f));q={id:D.id,name:_.length>1?`${D.reviewGroup} · ${_.length} instances`:D.name,action:R,previous:Object.fromEntries(_.map((Z)=>[Z.id,a.decisions[Z.id]?{...a.decisions[Z.id]}:void 0]))};let Ae=f[D.id]??W;for(let Z of _)a.decisions[Z.id]={revision:Z.revision,action:R,feedback:R==="revise"?Ae?.feedback??"":"",split:R==="revise"&&(Ae?.split??!1)};if(delete f[D.id],ze)ne=!0,ze=!1;if(l)a.inventoryConfirmed=R==="approve",q=null,De();else pt(D.id)}function dt(){if(h||k||Q||He)return;let R=e.components.find((W)=>W.id===g);if(!R||!lt(e,a,R,I,Object.keys(f)).length)return;let D=a.decisions[R.id],F=D?.revision===R.revision?D:void 0;if(f[R.id]??={feedback:F?.feedback??"",split:F?.split??!1},ne&&(o.querySelector(".workbench")?.clientHeight??0)<420)ze=!0,ne=!1;b=!1,H(),Re("feedback")}function nt(R){let D=`missing-${crypto.randomUUID()}`;a.missing.push({id:D,name:"Missing component",feedback:"",box:R}),a.inventoryConfirmed=!1,b=!1,g=D,G="component",M=!1,O=null,me=null,H(),o.querySelector("#missing-name")?.focus()}function H(){if(oe?.disconnect(),et?.(),k||b&&!l)B=!1;let R=o.activeElement,D=R?.id,F=R?.dataset.select,{scrollX:W,scrollY:_}=window,Ae=o.querySelector(".inventory")?.scrollLeft??0,Z=ie===g,it=G==="component"&&(!Z||We!==G);We=G;let Dt=Z?o.querySelector(".inspection-content")?.scrollTop??0:0,At=Z&&(o.querySelector(".changed-files")?.open??!1),Ht=o.querySelector(".comparison-slot")?.clientHeight??200,ct=o.querySelector(".pan-viewport"),mt=ie===g&&Ne===pe,j=mt?ct?.scrollLeft??0:0,ut=mt?ct?.scrollTop??0:0;ie=g,Ne=pe;let A=e.components.find((t)=>t.id===g),X=a.missing.find((t)=>t.id===g),J=Mn(e,a,r.history),ae=J.find((t)=>t.members.some((d)=>d.id===g)),ue=!!ae&&ae.members.length>1&&I,Oe=ue?ae.box:A?.box??X?.box,ot=ae?J.indexOf(ae)+1:J.length+a.missing.findIndex((t)=>t.id===g)+1,rt=A?a.decisions[A.id]:void 0,he=rt?.revision===A?.revision?rt:void 0,i=A?f[A.id]:void 0,s=Object.keys(f).length>0,p=A?wt(e,A):[],m=A?lt(e,a,A,I,Object.keys(f)):[],w=A?!e.components.some((t)=>!m.some((d)=>d.id===t.id)&&ve(t,a).kind==="pending"):!1,u=q&&!k?`
${S(q.name)} ${q.action==="approve"?"approved":"flagged for repair"}.
`:"",c=Je(e,a),x=r.history,T=A?kt(A.id,x):void 0,Y=x?.packet.components.find((t)=>t.id===A?.id),N=Q&&!!Y,L=N?Y:A,le=N?x.packet:e,an=Object.values(x?.changes??{}),sn=an.filter((t)=>t.kind==="changed").length,ln=an.filter((t)=>t.kind==="added").length,qt=e.components.filter((t)=>ve(t,a,x).kind==="approved"&&kt(t.id,x).carried).length,It=(t)=>{let d=ve(t,a,x);return k&&d.kind==="feedback"?{...d,label:"Changes requested"}:d},at=J.filter((t)=>t.kind==="pending").length,Jn=J.length-at+a.missing.length,pn=J.filter((t)=>v==="all"||t.kind==="pending"===(v==="pending")).map((t)=>t.representative),Qn=(t)=>J.find((d)=>d.members.some((E)=>E.id===t))?.label??t,Zn=[c.revisions+a.missing.length?`${c.revisions+a.missing.length} feedback ready`:"",qt?`${qt} ${qt===1?"approval":"approvals"} kept`:"",sn?`${sn} changed`:"",ln?`${ln} added`:"",x?.removed.length?`${x.removed.length} removed`:""].filter(Boolean).join(" · "),ei=z||(s?"Save or cancel your open feedback before sending.":k?r.preview?"Preview submitted. No run changed.":"Review submitted.":c.hasFeedback?"Ready to send for corrections.":c.pending?`${at} left to review`:!a.inventoryConfirmed?"Confirm the map is complete.":"Ready to continue."),Le=L?_e(L):null,Bt=L?.preview.kind==="image"&&!Le?.code,jt=Bt||L?.material?.alpha==="transparent",be=!!(L?.context&&Se==="context"),dn=L&&(be?L.context?.kind!=="image":L.preview.kind==="page"),Nt=be&&L?.context?L.context.url:L?.preview.url,cn=L?yt(le,L):null,ti=Le?.code?`${Le.label} · ${Le.captured?"captured from code":"live preview"}`:L?.material?`${L.material.alpha==="transparent"?"Transparent":L.material.alpha==="opaque"?"Opaque":"Transparency unverified"} ${L.material.format}`:"Raster · transparency unverified";o.innerHTML=`
+

${k?"Review record.":l?"Review the assembled page.":"Review the components."}

${S(e.title)} · Round ${e.round}

${k?'Submitted · read-only':r.preview?'Interactive preview':""}
+ ${r.preview?'

Historical hotel artwork for testing this interface. Decisions stay in this preview; no run is changed.

':""} + ${x&&!l?`

${at} ${at===1?"item":"items"} to review${Zn}

${c.pending?``:""}${x.removed.length?`
Removed from the map

${x.removed.map((t)=>S(t.name)).join(" · ")}. Confirm these omissions are intentional before accepting the map.

`:""}
`:""} + ${!l?`
`:""} +
${!l?`
-

Approved comp

${!w?``:""}
-
- Approved composition for ${T(n.title)} - ${Kn&&!m?`
`:""} - ${F.map((e,d)=>{let j=e.representative,E={kind:e.kind,label:e.stateLabel},cn=!m&&tn?.id===e.id;return``}).join("")} - ${kn&&!m?tn.members.map((e)=>`
`).join(""):""} - ${t.missing.map((e,d)=>``).join("")} +

Approved comp

${!k?``:""}
+
+ Approved composition for ${S(e.title)} + ${Oe&&!b?`
`:""} + ${J.map((t,d)=>{let E=t.representative,C={kind:t.kind,label:t.stateLabel},xe=!b&&ae?.id===t.id;return``}).join("")} + ${ue&&!b?ae.members.map((t)=>`
`).join(""):""} + ${a.missing.map((t,d)=>``).join("")}
-
# To review${on} ${w?"Changes requested":"Feedback ready"}${Zn} Approved
- ${z?'
Draw around the missing piece.
':""} +
# To review${re} ${k?"Changes requested":"Feedback ready"}${qe} Approved
+ ${M?'
Draw around the missing piece.
':""}
`:""} -
- ${!p?`

${m?"Review summary":`${ae} ${T(kn?tn.label:$?.name??D?.name??"Component")}`}

`:""}
- ${m&&!p?`

${w?"Review sent.":"All components reviewed."}

${x.approved} approved · ${x.revisions} flagged for repair${t.missing.length?` · ${t.missing.length} missing`:""}

${w?"Your decisions are saved.":x.hasFeedback?"Send your feedback to start the next repair round.":"Confirm nothing is missing, then approve and continue."}

${F.map((e)=>{let d=e.representative,j=t.decisions[d.id],E=Ue(d);return``}).join("")}${t.missing.map((e)=>``).join("")}
${k?`
${k}
`:""}`:$?` - ${c?`
- ${L&&V?.prior?.action==="revise"?`

Previous feedback · Round ${V.feedbackRound}

${T(V.prior.feedback||"No written feedback was supplied.")}
${V.prior.split?"

Requested: split into separately reviewable components.

":""}
`:V?.carried?'

Unchanged · approval kept

':""} - ${V?.change?.kind==="changed"?`
${V.change.files.length?`${V.change.files.length} changed ${V.change.files.length===1?"file":"files"}`:V.change.reasons.includes("region")?"Region changed":O?.note!==$.note?"Description changed · files unchanged":"Component definition changed · files unchanged"}${V.change.files.length?`
    ${V.change.files.map((e)=>`
  • ${T(e)}
  • `).join("")}
`:""}${O&&O.note!==$.note?`
Previous description
${T(O.note)}
Current description
${T($.note)}
`:""}
`:""} +
+ ${!l?`

${b?"Review summary":`${ot} ${S(ue?ae.label:A?.name??X?.name??"Component")}`}

`:""}
+ ${b&&!l?`

${k?"Review sent.":"All components reviewed."}

${c.approved} approved · ${c.revisions} flagged for repair${a.missing.length?` · ${a.missing.length} missing`:""}

${k?"Your decisions are saved.":c.hasFeedback?"Send your feedback to start the next repair round.":"Confirm nothing is missing, then approve and continue."}

${J.map((t)=>{let d=t.representative,E=a.decisions[d.id],C=It(d);return``}).join("")}${a.missing.map((t)=>``).join("")}
${u?`
${u}
`:""}`:A?` + ${x?`
+ ${N&&T?.prior?.action==="revise"?`

Previous feedback · Round ${T.feedbackRound}

${S(T.prior.feedback||"No written feedback was supplied.")}
${T.prior.split?"

Requested: split into separately reviewable components.

":""}
`:T?.carried?'

Unchanged · approval kept

':""} + ${T?.change?.kind==="changed"?`
${T.change.files.length?`${T.change.files.length} changed ${T.change.files.length===1?"file":"files"}`:T.change.reasons.includes("region")?"Region changed":Y?.note!==A.note?"Description changed · files unchanged":"Component definition changed · files unchanged"}${T.change.files.length?`
    ${T.change.files.map((t)=>`
  • ${S(t)}
  • `).join("")}
`:""}${Y&&Y.note!==A.note?`
Previous description
${S(Y.note)}
Current description
${S(A.note)}
`:""}
`:""}
`:""} -

${T(kn?tn.label:q.name)}

${l.length>1?`
${l.length} instances${!kn?'':'Select to inspect'}
`:""}
${O?`
`:""}
${[["fit","Fit"],["1","100%"],["2","200%"],["4","400%"]].map(([e,d])=>``).join("")}
${q?.preview.kind==="image"?`${fn("external")}`:""}
- ${kn?`
Full comp cropComponent preview
${tn.members.map((e,d)=>{let j=Ue(e);return``}).join("")}
`:""} - ${!kn&&q?ee(pn,q):""}
-
${L?`Comp · Round ${c.packet.round}`:p?"Approved comp":di?.related.length?"Full comp crop":"In the comp"}
Reference region for ${T(q.name)}${Un(pn,q)}
-
${L?`Previous · Round ${c.packet.round}`:p?"Assembled page":mn?"In context":c?`${Vn.caption} · Round ${n.round}`:Vn.caption}
${!li?`Produced ${T(q.name)}`:``}${xn?`Reference overlay`:""}
+

${S(ue?ae.label:L.name)}

${p.length>1?`
${p.length} instances${!ue?'':'Select to inspect'}
`:""}
${Y?`
`:""}
${[["fit","Fit"],["1","100%"],["2","200%"],["4","400%"]].map(([t,d])=>``).join("")}
${L?.preview.kind==="image"?`${we("external")}`:""}
+ ${ue?`
Full comp cropComponent preview
${ae.members.map((t,d)=>{let E=It(t);return``}).join("")}
`:""} + ${!ue&&L?tt(le,L):""}
+
${N?`Comp · Round ${x.packet.round}`:l?"Approved comp":cn?.related.length?"Full comp crop":"In the comp"}
Reference region for ${S(L.name)}${Ie(le,L)}
+
${N?`Previous · Round ${x.packet.round}`:l?"Assembled page":be?"In context":x?`${Le.caption} · Round ${e.round}`:Le.caption}
${!dn?`Produced ${S(L.name)}`:``}${ce?`Reference overlay`:""}
- ${Le||q.context?`
${q.context?`
`:""}${Le?`
`:""}
`:""} -
${!p&&!kn?`
${fn(Vn.code?"code":"image")}${T(nr)}${q?.material?`${q.material.width} × ${q.material.height} px`:""}
${pn.stage==="components"&&Vn?.captured&&!q?.preview.isolation?'

Legacy region capture · may include overlapping components.

':""}${q?.context?.layering&&(Ae||mn)?`

${T(q.context.layering)}

`:""} -

${!di?.related.length?T(q.note):""}

-
`:""}
${k}${L?'

Viewing the previous round. Return to Current to make a decision.

':""}${w?`
${vn?.action==="approve"?"Approved":vn?.action==="revise"?"Changes requested":"Not reviewed"}Submitted in round ${n.round} · read-only
`:`
${!p?`
Your review Round ${n.round}${L?"

Return to Current to review this round.

":""}
`:""}${vn&&!p&&!kn?``:""}
`} - ${r?`
`:vn?.action==="revise"?`

${T(vn.feedback||"No note — agent will diagnose.")}

`:""} - ${p?`

${T(M||(w?"Your decision is saved.":v?"Sending…":r?"":"Approval confirms the composition and that nothing is missing."))}

`:""}
`:D?`

This piece will be added to the unresolved inventory.

${["x","y","w","h"].map((e)=>``).join("")}
`:"

No components supplied.

"} + ${jt||L.context?`
${L.context?`
`:""}${jt?`
`:""}
`:""} +
${!l&&!ue?`
${we(Le.code?"code":"image")}${S(ti)}${L?.material?`${L.material.width} × ${L.material.height} px`:""}
${le.stage==="components"&&Le?.captured&&!L?.preview.isolation?'

Legacy region capture · may include overlapping components.

':""}${L?.context?.layering&&(Bt||be)?`

${S(L.context.layering)}

`:""} +

${!cn?.related.length?S(L.note):""}

+
`:""}
${u}${N?'

Viewing the previous round. Return to Current to make a decision.

':""}${k?`
${he?.action==="approve"?"Approved":he?.action==="revise"?"Changes requested":"Not reviewed"}Submitted in round ${e.round} · read-only
`:`
${!l?`
Your review Round ${e.round}${N?"

Return to Current to review this round.

":""}
`:""}${he&&!l&&!ue?``:""}
`} + ${i?`
`:he?.action==="revise"?`

${S(he.feedback||"No note — agent will diagnose.")}

`:""} + ${l?`

${S(z||(k?"Your decision is saved.":h?"Sending…":i?"":"Approval confirms the composition and that nothing is missing."))}

`:""}
`:X?`

This piece will be added to the unresolved inventory.

${["x","y","w","h"].map((t)=>``).join("")}
`:"

No components supplied.

"} - ${!p?`

Components

-
${pi.map((e)=>{let d=F.find((cn)=>cn.members.some((gn)=>gn.id===e.id)),j=F.indexOf(d),E={kind:d.kind,label:d.stateLabel};return``}).join("")}${(b==="pending"?[]:t.missing).map((e,d)=>``).join("")}${!pi.length&&(b==="pending"||!t.missing.length)?`

${b==="pending"?"Nothing left to review. Your decisions are ready.":"No components reviewed yet."}

`:""}
`:""} - ${p?"":w?`
Round ${n.round} submitted · read-only${x.approved} approved · ${x.revisions} changes requested
`:`
${!x.pending&&!s?``:""}

${T(Si)}

`} - `;let sn=a.querySelector("#comparison-dialog"),un=a.querySelector(".comparison-panel"),_n=a.querySelector(".comparison-slot"),En=a.querySelector(".inspector > .review-form"),er=a.querySelector(".inspector"),xi=()=>{if(sn.append(un),En)sn.append(En)};if(U&&un&&_n)_n.style.height=`${Qe}px`,xi(),sn.showModal();if(L)a.querySelectorAll(".decisions button,#feedback,#split,#save-feedback,#cancel-feedback,#undo-decision,#approve-rest,#submit,#inventory-confirm").forEach((e)=>e.disabled=!0);if(a.querySelector(".inspection-content").scrollTop=$e,w||v)a.querySelectorAll(".decisions button,#save-feedback,#cancel-feedback,#undo-decision,#approve-rest,#mark,#inventory-confirm,#missing-name,#missing-feedback,#feedback,#split,#remove-missing,[data-coordinate]").forEach((e)=>e.disabled=!0);let hi=a.querySelector(".inventory");if(hi)hi.scrollLeft=Gn;if(!P&&en)Array.from(a.querySelectorAll(".inventory [data-select]")).find((e)=>e.dataset.select===g)?.scrollIntoView({block:"nearest",inline:"nearest"});if(J)a.getElementById(J)?.focus({preventScroll:!0});else if(K)Array.from(a.querySelectorAll(".item[data-select]")).find((e)=>e.dataset.select===K)?.focus({preventScroll:!0});let B=(e,d)=>a.querySelector(`#${e}`)?.addEventListener("click",d);function Ke(e,d=!1,j=!1){if(z)return;if(!j)e=F.find((E)=>E.members.some((cn)=>cn.id===e))?.representative.id??e;if(Z=!j,m=!1,g=e,I="component",xn=!1,ln="fit",qn="isolated",C=!1,G(),d)a.querySelector("#expand-comparison")?.click()}a.querySelectorAll("[data-select]").forEach((e)=>e.onclick=()=>Ke(e.dataset.select,e.classList.contains("pin")&&n.components.some((d)=>d.id===e.dataset.select))),B("previous-round",()=>{C=!0,G()}),B("current-round",()=>{C=!1,G()}),B("review-changes",()=>{let e=y().filter((E)=>Ue(E).kind==="pending"),d=e.findIndex((E)=>E.id===g),j=e[(d+1)%e.length];if(j)Z=!0,m=!1,g=j.id,I="component",b="pending",C=!1,ln="fit",xn=!1,qn="isolated",G()}),a.querySelectorAll("[data-filter]").forEach((e)=>e.onclick=()=>{b=e.dataset.filter,m=!x.pending&&b==="pending";let d=F.filter((E)=>b==="all"||E.kind==="pending"===(b==="pending")).map((E)=>E.representative);if(!(b!=="pending"&&t.missing.some((E)=>E.id===g))&&!d.some((E)=>E.id===g)&&d.length)Z=!0,g=d[0].id,I="component",C=!1,ln="fit",xn=!1,qn="isolated";G()}),B("show-summary",()=>{m=!0,I="component",b="reviewed",G(),Jn("review-summary")}),B("approve",()=>On("approve")),B("revise",de),B("clear",()=>{if($)delete t.decisions[$.id],delete u[$.id];Q=null,m=!1,b="pending",G()}),B("cancel-feedback",()=>{if($)delete u[$.id];if(Tn)en=!0,Tn=!1;G(),Jn("revise")}),a.querySelector("#feedback-form")?.addEventListener("submit",(e)=>{e.preventDefault(),On("revise")}),a.querySelector("#feedback")?.addEventListener("keydown",(e)=>{let d=e;if(d.key==="Enter"&&(d.metaKey||d.ctrlKey)&&!d.isComposing)d.preventDefault(),d.stopPropagation(),On("revise")}),B("undo-decision",()=>{if(!Q||v||w)return;let e=Q;for(let[d,j]of Object.entries(e.previous))if(j)t.decisions[d]=j;else delete t.decisions[d];delete u[e.id],g=e.id,m=!1,C=!1,I="component",b="all",Q=null,G(),Jn("approve")}),B("all-instances",()=>{Z=!0,g=tn.representative.id,C=!1,G()}),a.querySelectorAll("[data-instance]").forEach((e)=>e.onclick=()=>Ke(e.dataset.instance,!1,!0)),B("overlay",()=>{xn=!xn,G()}),B("isolated",()=>{qn="isolated",G()}),B("context",()=>{qn="context",G()}),a.querySelectorAll("[data-zoom]").forEach((e)=>e.addEventListener("click",()=>{let d=e.dataset.zoom;ln=d==="fit"?"fit":Number(d),G()})),B("background-checker",()=>{Xn="checker",G()}),B("background-page",()=>{Xn="page",G()}),B("show-all",()=>{W=!W,en=!0,G()}),B("toggle-tray",()=>{Tn=!1,en=!en,G()}),B("show-comp",()=>{I="comp",G()}),B("show-component",()=>{I="component",G()}),B("mark",()=>{z=!z,G()}),B("add-box",()=>ie({x:0.35,y:0.35,w:0.2,h:0.2})),B("remove-missing",()=>{t.missing=t.missing.filter((e)=>e.id!==g),g=n.components[0]?.id,G()}),B("approve-rest",()=>{if(s)return;t=wi(n,t),Q=null,m=!0,b="reviewed",I="component",G(),Jn("review-summary")}),a.querySelector("#inventory-confirm")?.addEventListener("change",(e)=>{t.inventoryConfirmed=e.target.checked,G()}),a.querySelector("#feedback")?.addEventListener("input",(e)=>{if($&&u[$.id])u[$.id].feedback=e.target.value}),a.querySelector("#split")?.addEventListener("change",(e)=>{if($&&u[$.id])u[$.id].split=e.target.checked}),a.querySelector("#missing-name")?.addEventListener("input",(e)=>{if(D)D.name=e.target.value;let d=a.querySelector("#submit");if(d)d.disabled=s||v||w||!Cn(n,t).canSubmit}),a.querySelector("#missing-feedback")?.addEventListener("input",(e)=>{if(D)D.feedback=e.target.value}),a.querySelectorAll("[data-coordinate]").forEach((e)=>e.addEventListener("change",()=>{if(!D)return;let d=e.dataset.coordinate,j=Number(e.value)/100;if(Number.isFinite(j))D.box[d]=Math.max(d==="w"||d==="h"?0.001:0,Math.min(1,j));D.box.w=Math.min(D.box.w,1-D.box.x),D.box.h=Math.min(D.box.h,1-D.box.y),G()})),B("submit",()=>{$n()});let wn=a.querySelector(".map");function _e(e){let d=wn.getBoundingClientRect();return{x:Math.max(0,Math.min(1,(e.clientX-d.left)/d.width)),y:Math.max(0,Math.min(1,(e.clientY-d.top)/d.height))}}function ki(e){let d=_e(e);return n.components.filter(({box:j})=>d.x>=j.x&&d.x<=j.x+j.w&&d.y>=j.y&&d.y<=j.y+j.h).sort((j,E)=>j.box.w*j.box.h-E.box.w*E.box.h)[0]}wn?.addEventListener("click",(e)=>{if(z||e.target.closest("[data-select]"))return;let d=ki(e);if(d)Ke(d.id,!0)}),wn?.addEventListener("pointermove",(e)=>{if(!z)wn.style.cursor=ki(e)?"zoom-in":""}),wn?.addEventListener("pointerdown",(e)=>{if(!z)return;N=_e(e),wn.setPointerCapture(e.pointerId),e.preventDefault()}),wn?.addEventListener("pointermove",(e)=>{if(!N)return;let d=_e(e);hn={x:Math.min(N.x,d.x),y:Math.min(N.y,d.y),w:Math.abs(d.x-N.x),h:Math.abs(d.y-N.y)};let j=a.querySelector(".draw-box");j.hidden=!1,j.style.cssText=In(hn)}),wn?.addEventListener("pointerup",()=>{if(hn&&hn.w>0.01&&hn.h>0.01)ie(hn);else N=null,hn=null}),wn?.addEventListener("pointercancel",()=>{N=null,hn=null,G()});let gi=a.querySelector(".output"),ge=a.querySelector("iframe"),vi=a.querySelector(".workbench"),Dn=a.querySelector(".inspection-content"),Be=a.querySelector(".inspector");function He(){if(!Dn||!Be)return;Be.dataset.scrollAbove=String(Dn.scrollTop>1),Be.dataset.scrollBelow=String(Dn.scrollHeight-Dn.clientHeight-Dn.scrollTop>1)}Dn?.addEventListener("scroll",He,{passive:!0});function ve(){let e=a.querySelector(".map-space");if(e&&e.clientWidth&&e.clientHeight){let _=Ie(n.comp.width,n.comp.height,Math.max(1,e.clientWidth-32),Math.max(1,e.clientHeight-32),"fit");wn.style.width=`${_.width}px`,wn.style.height=`${_.height}px`}let d=a.querySelector(".inspection-content"),j=Array.from(a.querySelectorAll(".pan-viewport"));if(d?.clientHeight){let _=U?Math.max(100,sn.clientHeight-(un?.querySelector(".compare-toolbar")?.clientHeight??0)-(un?.querySelector(".expanded-title")?.clientHeight??0)-(un?.querySelector(".view-controls")?.clientHeight??0)-(En?.getBoundingClientRect().height??0)-124):Math.min(p?Number.POSITIVE_INFINITY:248,Math.max(100,d.clientHeight-((j[0]?.getBoundingClientRect().top??d.getBoundingClientRect().top)-d.getBoundingClientRect().top+d.scrollTop)-(un?.querySelector(".view-controls")?.clientHeight??0)-12));j.forEach((S)=>S.style.height=`${_}px`)}if(q&&j.length&&!kn){let _=Ie(q.box.w*pn.comp.width,q.box.h*pn.comp.height,Math.min(...j.map((S)=>S.clientWidth)),Math.min(...j.map((S)=>S.clientHeight)),ln);a.querySelectorAll(".crop-stage").forEach((S)=>{S.style.width=`${_.width}px`,S.style.height=`${_.height}px`})}if(j.forEach((_)=>{let S=_.scrollWidth>_.clientWidth+1||_.scrollHeight>_.clientHeight+1;_.classList.toggle("pannable",S),_.style.cursor=U?"":"zoom-in",_.setAttribute("role",U?"region":"button"),_.title=U?S?"Move your pointer to pan. You can also scroll, swipe, or use arrow keys.":"":"Click to enlarge comparison"}),gi&&ge&&q){let _=gi.clientWidth/(q.box.w*pn.comp.width);ge.style.transform=`scale(${_})`,ge.style.left=`${-q.box.x*pn.comp.width*_}px`,ge.style.top=`${-q.box.y*pn.comp.height*_}px`}let E=vi.getBoundingClientRect(),cn=a.querySelector(".region"),gn=a.querySelector(".number"),ce=a.querySelector(".connector path");if(cn&&gn&&ce){let _=cn.getBoundingClientRect(),S=gn.getBoundingClientRect(),be=_.right-E.left,nn=_.top+_.height/2-E.top,se=S.left-E.left-8,me=S.top+S.height/2-E.top;ce.setAttribute("d",`M ${be} ${nn} H ${se-14} V ${me} H ${se}`)}}function Rn(e,d){if(!un||!_n||e===U)return;let j=a.querySelector("#expand-comparison"),E=(U?sn:un).getBoundingClientRect(),cn=window.matchMedia("(prefers-reduced-motion: reduce)").matches,gn=un.querySelector(".pan-viewport"),ce=gn?gn.scrollLeft/Math.max(1,gn.scrollWidth-gn.clientWidth):0,_=gn?gn.scrollTop/Math.max(1,gn.scrollHeight-gn.clientHeight):0,S=()=>un.querySelectorAll(".pan-viewport").forEach((nn)=>{nn.scrollLeft=ce*Math.max(0,nn.scrollWidth-nn.clientWidth),nn.scrollTop=_*Math.max(0,nn.scrollHeight-nn.clientHeight)}),be=()=>{if(_n.append(un),En)er.append(En),En.inert=!1;sn.close(),_n.style.height="",Qn=!1,U=!1,j.innerHTML=fn("expand"),j.setAttribute("aria-label","Enlarge comparison"),j.title="Enlarge comparison",j.setAttribute("aria-expanded","false"),ve(),S(),j.focus({preventScroll:!0}),d?.()};if(e){_n.style.height=`${E.height}px`,xi(),sn.showModal(),U=!0,j.innerHTML=fn("compact"),j.setAttribute("aria-label","Restore comparison"),j.title="Restore comparison (Esc)",j.setAttribute("aria-expanded","true"),ve(),S(),j.focus({preventScroll:!0});let nn=sn.getBoundingClientRect();if(!cn)sn.animate([{transform:`translate(${E.x-nn.x}px,${E.y-nn.y}px) scale(${E.width/nn.width},${E.height/nn.height})`,opacity:0.6},{transform:"none",opacity:1}],{duration:240,easing:"cubic-bezier(.2,.8,.2,1)"})}else{if(j.disabled)return;let nn=_n.getBoundingClientRect();if(cn){be();return}if(j.disabled=!0,Qn=!0,En)En.inert=!0;let se=sn.animate([{transform:"none",opacity:1},{transform:`translate(${nn.x-E.x}px,${nn.y-E.y}px) scale(${nn.width/E.width},${nn.height/E.height})`,opacity:0.6}],{duration:200,easing:"cubic-bezier(.4,0,.2,1)",fill:"forwards"});sn.inert=!0;let me=()=>{if(se.cancel(),j.disabled=!1,sn.inert=!1,sn.isConnected)be();else Qn=!1,U=!1,G(),d?.()};se.finished.then(me,me)}}if(Yn=(e)=>Rn(!1,e),B("expand-comparison",()=>Rn(!U)),sn.addEventListener("cancel",(e)=>{e.preventDefault(),e.stopPropagation(),Rn(!1)}),sn.addEventListener("keydown",(e)=>{if(e.key==="Escape")e.preventDefault(),e.stopPropagation(),Rn(!1)}),ne=Ye(a),an=new ResizeObserver(()=>{ve(),He()}),an.observe(vi),an.observe(sn),En)an.observe(En);let ui=a.querySelector(".inspection-content");if(ui)an.observe(ui);let ci=a.querySelector(".repair-context");if(ci)an.observe(ci);let bi=un?.querySelector(".compare-toolbar");if(bi)an.observe(bi);ve();let ue=Array.from(a.querySelectorAll(".pan-viewport"));if(ue.forEach((e)=>{e.scrollLeft=A,e.scrollTop=ke}),ue.forEach((e)=>{e.querySelectorAll("img").forEach((d)=>d.draggable=!1),e.addEventListener("click",()=>{if(!U)Rn(!0)}),e.addEventListener("pointermove",(d)=>{if(d.pointerType!=="mouse"||d.buttons||!e.classList.contains("pannable"))return;let j=e.getBoundingClientRect();e.scrollLeft=Oe(d.clientX,j.left,e.clientWidth,e.scrollWidth),e.scrollTop=Oe(d.clientY,j.top,e.clientHeight,e.scrollHeight)}),e.addEventListener("keydown",(d)=>{if(!U&&(d.key==="Enter"||d.key===" ")){d.preventDefault(),d.stopPropagation(),Rn(!0);return}let E={ArrowLeft:[-48,0],ArrowRight:[48,0],ArrowUp:[0,-48],ArrowDown:[0,48]}[d.key];if(!E)return;d.preventDefault(),d.stopPropagation(),e.scrollLeft+=E[0],e.scrollTop+=E[1]})}),ue.forEach((e)=>e.addEventListener("scroll",()=>{for(let d of ue)if(d!==e){if(d.scrollLeft!==e.scrollLeft)d.scrollLeft=e.scrollLeft;if(d.scrollTop!==e.scrollTop)d.scrollTop=e.scrollTop}})),re&&window.matchMedia("(max-width:800px)").matches){let e=a.querySelector(".inspection-content"),d=a.querySelector(".compare");if(e&&d)e.scrollTop+=d.getBoundingClientRect().top-e.getBoundingClientRect().top}if(He(),window.scrollTo(H,R),!w)o.onDraftChange?.(structuredClone(t))}return G(),{destroy(){an?.disconnect(),ne?.(),a.replaceChildren()},getDraft(){return structuredClone(t)}}}function sr(){let i=document.createElement("style");i.textContent=[["Albert Sans","albertsans"],["Alumni Sans","alumnisans"],["JetBrains Mono","jetbrainsmono"]].map(([n,o])=>`@font-face{font-family:"${n}";src:url(/fonts/${o}.ttf);font-weight:100 900}`).join(""),document.head.append(i)}function pr(i){let n=document.createElement("div");n.setAttribute("role","alert"),n.style.cssText="max-width:560px;margin:18vh auto 0;padding:0 0 0 18px;border-left:2px solid var(--ks-vermilion,oklch(52% 0.16 35));color:var(--ks-text,oklch(22% 0 0));font:400 15px/1.55 var(--font-sans,Arial,sans-serif)";let o=document.createElement("p");o.textContent="Review unavailable",o.style.cssText="margin:0 0 8px;font:400 11px/1.3 var(--font-mono,monospace);letter-spacing:.14em;text-transform:uppercase;color:var(--ks-text-muted,oklch(46% 0 0))";let a=document.createElement("strong");a.textContent="The review could not be opened.",a.style.cssText="display:block;font-weight:500;color:var(--ks-ink,oklch(13% 0 0))";let t=document.createElement("p");t.style.cssText="margin:4px 0 18px;color:var(--ks-text-muted,oklch(46% 0 0))",t.textContent=`${i} If the review server stopped, ask the agent to serve the review again, then reload.`;let p=document.createElement("button");return p.textContent="Reload",p.style.cssText="font:500 15px/1 var(--font-sans,Arial,sans-serif);min-height:44px;padding:0 22px;border:1px solid oklch(13% 0 0);border-radius:3px;background:oklch(13% 0 0);color:oklch(99.5% 0 0);cursor:pointer",p.onclick=()=>location.reload(),n.append(o,a,t,p),n}async function lr(){sr();let i=document.getElementById("review"),n=await fetch("/packet",{cache:"no-store"});if(!n.ok)throw Error("The review packet could not be loaded.");let o=await n.json(),a=Me(o.packet);if(o.sourceStatus&&!a){let t=document.createElement("p");t.textContent=o.sourceStatus,i.before(t)}Ri(i,o.packet,{initialDraft:o.draft,history:o.history,completed:!!o.receipt,status:a?o.sourceStatus:null,onSubmit:async(t)=>{let p=await fetch("/decision",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),y=await p.json().catch(()=>({}));if(!p.ok)throw Error(y.error??"The review could not be saved. Try again.")}})}lr().catch((i)=>{document.getElementById("review")?.replaceChildren(pr(i instanceof Error?i.message:String(i)))});})(); + ${!l?`

Components

+
${pn.map((t)=>{let d=J.find((xe)=>xe.members.some((ge)=>ge.id===t.id)),E=J.indexOf(d),C={kind:d.kind,label:d.stateLabel};return``}).join("")}${(v==="pending"?[]:a.missing).map((t,d)=>``).join("")}${!pn.length&&(v==="pending"||!a.missing.length)?`

${v==="pending"?"Nothing left to review. Your decisions are ready.":"No components reviewed yet."}

`:""}
`:""} + ${l?"":k?`
Round ${e.round} submitted · read-only${c.approved} approved · ${c.revisions} changes requested
`:`
${!c.pending&&!s?``:""}

${S(ei)}

`} + `;let se=o.querySelector("#comparison-dialog"),fe=o.querySelector(".comparison-panel"),Fe=o.querySelector(".comparison-slot"),Te=o.querySelector(".inspector > .review-form"),ni=o.querySelector(".inspector"),mn=()=>{if(se.append(fe),Te)se.append(Te)};if(B&&fe&&Fe)Fe.style.height=`${Ht}px`,mn(),se.showModal();if(N)o.querySelectorAll(".decisions button,#feedback,#split,#save-feedback,#cancel-feedback,#undo-decision,#approve-rest,#submit,#inventory-confirm").forEach((t)=>t.disabled=!0);if(o.querySelector(".inspection-content").scrollTop=Dt,k||h)o.querySelectorAll(".decisions button,#save-feedback,#cancel-feedback,#undo-decision,#approve-rest,#mark,#inventory-confirm,#missing-name,#missing-feedback,#feedback,#split,#remove-missing,[data-coordinate]").forEach((t)=>t.disabled=!0);let un=o.querySelector(".inventory");if(un)un.scrollLeft=Ae;if(!Z&&ne)Array.from(o.querySelectorAll(".inventory [data-select]")).find((t)=>t.dataset.select===g)?.scrollIntoView({block:"nearest",inline:"nearest"});if(D)o.getElementById(D)?.focus({preventScroll:!0});else if(F)Array.from(o.querySelectorAll(".item[data-select]")).find((t)=>t.dataset.select===F)?.focus({preventScroll:!0});let K=(t,d)=>o.querySelector(`#${t}`)?.addEventListener("click",d);function Ot(t,d=!1,E=!1){if(M)return;if(!E)t=J.find((C)=>C.members.some((xe)=>xe.id===t))?.representative.id??t;if(I=!E,b=!1,g=t,G="component",ce=!1,pe="fit",Se="isolated",Q=!1,H(),d)o.querySelector("#expand-comparison")?.click()}o.querySelectorAll("[data-select]").forEach((t)=>t.onclick=()=>Ot(t.dataset.select,t.classList.contains("pin")&&e.components.some((d)=>d.id===t.dataset.select))),K("previous-round",()=>{Q=!0,H()}),K("current-round",()=>{Q=!1,H()}),K("review-changes",()=>{let t=y().filter((C)=>It(C).kind==="pending"),d=t.findIndex((C)=>C.id===g),E=t[(d+1)%t.length];if(E)I=!0,b=!1,g=E.id,G="component",v="pending",Q=!1,pe="fit",ce=!1,Se="isolated",H()}),o.querySelectorAll("[data-filter]").forEach((t)=>t.onclick=()=>{v=t.dataset.filter,b=!c.pending&&v==="pending";let d=J.filter((C)=>v==="all"||C.kind==="pending"===(v==="pending")).map((C)=>C.representative);if(!(v!=="pending"&&a.missing.some((C)=>C.id===g))&&!d.some((C)=>C.id===g)&&d.length)I=!0,g=d[0].id,G="component",Q=!1,pe="fit",ce=!1,Se="isolated";H()}),K("show-summary",()=>{b=!0,G="component",v="reviewed",H(),Re("review-summary")}),K("approve",()=>Ge("approve")),K("revise",dt),K("clear",()=>{if(A)delete a.decisions[A.id],delete f[A.id];q=null,b=!1,v="pending",H()}),K("cancel-feedback",()=>{if(A)delete f[A.id];if(ze)ne=!0,ze=!1;H(),Re("revise")}),o.querySelector("#feedback-form")?.addEventListener("submit",(t)=>{t.preventDefault(),Ge("revise")}),o.querySelector("#feedback")?.addEventListener("keydown",(t)=>{let d=t;if(d.key==="Enter"&&(d.metaKey||d.ctrlKey)&&!d.isComposing)d.preventDefault(),d.stopPropagation(),Ge("revise")}),K("undo-decision",()=>{if(!q||h||k)return;let t=q;for(let[d,E]of Object.entries(t.previous))if(E)a.decisions[d]=E;else delete a.decisions[d];delete f[t.id],g=t.id,b=!1,Q=!1,G="component",v="all",q=null,H(),Re("approve")}),K("all-instances",()=>{I=!0,g=ae.representative.id,Q=!1,H()}),o.querySelectorAll("[data-instance]").forEach((t)=>t.onclick=()=>Ot(t.dataset.instance,!1,!0)),K("overlay",()=>{ce=!ce,H()}),K("isolated",()=>{Se="isolated",H()}),K("context",()=>{Se="context",H()}),o.querySelectorAll("[data-zoom]").forEach((t)=>t.addEventListener("click",()=>{let d=t.dataset.zoom;pe=d==="fit"?"fit":Number(d),H()})),K("background-checker",()=>{Pe="checker",H()}),K("background-page",()=>{Pe="page",H()}),K("show-all",()=>{V=!V,ne=!0,H()}),K("toggle-tray",()=>{ze=!1,ne=!ne,H()}),K("show-comp",()=>{G="comp",H()}),K("show-component",()=>{G="component",H()}),K("mark",()=>{M=!M,H()}),K("add-box",()=>nt({x:0.35,y:0.35,w:0.2,h:0.2})),K("remove-missing",()=>{a.missing=a.missing.filter((t)=>t.id!==g),g=e.components[0]?.id,H()}),K("approve-rest",()=>{if(s)return;a=wn(e,a),q=null,b=!0,v="reviewed",G="component",H(),Re("review-summary")}),o.querySelector("#inventory-confirm")?.addEventListener("change",(t)=>{a.inventoryConfirmed=t.target.checked,H()}),o.querySelector("#feedback")?.addEventListener("input",(t)=>{if(A&&f[A.id])f[A.id].feedback=t.target.value}),o.querySelector("#split")?.addEventListener("change",(t)=>{if(A&&f[A.id])f[A.id].split=t.target.checked}),o.querySelector("#missing-name")?.addEventListener("input",(t)=>{if(X)X.name=t.target.value;let d=o.querySelector("#submit");if(d)d.disabled=s||h||k||!Je(e,a).canSubmit}),o.querySelector("#missing-feedback")?.addEventListener("input",(t)=>{if(X)X.feedback=t.target.value}),o.querySelectorAll("[data-coordinate]").forEach((t)=>t.addEventListener("change",()=>{if(!X)return;let d=t.dataset.coordinate,E=Number(t.value)/100;if(Number.isFinite(E))X.box[d]=Math.max(d==="w"||d==="h"?0.001:0,Math.min(1,E));X.box.w=Math.min(X.box.w,1-X.box.x),X.box.h=Math.min(X.box.h,1-X.box.y),H()})),K("submit",()=>{De()});let ke=o.querySelector(".map");function Ft(t){let d=ke.getBoundingClientRect();return{x:Math.max(0,Math.min(1,(t.clientX-d.left)/d.width)),y:Math.max(0,Math.min(1,(t.clientY-d.top)/d.height))}}function gn(t){let d=Ft(t);return e.components.filter(({box:E})=>d.x>=E.x&&d.x<=E.x+E.w&&d.y>=E.y&&d.y<=E.y+E.h).sort((E,C)=>E.box.w*E.box.h-C.box.w*C.box.h)[0]}ke?.addEventListener("click",(t)=>{if(M||t.target.closest("[data-select]"))return;let d=gn(t);if(d)Ot(d.id,!0)}),ke?.addEventListener("pointermove",(t)=>{if(!M)ke.style.cursor=gn(t)?"zoom-in":""}),ke?.addEventListener("pointerdown",(t)=>{if(!M)return;O=Ft(t),ke.setPointerCapture(t.pointerId),t.preventDefault()}),ke?.addEventListener("pointermove",(t)=>{if(!O)return;let d=Ft(t);me={x:Math.min(O.x,d.x),y:Math.min(O.y,d.y),w:Math.abs(d.x-O.x),h:Math.abs(d.y-O.y)};let E=o.querySelector(".draw-box");E.hidden=!1,E.style.cssText=Ve(me)}),ke?.addEventListener("pointerup",()=>{if(me&&me.w>0.01&&me.h>0.01)nt(me);else O=null,me=null}),ke?.addEventListener("pointercancel",()=>{O=null,me=null,H()});let hn=o.querySelector(".output"),gt=o.querySelector("iframe"),fn=o.querySelector(".workbench"),Ye=o.querySelector(".inspection-content"),Ut=o.querySelector(".inspector");function Kt(){if(!Ye||!Ut)return;Ut.dataset.scrollAbove=String(Ye.scrollTop>1),Ut.dataset.scrollBelow=String(Ye.scrollHeight-Ye.clientHeight-Ye.scrollTop>1)}Ye?.addEventListener("scroll",Kt,{passive:!0});function ht(){let t=o.querySelector(".map-space");if(t&&t.clientWidth&&t.clientHeight){let U=Vt(e.comp.width,e.comp.height,Math.max(1,t.clientWidth-32),Math.max(1,t.clientHeight-32),"fit");ke.style.width=`${U.width}px`,ke.style.height=`${U.height}px`}let d=o.querySelector(".inspection-content"),E=Array.from(o.querySelectorAll(".pan-viewport"));if(d?.clientHeight){let U=B?Math.max(100,se.clientHeight-(fe?.querySelector(".compare-toolbar")?.clientHeight??0)-(fe?.querySelector(".expanded-title")?.clientHeight??0)-(fe?.querySelector(".view-controls")?.clientHeight??0)-(Te?.getBoundingClientRect().height??0)-124):Math.min(l?Number.POSITIVE_INFINITY:248,Math.max(100,d.clientHeight-((E[0]?.getBoundingClientRect().top??d.getBoundingClientRect().top)-d.getBoundingClientRect().top+d.scrollTop)-(fe?.querySelector(".view-controls")?.clientHeight??0)-12));E.forEach((ee)=>ee.style.height=`${U}px`)}if(L&&E.length&&!ue){let U=Vt(L.box.w*le.comp.width,L.box.h*le.comp.height,Math.min(...E.map((ee)=>ee.clientWidth)),Math.min(...E.map((ee)=>ee.clientHeight)),pe);o.querySelectorAll(".crop-stage").forEach((ee)=>{ee.style.width=`${U.width}px`,ee.style.height=`${U.height}px`})}if(E.forEach((U)=>{let ee=U.scrollWidth>U.clientWidth+1||U.scrollHeight>U.clientHeight+1;U.classList.toggle("pannable",ee),U.style.cursor=B?"":"zoom-in",U.setAttribute("role",B?"region":"button"),U.title=B?ee?"Move your pointer to pan. You can also scroll, swipe, or use arrow keys.":"":"Click to enlarge comparison"}),hn&>&&L){let U=hn.clientWidth/(L.box.w*le.comp.width);gt.style.transform=`scale(${U})`,gt.style.left=`${-L.box.x*le.comp.width*U}px`,gt.style.top=`${-L.box.y*le.comp.height*U}px`}let C=fn.getBoundingClientRect(),xe=o.querySelector(".region"),ge=o.querySelector(".number"),xt=o.querySelector(".connector path");if(xe&&ge&&xt){let U=xe.getBoundingClientRect(),ee=ge.getBoundingClientRect(),vt=U.right-C.left,te=U.top+U.height/2-C.top,st=ee.left-C.left-8,bt=ee.top+ee.height/2-C.top;xt.setAttribute("d",`M ${vt} ${te} H ${st-14} V ${bt} H ${st}`)}}function Xe(t,d){if(!fe||!Fe||t===B)return;let E=o.querySelector("#expand-comparison"),C=(B?se:fe).getBoundingClientRect(),xe=window.matchMedia("(prefers-reduced-motion: reduce)").matches,ge=fe.querySelector(".pan-viewport"),xt=ge?ge.scrollLeft/Math.max(1,ge.scrollWidth-ge.clientWidth):0,U=ge?ge.scrollTop/Math.max(1,ge.scrollHeight-ge.clientHeight):0,ee=()=>fe.querySelectorAll(".pan-viewport").forEach((te)=>{te.scrollLeft=xt*Math.max(0,te.scrollWidth-te.clientWidth),te.scrollTop=U*Math.max(0,te.scrollHeight-te.clientHeight)}),vt=()=>{if(Fe.append(fe),Te)ni.append(Te),Te.inert=!1;se.close(),Fe.style.height="",He=!1,B=!1,E.innerHTML=we("expand"),E.setAttribute("aria-label","Enlarge comparison"),E.title="Enlarge comparison",E.setAttribute("aria-expanded","false"),ht(),ee(),E.focus({preventScroll:!0}),d?.()};if(t){Fe.style.height=`${C.height}px`,mn(),se.showModal(),B=!0,E.innerHTML=we("compact"),E.setAttribute("aria-label","Restore comparison"),E.title="Restore comparison (Esc)",E.setAttribute("aria-expanded","true"),ht(),ee(),E.focus({preventScroll:!0});let te=se.getBoundingClientRect();if(!xe)se.animate([{transform:`translate(${C.x-te.x}px,${C.y-te.y}px) scale(${C.width/te.width},${C.height/te.height})`,opacity:0.6},{transform:"none",opacity:1}],{duration:240,easing:"cubic-bezier(.2,.8,.2,1)"})}else{if(E.disabled)return;let te=Fe.getBoundingClientRect();if(xe){vt();return}if(E.disabled=!0,He=!0,Te)Te.inert=!0;let st=se.animate([{transform:"none",opacity:1},{transform:`translate(${te.x-C.x}px,${te.y-C.y}px) scale(${te.width/C.width},${te.height/C.height})`,opacity:0.6}],{duration:200,easing:"cubic-bezier(.4,0,.2,1)",fill:"forwards"});se.inert=!0;let bt=()=>{if(st.cancel(),E.disabled=!1,se.inert=!1,se.isConnected)vt();else He=!1,B=!1,H(),d?.()};st.finished.then(bt,bt)}}if(Ce=(t)=>Xe(!1,t),K("expand-comparison",()=>Xe(!B)),se.addEventListener("cancel",(t)=>{t.preventDefault(),t.stopPropagation(),Xe(!1)}),se.addEventListener("keydown",(t)=>{if(t.key==="Escape")t.preventDefault(),t.stopPropagation(),Xe(!1)}),et=Ct(o),oe=new ResizeObserver(()=>{ht(),Kt()}),oe.observe(fn),oe.observe(se),Te)oe.observe(Te);let xn=o.querySelector(".inspection-content");if(xn)oe.observe(xn);let vn=o.querySelector(".repair-context");if(vn)oe.observe(vn);let bn=fe?.querySelector(".compare-toolbar");if(bn)oe.observe(bn);ht();let ft=Array.from(o.querySelectorAll(".pan-viewport"));if(ft.forEach((t)=>{t.scrollLeft=j,t.scrollTop=ut}),ft.forEach((t)=>{t.querySelectorAll("img").forEach((d)=>d.draggable=!1),t.addEventListener("click",()=>{if(!B)Xe(!0)}),t.addEventListener("pointermove",(d)=>{if(d.pointerType!=="mouse"||d.buttons||!t.classList.contains("pannable"))return;let E=t.getBoundingClientRect();t.scrollLeft=Gt(d.clientX,E.left,t.clientWidth,t.scrollWidth),t.scrollTop=Gt(d.clientY,E.top,t.clientHeight,t.scrollHeight)}),t.addEventListener("keydown",(d)=>{if(!B&&(d.key==="Enter"||d.key===" ")){d.preventDefault(),d.stopPropagation(),Xe(!0);return}let C={ArrowLeft:[-48,0],ArrowRight:[48,0],ArrowUp:[0,-48],ArrowDown:[0,48]}[d.key];if(!C)return;d.preventDefault(),d.stopPropagation(),t.scrollLeft+=C[0],t.scrollTop+=C[1]})}),ft.forEach((t)=>t.addEventListener("scroll",()=>{for(let d of ft)if(d!==t){if(d.scrollLeft!==t.scrollLeft)d.scrollLeft=t.scrollLeft;if(d.scrollTop!==t.scrollTop)d.scrollTop=t.scrollTop}})),it&&window.matchMedia("(max-width:800px)").matches){let t=o.querySelector(".inspection-content"),d=o.querySelector(".compare");if(t&&d)t.scrollTop+=d.getBoundingClientRect().top-t.getBoundingClientRect().top}if(Kt(),window.scrollTo(W,_),!k)r.onDraftChange?.(structuredClone(a))}return H(),{destroy(){oe?.disconnect(),et?.(),o.replaceChildren()},getDraft(){return structuredClone(a)}}}function li(){let n=document.createElement("style");n.textContent=[["Albert Sans","albertsans"],["Alumni Sans","alumnisans"],["JetBrains Mono","jetbrainsmono"]].map(([e,r])=>`@font-face{font-family:"${e}";src:url(/fonts/${r}.ttf);font-weight:100 900}`).join(""),document.head.append(n)}function pi(n){let e=document.createElement("div");e.setAttribute("role","alert"),e.style.cssText="max-width:560px;margin:18vh auto 0;padding:0 0 0 18px;border-left:2px solid var(--ks-vermilion,oklch(52% 0.16 35));color:var(--ks-text,oklch(22% 0 0));font:400 15px/1.55 var(--font-sans,Arial,sans-serif)";let r=document.createElement("p");r.textContent="Review unavailable",r.style.cssText="margin:0 0 8px;font:400 11px/1.3 var(--font-mono,monospace);letter-spacing:.14em;text-transform:uppercase;color:var(--ks-text-muted,oklch(46% 0 0))";let o=document.createElement("strong");o.textContent="The review could not be opened.",o.style.cssText="display:block;font-weight:500;color:var(--ks-ink,oklch(13% 0 0))";let a=document.createElement("p");a.style.cssText="margin:4px 0 18px;color:var(--ks-text-muted,oklch(46% 0 0))",a.textContent=`${n} If the review server stopped, ask the agent to serve the review again, then reload.`;let l=document.createElement("button");return l.textContent="Reload",l.style.cssText="font:500 15px/1 var(--font-sans,Arial,sans-serif);min-height:44px;padding:0 22px;border:1px solid oklch(13% 0 0);border-radius:3px;background:oklch(13% 0 0);color:oklch(99.5% 0 0);cursor:pointer",l.onclick=()=>location.reload(),e.append(r,o,a,l),e}async function di(){li();let n=document.getElementById("review"),e=await fetch("/packet",{cache:"no-store"});if(!e.ok)throw Error("The review packet could not be loaded.");let r=await e.json(),o=Et(r.packet);if(r.sourceStatus&&!o){let a=document.createElement("p");a.textContent=r.sourceStatus,n.before(a)}_n(n,r.packet,{initialDraft:r.draft,history:r.history,completed:!!r.receipt,status:o?r.sourceStatus:null,onSubmit:async(a)=>{let l=await fetch("/decision",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),y=await l.json().catch(()=>({}));if(!l.ok)throw Error(y.error??"The review could not be saved. Try again.")}})}di().catch((n)=>{document.getElementById("review")?.replaceChildren(pi(n instanceof Error?n.message:String(n)))});})();