mesurer-solid 0.1.8-beta.3 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -181,7 +181,7 @@ Direct text editing records copy and typography intent without pretending to edi
181
181
 
182
182
  Editing starts by double-click/double-tap while Select or Typography is active. Arrange keeps Select active, so editing works while Arrange remains selected.
183
183
 
184
- Native editing stays native. Mesurer does not intercept form controls or descendants that inherit `contenteditable`. A nested `contenteditable="false"` boundary ends inherited editability and can become a Mesurer target when the direct-text rules otherwise pass.
184
+ Native editing stays native. Mesurer does not intercept form controls or descendants that inherit `contenteditable`. A nested `contenteditable="false"` boundary ends inherited editability and can become a Mesurer target when the direct-text rules otherwise pass. Mixed inline copy can target the exact direct text run under the pointer while preserving inline children and the host element's native DOM surface.
185
185
 
186
186
  The editing UI exposes direct B/I/U, Font, Size, Weight, rendered-page colors, custom color, and a separate Text/H1/H2/H3 semantic preset popup. Missing heading levels are not invented.
187
187
 
package/README.md CHANGED
@@ -4,6 +4,10 @@ Framework-agnostic UI inspection, measurement, visual intent, and agent-readable
4
4
 
5
5
  Mesurer Solid ships its own isolated Solid 2 renderer. Host applications can use Solid 1 or 2, React, Vue, Svelte, vanilla DOM, or an Electron renderer without providing Solid.
6
6
 
7
+ <p align="center">
8
+ <img src="https://raw.githubusercontent.com/jhomra21/mesurer-solid/main/docs/assets/readme/hero-multi-spacing.png" alt="Mesurer Solid measuring spacing between selected elements" width="100%">
9
+ </p>
10
+
7
11
  ## Installation
8
12
 
9
13
  ```bash
@@ -88,7 +92,7 @@ For explicit plugin composition, `mesurer-solid/plugins` also exports `select`,
88
92
 
89
93
  Arrange is not a toolbar mode. It can be activated before a selection exists and enables Select automatically. Turning Arrange off leaves Select active; turning Select off exits Arrange.
90
94
 
91
- Direct text editing respects native editing boundaries. Descendants of an editable ancestor remain native, while a nested `contenteditable="false"` boundary ends inherited editability and can become a Mesurer target when the normal direct-text rules pass.
95
+ Direct text editing respects native editing boundaries. Descendants of an editable ancestor remain native, while a nested `contenteditable="false"` boundary ends inherited editability and can become a Mesurer target when the normal direct-text rules pass. Mixed inline copy can target the exact direct text run before or after an inline child without flattening or recreating that child, and the host element keeps its native DOM APIs throughout the interaction.
92
96
 
93
97
  While direct text editing is active, Mesurer keeps one visible edit ring, keeps the selected dimensions pill and Typography separated by the same `2px` rendered gap when the card is below the source, and keeps Typography stationary during ordinary pointer movement. The selection-adjacent Add Note button is suppressed only for the active edit and returns when the editor closes; saved annotation markers and panels remain available.
94
98
 
package/dist/index.js CHANGED
@@ -17020,7 +17020,7 @@ async function Q_(e, t, n) {
17020
17020
  }
17021
17021
  //#endregion
17022
17022
  //#region src/version.ts
17023
- var $_ = "0.1.8-beta.3", ev = "mesurer.context", tv = "context:v1", nv = "mesurer.context.settings", rv = "context.ui", iv = "data-mesurer-direct-text-edit-active", av = {
17023
+ var $_ = "0.1.8", ev = "mesurer.context", tv = "context:v1", nv = "mesurer.context.settings", rv = "context.ui", iv = "data-mesurer-direct-text-edit-active", av = {
17024
17024
  viewBox: "0 0 256 256",
17025
17025
  paths: ["M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"]
17026
17026
  }, ov = {
@@ -1478,5 +1478,5 @@ body.mesurer-solid-xray [data-mesurer-root], body.mesurer-solid-xray [data-mesur
1478
1478
  z-index: ${_g} !important;
1479
1479
  }
1480
1480
  `,t.head.append(o),i.append(a);let s=!1;return{element:a,dispose(){s||(s=!0,o.remove(),a.remove())}}}var yg=`mesurer:capture-bridge-ping`,bg=`mesurer:capture-bridge-request`,xg=`mesurer:capture-bridge-response`,Sg=(e,t,n)=>{let r=Math.max(0,Math.min(e.x,t.x,n.width)),i=Math.max(0,Math.min(e.y,t.y,n.height)),a=Math.max(0,Math.min(Math.max(e.x,t.x),n.width)),o=Math.max(0,Math.min(Math.max(e.y,t.y),n.height));return{left:r,top:i,width:Math.max(0,a-r),height:Math.max(0,o-i)}},Cg=async(e,t,n,r)=>{let i=await createImageBitmap(e);try{let e=i.width/n.width,a=i.height/n.height,o=Math.max(0,Math.round(t.left*e)),s=Math.max(0,Math.round(t.top*a)),c=Math.max(1,Math.min(i.width-o,Math.round(t.width*e))),l=Math.max(1,Math.min(i.height-s,Math.round(t.height*a))),u=r.createElement(`canvas`);u.width=c,u.height=l;let d=u.getContext(`2d`);if(!d)throw Error(`Could not crop screenshot`);return d.drawImage(i,o,s,c,l,0,0,c,l),await new Promise((e,t)=>{u.toBlob(n=>{n?e(n):t(Error(`Could not crop screenshot`))},`image/png`)})}finally{i.close()}},wg=async(e,t)=>{let n=t.navigator.clipboard,r=globalThis.ClipboardItem;if(!n?.write||!r)throw Error(`PNG clipboard copy is not available`);await n.write([new r({"image/png":e})])},Tg=(e=new Date)=>{let t=e=>String(e).padStart(2,`0`);return`mesurer-${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}-${t(e.getHours())}${t(e.getMinutes())}${t(e.getSeconds())}.png`},Eg=(e,t,n,r)=>{let i=globalThis.URL.createObjectURL(e),a=n.createElement(`a`);a.href=i,a.download=t,a.rel=`noopener`,n.documentElement.append(a),a.click(),a.remove(),r.setTimeout(()=>globalThis.URL.revokeObjectURL(i),1e3)},Dg=e=>new Promise(t=>{e.requestAnimationFrame(()=>{e.requestAnimationFrame(()=>t())})}),Og=e=>e.crypto?.randomUUID?.()??`mesurer-${Date.now()}-${Math.random().toString(36).slice(2)}`,kg=(e,t,n=``)=>`${e}:${t}:${n}`,Ag=(e,t,n)=>{let r=`${t}:${n}:`;return e.startsWith(r)?e.slice(r.length):null},jg=e=>new Promise(t=>{let n=Og(e),r=e.location.origin,i=o=>{o.source===e&&o.origin===r&&Ag(String(o.data??``),`mesurer:capture-bridge-pong`,n)!==null&&(e.removeEventListener(`message`,i),e.clearTimeout(a),t(!0))},a=e.setTimeout(()=>{e.removeEventListener(`message`,i),t(!1)},80);e.addEventListener(`message`,i),e.postMessage(kg(yg,n),r)}),Mg=e=>new Promise((t,n)=>{let r=Og(e),i=e.location.origin,a=s=>{if(s.source!==e||s.origin!==i)return;let c=Ag(String(s.data??``),xg,r);if(c===null)return;if(e.removeEventListener(`message`,a),e.clearTimeout(o),!c.startsWith(`ok:`)){t(null);return}let l=c.slice(3);if(!l){t(null);return}e.fetch(l).then(e=>e.blob()).then(t,n)},o=e.setTimeout(()=>{e.removeEventListener(`message`,a),t(null)},4e3);e.addEventListener(`message`,a),e.postMessage(kg(bg,r),i)}),Ng=new WeakMap,Pg=e=>{let t=Ng.get(e),n=t?.stream.getVideoTracks()[0];if(!t||!n||n.readyState!==`live`){Ng.delete(e);return}return t},Fg=async(e,t)=>{let n=Pg(t);if(n)return n;let r=t.navigator.mediaDevices;if(!r?.getDisplayMedia)throw Error(`Screenshot capture is unavailable`);let i=await r.getDisplayMedia({audio:!1,video:!0,preferCurrentTab:!0,selfBrowserSurface:`include`}),a=i.getVideoTracks()[0];if(!a)throw i.getTracks().forEach(e=>e.stop()),Error(`Capture failed`);try{let n=e.createElement(`video`);n.autoplay=!0,n.muted=!0,n.playsInline=!0,n.srcObject=i,await n.play(),(n.videoWidth===0||n.videoHeight===0)&&await new Promise(e=>{n.onloadedmetadata=()=>e()});let r={stream:i,video:n};return Ng.set(t,r),a.addEventListener(`ended`,()=>{Ng.get(t)===r&&Ng.delete(t)},{once:!0}),r}catch(e){throw i.getTracks().forEach(e=>e.stop()),e}},Ig=e=>{let t=Ng.get(e);t&&(Ng.delete(e),t.video.pause(),t.video.srcObject=null,t.stream.getTracks().forEach(e=>e.stop()))},Lg=async({ownerDocument:e,ownerWindow:t})=>{let{video:n}=await Fg(e,t),r=e.createElement(`canvas`);r.width=n.videoWidth,r.height=n.videoHeight;let i=r.getContext(`2d`);if(!i)throw Error(`Capture failed`);return i.drawImage(n,0,0),await new Promise((e,t)=>{r.toBlob(n=>{n?e(n):t(Error(`Capture failed`))},`image/png`)})},Rg=async(e,t)=>{await jg(t)||await Fg(e,t)},zg=async({ownerDocument:e,ownerWindow:t})=>{if(await jg(t)){let e=await Mg(t);if(e)return e}return Lg({ownerDocument:e,ownerWindow:t})},Bg=144,Vg=96,Hg=8,Ug=4,Wg=1800,Gg=(e,t)=>{for(let[n,r]of Object.entries(t))e.style.setProperty(n,r)},Kg=(e,t)=>({left:Math.min(Math.max(Hg,e.left),Math.max(Hg,t.innerWidth-Bg-Hg)),top:Math.min(Math.max(Hg,e.top),Math.max(Hg,t.innerHeight-Vg-Hg))}),qg=(e,t)=>{let n=e.createElement(`button`);return n.type=`button`,n.textContent=t,Gg(n,{height:`32px`,padding:`0 12px`,border:`1px solid rgb(255 255 255 / 18%)`,"border-radius":`8px`,"background-color":`rgb(28 28 30 / 84%)`,color:`white`,"font-family":`inherit`,"font-size":`12px`,"font-weight":`500`,cursor:`pointer`}),n},Jg=({copied:e,downloaded:t,copyFailed:n,downloadFailed:r})=>e&&t?`Copied and saved screenshot`:e&&r?`Copied screenshot · Save unavailable`:t&&n?`Saved screenshot · Copy unavailable`:e?`Copied screenshot`:t?`Saved screenshot`:n&&r?`Screenshot captured · Copy and save unavailable`:n?`Screenshot captured · Copy unavailable`:r?`Screenshot captured · Save unavailable`:`Screenshot captured`,Yg=e=>e!==null&&(e.nodeType===1||e.nodeType===11),Xg=({ownerDocument:e,ownerWindow:t,root:n,previewDurationMs:r})=>{let i=n.closest(`[data-mesurer-root='true']`)?.parentNode??n.parentNode;if(!Yg(i))throw Error(`Screenshot preview requires a mounted Mesurer host.`);let a=e.createElement(`div`);a.dataset.mesurerInspectorUi=`true`,a.dataset.mesurerScreenshotInteractive=`true`,Gg(a,{position:`fixed`,left:`0`,top:`0`,width:`0`,height:`0`,overflow:`visible`,"z-index":`96`,"pointer-events":`auto`,"font-family":`ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif`}),i.append(a);let o=e.createElement(`div`);o.dataset.mesurerScreenshotPreview=`true`,o.setAttribute(`role`,`button`),o.setAttribute(`aria-label`,`Open captured screenshot`),o.tabIndex=0,Gg(o,{position:`fixed`,display:`none`,"z-index":`96`,width:`${Bg}px`,height:`${Vg}px`,"box-sizing":`border-box`,overflow:`hidden`,"border-radius":`10px`,border:`1px solid rgb(0 0 0 / 14%)`,"background-color":`white`,"box-shadow":`0 2px 8px rgb(0 0 0 / 12%)`,"pointer-events":`auto`,cursor:`grab`,"user-select":`none`,"touch-action":`none`});let s=e.createElement(`img`);s.dataset.mesurerScreenshotPreviewImage=`true`,s.alt=`Captured screenshot`,s.draggable=!1,s.title=`Click to open · Right-click for browser image actions`,Gg(s,{display:`block`,width:`100%`,height:`100%`,"object-fit":`contain`,"background-color":`white`}),o.append(s);let c=e.createElement(`button`);c.dataset.mesurerScreenshotPreviewDismiss=`true`,c.type=`button`,c.setAttribute(`aria-label`,`Dismiss screenshot preview`),c.title=`Dismiss`,Gg(c,{position:`absolute`,top:`8px`,right:`8px`,width:`20px`,height:`20px`,display:`flex`,"align-items":`center`,"justify-content":`center`,"box-sizing":`border-box`,padding:`0`,border:`0`,"border-radius":`999px`,"background-color":`rgb(48 51 64)`,color:`white`,"font-family":`inherit`,"font-size":`14px`,"line-height":`1`,"z-index":`1`,cursor:`pointer`});let l=e.createElementNS(`http://www.w3.org/2000/svg`,`svg`);l.setAttribute(`viewBox`,`0 0 16 16`),l.setAttribute(`width`,`12`),l.setAttribute(`height`,`12`),l.setAttribute(`fill`,`none`),l.setAttribute(`aria-hidden`,`true`);let u=e.createElementNS(`http://www.w3.org/2000/svg`,`path`);u.setAttribute(`d`,`m4 4 8 8M12 4l-8 8`),u.setAttribute(`stroke`,`currentColor`),u.setAttribute(`stroke-width`,`1.75`),u.setAttribute(`stroke-linecap`,`round`),l.append(u),c.append(l),o.append(c),a.append(o);let d=e.createElement(`div`);d.dataset.mesurerScreenshotViewer=`true`,d.setAttribute(`role`,`dialog`),d.setAttribute(`aria-modal`,`true`),d.setAttribute(`aria-label`,`Screenshot viewer`),Gg(d,{position:`fixed`,inset:`0`,display:`none`,"z-index":`110`,"align-items":`center`,"justify-content":`center`,padding:`56px 48px 40px`,"box-sizing":`border-box`,"background-color":`rgb(0 0 0 / 72%)`,"backdrop-filter":`blur(8px)`,"pointer-events":`auto`});let f=e.createElement(`img`);f.dataset.mesurerScreenshotViewerImage=`true`,f.alt=`Captured screenshot`,Gg(f,{display:`block`,"max-width":`calc(100vw - 96px)`,"max-height":`calc(100vh - 112px)`,width:`auto`,height:`auto`,"object-fit":`contain`,"border-radius":`8px`,"box-shadow":`0 8px 30px rgb(0 0 0 / 28%)`}),d.append(f);let p=e.createElement(`div`);p.dataset.mesurerScreenshotViewerControls=`true`,Gg(p,{position:`fixed`,top:`16px`,right:`16px`,display:`flex`,gap:`8px`,"pointer-events":`auto`});let m=qg(e,`Copy`);m.dataset.mesurerScreenshotViewerCopy=`true`,m.setAttribute(`aria-label`,`Copy screenshot`);let h=qg(e,`Save`);h.dataset.mesurerScreenshotViewerSave=`true`,h.setAttribute(`aria-label`,`Save screenshot`);let g=qg(e,`Close`);g.dataset.mesurerScreenshotViewerClose=`true`,g.setAttribute(`aria-label`,`Close screenshot viewer`),p.append(m,h,g),d.append(p),a.append(d);let _=e.createElement(`div`);_.dataset.mesurerScreenshotToast=`true`,_.setAttribute(`role`,`status`),Gg(_,{position:`fixed`,left:`50%`,bottom:`20px`,display:`none`,"z-index":`120`,transform:`translateX(-50%)`,padding:`7px 10px`,"border-radius":`8px`,"background-color":`rgb(28 28 30 / 90%)`,color:`white`,"font-size":`12px`,"font-weight":`500`,"pointer-events":`none`}),a.append(_);let v=null,y=null,b=null,x=null,S=0,C=0,w=!1,T=()=>{S&&t.clearTimeout(S),S=0},E=()=>{C&&t.clearTimeout(C),C=0},D=(e,n=!1)=>{E(),_.textContent=e,_.style.backgroundColor=n?`#b42318`:`rgb(28 28 30 / 90%)`,_.style.display=`block`,C=t.setTimeout(()=>{C=0,_.style.display=`none`},Wg)},O=()=>{d.style.display=`none`},k=()=>{y&&globalThis.URL.revokeObjectURL(y),y=null,v=null,s.removeAttribute(`src`),f.removeAttribute(`src`)},A=()=>{T(),O(),o.style.display=`none`,k()},j=()=>Kg({left:t.innerWidth-Bg-Hg,top:t.innerHeight-Vg-Hg},t),M=e=>{let n=Kg(e,t);b=n,o.style.left=`${n.left}px`,o.style.top=`${n.top}px`},N=()=>{!v||!y||(T(),d.style.display=`flex`,g.focus())},P=async()=>{let e=v;if(e)try{await wg(Promise.resolve(e),t),D(`Copied screenshot`)}catch{D(`Could not copy screenshot`,!0)}},F=()=>{let n=v;if(n)try{Eg(n,Tg(),e,t),D(`Saved screenshot`)}catch{D(`Could not save screenshot`,!0)}},I=(e,t,n)=>{if(!v)return!1;T();let r=o.getBoundingClientRect();return x={pointerId:n,startX:e,startY:t,left:r.left,top:r.top,moved:!1},o.style.cursor=`grabbing`,!0},L=(e,t)=>{let n=x;if(!n)return;let r=e-n.startX,i=t-n.startY;!n.moved&&Math.hypot(r,i)>=Ug&&(n.moved=!0),n.moved&&M({left:n.left+r,top:n.top+i})},R=()=>{let e=x;e&&(x=null,o.style.cursor=`grab`,e.moved||N())},z=()=>{x&&(x=null,o.style.cursor=`grab`)},B=e=>{e.button!==0||!I(e.clientX,e.clientY,null)||e.preventDefault()},V=e=>{x?.pointerId===null&&L(e.clientX,e.clientY)},H=e=>{e.button===0&&x?.pointerId===null&&R()},ee=e=>{e.pointerType!==`mouse`&&e.button===0&&I(e.clientX,e.clientY,e.pointerId)&&(o.setPointerCapture?.(e.pointerId),e.preventDefault())},U=e=>{let t=x?.pointerId;t!=null&&t===e.pointerId&&L(e.clientX,e.clientY)},te=e=>{let t=x?.pointerId;t!=null&&t===e.pointerId&&(o.hasPointerCapture?.(e.pointerId)&&o.releasePointerCapture(e.pointerId),R())},ne=e=>{let t=x?.pointerId;t!=null&&t===e.pointerId&&(o.hasPointerCapture?.(e.pointerId)&&o.releasePointerCapture(e.pointerId),z())},re=e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),N())},ie=e=>{e.target!==s&&e.preventDefault()},ae=e=>{e.target===d&&O()},oe=e=>{e.key===`Escape`&&d.style.display!==`none`&&(e.preventDefault(),e.stopImmediatePropagation(),O())};return c.addEventListener(`pointerdown`,e=>e.stopPropagation()),c.addEventListener(`mousedown`,e=>e.stopPropagation()),c.addEventListener(`click`,e=>{e.stopPropagation(),A()}),o.addEventListener(`mousedown`,B),o.addEventListener(`pointerdown`,ee),o.addEventListener(`keydown`,re),o.addEventListener(`contextmenu`,ie),d.addEventListener(`click`,ae),m.addEventListener(`click`,()=>{P()}),h.addEventListener(`click`,F),g.addEventListener(`click`,O),t.addEventListener(`mousemove`,V,!0),t.addEventListener(`mouseup`,H,!0),t.addEventListener(`pointermove`,U,!0),t.addEventListener(`pointerup`,te,!0),t.addEventListener(`pointercancel`,ne,!0),t.addEventListener(`keydown`,oe,!0),{show(e,n){if(w)return;T(),O(),k(),v=e;let i=globalThis.URL.createObjectURL(e);y=i,s.src=i,f.src=i,o.style.display=`block`,M(b??j()),D(Jg(n)),r>0&&(S=t.setTimeout(A,r))},dismiss:A,dispose(){w||(w=!0,T(),E(),A(),t.removeEventListener(`mousemove`,V,!0),t.removeEventListener(`mouseup`,H,!0),t.removeEventListener(`pointermove`,U,!0),t.removeEventListener(`pointerup`,te,!0),t.removeEventListener(`pointercancel`,ne,!0),t.removeEventListener(`keydown`,oe,!0),o.removeEventListener(`mousedown`,B),o.removeEventListener(`pointerdown`,ee),o.removeEventListener(`keydown`,re),o.removeEventListener(`contextmenu`,ie),d.removeEventListener(`click`,ae),a.remove())}}},Zg=`mesurer.screenshot`,Qg=`screenshot`,$g=`mesurer.screenshot.settings`,e_=`mesurer.screenshot.active`,t_=`runtime:solid`,n_=`screenshot.toggle`,r_=2500,i_=0,a_=[`[data-mesurer-measurement='true']`,`[data-mesurer-selected-measurement='true']`,`[data-mesurer-selection-spacing-target='true']`,`[data-mesurer-guide='true']`,`[data-mesurer-distance='true']`].join(`,`),o_=`${a_},[data-mesurer-rulers='true']`,s_={viewBox:`0 0 256 256`,paths:[`m 96,50 a 6.0006,6.0006 0 0 0 -4.992188,2.671875 L 76.789062,74 H 40 C 27.920803,74 18,83.920803 18,96 v 96 c 0,12.0792 9.920803,22 22,22 h 176 c 12.0792,0 22,-9.9208 22,-22 V 96 C 238,83.920803 228.0792,74 216,74 H 179.21094 L 164.99219,52.671875 A 6.0006,6.0006 0 0 0 160,50 Z m 3.210937,12 h 57.578123 l 14.21875,21.328125 A 6.0006,6.0006 0 0 0 176,86 h 40 c 5.59392,0 10,4.406085 10,10 v 96 c 0,5.59392 -4.40608,10 -10,10 H 40 c -5.593915,0 -10,-4.40608 -10,-10 V 96 c 0,-5.593915 4.406085,-10 10,-10 h 40 a 6.0006,6.0006 0 0 0 4.992187,-2.671875 z`,`m 128,94 c -23.12489,0 -42,18.87511 -42,42 0,23.12489 18.87511,42 42,42 23.12489,0 42,-18.87511 42,-42 0,-23.12489 -18.87511,-42 -42,-42 z m 0,12 c 16.63961,0 30,13.36039 30,30 0,16.63961 -13.36039,30 -30,30 -16.63961,0 -30,-13.36039 -30,-30 0,-16.63961 13.36039,-30 30,-30 z`]},c_=(e,t)=>{for(let[n,r]of Object.entries(t))e.style.setProperty(n,r)},l_=(e,t)=>{for(let n of[`left`,`top`,`right`,`bottom`,`width`,`height`]){let r=t[n];r===void 0?e.style.removeProperty(n):e.style.setProperty(n,`${r}px`)}},u_=e=>{let t=e($g);return{toolEnabled:t?.toolEnabled??!0,copy:t?.copy??!0,download:t?.download??!1,includeMeasurements:t?.includeMeasurements??!1}},d_=e=>({value:e.style.getPropertyValue(`display`),priority:e.style.getPropertyPriority(`display`)}),f_=(e,t)=>{t.value||t.priority?e.style.setProperty(`display`,t.value,t.priority):e.style.removeProperty(`display`)},p_=(e,t)=>{let n=e;for(;n.parentElement&&n.parentElement!==t;)n=n.parentElement;return n.parentElement===t?n:null},m_=e=>{let t=e.querySelector(`[data-mesurer-root='true']`);if(!t)return()=>void 0;let n=new Set;for(let e of t.querySelectorAll(`[data-mesurer-rulers='true']`)){let r=p_(e,t);r&&n.add(r)}for(let e of t.querySelectorAll(a_)){let r=p_(e,t);r&&n.add(r)}let r=[];for(let e of n)e.dataset.mesurerInspectorUi!==`true`&&(r.push({element:e,display:d_(e)}),e.style.setProperty(`display`,`none`,`important`));return()=>{for(let e of r)f_(e.element,e.display)}},h_=e=>Array.from(e.querySelectorAll(o_)).filter(e=>e.dataset.mesurerInspectorUi===`true`).map(e=>({element:e,display:d_(e)})),g_=e=>{for(let t of e)t.element.isConnected&&f_(t.element,t.display)},__=(e={})=>_a({id:Zg,version:`0.1.0`,requires:[t_],provides:[`tool:screenshot`,`capture:screenshot`,`settings:screenshot`],setup(t){let n=t.service.get(t_);if(!n)throw Error(`Screenshot plugin requires the Solid renderer runtime.`);let{ownerDocument:r,ownerWindow:i}=n,a=n.createWorkspaceRuntime(),o=n.createInspectorMount(),s=e.captureVisibleTab??zg,c=e.previewDurationMs??i_;t.state.register({id:$g,initial:{toolEnabled:e.toolEnabled??!0,copy:e.copy??!0,download:e.download??!1,includeMeasurements:e.includeMeasurements??!1},persist:!0}),t.state.register({id:e_,initial:!1});let l=o.element;l.dataset.mesurerScreenshot=`true`,c_(l,{position:`fixed`,inset:`0`,"z-index":`85`,"pointer-events":`none`,"font-family":`ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif`});let u=r.createElement(`div`);u.dataset.mesurerScreenshotSelect=`true`,u.setAttribute(`role`,`application`),u.setAttribute(`aria-label`,`Screenshot selection`),c_(u,{position:`fixed`,inset:`0`,display:`none`,"z-index":`85`,cursor:`crosshair`,"pointer-events":`auto`,"user-select":`none`,"touch-action":`none`}),l.append(u);let d=Array.from({length:4},()=>{let e=r.createElement(`div`);return c_(e,{position:`fixed`,"background-color":`rgb(0 0 0 / 40%)`,"pointer-events":`none`}),u.append(e),e}),f=r.createElement(`div`);c_(f,{position:`fixed`,display:`none`,border:`1px solid #0d99ff`,"box-sizing":`border-box`,"pointer-events":`none`}),u.append(f);let p=r.createElement(`div`);c_(p,{position:`fixed`,display:`none`,"z-index":`86`,transform:`translateX(-50%)`,"border-radius":`4px`,padding:`2px 4px`,"background-color":`#0d99ff`,color:`white`,"font-size":`10px`,"font-variant-numeric":`tabular-nums`,"pointer-events":`none`}),u.append(p);let m=r.createElement(`div`);m.textContent=`Drag to select · Esc to cancel`,c_(m,{position:`fixed`,left:`50%`,bottom:`16px`,transform:`translateX(-50%)`,"border-radius":`4px`,padding:`4px 8px`,"background-color":`black`,color:`white`,"font-size":`11px`,"pointer-events":`none`}),u.append(m);let h=r.createElement(`div`);h.dataset.mesurerScreenshotError=`true`,h.setAttribute(`role`,`status`),h.textContent=`Could not save screenshot`,c_(h,{position:`fixed`,display:`none`,"z-index":`97`,"border-radius":`6px`,padding:`6px 8px`,"background-color":`#b42318`,color:`white`,"font-size":`11px`,"pointer-events":`none`}),l.append(h);let g=null,_=null,v=0,y=0,b=!1,x=!1,S=!1,C=()=>t.state.get(`mesurer.screenshot.active`)??!1,w=()=>u_(t.state.get),T=e=>{t.state.update($g,t=>{let n={...t};return e.toolEnabled!==void 0&&(n.toolEnabled=e.toolEnabled),e.copy!==void 0&&(n.copy=e.copy),e.download!==void 0&&(n.download=e.download),e.includeMeasurements!==void 0&&(n.includeMeasurements=e.includeMeasurements),n})},E=e=>{C()!==e&&t.state.update(`mesurer.screenshot.active`,()=>e)},D=()=>{if(_)return;let e=n.portalTarget.querySelector(`[data-mesurer-toolbar='true']`);e&&(_={element:e,visibility:{value:e.style.getPropertyValue(`visibility`),priority:e.style.getPropertyPriority(`visibility`)}},e.style.setProperty(`visibility`,`hidden`,`important`))},O=()=>{if(!_)return;let{element:e,visibility:t}=_;_=null,t.value||t.priority?e.style.setProperty(`visibility`,t.value,t.priority):e.style.removeProperty(`visibility`)},k=e=>{let t=i.innerWidth,n=i.innerHeight;if(!e||e.width<=0||e.height<=0){l_(d[0],{left:0,top:0,width:t,height:n});for(let e of d.slice(1))l_(e,{left:0,top:0,width:0,height:0});f.style.display=`none`,p.style.display=`none`;return}l_(d[0],{left:0,top:0,width:t,height:e.top}),l_(d[1],{left:0,top:e.top,width:e.left,height:e.height}),l_(d[2],{left:e.left+e.width,top:e.top,width:Math.max(0,t-e.left-e.width),height:e.height}),l_(d[3],{left:0,top:e.top+e.height,width:t,height:Math.max(0,n-e.top-e.height)}),f.style.display=`block`,l_(f,e),p.style.display=`block`,p.textContent=`${Math.round(e.width)} × ${Math.round(e.height)}`,l_(p,{left:e.left+e.width/2,top:Math.min(n-22,e.top+e.height+6)})},A=()=>n.portalTarget.querySelector(`[data-mesurer-tool-id='screenshot']`)?.getBoundingClientRect()??null,j=Xg({ownerDocument:r,ownerWindow:i,root:l,previewDurationMs:c}),M=e=>{let t=A(),n=Math.max(140,e.offsetWidth||140),r=Math.max(26,e.offsetHeight||26),a=t?Math.min(i.innerWidth-n-8,Math.max(8,t.left+t.width/2-n/2)):8,o=t?t.bottom+8:8,s=o+r<=i.innerHeight-8?o:Math.max(8,(t?.top??i.innerHeight)-r-8);e.style.left=`${a}px`,e.style.top=`${s}px`},N=()=>{v&&i.clearTimeout(v),h.style.display=`block`,M(h),v=i.setTimeout(()=>{v=0,h.style.display=`none`},r_)},P=()=>{g=null,k(null),u.style.visibility=``,u.style.display=`none`,l.style.pointerEvents=`none`,E(!1),O()},F=()=>{y+=1,P(),Ig(i)},I=async e=>{if(b)throw Error(`A screenshot capture is already running.`);if(e.width<4||e.height<4)throw Error(`Screenshot selection must be at least 4px by 4px.`);b=!0;let o=++y,c=w(),l=c.includeMeasurements?h_(r):[],d=c.includeMeasurements?()=>void 0:m_(n.portalTarget);a.prepareCapture(),c.includeMeasurements&&g_(l);try{u.style.visibility=`hidden`,await Dg(i);let n=await Cg(await s({ownerDocument:r,ownerWindow:i}),e,{width:i.innerWidth,height:i.innerHeight},r);if(y!==o)throw Error(`Screenshot capture was cancelled.`);let a=!1,l=!1,d=c.copy?wg(Promise.resolve(n),i).then(()=>{a=!0}):Promise.resolve(),f=c.download?Promise.resolve().then(()=>{Eg(n,Tg(),r,i),l=!0}):Promise.resolve(),p=await Promise.allSettled([d,f]),m=c.copy&&p[0]?.status===`rejected`,h=c.download&&p[1]?.status===`rejected`;if(y!==o)throw Error(`Screenshot capture was cancelled.`);return j.show(n,{copied:a,downloaded:l,copyFailed:m,downloadFailed:h}),await t.hook.emit(`screenshot:capture`,{rect:{...e},copied:a,downloaded:l}),{blob:n,rect:{...e},copied:a,downloaded:l}}catch(e){throw y===o&&N(),e}finally{u.style.visibility=``,d(),a.finishCapture(),b=!1}},L=async()=>{if(w().toolEnabled){if(C()){F();return}if(!x){x=!0,j.dismiss();try{if(e.captureVisibleTab===void 0&&await Rg(r,i),S)return;D(),k(null),u.style.visibility=`visible`,l.style.pointerEvents=`auto`,u.style.display=`block`,E(!0)}catch(e){throw e instanceof Error&&e.name===`AbortError`||N(),e}finally{x=!1}}}},R=e=>{!C()||e.button!==0||(e.preventDefault(),e.stopPropagation(),g={x:e.clientX,y:e.clientY},k(Sg(g,g,{width:i.innerWidth,height:i.innerHeight})),u.setPointerCapture?.(e.pointerId))},z=e=>{!C()||!g||k(Sg(g,{x:e.clientX,y:e.clientY},{width:i.innerWidth,height:i.innerHeight}))},B=e=>{let t=g;if(g=null,!C()||!t)return;u.hasPointerCapture?.(e.pointerId)&&u.releasePointerCapture(e.pointerId);let n=Sg(t,{x:e.clientX,y:e.clientY},{width:i.innerWidth,height:i.innerHeight});if(k(n),n.width<4||n.height<4){k(null);return}I(n).catch(()=>void 0).finally(()=>{C()&&P()})},V=e=>{g=null,u.hasPointerCapture?.(e.pointerId)&&u.releasePointerCapture(e.pointerId),k(null)},H=e=>{e.key!==`Escape`||!C()||(e.preventDefault(),e.stopImmediatePropagation(),F())};u.addEventListener(`pointerdown`,R),u.addEventListener(`pointermove`,z),u.addEventListener(`pointerup`,B),u.addEventListener(`pointercancel`,V),i.addEventListener(`keydown`,H,!0);let ee={active:C,settings:w,setSettings:T,start:L,cancel:F,capture:I};t.tool.register({id:`screenshot`,label:`Screenshot`,shortcut:`Shift+S`,order:70,command:n_,icon:s_,active:C,hidden:()=>!w().toolEnabled,menu:{label:`Screenshot options`,items:[{id:`copy`,label:`Auto-copy`,checked:()=>w().copy,run:()=>T({copy:!w().copy})},{id:`download`,label:`Auto-download`,checked:()=>w().download,run:()=>T({download:!w().download})},{id:`measurements`,label:`Include measurements`,checked:()=>w().includeMeasurements,run:()=>T({includeMeasurements:!w().includeMeasurements})}]}}),t.settings.register({id:`screenshot`,label:`Screenshot`,order:40,controls:[{type:`toggle`,id:`tool`,label:`Screenshot tool`,description:`Show the camera tool in the toolbar.`,value:()=>w().toolEnabled,set:e=>{T({toolEnabled:e}),!e&&C()&&F()}},{type:`toggle`,id:`copy`,label:`Auto-copy`,description:`Copy each successful capture when the browser allows it.`,value:()=>w().copy,set:e=>T({copy:e})},{type:`toggle`,id:`download`,label:`Auto-download`,description:`Download each successful capture as a PNG.`,value:()=>w().download,set:e=>T({download:e})},{type:`toggle`,id:`measurements`,label:`Include measurements`,description:`Keep selections, measurements, guides, distances, and rulers in the PNG.`,value:()=>w().includeMeasurements,set:e=>T({includeMeasurements:e})}]}),t.command.register(n_,L),t.service.provide(Qg,ee),t.lifecycle.onDispose(()=>{S=!0,y+=1,u.removeEventListener(`pointerdown`,R),u.removeEventListener(`pointermove`,z),u.removeEventListener(`pointerup`,B),u.removeEventListener(`pointercancel`,V),i.removeEventListener(`keydown`,H,!0),v&&i.clearTimeout(v),j.dispose(),O(),Ig(i),a.finishCapture(),a.dispose(),o.dispose()})}}),v_=e=>Number.parseFloat(e)||0,y_=0,b_=(e,t)=>{let n=t.CSS;return n?.escape?n.escape(e):e.replace(/[^a-zA-Z0-9_-]/g,e=>`\\${e}`)},x_=e=>e.nodeType===9,S_=e=>e.nodeType===11;function C_(e){let t=e.getRootNode();return S_(t)?t:e.ownerDocument}var w_=(e,t)=>{if(x_(e)||S_(e))return e;let n=C_(e);return S_(n)?n:t};function T_(e,t,n=x_(t)?t:t.ownerDocument??document){let r=w_(t,n).elementFromPoint(e.x,e.y);for(;r?.shadowRoot;){let t=r.shadowRoot.elementFromPoint(e.x,e.y);if(!t||t===r)break;r=t}return r}function E_(e,t){if(x_(t))return!0;let n=e;for(;n;){if(t===n||t.contains(n))return!0;let e=n.getRootNode();if(!S_(e))return!1;n=e.host}return!1}function D_(e,t){if(!e)return t();let n=[e,...e.querySelectorAll(`*`)],r=n.map(e=>[e,e.style.getPropertyValue(`pointer-events`),e.style.getPropertyPriority(`pointer-events`)]);for(let e of n)e.style.setProperty(`pointer-events`,`none`,`important`);try{return t()}finally{for(let[e,t,n]of r)t?e.style.setProperty(`pointer-events`,t,n):e.style.removeProperty(`pointer-events`)}}function O_(e){let t=e.ownerDocument.defaultView??window;if(e.id)return`#${b_(e.id,t)}`;let n=e.getAttribute(`data-testid`);if(n)return`[data-testid=${JSON.stringify(n)}]`;let r=[],i=e;for(;i&&r.length<5;){let e=i.localName,t=i.localName,n=i.parentElement;if(n){let r=[...n.children].filter(e=>e.localName===t);r.length>1&&(e+=`:nth-of-type(${r.indexOf(i)+1})`)}r.unshift(e),i=n}return r.join(` > `)}function k_(e,t,n=`dom-inspection-${++y_}`){let r=e.getBoundingClientRect(),i=t.getComputedStyle(e),a={top:v_(i.paddingTop),right:v_(i.paddingRight),bottom:v_(i.paddingBottom),left:v_(i.paddingLeft)},o={top:v_(i.marginTop),right:v_(i.marginRight),bottom:v_(i.marginBottom),left:v_(i.marginLeft)},s={left:r.left+a.left,top:r.top+a.top,width:Math.max(0,r.width-a.left-a.right),height:Math.max(0,r.height-a.top-a.bottom)},c={left:r.left-o.left,top:r.top-o.top,width:r.width+o.left+o.right,height:r.height+o.top+o.bottom},l=e.tagName.toLowerCase(),u=e.id?`#${e.id}`:``,d=e.classList.item(0),f=d?`.${d}`:``;return{id:n,rect:{left:r.left,top:r.top,width:r.width,height:r.height},paddingRect:s,marginRect:c,padding:a,margin:o,label:`${l}${u}${f}`,elementRef:e}}function A_(e){let t=e.ownerDocument.defaultView??window,n=t.getComputedStyle(e),r=e instanceof t.HTMLElement?e:null,i=e.getBoundingClientRect(),a=r?k_(r,t):null,o=e=>{let t=Number.parseFloat(e);return Number.isFinite(t)?t:0},s=e=>({top:o(n.getPropertyValue(`${e}-top${e===`border`?`-width`:``}`)),right:o(n.getPropertyValue(`${e}-right${e===`border`?`-width`:``}`)),bottom:o(n.getPropertyValue(`${e}-bottom${e===`border`?`-width`:``}`)),left:o(n.getPropertyValue(`${e}-left${e===`border`?`-width`:``}`))});return{selector:O_(e),tag:e.localName,id:e.id||null,classes:[...e.classList],text:(e.textContent??``).replace(/\s+/g,` `).trim().slice(0,500),role:e.getAttribute(`role`),ariaLabel:e.getAttribute(`aria-label`),rect:{left:i.left,top:i.top,right:i.right,bottom:i.bottom,width:i.width,height:i.height,x:i.x,y:i.y},margin:a?.margin??s(`margin`),padding:a?.padding??s(`padding`),border:s(`border`),typography:{fontFamily:n.fontFamily,fontSize:n.fontSize,fontWeight:n.fontWeight,lineHeight:n.lineHeight,letterSpacing:n.letterSpacing,textAlign:n.textAlign,color:n.color},appearance:{backgroundColor:n.backgroundColor,borderColor:n.borderColor,borderRadius:n.borderRadius,boxShadow:n.boxShadow,opacity:n.opacity},layout:{display:n.display,position:n.position,zIndex:n.zIndex,overflowX:n.overflowX,overflowY:n.overflowY,flexDirection:n.flexDirection,alignItems:n.alignItems,justifyContent:n.justifyContent,gap:n.gap,gridTemplateColumns:n.gridTemplateColumns,gridTemplateRows:n.gridTemplateRows,transform:n.transform},scroll:{clientWidth:r?.clientWidth??0,clientHeight:r?.clientHeight??0,scrollWidth:r?.scrollWidth??0,scrollHeight:r?.scrollHeight??0,overflowsX:(r?.scrollWidth??0)>(r?.clientWidth??0)+1,overflowsY:(r?.scrollHeight??0)>(r?.clientHeight??0)+1}}}var j_=`text-edit`,M_=e=>A_(e);function N_(e){let t=e.root??e.ownerDocument,n=e.ownerDocument.defaultView??window,r=(e,n=0)=>t.querySelectorAll(e).item(n)||null,i=n=>t===e.ownerDocument||E_(n,t),a=async()=>{let t=(e.getPluginHost()??await e.waitForPluginHost()).service.get(j_);if(!t)throw Error(`Mesurer text editing service is unavailable.`);return t},o=()=>{let t=e.ownerDocument.documentElement,r=e.ownerDocument.body,i=Math.max(t.scrollWidth,r?.scrollWidth??0),a=Math.max(t.scrollHeight,r?.scrollHeight??0);return{width:n.innerWidth,height:n.innerHeight,devicePixelRatio:n.devicePixelRatio,scrollX:n.scrollX,scrollY:n.scrollY,documentWidth:i,documentHeight:a,horizontalOverflow:i>n.innerWidth+1,verticalOverflow:a>n.innerHeight+1}},s=async(t=2)=>{await e.ownerDocument.fonts?.ready;for(let e=0;e<Math.max(1,t);e+=1)await new Promise(e=>n.requestAnimationFrame(()=>e()))};return{async ready(){await e.waitForPluginHost(),await s()},async describe(){return(await e.waitForPluginHost()).describe()},inspect(e,t=0){let n=r(e,t);return n?M_(n):null},inspectAll(e,n=50){return[...t.querySelectorAll(e)].slice(0,Math.max(0,n)).map(M_)},at(n,r){let a=t.querySelector?.(`[data-mesurer-island]`)??null;return D_(a?.shadowRoot?.querySelector(`[data-mesurer-root='true']`)??a,()=>{let a=T_({x:n,y:r},t,e.ownerDocument);return a&&i(a)?M_(a):null})},distance(e,t){let n=r(e),i=r(t);if(!n||!i)return null;let a=M_(n),o=M_(i),s=a.rect,c=o.rect;return{a,b:o,horizontalGap:c.left>=s.right?c.left-s.right:s.left>=c.right?s.left-c.right:0,verticalGap:c.top>=s.bottom?c.top-s.bottom:s.top>=c.bottom?s.top-c.bottom:0,centerDeltaX:c.left+c.width/2-(s.left+s.width/2),centerDeltaY:c.top+c.height/2-(s.top+s.height/2)}},viewport:o,async feedback(n=[]){await s();let r=e.getPluginHost()??await e.waitForPluginHost();return{viewport:o(),elements:n.flatMap(e=>[...t.querySelectorAll(e)].slice(0,50).map(M_)),plugins:r.describe(),pluginState:r.state.serialize(`all`)}},async command(t,n){await(e.getPluginHost()??await e.waitForPluginHost()).command.execute(t,n,{source:`agent-harness`}),await s(1)},async state(){return(e.getPluginHost()??await e.waitForPluginHost()).state.serialize(`all`)},async textEdits(){return(await a()).intents()},async textEdit(e){let t=(await a()).intent(e);if(!t)throw Error(`Text edit intent not found: ${e}`);return t},stable:s}}var P_=(e,t)=>e.left<=t.left+t.width&&e.left+e.width>=t.left&&e.top<=t.top+t.height&&e.top+e.height>=t.top,F_=e=>{if(!e.length)return null;let t=Math.min(...e.map(e=>e.left)),n=Math.min(...e.map(e=>e.top)),r=Math.max(...e.map(e=>e.left+e.width)),i=Math.max(...e.map(e=>e.top+e.height));return{left:t,top:n,width:r-t,height:i-n}},I_=(e,t,n)=>t.some(t=>e.orientation===`vertical`?e.position>=t.left-n&&e.position<=t.left+t.width+n:e.position>=t.top-n&&e.position<=t.top+t.height+n),L_=e=>[...e.measurements,...e.activeMeasurement&&!e.measurements.some(t=>t.id===e.activeMeasurement?.id)?[e.activeMeasurement]:[]];function R_(e){let{workspace:t,scope:n,guideTolerance:r}=e;if(n.kind===`workspace`)return{guides:t.guides.map(e=>({...e})),measurements:L_(t),distances:[...t.distances]};let i=new Set(n.elements),a=e=>e!=null&&i.has(e),o=e=>n.regions.some(t=>P_(e,t));return{guides:t.guides.filter(e=>I_(e,n.regions,r)).map(e=>({...e})),measurements:L_(t).filter(e=>a(e.elementRef)||o(e.rect)),distances:t.distances.filter(e=>a(e.elementRefA)||a(e.elementRefB)||o(e.rectA)||o(e.rectB))}}var z_={opacity:1,width:1,pattern:`solid`,dashLength:6,gap:4},B_={opacity:1,edgeReveal:!1};({...z_}),{...B_};var V_=10,H_=e=>({left:e.left,top:e.top,width:e.width,height:e.height}),U_=e=>{let t=new Set,n=[];for(let r of e)!r?.isConnected||t.has(r)||(t.add(r),n.push(r));return n},W_=e=>e.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function G_(e){let{runtime:t,ownerDocument:n,ownerWindow:r}=e,i=e.request??{scope:`workspace`},a=t.snapshot();if(!a)throw Error(`Mesurer workspace is not ready yet.`);let o=[],s=[],c={kind:`workspace`},l=new Map;if(`annotation`in i){let e=t.annotation(i.annotation);if(!e)throw Error(`Mesurer annotation not found: ${i.annotation}`);for(let t of e.resolvedTargets)t.element?.isConnected&&l.set(t.element,t.target.id);o=U_(e.resolvedTargets.map(e=>e.element));let n=t.annotationRect(e.id);n&&(s=[n]);let r=e.resolvedTargets.length,a=e.resolvedTargets.filter(e=>e.element?.isConnected).length,u=e.anchor.kind===`region`?`connected`:r===0||a===0?`stale`:a===r?`connected`:`partial`;c={kind:`annotation`,annotationId:e.id,note:e.note,targetStatus:u}}else if(i.scope===`selection`){let e=t.currentSelection();if(o=U_(e.elements),!o.length&&!e.region)throw Error(`Mesurer has no current selection.`);s=e.region?[e.region]:o.map(e=>H_(e.getBoundingClientRect())),c={kind:`selection`}}else o=U_([...t.currentSelection().elements,...a.measurements.map(e=>e.elementRef),a.activeMeasurement?.elementRef,...a.heldDistances.flatMap(e=>[e.elementRefA,e.elementRefB])]);let u=c.kind===`workspace`?[]:s.length?s:o.map(e=>H_(e.getBoundingClientRect())),d=R_({workspace:{guides:a.guides,measurements:a.measurements,activeMeasurement:a.activeMeasurement,distances:a.heldDistances},scope:c.kind===`workspace`?{kind:`workspace`}:{kind:`scoped`,elements:o,regions:u},guideTolerance:a.guideRelevanceTolerance??V_}),f=d.measurements,p=d.distances,m=d.guides,h=U_([...o,...f.map(e=>e.elementRef),...p.flatMap(e=>[e.elementRefA,e.elementRefB])]),g=new Map,_=new Set(l.values()),v=1,y=()=>{let e=`target-${v++}`;for(;_.has(e);)e=`target-${v++}`;return _.add(e),e},b=h.map(e=>{let t=l.get(e)??y();return g.set(e,t),{ref:t,inspection:A_(e)}}),x=f.map(e=>{let t={id:e.id,rect:H_(e.rect),deltaX:e.deltaX,deltaY:e.deltaY};e.snapped!==void 0&&(t.snapped=e.snapped);let n=e.elementRef?g.get(e.elementRef):void 0;return n&&(t.targetRef=n),t}),S=p.map(e=>{let t={id:e.id,rectA:H_(e.rectA),rectB:H_(e.rectB),horizontal:e.horizontal?{...e.horizontal}:null,vertical:e.vertical?{...e.vertical}:null},n=e.elementRefA?g.get(e.elementRefA):void 0,r=e.elementRefB?g.get(e.elementRefB):void 0;return n&&(t.targetARef=n),r&&(t.targetBRef=r),t});return{schema:`mesurer.context/v1`,id:W_(r),createdAt:new Date().toISOString(),scope:c,page:{url:r.location?.href??n.URL,title:n.title},viewport:{width:r.innerWidth,height:r.innerHeight,devicePixelRatio:r.devicePixelRatio,scrollX:r.scrollX,scrollY:r.scrollY},coordinateSpace:`viewport-css-px`,regions:c.kind===`workspace`?[]:s.map(H_),visualState:{rulersVisible:a.rulersVisible,xrayVisible:a.xrayVisible},targets:b,visualContext:{guides:m,measurements:x,distances:S}}}var K_=e=>`${Math.round(e*100)/100}px`,q_=e=>`x=${K_(e.left)} y=${K_(e.top)} w=${K_(e.width)} h=${K_(e.height)}`;function J_(e){let t=[`Mesurer visual context`,``,`Page: ${e.page.url}`,`Viewport: ${e.viewport.width} × ${e.viewport.height} CSS px; scroll x=${e.viewport.scrollX} y=${e.viewport.scrollY}`];if(e.scope.kind===`annotation`?t.push(``,`Annotation`,e.scope.note,`Target status: ${e.scope.targetStatus}`):t.push(``,`Scope: ${e.scope.kind}`),e.regions.length&&(t.push(``,`Requested regions`),e.regions.forEach((e,n)=>t.push(`- region-${n+1}: ${q_(e)}`))),(e.visualState.rulersVisible||e.visualState.xrayVisible)&&t.push(``,`Visual state: rulers=${e.visualState.rulersVisible?`on`:`off`}; x-ray=${e.visualState.xrayVisible?`on`:`off`}`),e.targets.length){t.push(``,`Targets`);for(let n of e.targets){let e=n.inspection;t.push(`[${n.ref}] ${e.selector}`,` rect: ${q_(e.rect)}`,` margin: ${K_(e.margin.top)} ${K_(e.margin.right)} ${K_(e.margin.bottom)} ${K_(e.margin.left)}`,` padding: ${K_(e.padding.top)} ${K_(e.padding.right)} ${K_(e.padding.bottom)} ${K_(e.padding.left)}`,` layout: display=${e.layout.display}; position=${e.layout.position}; gap=${e.layout.gap}`,` typography: ${e.typography.fontSize} / ${e.typography.lineHeight}; weight=${e.typography.fontWeight}; align=${e.typography.textAlign}`),e.text&&t.push(` text: ${JSON.stringify(e.text)}`)}}if(e.visualContext.guides.length){t.push(``,`Relevant guides`);for(let n of e.visualContext.guides)t.push(`- ${n.orientation} ${n.orientation===`vertical`?`x`:`y`}=${K_(n.position)}`)}if(e.visualContext.measurements.length){t.push(``,`Relevant measurements`);for(let n of e.visualContext.measurements)t.push(`- ${n.targetRef?`${n.targetRef}: `:``}${q_(n.rect)}; delta=${K_(n.deltaX)} × ${K_(n.deltaY)}`)}if(e.visualContext.distances.length){t.push(``,`Relevant distances`);for(let n of e.visualContext.distances){let e=[n.targetARef,n.targetBRef].filter(Boolean).join(` → `),r=[n.horizontal?`horizontal=${K_(n.horizontal.value)}`:null,n.vertical?`vertical=${K_(n.vertical.value)}`:null].filter(Boolean).join(`; `);t.push(`- ${e?`${e}: `:``}${r||`overlapping`}`)}}return t.join(`
1481
- `).trimEnd()}function Y_(e){let t=F_([...e.regions,...e.targets.map(e=>e.inspection.rect),...e.visualContext.measurements.map(e=>e.rect),...e.visualContext.distances.flatMap(e=>[e.rectA,e.rectB])]),n=[{id:`viewport`,kind:`viewport`}];if(t){let r=Math.max(0,t.left-48),i=Math.max(0,t.top-48),a=Math.min(e.viewport.width,t.left+t.width+48),o=Math.min(e.viewport.height,t.top+t.height+48);a>r&&o>i&&n.push({id:`focus`,kind:`clip`,rect:{left:r,top:i,width:a-r,height:o-i}})}return{schema:`mesurer.capture/v1`,contextId:e.id,chrome:`hide`,evidence:`show`,captures:n}}var X_=(e,t,n,r,i)=>{!Number.isFinite(r)||!Number.isFinite(i)||Math.abs(r-i)<.01||e.push({kind:t,label:n,before:r,current:i,delta:i-r,unit:`px`})},Z_=(e,t,n,r)=>e.push({kind:`missing`,evidence:t,id:n,label:r});function Q_(e){let t=e.runtime.annotation(e.annotationId);if(!t)throw Error(`Mesurer annotation not found: ${e.annotationId}`);let n=G_({runtime:e.runtime,ownerDocument:e.ownerDocument,ownerWindow:e.ownerWindow,request:{annotation:e.annotationId}});if(n.scope.kind!==`annotation`)throw Error(`Mesurer annotation context invariant failed.`);let r=e.runtime.snapshot();if(!r)throw Error(`Mesurer workspace is not ready yet.`);let i=L_({measurements:r.measurements,activeMeasurement:r.activeMeasurement}),a=[];for(let e of t.baseline.targets){let t=n.targets.find(t=>t.ref===e.id);if(!t){Z_(a,`target`,e.id,e.selector);continue}X_(a,`target-rect`,`${t.inspection.selector} left`,e.rect.left,t.inspection.rect.left),X_(a,`target-rect`,`${t.inspection.selector} top`,e.rect.top,t.inspection.rect.top),X_(a,`target-rect`,`${t.inspection.selector} width`,e.rect.width,t.inspection.rect.width),X_(a,`target-rect`,`${t.inspection.selector} height`,e.rect.height,t.inspection.rect.height)}for(let e of t.baseline.guides){let t=n.visualContext.guides.find(t=>t.id===e.id)??r.guides.find(t=>t.id===e.id);if(!t){Z_(a,`guide`,e.id,`${e.orientation} guide ${e.id}`);continue}X_(a,`guide`,`${e.orientation} guide ${e.id}`,e.position,t.position)}for(let e of t.baseline.measurements){let t=n.visualContext.measurements.find(t=>t.id===e.id)??i.find(t=>t.id===e.id);if(!t){Z_(a,`measurement`,e.id,e.id);continue}X_(a,`measurement`,`${e.id} width`,e.rect.width,t.rect.width),X_(a,`measurement`,`${e.id} height`,e.rect.height,t.rect.height)}for(let e of t.baseline.distances){let t=n.visualContext.distances.find(t=>t.id===e.id)??r.heldDistances.find(t=>t.id===e.id);if(!t){Z_(a,`distance`,e.id,e.id);continue}e.horizontal&&t.horizontal?X_(a,`distance`,`${e.id} horizontal`,e.horizontal.value,t.horizontal.value):e.horizontal&&!t.horizontal&&Z_(a,`distance`,e.id,`${e.id} horizontal`),e.vertical&&t.vertical?X_(a,`distance`,`${e.id} vertical`,e.vertical.value,t.vertical.value):e.vertical&&!t.vertical&&Z_(a,`distance`,e.id,`${e.id} vertical`)}return{schema:`mesurer.review/v1`,annotationId:t.id,note:t.note,targetStatus:n.scope.targetStatus,baseline:t.baseline,current:n,changes:a}}async function $_(e,t,n){try{if(t.navigator.clipboard?.writeText){await t.navigator.clipboard.writeText(n);return}}catch{}let r=e.createElement(`textarea`);r.value=n,r.setAttribute(`readonly`,``),r.style.position=`fixed`,r.style.opacity=`0`,r.style.pointerEvents=`none`,e.body.append(r),r.select();let i=e.execCommand?.(`copy`)??!1;if(r.remove(),!i)throw Error(`Unable to copy Mesurer context to the clipboard.`)}var ev=`0.1.8-beta.3`,tv=`mesurer.context`,nv=`context:v1`,rv=`mesurer.context.settings`,iv=`context.ui`,av=`data-mesurer-direct-text-edit-active`,ov={viewBox:`0 0 256 256`,paths:[`M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z`]},sv={viewBox:`0 0 256 256`,paths:[`M152,40a8,8,0,0,1-8,8H112a8,8,0,0,1,0-16h32A8,8,0,0,1,152,40Zm-8,168H112a8,8,0,0,0,0,16h32a8,8,0,0,0,0-16ZM208,32H184a8,8,0,0,0,0,16h24V72a8,8,0,0,0,16,0V48A16,16,0,0,0,208,32Zm8,72a8,8,0,0,0-8,8v32a8,8,0,0,0,16,0V112A8,8,0,0,0,216,104Zm0,72a8,8,0,0,0-8,8v24H184a8,8,0,0,0,0,16h24a16,16,0,0,0,16-16V184A8,8,0,0,0,216,176ZM40,152a8,8,0,0,0,8-8V112a8,8,0,0,0-16,0v32A8,8,0,0,0,40,152Zm32,56H48V184a8,8,0,0,0-16,0v24a16,16,0,0,0,16,16H72a8,8,0,0,0,0-16ZM72,32H48A16,16,0,0,0,32,48V72a8,8,0,0,0,16,0V48H72a8,8,0,0,0,0-16Z`]},cv={viewBox:`0 0 256 256`,paths:[`M229.66,58.34l-32-32a8,8,0,0,0-11.32,0l-96,96A8,8,0,0,0,88,128v32a8,8,0,0,0,8,8h32a8,8,0,0,0,5.66-2.34l96-96A8,8,0,0,0,229.66,58.34ZM124.69,152H104V131.31l64-64L188.69,88ZM200,76.69,179.31,56,192,43.31,212.69,64ZM224,128v80a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32h80a8,8,0,0,1,0,16H48V208H208V128a8,8,0,0,1,16,0Z`]},lv=async(e,t,n=1)=>{await e.fonts?.ready;for(let e=0;e<Math.max(1,n);e+=1)await new Promise(e=>t.requestAnimationFrame(()=>e()))},uv=(e,t,n)=>{let r=async r=>G_({runtime:e,ownerDocument:t,ownerWindow:n,request:r}),i=async e=>J_(await r(e));return{context:r,contextText:i,copyContext:async e=>$_(t,n,await i(e)),select:async i=>(e.select(Array.isArray(i)?i:[i]),await lv(t,n),r({scope:`selection`})),annotations:async()=>e.annotations(),removeAnnotation:async r=>{e.removeAnnotation(r),await lv(t,n)},review:async r=>(await lv(t,n),r?Q_({runtime:e,ownerDocument:t,ownerWindow:n,annotationId:r}):e.annotations().map(r=>Q_({runtime:e,ownerDocument:t,ownerWindow:n,annotationId:r.id}))),capturePlan:async e=>Y_(await r(e)),prepareCapture:async()=>{e.prepareCapture(),await lv(t,n)},finishCapture:async()=>{e.finishCapture(),await lv(t,n)}}},dv=e=>{let t=e.currentSelection();return t.elements.length>0||t.region!==null};function fv(e={}){return{id:tv,version:ev,requires:[`runtime:solid`],provides:[nv],setup(t){let n=t.service.get(`runtime:solid`);if(!n)throw Error(`Mesurer context plugin requires the renderer runtime service.`);let r=n.createWorkspaceRuntime(tv),i=uv(r,n.ownerDocument,n.ownerWindow);t.service.provide(nv,i),t.state.register({id:rv,initial:{ui:e.ui??!0},persist:!0}),t.state.register({id:iv,initial:{hasSelection:dv(r)}});let a=()=>t.state.get(`mesurer.context.settings`)?.ui??!0,o=()=>t.state.get(iv)?.hasSelection===!0,s=e=>{t.state.update(rv,t=>({...t,ui:e}))},c=null,l=null,u=null,d=null,f=r.currentSelection(),p={elements:[...f.elements],region:f.region?{...f.region}:null},m=(e,t)=>e.elements.length!==t.elements.length||e.elements.some((e,n)=>e!==t.elements[n])?!1:e.region===t.region?!0:!e.region||!t.region?!1:e.region.left===t.region.left&&e.region.top===t.region.top&&e.region.width===t.region.width&&e.region.height===t.region.height,h=r.subscribe(()=>{let e=r.currentSelection(),n=!m(p,e);p={elements:[...e.elements],region:e.region?{...e.region}:null},r.selectGestureActive()?c?.abandonNoteComposer():n&&c?.closeNoteComposer();let i=e.elements.length>0||e.region!==null;i!==(t.state.get(iv)?.hasSelection??!1)&&t.state.update(iv,()=>({hasSelection:i}))});t.command.register(`context.copy`,()=>i.copyContext()),t.command.register(`context.copy-selection`,()=>i.copyContext({scope:`selection`}));let g=()=>{let e=u?.element;e&&(n.rendererRoot?.hasAttribute(av)?e.setAttribute(av,`true`):e.removeAttribute(av))},_=()=>{d?.disconnect(),d=null,c=null,l?.(),l=null,u?.dispose(),u=null},v=()=>{if(u)return;if(u=vg(n),u.element.dataset.mesurerLayer=`evidence`,u.element.dataset.mesurerContextRoot=`true`,n.rendererRoot){let e=new n.ownerWindow.MutationObserver(g);d=e,e.observe(n.rendererRoot,{attributes:!0,attributeFilter:[av]}),g()}let e={runtime:r,onCopy:i.copyContext,onController:e=>{c=e},coordinateSpace:`document`};l=xi(()=>Hr(mg,bi(e,{get ownerWindow(){return n.ownerWindow}})),u.element)},y=()=>{a()?v():_()};y(),t.state.subscribe(y),t.command.register(`context.add-note`,()=>c?.openNoteComposer()),t.tool.register({id:`context.copy`,label:`Copy context`,shortcut:`C`,command:`context.copy`,order:70,icon:ov,hidden:()=>!a()}),t.tool.register({id:`context.copy-selection`,label:`Copy selection`,shortcut:`Shift+C`,command:`context.copy-selection`,order:71,icon:sv,hidden:()=>!a(),disabled:()=>!o()}),t.tool.register({id:`context.add-note`,label:`Add note`,shortcut:`N`,command:`context.add-note`,order:72,icon:cv,hidden:()=>!a(),disabled:()=>!o()}),t.settings.register({id:`context`,label:`Context`,order:30,controls:[{type:`toggle`,id:`ui`,label:`Context tools`,description:`Show Copy Context, Copy Selection, Add Note, and annotation controls.`,value:a,set:s}]}),t.lifecycle.onDispose(()=>{h(),_(),r.dispose()})}}}var pv={display:`block`,position:`fixed`,inset:`0`,width:`0`,height:`0`,"min-width":`0`,"min-height":`0`,"max-width":`none`,"max-height":`none`,margin:`0`,padding:`0`,border:`0`,overflow:`visible`,background:`transparent`,"box-sizing":`border-box`,"pointer-events":`auto`,"z-index":`2147483647`,opacity:`1`,visibility:`visible`,transform:`none`,translate:`none`,rotate:`none`,scale:`none`,filter:`none`,"backdrop-filter":`none`,"clip-path":`none`,mask:`none`,contain:`none`,isolation:`isolate`,"mix-blend-mode":`normal`,animation:`none`,transition:`none`,"color-scheme":`light`,color:`#0f172a`,"font-family":`ui-sans-serif, system-ui, sans-serif`,"font-size":`16px`,"font-weight":`400`,"line-height":`1.5`,"letter-spacing":`normal`,direction:`ltr`};function mv(e){for(let[t,n]of Object.entries(pv))e.style.setProperty(t,n,`important`)}function hv(e){return`popover`in e&&`showPopover`in e&&typeof e.showPopover==`function`&&`hidePopover`in e&&typeof e.hidePopover==`function`}var gv=e=>`newState`in e,_v=e=>e.localName===`dialog`;function vv(e){if(!_v(e)||!e.open)return!1;try{return e.matches(`:modal`)}catch{return!1}}function yv(e,t,n=!0){mv(e);let r=e.ownerDocument,i=r.defaultView??window,a=t,o=!1,s=`fixed`,c=!1,l=0,u=[];if(n&&hv(e)&&(e.popover=`manual`),t.append(e),n&&hv(e))try{e.showPopover(),c=e.matches(`:popover-open`),c&&(s=`top-layer`)}catch{e.removeAttribute(`popover`)}let d=()=>{if(!(!c||!hv(e)))try{e.matches(`:popover-open`)||e.showPopover()}catch{}},f=t=>{if(e.parentNode===t)return;let n=c&&hv(e)&&e.matches(`:popover-open`);if(n&&hv(e))try{e.hidePopover()}catch{}t.append(e),mv(e),n&&d()},p=()=>{u=u.filter(e=>e.isConnected&&vv(e)),f(u.at(-1)??a)},m=e=>{u=u.filter(t=>t!==e),u.push(e),p()},h=e=>{u=u.filter(t=>t!==e),p()},g=()=>{if(!(o||!c||!hv(e)))try{e.matches(`:popover-open`)&&e.hidePopover(),e.showPopover()}catch{}},_=()=>{o||!c||l||(l=i.requestAnimationFrame(()=>{l=0,g()}))},v=t=>{if(!c||t.target===e)return;let n=gv(t)?t.newState:void 0,r=t.target;if(r instanceof i.Element){if(_v(r)){n===`open`&&vv(r)?(m(r),_()):n===`closed`?h(r):n===`open`&&_();return}n===`open`&&r.hasAttribute(`popover`)&&_()}},y=e=>{let t=e.target;t instanceof i.Element&&_v(t)&&h(t)},b=()=>{r.fullscreenElement&&_()},x=e=>{vv(e)&&m(e);for(let t of e.querySelectorAll(`dialog`))vv(t)&&m(t)},S=new i.MutationObserver(e=>{if(c)for(let t of e){if(t.type===`attributes`){let e=t.target;e instanceof i.Element&&_v(e)&&(vv(e)?m(e):h(e))}for(let e of t.addedNodes)e instanceof i.Element&&x(e);u.some(e=>!e.isConnected)&&p()}});return c&&(r.addEventListener(`toggle`,v,!0),r.addEventListener(`close`,y,!0),r.addEventListener(`fullscreenchange`,b,!0),S.observe(r.documentElement,{subtree:!0,childList:!0,attributes:!0,attributeFilter:[`open`]}),x(r.documentElement)),{mode:s,bringToFront:g,dispose(){if(!o){if(o=!0,l&&i.cancelAnimationFrame(l),r.removeEventListener(`toggle`,v,!0),r.removeEventListener(`close`,y,!0),r.removeEventListener(`fullscreenchange`,b,!0),S.disconnect(),c&&hv(e)&&e.matches(`:popover-open`))try{e.hidePopover()}catch{}u=[]}}}}var bv=zd,xv=()=>({...Ef(),version:ev}),Sv=`mesurer.codex`,Cv=`codex:v1`,wv=`context:v1`,Tv=`http://127.0.0.1:47365`,Ev=2e3,Dv=750,Ov=1800,kv=2e3,Av=12e4,jv=10,Mv=5,Nv=[`Implement the current human feedback from Mesurer in this project.`,`Treat the rendered page as the source of truth, preserve unrelated Mesurer review state,`,`and verify the affected UI in the live page with Mesurer before claiming completion.`].join(` `),Pv={viewBox:`0 0 256 256`,paths:[`M224,48,32,120l88,32,32,88Z M120,152l104-104`]},Fv={viewBox:`0 0 256 256`,paths:[`M72,32H184a8,8,0,0,1,0,16h-8v20.69a40,40,0,0,1-11.72,28.28L137.25,124l27.03,27.03A40,40,0,0,1,176,179.31V208h8a8,8,0,0,1,0,16H72a8,8,0,0,1,0-16h8V179.31a40,40,0,0,1,11.72-28.28L118.75,124,91.72,96.97A40,40,0,0,1,80,68.69V48H72a8,8,0,0,1,0-16Zm24,16V68.69a24,24,0,0,0,7.03,16.97L128,110.63l24.97-24.97A24,24,0,0,0,160,68.69V48Zm32,90.63-24.97,24.97A24,24,0,0,0,96,180.57V208h64V180.57a24,24,0,0,0-7.03-16.97Z`]},Iv={viewBox:`0 0 256 256`,paths:[`M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z`]},Lv=e=>{try{let t=globalThis.location;return t?.origin?`mesurer-codex-ui:v1:${e}:${t.origin}${t.pathname}`:null}catch{return null}},Rv=e=>{let t=Lv(e);if(!t)return null;try{let e=globalThis.sessionStorage?.getItem(t);if(!e)return null;let n=JSON.parse(e);if(n.version!==1)return null;let r=n.originThread?.trim()||null,i=n.selectedThread?.trim()||null,a=n.delivery;return{version:1,originThread:r,selectedThread:i,delivery:a&&a.id.trim()&&a.thread.trim()&&(a.status===`queued`||a.status===`working`||a.status===`interrupted`)&&Array.isArray(a.annotationIds)?{id:a.id.trim(),thread:a.thread.trim(),status:a.status,annotationIds:a.annotationIds.filter(e=>e.trim().length>0),queuedSubmissionId:a.queuedSubmissionId?.trim()||null,dispatch:a.dispatch??null,dispatchError:a.dispatchError?.trim()||null}:null}}catch{return null}},zv=(e,t)=>{let n=Lv(e);if(n)try{globalThis.sessionStorage?.setItem(n,JSON.stringify(t))}catch{}},Bv=(e,t)=>{let n=e.endsWith(`/`)?e:`${e}/`;return new URL(t,n).toString()},Vv=async(e,t,n)=>{let r=new AbortController,i=setTimeout(()=>r.abort(),15e3);try{let i=await fetch(Bv(e,t),{...n,signal:r.signal}),a=await i.text(),o={};if(a)try{o=JSON.parse(a)}catch{o={error:a}}if(!i.ok||o.ok===!1)throw Error(o.error||`Mesurer Codex bridge returned HTTP ${i.status}.`);return o}catch(t){throw t instanceof Error&&t.name===`AbortError`?Error(`Mesurer Codex bridge timed out.`):t instanceof TypeError?Error(`Mesurer Codex bridge is unavailable at ${e}. Start the local bridge before queueing feedback.`):t}finally{clearTimeout(i)}},Hv=e=>({thread:e.thread?.trim()||null,threads:Array.isArray(e.threads)?e.threads.filter(e=>e.trim().length>0):[]}),Uv=e=>{let t=e.deliveryId?.trim(),n=e.thread?.trim(),r=e.status;if(!t||!n||!r)throw Error(`Mesurer Codex bridge returned an invalid delivery state.`);let i={id:t,thread:n,status:r,turnId:e.turnId?.trim()||null,createdAt:Number.isFinite(e.createdAt)?Number(e.createdAt):0,updatedAt:Number.isFinite(e.updatedAt)?Number(e.updatedAt):0};return e.queuedSubmissionId!==void 0&&(i.queuedSubmissionId=e.queuedSubmissionId?.trim()||null),e.dispatch!==void 0&&(i.dispatch=e.dispatch),e.dispatchError!==void 0&&(i.dispatchError=e.dispatchError?.trim()||null),i},Wv=e=>({thread:e.thread?.trim()||null,threads:Array.isArray(e.threadDetails)?e.threadDetails.flatMap(e=>{let t=e.id?.trim()??``;return t?[{id:t,title:e.title?.trim()||t,updatedAt:e.updatedAt!=null&&Number.isFinite(e.updatedAt)?e.updatedAt:null,connected:e.connected===!0}]:[]}):[],hasMore:e.hasMore===!0}),Gv=async(e,t,n)=>{let r=t?.instruction?.trim()||n,i=await e.annotations(),a=t?.annotationIds,o=a?a.flatMap(e=>{let t=i.find(t=>t.id===e);return t?[t]:[]}):i,s=[];for(let t of o)s.push(await e.contextText({annotation:t.id}));if(s.length===0)try{s.push(await e.contextText({scope:`selection`}))}catch{s.push(await e.contextText())}return{annotationIds:o.map(e=>e.id),message:[r,``,...s.flatMap((e,t)=>[s.length>1?`Feedback ${t+1}`:`Mesurer evidence`,e,``])].join(`
1481
+ `).trimEnd()}function Y_(e){let t=F_([...e.regions,...e.targets.map(e=>e.inspection.rect),...e.visualContext.measurements.map(e=>e.rect),...e.visualContext.distances.flatMap(e=>[e.rectA,e.rectB])]),n=[{id:`viewport`,kind:`viewport`}];if(t){let r=Math.max(0,t.left-48),i=Math.max(0,t.top-48),a=Math.min(e.viewport.width,t.left+t.width+48),o=Math.min(e.viewport.height,t.top+t.height+48);a>r&&o>i&&n.push({id:`focus`,kind:`clip`,rect:{left:r,top:i,width:a-r,height:o-i}})}return{schema:`mesurer.capture/v1`,contextId:e.id,chrome:`hide`,evidence:`show`,captures:n}}var X_=(e,t,n,r,i)=>{!Number.isFinite(r)||!Number.isFinite(i)||Math.abs(r-i)<.01||e.push({kind:t,label:n,before:r,current:i,delta:i-r,unit:`px`})},Z_=(e,t,n,r)=>e.push({kind:`missing`,evidence:t,id:n,label:r});function Q_(e){let t=e.runtime.annotation(e.annotationId);if(!t)throw Error(`Mesurer annotation not found: ${e.annotationId}`);let n=G_({runtime:e.runtime,ownerDocument:e.ownerDocument,ownerWindow:e.ownerWindow,request:{annotation:e.annotationId}});if(n.scope.kind!==`annotation`)throw Error(`Mesurer annotation context invariant failed.`);let r=e.runtime.snapshot();if(!r)throw Error(`Mesurer workspace is not ready yet.`);let i=L_({measurements:r.measurements,activeMeasurement:r.activeMeasurement}),a=[];for(let e of t.baseline.targets){let t=n.targets.find(t=>t.ref===e.id);if(!t){Z_(a,`target`,e.id,e.selector);continue}X_(a,`target-rect`,`${t.inspection.selector} left`,e.rect.left,t.inspection.rect.left),X_(a,`target-rect`,`${t.inspection.selector} top`,e.rect.top,t.inspection.rect.top),X_(a,`target-rect`,`${t.inspection.selector} width`,e.rect.width,t.inspection.rect.width),X_(a,`target-rect`,`${t.inspection.selector} height`,e.rect.height,t.inspection.rect.height)}for(let e of t.baseline.guides){let t=n.visualContext.guides.find(t=>t.id===e.id)??r.guides.find(t=>t.id===e.id);if(!t){Z_(a,`guide`,e.id,`${e.orientation} guide ${e.id}`);continue}X_(a,`guide`,`${e.orientation} guide ${e.id}`,e.position,t.position)}for(let e of t.baseline.measurements){let t=n.visualContext.measurements.find(t=>t.id===e.id)??i.find(t=>t.id===e.id);if(!t){Z_(a,`measurement`,e.id,e.id);continue}X_(a,`measurement`,`${e.id} width`,e.rect.width,t.rect.width),X_(a,`measurement`,`${e.id} height`,e.rect.height,t.rect.height)}for(let e of t.baseline.distances){let t=n.visualContext.distances.find(t=>t.id===e.id)??r.heldDistances.find(t=>t.id===e.id);if(!t){Z_(a,`distance`,e.id,e.id);continue}e.horizontal&&t.horizontal?X_(a,`distance`,`${e.id} horizontal`,e.horizontal.value,t.horizontal.value):e.horizontal&&!t.horizontal&&Z_(a,`distance`,e.id,`${e.id} horizontal`),e.vertical&&t.vertical?X_(a,`distance`,`${e.id} vertical`,e.vertical.value,t.vertical.value):e.vertical&&!t.vertical&&Z_(a,`distance`,e.id,`${e.id} vertical`)}return{schema:`mesurer.review/v1`,annotationId:t.id,note:t.note,targetStatus:n.scope.targetStatus,baseline:t.baseline,current:n,changes:a}}async function $_(e,t,n){try{if(t.navigator.clipboard?.writeText){await t.navigator.clipboard.writeText(n);return}}catch{}let r=e.createElement(`textarea`);r.value=n,r.setAttribute(`readonly`,``),r.style.position=`fixed`,r.style.opacity=`0`,r.style.pointerEvents=`none`,e.body.append(r),r.select();let i=e.execCommand?.(`copy`)??!1;if(r.remove(),!i)throw Error(`Unable to copy Mesurer context to the clipboard.`)}var ev=`0.1.8`,tv=`mesurer.context`,nv=`context:v1`,rv=`mesurer.context.settings`,iv=`context.ui`,av=`data-mesurer-direct-text-edit-active`,ov={viewBox:`0 0 256 256`,paths:[`M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z`]},sv={viewBox:`0 0 256 256`,paths:[`M152,40a8,8,0,0,1-8,8H112a8,8,0,0,1,0-16h32A8,8,0,0,1,152,40Zm-8,168H112a8,8,0,0,0,0,16h32a8,8,0,0,0,0-16ZM208,32H184a8,8,0,0,0,0,16h24V72a8,8,0,0,0,16,0V48A16,16,0,0,0,208,32Zm8,72a8,8,0,0,0-8,8v32a8,8,0,0,0,16,0V112A8,8,0,0,0,216,104Zm0,72a8,8,0,0,0-8,8v24H184a8,8,0,0,0,0,16h24a16,16,0,0,0,16-16V184A8,8,0,0,0,216,176ZM40,152a8,8,0,0,0,8-8V112a8,8,0,0,0-16,0v32A8,8,0,0,0,40,152Zm32,56H48V184a8,8,0,0,0-16,0v24a16,16,0,0,0,16,16H72a8,8,0,0,0,0-16ZM72,32H48A16,16,0,0,0,32,48V72a8,8,0,0,0,16,0V48H72a8,8,0,0,0,0-16Z`]},cv={viewBox:`0 0 256 256`,paths:[`M229.66,58.34l-32-32a8,8,0,0,0-11.32,0l-96,96A8,8,0,0,0,88,128v32a8,8,0,0,0,8,8h32a8,8,0,0,0,5.66-2.34l96-96A8,8,0,0,0,229.66,58.34ZM124.69,152H104V131.31l64-64L188.69,88ZM200,76.69,179.31,56,192,43.31,212.69,64ZM224,128v80a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32h80a8,8,0,0,1,0,16H48V208H208V128a8,8,0,0,1,16,0Z`]},lv=async(e,t,n=1)=>{await e.fonts?.ready;for(let e=0;e<Math.max(1,n);e+=1)await new Promise(e=>t.requestAnimationFrame(()=>e()))},uv=(e,t,n)=>{let r=async r=>G_({runtime:e,ownerDocument:t,ownerWindow:n,request:r}),i=async e=>J_(await r(e));return{context:r,contextText:i,copyContext:async e=>$_(t,n,await i(e)),select:async i=>(e.select(Array.isArray(i)?i:[i]),await lv(t,n),r({scope:`selection`})),annotations:async()=>e.annotations(),removeAnnotation:async r=>{e.removeAnnotation(r),await lv(t,n)},review:async r=>(await lv(t,n),r?Q_({runtime:e,ownerDocument:t,ownerWindow:n,annotationId:r}):e.annotations().map(r=>Q_({runtime:e,ownerDocument:t,ownerWindow:n,annotationId:r.id}))),capturePlan:async e=>Y_(await r(e)),prepareCapture:async()=>{e.prepareCapture(),await lv(t,n)},finishCapture:async()=>{e.finishCapture(),await lv(t,n)}}},dv=e=>{let t=e.currentSelection();return t.elements.length>0||t.region!==null};function fv(e={}){return{id:tv,version:ev,requires:[`runtime:solid`],provides:[nv],setup(t){let n=t.service.get(`runtime:solid`);if(!n)throw Error(`Mesurer context plugin requires the renderer runtime service.`);let r=n.createWorkspaceRuntime(tv),i=uv(r,n.ownerDocument,n.ownerWindow);t.service.provide(nv,i),t.state.register({id:rv,initial:{ui:e.ui??!0},persist:!0}),t.state.register({id:iv,initial:{hasSelection:dv(r)}});let a=()=>t.state.get(`mesurer.context.settings`)?.ui??!0,o=()=>t.state.get(iv)?.hasSelection===!0,s=e=>{t.state.update(rv,t=>({...t,ui:e}))},c=null,l=null,u=null,d=null,f=r.currentSelection(),p={elements:[...f.elements],region:f.region?{...f.region}:null},m=(e,t)=>e.elements.length!==t.elements.length||e.elements.some((e,n)=>e!==t.elements[n])?!1:e.region===t.region?!0:!e.region||!t.region?!1:e.region.left===t.region.left&&e.region.top===t.region.top&&e.region.width===t.region.width&&e.region.height===t.region.height,h=r.subscribe(()=>{let e=r.currentSelection(),n=!m(p,e);p={elements:[...e.elements],region:e.region?{...e.region}:null},r.selectGestureActive()?c?.abandonNoteComposer():n&&c?.closeNoteComposer();let i=e.elements.length>0||e.region!==null;i!==(t.state.get(iv)?.hasSelection??!1)&&t.state.update(iv,()=>({hasSelection:i}))});t.command.register(`context.copy`,()=>i.copyContext()),t.command.register(`context.copy-selection`,()=>i.copyContext({scope:`selection`}));let g=()=>{let e=u?.element;e&&(n.rendererRoot?.hasAttribute(av)?e.setAttribute(av,`true`):e.removeAttribute(av))},_=()=>{d?.disconnect(),d=null,c=null,l?.(),l=null,u?.dispose(),u=null},v=()=>{if(u)return;if(u=vg(n),u.element.dataset.mesurerLayer=`evidence`,u.element.dataset.mesurerContextRoot=`true`,n.rendererRoot){let e=new n.ownerWindow.MutationObserver(g);d=e,e.observe(n.rendererRoot,{attributes:!0,attributeFilter:[av]}),g()}let e={runtime:r,onCopy:i.copyContext,onController:e=>{c=e},coordinateSpace:`document`};l=xi(()=>Hr(mg,bi(e,{get ownerWindow(){return n.ownerWindow}})),u.element)},y=()=>{a()?v():_()};y(),t.state.subscribe(y),t.command.register(`context.add-note`,()=>c?.openNoteComposer()),t.tool.register({id:`context.copy`,label:`Copy context`,shortcut:`C`,command:`context.copy`,order:70,icon:ov,hidden:()=>!a()}),t.tool.register({id:`context.copy-selection`,label:`Copy selection`,shortcut:`Shift+C`,command:`context.copy-selection`,order:71,icon:sv,hidden:()=>!a(),disabled:()=>!o()}),t.tool.register({id:`context.add-note`,label:`Add note`,shortcut:`N`,command:`context.add-note`,order:72,icon:cv,hidden:()=>!a(),disabled:()=>!o()}),t.settings.register({id:`context`,label:`Context`,order:30,controls:[{type:`toggle`,id:`ui`,label:`Context tools`,description:`Show Copy Context, Copy Selection, Add Note, and annotation controls.`,value:a,set:s}]}),t.lifecycle.onDispose(()=>{h(),_(),r.dispose()})}}}var pv={display:`block`,position:`fixed`,inset:`0`,width:`0`,height:`0`,"min-width":`0`,"min-height":`0`,"max-width":`none`,"max-height":`none`,margin:`0`,padding:`0`,border:`0`,overflow:`visible`,background:`transparent`,"box-sizing":`border-box`,"pointer-events":`auto`,"z-index":`2147483647`,opacity:`1`,visibility:`visible`,transform:`none`,translate:`none`,rotate:`none`,scale:`none`,filter:`none`,"backdrop-filter":`none`,"clip-path":`none`,mask:`none`,contain:`none`,isolation:`isolate`,"mix-blend-mode":`normal`,animation:`none`,transition:`none`,"color-scheme":`light`,color:`#0f172a`,"font-family":`ui-sans-serif, system-ui, sans-serif`,"font-size":`16px`,"font-weight":`400`,"line-height":`1.5`,"letter-spacing":`normal`,direction:`ltr`};function mv(e){for(let[t,n]of Object.entries(pv))e.style.setProperty(t,n,`important`)}function hv(e){return`popover`in e&&`showPopover`in e&&typeof e.showPopover==`function`&&`hidePopover`in e&&typeof e.hidePopover==`function`}var gv=e=>`newState`in e,_v=e=>e.localName===`dialog`;function vv(e){if(!_v(e)||!e.open)return!1;try{return e.matches(`:modal`)}catch{return!1}}function yv(e,t,n=!0){mv(e);let r=e.ownerDocument,i=r.defaultView??window,a=t,o=!1,s=`fixed`,c=!1,l=0,u=[];if(n&&hv(e)&&(e.popover=`manual`),t.append(e),n&&hv(e))try{e.showPopover(),c=e.matches(`:popover-open`),c&&(s=`top-layer`)}catch{e.removeAttribute(`popover`)}let d=()=>{if(!(!c||!hv(e)))try{e.matches(`:popover-open`)||e.showPopover()}catch{}},f=t=>{if(e.parentNode===t)return;let n=c&&hv(e)&&e.matches(`:popover-open`);if(n&&hv(e))try{e.hidePopover()}catch{}t.append(e),mv(e),n&&d()},p=()=>{u=u.filter(e=>e.isConnected&&vv(e)),f(u.at(-1)??a)},m=e=>{u=u.filter(t=>t!==e),u.push(e),p()},h=e=>{u=u.filter(t=>t!==e),p()},g=()=>{if(!(o||!c||!hv(e)))try{e.matches(`:popover-open`)&&e.hidePopover(),e.showPopover()}catch{}},_=()=>{o||!c||l||(l=i.requestAnimationFrame(()=>{l=0,g()}))},v=t=>{if(!c||t.target===e)return;let n=gv(t)?t.newState:void 0,r=t.target;if(r instanceof i.Element){if(_v(r)){n===`open`&&vv(r)?(m(r),_()):n===`closed`?h(r):n===`open`&&_();return}n===`open`&&r.hasAttribute(`popover`)&&_()}},y=e=>{let t=e.target;t instanceof i.Element&&_v(t)&&h(t)},b=()=>{r.fullscreenElement&&_()},x=e=>{vv(e)&&m(e);for(let t of e.querySelectorAll(`dialog`))vv(t)&&m(t)},S=new i.MutationObserver(e=>{if(c)for(let t of e){if(t.type===`attributes`){let e=t.target;e instanceof i.Element&&_v(e)&&(vv(e)?m(e):h(e))}for(let e of t.addedNodes)e instanceof i.Element&&x(e);u.some(e=>!e.isConnected)&&p()}});return c&&(r.addEventListener(`toggle`,v,!0),r.addEventListener(`close`,y,!0),r.addEventListener(`fullscreenchange`,b,!0),S.observe(r.documentElement,{subtree:!0,childList:!0,attributes:!0,attributeFilter:[`open`]}),x(r.documentElement)),{mode:s,bringToFront:g,dispose(){if(!o){if(o=!0,l&&i.cancelAnimationFrame(l),r.removeEventListener(`toggle`,v,!0),r.removeEventListener(`close`,y,!0),r.removeEventListener(`fullscreenchange`,b,!0),S.disconnect(),c&&hv(e)&&e.matches(`:popover-open`))try{e.hidePopover()}catch{}u=[]}}}}var bv=zd,xv=()=>({...Ef(),version:ev}),Sv=`mesurer.codex`,Cv=`codex:v1`,wv=`context:v1`,Tv=`http://127.0.0.1:47365`,Ev=2e3,Dv=750,Ov=1800,kv=2e3,Av=12e4,jv=10,Mv=5,Nv=[`Implement the current human feedback from Mesurer in this project.`,`Treat the rendered page as the source of truth, preserve unrelated Mesurer review state,`,`and verify the affected UI in the live page with Mesurer before claiming completion.`].join(` `),Pv={viewBox:`0 0 256 256`,paths:[`M224,48,32,120l88,32,32,88Z M120,152l104-104`]},Fv={viewBox:`0 0 256 256`,paths:[`M72,32H184a8,8,0,0,1,0,16h-8v20.69a40,40,0,0,1-11.72,28.28L137.25,124l27.03,27.03A40,40,0,0,1,176,179.31V208h8a8,8,0,0,1,0,16H72a8,8,0,0,1,0-16h8V179.31a40,40,0,0,1,11.72-28.28L118.75,124,91.72,96.97A40,40,0,0,1,80,68.69V48H72a8,8,0,0,1,0-16Zm24,16V68.69a24,24,0,0,0,7.03,16.97L128,110.63l24.97-24.97A24,24,0,0,0,160,68.69V48Zm32,90.63-24.97,24.97A24,24,0,0,0,96,180.57V208h64V180.57a24,24,0,0,0-7.03-16.97Z`]},Iv={viewBox:`0 0 256 256`,paths:[`M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z`]},Lv=e=>{try{let t=globalThis.location;return t?.origin?`mesurer-codex-ui:v1:${e}:${t.origin}${t.pathname}`:null}catch{return null}},Rv=e=>{let t=Lv(e);if(!t)return null;try{let e=globalThis.sessionStorage?.getItem(t);if(!e)return null;let n=JSON.parse(e);if(n.version!==1)return null;let r=n.originThread?.trim()||null,i=n.selectedThread?.trim()||null,a=n.delivery;return{version:1,originThread:r,selectedThread:i,delivery:a&&a.id.trim()&&a.thread.trim()&&(a.status===`queued`||a.status===`working`||a.status===`interrupted`)&&Array.isArray(a.annotationIds)?{id:a.id.trim(),thread:a.thread.trim(),status:a.status,annotationIds:a.annotationIds.filter(e=>e.trim().length>0),queuedSubmissionId:a.queuedSubmissionId?.trim()||null,dispatch:a.dispatch??null,dispatchError:a.dispatchError?.trim()||null}:null}}catch{return null}},zv=(e,t)=>{let n=Lv(e);if(n)try{globalThis.sessionStorage?.setItem(n,JSON.stringify(t))}catch{}},Bv=(e,t)=>{let n=e.endsWith(`/`)?e:`${e}/`;return new URL(t,n).toString()},Vv=async(e,t,n)=>{let r=new AbortController,i=setTimeout(()=>r.abort(),15e3);try{let i=await fetch(Bv(e,t),{...n,signal:r.signal}),a=await i.text(),o={};if(a)try{o=JSON.parse(a)}catch{o={error:a}}if(!i.ok||o.ok===!1)throw Error(o.error||`Mesurer Codex bridge returned HTTP ${i.status}.`);return o}catch(t){throw t instanceof Error&&t.name===`AbortError`?Error(`Mesurer Codex bridge timed out.`):t instanceof TypeError?Error(`Mesurer Codex bridge is unavailable at ${e}. Start the local bridge before queueing feedback.`):t}finally{clearTimeout(i)}},Hv=e=>({thread:e.thread?.trim()||null,threads:Array.isArray(e.threads)?e.threads.filter(e=>e.trim().length>0):[]}),Uv=e=>{let t=e.deliveryId?.trim(),n=e.thread?.trim(),r=e.status;if(!t||!n||!r)throw Error(`Mesurer Codex bridge returned an invalid delivery state.`);let i={id:t,thread:n,status:r,turnId:e.turnId?.trim()||null,createdAt:Number.isFinite(e.createdAt)?Number(e.createdAt):0,updatedAt:Number.isFinite(e.updatedAt)?Number(e.updatedAt):0};return e.queuedSubmissionId!==void 0&&(i.queuedSubmissionId=e.queuedSubmissionId?.trim()||null),e.dispatch!==void 0&&(i.dispatch=e.dispatch),e.dispatchError!==void 0&&(i.dispatchError=e.dispatchError?.trim()||null),i},Wv=e=>({thread:e.thread?.trim()||null,threads:Array.isArray(e.threadDetails)?e.threadDetails.flatMap(e=>{let t=e.id?.trim()??``;return t?[{id:t,title:e.title?.trim()||t,updatedAt:e.updatedAt!=null&&Number.isFinite(e.updatedAt)?e.updatedAt:null,connected:e.connected===!0}]:[]}):[],hasMore:e.hasMore===!0}),Gv=async(e,t,n)=>{let r=t?.instruction?.trim()||n,i=await e.annotations(),a=t?.annotationIds,o=a?a.flatMap(e=>{let t=i.find(t=>t.id===e);return t?[t]:[]}):i,s=[];for(let t of o)s.push(await e.contextText({annotation:t.id}));if(s.length===0)try{s.push(await e.contextText({scope:`selection`}))}catch{s.push(await e.contextText())}return{annotationIds:o.map(e=>e.id),message:[r,``,...s.flatMap((e,t)=>[s.length>1?`Feedback ${t+1}`:`Mesurer evidence`,e,``])].join(`
1482
1482
  `).trimEnd()}},Kv=e=>e.length>16?`${e.slice(0,8)}…${e.slice(-4)}`:e,qv=(e,t=42)=>e.length>t?`${e.slice(0,t-1)}…`:e,Jv=(e,t)=>e instanceof Error&&e.message===`Mesurer Codex bridge is unavailable at ${t}. Start the local bridge before queueing feedback.`;function Yv(e={}){let t=e.endpoint??Tv,n=e.instruction?.trim()||Nv,r=e.ui??!0,i=e.clearCompletedAnnotations??!0;return{id:Sv,version:ev,requires:[wv],provides:[Cv],setup(e){let a=e.service.get(wv);if(!a)throw Error(`Mesurer Codex plugin requires context() from mesurer-solid/plugins.`);let o=r?Rv(t):null,s=`unknown`,c=!1,l=o?.originThread??null,u=o?.selectedThread??o?.originThread??null,d=!1,f=null,p=[],m=[],h=!1,g=Mv,_,v=``,y=null,b=o?.delivery?{id:o.delivery.id,thread:o.delivery.thread,status:o.delivery.status,annotationIds:o.delivery.annotationIds,queuedSubmissionId:o.delivery.queuedSubmissionId??null,dispatch:o.delivery.dispatch??null,dispatchError:o.delivery.dispatchError??null}:null,x=0,S=0,C=null,w=!1,T=async()=>Hv(await Vv(t,`health`)),E=async e=>Uv(await Vv(t,`deliveries/${encodeURIComponent(e)}`)),D=async e=>{if(!e.id||!e.thread)throw Error(`Cannot restore a Codex delivery without its id and thread.`);let n={deliveryId:e.id,thread:e.thread};return e.queuedSubmissionId&&(n.queuedSubmissionId=e.queuedSubmissionId),Uv(await Vv(t,`deliveries/restore`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n)}))},O=async(e={})=>{let n=new URLSearchParams;n.set(`limit`,String(e.limit??jv));let r=e.thread?.trim();return r&&n.set(`thread`,r),Wv(await Vv(t,`threads?${n.toString()}`))},k=()=>u??l??(d?null:f),A=()=>{if(!r)return;let e=b?.id&&(b.status===`queued`||b.status===`working`||b.status===`interrupted`)?{id:b.id,thread:b.thread??k()??``,status:b.status,annotationIds:[...b.annotationIds],queuedSubmissionId:b.queuedSubmissionId,dispatch:b.dispatch,dispatchError:b.dispatchError}:null;zv(t,{version:1,originThread:l,selectedThread:u,delivery:e?.thread?e:null})},j=(e,t=!1)=>{let n=e.trim();n&&((t||!l)&&(l=n),u=n,d=!1,A())},M=()=>b!==null&&[`queueing`,`queued`,`working`,`completed`].includes(b.status),N=()=>b?.status===`queued`&&(b.dispatch===`desktop-send-uncertain`||b.dispatch===`desktop-wait-failed`),P=e=>e===`queueing`?`Queueing…`:e===`queued`?`Queued`:e===`working`?`Working…`:e===`completed`?`Done`:e===`interrupted`?`Interrupted`:`Failed`,F=()=>b?b.status===`queueing`?`Queueing to Codex…`:N()?`Codex delivery blocked`:b.status===`queued`?`Queued for Codex`:b.status===`working`?`Codex working…`:b.status===`completed`?`Codex finished`:b.status===`interrupted`?`Codex interrupted`:`Queue failed`:null,I=()=>b?[`queueing`,`queued`,`working`].includes(b.status)?Fv:b.status===`completed`?Iv:Pv:Pv,L=()=>{let e=[],t=new Set,n=n=>{t.has(n.id)||(t.add(n.id),e.push(n))},r=e=>({id:e,title:`Codex ${Kv(e)}`,updatedAt:null,connected:!0});l&&n(m.find(e=>e.id===l)??r(l));let i=u;i&&n(m.find(e=>e.id===i)??r(i));for(let e of m)n(e);for(let e of p)n(m.find(t=>t.id===e)??r(e));return e},R=(e=!1)=>Promise.resolve(),z=()=>{if(s!==`available`)return[{id:`codex.thread.connect`,label:s===`unavailable`?`Retry Codex connection`:`Choose Codex thread…`,run:()=>R(!0)}];let e=L(),t=e.slice(0,g),n=k(),r=t.map(e=>{let t=e.id===l?`Current · `:e.connected?`Connected · `:``,r=b?.thread===e.id?` · ${N()?`Blocked`:P(b.status)}`:``;return{id:`codex.thread.${e.id}`,label:`${t}${qv(e.title)}${r}`,checked:()=>n===e.id,disabled:()=>M(),run(){M()||(j(e.id,!l),B())}}});return g<jv&&(e.length>g||h)&&r.push({id:`codex.thread.show-more`,label:`Show 5 more…`,run(){g=jv,B()}}),r},B=()=>{if(!r||w)return;let t=k(),n=z(),i=!M()&&!d&&s!==`unavailable`&&(s===`unknown`||!!t),a=F()??(s===`unavailable`?`Codex unavailable`:d||s===`available`&&!t?`Choose Codex thread`:`Queue to Codex`),o=JSON.stringify({bridgeAvailability:s,routeNeedsSelection:d,target:t,label:a,visibleThreadCount:g,activeDelivery:b,items:n.map(e=>({id:e.id,label:e.label,checked:e.checked?.()??null,disabled:e.disabled?.()??!1}))});o!==v&&(v=o,_?.dispose(),_=e.tool.register({id:`codex.send`,label:a,command:`codex.send`,order:73,icon:I(),disabled:()=>!i,menu:n.length?{label:`Codex destination`,items:n}:void 0}))},V=async()=>{if(s!==`available`)return;let e=l&&p.includes(l)?l:f;try{let t=await O({limit:jv,thread:e??void 0});m=t.threads,h=t.hasMore}catch{m=p.map(e=>({id:e,title:`Codex ${Kv(e)}`,updatedAt:null,connected:!0})),h=!1}};R=(e=!1)=>w||s===`unknown`&&!e?Promise.resolve():y||(y=(async()=>{try{let e=await T(),t=e.thread!==f;s=`available`,c=!0,f=e.thread,p=e.threads;let n=u??l;n?d=!e.threads.includes(n):e.threads.length===1?j(e.threads[0],!0):d=(e.threads.length,!0),(t||m.length===0||d)&&await V(),d&&n&&m.some(e=>e.id===n)&&(d=!1,A())}catch(e){throw s=`unavailable`,e}finally{y=null,B()}})(),y);let H=()=>{x&&=(globalThis.clearTimeout(x),0),S&&=(globalThis.clearTimeout(S),0)},ee=()=>{S&&globalThis.clearTimeout(S),S=globalThis.setTimeout(()=>{S=0,b?.status===`completed`&&(b=null,A(),B())},Ov)},U=async e=>{if(!(!b||b.id!==e.id)){if(b={...b,thread:e.thread,status:e.status,queuedSubmissionId:e.queuedSubmissionId??b.queuedSubmissionId,dispatch:e.dispatch??b.dispatch,dispatchError:e.dispatchError??b.dispatchError},A(),e.status===`completed`){if(i)for(let e of b.annotationIds)await a.removeAnnotation(e);A(),B(),ee();return}if(e.status===`interrupted`){A(),B();let t=e.updatedAt>0?e.updatedAt:Date.now();Date.now()-t<Av&&(x=globalThis.setTimeout(()=>{x=0,te(e.id)},kv));return}B(),x=globalThis.setTimeout(()=>{x=0,te(e.id)},Dv)}},te=async e=>{if(!(w||b?.id!==e))try{await U(await E(e))}catch(n){if(b?.id!==e)return;let r=n;if(b.status===`queued`&&b.thread)try{s!==`available`&&await R(!0);let e=await D(b);await U(e);return}catch(e){r=e}if(b?.id!==e)return;if(b.status===`interrupted`){B();return}b={...b,status:`failed`},A(),Jv(r,t)&&(s=`unavailable`),B()}},ne={health:T,listThreads:O,delivery:E,async useThread(e){let n=e.trim();if(!n)throw Error(`Codex thread must be a non-empty string.`);let r=Hv(await Vv(t,`target`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({thread:n})}));return j(n,!l),f=r.thread,p=r.threads,s=`available`,c=!0,B(),r},async send(e){let i=await Gv(a,e,n),o=e?.thread?.trim(),c=o||(r?k():null);if(r&&!o&&(d||!c))throw Error(`Choose a Codex thread before queueing feedback.`);let l={message:i.message};c&&(l.thread=c);try{let e=await Vv(t,`send`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(l)}),n=e.thread?.trim();if(!n)throw Error(`Mesurer Codex bridge did not report the destination thread.`);let r={thread:n,output:e.output??``,delivery:`queued`,deliveryId:e.deliveryId?.trim()||null,status:e.status??`queued`,annotationIds:i.annotationIds};return e.queuedSubmissionId!==void 0&&(r.queuedSubmissionId=e.queuedSubmissionId?.trim()||null),e.dispatch!==void 0&&(r.dispatch=e.dispatch),e.dispatchError!==void 0&&(r.dispatchError=e.dispatchError?.trim()||null),r}catch(e){throw r&&Jv(e,t)&&(s=`unavailable`,B()),e}}};if(e.service.provide(Cv,ne),e.command.register(`codex.send`,async()=>{if(!(C||M()))return H(),b={id:null,thread:k(),status:`queueing`,annotationIds:[],queuedSubmissionId:null,dispatch:null,dispatchError:null},B(),C=(async()=>{try{r&&s!==`available`&&await R(!0);let e=await ne.send();b={id:e.deliveryId,thread:e.thread,status:e.status,annotationIds:e.annotationIds,queuedSubmissionId:e.queuedSubmissionId??null,dispatch:e.dispatch??null,dispatchError:e.dispatchError??null},j(e.thread,!l),A(),B(),console.info(`[Mesurer] Queued feedback for Codex thread ${e.thread}.`),e.deliveryId?e.status===`completed`||e.status===`interrupted`?await U({id:e.deliveryId,thread:e.thread,status:e.status,turnId:null,createdAt:0,updatedAt:0}):x=globalThis.setTimeout(()=>{x=0,te(e.deliveryId)},Dv):S=globalThis.setTimeout(()=>{S=0,b?.id===null&&b?.status===`queued`&&(b=null,A(),B())},Ov)}catch(e){b=null,A(),B();let t=e instanceof Error?e.message:String(e);throw console.error(`[Mesurer] Failed to queue feedback for Codex: ${t}`),e}finally{C=null}})(),C}),r){B(),b?.id&&(c=!0,x=globalThis.setTimeout(()=>{x=0,b?.id&&te(b.id)},0));let t=globalThis.setInterval(()=>{c&&R().catch(()=>void 0)},Ev);e.lifecycle.onDispose(()=>{w=!0,H(),globalThis.clearInterval(t),_?.dispose(),_=void 0})}}}}var Xv=[{id:tv,label:`Context`,order:30,create:fv,settingsIds:[`context`],hiddenSettingsControlIds:[`ui`]},{id:bv,label:`Arrange`,order:35,create:xv,settingsIds:[`arrange`]},{id:Zg,label:`Screenshot`,order:40,create:(e={})=>({...__(e),version:ev}),settingsIds:[`screenshot`],hiddenSettingsControlIds:[`tool`]},{id:Sv,label:`Codex`,order:45,create:Yv}],Zv=e=>{let t=e!==void 0,n=new Map((e??[]).map(e=>[e.id,e])),r=new Set(Xv.map(e=>e.id)),i=Xv.map(e=>{let r=n.get(e.id);return{...e,settingsIds:e.settingsIds?[...e.settingsIds]:void 0,hiddenSettingsControlIds:e.hiddenSettingsControlIds?[...e.hiddenSettingsControlIds]:void 0,enabled:!t||!!r,create:r?()=>r:e.create}});for(let[t,n]of(e??[]).entries())r.has(n.id)||i.push({id:n.id,order:1e3+t,enabled:!0,create:()=>n});return i},Qv=`arrange`;function $v(e={}){if(!(`document`in globalThis))throw Error(`mountMesurer() requires a browser or Electron renderer document.`);let{target:t=document.body,isolate:n=!0,shadowMode:r=`open`,topLayer:i=!0,agent:a=!1,onPluginHost:o,onPluginsReady:s,plugins:c,...l}=e,u=t.ownerDocument??document,d=u.defaultView??window,f=u.createElement(`div`);f.dataset.mesurerIsland=`true`;let p=yv(f,t,i),m=f,h=f,g=f;if(n){let e=f.attachShadow({mode:r});h=u.createElement(`div`),h.dataset.mesurerIslandMount=`true`,e.append(h),m=e,g=e}let _,v,y,b=!1,x=new Promise(e=>{v=e}),S=new Promise(e=>{y=e}),C=async()=>(await(_?Promise.resolve(_):x),S),w=a===!0?{}:a===!1?null:a,T=N_({ownerDocument:u,root:w?.root??(t.nodeType===11?t:u),getPluginHost:()=>_,waitForPluginHost:C}),E=async()=>{await T.ready();let e=_?.service.get(nv);if(!e)throw Error(`Mesurer Context is disabled. Enable it in Settings or include context() in plugins.`);return e},D=async()=>{await T.ready();let e=_?.service.get(Qv);if(!e)throw Error(`Mesurer Arrange is disabled. Enable it in Settings or include arrange() in plugins.`);return e},O=async e=>(await E()).context(e),k=async e=>(await E()).contextText(e),A=async e=>(await E()).copyContext(e),j=async e=>(await E()).select(e),M=async()=>(await E()).annotations(),N=async e=>(await E()).review(e),P=async e=>(await E()).capturePlan(e),F=async()=>(await E()).prepareCapture(),I=async()=>(await E()).finishCapture(),L=async()=>(await D()).intents(),R=async e=>{let t=(await D()).intent(e);if(!t)throw Error(`Arrange intent not found: ${e}`);return t},z=async(e,t)=>{(await D()).show(e,t)},B=async(e,t)=>(await D()).capturePlan(e,t),V=async(e,t)=>(await D()).review(e,t),H=()=>T.textEdits(),ee=e=>T.textEdit(e),U=Object.assign(T,{capabilities:()=>{let e=!!_?.service.get(nv);return{protocol:`mesurer.agent/v1`,contextSchema:`mesurer.context/v1`,capabilities:{context:e,select:e,annotations:e,review:e,capturePlan:e,arrange:!!_?.service.get(Qv),textEdit:!!_?.service.get(j_)}}},context:O,contextText:k,select:j,annotations:M,review:N,capturePlan:P,prepareCapture:F,finishCapture:I,arrangements:L,arrange:R,showArrange:z,arrangeCapturePlan:B,reviewArrange:V}),te={...l,version:ev,plugins:Zv(c)},ne=xi(()=>Hr(eg,bi(te,{portalTarget:g,pageTarget:t,onPluginHost:e=>{_||v(e),_=e,o?.(e)},onPluginsReady:e=>{_=e,b||(b=!0,y(e)),s?.(e)}})),h),re=U.ready(),ie=null;if(w){let e=w.globalName??`__MESURER__`,t=Object.getOwnPropertyDescriptor(d,e);Reflect.set(d,e,U),ie=()=>{Object.getOwnPropertyDescriptor(d,e)?.value===U&&(t?Object.defineProperty(d,e,t):Reflect.deleteProperty(d,e))}}let ae=!1;return{element:f,root:m,hostLayer:p.mode,get pluginHost(){return _},ready:re,agent:U,context:O,contextText:k,copyContext:A,select:j,annotations:M,review:N,capturePlan:P,prepareCapture:F,finishCapture:I,arrangements:L,arrange:R,showArrange:z,arrangeCapturePlan:B,reviewArrange:V,textEdits:H,textEdit:ee,bringToFront:p.bringToFront,describe:()=>_?.describe(),dispose(){ae||(ae=!0,ie?.(),ne(),p.dispose(),f.remove())}}}var{target:ey,globalName:ty=`__MESURER__`,reuseExisting:ny=!0,...ry}=globalThis.__MESURER_CONFIG__??{},iy=globalThis.__MESURER_INSTANCE__,ay=ny&&iy?.element.isConnected?iy:void 0;if(ay)ay.ready.catch(e=>{queueMicrotask(()=>{throw e})});else{let e=ey?document.querySelector(ey):document.body;if(!e)throw Error(`Mesurer injection target not found: ${ey}`);iy?.dispose();let t=$v({...ry,target:e,agent:{globalName:ty,root:document}});globalThis.__MESURER_INSTANCE__=t,t.ready.catch(e=>{queueMicrotask(()=>{throw e})})}})();
package/dist/inject.js CHANGED
@@ -16773,7 +16773,7 @@ async function Y_(e, t, n) {
16773
16773
  }
16774
16774
  //#endregion
16775
16775
  //#region src/version.ts
16776
- var X_ = "0.1.8-beta.3", Z_ = "mesurer.context", Q_ = "context:v1", $_ = "mesurer.context.settings", ev = "context.ui", tv = "data-mesurer-direct-text-edit-active", nv = {
16776
+ var X_ = "0.1.8", Z_ = "mesurer.context", Q_ = "context:v1", $_ = "mesurer.context.settings", ev = "context.ui", tv = "data-mesurer-direct-text-edit-active", nv = {
16777
16777
  viewBox: "0 0 256 256",
16778
16778
  paths: ["M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"]
16779
16779
  }, rv = {
package/dist/plugins.js CHANGED
@@ -5399,7 +5399,7 @@ var Da = "mesurer:capture-bridge-ping", Oa = "mesurer:capture-bridge-request", k
5399
5399
  S = !0, y += 1, u.removeEventListener("pointerdown", I), u.removeEventListener("pointermove", L), u.removeEventListener("pointerup", R), u.removeEventListener("pointercancel", z), i.removeEventListener("keydown", B, !0), v && i.clearTimeout(v), j.dispose(), O(), Wa(i), a.finishCapture(), a.dispose(), o.dispose();
5400
5400
  });
5401
5401
  }
5402
- }), Do = "0.1.8-beta.3", Oo = mi, ko = di, Ao = fi, jo = hi, Mo = pi, No = () => ({
5402
+ }), Do = "0.1.8", Oo = mi, ko = di, Ao = fi, jo = hi, Mo = pi, No = () => ({
5403
5403
  ...Zi(),
5404
5404
  version: Do
5405
5405
  }), Po = "mesurer.codex", Fo = "codex:v1", Io = "context:v1", Lo = "http://127.0.0.1:47365", Ro = 2e3, zo = 750, Bo = 1800, Vo = 2e3, Ho = 12e4, Uo = 10, Wo = 5, Go = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mesurer-solid",
3
- "version": "0.1.8-beta.3",
3
+ "version": "0.1.8",
4
4
  "description": "Framework-agnostic UI measurement and inspection tools for browser apps and coding agents.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -135,8 +135,9 @@ The target boundary follows browser editability semantics:
135
135
 
136
136
  - native form controls stay native;
137
137
  - descendants that inherit `contenteditable` stay under page/browser editing;
138
- - a nested `contenteditable="false"` boundary ends inherited editability and can become a Mesurer direct-text target when the ordinary one-unambiguous-direct-text-node rules pass;
139
- - ambiguous mixed/nested rich text is not turned into a fake rich-text editor.
138
+ - a nested `contenteditable="false"` boundary ends inherited editability and can become a Mesurer direct-text target when the ordinary direct-text-run rules pass;
139
+ - mixed inline copy can target the exact direct text run under the pointer without flattening or recreating inline children or replacing the host element's native DOM APIs;
140
+ - ambiguous nested rich text is not turned into a fake rich-text editor.
140
141
 
141
142
  If Typography was already explicitly selected, the direct-edit session suppresses the older hover/pinned Typography UI so there is one live Typography card for the field. Closing the editor restores the normal Typography UI without deselecting Typography.
142
143